[hibernate-commits] Hibernate SVN: r11282 - in trunk/HibernateExt: annotations and 289 other directories.
hibernate-commits at lists.jboss.org
hibernate-commits at lists.jboss.org
Wed Mar 14 18:06:53 EDT 2007
Author: epbernard
Date: 2007-03-14 18:05:59 -0400 (Wed, 14 Mar 2007)
New Revision: 11282
Added:
trunk/HibernateExt/annotations/
trunk/HibernateExt/annotations/.cvsignore
trunk/HibernateExt/annotations/build.properties.dist
trunk/HibernateExt/annotations/build.xml
trunk/HibernateExt/annotations/changelog.txt
trunk/HibernateExt/annotations/doc/
trunk/HibernateExt/annotations/doc/api/
trunk/HibernateExt/annotations/doc/api/package.html
trunk/HibernateExt/annotations/doc/reference/
trunk/HibernateExt/annotations/doc/reference/.cvsignore
trunk/HibernateExt/annotations/doc/reference/build.xml
trunk/HibernateExt/annotations/doc/reference/en/
trunk/HibernateExt/annotations/doc/reference/en/images/
trunk/HibernateExt/annotations/doc/reference/en/images/hibernate_logo_a.png
trunk/HibernateExt/annotations/doc/reference/en/master.xml
trunk/HibernateExt/annotations/doc/reference/en/modules/
trunk/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml
trunk/HibernateExt/annotations/doc/reference/en/modules/entity.xml
trunk/HibernateExt/annotations/doc/reference/en/modules/setup.xml
trunk/HibernateExt/annotations/doc/reference/en/modules/xml-overriding.xml
trunk/HibernateExt/annotations/doc/reference/en/styles/
trunk/HibernateExt/annotations/doc/reference/en/styles/fopdf.xsl
trunk/HibernateExt/annotations/doc/reference/en/styles/html.css
trunk/HibernateExt/annotations/doc/reference/en/styles/html.xsl
trunk/HibernateExt/annotations/doc/reference/en/styles/html_chunk.xsl
trunk/HibernateExt/annotations/doc/reference/fr/
trunk/HibernateExt/annotations/doc/reference/fr/images/
trunk/HibernateExt/annotations/doc/reference/fr/images/hibernate_logo_a.png
trunk/HibernateExt/annotations/doc/reference/fr/master.xml
trunk/HibernateExt/annotations/doc/reference/fr/modules/
trunk/HibernateExt/annotations/doc/reference/fr/modules/entity.xml
trunk/HibernateExt/annotations/doc/reference/fr/modules/lucene.xml
trunk/HibernateExt/annotations/doc/reference/fr/modules/setup.xml
trunk/HibernateExt/annotations/doc/reference/fr/modules/validator.xml
trunk/HibernateExt/annotations/doc/reference/fr/modules/xml-overriding.xml
trunk/HibernateExt/annotations/doc/reference/fr/styles/
trunk/HibernateExt/annotations/doc/reference/fr/styles/fopdf.xsl
trunk/HibernateExt/annotations/doc/reference/fr/styles/html.css
trunk/HibernateExt/annotations/doc/reference/fr/styles/html.xsl
trunk/HibernateExt/annotations/doc/reference/fr/styles/html_chunk.xsl
trunk/HibernateExt/annotations/doc/reference/zh_cn/
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.ttf
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.ttc
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/userconfig.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/images/
trunk/HibernateExt/annotations/doc/reference/zh_cn/images/hibernate_logo_a.png
trunk/HibernateExt/annotations/doc/reference/zh_cn/master.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/entity.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/lucene.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/setup.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/validator.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/xml-overriding.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/
trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/fopdf.xsl
trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.css
trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.xsl
trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html_chunk.xsl
trunk/HibernateExt/annotations/jdbc/
trunk/HibernateExt/annotations/jdbc/hsqldb.jar
trunk/HibernateExt/annotations/lgpl.txt
trunk/HibernateExt/annotations/lib/
trunk/HibernateExt/annotations/lib/README.txt
trunk/HibernateExt/annotations/readme.txt
trunk/HibernateExt/annotations/src/
trunk/HibernateExt/annotations/src/java/
trunk/HibernateExt/annotations/src/java/org/
trunk/HibernateExt/annotations/src/java/org/hibernate/
trunk/HibernateExt/annotations/src/java/org/hibernate/AnnotationException.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/AccessType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/BatchSize.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cache.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheConcurrencyStrategy.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheModeType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cascade.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CascadeType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Check.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionId.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionOfElements.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Columns.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/DiscriminatorFormula.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Entity.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Fetch.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FetchMode.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filter.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDef.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDefs.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTable.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTables.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filters.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FlushModeType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForceDiscriminator.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForeignKey.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Formula.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Generated.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenerationTime.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenericGenerator.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Immutable.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Index.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/IndexColumn.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollection.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollectionOption.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOne.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOneOption.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Loader.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKey.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKeyManyToMany.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQueries.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQuery.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQueries.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQuery.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFound.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFoundAction.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDelete.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDeleteAction.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLock.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLockType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OrderBy.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ParamDef.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parameter.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parent.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Persister.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/PolymorphismType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Proxy.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ResultCheckStyle.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDelete.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDeleteAll.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLInsert.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLUpdate.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Sort.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SortType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Table.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tables.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Target.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizer.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizers.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Type.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDef.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDefs.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Where.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/WhereJoinTable.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AbstractPropertyHolder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotatedClassType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/BinderHelper.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ClassPropertyHolder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CollectionPropertyHolder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ComponentPropertyHolder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CreateKeySecondPass.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3NamingStrategy.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3Column.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3JoinColumn.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ExtendedMappings.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/FkSecondPass.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexColumn.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexSecondPass.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/InheritanceState.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/NotYetImplementedException.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/OneToOneSecondPass.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyData.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolderBuilder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyInferredData.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyPreloadedData.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/WrappedInferredData.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ArrayBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/BagBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/CollectionBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/EntityBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/IdBagBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ListBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/MapBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Nullability.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PrimitiveArrayBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PropertyBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/QueryBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SetBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/TableBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Version.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3OverridenAnnotationReader.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3ReflectionManager.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/XMLContext.java
trunk/HibernateExt/annotations/src/java/org/hibernate/ejb/
trunk/HibernateExt/annotations/src/java/org/hibernate/ejb/orm_1_0.xsd
trunk/HibernateExt/annotations/src/java/org/hibernate/mapping/
trunk/HibernateExt/annotations/src/java/org/hibernate/mapping/IdGenerator.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/
trunk/HibernateExt/annotations/src/java/org/hibernate/type/AbstractLobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/ByteArrayBlobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/CharacterArrayClobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/EnumType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveByteArrayBlobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveCharacterArrayClobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/SerializableToBlobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/StringClobType.java
trunk/HibernateExt/annotations/src/test/
trunk/HibernateExt/annotations/src/test/ehcache.xml
trunk/HibernateExt/annotations/src/test/hibernate.properties
trunk/HibernateExt/annotations/src/test/log4j.properties
trunk/HibernateExt/annotations/src/test/org/
trunk/HibernateExt/annotations/src/test/org/hibernate/
trunk/HibernateExt/annotations/src/test/org/hibernate/annotations/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320b.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AlternativeNamingStrategy.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AmericaCupClass.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Company.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/ConfigurationTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Country.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Customer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Discount.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/EntityTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Flight.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/FlyingObject.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/IncorrectEntity.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/JoinedSubclassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Passport.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Plane.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Port.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SafeMappingTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SecuredBindingTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Sky.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TestCase.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Thing.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ticket.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TicketComparator.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/AccessTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Bed.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/BigBed.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Chair.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Furniture.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Thingy.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Woody.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/ArrayTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Competitor.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Contest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Hammer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Tool.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/hammer.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/CascadeTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Mouth.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Tooth.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Channel.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Child.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ChildPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Order.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLine.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLinePk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Parent.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ParentPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Presenter.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Product.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazin.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Boy.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Brand.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Character.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CountryAttitude.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Toy.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/Flight.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/orm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Address.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/AddressType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Book.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/CorpType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Country.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Deal.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/EmbeddedTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FixedLeg.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FloatLeg.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/InternetProvider.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Leg.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/LegalStructure.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Manager.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Nationality.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/NotonialDeal.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Person.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticle.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticlePk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/SpreadDeal.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Summary.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Swap.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/VanillaSwap.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Address.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Bid.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CasterStringType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CommunityBid.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Country.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Flight.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Forest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Java5FeaturesTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Length.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmount.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Race.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Ransom.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Starred.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Tree.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/WashingMachine.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/ZipCode.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/package-info.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Cellular.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Communication.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/GSM.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Interaction.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Phone.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Voice.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/FetchingTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Person.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Stay.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/DNA.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Gene.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/GenericsTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Item.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Paper.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PaperType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Price.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PricedStuff.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/SomeGuy.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/State.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/StateType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Stuff.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/WildEntity.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Child.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Parent.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/hibernate.cfg.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Ball.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/BreakDance.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Computer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Department.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Dog.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FirTree.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Footballer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FootballerPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Furniture.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/GoalKeeper.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Home.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdClassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Location.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/MilitaryBuilding.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Phone.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Shoe.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/SoundSystem.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Store.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tower.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tree.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/package-info.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Card.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardField.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardKey.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Customer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/IdManyToOne.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Project.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Store.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressBook.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntry.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Drawer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Dress.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Gas.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Generation.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationGroup.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationUser.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/MapKeyTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/News.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Newspaper.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painter.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painting.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PaintingPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Software.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Trainee.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Training.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Version.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Wardrobe.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Apple.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Carrot.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Fruit.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/SubclassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Tomato.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Vegetable.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/VegetablePk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Alarm.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Clothing.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Document.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/EventInformation.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/File.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Folder.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Parent.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Pool.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Sweater.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Document.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/File.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Folder.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Building.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Funk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/House.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Music.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Noise.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Rock.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Trash.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Document.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/File.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Folder.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SubclassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/Contact.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/ContactImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/InterfacesTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/User.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/UserImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Cat.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Death.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Dog.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/DogPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/JoinTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Life.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Loader.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/LoaderTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Player.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Team.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/TestCase.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Book.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/CompiledCode.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Editor.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/LobTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Building.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/BuildingCompany.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Cat.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/CatPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/City.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Company.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employee.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Friend.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Group.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/GroupWithSet.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Inspector.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/KnownClient.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Man.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Permission.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Store.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Supplier.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Woman.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/WomanPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Zone.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/BiggestForest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Car.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Carz.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Child.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Color.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Customer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Deal.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ForestType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Frame.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lens.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lotz.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/LotzPK.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Node.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/NodePk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Order.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/OrderLine.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Parent.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ParentPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/TreeType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/User.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/UserPK.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Coin.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Currency.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/NotFoundTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Child.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/City.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Monkey.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OneToManyTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Organisation.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OrganisationUser.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Parent.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/ParentPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Person.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/PoliticalParty.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Politician.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Soldier.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Street.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Tiger.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Trainer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Troop.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Address.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Body.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Client.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Computer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/ComputerPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Heart.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OneToOneTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Owner.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OwnerAddress.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Party.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/PartyAffiliate.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumber.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumberPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Trousers.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/TrousersZip.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/orm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Location.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Move.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Trip.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Card.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/CollectionPersister.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Deck.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/EntityPersister.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/PersisterTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/Car.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/MovingThing.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/SportCar.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Area.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Captain.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/CasimirParticle.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Chaos.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dictionary.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dimensions.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Identity.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Mark.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Night.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/QueryAndSQLTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SpaceShip.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SynonymousDictionary.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/orm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/QuoteTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/Role.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/User.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Bag.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Clothes.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/House.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Item.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Luggage.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Postman.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Rambler.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Vendor.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Administration.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Availability.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTrip.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTripPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Competition.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/LogListener.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Match.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Organization.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/OtherLogListener.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/TennisMatch.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/XMLContextTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/metadata-complete.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/orm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Location.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Storm.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/StrategyTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Component.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Machine.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Product.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Robot.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/T800.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Brand.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Luggage.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/LuggageImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Owner.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/OwnerImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Size.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/SizeImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/TargetTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Country.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Cuisine.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/ProxyHelper.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/TuplizerTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/Dvd.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOid.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidGenerator.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/TypeTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Antenna.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Conductor.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/GeneratedTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/IndexTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Truck.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Vehicule.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/VersionTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/version/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/CarModel.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Light.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Lighter.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Model.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm2.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm3.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/AImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/BImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/HbmTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Sky.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Z.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/ZImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/lucene/
trunk/HibernateExt/commons-annotations/
trunk/HibernateExt/commons-annotations/build.xml
trunk/HibernateExt/commons-annotations/changelog.txt
trunk/HibernateExt/commons-annotations/lgpl.txt
trunk/HibernateExt/commons-annotations/lib/
trunk/HibernateExt/commons-annotations/lib/README.txt
trunk/HibernateExt/commons-annotations/readme.txt
trunk/HibernateExt/commons-annotations/src/
trunk/HibernateExt/commons-annotations/src/java/
trunk/HibernateExt/commons-annotations/src/java/org/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/AssertionFailure.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationDescriptor.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationFactory.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationProxy.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/AnnotationReader.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/Filter.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionManager.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionUtil.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XAnnotatedElement.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XClass.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMember.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMethod.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XPackage.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XProperty.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaAnnotationReader.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaReflectionManager.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXAnnotatedElement.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXArrayType.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXClass.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXCollectionType.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMember.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMethod.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXPackage.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXProperty.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXSimpleType.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXType.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/Pair.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/ApproximatingTypeEnvironment.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/CompoundTypeEnvironment.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/IdentityTypeEnvironment.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/SimpleTypeEnvironment.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironment.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironmentFactory.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeFactory.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeSwitch.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeUtils.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/ReflectHelper.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/StringHelper.java
trunk/HibernateExt/commons-annotations/src/test/
trunk/HibernateExt/commons-annotations/src/test/org/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationFactoryTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationProxyTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/TestAnnotation.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Foo.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/FooFather.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaReflectionManagerTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXClassTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXPropertyTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Sex.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/TestAnnotation.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/XAnnotatedElementTestCase.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/BigBlob.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Dad.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Grandpa.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Language.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Neighbour.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Son.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/SonOfBlob.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TestAnnotation.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeEnvironmentFactoryTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeUtilsTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsContainment.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsInheritance.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Dummy.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DummySubclass.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass1.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass2.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass1.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass2.java
trunk/HibernateExt/entitymanager/
trunk/HibernateExt/entitymanager/.cvsignore
trunk/HibernateExt/entitymanager/build.properties.dist
trunk/HibernateExt/entitymanager/build.xml
trunk/HibernateExt/entitymanager/changelog.txt
trunk/HibernateExt/entitymanager/doc/
trunk/HibernateExt/entitymanager/doc/reference/
trunk/HibernateExt/entitymanager/doc/reference/.cvsignore
trunk/HibernateExt/entitymanager/doc/reference/build.xml
trunk/HibernateExt/entitymanager/doc/reference/en/
trunk/HibernateExt/entitymanager/doc/reference/en/images/
trunk/HibernateExt/entitymanager/doc/reference/en/images/hibernate_logo_a.png
trunk/HibernateExt/entitymanager/doc/reference/en/master.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/
trunk/HibernateExt/entitymanager/doc/reference/en/modules/architecture.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/batch.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/configuration.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/entitymanagerapi.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/listeners.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_ejbql.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_native.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/transactions.xml
trunk/HibernateExt/entitymanager/doc/reference/en/styles/
trunk/HibernateExt/entitymanager/doc/reference/en/styles/fopdf.xsl
trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.css
trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.xsl
trunk/HibernateExt/entitymanager/doc/reference/en/styles/html_chunk.xsl
trunk/HibernateExt/entitymanager/jdbc/
trunk/HibernateExt/entitymanager/jdbc/hsqldb.jar
trunk/HibernateExt/entitymanager/lgpl.txt
trunk/HibernateExt/entitymanager/lib/
trunk/HibernateExt/entitymanager/lib/README.txt
trunk/HibernateExt/entitymanager/lib/jboss-archive-browsing.jar
trunk/HibernateExt/entitymanager/readme.txt
trunk/HibernateExt/entitymanager/src/
trunk/HibernateExt/entitymanager/src/java/
trunk/HibernateExt/entitymanager/src/java/org/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3Configuration.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3ConfigurationObjectFactory.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManager.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerFactory.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernatePersistence.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateQuery.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/InjectionSettingsFactory.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/QueryImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/TransactionImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Version.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/InjectedDataSourceConnectionProvider.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/BeanCallback.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/Callback.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackHandlerConsumer.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackResolver.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3AutoFlushEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEntityEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3MergeEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistOnFlushEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostDeleteEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostInsertEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostLoadEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostUpdateEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveOrUpdateEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EntityCallbackHandler.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/ListenerCallback.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/ExplodedJarVisitor.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/FileZippedJarVisitor.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/InputStreamZippedJarVisitor.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/JarVisitor.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/NamedInputStream.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/XmlHelper.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransaction.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransactionFactory.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/ConfigurationHelper.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/LogHelper.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/NamingHelper.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadeStyle.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadingAction.java
trunk/HibernateExt/entitymanager/src/resources/
trunk/HibernateExt/entitymanager/src/resources/META-INF/
trunk/HibernateExt/entitymanager/src/resources/META-INF/services/
trunk/HibernateExt/entitymanager/src/resources/META-INF/services/javax.persistence.spi.PersistenceProvider
trunk/HibernateExt/entitymanager/src/resources/org/
trunk/HibernateExt/entitymanager/src/resources/org/hibernate/
trunk/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/persistence_1_0.xsd
trunk/HibernateExt/entitymanager/src/test-resources/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/orm.xml
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/Mouse.hbm.xml
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/Mouse.hbm.xml
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/orm2.xml
trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/
trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/orm.xml
trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/Elephant.hbm.xml
trunk/HibernateExt/entitymanager/src/test-resources/externaljar/
trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/MANIFEST.MF
trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/orm.xml
trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/
trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/space par/
trunk/HibernateExt/entitymanager/src/test-resources/space par/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/space par/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test/
trunk/HibernateExt/entitymanager/src/test/NoPackageEntity.java
trunk/HibernateExt/entitymanager/src/test/hibernate.properties
trunk/HibernateExt/entitymanager/src/test/log4j.properties
trunk/HibernateExt/entitymanager/src/test/org/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Cat.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Distributor.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EJB3TestCase.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EntityManagerTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Item.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/LastUpdateListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/MyNamingStrategy.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/QueryTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/TestCase.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ValidatorIntegrationTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Wallet.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/AssociationTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Incident.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/IncidentStatus.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Kitchen.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Oven.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CommunicationSystem.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryChecker.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryNameCheckerListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Customer.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Employee.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/ExceptionListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/FirstOneListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/IncreaseListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Person.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Plant.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/RemoteControl.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Rythm.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Television.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Translation.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/VideoSystem.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Author.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/CascadeTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Conference.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/DeleteOrphanTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocument.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocumentInfo.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Grandson.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Parent.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier2.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Son.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Song.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Student.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Teacher.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop2.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSource.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSourceException.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ExceptionInterceptor.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/InterceptorTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ProgrammaticConfTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/TestCase.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Cat.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Colony.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competition.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competitor.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Decorate.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dog.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dress.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Empire.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushModeTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Mail.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/MergeTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Music.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Pet.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Race.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RefreshTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RemoveTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/A.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B1.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B2.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B3.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B4.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C1.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C2.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/CascadePersistTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/ExceptionTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/Music.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/hibernate.cfg.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Fruit.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/InheritanceTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Strawberry.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InstrumentedClassLoader.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InterceptFieldClassFileTransformerTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/Simple.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/BlobTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/ImageReader.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/Lock.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/LockTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Animal.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Child.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employee.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.hbm.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FindTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FlushTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/GetLoadTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Mammal.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeNewTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.hbm.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/NumberedNode.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Parent.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/ParentChild.hbm.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/PersistTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Reptile.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Workload.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/Morito.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/ApplicationServer.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/IncrementListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Lighter.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Money.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Mouse.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/OtherIncrementListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Version.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/package-info.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/Caipirinha.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/Washer.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Carpet.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Elephant.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/package-info.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/Scooter.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/Bug.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/Bug.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Airplane.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Seat.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/package-info.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/JarVisitorTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/Book.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Address.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Article.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Employee.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Light.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Lighter.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlAttributeOverrideTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm2.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm3.xml
trunk/HibernateExt/jpa-api/
trunk/HibernateExt/jpa-api/.cvsignore
trunk/HibernateExt/jpa-api/build.xml
trunk/HibernateExt/jpa-api/doc/
trunk/HibernateExt/jpa-api/doc/api/
trunk/HibernateExt/jpa-api/doc/api/package.html
trunk/HibernateExt/jpa-api/etc/
trunk/HibernateExt/jpa-api/etc/jdstyle.css
trunk/HibernateExt/jpa-api/etc/license.txt
trunk/HibernateExt/jpa-api/src/
trunk/HibernateExt/jpa-api/src/javax/
trunk/HibernateExt/jpa-api/src/javax/persistence/
trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverride.java
trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverrides.java
trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverride.java
trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverrides.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Basic.java
trunk/HibernateExt/jpa-api/src/javax/persistence/CascadeType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Column.java
trunk/HibernateExt/jpa-api/src/javax/persistence/ColumnResult.java
trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorColumn.java
trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorValue.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Embeddable.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Embedded.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EmbeddedId.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Entity.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityExistsException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityListeners.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManager.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManagerFactory.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityNotFoundException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityResult.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityTransaction.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EnumType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Enumerated.java
trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeDefaultListeners.java
trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeSuperclassListeners.java
trunk/HibernateExt/jpa-api/src/javax/persistence/FetchType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/FieldResult.java
trunk/HibernateExt/jpa-api/src/javax/persistence/FlushModeType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/GeneratedValue.java
trunk/HibernateExt/jpa-api/src/javax/persistence/GenerationType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Id.java
trunk/HibernateExt/jpa-api/src/javax/persistence/IdClass.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Inheritance.java
trunk/HibernateExt/jpa-api/src/javax/persistence/InheritanceType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumn.java
trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumns.java
trunk/HibernateExt/jpa-api/src/javax/persistence/JoinTable.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Lob.java
trunk/HibernateExt/jpa-api/src/javax/persistence/LockModeType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToMany.java
trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToOne.java
trunk/HibernateExt/jpa-api/src/javax/persistence/MapKey.java
trunk/HibernateExt/jpa-api/src/javax/persistence/MappedSuperclass.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQueries.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQuery.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQueries.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQuery.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NoResultException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NonUniqueResultException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/OneToMany.java
trunk/HibernateExt/jpa-api/src/javax/persistence/OneToOne.java
trunk/HibernateExt/jpa-api/src/javax/persistence/OptimisticLockException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/OrderBy.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Persistence.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContext.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContextType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContexts.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceProperty.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnit.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnits.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PostLoad.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PostPersist.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PostRemove.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PostUpdate.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PrePersist.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PreRemove.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PreUpdate.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumn.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumns.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Query.java
trunk/HibernateExt/jpa-api/src/javax/persistence/QueryHint.java
trunk/HibernateExt/jpa-api/src/javax/persistence/RollbackException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTable.java
trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTables.java
trunk/HibernateExt/jpa-api/src/javax/persistence/SequenceGenerator.java
trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMapping.java
trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMappings.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Table.java
trunk/HibernateExt/jpa-api/src/javax/persistence/TableGenerator.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Temporal.java
trunk/HibernateExt/jpa-api/src/javax/persistence/TemporalType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/TransactionRequiredException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Transient.java
trunk/HibernateExt/jpa-api/src/javax/persistence/UniqueConstraint.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Version.java
trunk/HibernateExt/jpa-api/src/javax/persistence/package-info.java
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/ClassTransformer.java
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceProvider.java
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitInfo.java
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitTransactionType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/package-info.java
trunk/HibernateExt/search/
trunk/HibernateExt/search/build.properties.dist
trunk/HibernateExt/search/build.xml
trunk/HibernateExt/search/changelog.txt
trunk/HibernateExt/search/doc/
trunk/HibernateExt/search/doc/api/
trunk/HibernateExt/search/doc/api/package.html
trunk/HibernateExt/search/doc/reference/
trunk/HibernateExt/search/doc/reference/.cvsignore
trunk/HibernateExt/search/doc/reference/build.xml
trunk/HibernateExt/search/doc/reference/en/
trunk/HibernateExt/search/doc/reference/en/images/
trunk/HibernateExt/search/doc/reference/en/images/hibernate_logo_a.png
trunk/HibernateExt/search/doc/reference/en/images/jms-backend.png
trunk/HibernateExt/search/doc/reference/en/images/lucene-backend.png
trunk/HibernateExt/search/doc/reference/en/master.xml
trunk/HibernateExt/search/doc/reference/en/modules/
trunk/HibernateExt/search/doc/reference/en/modules/architecture.xml
trunk/HibernateExt/search/doc/reference/en/modules/batchindex.xml
trunk/HibernateExt/search/doc/reference/en/modules/configuration.xml
trunk/HibernateExt/search/doc/reference/en/modules/mapping.xml
trunk/HibernateExt/search/doc/reference/en/modules/query.xml
trunk/HibernateExt/search/doc/reference/en/styles/
trunk/HibernateExt/search/doc/reference/en/styles/fopdf.xsl
trunk/HibernateExt/search/doc/reference/en/styles/html.css
trunk/HibernateExt/search/doc/reference/en/styles/html.xsl
trunk/HibernateExt/search/doc/reference/en/styles/html_chunk.xsl
trunk/HibernateExt/search/jdbc/
trunk/HibernateExt/search/jdbc/hsqldb.jar
trunk/HibernateExt/search/lgpl.txt
trunk/HibernateExt/search/lib/
trunk/HibernateExt/search/lib/README.txt
trunk/HibernateExt/search/lib/jms.jar
trunk/HibernateExt/search/lib/lucene-core-2.1.0.jar
trunk/HibernateExt/search/readme.txt
trunk/HibernateExt/search/src/
trunk/HibernateExt/search/src/java/
trunk/HibernateExt/search/src/java/org/
trunk/HibernateExt/search/src/java/org/hibernate/
trunk/HibernateExt/search/src/java/org/hibernate/search/
trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java
trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java
trunk/HibernateExt/search/src/java/org/hibernate/search/Search.java
trunk/HibernateExt/search/src/java/org/hibernate/search/SearchException.java
trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Boost.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/ContainedIn.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DateBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DocumentId.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Field.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/FieldBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Index.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Indexed.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/IndexedEmbedded.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Keyword.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Parameter.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Resolution.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Store.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Text.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Unstored.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/AddLuceneWork.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/DeleteLuceneWork.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Work.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkType.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneWorker.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/BridgeFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/FieldBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/ParameterizedBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/String2FieldBridgeAdaptor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/StringBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayFieldBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayString2FieldBridgeAdaptor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayStringBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigDecimalBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigIntegerBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BooleanBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DateBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DoubleBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/EnumBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/FloatBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/IntegerBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/LongBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/NumberBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/ShortBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/StringBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/engine/
trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java
trunk/HibernateExt/search/src/java/org/hibernate/search/event/
trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java
trunk/HibernateExt/search/src/java/org/hibernate/search/impl/
trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java
trunk/HibernateExt/search/src/java/org/hibernate/search/query/
trunk/HibernateExt/search/src/java/org/hibernate/search/query/EntityInfo.java
trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java
trunk/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java
trunk/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/
trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java
trunk/HibernateExt/search/src/java/org/hibernate/search/util/
trunk/HibernateExt/search/src/java/org/hibernate/search/util/BinderHelper.java
trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java
trunk/HibernateExt/search/src/java/org/hibernate/search/util/DirectoryProviderHelper.java
trunk/HibernateExt/search/src/java/org/hibernate/search/util/FileHelper.java
trunk/HibernateExt/search/src/java/org/hibernate/search/util/WeakIdentityHashMap.java
trunk/HibernateExt/search/src/test-resources/
trunk/HibernateExt/search/src/test/
trunk/HibernateExt/search/src/test/hibernate.properties
trunk/HibernateExt/search/src/test/log4j.properties
trunk/HibernateExt/search/src/test/org/
trunk/HibernateExt/search/src/test/org/hibernate/
trunk/HibernateExt/search/src/test/org/hibernate/search/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/AlternateDocument.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/Clock.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/Document.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/HANTestCase.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/RamDirectoryTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/TransactionTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/BridgeTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/Cloud.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/CloudType.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/DateSplitBridge.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/PaddedIntegerBridge.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateFieldBridge.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateStringBridge.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/MultipleSFTestCase.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/SnowStorm.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Address.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Owner.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Tower.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/Document.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/FieldAccessTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Animal.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/InheritanceTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Mammal.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/JMSMasterTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MDBSearchController.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MyHibernateUtil.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/TShirt.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/JMSSlaveTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/SearchQueueChecker.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/TShirt.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/AlternateBook.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Book.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Clock.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/Email.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/util/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/util/FileHelperTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employee.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employer.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java
trunk/HibernateExt/validator/
trunk/HibernateExt/validator/build.properties.dist
trunk/HibernateExt/validator/build.xml
trunk/HibernateExt/validator/changelog.txt
trunk/HibernateExt/validator/doc/
trunk/HibernateExt/validator/doc/api/
trunk/HibernateExt/validator/doc/api/package.html
trunk/HibernateExt/validator/doc/reference/
trunk/HibernateExt/validator/doc/reference/build.xml
trunk/HibernateExt/validator/doc/reference/en/
trunk/HibernateExt/validator/doc/reference/en/images/
trunk/HibernateExt/validator/doc/reference/en/images/hibernate_logo_a.png
trunk/HibernateExt/validator/doc/reference/en/master.xml
trunk/HibernateExt/validator/doc/reference/en/modules/
trunk/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml
trunk/HibernateExt/validator/doc/reference/en/modules/defineconstraints.xml
trunk/HibernateExt/validator/doc/reference/en/styles/
trunk/HibernateExt/validator/doc/reference/en/styles/fopdf.xsl
trunk/HibernateExt/validator/doc/reference/en/styles/html.css
trunk/HibernateExt/validator/doc/reference/en/styles/html.xsl
trunk/HibernateExt/validator/doc/reference/en/styles/html_chunk.xsl
trunk/HibernateExt/validator/jdbc/
trunk/HibernateExt/validator/jdbc/hsqldb.jar
trunk/HibernateExt/validator/lgpl.txt
trunk/HibernateExt/validator/lib/
trunk/HibernateExt/validator/lib/README.txt
trunk/HibernateExt/validator/readme.txt
trunk/HibernateExt/validator/src/
trunk/HibernateExt/validator/src/java/
trunk/HibernateExt/validator/src/java/org/
trunk/HibernateExt/validator/src/java/org/hibernate/
trunk/HibernateExt/validator/src/java/org/hibernate/validator/
trunk/HibernateExt/validator/src/java/org/hibernate/validator/AbstractLuhnValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalse.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalseValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrue.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrueValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumber.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumberValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Digits.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/DigitsValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/EAN.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/EANValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Email.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/EmailValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Future.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/FutureValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidStateException.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidValue.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Length.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/LengthValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Max.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/MaxValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/MessageInterpolator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Min.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/MinValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmpty.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmptyValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNull.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNullValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Past.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/PastValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Pattern.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/PatternValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/PersistentClassConstraint.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/PropertyConstraint.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Range.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/RangeValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Size.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/SizeValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Valid.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Validator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/ValidatorClass.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Version.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/
trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/JPAValidateListener.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidateEventListener.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreInsertEventListener.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreUpdateEventListener.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/
trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolatorAggerator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_da.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_de.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_es.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_fr.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_it.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_nl.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_pt_BR.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_sv.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_CN.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_TW.properties
trunk/HibernateExt/validator/src/test/
trunk/HibernateExt/validator/src/test/ValidatorMessages.properties
trunk/HibernateExt/validator/src/test/ValidatorMessages_da.properties
trunk/HibernateExt/validator/src/test/ValidatorMessages_fr.properties
trunk/HibernateExt/validator/src/test/hibernate.properties
trunk/HibernateExt/validator/src/test/log4j.properties
trunk/HibernateExt/validator/src/test/messages_en.properties
trunk/HibernateExt/validator/src/test/org/
trunk/HibernateExt/validator/src/test/org/hibernate/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Address.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Brother.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Building.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Contact.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/EmailTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/HANTestCase.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/InterpolationTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Serializability.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/SerializabilityValidator.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Site.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Tv.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/TvOwner.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/User.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Vase.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Movie.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Presenter.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Show.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Tv.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Address.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/CreditCard.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MarsAddress.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Martian.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MartianPk.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Music.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/PrefixMessageInterpolator.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Rock.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Tv.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/TvOwner.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/User.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Venusian.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/VenusianPk.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Animal.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/BoneEater.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Dog.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Eater.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/InheritanceTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Name.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Commander.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPATestCase.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPAValidateListenerTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Submarine.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Address.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Form.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Member.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/ValidTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/Car.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/CreditCard.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/DigitsTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/LuhnTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/NotEmptyTest.java
Removed:
trunk/HibernateExt/annotations/.cvsignore
trunk/HibernateExt/annotations/build.properties.dist
trunk/HibernateExt/annotations/build.xml
trunk/HibernateExt/annotations/changelog.txt
trunk/HibernateExt/annotations/doc/
trunk/HibernateExt/annotations/doc/api/
trunk/HibernateExt/annotations/doc/api/package.html
trunk/HibernateExt/annotations/doc/reference/
trunk/HibernateExt/annotations/doc/reference/.cvsignore
trunk/HibernateExt/annotations/doc/reference/build.xml
trunk/HibernateExt/annotations/doc/reference/en/
trunk/HibernateExt/annotations/doc/reference/en/images/
trunk/HibernateExt/annotations/doc/reference/en/images/hibernate_logo_a.png
trunk/HibernateExt/annotations/doc/reference/en/master.xml
trunk/HibernateExt/annotations/doc/reference/en/modules/
trunk/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml
trunk/HibernateExt/annotations/doc/reference/en/modules/entity.xml
trunk/HibernateExt/annotations/doc/reference/en/modules/setup.xml
trunk/HibernateExt/annotations/doc/reference/en/modules/xml-overriding.xml
trunk/HibernateExt/annotations/doc/reference/en/styles/
trunk/HibernateExt/annotations/doc/reference/en/styles/fopdf.xsl
trunk/HibernateExt/annotations/doc/reference/en/styles/html.css
trunk/HibernateExt/annotations/doc/reference/en/styles/html.xsl
trunk/HibernateExt/annotations/doc/reference/en/styles/html_chunk.xsl
trunk/HibernateExt/annotations/doc/reference/fr/
trunk/HibernateExt/annotations/doc/reference/fr/images/
trunk/HibernateExt/annotations/doc/reference/fr/images/hibernate_logo_a.png
trunk/HibernateExt/annotations/doc/reference/fr/master.xml
trunk/HibernateExt/annotations/doc/reference/fr/modules/
trunk/HibernateExt/annotations/doc/reference/fr/modules/entity.xml
trunk/HibernateExt/annotations/doc/reference/fr/modules/lucene.xml
trunk/HibernateExt/annotations/doc/reference/fr/modules/setup.xml
trunk/HibernateExt/annotations/doc/reference/fr/modules/validator.xml
trunk/HibernateExt/annotations/doc/reference/fr/modules/xml-overriding.xml
trunk/HibernateExt/annotations/doc/reference/fr/styles/
trunk/HibernateExt/annotations/doc/reference/fr/styles/fopdf.xsl
trunk/HibernateExt/annotations/doc/reference/fr/styles/html.css
trunk/HibernateExt/annotations/doc/reference/fr/styles/html.xsl
trunk/HibernateExt/annotations/doc/reference/fr/styles/html_chunk.xsl
trunk/HibernateExt/annotations/doc/reference/zh_cn/
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.ttf
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.ttc
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/userconfig.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/images/
trunk/HibernateExt/annotations/doc/reference/zh_cn/images/hibernate_logo_a.png
trunk/HibernateExt/annotations/doc/reference/zh_cn/master.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/entity.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/lucene.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/setup.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/validator.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/xml-overriding.xml
trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/
trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/fopdf.xsl
trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.css
trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.xsl
trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html_chunk.xsl
trunk/HibernateExt/annotations/jdbc/
trunk/HibernateExt/annotations/jdbc/hsqldb.jar
trunk/HibernateExt/annotations/lgpl.txt
trunk/HibernateExt/annotations/lib/
trunk/HibernateExt/annotations/lib/README.txt
trunk/HibernateExt/annotations/readme.txt
trunk/HibernateExt/annotations/src/
trunk/HibernateExt/annotations/src/java/
trunk/HibernateExt/annotations/src/java/org/
trunk/HibernateExt/annotations/src/java/org/hibernate/
trunk/HibernateExt/annotations/src/java/org/hibernate/AnnotationException.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/AccessType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/BatchSize.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cache.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheConcurrencyStrategy.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheModeType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cascade.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CascadeType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Check.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionId.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionOfElements.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Columns.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/DiscriminatorFormula.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Entity.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Fetch.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FetchMode.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filter.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDef.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDefs.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTable.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTables.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filters.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FlushModeType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForceDiscriminator.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForeignKey.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Formula.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Generated.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenerationTime.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenericGenerator.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Immutable.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Index.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/IndexColumn.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollection.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollectionOption.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOne.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOneOption.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Loader.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKey.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKeyManyToMany.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQueries.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQuery.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQueries.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQuery.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFound.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFoundAction.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDelete.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDeleteAction.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLock.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLockType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OrderBy.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ParamDef.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parameter.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parent.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Persister.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/PolymorphismType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Proxy.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ResultCheckStyle.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDelete.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDeleteAll.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLInsert.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLUpdate.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Sort.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SortType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Table.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tables.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Target.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizer.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizers.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Type.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDef.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDefs.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Where.java
trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/WhereJoinTable.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AbstractPropertyHolder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotatedClassType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/BinderHelper.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ClassPropertyHolder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CollectionPropertyHolder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ComponentPropertyHolder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CreateKeySecondPass.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3NamingStrategy.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3Column.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3JoinColumn.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ExtendedMappings.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/FkSecondPass.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexColumn.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexSecondPass.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/InheritanceState.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/NotYetImplementedException.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/OneToOneSecondPass.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyData.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolderBuilder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyInferredData.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyPreloadedData.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/WrappedInferredData.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ArrayBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/BagBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/CollectionBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/EntityBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/IdBagBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ListBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/MapBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Nullability.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PrimitiveArrayBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PropertyBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/QueryBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SetBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/TableBinder.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Version.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3OverridenAnnotationReader.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3ReflectionManager.java
trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/XMLContext.java
trunk/HibernateExt/annotations/src/java/org/hibernate/ejb/
trunk/HibernateExt/annotations/src/java/org/hibernate/ejb/orm_1_0.xsd
trunk/HibernateExt/annotations/src/java/org/hibernate/mapping/
trunk/HibernateExt/annotations/src/java/org/hibernate/mapping/IdGenerator.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/
trunk/HibernateExt/annotations/src/java/org/hibernate/type/AbstractLobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/ByteArrayBlobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/CharacterArrayClobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/EnumType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveByteArrayBlobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveCharacterArrayClobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/SerializableToBlobType.java
trunk/HibernateExt/annotations/src/java/org/hibernate/type/StringClobType.java
trunk/HibernateExt/annotations/src/test/
trunk/HibernateExt/annotations/src/test/ehcache.xml
trunk/HibernateExt/annotations/src/test/hibernate.properties
trunk/HibernateExt/annotations/src/test/log4j.properties
trunk/HibernateExt/annotations/src/test/org/
trunk/HibernateExt/annotations/src/test/org/hibernate/
trunk/HibernateExt/annotations/src/test/org/hibernate/annotations/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320b.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AlternativeNamingStrategy.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AmericaCupClass.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Company.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/ConfigurationTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Country.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Customer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Discount.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/EntityTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Flight.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/FlyingObject.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/IncorrectEntity.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/JoinedSubclassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Passport.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Plane.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Port.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SafeMappingTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SecuredBindingTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Sky.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TestCase.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Thing.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ticket.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TicketComparator.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/AccessTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Bed.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/BigBed.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Chair.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Furniture.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Thingy.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Woody.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/ArrayTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Competitor.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Contest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Hammer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Tool.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/hammer.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/CascadeTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Mouth.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Tooth.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Channel.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Child.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ChildPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Order.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLine.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLinePk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Parent.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ParentPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Presenter.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Product.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazin.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Boy.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Brand.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Character.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CountryAttitude.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Toy.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/Flight.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/orm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Address.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/AddressType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Book.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/CorpType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Country.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Deal.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/EmbeddedTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FixedLeg.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FloatLeg.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/InternetProvider.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Leg.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/LegalStructure.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Manager.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Nationality.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/NotonialDeal.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Person.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticle.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticlePk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/SpreadDeal.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Summary.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Swap.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/VanillaSwap.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Address.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Bid.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CasterStringType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CommunityBid.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Country.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Flight.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Forest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Java5FeaturesTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Length.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmount.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Race.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Ransom.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Starred.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Tree.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/WashingMachine.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/ZipCode.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/package-info.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Cellular.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Communication.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/GSM.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Interaction.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Phone.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Voice.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/FetchingTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Person.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Stay.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/DNA.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Gene.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/GenericsTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Item.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Paper.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PaperType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Price.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PricedStuff.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/SomeGuy.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/State.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/StateType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Stuff.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/WildEntity.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Child.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Parent.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/hibernate.cfg.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Ball.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/BreakDance.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Computer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Department.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Dog.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FirTree.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Footballer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FootballerPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Furniture.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/GoalKeeper.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Home.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdClassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Location.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/MilitaryBuilding.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Phone.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Shoe.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/SoundSystem.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Store.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tower.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tree.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/package-info.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Card.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardField.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardKey.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Customer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/IdManyToOne.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Project.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Store.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressBook.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntry.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Drawer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Dress.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Gas.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Generation.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationGroup.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationUser.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/MapKeyTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/News.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Newspaper.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painter.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painting.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PaintingPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Software.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Trainee.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Training.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Version.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Wardrobe.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Apple.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Carrot.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Fruit.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/SubclassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Tomato.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Vegetable.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/VegetablePk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Alarm.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Clothing.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Document.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/EventInformation.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/File.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Folder.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Parent.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Pool.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Sweater.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Document.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/File.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Folder.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Building.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Funk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/House.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Music.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Noise.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Rock.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Trash.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Document.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/File.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Folder.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SubclassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/Contact.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/ContactImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/InterfacesTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/User.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/UserImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Cat.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Death.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Dog.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/DogPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/JoinTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Life.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Loader.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/LoaderTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Player.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Team.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/TestCase.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Book.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/CompiledCode.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Editor.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/LobTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Building.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/BuildingCompany.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Cat.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/CatPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/City.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Company.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employee.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Friend.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Group.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/GroupWithSet.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Inspector.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/KnownClient.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Man.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Permission.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Store.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Supplier.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Woman.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/WomanPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Zone.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/BiggestForest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Car.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Carz.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Child.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Color.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Customer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Deal.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ForestType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Frame.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lens.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lotz.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/LotzPK.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Node.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/NodePk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Order.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/OrderLine.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Parent.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ParentPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/TreeType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/User.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/UserPK.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Coin.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Currency.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/NotFoundTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Child.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/City.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Monkey.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OneToManyTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Organisation.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OrganisationUser.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Parent.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/ParentPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Person.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/PoliticalParty.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Politician.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Soldier.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Street.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Tiger.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Trainer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Troop.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Address.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Body.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Client.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Computer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/ComputerPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Heart.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OneToOneTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Owner.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OwnerAddress.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Party.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/PartyAffiliate.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumber.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumberPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Trousers.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/TrousersZip.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/orm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Location.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Move.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Trip.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Card.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/CollectionPersister.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Deck.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/EntityPersister.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/PersisterTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/Car.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/MovingThing.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/SportCar.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Area.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Captain.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/CasimirParticle.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Chaos.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dictionary.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dimensions.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Identity.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Mark.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Night.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/QueryAndSQLTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SpaceShip.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SynonymousDictionary.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/orm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/QuoteTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/Role.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/User.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Bag.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Clothes.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/House.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Item.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Luggage.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Postman.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Rambler.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Vendor.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Administration.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Availability.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTrip.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTripPk.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Competition.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/LogListener.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Match.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Organization.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/OtherLogListener.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/TennisMatch.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/XMLContextTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/metadata-complete.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/orm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Location.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Storm.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/StrategyTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Component.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Machine.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Product.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Robot.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/T800.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Brand.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Luggage.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/LuggageImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Owner.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/OwnerImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Size.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/SizeImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/TargetTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Country.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Cuisine.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/ProxyHelper.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/TuplizerTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/Dvd.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOid.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidGenerator.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/TypeTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Antenna.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Conductor.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/GeneratedTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/IndexTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Truck.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Vehicule.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/VersionTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/version/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/CarModel.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Light.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Lighter.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Model.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm2.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm3.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/AImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/BImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/HbmTest.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Sky.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Z.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/ZImpl.java
trunk/HibernateExt/annotations/src/test/org/hibernate/test/lucene/
trunk/HibernateExt/commons-annotations/build.xml
trunk/HibernateExt/commons-annotations/changelog.txt
trunk/HibernateExt/commons-annotations/lgpl.txt
trunk/HibernateExt/commons-annotations/lib/
trunk/HibernateExt/commons-annotations/lib/README.txt
trunk/HibernateExt/commons-annotations/readme.txt
trunk/HibernateExt/commons-annotations/src/
trunk/HibernateExt/commons-annotations/src/java/
trunk/HibernateExt/commons-annotations/src/java/org/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/AssertionFailure.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationDescriptor.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationFactory.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationProxy.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/AnnotationReader.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/Filter.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionManager.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionUtil.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XAnnotatedElement.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XClass.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMember.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMethod.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XPackage.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XProperty.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaAnnotationReader.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaReflectionManager.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXAnnotatedElement.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXArrayType.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXClass.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXCollectionType.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMember.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMethod.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXPackage.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXProperty.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXSimpleType.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXType.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/Pair.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/ApproximatingTypeEnvironment.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/CompoundTypeEnvironment.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/IdentityTypeEnvironment.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/SimpleTypeEnvironment.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironment.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironmentFactory.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeFactory.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeSwitch.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeUtils.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/ReflectHelper.java
trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/StringHelper.java
trunk/HibernateExt/commons-annotations/src/test/
trunk/HibernateExt/commons-annotations/src/test/org/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationFactoryTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationProxyTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/TestAnnotation.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Foo.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/FooFather.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaReflectionManagerTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXClassTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXPropertyTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Sex.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/TestAnnotation.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/XAnnotatedElementTestCase.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/BigBlob.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Dad.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Grandpa.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Language.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Neighbour.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Son.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/SonOfBlob.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TestAnnotation.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeEnvironmentFactoryTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeUtilsTest.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsContainment.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsInheritance.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Dummy.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DummySubclass.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass1.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass2.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass1.java
trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass2.java
trunk/HibernateExt/ejb-api/
trunk/HibernateExt/ejb/
trunk/HibernateExt/entitymanager/.cvsignore
trunk/HibernateExt/entitymanager/build.properties.dist
trunk/HibernateExt/entitymanager/build.xml
trunk/HibernateExt/entitymanager/changelog.txt
trunk/HibernateExt/entitymanager/doc/
trunk/HibernateExt/entitymanager/doc/reference/
trunk/HibernateExt/entitymanager/doc/reference/.cvsignore
trunk/HibernateExt/entitymanager/doc/reference/build.xml
trunk/HibernateExt/entitymanager/doc/reference/en/
trunk/HibernateExt/entitymanager/doc/reference/en/images/
trunk/HibernateExt/entitymanager/doc/reference/en/images/hibernate_logo_a.png
trunk/HibernateExt/entitymanager/doc/reference/en/master.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/
trunk/HibernateExt/entitymanager/doc/reference/en/modules/architecture.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/batch.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/configuration.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/entitymanagerapi.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/listeners.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_ejbql.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_native.xml
trunk/HibernateExt/entitymanager/doc/reference/en/modules/transactions.xml
trunk/HibernateExt/entitymanager/doc/reference/en/styles/
trunk/HibernateExt/entitymanager/doc/reference/en/styles/fopdf.xsl
trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.css
trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.xsl
trunk/HibernateExt/entitymanager/doc/reference/en/styles/html_chunk.xsl
trunk/HibernateExt/entitymanager/jdbc/
trunk/HibernateExt/entitymanager/jdbc/hsqldb.jar
trunk/HibernateExt/entitymanager/lgpl.txt
trunk/HibernateExt/entitymanager/lib/
trunk/HibernateExt/entitymanager/lib/README.txt
trunk/HibernateExt/entitymanager/lib/jboss-archive-browsing.jar
trunk/HibernateExt/entitymanager/readme.txt
trunk/HibernateExt/entitymanager/src/
trunk/HibernateExt/entitymanager/src/java/
trunk/HibernateExt/entitymanager/src/java/org/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3Configuration.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3ConfigurationObjectFactory.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManager.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerFactory.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernatePersistence.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateQuery.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/InjectionSettingsFactory.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/QueryImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/TransactionImpl.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Version.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/InjectedDataSourceConnectionProvider.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/BeanCallback.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/Callback.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackHandlerConsumer.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackResolver.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3AutoFlushEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEntityEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3MergeEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistOnFlushEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostDeleteEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostInsertEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostLoadEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostUpdateEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveOrUpdateEventListener.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EntityCallbackHandler.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/ListenerCallback.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/ExplodedJarVisitor.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/FileZippedJarVisitor.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/InputStreamZippedJarVisitor.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/JarVisitor.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/NamedInputStream.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/XmlHelper.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransaction.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransactionFactory.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/ConfigurationHelper.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/LogHelper.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/NamingHelper.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/
trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadeStyle.java
trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadingAction.java
trunk/HibernateExt/entitymanager/src/resources/
trunk/HibernateExt/entitymanager/src/resources/META-INF/
trunk/HibernateExt/entitymanager/src/resources/META-INF/services/
trunk/HibernateExt/entitymanager/src/resources/META-INF/services/javax.persistence.spi.PersistenceProvider
trunk/HibernateExt/entitymanager/src/resources/org/
trunk/HibernateExt/entitymanager/src/resources/org/hibernate/
trunk/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/persistence_1_0.xsd
trunk/HibernateExt/entitymanager/src/test-resources/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/
trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/orm.xml
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/
trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/Mouse.hbm.xml
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/Mouse.hbm.xml
trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/orm2.xml
trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/
trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/orm.xml
trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/
trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/Elephant.hbm.xml
trunk/HibernateExt/entitymanager/src/test-resources/externaljar/
trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/MANIFEST.MF
trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/orm.xml
trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/
trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test-resources/space par/
trunk/HibernateExt/entitymanager/src/test-resources/space par/META-INF/
trunk/HibernateExt/entitymanager/src/test-resources/space par/META-INF/persistence.xml
trunk/HibernateExt/entitymanager/src/test/
trunk/HibernateExt/entitymanager/src/test/NoPackageEntity.java
trunk/HibernateExt/entitymanager/src/test/hibernate.properties
trunk/HibernateExt/entitymanager/src/test/log4j.properties
trunk/HibernateExt/entitymanager/src/test/org/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Cat.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Distributor.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EJB3TestCase.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EntityManagerTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Item.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/LastUpdateListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/MyNamingStrategy.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/QueryTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/TestCase.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ValidatorIntegrationTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Wallet.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/AssociationTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Incident.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/IncidentStatus.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Kitchen.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Oven.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CommunicationSystem.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryChecker.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryNameCheckerListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Customer.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Employee.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/ExceptionListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/FirstOneListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/IncreaseListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Person.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Plant.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/RemoteControl.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Rythm.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Television.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Translation.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/VideoSystem.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Author.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/CascadeTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Conference.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/DeleteOrphanTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocument.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocumentInfo.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Grandson.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Parent.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier2.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Son.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Song.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Student.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Teacher.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop2.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSource.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSourceException.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ExceptionInterceptor.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/InterceptorTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ProgrammaticConfTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/TestCase.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Cat.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Colony.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competition.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competitor.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Decorate.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dog.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dress.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Empire.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushModeTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Mail.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/MergeTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Music.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Pet.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Race.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RefreshTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RemoveTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/A.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B1.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B2.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B3.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B4.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C1.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C2.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/CascadePersistTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/ExceptionTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/Music.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/hibernate.cfg.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Fruit.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/InheritanceTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Strawberry.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InstrumentedClassLoader.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InterceptFieldClassFileTransformerTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/Simple.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/BlobTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/ImageReader.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/Lock.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/LockTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Animal.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Child.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employee.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.hbm.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FindTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FlushTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/GetLoadTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Mammal.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeNewTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.hbm.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/NumberedNode.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Parent.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/ParentChild.hbm.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/PersistTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Reptile.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Workload.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/Morito.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/ApplicationServer.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/IncrementListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Lighter.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Money.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Mouse.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/OtherIncrementListener.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Version.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/package-info.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/Caipirinha.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/Washer.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Carpet.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Elephant.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/package-info.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/Scooter.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/Bug.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/Bug.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Airplane.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Seat.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/package-info.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/JarVisitorTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/Book.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Address.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Article.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Employee.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Light.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Lighter.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlAttributeOverrideTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlTest.java
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm2.xml
trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm3.xml
trunk/HibernateExt/jpa-api/.cvsignore
trunk/HibernateExt/jpa-api/build.xml
trunk/HibernateExt/jpa-api/doc/
trunk/HibernateExt/jpa-api/doc/api/
trunk/HibernateExt/jpa-api/doc/api/package.html
trunk/HibernateExt/jpa-api/etc/
trunk/HibernateExt/jpa-api/etc/jdstyle.css
trunk/HibernateExt/jpa-api/etc/license.txt
trunk/HibernateExt/jpa-api/src/
trunk/HibernateExt/jpa-api/src/javax/
trunk/HibernateExt/jpa-api/src/javax/persistence/
trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverride.java
trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverrides.java
trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverride.java
trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverrides.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Basic.java
trunk/HibernateExt/jpa-api/src/javax/persistence/CascadeType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Column.java
trunk/HibernateExt/jpa-api/src/javax/persistence/ColumnResult.java
trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorColumn.java
trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorValue.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Embeddable.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Embedded.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EmbeddedId.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Entity.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityExistsException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityListeners.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManager.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManagerFactory.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityNotFoundException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityResult.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EntityTransaction.java
trunk/HibernateExt/jpa-api/src/javax/persistence/EnumType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Enumerated.java
trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeDefaultListeners.java
trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeSuperclassListeners.java
trunk/HibernateExt/jpa-api/src/javax/persistence/FetchType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/FieldResult.java
trunk/HibernateExt/jpa-api/src/javax/persistence/FlushModeType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/GeneratedValue.java
trunk/HibernateExt/jpa-api/src/javax/persistence/GenerationType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Id.java
trunk/HibernateExt/jpa-api/src/javax/persistence/IdClass.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Inheritance.java
trunk/HibernateExt/jpa-api/src/javax/persistence/InheritanceType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumn.java
trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumns.java
trunk/HibernateExt/jpa-api/src/javax/persistence/JoinTable.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Lob.java
trunk/HibernateExt/jpa-api/src/javax/persistence/LockModeType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToMany.java
trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToOne.java
trunk/HibernateExt/jpa-api/src/javax/persistence/MapKey.java
trunk/HibernateExt/jpa-api/src/javax/persistence/MappedSuperclass.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQueries.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQuery.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQueries.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQuery.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NoResultException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/NonUniqueResultException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/OneToMany.java
trunk/HibernateExt/jpa-api/src/javax/persistence/OneToOne.java
trunk/HibernateExt/jpa-api/src/javax/persistence/OptimisticLockException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/OrderBy.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Persistence.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContext.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContextType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContexts.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceProperty.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnit.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnits.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PostLoad.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PostPersist.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PostRemove.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PostUpdate.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PrePersist.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PreRemove.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PreUpdate.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumn.java
trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumns.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Query.java
trunk/HibernateExt/jpa-api/src/javax/persistence/QueryHint.java
trunk/HibernateExt/jpa-api/src/javax/persistence/RollbackException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTable.java
trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTables.java
trunk/HibernateExt/jpa-api/src/javax/persistence/SequenceGenerator.java
trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMapping.java
trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMappings.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Table.java
trunk/HibernateExt/jpa-api/src/javax/persistence/TableGenerator.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Temporal.java
trunk/HibernateExt/jpa-api/src/javax/persistence/TemporalType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/TransactionRequiredException.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Transient.java
trunk/HibernateExt/jpa-api/src/javax/persistence/UniqueConstraint.java
trunk/HibernateExt/jpa-api/src/javax/persistence/Version.java
trunk/HibernateExt/jpa-api/src/javax/persistence/package-info.java
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/ClassTransformer.java
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceProvider.java
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitInfo.java
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitTransactionType.java
trunk/HibernateExt/jpa-api/src/javax/persistence/spi/package-info.java
trunk/HibernateExt/metadata/
trunk/HibernateExt/search/build.properties.dist
trunk/HibernateExt/search/build.xml
trunk/HibernateExt/search/changelog.txt
trunk/HibernateExt/search/doc/
trunk/HibernateExt/search/doc/api/
trunk/HibernateExt/search/doc/api/package.html
trunk/HibernateExt/search/doc/reference/
trunk/HibernateExt/search/doc/reference/.cvsignore
trunk/HibernateExt/search/doc/reference/build.xml
trunk/HibernateExt/search/doc/reference/en/
trunk/HibernateExt/search/doc/reference/en/images/
trunk/HibernateExt/search/doc/reference/en/images/hibernate_logo_a.png
trunk/HibernateExt/search/doc/reference/en/images/jms-backend.png
trunk/HibernateExt/search/doc/reference/en/images/lucene-backend.png
trunk/HibernateExt/search/doc/reference/en/master.xml
trunk/HibernateExt/search/doc/reference/en/modules/
trunk/HibernateExt/search/doc/reference/en/modules/architecture.xml
trunk/HibernateExt/search/doc/reference/en/modules/batchindex.xml
trunk/HibernateExt/search/doc/reference/en/modules/configuration.xml
trunk/HibernateExt/search/doc/reference/en/modules/mapping.xml
trunk/HibernateExt/search/doc/reference/en/modules/query.xml
trunk/HibernateExt/search/doc/reference/en/styles/
trunk/HibernateExt/search/doc/reference/en/styles/fopdf.xsl
trunk/HibernateExt/search/doc/reference/en/styles/html.css
trunk/HibernateExt/search/doc/reference/en/styles/html.xsl
trunk/HibernateExt/search/doc/reference/en/styles/html_chunk.xsl
trunk/HibernateExt/search/jdbc/
trunk/HibernateExt/search/jdbc/hsqldb.jar
trunk/HibernateExt/search/lgpl.txt
trunk/HibernateExt/search/lib/
trunk/HibernateExt/search/lib/README.txt
trunk/HibernateExt/search/lib/jms.jar
trunk/HibernateExt/search/lib/lucene-core-2.1.0.jar
trunk/HibernateExt/search/readme.txt
trunk/HibernateExt/search/src/
trunk/HibernateExt/search/src/java/
trunk/HibernateExt/search/src/java/org/
trunk/HibernateExt/search/src/java/org/hibernate/
trunk/HibernateExt/search/src/java/org/hibernate/search/
trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java
trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java
trunk/HibernateExt/search/src/java/org/hibernate/search/Search.java
trunk/HibernateExt/search/src/java/org/hibernate/search/SearchException.java
trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Boost.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/ContainedIn.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DateBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DocumentId.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Field.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/FieldBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Index.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Indexed.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/IndexedEmbedded.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Keyword.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Parameter.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Resolution.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Store.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Text.java
trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Unstored.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/AddLuceneWork.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/DeleteLuceneWork.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Work.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkType.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneWorker.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/BridgeFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/FieldBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/ParameterizedBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/String2FieldBridgeAdaptor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/StringBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayFieldBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayString2FieldBridgeAdaptor.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayStringBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigDecimalBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigIntegerBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BooleanBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DateBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DoubleBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/EnumBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/FloatBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/IntegerBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/LongBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/NumberBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/ShortBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/StringBridge.java
trunk/HibernateExt/search/src/java/org/hibernate/search/engine/
trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java
trunk/HibernateExt/search/src/java/org/hibernate/search/event/
trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java
trunk/HibernateExt/search/src/java/org/hibernate/search/impl/
trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java
trunk/HibernateExt/search/src/java/org/hibernate/search/query/
trunk/HibernateExt/search/src/java/org/hibernate/search/query/EntityInfo.java
trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java
trunk/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java
trunk/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/
trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java
trunk/HibernateExt/search/src/java/org/hibernate/search/util/
trunk/HibernateExt/search/src/java/org/hibernate/search/util/BinderHelper.java
trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java
trunk/HibernateExt/search/src/java/org/hibernate/search/util/DirectoryProviderHelper.java
trunk/HibernateExt/search/src/java/org/hibernate/search/util/FileHelper.java
trunk/HibernateExt/search/src/java/org/hibernate/search/util/WeakIdentityHashMap.java
trunk/HibernateExt/search/src/test-resources/
trunk/HibernateExt/search/src/test/
trunk/HibernateExt/search/src/test/hibernate.properties
trunk/HibernateExt/search/src/test/log4j.properties
trunk/HibernateExt/search/src/test/org/
trunk/HibernateExt/search/src/test/org/hibernate/
trunk/HibernateExt/search/src/test/org/hibernate/search/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/AlternateDocument.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/Clock.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/Document.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/HANTestCase.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/RamDirectoryTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/TransactionTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/BridgeTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/Cloud.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/CloudType.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/DateSplitBridge.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/PaddedIntegerBridge.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateFieldBridge.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateStringBridge.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/MultipleSFTestCase.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/SnowStorm.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Address.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Owner.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Tower.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/Document.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/FieldAccessTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Animal.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/InheritanceTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Mammal.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/JMSMasterTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MDBSearchController.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MyHibernateUtil.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/TShirt.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/JMSSlaveTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/SearchQueueChecker.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/TShirt.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/AlternateBook.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Book.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Clock.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/Email.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/util/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/util/FileHelperTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employee.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employer.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java
trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java
trunk/HibernateExt/validator/build.properties.dist
trunk/HibernateExt/validator/build.xml
trunk/HibernateExt/validator/changelog.txt
trunk/HibernateExt/validator/doc/
trunk/HibernateExt/validator/doc/api/
trunk/HibernateExt/validator/doc/api/package.html
trunk/HibernateExt/validator/doc/reference/
trunk/HibernateExt/validator/doc/reference/build.xml
trunk/HibernateExt/validator/doc/reference/en/
trunk/HibernateExt/validator/doc/reference/en/images/
trunk/HibernateExt/validator/doc/reference/en/images/hibernate_logo_a.png
trunk/HibernateExt/validator/doc/reference/en/master.xml
trunk/HibernateExt/validator/doc/reference/en/modules/
trunk/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml
trunk/HibernateExt/validator/doc/reference/en/modules/defineconstraints.xml
trunk/HibernateExt/validator/doc/reference/en/styles/
trunk/HibernateExt/validator/doc/reference/en/styles/fopdf.xsl
trunk/HibernateExt/validator/doc/reference/en/styles/html.css
trunk/HibernateExt/validator/doc/reference/en/styles/html.xsl
trunk/HibernateExt/validator/doc/reference/en/styles/html_chunk.xsl
trunk/HibernateExt/validator/jdbc/
trunk/HibernateExt/validator/jdbc/hsqldb.jar
trunk/HibernateExt/validator/lgpl.txt
trunk/HibernateExt/validator/lib/
trunk/HibernateExt/validator/lib/README.txt
trunk/HibernateExt/validator/readme.txt
trunk/HibernateExt/validator/src/
trunk/HibernateExt/validator/src/java/
trunk/HibernateExt/validator/src/java/org/
trunk/HibernateExt/validator/src/java/org/hibernate/
trunk/HibernateExt/validator/src/java/org/hibernate/validator/
trunk/HibernateExt/validator/src/java/org/hibernate/validator/AbstractLuhnValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalse.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalseValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrue.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrueValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumber.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumberValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Digits.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/DigitsValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/EAN.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/EANValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Email.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/EmailValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Future.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/FutureValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidStateException.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidValue.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Length.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/LengthValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Max.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/MaxValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/MessageInterpolator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Min.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/MinValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmpty.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmptyValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNull.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNullValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Past.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/PastValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Pattern.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/PatternValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/PersistentClassConstraint.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/PropertyConstraint.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Range.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/RangeValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Size.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/SizeValidator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Valid.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Validator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/ValidatorClass.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/Version.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/
trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/JPAValidateListener.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidateEventListener.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreInsertEventListener.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreUpdateEventListener.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/
trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolatorAggerator.java
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_da.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_de.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_es.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_fr.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_it.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_nl.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_pt_BR.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_sv.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_CN.properties
trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_TW.properties
trunk/HibernateExt/validator/src/test/
trunk/HibernateExt/validator/src/test/ValidatorMessages.properties
trunk/HibernateExt/validator/src/test/ValidatorMessages_da.properties
trunk/HibernateExt/validator/src/test/ValidatorMessages_fr.properties
trunk/HibernateExt/validator/src/test/hibernate.properties
trunk/HibernateExt/validator/src/test/log4j.properties
trunk/HibernateExt/validator/src/test/messages_en.properties
trunk/HibernateExt/validator/src/test/org/
trunk/HibernateExt/validator/src/test/org/hibernate/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Address.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Brother.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Building.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Contact.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/EmailTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/HANTestCase.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/InterpolationTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Serializability.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/SerializabilityValidator.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Site.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Tv.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/TvOwner.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/User.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Vase.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Movie.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Presenter.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Show.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Tv.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Address.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/CreditCard.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MarsAddress.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Martian.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MartianPk.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Music.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/PrefixMessageInterpolator.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Rock.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Tv.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/TvOwner.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/User.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Venusian.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/VenusianPk.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Animal.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/BoneEater.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Dog.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Eater.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/InheritanceTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Name.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Commander.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPATestCase.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPAValidateListenerTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Submarine.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Address.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Form.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Member.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/ValidTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/Car.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/CreditCard.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/DigitsTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/LuhnTest.java
trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/NotEmptyTest.java
Modified:
trunk/HibernateExt/common/common-build.xml
Log:
Merge from Branch_3_2 to trunk for HAN, HEM, Search, Validator and commons-annotations
Copied: trunk/HibernateExt/annotations (from rev 11279, branches/Branch_3_2/HibernateExt/annotations)
Property changes on: trunk/HibernateExt/annotations
___________________________________________________________________
Name: svn:ignore
+ target
build
build.properties
test_output
testout
common-build.xml
javadoc.bat
build.properties
instrumenttestout
classes
Deleted: trunk/HibernateExt/annotations/.cvsignore
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/.cvsignore 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/.cvsignore 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,9 +0,0 @@
-target
-build
-build.properties
-test_output
-testout
-common-build.xml
-javadoc.bat
-build.properties
-instrumenttestout
Copied: trunk/HibernateExt/annotations/.cvsignore (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/.cvsignore)
===================================================================
--- trunk/HibernateExt/annotations/.cvsignore (rev 0)
+++ trunk/HibernateExt/annotations/.cvsignore 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,9 @@
+target
+build
+build.properties
+test_output
+testout
+common-build.xml
+javadoc.bat
+build.properties
+instrumenttestout
Deleted: trunk/HibernateExt/annotations/build.properties.dist
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/build.properties.dist 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/build.properties.dist 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,9 +0,0 @@
-common.dir=.
-src.dir=src
-test.dir=test
-hibernate-core.home=../hibernate-3.2
-
-#locally present jars
-jpa-api.jar=./lib/ejb3-persistence.jar
-commons-annotations.jar=./lib/hibernate-commons-annotations.jar
-validator.jar=./lib/test/hibernate-validator.jar
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/build.properties.dist (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/build.properties.dist)
===================================================================
--- trunk/HibernateExt/annotations/build.properties.dist (rev 0)
+++ trunk/HibernateExt/annotations/build.properties.dist 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,9 @@
+common.dir=.
+src.dir=src
+test.dir=test
+hibernate-core.home=../hibernate-3.2
+
+#locally present jars
+jpa-api.jar=./lib/ejb3-persistence.jar
+commons-annotations.jar=./lib/hibernate-commons-annotations.jar
+validator.jar=./lib/test/hibernate-validator.jar
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/build.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/build.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,244 +0,0 @@
-<!--
-
- Hibernate Annotations ANT build script.
-
- You need JDK 5.0 installed to build Hibernate Annotations.
-
--->
-
-<project name="Hibernate Annotations" default="dist" basedir=".">
-
- <!-- Give user a chance to override without editing this file
- (and without typing -D each time it compiles it) -->
- <property file="build.properties"/>
- <property file="${user.home}/.ant.properties"/>
-
- <!-- Name of project and version, used to create filenames -->
- <property name="Name" value="Hibernate Annotations"/>
- <property name="name" value="hibernate-annotations"/>
- <property name="version" value="3.2.2.GA"/>
- <property name="javadoc.packagenames" value="org.hibernate.*"/>
- <property name="jdbc.dir" value="jdbc"/>
- <property name="copy.test" value="true"/>
- <property name="javac.source" value="1.5"/>
- <property name="javac.target" value="1.5"/>
- <property name="common.dir" value="../common"/>
-
- <property name="jpa-api.jar" value="${basedir}/../jpa-api/build/ejb3-persistence.jar"/>
- <property name="validator.jar"
- value="${basedir}/../validator/target/hibernate-validator/hibernate-validator.jar"/>
- <property name="commons-annotations.jar"
- value="${basedir}/../commons-annotations/target/hibernate-commons-annotations/hibernate-commons-annotations.jar"/>
-
-
- <available property="jpa-present" file="${basedir}/../jpa-api" type="dir"/>
- <import file="${common.dir}/common-build.xml"/>
- <property name="jpa-javadoc.dir" value="${dist.doc.dir}/jpa-api"/>
-
- <path id="lib.moduleclass.path">
- <pathelement location="${jpa-api.jar}"/>
- <pathelement location="${commons-annotations.jar}"/>
- </path>
-
- <path id="junit.moduleclasspath">
- <pathelement location="${src.dir}"/>
- <pathelement location="${test.dir}"/>
- <pathelement location="${validator.jar}"/>
- <pathelement location="lib/testlibs/org.eclipse.jdt.core_3.1.0.jar"/>
- <fileset dir="${jdbc.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.zip"/>
- </fileset>
- </path>
-
- <target name="init">
- <antcall target="common-build.init"/>
- <available file="${jpa-api.jar}" type="file" property="jpa-api.jar.available"/>
- <available file="${commons-annotations.jar}" type="file" property="commons-annotations.jar.available"/>
- <available file="${validator.jar}" type="file" property="validator.jar.available"/>
- <mkdir dir="${lib.dir}/test"/>
- </target>
-
- <target name="get.jpa-api" depends="init" unless="jpa-api.jar.available">
- <ant inheritall="false" dir="${basedir}/../jpa-api" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../jpa-api" target="jar"/>
- </target>
-
- <target name="get.commons-annotations" depends="init" unless="commons-annotations.jar.available">
- <ant inheritall="false" dir="${basedir}/../commons-annotations" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../commons-annotations" target="jar"/>
- </target>
-
- <target name="get.validator" depends="init" unless="validator.jar.available">
- <ant inheritall="false" dir="${basedir}/../validator" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../validator" target="jar"/>
- </target>
-
- <target name="compile" depends="init,get.jpa-api,get.commons-annotations"
- description="Compile the Java source code">
- <available
- classname="org.eclipse.core.launcher.Main"
- property="build.compiler"
- value="org.eclipse.jdt.core.JDTCompilerAdapter"
- classpath="${java.class.path}"/>
- <javac
- srcdir="${src.dir}"
- destdir="${classes.dir}"
- classpathref="lib.class.path"
- debug="${javac.debug}"
- optimize="${javac.optimize}"
- nowarn="on"
- source="${javac.source}"
- target="${javac.target}">
- <src path="${src.dir}"/>
- </javac>
- <copy todir="${classes.dir}">
- <fileset dir="${src.dir}">
- <include name="**/resources/*.properties"/>
- <include name="**/*.xsd"/>
- </fileset>
- </copy>
- </target>
-
- <target name="compiletest" depends="compile,get.validator" description="Compile the tests">
- <available
- classname="org.eclipse.core.launcher.Main"
- property="build.compiler"
- value="org.eclipse.jdt.core.JDTCompilerAdapter"
- classpath="${java.class.path}"/>
- <javac
- destdir="${testclasses.dir}"
- classpathref="junit.classpath"
- debug="${javac.debug}"
- optimize="${javac.optimize}"
- nowarn="on"
- source="${javac.source}"
- target="${javac.target}">
- <src refid="testsrc.path"/>
- </javac>
- </target>
-
-
- <!-- target name="junit" depends="compiletest">
- <mkdir dir="test_output"/>
- <junit fork="yes" printsummary="yes" haltonfailure="yes"
- forkmode="perBatch">
- <classpath>
- <fileset dir="${jdbc.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.zip"/>
- </fileset>
- <path refid="lib.class.path"/>
- <pathelement path="${classes.dir}"/>
- <pathelement path="${src.dir}"/>
- <pathelement path="${test.dir}"/>
- </classpath>
- <formatter type="plain"/>
- <formatter type="xml"/>
- <batchtest fork="yes" todir="test_output" haltonfailure="no">
- <fileset dir="${classes.dir}">
- <include name="**/*Test.class"/>
- </fileset>
- </batchtest>
- </junit>
- </target -->
-
- <!-- Run a single unit test. -->
- <target name="junitsingle" depends="compiletest"
- description="Run a single test suite (requires testname and jdbc.driver properties)">
- <mkdir dir="test_output"/>
- <junit printsummary="yes" fork="yes" haltonfailure="yes">
- <classpath>
- <fileset dir="${jdbc.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.zip"/>
- </fileset>
- <path refid="lib.class.path"/>
- <pathelement path="${classes.dir}"/>
- <pathelement path="${src.dir}"/>
- <!-- pick up properties from here -->
- <pathelement path="${test.dir}"/>
- <!-- pick up mappings from here -->
- </classpath>
- <formatter type="plain"/>
- <formatter type="xml"/>
- <test fork="yes" todir="test_output" haltonfailure="no" name="${testname}"/>
- </junit>
- </target>
-
- <!-- target name="report">
- <mkdir dir="test_output"/>
- <junitreport todir="test_output">
- <fileset dir="test_output">
- <include name="TEST-*.xml"/>
- </fileset>
- <report format="frames" todir="test_output/report"/>
- </junitreport>
- </target -->
-
- <target name="jar" depends="compile" description="Build the distribution .jar file">
- <mkdir dir="${classes.dir}/META-INF"/>
- <manifest file="${classes.dir}/META-INF/MANIFEST.MF">
- <attribute name="Product" value="${Name}"/>
- <attribute name="Version" value="${version}"/>
- </manifest>
- <antcall target="common-build.jar"/>
- </target>
-
- <!-- target name="javadoc" description="Compile the Javadoc API documentation to dist dir">
- <echo>Skipping java doc since ant's javadoc task cannot handle an alternative javadoc</echo>
- </target -->
-
- <target name="jpa-javadoc" if="jpa-present">
- <mkdir dir="${jpa-javadoc.dir}"/>
- <ant dir="../jpa-api" target="javadoc" inheritAll="false"/>
- <copy todir="${jpa-javadoc.dir}">
- <fileset dir="${basedir}/../jpa-api/build/api">
- <include name="**/*.*"/>
- </fileset>
- </copy>
- </target>
-
- <!-- Some of this can probably be moved to common-build... -->
- <target name="dist" depends="jar,javadoc,jpa-javadoc,copysource,copytest,copylib,extras"
- description="Build everything">
-
- <ant inheritall="false" dir="${basedir}/doc/reference"/>
- <copy todir="${dist.dir}/doc/reference" failonerror="false">
- <fileset dir="${basedir}/doc/reference/build">
- <include name="**/*.*"/>
- </fileset>
- </copy>
-
- <copy todir="${dist.dir}" failonerror="false">
- <fileset dir="${common.dir}">
- <include name="common-build.xml"/>
- </fileset>
- </copy>
-
- <!-- copy dependencies -->
- <copy todir="${dist.lib.dir}" failonerror="false">
- <fileset file="${jpa-api.jar}"/>
- <fileset file="${commons-annotations.jar}"/>
- </copy>
- <mkdir dir="${dist.lib.dir}/test"/>
- <copy todir="${dist.lib.dir}/test" failonerror="false">
- <fileset file="${validator.jar}"/>
- </copy>
-
- <copy file="${basedir}/build.properties.dist" tofile="${dist.dir}/build.properties" failonerror="false">
- </copy>
- <antcall target="common-build.dist"/>
- </target>
-
- <target name="zip-dist" description="zip the dist">
- <zip zipfile="${dist.dir}-${version}.zip">
- <zipfileset prefix="${name}-${version}" dir="${dist.dir}"/>
- </zip>
- <tar compression="gzip" tarfile="${dist.dir}-${version}.tar.gz">
- <tarfileset prefix="${name}-${version}" dir="${dist.dir}"/>
- </tar>
- </target>
-
-
-</project>
Copied: trunk/HibernateExt/annotations/build.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/build.xml)
===================================================================
--- trunk/HibernateExt/annotations/build.xml (rev 0)
+++ trunk/HibernateExt/annotations/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,244 @@
+<!--
+
+ Hibernate Annotations ANT build script.
+
+ You need JDK 5.0 installed to build Hibernate Annotations.
+
+-->
+
+<project name="Hibernate Annotations" default="dist" basedir=".">
+
+ <!-- Give user a chance to override without editing this file
+ (and without typing -D each time it compiles it) -->
+ <property file="build.properties"/>
+ <property file="${user.home}/.ant.properties"/>
+
+ <!-- Name of project and version, used to create filenames -->
+ <property name="Name" value="Hibernate Annotations"/>
+ <property name="name" value="hibernate-annotations"/>
+ <property name="version" value="3.2.2.GA"/>
+ <property name="javadoc.packagenames" value="org.hibernate.*"/>
+ <property name="jdbc.dir" value="jdbc"/>
+ <property name="copy.test" value="true"/>
+ <property name="javac.source" value="1.5"/>
+ <property name="javac.target" value="1.5"/>
+ <property name="common.dir" value="../common"/>
+
+ <property name="jpa-api.jar" value="${basedir}/../jpa-api/build/ejb3-persistence.jar"/>
+ <property name="validator.jar"
+ value="${basedir}/../validator/target/hibernate-validator/hibernate-validator.jar"/>
+ <property name="commons-annotations.jar"
+ value="${basedir}/../commons-annotations/target/hibernate-commons-annotations/hibernate-commons-annotations.jar"/>
+
+
+ <available property="jpa-present" file="${basedir}/../jpa-api" type="dir"/>
+ <import file="${common.dir}/common-build.xml"/>
+ <property name="jpa-javadoc.dir" value="${dist.doc.dir}/jpa-api"/>
+
+ <path id="lib.moduleclass.path">
+ <pathelement location="${jpa-api.jar}"/>
+ <pathelement location="${commons-annotations.jar}"/>
+ </path>
+
+ <path id="junit.moduleclasspath">
+ <pathelement location="${src.dir}"/>
+ <pathelement location="${test.dir}"/>
+ <pathelement location="${validator.jar}"/>
+ <pathelement location="lib/testlibs/org.eclipse.jdt.core_3.1.0.jar"/>
+ <fileset dir="${jdbc.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.zip"/>
+ </fileset>
+ </path>
+
+ <target name="init">
+ <antcall target="common-build.init"/>
+ <available file="${jpa-api.jar}" type="file" property="jpa-api.jar.available"/>
+ <available file="${commons-annotations.jar}" type="file" property="commons-annotations.jar.available"/>
+ <available file="${validator.jar}" type="file" property="validator.jar.available"/>
+ <mkdir dir="${lib.dir}/test"/>
+ </target>
+
+ <target name="get.jpa-api" depends="init" unless="jpa-api.jar.available">
+ <ant inheritall="false" dir="${basedir}/../jpa-api" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../jpa-api" target="jar"/>
+ </target>
+
+ <target name="get.commons-annotations" depends="init" unless="commons-annotations.jar.available">
+ <ant inheritall="false" dir="${basedir}/../commons-annotations" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../commons-annotations" target="jar"/>
+ </target>
+
+ <target name="get.validator" depends="init" unless="validator.jar.available">
+ <ant inheritall="false" dir="${basedir}/../validator" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../validator" target="jar"/>
+ </target>
+
+ <target name="compile" depends="init,get.jpa-api,get.commons-annotations"
+ description="Compile the Java source code">
+ <available
+ classname="org.eclipse.core.launcher.Main"
+ property="build.compiler"
+ value="org.eclipse.jdt.core.JDTCompilerAdapter"
+ classpath="${java.class.path}"/>
+ <javac
+ srcdir="${src.dir}"
+ destdir="${classes.dir}"
+ classpathref="lib.class.path"
+ debug="${javac.debug}"
+ optimize="${javac.optimize}"
+ nowarn="on"
+ source="${javac.source}"
+ target="${javac.target}">
+ <src path="${src.dir}"/>
+ </javac>
+ <copy todir="${classes.dir}">
+ <fileset dir="${src.dir}">
+ <include name="**/resources/*.properties"/>
+ <include name="**/*.xsd"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="compiletest" depends="compile,get.validator" description="Compile the tests">
+ <available
+ classname="org.eclipse.core.launcher.Main"
+ property="build.compiler"
+ value="org.eclipse.jdt.core.JDTCompilerAdapter"
+ classpath="${java.class.path}"/>
+ <javac
+ destdir="${testclasses.dir}"
+ classpathref="junit.classpath"
+ debug="${javac.debug}"
+ optimize="${javac.optimize}"
+ nowarn="on"
+ source="${javac.source}"
+ target="${javac.target}">
+ <src refid="testsrc.path"/>
+ </javac>
+ </target>
+
+
+ <!-- target name="junit" depends="compiletest">
+ <mkdir dir="test_output"/>
+ <junit fork="yes" printsummary="yes" haltonfailure="yes"
+ forkmode="perBatch">
+ <classpath>
+ <fileset dir="${jdbc.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.zip"/>
+ </fileset>
+ <path refid="lib.class.path"/>
+ <pathelement path="${classes.dir}"/>
+ <pathelement path="${src.dir}"/>
+ <pathelement path="${test.dir}"/>
+ </classpath>
+ <formatter type="plain"/>
+ <formatter type="xml"/>
+ <batchtest fork="yes" todir="test_output" haltonfailure="no">
+ <fileset dir="${classes.dir}">
+ <include name="**/*Test.class"/>
+ </fileset>
+ </batchtest>
+ </junit>
+ </target -->
+
+ <!-- Run a single unit test. -->
+ <target name="junitsingle" depends="compiletest"
+ description="Run a single test suite (requires testname and jdbc.driver properties)">
+ <mkdir dir="test_output"/>
+ <junit printsummary="yes" fork="yes" haltonfailure="yes">
+ <classpath>
+ <fileset dir="${jdbc.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.zip"/>
+ </fileset>
+ <path refid="lib.class.path"/>
+ <pathelement path="${classes.dir}"/>
+ <pathelement path="${src.dir}"/>
+ <!-- pick up properties from here -->
+ <pathelement path="${test.dir}"/>
+ <!-- pick up mappings from here -->
+ </classpath>
+ <formatter type="plain"/>
+ <formatter type="xml"/>
+ <test fork="yes" todir="test_output" haltonfailure="no" name="${testname}"/>
+ </junit>
+ </target>
+
+ <!-- target name="report">
+ <mkdir dir="test_output"/>
+ <junitreport todir="test_output">
+ <fileset dir="test_output">
+ <include name="TEST-*.xml"/>
+ </fileset>
+ <report format="frames" todir="test_output/report"/>
+ </junitreport>
+ </target -->
+
+ <target name="jar" depends="compile" description="Build the distribution .jar file">
+ <mkdir dir="${classes.dir}/META-INF"/>
+ <manifest file="${classes.dir}/META-INF/MANIFEST.MF">
+ <attribute name="Product" value="${Name}"/>
+ <attribute name="Version" value="${version}"/>
+ </manifest>
+ <antcall target="common-build.jar"/>
+ </target>
+
+ <!-- target name="javadoc" description="Compile the Javadoc API documentation to dist dir">
+ <echo>Skipping java doc since ant's javadoc task cannot handle an alternative javadoc</echo>
+ </target -->
+
+ <target name="jpa-javadoc" if="jpa-present">
+ <mkdir dir="${jpa-javadoc.dir}"/>
+ <ant dir="../jpa-api" target="javadoc" inheritAll="false"/>
+ <copy todir="${jpa-javadoc.dir}">
+ <fileset dir="${basedir}/../jpa-api/build/api">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <!-- Some of this can probably be moved to common-build... -->
+ <target name="dist" depends="jar,javadoc,jpa-javadoc,copysource,copytest,copylib,extras"
+ description="Build everything">
+
+ <ant inheritall="false" dir="${basedir}/doc/reference"/>
+ <copy todir="${dist.dir}/doc/reference" failonerror="false">
+ <fileset dir="${basedir}/doc/reference/build">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+
+ <copy todir="${dist.dir}" failonerror="false">
+ <fileset dir="${common.dir}">
+ <include name="common-build.xml"/>
+ </fileset>
+ </copy>
+
+ <!-- copy dependencies -->
+ <copy todir="${dist.lib.dir}" failonerror="false">
+ <fileset file="${jpa-api.jar}"/>
+ <fileset file="${commons-annotations.jar}"/>
+ </copy>
+ <mkdir dir="${dist.lib.dir}/test"/>
+ <copy todir="${dist.lib.dir}/test" failonerror="false">
+ <fileset file="${validator.jar}"/>
+ </copy>
+
+ <copy file="${basedir}/build.properties.dist" tofile="${dist.dir}/build.properties" failonerror="false">
+ </copy>
+ <antcall target="common-build.dist"/>
+ </target>
+
+ <target name="zip-dist" description="zip the dist">
+ <zip zipfile="${dist.dir}-${version}.zip">
+ <zipfileset prefix="${name}-${version}" dir="${dist.dir}"/>
+ </zip>
+ <tar compression="gzip" tarfile="${dist.dir}-${version}.tar.gz">
+ <tarfileset prefix="${name}-${version}" dir="${dist.dir}"/>
+ </tar>
+ </target>
+
+
+</project>
Deleted: trunk/HibernateExt/annotations/changelog.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/changelog.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/changelog.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,552 +0,0 @@
-Hibernate Annotations Changelog
-===============================
-
-3.2.1.GA (8-12-2006)
---------------------
-
-** Bug
- * [ANN-395] - @Embedded can not map interface
- * [ANN-425] - Property not found when defined in a @IdClass and referenced by a @OneToMany
- * [ANN-430] - @ManyToOne results in default outer join eager fetch, should be lazy
- * [ANN-448] - @OrderBy does not work with an association table when Set is used for collection
- * [ANN-450] - @MapKey does not work with embedded fields
- * [ANN-452] - Check lucene behavior on rollback()
- * [ANN-458] - Hibernate Validator initialization always requires keys in ValidatorMessges.properties
- * [ANN-466] - Discriminator values longer than 31 break in PostgreSQL
- * [ANN-471] - lazily resolve default messages in DefaultMessageInterpolator
- * [ANN-473] - Unable to define unique constraints on a denormalized table (union-subclass)
- * [ANN-474] - <sequence-generator> and <table-generator> at the entity level can override those at the property level in JPA XML
- * [ANN-477] - @Formula doesn't work in entities referenced by @JoinColumn(referencedColumnName="...")
- * [ANN-491] - Collection mapped with javax.persistence.MapKey isn't loaded properly.
- * [ANN-499] - @IdClass and @ManyToOne leads to repeated column exception
-
-
-** Improvement
- * [ANN-37] - Support for SQL Overriding (László Benke, Assaf Berg)
- * [ANN-387] - lucene integration does not support Inheritance
- * [ANN-422] - Add targetEntity to MapKeyManyToMany annotation
- * [ANN-449] - @Min, @Max store value as Integer. @Range stores values as Long.
- * [ANN-456] - ClassValidator sould be able to get a reflectionManager from the caller (ie the event listener)
- * [ANN-460] - Support for several entity types per Index
- * [ANN-468] - IdFieldBridge should be introduced to cope with additional constraints on Brigdes used by document ids
- * [ANN-475] - Make ClassValidator independent from javax.persistence annotations
- * [ANN-476] - EJB3 naming strategy struggles with quoted identifiers when generating composed table/column names
- * [ANN-497] - Reuse the same synchronization queue per transaction for Search operations
-
-** New Feature
- * [ANN-363] - Support for a @FieldBridge
- * [ANN-364] - @Boost or equivalent on entity and on fields
- * [ANN-383] - Align with Lucene 2 APIs for annotations
- * [ANN-384] - Reindex an object on a per instance basis (not triggered by a change)
- * [ANN-454] - Support for Built-in bridges in Lucene
- * [ANN-455] - Comprehensive built-in type support
- * [ANN-457] - Support field annotations in Hibernate Lucene (Richard Hallier)
- * [ANN-463] - @DateBridge
- * [ANN-478] - French translation (Vincent Ricard)
- * [ANN-482] - Use of transaction Synchronization rather than post-commit-* events
- * [ANN-493] - @NonEmpty
-
-** Patch
- * [ANN-445] - Add dutch (Nederlands) validator_nl.properties for hibernate validator
- * [ANN-465] - SingleTableTest.testDefaultDiscriminatorColumn fix
- * [ANN-498] - Add Spanish Validation Bundle
- * [ANN-500] - Swedish default messages
-
-** Task
- * [ANN-479] - Various optimizations of the Xlayer (reflection layer)
- * [ANN-483] - reorganize lucene packaging
- * [ANN-488] - Rename org.hibernate.lucene to org.hibernate.search
-
-
-3.2.0.GA (16-10-2006)
----------------------
-Same code base as 3.2.0.CR3
-
-** Task
- * [ANN-459] - Add EJB 3.0 JavaDoc to the distribution
-
-
-3.2.0.CR3 (04-10-2006)
-----------------------
-** Bug
- * [ANN-408] - map a entity to integer map is not possible
-
-
-** Improvement
- * [ANN-346] - Introduce @FilterJoinTable to complete @Filter on association involving a join table
- * [ANN-447] - Introduce @WhereJoinTable to complete @Where on association involving a join table
-
-** New Feature
- * [ANN-443] - Define a hibernate.validator.interpolator_class
-
-
-3.2.0.CR2 (16-09-2006)
-----------------------
-** Bug
- * [ANN-181] - Do not fail on unbound attributes marked as @Type
- * [ANN-243] - @MapKey doesn't properly refer to column name mapped to property (quoted column)
- * [ANN-345] - EJB3NamingStrategy should be Serializable
- * [ANN-359] - @MappedSuperclass overriding fails on EJB3 DD
- * [ANN-362] - Specification of table @Table name with quotes using backticks fails with @OneToMany mapping
- * [ANN-368] - Keywords first letter is not decapilalized
- * [ANN-369] - @CollectionOfElements on a Map uses reserved word "key" as column name
- * [ANN-370] - Lucene updates are not thread safe
- * [ANN-375] - @Email validator failed a valid email address
- * [ANN-379] - Map<Entity, Entity> fails due to unique constraint on map-key column
- * [ANN-382] - Id involving many to one may fail depending on the entity process ordering
- * [ANN-393] - Documentation errors in Many-toMany Annotation explanation
- * [ANN-405] - JPA XML overriding wrong when default schema and *-to-one association
- * [ANN-409] - Enum constants in HQL leads to ClassCastException
- * [ANN-411] - @Generated(INSERT) properties does not update columns
- * [ANN-412] - Generator definition (@Table, @Generic, @Sequence) no longer taken into account at field level
- * [ANN-414] - Map, OneToMany, join table or @ManyToMany does not work on MySQL and on composite keys
- * [ANN-415] - <named-native-query result-class leads to CCE
- * [ANN-416] - Mapping of inheritance with several generic superclasses fails
- * [ANN-421] - Unable to map no packaged classes when JPA XML is used
- * [ANN-423] - @Min/@Max broken with BigInteger/BigDecimal
- * [ANN-424] - column overriding fails on composite elements when defined at the entity level
- * [ANN-426] - Validator keep a JavaXFactory in a static variable creating memleaks on redeployement
- * [ANN-427] - throw "java.lang.IllegalStateException: Property parent has an unbound type and no explicit target entity." on generic type
-
-
-** Improvement
- * [ANN-7] - Document usage of @IndexColumn in one-to-many with indexed collection
- * [ANN-36] - @ForceDiscriminator (Serg Prasolov)
- * [ANN-39] - @CollectionId for idbags
- * [ANN-47] - Allow to set an enum parameter on a query
- * [ANN-261] - Allow specifying foreign key constraint name using annotations (inspired by David Hay)
- * [ANN-265] - Fall back to default validator message if the key is not found
- * [ANN-343] - validator messages in brazilian portuguese
- * [ANN-350] - Support ejb3 dd when no schema locator is defined
- * [ANN-351] - Validator Brazilian translation
- * [ANN-355] - Make XML overriding rules for access type smoother
- * [ANN-356] - Clear the PC on Rollback on RESOURCE_LOCAL Transactions
- * [ANN-371] - Abstract DocumentBuilder from the underlying Directory implementation
- * [ANN-373] - imports are not done for the full entityname
- * [ANN-374] - Map - OneToMany w or w/o join table creates bad sql
- * [ANN-381] - Make possible to specify an @EmbeddedId's field in a @OneToMany's mappedBy property
- * [ANN-397] - Incomplete AnnotationException at org.hibernate.cfg.annotations.TableBinder
- * [ANN-399] - Class validator should not WARN on unbound properties not involved in validation
-
-** New Feature
- * [ANN-284] - @OrderBy clash with @Formula Properties
- * [ANN-349] - Add @FlushModeType.MANUAL
- * [ANN-367] - Upgrade to Lucene 2.0.0 (Sylvain Vieujot)
- * [ANN-372] - @Boost factor on document and fields
- * [ANN-378] - Chinese translation (Xiaogang Cao)
- * [ANN-385] - Abstract the Lucene directory implementation and allow configuration based definition
- * [ANN-386] - Add support for RAMDirectory
- * [ANN-419] - Support SortedMap
- * [ANN-440] - MessageIntrospector hook introduced in HibernateValidator
-
-
-** Task
- * [ANN-410] - Depreciate EJB 3 Package annotations
-
-
-3.2.0.CR1 (13-05-2006)
-----------------------
-** Bug
- * [ANN-95] - Cannot create a unique constraint on columns belonging to both the superclass and the class
- * [ANN-97] - JoinColumn with referencedColumnName clashes with unique=true on target column
- * [ANN-118] - Duplicate unique constraint may be created
- * [ANN-281] - @Mapkey broken if key is Entity
- * [ANN-288] - Hibernate chokes on methods in entities starting with get...() and returning int[]
- * [ANN-289] - @OneToOne and @Column fails
- * [ANN-305] - ImprovedNamingStrategy not compatible with Hibernate annotations (@Index in particular)
- * [ANN-306] - "Unbound" @Transient properties not properly being ignored
- * [ANN-307] - BindHelper.findPropertiesByColumns behaviour is non deterministic due to HashSet being used
- * [ANN-310] - Dist is missing resource files
- * [ANN-329] - Entity.name is ignored in inheritance mapping
- * [ANN-330] - Entity name not used to build default table name (classname is used instead)
- * [ANN-331] - Extra element concatenated to default columns in collection of elements
- * [ANN-333] - CollectionOfElements not using specified JoinTable
- * [ANN-335] - AnnotationBinder just throws NPE if @OneToMany annotation is not on a Collection or Array
- * [ANN-339] - @OrderBy does not work when an association table is involved
- * [ANN-340] - Hard dependency to CGLIB classes in mustBeSkipped()
-
-
-** Improvement
- * [ANN-120] - Map, OneToMany, join table or @ManyToMany does not work
- * [ANN-195] - Potentially move from TableA_TableB to EntityA_EntityB on join tables is the spec remains
- * [ANN-293] - Unidirectional @ManyToMany should throw and error or warning when target entity cannot be resolved
- * [ANN-323] - XML overriding should have precedence over annotations for queries, rs, generators
- * [ANN-325] - entity described in XML should be part of the mapped entities
- * [ANN-327] - Support for Map<Entity,Entity>
- * [ANN-337] - XML result-set-mapping should overrides @SqlResultSetMapping
- * [ANN-338] - @Temporal no longer has default value
-
-** New Feature
- * [ANN-40] - @Parent
- * [ANN-89] - Support generated=true property option for automatic refresh
- * [ANN-158] - Support for @ManyToOne or @OneToOne @JoinTable (bidirectional)
- * [ANN-224] - Ability to override fetching and lazy options through annotations
- * [ANN-276] - Proper support of @OneToOne @PrimaryKeyJoinColumns
-
-
-3.1.0.Beta10b Preview (27-04-2006)
-----------------------------------
-** Bug
- * [ANN-292] - @EmbeddedId object containing only @ManyToOne fails / wrong pk generation when at EmbeddedId contains @ManyToOne
- * [ANN-295] - Generators behave like allocationSize+1
- * [ANN-300] - @OneToOne(optional=false) does not create foreign key
- * [ANN-301] - Validator won't validate "new" (=transient) bean when bean is CGLIB-instrumented
- * [ANN-319] - Make Hibernate Annotations types Serializable and thread safe
- * [ANN-321] - Discriminator column wo @DiscriminatorColumn has the wrong varchar length
- * [ANN-328] - @javax.persistence.MapKey broken
-
-
-** Improvement
- * [ANN-316] - Do not escape el expressions like #{foo} expressions in Validation messages
-
-** New Feature
- * [ANN-1] - Support Map
- * [ANN-296] - Support for allocationSize in @SequenceGenerator
- * [ANN-304] - Display the version number at init time to avoid user confusion regarding the version used
- * [ANN-322] - Allow EJB3 style XML Overriding
-
-
-3.1beta9 Preview (27-03-2006)
------------------------------
-** Bug
- * [ANN-16] - Annotations: composite pk with two manytoone not working
- * [ANN-98] - Wrong unsaved-value strategy for IdClass entities
- * [ANN-196] - sequence should increase by assocationSize rather than regular hilo
- * [ANN-197] - table generator should stock hi * low_max instead of hi
- * [ANN-211] - ClassValidator throws NPE during flush
- * [ANN-230] - Id Annotation - bad example of GeneratedValue
- * [ANN-234] - @NotNull syntax doesn't make join column null in conjunction with @OneToOne or @ManyToOne
- * [ANN-236] - @OneToMany(mappedBy) cannot referenced an hbm file described entity
- * [ANN-240] - @AttributeOverride only works in @Entity, not @MappedSuperclass
- * [ANN-241] - @Index broken on property when no columnName is defined
- * [ANN-253] - Do not raise unresolved type exception if targetEntity is defined on the association annotation
- * [ANN-254] - References to invalid CascadeType.CREATE in documentation
- * [ANN-255] - Validator problem with @Valid @Embedded objects
- * [ANN-256] - Incorrect classloader used for ResourceBundle loading in JavaEE environment
- * [ANN-257] - referencedColumnName is not recognized on a many-to-one to a composite primary key
- * [ANN-258] - OneToOne annotation: Hibernate is not respecting the optional=true behaviour
- * [ANN-266] - @Temporal on Calendar is not mapped properly
- * [ANN-269] - doc error in example validation annotation
- * [ANN-274] - @AttributeOverride ignored when defined on an @Entity having a @MappedSuperclass annotated with @IdClass
- * [ANN-280] - Index not work
- * [ANN-282] - @IdClass including @Id claims no identifier property rather than @Id not authorized
-
-
-** Improvement
- * [ANN-146] - @NotNull should be ignored for SINGLE_TABLE subclass properties
- * [ANN-208] - Enable @Valid for Collections, Maps and Arrays
- * [ANN-223] - Entity name should be the default for discriminator value (not the fqcn)
- * [ANN-233] - @Email not documented
- * [ANN-245] - Better doc on MapKey explaining that the column is shared between the key and the referenced property
- * [ANN-262] - @org.hibernate.annotatios.Table.name remaned in @...Table.appliesTo
- * [ANN-271] - Change @EntityResult(Class entityClass) ( was @EntityResult(String name) )
- * [ANN-272] - Remove TYPE @Target on @JoinColumn(s)
- * [ANN-275] - Default discriminator column is DTYPE rather than TYPE
- * [ANN-291] - addUnderscore changed to protected visibility in DefaultComponentSafeNamingStrategy as an extension point
-
-** New Feature
- * [ANN-15] - Use of @ManyToOne in a @EmbeddedId
- * [ANN-226] - Allow Associations within an @Embeddable Class
- * [ANN-259] - @OnDelete for @OneToOne and @ManyToOne (Radim Tlusty, Mat?j Kraus)
- * [ANN-270] - Add @SqlResultSetMappings
- * [ANN-273] - @AssociationOverride(s) similar to @AttributeOverride(s)
- * [ANN-287] - Abstraction layer on top of reflection calls (Paolo Perrotta, Davide Marchignoli)
-
-
-** Task
- * [ANN-228] - Get rid of the compliance and limitation section in the doc.
- * [ANN-239] - DefaultValidatorMessages_de.properties: translation errors
-
-
-3.1beta8 Preview (20-01-2006)
------------------------------
-** Bug
- * [ANN-132] - transient fields are considered to be persistent when not annotated with @Transient
- * [ANN-162] - OneToMany mapping from annotated to hbm loaded class fails with infinite loop
- * [ANN-175] - extractType executed on @Transient and fail when the return type is <T extends MembershipData> T
- * [ANN-176] - Endless loop when annotated class references by ManyToOne class mapped in .hbm.xml
- * [ANN-177] - unable to use referencedColumnName = joined subclass primary column name
- * [ANN-178] - Different handling column naming with @JoinColumn between 3.1beta5 and 3.1beta7
- * [ANN-180] - Indexed collection, field access, onetomany+mappedby seems to fail
- * [ANN-187] - Unable to referenceColumnName a column (property) of the super class
- * [ANN-193] - @IdClass should work on @MappedSuperclass
- * [ANN-199] - NPE when mappedBy property is wrong on a @OneToOne
- * [ANN-214] - Annotation website documentation syntax error
-
-** New Feature
- * [ANN-147] - Allow embeddable subclasses in the middle of a class hierarchy
- * [ANN-172] - Delegates the SQL type of enum to @Enumerated
- * [ANN-188] - @Email for validator
- * [ANN-190] - @TableGenerator as per the pfd instead of @GeneratorIdTable & co
- * [ANN-191] - Non entity classes in between entity classes in the hierarchy
- * [ANN-200] - Support of @Basic, @Lob, @Enumerated, @Temporal as per the PFD
- * [ANN-209] - @Named(Native)Query(hints=...)
-
-
-** Improvement
- * [ANN-17] - Support dotted annotation when declaring resultsets
- * [ANN-56] - @AccessType: Support mixed field/property access strategies for an Entity
- * [ANN-192] - Access type guessed from position of @Id or @EmbeddedId
- * [ANN-194] - Access type guessed from owner entity for Embeddable objects
- * [ANN-198] - Better error message when @ManyToOne references an unknown entity
- * [ANN-201] - Rename @EmbeddableSuperclass into @MappedSuperclass
- * [ANN-203] - Move to @Id @GeneratedValue(strategy=AUTO, generator="blah")
- * [ANN-204] - @TableGenerator instead of @TableGenerator and @GeneratedIdTable
- * [ANN-205] - @NamedQuery(query=...) instead of @NamedQuery(queryString=...) same for @NamedNativeQuery
- * [ANN-215] - Support SqlResutSetMapping with dotted notation in arbitrary order
- * [ANN-216] - Support scalar queries through @ColumnResult
- * [ANN-218] - @SecondaryTable(PrimaryKeyJoinColumn[] pkJoinColumns) instead of @SecondaryTable(JoinColumn[] joins() )
- * [ANN-219] - @JoinTable(name, catalog, schema, uniqueConstraints) instead of @JoinTable(table=@Table())
- * [ANN-220] - @Column(table=) and @JoinColumn(table=) instead of @Column(secondaryTable=)
- * [ANN-221] - @Inheritance(strategy), @DiscriminatorColumn(discriminatorType), @DiscriminatorValue instead of @Inheritance
- * [ANN-225] - @EntityListeners replace @EntityListener
-
-
-3.1beta7 Preview (13-12-2005)
------------------------------
-
-** Bug
- * [ANN-114] - NPE when SecondaryTable uses a non pk reference column in @JoinColumn
- * [ANN-115] - @Index does not work on joincolumns
- * [ANN-117] - setOrphanDelete not set causing some delete-orphan .clear() to fail
- * [ANN-123] - Support for Generics superclass
- * [ANN-124] - FIELD constant thing is wrong in the doc
- * [ANN-133] - Bytecode enhancement process adds non-transient properties to beans
- * [ANN-135] - Inconsistent range check between Range Validator class and generated DDL.
- * [ANN-136] - Validator annotations not applied to the hibernate metamodel for id properties
- * [ANN-139] - SINGLE_TABLE inheritance raise an WrongClassException under certain circumstances
- * [ANN-142] - Automatic Generation of Composite IDs - Annonation declaration fails
- * [ANN-151] - <subclass extends= broken when using AnnotationConfiguration
- * [ANN-152] - Indexes generated by the LuceneEventListener are deleted at startup (Mattias Arbin)
- * [ANN-156] - MapKey Cannot Map @Id when using @IdClass
- * [ANN-165] - @Length(min=4) ie wo max generate a varchar(Integer.MAX_VALUE)
- * [ANN-171] - Class cast exception during processing of non getter generic methods
- * [ANN-173] - ClassValidator.getInvalidValues should not depend on equals() for circularity check
-
-** New Feature
- * [ANN-111] - add function for validating properties before bean creation
- * [ANN-116] - fetch validators from implemented interfaces
- * [ANN-125] - Validator does not preserve method hierarchy in InvalidValue[]
- * [ANN-127] - Add @Future
- * [ANN-128] - Externalize EJB3 namings to NamingStrategy
-
-
-** Improvement
- * [ANN-119] - Embedded international error messages
- * [ANN-121] - Named Queries should be package level visible
- * [ANN-126] - mention usage of columnDefinition as part of @Column in docs
- * [ANN-138] - Support collections of value types with separate annotation
- * [ANN-148] - EnumType should be aware of DababaseMetadata.storesUpperCaseIdentifiers() and co (Tim Fennell)
- * [ANN-149] - Do not check lazy/uninitialized fields in Validator
- * [ANN-153] - Customize the parent directory for indexes generated by LuceneEventListener (Mattias Arbin)
- * [ANN-154] - Customize Analyzer subclass for the LuceneEventListener (Mattias Arbin)
- * [ANN-168] - @FilterDef should support condition
- * [ANN-170] - Keep user order of hbm files (to ease the typedef usage)
-
-
-3.1beta6 Preview (07-10-2005)
------------------------------
- * ANN-105 More exception handling in AnnotationConfiguration
- * ANN-109 @Index does not support join columns references
- * ANN-93 Make Hibernate Validator Serializable Friendly
-
-3.1beta5 Preview (14-09-2005)
------------------------------
- * ANN-70 Lucene integration
- * ANN-13 Support for referencedColumnName referencing non PK columns for @ManyToMany
- * ANN-63 Use metadata.getUserName() when guessing Enum backing type (Scott Haug)
- * ANN-38 Finish the optional=false support
- * ANN-69 Expand the resource bundle message itself in the Validator framework
- * ANN-68 Apply validator on a particular property (Jesus Marin)
- * ANN-41 Allow field validations and validate private method (Chris Wood)
- * ANN-75 Support named (native) query parameters (from Carlos Gonzalez)
- * ANN-73 Use an eager strategy for the second join of a ManyToMany
- * ANN-74 Allow configuration artefacts (hbm, classes) loading precedence
- * ANN-79 Support collection of composite elements
- * ANN-19 Annotations should support collections of primitive and core types
- * ANN-77 Support primitive arrays
- * ANN-20 Support dotted annotation when using overriding (Alexei Akhounov)
- * ANN-55 @Proxy annotation should take proxyClass argument
- * ANN-2 Bidirectional true @OneToOne
- * ANN-80 @NotFound(action=NotFoundAction.IGNORE)
- * ANN-57 @Table ignores unique contraint in association table
- * ANN-3 Support of component inside SecondaryTable
- * ANN-87 @InheritanceJoinColumn rename is incomplete
- * ANN-81 ColumnDefinition not assigned when using @Column and @JoinColumn
- * ANN-34 Second passes binded to HbmBinder.SecondPass
- * NPE on Index and Unique constrains when column name has case inconsistency
- * ANN-86 @Index not used on properties having no @Column
- * ANN-49 Super class of Embeddable not mapped correctly (Alexei Akhounov)
- * ANN-66 Null enums don't store to database correctly
- * ANN-65 Validator ignores components (the DDL still ignores it)
- * ANN-60 NPE when @EmbeddableSuperclass has a superclass @Entity
- * ANN-90 mention usage of @Column together with @Id explicitly
- * ANN-18 Document bean-level validator mecanism
-
-3.1beta4 Preview (04-08-2005)
------------------------------
- * ANN-54 EnumType fails to find the Enum in setParameterValues(Properties)
- * ANN-32 Support index creation
- * ANN-22 Hibernate 3 Annotations should support all Id generators
- * ANN-51 redeclaring id in entity subclass raises ClassCastException
- * ANN-43 @MapKey throw exception if key is id or a component subproperty
- * ANN-52 Exception when @OrderBy contains the id property or a component subproperty
- * ANN-13 Support for referencedColumnName referencing non PK columns for @ManyToOne, @OneToOne and @OneToMany
- * ANN-46 Raise a warning on @Filter on subclasses
- * ANN-48 @UniqueConstraint reorders columns (Chris Wood)
- * ANN-6 enum did not worked for enums persisted in string based columns (MySql and Oracle)
- * ANN-8 array of primitive no longer create a non null column
- * ANN-45 Proper support for @Basic byte[]
- * ANN-44 Don't mandate to list embedded superclasses
- * ANN-42 Don't mandate resultset to be defined before named native queries
- * ANN-11 More robust support for enum persistence (wider range of SQL types)
- * HBX-307 Remove @Serialized and support @Lob tagging of a serializable type
-
-3.1beta3 Preview (24-06-2005)
------------------------------
- * Rename @AssociationTable to @JoinTable
- * HBX-213 support of @IdClass
- * change targetEntity from String to Class
- * HBX-305 Support Java5 Enums
- * Add @Basic(optional=false) and Lob(optional=false)
- * HBX-284 AnnotationOverride in inheritance in conjunction with @EmbeddedSuperclass
- * HBX-304 @AttributeOverride instead of @Embedded(override=@AttributeOverride) or @EmbeddedId(...)
- * HBX-290 All collection binder exception now show the collection role
- * HBX-299 Fix test suite error on MySql
- * HBX-302 @MapKey(name="propertyName") to map a map using a property of the associated class as a map key
- * HBX-201 @Formula on properties or fields.
- * Support @EntityResult(discriminatorColumn)
- * Relax List usage as per the spec (non indexed list are defaulted to bag semantic)
- * HBX-300 enable HQL order by fragment using @javax.persistence.OrderBy
- * HBX-298 FKs on association tables are forced not null
- * HBX-297 Primitive types creates a non null constrained column if defaulted and not SINGLE_TABLE (HBX-301)
- * HBX-287 @DiscriminatorFormula
- * HBX-205 @OnDelete(action=OnDeleteAction.CASCADE) for joined subclasses and collections
- * Change @OneToOne(usePkasFk=true) into @PrimaryKeyJoinColumn
- * Rename @InheritanceJoinColumn/@InheritanceJoinColumns to @PrimaryKeyJoinColumn/@PrimaryKeyJoinColumns
- * Support @Basic(temporalType=...)
- * HBX-282 protect @ManyToMany from abusive not joined filters
- * Align with @NamedNativeQuery/@NamedNativeQueries
- * HBX-283 Better getter resolution
- * HBX-75 Implicit inheritance join columns declaration in composite PK
- * HBX-54 Explicit exception when @Id is missing
- * HBX-210 Fix NPE when the @Id was on the superclass of the root entity in conjonction with @OneToOne use
- * HBX-280/HBX-157 Support @EmbeddabledSuperclass
-
-3.0beta2 Preview (27-05-2005)
------------------------------
- * HBX-87 fetching method is now used even when loading through a query
- * Add the validate framework and bind it to the annotation binder.
- * HBX-199 Support @Columns and thus multi-column properties (ie composite user types)
- * HBX-206 Support @OrderBy and @Sort
- * HBX-203/HBX-81 Support Hibernate cascade strategies through @Cascade (Pablo Nussembaum)
- * HBX-47 Persist is cascaded on flush operation when using the EJB3 event listeners
- * HBX-125 Support for named native SQL queries (not Scalar results)
- * HBX-225 @Type annotation now work for @Id and @Version (Pablo Nussembaum, Emmanuel Bernard)
- * HBX-248 TABLE_PER_CLASS no longer limited to leaf entities and use union-subclass as its strategy
- * HBX-186 inheritance strategy no longer have to be defined on every entity (only on root entry)
- * HBX-53 Annotated classes can be defined in any arbitrary order
- * Support Array through @IndexColumn (Anthony Patricio)
- * HBX-216 Ignore static fields and properties
- * HBX-229/HBX-134 Filter javac generated methods that compensate type erasure aka bridge method (Rogério Gatto)
- * HBX-184 Support List mappings through @IndexColumn (Matthiew Inger, Emmanuel Bernard)
- * HBX-187 Move to a CollectionBinder structure (Matthiew Inger, Emmanuel Bernard)
- * Fix of CascadeType.REMOVE
-
-3.0beta1 Preview (07-04-2005) based on the EJB3 Early Draft 2
--------------------------------------------------------------
- * support parameters in @Type (HBX-197)
- * support @TypeDef at package and class level
- * HBX-166 support @Lob for Character[],char[], String, byte[] and Byte[] (experimental)
- * HBX-159/HBX-140 add @Filter(s) and @FilterDef(s) (Matthew Inger, Magnus Sandberg)
- * HBX-44 @OneToOne support composite PK
- * @OneToOne is supported except for true bidirectional @OneToOne
- * Add @Cache annotation: allow to define caching on root entities and on collections (,eg @Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL, region="specificCacheRegion") )
- * Support @OneToMany default (ie using an association table)
- * HBX-164 insertable/updatable of @JoinColumn now work in @ManyToOne processing (Mario Ivankovits, Emmanuel Bernard)
- * HBX-153 @Id(generate=GeneratorType.AUTO, generator="my_potential_sequence") now work (Pablo Nussembaum)
- * Support @ManyToMany wo @AssociationTable (ie defaults)
- * Support @ManyToMany(mappedBy)
- * Support @OneToMany(mappedBy) (no JoinColumn needed on the @OneToMany side)
- * Appropriate default value when no @JoinColumn is defined in a ManyToOne
- * rename @GeneratorTable to @GeneratedIdTable
- * rename CREATE to PERSIST, add REFRESH cascade style
- * support Mapping Defaults for Non-Relationship Fields or Properties algorithm as defined in the EJB3 spec
- * support @Serialized
- * support @Lob for java.sql.Clob and java.sql.Blob
- * allow embedded object declaration wo @Embeddable (if @Embedded or @EmbeddedId is present in the property)
- * support for @EmbeddedId
- * rename DependentAttribute to AttributeOverride, Dependent to Embedded and DependentObject to Embeddable
- * support @ManyToOne in embedded objects
- * support for @NamedQuery and @NamedQueries (EJBQL)
- * move javax.ejb.* into javax.persistence.* and update copyright header
-
-3.0alpha3 (28-02-2005)
-----------------------
-* HBX-116 Support for Where clause in classes and collections @Where(clause="")
-* HBX-115 Support for class proxying configuration: @Proxy(lazy=false, proxyClassName="my.Interface")
-* HBX-88 Support for hibernate type abstraction through @Type (only on basic properties for now)
-* HBX-108 Support @BatchSize(size=n) for entities and collections
-* HBX-107 implements @org.hibernate.annotations.Entity
-* HBX-103 handle abstract classes
-* HBX-83 precision & scale support for column (Bogdan Ghidireac)
-
-3.0alpha2 (25-01-2005)
-----------------------
-* HBX-61 Support for @UniqueConstraint (except primaryKey=true)
-* HBX-60 Support for a proper @TableGenerator (using MultipleHiLoPerTableGenerator)
-* HBX-63 Support @GeneratorTable
-* HBX-68 Add declarative configuration of annotated classes
-* HBX-74 Rollback the HB-1315 fix: dialect no longer have to be set in hibernate.properties
-
-
-Hibernate-annotations-3.0alpha1 based on the EJB3 Early Draft 1 (6.01.2005)
----------------------------------------------------------------------------
-* Support for EJB3 annotations:
- - @Transient
- - @Column (not primaryKey)
- - @JoinColumn (referencedColumnName - only for a reference to a PK, not primaryKey)
- - @Version
- - @Basic
- - @Entity
- - @Table (not uniqueConstraints)
- - @AccessType
- - @Id
- - @CascadeType
- - @FetchType
- - @GeneratorType (NONE, IDENTITY, TABLE, SEQUENCE)
- - @TableGenerator (with scope visibility)
- - @SequenceGenerator (with scope visibility, does not support initialValue() and allocationSize())
- - *not* @GeneratorTable (will have to write a new TableHiloGenerator, but it can wait)
- - @ManyToOne (not optional)
- - @OneToMany (Set and Collection, generics version or not, JoinColumn not guessed)
- - @OneToOne
- but not optional
- no composite PK/FK
- - @ManyToMany
- - @AssociationTable (Has to be on both sides)
- - @Inheritance
- - @InheritanceType (has to be defined on every classes of the hierarchy for JOINED strategy,
- not very clear about the TABLE_PER_CLASS strategy)
- - @DiscriminatorColumn
- - @DiscriminatorType
- - @InheritanceJoinColumn
- - @InheritanceJoinColumns
- this annotation for Composite PK Entities has to be explicit, I do not respect the implicit semantic of the EJB3 spec
- - @SecondaryTable (@OneToMany @JoinColumn(secondaryTable="..." does not work yet due to H3 core issue HHH-36
- - @SecondaryTables
- this annotation for Composite PK Entities has to be explicit, I do not respect the implicit semantic of the EJB3 spec
- - @DependentObject
- - @Dependent
- - @DependentAttribute (only for basic properties as per the spec)
- - @Id in conjunction with @DependentObject (composite primary keys)
- - @JoinColumns in conjunction with @ManytoOne, @OneToMany, @ManytoMany
- - note that the composite FK columns have to be in the same table (no != secondary tables). This is probably a weird case and certainly a not recommanded one.
-
-
-Still missing or incomplete features compared to the EJB3 spec
---------------------------------------------------------------
- - use of referencedColumnName for column other than the PK ones @ManyToMany (HBX-62)
- - Support for a true bidirectional one to one relationship (HBX-177)
- - support for initialValue and allocationSize in @SequenceGenerator (HBX-59)
- - finish support of optional=false (HBX-190)
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/changelog.txt (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/changelog.txt)
===================================================================
--- trunk/HibernateExt/annotations/changelog.txt (rev 0)
+++ trunk/HibernateExt/annotations/changelog.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,552 @@
+Hibernate Annotations Changelog
+===============================
+
+3.2.1.GA (8-12-2006)
+--------------------
+
+** Bug
+ * [ANN-395] - @Embedded can not map interface
+ * [ANN-425] - Property not found when defined in a @IdClass and referenced by a @OneToMany
+ * [ANN-430] - @ManyToOne results in default outer join eager fetch, should be lazy
+ * [ANN-448] - @OrderBy does not work with an association table when Set is used for collection
+ * [ANN-450] - @MapKey does not work with embedded fields
+ * [ANN-452] - Check lucene behavior on rollback()
+ * [ANN-458] - Hibernate Validator initialization always requires keys in ValidatorMessges.properties
+ * [ANN-466] - Discriminator values longer than 31 break in PostgreSQL
+ * [ANN-471] - lazily resolve default messages in DefaultMessageInterpolator
+ * [ANN-473] - Unable to define unique constraints on a denormalized table (union-subclass)
+ * [ANN-474] - <sequence-generator> and <table-generator> at the entity level can override those at the property level in JPA XML
+ * [ANN-477] - @Formula doesn't work in entities referenced by @JoinColumn(referencedColumnName="...")
+ * [ANN-491] - Collection mapped with javax.persistence.MapKey isn't loaded properly.
+ * [ANN-499] - @IdClass and @ManyToOne leads to repeated column exception
+
+
+** Improvement
+ * [ANN-37] - Support for SQL Overriding (László Benke, Assaf Berg)
+ * [ANN-387] - lucene integration does not support Inheritance
+ * [ANN-422] - Add targetEntity to MapKeyManyToMany annotation
+ * [ANN-449] - @Min, @Max store value as Integer. @Range stores values as Long.
+ * [ANN-456] - ClassValidator sould be able to get a reflectionManager from the caller (ie the event listener)
+ * [ANN-460] - Support for several entity types per Index
+ * [ANN-468] - IdFieldBridge should be introduced to cope with additional constraints on Brigdes used by document ids
+ * [ANN-475] - Make ClassValidator independent from javax.persistence annotations
+ * [ANN-476] - EJB3 naming strategy struggles with quoted identifiers when generating composed table/column names
+ * [ANN-497] - Reuse the same synchronization queue per transaction for Search operations
+
+** New Feature
+ * [ANN-363] - Support for a @FieldBridge
+ * [ANN-364] - @Boost or equivalent on entity and on fields
+ * [ANN-383] - Align with Lucene 2 APIs for annotations
+ * [ANN-384] - Reindex an object on a per instance basis (not triggered by a change)
+ * [ANN-454] - Support for Built-in bridges in Lucene
+ * [ANN-455] - Comprehensive built-in type support
+ * [ANN-457] - Support field annotations in Hibernate Lucene (Richard Hallier)
+ * [ANN-463] - @DateBridge
+ * [ANN-478] - French translation (Vincent Ricard)
+ * [ANN-482] - Use of transaction Synchronization rather than post-commit-* events
+ * [ANN-493] - @NonEmpty
+
+** Patch
+ * [ANN-445] - Add dutch (Nederlands) validator_nl.properties for hibernate validator
+ * [ANN-465] - SingleTableTest.testDefaultDiscriminatorColumn fix
+ * [ANN-498] - Add Spanish Validation Bundle
+ * [ANN-500] - Swedish default messages
+
+** Task
+ * [ANN-479] - Various optimizations of the Xlayer (reflection layer)
+ * [ANN-483] - reorganize lucene packaging
+ * [ANN-488] - Rename org.hibernate.lucene to org.hibernate.search
+
+
+3.2.0.GA (16-10-2006)
+---------------------
+Same code base as 3.2.0.CR3
+
+** Task
+ * [ANN-459] - Add EJB 3.0 JavaDoc to the distribution
+
+
+3.2.0.CR3 (04-10-2006)
+----------------------
+** Bug
+ * [ANN-408] - map a entity to integer map is not possible
+
+
+** Improvement
+ * [ANN-346] - Introduce @FilterJoinTable to complete @Filter on association involving a join table
+ * [ANN-447] - Introduce @WhereJoinTable to complete @Where on association involving a join table
+
+** New Feature
+ * [ANN-443] - Define a hibernate.validator.interpolator_class
+
+
+3.2.0.CR2 (16-09-2006)
+----------------------
+** Bug
+ * [ANN-181] - Do not fail on unbound attributes marked as @Type
+ * [ANN-243] - @MapKey doesn't properly refer to column name mapped to property (quoted column)
+ * [ANN-345] - EJB3NamingStrategy should be Serializable
+ * [ANN-359] - @MappedSuperclass overriding fails on EJB3 DD
+ * [ANN-362] - Specification of table @Table name with quotes using backticks fails with @OneToMany mapping
+ * [ANN-368] - Keywords first letter is not decapilalized
+ * [ANN-369] - @CollectionOfElements on a Map uses reserved word "key" as column name
+ * [ANN-370] - Lucene updates are not thread safe
+ * [ANN-375] - @Email validator failed a valid email address
+ * [ANN-379] - Map<Entity, Entity> fails due to unique constraint on map-key column
+ * [ANN-382] - Id involving many to one may fail depending on the entity process ordering
+ * [ANN-393] - Documentation errors in Many-toMany Annotation explanation
+ * [ANN-405] - JPA XML overriding wrong when default schema and *-to-one association
+ * [ANN-409] - Enum constants in HQL leads to ClassCastException
+ * [ANN-411] - @Generated(INSERT) properties does not update columns
+ * [ANN-412] - Generator definition (@Table, @Generic, @Sequence) no longer taken into account at field level
+ * [ANN-414] - Map, OneToMany, join table or @ManyToMany does not work on MySQL and on composite keys
+ * [ANN-415] - <named-native-query result-class leads to CCE
+ * [ANN-416] - Mapping of inheritance with several generic superclasses fails
+ * [ANN-421] - Unable to map no packaged classes when JPA XML is used
+ * [ANN-423] - @Min/@Max broken with BigInteger/BigDecimal
+ * [ANN-424] - column overriding fails on composite elements when defined at the entity level
+ * [ANN-426] - Validator keep a JavaXFactory in a static variable creating memleaks on redeployement
+ * [ANN-427] - throw "java.lang.IllegalStateException: Property parent has an unbound type and no explicit target entity." on generic type
+
+
+** Improvement
+ * [ANN-7] - Document usage of @IndexColumn in one-to-many with indexed collection
+ * [ANN-36] - @ForceDiscriminator (Serg Prasolov)
+ * [ANN-39] - @CollectionId for idbags
+ * [ANN-47] - Allow to set an enum parameter on a query
+ * [ANN-261] - Allow specifying foreign key constraint name using annotations (inspired by David Hay)
+ * [ANN-265] - Fall back to default validator message if the key is not found
+ * [ANN-343] - validator messages in brazilian portuguese
+ * [ANN-350] - Support ejb3 dd when no schema locator is defined
+ * [ANN-351] - Validator Brazilian translation
+ * [ANN-355] - Make XML overriding rules for access type smoother
+ * [ANN-356] - Clear the PC on Rollback on RESOURCE_LOCAL Transactions
+ * [ANN-371] - Abstract DocumentBuilder from the underlying Directory implementation
+ * [ANN-373] - imports are not done for the full entityname
+ * [ANN-374] - Map - OneToMany w or w/o join table creates bad sql
+ * [ANN-381] - Make possible to specify an @EmbeddedId's field in a @OneToMany's mappedBy property
+ * [ANN-397] - Incomplete AnnotationException at org.hibernate.cfg.annotations.TableBinder
+ * [ANN-399] - Class validator should not WARN on unbound properties not involved in validation
+
+** New Feature
+ * [ANN-284] - @OrderBy clash with @Formula Properties
+ * [ANN-349] - Add @FlushModeType.MANUAL
+ * [ANN-367] - Upgrade to Lucene 2.0.0 (Sylvain Vieujot)
+ * [ANN-372] - @Boost factor on document and fields
+ * [ANN-378] - Chinese translation (Xiaogang Cao)
+ * [ANN-385] - Abstract the Lucene directory implementation and allow configuration based definition
+ * [ANN-386] - Add support for RAMDirectory
+ * [ANN-419] - Support SortedMap
+ * [ANN-440] - MessageIntrospector hook introduced in HibernateValidator
+
+
+** Task
+ * [ANN-410] - Depreciate EJB 3 Package annotations
+
+
+3.2.0.CR1 (13-05-2006)
+----------------------
+** Bug
+ * [ANN-95] - Cannot create a unique constraint on columns belonging to both the superclass and the class
+ * [ANN-97] - JoinColumn with referencedColumnName clashes with unique=true on target column
+ * [ANN-118] - Duplicate unique constraint may be created
+ * [ANN-281] - @Mapkey broken if key is Entity
+ * [ANN-288] - Hibernate chokes on methods in entities starting with get...() and returning int[]
+ * [ANN-289] - @OneToOne and @Column fails
+ * [ANN-305] - ImprovedNamingStrategy not compatible with Hibernate annotations (@Index in particular)
+ * [ANN-306] - "Unbound" @Transient properties not properly being ignored
+ * [ANN-307] - BindHelper.findPropertiesByColumns behaviour is non deterministic due to HashSet being used
+ * [ANN-310] - Dist is missing resource files
+ * [ANN-329] - Entity.name is ignored in inheritance mapping
+ * [ANN-330] - Entity name not used to build default table name (classname is used instead)
+ * [ANN-331] - Extra element concatenated to default columns in collection of elements
+ * [ANN-333] - CollectionOfElements not using specified JoinTable
+ * [ANN-335] - AnnotationBinder just throws NPE if @OneToMany annotation is not on a Collection or Array
+ * [ANN-339] - @OrderBy does not work when an association table is involved
+ * [ANN-340] - Hard dependency to CGLIB classes in mustBeSkipped()
+
+
+** Improvement
+ * [ANN-120] - Map, OneToMany, join table or @ManyToMany does not work
+ * [ANN-195] - Potentially move from TableA_TableB to EntityA_EntityB on join tables is the spec remains
+ * [ANN-293] - Unidirectional @ManyToMany should throw and error or warning when target entity cannot be resolved
+ * [ANN-323] - XML overriding should have precedence over annotations for queries, rs, generators
+ * [ANN-325] - entity described in XML should be part of the mapped entities
+ * [ANN-327] - Support for Map<Entity,Entity>
+ * [ANN-337] - XML result-set-mapping should overrides @SqlResultSetMapping
+ * [ANN-338] - @Temporal no longer has default value
+
+** New Feature
+ * [ANN-40] - @Parent
+ * [ANN-89] - Support generated=true property option for automatic refresh
+ * [ANN-158] - Support for @ManyToOne or @OneToOne @JoinTable (bidirectional)
+ * [ANN-224] - Ability to override fetching and lazy options through annotations
+ * [ANN-276] - Proper support of @OneToOne @PrimaryKeyJoinColumns
+
+
+3.1.0.Beta10b Preview (27-04-2006)
+----------------------------------
+** Bug
+ * [ANN-292] - @EmbeddedId object containing only @ManyToOne fails / wrong pk generation when at EmbeddedId contains @ManyToOne
+ * [ANN-295] - Generators behave like allocationSize+1
+ * [ANN-300] - @OneToOne(optional=false) does not create foreign key
+ * [ANN-301] - Validator won't validate "new" (=transient) bean when bean is CGLIB-instrumented
+ * [ANN-319] - Make Hibernate Annotations types Serializable and thread safe
+ * [ANN-321] - Discriminator column wo @DiscriminatorColumn has the wrong varchar length
+ * [ANN-328] - @javax.persistence.MapKey broken
+
+
+** Improvement
+ * [ANN-316] - Do not escape el expressions like #{foo} expressions in Validation messages
+
+** New Feature
+ * [ANN-1] - Support Map
+ * [ANN-296] - Support for allocationSize in @SequenceGenerator
+ * [ANN-304] - Display the version number at init time to avoid user confusion regarding the version used
+ * [ANN-322] - Allow EJB3 style XML Overriding
+
+
+3.1beta9 Preview (27-03-2006)
+-----------------------------
+** Bug
+ * [ANN-16] - Annotations: composite pk with two manytoone not working
+ * [ANN-98] - Wrong unsaved-value strategy for IdClass entities
+ * [ANN-196] - sequence should increase by assocationSize rather than regular hilo
+ * [ANN-197] - table generator should stock hi * low_max instead of hi
+ * [ANN-211] - ClassValidator throws NPE during flush
+ * [ANN-230] - Id Annotation - bad example of GeneratedValue
+ * [ANN-234] - @NotNull syntax doesn't make join column null in conjunction with @OneToOne or @ManyToOne
+ * [ANN-236] - @OneToMany(mappedBy) cannot referenced an hbm file described entity
+ * [ANN-240] - @AttributeOverride only works in @Entity, not @MappedSuperclass
+ * [ANN-241] - @Index broken on property when no columnName is defined
+ * [ANN-253] - Do not raise unresolved type exception if targetEntity is defined on the association annotation
+ * [ANN-254] - References to invalid CascadeType.CREATE in documentation
+ * [ANN-255] - Validator problem with @Valid @Embedded objects
+ * [ANN-256] - Incorrect classloader used for ResourceBundle loading in JavaEE environment
+ * [ANN-257] - referencedColumnName is not recognized on a many-to-one to a composite primary key
+ * [ANN-258] - OneToOne annotation: Hibernate is not respecting the optional=true behaviour
+ * [ANN-266] - @Temporal on Calendar is not mapped properly
+ * [ANN-269] - doc error in example validation annotation
+ * [ANN-274] - @AttributeOverride ignored when defined on an @Entity having a @MappedSuperclass annotated with @IdClass
+ * [ANN-280] - Index not work
+ * [ANN-282] - @IdClass including @Id claims no identifier property rather than @Id not authorized
+
+
+** Improvement
+ * [ANN-146] - @NotNull should be ignored for SINGLE_TABLE subclass properties
+ * [ANN-208] - Enable @Valid for Collections, Maps and Arrays
+ * [ANN-223] - Entity name should be the default for discriminator value (not the fqcn)
+ * [ANN-233] - @Email not documented
+ * [ANN-245] - Better doc on MapKey explaining that the column is shared between the key and the referenced property
+ * [ANN-262] - @org.hibernate.annotatios.Table.name remaned in @...Table.appliesTo
+ * [ANN-271] - Change @EntityResult(Class entityClass) ( was @EntityResult(String name) )
+ * [ANN-272] - Remove TYPE @Target on @JoinColumn(s)
+ * [ANN-275] - Default discriminator column is DTYPE rather than TYPE
+ * [ANN-291] - addUnderscore changed to protected visibility in DefaultComponentSafeNamingStrategy as an extension point
+
+** New Feature
+ * [ANN-15] - Use of @ManyToOne in a @EmbeddedId
+ * [ANN-226] - Allow Associations within an @Embeddable Class
+ * [ANN-259] - @OnDelete for @OneToOne and @ManyToOne (Radim Tlusty, Mat?j Kraus)
+ * [ANN-270] - Add @SqlResultSetMappings
+ * [ANN-273] - @AssociationOverride(s) similar to @AttributeOverride(s)
+ * [ANN-287] - Abstraction layer on top of reflection calls (Paolo Perrotta, Davide Marchignoli)
+
+
+** Task
+ * [ANN-228] - Get rid of the compliance and limitation section in the doc.
+ * [ANN-239] - DefaultValidatorMessages_de.properties: translation errors
+
+
+3.1beta8 Preview (20-01-2006)
+-----------------------------
+** Bug
+ * [ANN-132] - transient fields are considered to be persistent when not annotated with @Transient
+ * [ANN-162] - OneToMany mapping from annotated to hbm loaded class fails with infinite loop
+ * [ANN-175] - extractType executed on @Transient and fail when the return type is <T extends MembershipData> T
+ * [ANN-176] - Endless loop when annotated class references by ManyToOne class mapped in .hbm.xml
+ * [ANN-177] - unable to use referencedColumnName = joined subclass primary column name
+ * [ANN-178] - Different handling column naming with @JoinColumn between 3.1beta5 and 3.1beta7
+ * [ANN-180] - Indexed collection, field access, onetomany+mappedby seems to fail
+ * [ANN-187] - Unable to referenceColumnName a column (property) of the super class
+ * [ANN-193] - @IdClass should work on @MappedSuperclass
+ * [ANN-199] - NPE when mappedBy property is wrong on a @OneToOne
+ * [ANN-214] - Annotation website documentation syntax error
+
+** New Feature
+ * [ANN-147] - Allow embeddable subclasses in the middle of a class hierarchy
+ * [ANN-172] - Delegates the SQL type of enum to @Enumerated
+ * [ANN-188] - @Email for validator
+ * [ANN-190] - @TableGenerator as per the pfd instead of @GeneratorIdTable & co
+ * [ANN-191] - Non entity classes in between entity classes in the hierarchy
+ * [ANN-200] - Support of @Basic, @Lob, @Enumerated, @Temporal as per the PFD
+ * [ANN-209] - @Named(Native)Query(hints=...)
+
+
+** Improvement
+ * [ANN-17] - Support dotted annotation when declaring resultsets
+ * [ANN-56] - @AccessType: Support mixed field/property access strategies for an Entity
+ * [ANN-192] - Access type guessed from position of @Id or @EmbeddedId
+ * [ANN-194] - Access type guessed from owner entity for Embeddable objects
+ * [ANN-198] - Better error message when @ManyToOne references an unknown entity
+ * [ANN-201] - Rename @EmbeddableSuperclass into @MappedSuperclass
+ * [ANN-203] - Move to @Id @GeneratedValue(strategy=AUTO, generator="blah")
+ * [ANN-204] - @TableGenerator instead of @TableGenerator and @GeneratedIdTable
+ * [ANN-205] - @NamedQuery(query=...) instead of @NamedQuery(queryString=...) same for @NamedNativeQuery
+ * [ANN-215] - Support SqlResutSetMapping with dotted notation in arbitrary order
+ * [ANN-216] - Support scalar queries through @ColumnResult
+ * [ANN-218] - @SecondaryTable(PrimaryKeyJoinColumn[] pkJoinColumns) instead of @SecondaryTable(JoinColumn[] joins() )
+ * [ANN-219] - @JoinTable(name, catalog, schema, uniqueConstraints) instead of @JoinTable(table=@Table())
+ * [ANN-220] - @Column(table=) and @JoinColumn(table=) instead of @Column(secondaryTable=)
+ * [ANN-221] - @Inheritance(strategy), @DiscriminatorColumn(discriminatorType), @DiscriminatorValue instead of @Inheritance
+ * [ANN-225] - @EntityListeners replace @EntityListener
+
+
+3.1beta7 Preview (13-12-2005)
+-----------------------------
+
+** Bug
+ * [ANN-114] - NPE when SecondaryTable uses a non pk reference column in @JoinColumn
+ * [ANN-115] - @Index does not work on joincolumns
+ * [ANN-117] - setOrphanDelete not set causing some delete-orphan .clear() to fail
+ * [ANN-123] - Support for Generics superclass
+ * [ANN-124] - FIELD constant thing is wrong in the doc
+ * [ANN-133] - Bytecode enhancement process adds non-transient properties to beans
+ * [ANN-135] - Inconsistent range check between Range Validator class and generated DDL.
+ * [ANN-136] - Validator annotations not applied to the hibernate metamodel for id properties
+ * [ANN-139] - SINGLE_TABLE inheritance raise an WrongClassException under certain circumstances
+ * [ANN-142] - Automatic Generation of Composite IDs - Annonation declaration fails
+ * [ANN-151] - <subclass extends= broken when using AnnotationConfiguration
+ * [ANN-152] - Indexes generated by the LuceneEventListener are deleted at startup (Mattias Arbin)
+ * [ANN-156] - MapKey Cannot Map @Id when using @IdClass
+ * [ANN-165] - @Length(min=4) ie wo max generate a varchar(Integer.MAX_VALUE)
+ * [ANN-171] - Class cast exception during processing of non getter generic methods
+ * [ANN-173] - ClassValidator.getInvalidValues should not depend on equals() for circularity check
+
+** New Feature
+ * [ANN-111] - add function for validating properties before bean creation
+ * [ANN-116] - fetch validators from implemented interfaces
+ * [ANN-125] - Validator does not preserve method hierarchy in InvalidValue[]
+ * [ANN-127] - Add @Future
+ * [ANN-128] - Externalize EJB3 namings to NamingStrategy
+
+
+** Improvement
+ * [ANN-119] - Embedded international error messages
+ * [ANN-121] - Named Queries should be package level visible
+ * [ANN-126] - mention usage of columnDefinition as part of @Column in docs
+ * [ANN-138] - Support collections of value types with separate annotation
+ * [ANN-148] - EnumType should be aware of DababaseMetadata.storesUpperCaseIdentifiers() and co (Tim Fennell)
+ * [ANN-149] - Do not check lazy/uninitialized fields in Validator
+ * [ANN-153] - Customize the parent directory for indexes generated by LuceneEventListener (Mattias Arbin)
+ * [ANN-154] - Customize Analyzer subclass for the LuceneEventListener (Mattias Arbin)
+ * [ANN-168] - @FilterDef should support condition
+ * [ANN-170] - Keep user order of hbm files (to ease the typedef usage)
+
+
+3.1beta6 Preview (07-10-2005)
+-----------------------------
+ * ANN-105 More exception handling in AnnotationConfiguration
+ * ANN-109 @Index does not support join columns references
+ * ANN-93 Make Hibernate Validator Serializable Friendly
+
+3.1beta5 Preview (14-09-2005)
+-----------------------------
+ * ANN-70 Lucene integration
+ * ANN-13 Support for referencedColumnName referencing non PK columns for @ManyToMany
+ * ANN-63 Use metadata.getUserName() when guessing Enum backing type (Scott Haug)
+ * ANN-38 Finish the optional=false support
+ * ANN-69 Expand the resource bundle message itself in the Validator framework
+ * ANN-68 Apply validator on a particular property (Jesus Marin)
+ * ANN-41 Allow field validations and validate private method (Chris Wood)
+ * ANN-75 Support named (native) query parameters (from Carlos Gonzalez)
+ * ANN-73 Use an eager strategy for the second join of a ManyToMany
+ * ANN-74 Allow configuration artefacts (hbm, classes) loading precedence
+ * ANN-79 Support collection of composite elements
+ * ANN-19 Annotations should support collections of primitive and core types
+ * ANN-77 Support primitive arrays
+ * ANN-20 Support dotted annotation when using overriding (Alexei Akhounov)
+ * ANN-55 @Proxy annotation should take proxyClass argument
+ * ANN-2 Bidirectional true @OneToOne
+ * ANN-80 @NotFound(action=NotFoundAction.IGNORE)
+ * ANN-57 @Table ignores unique contraint in association table
+ * ANN-3 Support of component inside SecondaryTable
+ * ANN-87 @InheritanceJoinColumn rename is incomplete
+ * ANN-81 ColumnDefinition not assigned when using @Column and @JoinColumn
+ * ANN-34 Second passes binded to HbmBinder.SecondPass
+ * NPE on Index and Unique constrains when column name has case inconsistency
+ * ANN-86 @Index not used on properties having no @Column
+ * ANN-49 Super class of Embeddable not mapped correctly (Alexei Akhounov)
+ * ANN-66 Null enums don't store to database correctly
+ * ANN-65 Validator ignores components (the DDL still ignores it)
+ * ANN-60 NPE when @EmbeddableSuperclass has a superclass @Entity
+ * ANN-90 mention usage of @Column together with @Id explicitly
+ * ANN-18 Document bean-level validator mecanism
+
+3.1beta4 Preview (04-08-2005)
+-----------------------------
+ * ANN-54 EnumType fails to find the Enum in setParameterValues(Properties)
+ * ANN-32 Support index creation
+ * ANN-22 Hibernate 3 Annotations should support all Id generators
+ * ANN-51 redeclaring id in entity subclass raises ClassCastException
+ * ANN-43 @MapKey throw exception if key is id or a component subproperty
+ * ANN-52 Exception when @OrderBy contains the id property or a component subproperty
+ * ANN-13 Support for referencedColumnName referencing non PK columns for @ManyToOne, @OneToOne and @OneToMany
+ * ANN-46 Raise a warning on @Filter on subclasses
+ * ANN-48 @UniqueConstraint reorders columns (Chris Wood)
+ * ANN-6 enum did not worked for enums persisted in string based columns (MySql and Oracle)
+ * ANN-8 array of primitive no longer create a non null column
+ * ANN-45 Proper support for @Basic byte[]
+ * ANN-44 Don't mandate to list embedded superclasses
+ * ANN-42 Don't mandate resultset to be defined before named native queries
+ * ANN-11 More robust support for enum persistence (wider range of SQL types)
+ * HBX-307 Remove @Serialized and support @Lob tagging of a serializable type
+
+3.1beta3 Preview (24-06-2005)
+-----------------------------
+ * Rename @AssociationTable to @JoinTable
+ * HBX-213 support of @IdClass
+ * change targetEntity from String to Class
+ * HBX-305 Support Java5 Enums
+ * Add @Basic(optional=false) and Lob(optional=false)
+ * HBX-284 AnnotationOverride in inheritance in conjunction with @EmbeddedSuperclass
+ * HBX-304 @AttributeOverride instead of @Embedded(override=@AttributeOverride) or @EmbeddedId(...)
+ * HBX-290 All collection binder exception now show the collection role
+ * HBX-299 Fix test suite error on MySql
+ * HBX-302 @MapKey(name="propertyName") to map a map using a property of the associated class as a map key
+ * HBX-201 @Formula on properties or fields.
+ * Support @EntityResult(discriminatorColumn)
+ * Relax List usage as per the spec (non indexed list are defaulted to bag semantic)
+ * HBX-300 enable HQL order by fragment using @javax.persistence.OrderBy
+ * HBX-298 FKs on association tables are forced not null
+ * HBX-297 Primitive types creates a non null constrained column if defaulted and not SINGLE_TABLE (HBX-301)
+ * HBX-287 @DiscriminatorFormula
+ * HBX-205 @OnDelete(action=OnDeleteAction.CASCADE) for joined subclasses and collections
+ * Change @OneToOne(usePkasFk=true) into @PrimaryKeyJoinColumn
+ * Rename @InheritanceJoinColumn/@InheritanceJoinColumns to @PrimaryKeyJoinColumn/@PrimaryKeyJoinColumns
+ * Support @Basic(temporalType=...)
+ * HBX-282 protect @ManyToMany from abusive not joined filters
+ * Align with @NamedNativeQuery/@NamedNativeQueries
+ * HBX-283 Better getter resolution
+ * HBX-75 Implicit inheritance join columns declaration in composite PK
+ * HBX-54 Explicit exception when @Id is missing
+ * HBX-210 Fix NPE when the @Id was on the superclass of the root entity in conjonction with @OneToOne use
+ * HBX-280/HBX-157 Support @EmbeddabledSuperclass
+
+3.0beta2 Preview (27-05-2005)
+-----------------------------
+ * HBX-87 fetching method is now used even when loading through a query
+ * Add the validate framework and bind it to the annotation binder.
+ * HBX-199 Support @Columns and thus multi-column properties (ie composite user types)
+ * HBX-206 Support @OrderBy and @Sort
+ * HBX-203/HBX-81 Support Hibernate cascade strategies through @Cascade (Pablo Nussembaum)
+ * HBX-47 Persist is cascaded on flush operation when using the EJB3 event listeners
+ * HBX-125 Support for named native SQL queries (not Scalar results)
+ * HBX-225 @Type annotation now work for @Id and @Version (Pablo Nussembaum, Emmanuel Bernard)
+ * HBX-248 TABLE_PER_CLASS no longer limited to leaf entities and use union-subclass as its strategy
+ * HBX-186 inheritance strategy no longer have to be defined on every entity (only on root entry)
+ * HBX-53 Annotated classes can be defined in any arbitrary order
+ * Support Array through @IndexColumn (Anthony Patricio)
+ * HBX-216 Ignore static fields and properties
+ * HBX-229/HBX-134 Filter javac generated methods that compensate type erasure aka bridge method (Rogério Gatto)
+ * HBX-184 Support List mappings through @IndexColumn (Matthiew Inger, Emmanuel Bernard)
+ * HBX-187 Move to a CollectionBinder structure (Matthiew Inger, Emmanuel Bernard)
+ * Fix of CascadeType.REMOVE
+
+3.0beta1 Preview (07-04-2005) based on the EJB3 Early Draft 2
+-------------------------------------------------------------
+ * support parameters in @Type (HBX-197)
+ * support @TypeDef at package and class level
+ * HBX-166 support @Lob for Character[],char[], String, byte[] and Byte[] (experimental)
+ * HBX-159/HBX-140 add @Filter(s) and @FilterDef(s) (Matthew Inger, Magnus Sandberg)
+ * HBX-44 @OneToOne support composite PK
+ * @OneToOne is supported except for true bidirectional @OneToOne
+ * Add @Cache annotation: allow to define caching on root entities and on collections (,eg @Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL, region="specificCacheRegion") )
+ * Support @OneToMany default (ie using an association table)
+ * HBX-164 insertable/updatable of @JoinColumn now work in @ManyToOne processing (Mario Ivankovits, Emmanuel Bernard)
+ * HBX-153 @Id(generate=GeneratorType.AUTO, generator="my_potential_sequence") now work (Pablo Nussembaum)
+ * Support @ManyToMany wo @AssociationTable (ie defaults)
+ * Support @ManyToMany(mappedBy)
+ * Support @OneToMany(mappedBy) (no JoinColumn needed on the @OneToMany side)
+ * Appropriate default value when no @JoinColumn is defined in a ManyToOne
+ * rename @GeneratorTable to @GeneratedIdTable
+ * rename CREATE to PERSIST, add REFRESH cascade style
+ * support Mapping Defaults for Non-Relationship Fields or Properties algorithm as defined in the EJB3 spec
+ * support @Serialized
+ * support @Lob for java.sql.Clob and java.sql.Blob
+ * allow embedded object declaration wo @Embeddable (if @Embedded or @EmbeddedId is present in the property)
+ * support for @EmbeddedId
+ * rename DependentAttribute to AttributeOverride, Dependent to Embedded and DependentObject to Embeddable
+ * support @ManyToOne in embedded objects
+ * support for @NamedQuery and @NamedQueries (EJBQL)
+ * move javax.ejb.* into javax.persistence.* and update copyright header
+
+3.0alpha3 (28-02-2005)
+----------------------
+* HBX-116 Support for Where clause in classes and collections @Where(clause="")
+* HBX-115 Support for class proxying configuration: @Proxy(lazy=false, proxyClassName="my.Interface")
+* HBX-88 Support for hibernate type abstraction through @Type (only on basic properties for now)
+* HBX-108 Support @BatchSize(size=n) for entities and collections
+* HBX-107 implements @org.hibernate.annotations.Entity
+* HBX-103 handle abstract classes
+* HBX-83 precision & scale support for column (Bogdan Ghidireac)
+
+3.0alpha2 (25-01-2005)
+----------------------
+* HBX-61 Support for @UniqueConstraint (except primaryKey=true)
+* HBX-60 Support for a proper @TableGenerator (using MultipleHiLoPerTableGenerator)
+* HBX-63 Support @GeneratorTable
+* HBX-68 Add declarative configuration of annotated classes
+* HBX-74 Rollback the HB-1315 fix: dialect no longer have to be set in hibernate.properties
+
+
+Hibernate-annotations-3.0alpha1 based on the EJB3 Early Draft 1 (6.01.2005)
+---------------------------------------------------------------------------
+* Support for EJB3 annotations:
+ - @Transient
+ - @Column (not primaryKey)
+ - @JoinColumn (referencedColumnName - only for a reference to a PK, not primaryKey)
+ - @Version
+ - @Basic
+ - @Entity
+ - @Table (not uniqueConstraints)
+ - @AccessType
+ - @Id
+ - @CascadeType
+ - @FetchType
+ - @GeneratorType (NONE, IDENTITY, TABLE, SEQUENCE)
+ - @TableGenerator (with scope visibility)
+ - @SequenceGenerator (with scope visibility, does not support initialValue() and allocationSize())
+ - *not* @GeneratorTable (will have to write a new TableHiloGenerator, but it can wait)
+ - @ManyToOne (not optional)
+ - @OneToMany (Set and Collection, generics version or not, JoinColumn not guessed)
+ - @OneToOne
+ but not optional
+ no composite PK/FK
+ - @ManyToMany
+ - @AssociationTable (Has to be on both sides)
+ - @Inheritance
+ - @InheritanceType (has to be defined on every classes of the hierarchy for JOINED strategy,
+ not very clear about the TABLE_PER_CLASS strategy)
+ - @DiscriminatorColumn
+ - @DiscriminatorType
+ - @InheritanceJoinColumn
+ - @InheritanceJoinColumns
+ this annotation for Composite PK Entities has to be explicit, I do not respect the implicit semantic of the EJB3 spec
+ - @SecondaryTable (@OneToMany @JoinColumn(secondaryTable="..." does not work yet due to H3 core issue HHH-36
+ - @SecondaryTables
+ this annotation for Composite PK Entities has to be explicit, I do not respect the implicit semantic of the EJB3 spec
+ - @DependentObject
+ - @Dependent
+ - @DependentAttribute (only for basic properties as per the spec)
+ - @Id in conjunction with @DependentObject (composite primary keys)
+ - @JoinColumns in conjunction with @ManytoOne, @OneToMany, @ManytoMany
+ - note that the composite FK columns have to be in the same table (no != secondary tables). This is probably a weird case and certainly a not recommanded one.
+
+
+Still missing or incomplete features compared to the EJB3 spec
+--------------------------------------------------------------
+ - use of referencedColumnName for column other than the PK ones @ManyToMany (HBX-62)
+ - Support for a true bidirectional one to one relationship (HBX-177)
+ - support for initialValue and allocationSize in @SequenceGenerator (HBX-59)
+ - finish support of optional=false (HBX-190)
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc)
Copied: trunk/HibernateExt/annotations/doc/api (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/api)
Deleted: trunk/HibernateExt/annotations/doc/api/package.html
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/api/package.html 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/api/package.html 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1 +0,0 @@
-<body></body>
Copied: trunk/HibernateExt/annotations/doc/api/package.html (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/api/package.html)
===================================================================
--- trunk/HibernateExt/annotations/doc/api/package.html (rev 0)
+++ trunk/HibernateExt/annotations/doc/api/package.html 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1 @@
+<body></body>
Copied: trunk/HibernateExt/annotations/doc/reference (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference)
Property changes on: trunk/HibernateExt/annotations/doc/reference
___________________________________________________________________
Name: svn:ignore
+ build
Deleted: trunk/HibernateExt/annotations/doc/reference/.cvsignore
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/annotations/doc/reference/.cvsignore (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/.cvsignore)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/annotations/doc/reference/build.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/build.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-<project name="Documentation" default="all.doc" basedir=".">
-
- <!-- Use the core Hibernate3 doc build system -->
- <import file="../../../common/common-build.xml"/>
- <import file="${hibernate-cvs.doc.reference}/build.xml"/>
-
-
- <target name="all.doc" depends="clean">
-
- <!-- TRANSLATOR: Duplicate this call for your language -->
- <antcall target="lang.all">
- <param name="docname" value="hibernate_annotations"/>
- <param name="lang" value="en"/>
- </antcall>
- <antcall target="lang.all">
- <param name="docname" value="hibernate_annotations"/>
- <param name="lang" value="zh_cn"/>
- </antcall>
- <antcall target="lang.all">
- <param name="docname" value="hibernate_annotations"/>
- <param name="lang" value="fr"/>
- </antcall>
- </target>
-
-</project>
Copied: trunk/HibernateExt/annotations/doc/reference/build.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/build.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/build.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+<project name="Documentation" default="all.doc" basedir=".">
+
+ <!-- Use the core Hibernate3 doc build system -->
+ <import file="../../../common/common-build.xml"/>
+ <import file="${hibernate-cvs.doc.reference}/build.xml"/>
+
+
+ <target name="all.doc" depends="clean">
+
+ <!-- TRANSLATOR: Duplicate this call for your language -->
+ <antcall target="lang.all">
+ <param name="docname" value="hibernate_annotations"/>
+ <param name="lang" value="en"/>
+ </antcall>
+ <antcall target="lang.all">
+ <param name="docname" value="hibernate_annotations"/>
+ <param name="lang" value="zh_cn"/>
+ </antcall>
+ <antcall target="lang.all">
+ <param name="docname" value="hibernate_annotations"/>
+ <param name="lang" value="fr"/>
+ </antcall>
+ </target>
+
+</project>
Copied: trunk/HibernateExt/annotations/doc/reference/en (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en)
Copied: trunk/HibernateExt/annotations/doc/reference/en/images (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/images)
Deleted: trunk/HibernateExt/annotations/doc/reference/en/images/hibernate_logo_a.png
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/annotations/doc/reference/en/images/hibernate_logo_a.png (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/images/hibernate_logo_a.png)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/annotations/doc/reference/en/master.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/master.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/en/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,77 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
-"../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
-<!ENTITY setup SYSTEM "modules/setup.xml">
-<!ENTITY entity SYSTEM "modules/entity.xml">
-<!ENTITY xml-overriding SYSTEM "modules/xml-overriding.xml">
-<!ENTITY additionalmodules SYSTEM "modules/additionalmodules.xml">
-]>
-<book lang="en">
- <bookinfo>
- <title>Hibernate Annotations</title>
-
- <subtitle>Reference Guide</subtitle>
-
- <releaseinfo>3.2.2.GA</releaseinfo>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="images/hibernate_logo_a.png" format="png" />
- </imageobject>
- </mediaobject>
- </bookinfo>
-
- <toc></toc>
-
- <preface id="preface" revision="1">
- <title>Preface</title>
-
- <para>Hibernate, like all other object/relational mapping tools, requires
- metadata that governs the transformation of data from one representation
- to the other (and vice versa). In Hibernate 2.x, mapping metadata is most
- of the time declared in XML text files. Another option is XDoclet,
- utilizing Javadoc source code annotations and a preprocessor at compile
- time. The same kind of annotation support is now available in the standard
- JDK, although more powerful and better supported by tools. IntelliJ IDEA,
- and Eclipse for example, support auto-completion and syntax highlighting
- of JDK 5.0 annotations. Annotations are compiled into the bytecode and
- read at runtime (in Hibernate's case on startup) using reflection, so no
- external XML files are needed.</para>
-
- <para>The EJB3 specification recognizes the interest and the success of
- the transparent object/relational mapping paradigm. The EJB3 specification
- standardizes the basic APIs and the metadata needed for any
- object/relational persistence mechanism. <emphasis>Hibernate
- EntityManager</emphasis> implements the programming interfaces and
- lifecycle rules as defined by the EJB3 persistence specification. Together
- with <emphasis>Hibernate Annotations</emphasis>, this wrapper implements a
- complete (and standalone) EJB3 persistence solution on top of the mature
- Hibernate core. You may use a combination of all three together,
- annotations without EJB3 programming interfaces and lifecycle, or even
- pure native Hibernate, depending on the business and technical needs of
- your project. You can at all times fall back to Hibernate native APIs, or
- if required, even to native JDBC and SQL.</para>
-
- <para>This release is based on the final release of the EJB 3.0 / JPA
- specification (aka JSP-220) and support all the specification features
- (including the optional ones). Most of the Hibernate features and
- extensions are also available through Hibernate specific annotations
- compared to the specification are also available. While the Hibernate
- feature coverage is now very high, some are still missing. The eventual
- goal is to cover all of them. See the JIRA road map section for more
- informations.</para>
-
- <para>If you are moving from previous Hibernate Annotations versions,
- please have a look at <ulink url="http://www.hibernate.org/398.html">Java
- Persistence migration guide</ulink>.</para>
- </preface>
-
- &setup;
-
- &entity;
-
- &xml-overriding;
-
- &additionalmodules;
-
-</book>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/en/master.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/master.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/en/master.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/en/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
+"../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
+<!ENTITY setup SYSTEM "modules/setup.xml">
+<!ENTITY entity SYSTEM "modules/entity.xml">
+<!ENTITY xml-overriding SYSTEM "modules/xml-overriding.xml">
+<!ENTITY additionalmodules SYSTEM "modules/additionalmodules.xml">
+]>
+<book lang="en">
+ <bookinfo>
+ <title>Hibernate Annotations</title>
+
+ <subtitle>Reference Guide</subtitle>
+
+ <releaseinfo>3.2.2.GA</releaseinfo>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/hibernate_logo_a.png" format="png" />
+ </imageobject>
+ </mediaobject>
+ </bookinfo>
+
+ <toc></toc>
+
+ <preface id="preface" revision="1">
+ <title>Preface</title>
+
+ <para>Hibernate, like all other object/relational mapping tools, requires
+ metadata that governs the transformation of data from one representation
+ to the other (and vice versa). In Hibernate 2.x, mapping metadata is most
+ of the time declared in XML text files. Another option is XDoclet,
+ utilizing Javadoc source code annotations and a preprocessor at compile
+ time. The same kind of annotation support is now available in the standard
+ JDK, although more powerful and better supported by tools. IntelliJ IDEA,
+ and Eclipse for example, support auto-completion and syntax highlighting
+ of JDK 5.0 annotations. Annotations are compiled into the bytecode and
+ read at runtime (in Hibernate's case on startup) using reflection, so no
+ external XML files are needed.</para>
+
+ <para>The EJB3 specification recognizes the interest and the success of
+ the transparent object/relational mapping paradigm. The EJB3 specification
+ standardizes the basic APIs and the metadata needed for any
+ object/relational persistence mechanism. <emphasis>Hibernate
+ EntityManager</emphasis> implements the programming interfaces and
+ lifecycle rules as defined by the EJB3 persistence specification. Together
+ with <emphasis>Hibernate Annotations</emphasis>, this wrapper implements a
+ complete (and standalone) EJB3 persistence solution on top of the mature
+ Hibernate core. You may use a combination of all three together,
+ annotations without EJB3 programming interfaces and lifecycle, or even
+ pure native Hibernate, depending on the business and technical needs of
+ your project. You can at all times fall back to Hibernate native APIs, or
+ if required, even to native JDBC and SQL.</para>
+
+ <para>This release is based on the final release of the EJB 3.0 / JPA
+ specification (aka JSP-220) and support all the specification features
+ (including the optional ones). Most of the Hibernate features and
+ extensions are also available through Hibernate specific annotations
+ compared to the specification are also available. While the Hibernate
+ feature coverage is now very high, some are still missing. The eventual
+ goal is to cover all of them. See the JIRA road map section for more
+ informations.</para>
+
+ <para>If you are moving from previous Hibernate Annotations versions,
+ please have a look at <ulink url="http://www.hibernate.org/398.html">Java
+ Persistence migration guide</ulink>.</para>
+ </preface>
+
+ &setup;
+
+ &entity;
+
+ &xml-overriding;
+
+ &additionalmodules;
+
+</book>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/en/modules (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules)
Deleted: trunk/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,120 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="additionalmodules">
- <title>Additional modules</title>
-
- <para>Hibernate Annotations mainly focus on persistence metadata. The
- project also have a nice integration with two Hibernate modules.</para>
-
- <section>
- <title>Hibernate Validator</title>
-
- <section>
- <title>Description</title>
-
- <para>Annotations are a very convenient and elegant way to specify
- invariant constraints for a domain model. You can, for example, express
- that a property should never be null, that the account balance should be
- strictly positive, etc. These domain model constraints are declared in
- the bean itself by annotating its properties. A validator can then read
- them and check for constraint violations. The validation mechanism can
- be executed in different layers in your application without having to
- duplicate any of these rules (presentation layer, data access layer).
- Following the DRY principle, Hibernate Validator has been designed for
- that purpose.</para>
-
- <para>Hibernate Validator works at two levels. First, it is able to
- check in-memory instances of a class for constraint violations. Second,
- it can apply the constraints to the Hibernate metamodel and incorporate
- them into the generated database schema.</para>
-
- <para>Each constraint annotation is associated to a validator
- implementation responsible for checking the constraint on the entity
- instance. A validator can also (optionally) apply the constraint to the
- Hibernate metamodel, allowing Hibernate to generate DDL that expresses
- the constraint. With the appropriate event listener, you can execute the
- checking operation on inserts and updates done by Hibernate. Hibernate
- Validator is not limited to use with Hibernate. You can easily use it
- anywhere in your application.</para>
-
- <para>When checking instances at runtime, Hibernate Validator returns
- information about constraint violations in an array of
- <classname>InvalidValue</classname> s. Among other information, the
- <classname>InvalidValue</classname> contains an error description
- message that can embed the parameter values bundle with the annotation
- (eg. length limit), and message strings that may be externalized to a
- <classname>ResourceBundle</classname> .</para>
- </section>
-
- <section>
- <title>Integration with Hibernate Annotations</title>
-
- <para>If Hibernate Validator
- (<filename>hibernate-validator.jar</filename>) is available in the
- classpath, Hibernate Annotations will integrates in two ways:</para>
-
- <itemizedlist>
- <listitem>
- <para>Constraints will be applied to the Data Definition Language.
- In other words, the database schema will reflect the constraints
- (provided that you use the hbm2ddl tool).</para>
- </listitem>
-
- <listitem>
- <para>Before an entity change is applied to the database (insert or
- update), the entity is validated. Validation errors, if any, will be
- carried over through an
- <classname>InvalidStateException</classname>.</para>
- </listitem>
- </itemizedlist>
-
- <para>For entities free of validation rules, the runtime performance
- cost is null.</para>
-
- <para>To disable constraint propagation to DDL, set up
- <literal>hibernate.validator.apply_to_ddl</literal> to false in the
- configuration file. Such a need is very uncommon and not
- recommanded.</para>
-
- <para>To disable pre-entity change validation, set up
- <literal>hibernate.validator.autoregister_listeners</literal> to false
- in the configuration file. Such a need is very uncommon and not
- recommanded.</para>
-
- <para>Check the Hibernate Validator reference documentation for more
- information.</para>
- </section>
- </section>
-
- <section>
- <title>Hibernate Search</title>
-
- <section>
- <title>Decription</title>
-
- <para>Full text search engines like <productname>Apache
- Lucene</productname> are a very powerful technology to bring free
- text/efficient queries to applications. If suffers several mismatches
- when dealing with a object domain model (keeping the index up to date,
- mismatch between the index structure and the domain model, querying
- mismatch...) Hibernate Search indexes your domain model thanks to a few
- annotations, takes care of the database / index synchronization and
- brings you back regular managed objects from free text queries.
- Hibernate Search is using <ulink url="http://lucene.apache.org">Apache
- Lucene</ulink> under the cover.</para>
- </section>
-
- <section>
- <title>Integration with Hibernate Annotations</title>
-
- <para>Hibernate Search integrates with Hibernate Annotations
- transparently provided that hibernate-search.jar is present in the
- classpath. If you do not wish to autoregister Hibernate Search event
- listeners, you can set
- <literal>hibernate.search.autoregister_listeners</literal> to false.
- Such a need is very uncommon and not recommanded.</para>
-
- <para>Check the Hibernate Search reference documentation for more
- information.</para>
- </section>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/en/modules/additionalmodules.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="additionalmodules">
+ <title>Additional modules</title>
+
+ <para>Hibernate Annotations mainly focus on persistence metadata. The
+ project also have a nice integration with two Hibernate modules.</para>
+
+ <section>
+ <title>Hibernate Validator</title>
+
+ <section>
+ <title>Description</title>
+
+ <para>Annotations are a very convenient and elegant way to specify
+ invariant constraints for a domain model. You can, for example, express
+ that a property should never be null, that the account balance should be
+ strictly positive, etc. These domain model constraints are declared in
+ the bean itself by annotating its properties. A validator can then read
+ them and check for constraint violations. The validation mechanism can
+ be executed in different layers in your application without having to
+ duplicate any of these rules (presentation layer, data access layer).
+ Following the DRY principle, Hibernate Validator has been designed for
+ that purpose.</para>
+
+ <para>Hibernate Validator works at two levels. First, it is able to
+ check in-memory instances of a class for constraint violations. Second,
+ it can apply the constraints to the Hibernate metamodel and incorporate
+ them into the generated database schema.</para>
+
+ <para>Each constraint annotation is associated to a validator
+ implementation responsible for checking the constraint on the entity
+ instance. A validator can also (optionally) apply the constraint to the
+ Hibernate metamodel, allowing Hibernate to generate DDL that expresses
+ the constraint. With the appropriate event listener, you can execute the
+ checking operation on inserts and updates done by Hibernate. Hibernate
+ Validator is not limited to use with Hibernate. You can easily use it
+ anywhere in your application.</para>
+
+ <para>When checking instances at runtime, Hibernate Validator returns
+ information about constraint violations in an array of
+ <classname>InvalidValue</classname> s. Among other information, the
+ <classname>InvalidValue</classname> contains an error description
+ message that can embed the parameter values bundle with the annotation
+ (eg. length limit), and message strings that may be externalized to a
+ <classname>ResourceBundle</classname> .</para>
+ </section>
+
+ <section>
+ <title>Integration with Hibernate Annotations</title>
+
+ <para>If Hibernate Validator
+ (<filename>hibernate-validator.jar</filename>) is available in the
+ classpath, Hibernate Annotations will integrates in two ways:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Constraints will be applied to the Data Definition Language.
+ In other words, the database schema will reflect the constraints
+ (provided that you use the hbm2ddl tool).</para>
+ </listitem>
+
+ <listitem>
+ <para>Before an entity change is applied to the database (insert or
+ update), the entity is validated. Validation errors, if any, will be
+ carried over through an
+ <classname>InvalidStateException</classname>.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>For entities free of validation rules, the runtime performance
+ cost is null.</para>
+
+ <para>To disable constraint propagation to DDL, set up
+ <literal>hibernate.validator.apply_to_ddl</literal> to false in the
+ configuration file. Such a need is very uncommon and not
+ recommanded.</para>
+
+ <para>To disable pre-entity change validation, set up
+ <literal>hibernate.validator.autoregister_listeners</literal> to false
+ in the configuration file. Such a need is very uncommon and not
+ recommanded.</para>
+
+ <para>Check the Hibernate Validator reference documentation for more
+ information.</para>
+ </section>
+ </section>
+
+ <section>
+ <title>Hibernate Search</title>
+
+ <section>
+ <title>Decription</title>
+
+ <para>Full text search engines like <productname>Apache
+ Lucene</productname> are a very powerful technology to bring free
+ text/efficient queries to applications. If suffers several mismatches
+ when dealing with a object domain model (keeping the index up to date,
+ mismatch between the index structure and the domain model, querying
+ mismatch...) Hibernate Search indexes your domain model thanks to a few
+ annotations, takes care of the database / index synchronization and
+ brings you back regular managed objects from free text queries.
+ Hibernate Search is using <ulink url="http://lucene.apache.org">Apache
+ Lucene</ulink> under the cover.</para>
+ </section>
+
+ <section>
+ <title>Integration with Hibernate Annotations</title>
+
+ <para>Hibernate Search integrates with Hibernate Annotations
+ transparently provided that hibernate-search.jar is present in the
+ classpath. If you do not wish to autoregister Hibernate Search event
+ listeners, you can set
+ <literal>hibernate.search.autoregister_listeners</literal> to false.
+ Such a need is very uncommon and not recommanded.</para>
+
+ <para>Check the Hibernate Search reference documentation for more
+ information.</para>
+ </section>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/en/modules/entity.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/entity.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/en/modules/entity.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,3583 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="entity">
- <title>Entity Beans</title>
-
- <sect1 id="entity-overview" revision="2">
- <title>Intro</title>
-
- <para>This section covers EJB 3.0 (aka Java Persistence) entity
- annotations and Hibernate-specific extensions.</para>
- </sect1>
-
- <sect1 id="entity-mapping" revision="2">
- <title>Mapping with EJB3/JPA Annotations</title>
-
- <para>EJB3 entities are plain POJOs. Actually they represent the exact
- same concept as the Hibernate persistent entities. Their mappings are
- defined through JDK 5.0 annotations (an XML descriptor syntax for
- overriding is defined in the EJB3 specification). Annotations can be split
- in two categories, the logical mapping annotations (allowing you to
- describe the object model, the class associations, etc.) and the physical
- mapping annotations (describing the physical schema, tables, columns,
- indexes, etc). We will mix annotations from both categories in the
- following code examples.</para>
-
- <para>EJB3 annotations are in the <literal>javax.persistence.*</literal>
- package. Most JDK 5 compliant IDE (like Eclipse, IntelliJ IDEA and
- Netbeans) can autocomplete annotation interfaces and attributes for you
- (even without a specific "EJB3" module, since EJB3 annotations are plain
- JDK 5 annotations).</para>
-
- <para>For more and runnable concrete examples read the JBoss EJB 3.0
- tutorial or review the Hibernate Annotations test suite. Most of the unit
- tests have been designed to represent a concrete example and be a
- inspiration source.</para>
-
- <sect2 id="entity-mapping-entity">
- <title>Declaring an entity bean</title>
-
- <para>Every bound persistent POJO class is an entity bean and is
- declared using the <literal>@Entity</literal> annotation (at the class
- level):</para>
-
- <programlisting>
- at Entity
-public class Flight implements Serializable {
- Long id;
-
- @Id
- public Long getId() { return id; }
-
- public void setId(Long id) { this.id = id; }
-}
- </programlisting>
-
- <para><literal>@Entity</literal> declares the class as an entity bean
- (i.e. a persistent POJO class), <literal>@Id</literal> declares the
- identifier property of this entity bean. The other mapping declarations
- are implicit. This configuration by exception concept is central to the
- new EJB3 specification and a major improvement. The class Flight is
- mapped to the Flight table, using the column id as its primary key
- column.</para>
-
- <para>Depending on whether you annotate fields or methods, the access
- type used by Hibernate will be <literal>field</literal> or
- <literal>property</literal>. The EJB3 spec requires that you declare
- annotations on the element type that will be accessed, i.e. the getter
- method if you use <literal>property</literal> access, the field if you
- use <literal>field</literal> access. Mixing EJB3 annotations in both
- fields and methods should be avoided. Hibernate will guess the access
- type from the position of <literal>@Id</literal> or
- <literal>@EmbeddedId</literal>.</para>
-
- <sect3>
- <title>Defining the table</title>
-
- <para><literal>@Table</literal> is set at the class level; it allows
- you to define the table, catalog, and schema names for your entity
- bean mapping. If no <literal>@Table</literal> is defined the default
- values are used: the unqualified class name of the entity.</para>
-
- <programlisting>
- at Entity
- at Table(name="tbl_sky")
-public class Sky implements Serializable {
-...
- </programlisting>
-
- <para>The <literal>@Table</literal> element also contains a
- <literal>schema</literal> and a <literal>catalog</literal> attributes,
- if they need to be defined. You can also define unique constraints to
- the table using the <literal>@UniqueConstraint</literal> annotation in
- conjunction with <literal>@Table</literal> (for a unique constraint
- bound to a single column, refer to <literal>@Column</literal>).</para>
-
- <programlisting>@Table(name="tbl_sky",
- <emphasis role="bold">uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})}</emphasis>
-)</programlisting>
-
- <para>A unique constraint is applied to the tuple month, day. Note
- that the <literal>columnNames</literal> array refers to the logical
- column names.</para>
-
- <remark>The logical column name is defined by the Hibernate
- NamingStrategy implementation. The default EJB3 naming strategy use
- the physical column name as the logical column name. Note that this
- may be different than the property name (if the column name is
- explicit). Unless you override the NamingStrategy, you shouldn't worry
- about that.</remark>
- </sect3>
-
- <sect3 id="entity-mapping-entity-version" revision="1">
- <title>Versioning for optimistic locking</title>
-
- <para>You can add optimistic locking capability to an entity bean
- using the <literal>@Version</literal> annotation:</para>
-
- <programlisting>
- at Entity
-public class Flight implements Serializable {
-...
- @Version
- @Column(name="OPTLOCK")
- public Integer getVersion() { ... }
-} </programlisting>
-
- <para>The version property will be mapped to the
- <literal>OPTLOCK</literal> column, and the entity manager will use it
- to detect conflicting updates (preventing lost updates you might
- otherwise see with the last-commit-wins strategy).</para>
-
- <para>The version column may be a numeric (the recommended solution)
- or a timestamp as per the EJB3 spec. Hibernate support any kind of
- type provided that you define and implement the appropriate
- <classname>UserVersionType</classname>.</para>
-
- <para>The application must not alter the version number set up by
- Hibernate in any way. To artificially increase the version number,
- check in Hibernate Entity Manager's reference documentation
- <literal>LockMode.WRITE</literal></para>
- </sect3>
- </sect2>
-
- <sect2 id="entity-mapping-property" revision="1">
- <title>Mapping simple properties</title>
-
- <sect3>
- <title>Declaring basic property mappings</title>
-
- <para>Every non static non transient property (field or method) of an
- entity bean is considered persistent, unless you annotate it as
- <literal>@Transient</literal>. Not having an annotation for your
- property is equivalent to the appropriate <literal>@Basic</literal>
- annotation. The <literal>@Basic</literal> annotation allows you to
- declare the fetching strategy for a property:</para>
-
- <programlisting>public transient int counter; //transient property
-
-private String firstname; //persistent property
-
- at Transient
-String getLengthInMeter() { ... } //transient property
-
-String getName() {... } // persistent property
-
- at Basic
-int getLength() { ... } // persistent property
-
- at Basic(fetch = FetchType.LAZY)
-String getDetailedComment() { ... } // persistent property
-
- at Temporal(TemporalType.TIME)
-java.util.Date getDepartureTime() { ... } // persistent property
-
- at Enumerated(STRING)
-Starred getNote() { ... } //enum persisted as String in database</programlisting>
-
- <para><literal>counter</literal>, a transient field, and
- <literal>lengthInMeter</literal>, a method annotated as
- <literal>@Transient</literal>, and will be ignored by the entity
- manager. <literal>name</literal>, <literal>length</literal>, and
- <literal>firstname</literal> properties are mapped persistent and
- eagerly fetched (the default for simple properties). The
- <literal>detailedComment</literal> property value will be lazily
- fetched from the database once a lazy property of the entity is
- accessed for the first time. Usually you don't need to lazy simple
- properties (not to be confused with lazy association fetching).</para>
-
- <note>
- <para>To enable property level lazy fetching, your classes have to
- be instrumented: bytecode is added to the original one to enable
- such feature, please refer to the Hibernate reference documentation.
- If your classes are not instrumented, property level lazy loading is
- silently ignored.</para>
- </note>
-
- <para>The recommended alternative is to use the projection capability
- of EJB-QL or Criteria queries.</para>
-
- <para>EJB3 support property mapping of all basic types supported by
- Hibernate (all basic Java types , their respective wrappers and
- serializable classes). Hibernate Annotations support out of the box
- Enum type mapping either into a ordinal column (saving the enum
- ordinal) or a string based column (saving the enum string
- representation): the persistence representation, defaulted to ordinal,
- can be overriden through the <literal>@Enumerated</literal> annotation
- as shown in the <literal>note</literal> property example.</para>
-
- <para>In core Java APIs, the temporal precision is not defined. When
- dealing with temporal data you might want to describe the expected
- precision in database. Temporal data can have <literal>DATE</literal>,
- <literal>TIME</literal>, or <literal>TIMESTAMP</literal> precision (ie
- the actual date, only the time, or both). Use the
- <literal>@Temporal</literal> annotation to fine tune that.</para>
-
- <para><literal>@Lob</literal> indicates that the property should be
- persisted in a Blob or a Clob depending on the property type:
- <classname>java.sql.Clob</classname>,
- <classname>Character[]</classname>, <classname>char[]</classname> and
- java.lang.<classname>String</classname> will be persisted in a Clob.
- <classname>java.sql.Blob</classname>, <classname>Byte[]</classname>,
- <classname>byte[] </classname>and serializable type will be persisted
- in a Blob.</para>
-
- <programlisting>
- at Lob
-public String getFullText() {
- return fullText;
-}
-
- at Lob
-public byte[] getFullCode() {
- return fullCode;
-}
- </programlisting>
-
- <para>If the property type implements
- <classname>java.io.Serializable</classname> and is not a basic type,
- and if the property is not annotated with <literal>@Lob</literal>,
- then the Hibernate <literal>serializable</literal> type is
- used.</para>
- </sect3>
-
- <sect3 id="entity-mapping-property-column" revision="1">
- <title>Declaring column attributes</title>
-
- <para>The column(s) used for a property mapping can be defined using
- the <literal>@Column</literal> annotation. Use it to override default
- values (see the EJB3 specification for more information on the
- defaults). You can use this annotation at the property level for
- properties that are:</para>
-
- <itemizedlist>
- <listitem>
- <para>not annotated at all</para>
- </listitem>
-
- <listitem>
- <para>annotated with <literal>@Basic</literal></para>
- </listitem>
-
- <listitem>
- <para>annotated with <literal>@Version</literal></para>
- </listitem>
-
- <listitem>
- <para>annotated with <literal>@Lob</literal></para>
- </listitem>
-
- <listitem>
- <para>annotated with <literal>@Temporal</literal></para>
- </listitem>
-
- <listitem>
- <para>annotated with
- <literal>@org.hibernate.annotations.CollectionOfElements</literal>
- (for Hibernate only)</para>
- </listitem>
- </itemizedlist>
-
- <programlisting>
- at Entity
-public class Flight implements Serializable {
-...
- at Column(updatable = false, name = "flight_name", nullable = false, length=50)
-public String getName() { ... }
- </programlisting>
-
- <para>The <literal>name</literal> property is mapped to the
- <literal>flight_name</literal> column, which is not nullable, has a
- length of 50 and is not updatable (making the property
- immutable).</para>
-
- <para>This annotation can be applied to regular properties as well as
- <literal>@Id</literal> or <literal>@Version</literal>
- properties.</para>
-
- <programlistingco>
- <areaspec>
- <area coords="2 55" id="hm1" />
-
- <area coords="3 55" id="hm2" />
-
- <area coords="4 55" id="hm3" />
-
- <area coords="5 55" id="hm4" />
-
- <area coords="6 55" id="hm5" />
-
- <area coords="7 55" id="hm6" />
-
- <area coords="8 55" id="hm7" />
-
- <area coords="9 55" id="hm8" />
-
- <area coords="10 55" id="hm9" />
-
- <area coords="11 55" id="hm10" />
- </areaspec>
-
- <programlisting>@Column(
- name="columnName";
- boolean unique() default false;
- boolean nullable() default true;
- boolean insertable() default true;
- boolean updatable() default true;
- String columnDefinition() default "";
- String table() default "";
- int length() default 255;
- int precision() default 0; // decimal precision
- int scale() default 0; // decimal scale</programlisting>
-
- <calloutlist>
- <callout arearefs="hm1">
- <para><literal>name</literal> (optional): the column name
- (default to the property name)</para>
- </callout>
-
- <callout arearefs="hm2">
- <para><literal>unique</literal> (optional): set a unique
- constraint on this column or not (default false)</para>
- </callout>
-
- <callout arearefs="hm3">
- <para><literal>nullable</literal> (optional): set the column as
- nullable (default true).</para>
- </callout>
-
- <callout arearefs="hm4">
- <para><literal>insertable</literal> (optional): whether or not
- the column will be part of the insert statement (default
- true)</para>
- </callout>
-
- <callout arearefs="hm5">
- <para><literal>updatable</literal> (optional): whether or not
- the column will be part of the update statement (default
- true)</para>
- </callout>
-
- <callout arearefs="hm6">
- <para><literal>columnDefinition</literal> (optional): override
- the sql DDL fragment for this particular column (non
- portable)</para>
- </callout>
-
- <callout arearefs="hm7">
- <para><literal>table</literal> (optional): define the targeted
- table (default primary table)</para>
- </callout>
-
- <callout arearefs="hm8">
- <para><literal><literal>length</literal></literal> (optional):
- column length (default 255)</para>
- </callout>
-
- <callout arearefs="hm8">
- <para><literal><literal>precision</literal></literal>
- (optional): column decimal precision (default 0)</para>
- </callout>
-
- <callout arearefs="hm10">
- <para><literal><literal>scale</literal></literal> (optional):
- column decimal scale if useful (default 0)</para>
- </callout>
- </calloutlist>
- </programlistingco>
- </sect3>
-
- <sect3>
- <title>Embedded objects (aka components)</title>
-
- <para>It is possible to declare an embedded component inside an entity
- and even override its column mapping. Component classes have to be
- annotated at the class level with the <literal>@Embeddable</literal>
- annotation. It is possible to override the column mapping of an
- embedded object for a particular entity using the
- <literal>@Embedded</literal> and <literal>@AttributeOverride</literal>
- annotation in the associated property:</para>
-
- <programlisting>
- at Entity
-public class Person implements Serializable {
-
- // Persistent component using defaults
- Address homeAddress;
-
- @Embedded
- @AttributeOverrides( {
- @AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),
- @AttributeOverride(name="name", column = @Column(name="bornCountryName") )
- } )
- Country bornIn;
- ...
-}
- </programlisting>
-
- <programlisting>
- at Embeddable
-public class Address implements Serializable {
- String city;
- Country nationality; //no overriding here
-}
- </programlisting>
-
- <programlisting>
- at Embeddable
-public class Country implements Serializable {
- private String iso2;
- @Column(name="countryName") private String name;
-
- public String getIso2() { return iso2; }
- public void setIso2(String iso2) { this.iso2 = iso2; }
-
-
- public String getName() { return name; }
- public void setName(String name) { this.name = name; }
- ...
-}
- </programlisting>
-
- <para>A embeddable object inherit the access type of its owning entity
- (note that you can override that using the Hibernate specific
- <literal>@AccessType</literal> annotations (see <xref
- linkend="entity-hibspec" />).</para>
-
- <para>The <literal>Person</literal> entity bean has two component
- properties, <literal>homeAddress</literal> and
- <literal>bornIn</literal>. <literal>homeAddress</literal> property has
- not been annotated, but Hibernate will guess that it is a persistent
- component by looking for the <literal>@Embeddable</literal> annotation
- in the Address class. We also override the mapping of a column name
- (to <literal>bornCountryName</literal>) with the
- <literal>@Embedded</literal> and <literal>@AttributeOverride
- </literal>annotations for each mapped attribute of
- <literal>Country</literal>. As you can see, <literal>Country
- </literal>is also a nested component of <literal>Address</literal>,
- again using auto-detection by Hibernate and EJB3 defaults. Overriding
- columns of embedded objects of embedded objects is currently not
- supported in the EJB3 spec, however, Hibernate Annotations supports it
- through dotted expressions.</para>
-
- <para><programlisting> @Embedded
- @AttributeOverrides( {
- @AttributeOverride(name="city", column = @Column(name="fld_city") )
- @AttributeOverride(name="<emphasis role="bold">nationality.iso2</emphasis>", column = @Column(name="nat_Iso2") ),
- @AttributeOverride(name="<emphasis role="bold">nationality.name</emphasis>", column = @Column(name="nat_CountryName") )
- //nationality columns in homeAddress are overridden
- } )
- Address homeAddress;</programlisting>Hibernate Annotations supports one
- more feature that is not explicitly supported by the EJB3
- specification. You can annotate a embedded object with the
- <literal>@MappedSuperclass</literal> annotation to make the superclass
- properties persistent (see <literal>@MappedSuperclass</literal> for
- more informations).</para>
-
- <para>While not supported by the EJB3 specification, Hibernate
- Annotations allows you to use association annotations in an embeddable
- object (ie <literal>@*ToOne</literal> nor
- <literal>@*ToMany</literal>). To override the association columns you
- can use <literal>@AssociationOverride</literal>.</para>
-
- <para>If you want to have the same embeddable object type twice in the
- same entity, the column name defaulting will not work: at least one of
- the columns will have to be explicit. Hibernate goes beyond the EJB3
- spec and allows you to enhance the defaulting mechanism through the
- <classname>NamingStrategy</classname>.
- <classname>DefaultComponentSafeNamingStrategy</classname> is a small
- improvement over the default EJB3NamingStrategy that allows embedded
- objects to be defaulted even if used twice in the same entity.</para>
- </sect3>
-
- <sect3>
- <title>Non-annotated property defaults</title>
-
- <para>If a property is not annotated, the following rules
- apply:</para>
-
- <itemizedlist>
- <listitem>
- If the property is of a single type, it is mapped as @Basic
- </listitem>
-
- <listitem>
- Otherwise, if the type of the property is annotated as @Embeddable, it is mapped as @Embedded
- </listitem>
-
- <listitem>
- Otherwise, if the type of the property is Serializable, it is mapped as @Basic in a column holding the object in its serialized version
- </listitem>
-
- <listitem>
- Otherwise, if the type of the property is java.sql.Clob or java.sql.Blob, it is mapped as @Lob with the appropriate LobType
- </listitem>
- </itemizedlist>
- </sect3>
- </sect2>
-
- <sect2 id="entity-mapping-identifier" label=""
- xreflabel="Mapping identifier properties">
- <title>Mapping identifier properties</title>
-
- <para>The <literal>@Id</literal> annotation lets you define which
- property is the identifier of your entity bean. This property can be set
- by the application itself or be generated by Hibernate (preferred). You
- can define the identifier generation strategy thanks to the
- <literal>@GeneratedValue</literal> annotation:</para>
-
- <itemizedlist>
- <listitem>
- AUTO - either identity column, sequence or table depending on the underlying DB
- </listitem>
-
- <listitem>
- TABLE - table holding the id
- </listitem>
-
- <listitem>
- IDENTITY - identity column
- </listitem>
-
- <listitem>
- SEQUENCE - sequence
- </listitem>
- </itemizedlist>
-
- <para>Hibernate provides more id generators than the basic EJB3 ones.
- Check <xref linkend="entity-hibspec" /> for more informations.</para>
-
- <para>The following example shows a sequence generator using the
- SEQ_STORE configuration (see below)</para>
-
- <programlisting>
- at Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
-public Integer getId() { ... }
- </programlisting>
-
- <para>The next example uses the identity generator:</para>
-
- <programlisting>
- at Id @GeneratedValue(strategy=GenerationType.IDENTITY)
-public Long getId() { ... }
- </programlisting>
-
- <para>The <literal>AUTO</literal> generator is the preferred type for
- portable applications (across several DB vendors). The identifier
- generation configuration can be shared for several
- <literal>@Id</literal> mappings with the generator attribute. There are
- several configurations available through
- <literal>@SequenceGenerator</literal> and
- <literal>@TableGenerator</literal>. The scope of a generator can be the
- application or the class. Class-defined generators are not visible
- outside the class and can override application level generators.
- Application level generators are defined at XML level (see <xref
- linkend="xml-overriding" />):</para>
-
- <programlisting><table-generator name="EMP_GEN"
- table="GENERATOR_TABLE"
- pk-column-name="key"
- value-column-name="hi"
- pk-column-value="EMP"
- allocation-size="20"/>
-
-//and the annotation equivalent
-
- at javax.persistence.TableGenerator(
- name="EMP_GEN",
- table="GENERATOR_TABLE",
- pkColumnName = "key",
- valueColumnName = "hi"
- pkColumnValue="EMP",
- allocationSize=20
-)
-
-<sequence-generator name="SEQ_GEN"
- sequence-name="my_sequence"
- allocation-size="20"/>
-
-//and the annotation equivalent
-
- at javax.persistence.SequenceGenerator(
- name="SEQ_GEN",
- sequenceName="my_sequence",
- allocationSize=20
-)
- </programlisting>
-
- <para>If JPA XML (like <filename>META-INF/orm.xml</filename>) is used to
- define thegenerators, <literal>EMP_GEN</literal> and
- <literal>SEQ_GEN</literal> are application level generators.
- <literal>EMP_GEN</literal> defines a table based id generator using the
- hilo algorithm with a <literal>max_lo</literal> of 20. The hi value is
- kept in a <literal>table</literal> "<literal>GENERATOR_TABLE</literal>".
- The information is kept in a row where <literal>pkColumnName</literal>
- "key" is equals to <literal>pkColumnValue</literal>
- "<literal>EMP</literal>" and column <literal>valueColumnName</literal>
- "<literal>hi</literal>" contains the the next high value used.</para>
-
- <para><literal>SEQ_GEN</literal> defines a sequence generator using a
- sequence named <literal>my_sequence</literal>. The allocation size used
- for this sequence based hilo algorithm is 20. Note that this version of
- Hibernate Annotations does not handle <literal>initialValue</literal> in
- the sequence generator. The default allocation size is 50, so if you
- want to use a sequence and pickup the value each time, you must set the
- allocation size to 1.</para>
-
- <note>
- <para>Package level definition is no longer supported by the EJB 3.0
- specification. However, you can use the
- <literal>@GenericGenerator</literal> at the package level (see <xref
- linkend="entity-hibspec-identifier" />).</para>
- </note>
-
- <para>The next example shows the definition of a sequence generator in a
- class scope:</para>
-
- <programlisting>
- at Entity
- at javax.persistence.SequenceGenerator(
- name="SEQ_STORE",
- sequenceName="my_sequence"
-)
-public class Store implements Serializable {
- private Long id;
-
- @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
- public Long getId() { return id; }
-}
- </programlisting>
-
- <para>This class will use a sequence named my_sequence and the SEQ_STORE
- generator is not visible in other classes. Note that you can check the
- Hibernate Annotations tests in the org.hibernate.test.metadata.id
- package for more examples.</para>
-
- <para>You can define a composite primary key through several
- syntaxes:</para>
-
- <itemizedlist>
- <listitem>
- annotate the component property as @Id and make the component class @Embeddable
- </listitem>
-
- <listitem>
- annotate the component property as @EmbeddedId
- </listitem>
-
- <listitem>
- annotate the class as @IdClass and annotate each property of the entity involved in the primary key with @Id
- </listitem>
- </itemizedlist>
-
- <para>While quite common to the EJB2 developer,
- <literal>@IdClass</literal> is likely new for Hibernate users. The
- composite primary key class corresponds to multiple fields or properties
- of the entity class, and the names of primary key fields or properties
- in the primary key class and those of the entity class must match and
- their types must be the same. Let's look at an example:</para>
-
- <programlisting>@Entity
-<emphasis role="bold">@IdClass(FootballerPk.class)</emphasis>
-public class Footballer {
- //part of the id key
- <emphasis role="bold">@Id</emphasis> public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- //part of the id key
- <emphasis role="bold">@Id</emphasis> public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- public String getClub() {
- return club;
- }
-
- public void setClub(String club) {
- this.club = club;
- }
-
- //appropriate equals() and hashCode() implementation
-}
-
- at Embeddable
-public class FootballerPk implements Serializable {
- //same name and type as in Footballer
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- //same name and type as in Footballer
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- //appropriate equals() and hashCode() implementation
-}
-</programlisting>
-
- <para>As you may have seen, <literal>@IdClass</literal> points to the
- corresponding primary key class.</para>
-
- <para>While not supported by the EJB3 specification, Hibernate allows
- you to define associations inside a composite identifier. Simply use the
- regular annotations for that</para>
-
- <programlisting>@Entity
- at AssociationOverride( name="id.channel", joinColumns = @JoinColumn(name="chan_id") )
-public class TvMagazin {
- @EmbeddedId public TvMagazinPk id;
- @Temporal(TemporalType.TIME) Date time;
-}
-
- at Embeddable
-public class TvMagazinPk implements Serializable {
- @ManyToOne
- public Channel channel;
- public String name;
- @ManyToOne
- public Presenter presenter;
-}
-</programlisting>
- </sect2>
-
- <sect2>
- <title>Mapping inheritance</title>
-
- <para>EJB3 supports the three types of inheritance:</para>
-
- <itemizedlist>
- <listitem>
- Table per Class Strategy: the <union-class> element in Hibernate
- </listitem>
-
- <listitem>
- Single Table per Class Hierarchy Strategy: the <subclass> element in Hibernate
- </listitem>
-
- <listitem>
- Joined Subclass Strategy: the <joined-subclass> element in Hibernate
- </listitem>
- </itemizedlist>
-
- <para>The chosen strategy is declared at the class level of the top
- level entity in the hierarchy using the <literal>@Inheritance</literal>
- annotation.</para>
-
- <note>
- <para>Annotating interfaces is currently not supported.</para>
- </note>
-
- <sect3>
- <title>Table per class</title>
-
- <para>This strategy has many drawbacks (esp. with polymorphic queries
- and associations) explained in the EJB3 spec, the Hibernate reference
- documentation, Hibernate in Action, and many other places. Hibernate
- work around most of them implementing this strategy using <literal>SQL
- UNION</literal> queries. It is commonly used for the top level of an
- inheritance hierarchy:</para>
-
- <programlisting>
- at Entity
- at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public class Flight implements Serializable {
- </programlisting>
-
- <para>This strategy support one to many associations provided that
- they are bidirectional. This strategy does not support the
- <literal>IDENTITY</literal> generator strategy: the id has to be
- shared across several tables. Consequently, when using this strategy,
- you should not use <literal>AUTO </literal>nor
- <literal>IDENTITY</literal>.</para>
- </sect3>
-
- <sect3>
- <title>Single table per class hierarchy</title>
-
- <para>All properties of all super- and subclasses are mapped into the
- same table, instances are distinguished by a special discriminator
- column:</para>
-
- <programlisting>
- at Entity
- at Inheritance(strategy=InheritanceType.SINGLE_TABLE)
- at DiscriminatorColumn(
- name="planetype",
- discriminatorType=DiscriminatorType.STRING
-)
- at DiscriminatorValue("Plane")
-public class Plane { ... }
-
- at Entity
- at DiscriminatorValue("A320")
-public class A320 extends Plane { ... }
- </programlisting>
-
- <para><classname>Plane</classname> is the superclass, it defines the
- inheritance strategy <literal>InheritanceType.SINGLE_TABLE</literal>.
- It also defines the discriminator column through the
- <literal>@DiscriminatorColumn</literal> annotation, a discriminator
- column can also define the discriminator type. Finally, the
- <literal>@DiscriminatorValue</literal> annotation defines the value
- used to differentiate a class in the hierarchy. All of these
- attributes have sensible default values. The default name of the
- discriminator column is <literal>DTYPE</literal>. The default
- discriminator value is the entity name (as defined in
- <literal>@Entity.name</literal>) for DiscriminatorType.STRING.
- <classname>A320</classname> is a subclass; you only have to define
- discriminator value if you don't want to use the default value. The
- strategy and the discriminator type are implicit.</para>
-
- <para><literal>@Inheritance</literal> and
- <literal>@DiscriminatorColumn</literal> should only be defined at the
- top of the entity hierarchy.</para>
- </sect3>
-
- <sect3>
- <title>Joined subclasses</title>
-
- <para>The<literal> @PrimaryKeyJoinColumn</literal> and
- <literal>@PrimaryKeyJoinColumns</literal> annotations define the
- primary key(s) of the joined subclass table:</para>
-
- <programlisting>
- at Entity
- at Inheritance(strategy=InheritanceType.JOINED)
-public class Boat implements Serializable { ... }
-
- at Entity
-public class Ferry extends Boat { ... }
-
- at Entity
- at PrimaryKeyJoinColumn(name="BOAT_ID")
-public class AmericaCupClass extends Boat { ... }
- </programlisting>
-
- <para>All of the above entities use the <literal>JOINED</literal>
- strategy, the <literal>Ferry</literal> table is joined with the
- <literal>Boat</literal> table using the same primary key names. The
- <literal>AmericaCupClass</literal> table is joined with
- <literal>Boat</literal> using the join condition <code>Boat.id =
- AmericaCupClass.BOAT_ID</code>.</para>
- </sect3>
-
- <sect3>
- <title>Inherit properties from superclasses</title>
-
- <para>This is sometimes useful to share common properties through a
- technical or a business superclass without including it as a regular
- mapped entity (ie no specific table for this entity). For that purpose
- you can map them as <literal>@MappedSuperclass</literal>.</para>
-
- <programlisting>@MappedSuperclass
-public class BaseEntity {
- @Basic
- @Temporal(TemporalType.TIMESTAMP)
- public Date getLastUpdate() { ... }
- public String getLastUpdater() { ... }
- ...
-}
-
- at Entity class Order extends BaseEntity {
- @Id public Integer getId() { ... }
- ...
-}</programlisting>
-
- <para>In database, this hierarchy will be represented as an
- <literal>Order</literal> table having the <literal>id</literal>,
- <literal>lastUpdate</literal> and <literal>lastUpdater</literal>
- columns. The embedded superclass property mappings are copied into
- their entity subclasses. Remember that the embeddable superclass is
- not the root of the hierarchy though.</para>
-
- <note>
- <para>Properties from superclasses not mapped as
- <literal>@MappedSuperclass</literal> are ignored.</para>
- </note>
-
- <note>
- <para>The access type (field or methods), is inherited from the root
- entity, unless you use the Hibernate annotation
- <literal>@AccessType</literal></para>
- </note>
-
- <note>
- <para>The same notion can be applied to
- <literal>@Embeddable</literal> objects to persist properties from
- their superclasses. You also need to use
- <literal>@MappedSuperclass</literal> to do that (this should not be
- considered as a standard EJB3 feature though)</para>
- </note>
-
- <note>
- <para>It is allowed to mark a class as
- <literal>@MappedSuperclass</literal> in the middle of the mapped
- inheritance hierarchy.</para>
- </note>
-
- <note>
- <para>Any class in the hierarchy non annotated with
- <literal>@MappedSuperclass</literal> nor <literal>@Entity</literal>
- will be ignored.</para>
- </note>
-
- <para>You can override columns defined in entity superclasses at the
- root entity level using the <literal>@AttributeOverride</literal>
- annotation.</para>
-
- <programlisting>@MappedSuperclass
-public class FlyingObject implements Serializable {
-
- public int getAltitude() {
- return altitude;
- }
-
- @Transient
- public int getMetricAltitude() {
- return metricAltitude;
- }
-
- @ManyToOne
- public PropulsionType getPropulsion() {
- return metricAltitude;
- }
- ...
-}
-
- at Entity
- at AttributeOverride( name="altitude", column = @Column(name="fld_altitude") )
- at AssociationOverride( name="propulsion", joinColumns = @JoinColumn(name="fld_propulsion_fk") )
-public class Plane extends FlyingObject {
- ...
-}</programlisting>
-
- <para>The <literal>altitude</literal> property will be persisted in an
- <literal>fld_altitude</literal> column of table
- <literal>Plane</literal> and the propulsion association will be
- materialized in a <literal>fld_propulsion_fk</literal> foreign key
- column.</para>
-
- <para>You can define <literal>@AttributeOverride</literal>(s) and
- <literal>@AssociationOverride</literal>(s) on
- <literal>@Entity</literal> classes,
- <literal>@MappedSuperclass</literal> classes and properties pointing
- to an <literal>@Embeddable</literal> object.</para>
- </sect3>
- </sect2>
-
- <sect2 id="entity-mapping-association">
- <title>Mapping entity bean associations/relationships</title>
-
- <sect3>
- <title>One-to-one</title>
-
- <para>You can associate entity beans through a one-to-one relationship
- using <literal>@OneToOne</literal>. There are three cases for
- one-to-one associations: either the associated entities share the same
- primary keys values, a foreign key is held by one of the entities
- (note that this FK column in the database should be constrained unique
- to simulate one-to-one multiplicity), or a association table is used
- to store the link between the 2 entities (a unique constraint has to
- be defined on each fk to ensure the one to one multiplicity)</para>
-
- <para>First, we map a real one-to-one association using shared primary
- keys:</para>
-
- <programlisting>
- at Entity
-public class Body {
- @Id
- public Long getId() { return id; }
-
- @OneToOne(cascade = CascadeType.ALL)
- @PrimaryKeyJoinColumn
- public Heart getHeart() {
- return heart;
- }
- ...
-}
- </programlisting>
-
- <programlisting>
- at Entity
-public class Heart {
- @Id
- public Long getId() { ...}
-}
- </programlisting>
-
- <para>The one to one is marked as true by using the
- <literal>@PrimaryKeyJoinColumn</literal> annotation.</para>
-
- <para>In the following example, the associated entities are linked
- through a foreign key column:</para>
-
- <programlisting>
- at Entity
-public class Customer implements Serializable {
- @OneToOne(cascade = CascadeType.ALL)
- <emphasis role="bold">@JoinColumn(name="passport_fk")</emphasis>
- public Passport getPassport() {
- ...
- }
-
- at Entity
-public class Passport implements Serializable {
- @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
- public Customer getOwner() {
- ...
-}
- </programlisting>
-
- <para>A <classname>Customer</classname> is linked to a
- <classname>Passport</classname>, with a foreign key column named
- <literal>passport_fk</literal> in the <literal>Customer</literal>
- table. The join column is declared with the
- <literal>@JoinColumn</literal> annotation which looks like the
- <literal>@Column</literal> annotation. It has one more parameters
- named <literal>referencedColumnName</literal>. This parameter declares
- the column in the targeted entity that will be used to the join. Note
- that when using
- <literal><literal>referencedColumnName</literal></literal> to a non
- primary key column, the associated class has to be
- <classname>Serializable</classname>. Also note that the
- <literal><literal>referencedColumnName</literal></literal> to a non
- primary key column has to be mapped to a property having a single
- column (other cases might not work).</para>
-
- <para>The association may be bidirectional. In a bidirectional
- relationship, one of the sides (and only one) has to be the owner: the
- owner is responsible for the association column(s) update. To declare
- a side as <emphasis>not</emphasis> responsible for the relationship,
- the attribute <literal>mappedBy</literal> is used.
- <literal>mappedBy</literal> refers to the property name of the
- association on the owner side. In our case, this is
- <literal>passport</literal>. As you can see, you don't have to (must
- not) declare the join column since it has already been declared on the
- owners side.</para>
-
- <para>If no <literal>@JoinColumn</literal> is declared on the owner
- side, the defaults apply. A join column(s) will be created in the
- owner table and its name will be the concatenation of the name of the
- relationship in the owner side, <keycap>_</keycap> (underscore), and
- the name of the primary key column(s) in the owned side. In this
- example <literal>passport_id</literal> because the property name is
- <literal>passport</literal> and the column id of <literal>Passport
- </literal>is <literal>id</literal>.</para>
-
- <para>The third possibility (using an association table) is very
- exotic.</para>
-
- <programlisting>
- at Entity
-public class Customer implements Serializable {
- @OneToOne(cascade = CascadeType.ALL)
- <emphasis role="bold">@JoinTable(name = "CustomerPassports"
- joinColumns = @JoinColumn(name="customer_fk"),
- inverseJoinColumns = @JoinColumns(name="passport_fk")</emphasis>
- )
- public Passport getPassport() {
- ...
- }
-
- at Entity
-public class Passport implements Serializable {
- @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
- public Customer getOwner() {
- ...
-}
- </programlisting>
-
- <para>A <classname>Customer</classname> is linked to a
- <classname>Passport</classname> through a association table named
- <literal>CustomerPassports</literal> ; this association table has a
- foreign key column named <literal>passport_fk</literal> pointing to
- the <literal>Passport</literal> table (materialized by the
- <literal>inverseJoinColumn</literal>, and a foreign key column named
- <literal>customer_fk</literal> pointing to the
- <literal>Customer</literal> table materialized by the
- <literal>joinColumns</literal> attribute.</para>
-
- <para>You must declare the join table name and the join columns
- explicitly in such a mapping.</para>
- </sect3>
-
- <sect3>
- <title>Many-to-one</title>
-
- <para>Many-to-one associations are declared at the property level with
- the annotation <literal>@ManyToOne</literal>:</para>
-
- <programlisting>
- at Entity()
-public class Flight implements Serializable {
- <emphasis role="bold">@ManyToOne</emphasis>( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
- @JoinColumn(name="COMP_ID")
- public Company getCompany() {
- return company;
- }
- ...
-}
- </programlisting>
-
- <para>The <literal>@JoinColumn</literal> attribute is optional, the
- default value(s) is like in one to one, the concatenation of the name
- of the relationship in the owner side, <keycap>_</keycap>
- (underscore), and the name of the primary key column in the owned
- side. In this example <literal>company_id</literal> because the
- property name is <literal>company</literal> and the column id of
- Company is <literal>id</literal>.</para>
-
- <para><literal>@ManyToOne</literal> has a parameter named
- <literal>targetEntity</literal> which describes the target entity
- name. You usually don't need this parameter since the default value
- (the type of the property that stores the association) is good in
- almost all cases. However this is useful when you want to use
- interfaces as the return type instead of the regular entity.</para>
-
- <programlisting>
- at Entity()
-public class Flight implements Serializable {
- @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, <emphasis
- role="bold">targetEntity=CompanyImpl.class</emphasis> )
- @JoinColumn(name="COMP_ID")
- public Company getCompany() {
- return company;
- }
- ...
-}
-
-public interface Company {
- ...
- </programlisting>
-
- <para>You can alse map a many to one association through an
- association table. This association table described by the
- <literal>@JoinTable</literal> annotation will contains a foreign key
- referencing back the entity table (through
- <literal>@JoinTable.joinColumns</literal>) and a a foreign key
- referencing the target entity table (through
- <literal>@JoinTable.inverseJoinColumns</literal>).</para>
-
- <programlisting>
- at Entity()
-public class Flight implements Serializable {
- @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
- <emphasis role="bold">@JoinTable(name="Flight_Company",
- joinColumns = @JoinColumn(name="FLIGHT_ID"),
- inverseJoinColumns = @JoinColumns(name="COMP_ID")
- )</emphasis>
- public Company getCompany() {
- return company;
- }
- ...
-}
- </programlisting>
- </sect3>
-
- <sect3 id="entity-mapping-association-collections" revision="1">
- <title>Collections</title>
-
- <sect4 id="entity-mapping-association-collections-overview"
- revision="1">
- <title>Overview</title>
-
- <para>You can map <classname>Collection</classname>,
- <literal>List</literal> (ie ordered lists, not indexed lists),
- <literal>Map</literal> and <classname>Set</classname>. The EJB3
- specification describes how to map an ordered list (ie a list
- ordered at load time) using
- <literal>@javax.persistence.OrderBy</literal> annotation: this
- annotation takes into parameter a list of comma separated (target
- entity) properties to order the collection by (eg <code>firstname
- asc, age desc</code>), if the string is empty, the collection will
- be ordered by id. For true indexed collections, please refer to the
- <xref linkend="entity-hibspec" />. EJB3 allows you to map Maps using
- as a key one of the target entity property using
- <literal>@MapKey(name="myProperty")</literal> (myProperty is a
- property name in the target entity). When using
- <literal>@MapKey</literal> (without property name), the target
- entity primary key is used. The map key uses the same column as the
- property pointed out: there is no additional column defined to hold
- the map key, and it does make sense since the map key actually
- represent a target property. Be aware that once loaded, the key is
- no longer kept in sync with the property, in other words, if you
- change the property value, the key will not change automatically in
- your Java model (for true map support please refers to <xref
- linkend="entity-hibspec" />). Many people confuse
- <literal><map></literal> capabilities and
- <literal>@MapKey</literal> ones. These are two different features.
- <literal>@MapKey</literal> still has some limitations, please check
- the forum or the JIRA tracking system for more informations.</para>
-
- <para>Hibernate has several notions of collections.</para>
-
- <para></para>
-
- <table>
- <title>Collections semantics</title>
-
- <tgroup cols="3">
- <colspec colname="c1" />
-
- <colspec colname="c2" />
-
- <colspec colname="c3" colnum="2" />
-
- <thead>
- <row>
- <entry>Semantic</entry>
-
- <entry>java representation</entry>
-
- <entry>annotations</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>Bag semantic</entry>
-
- <entry>java.util.List, java.util.Collection</entry>
-
- <entry>@org.hibernate.annotations.CollectionOfElements or
- @OneToMany or @ManyToMany</entry>
- </row>
-
- <row>
- <entry>Bag semantic with primary key (withtout the
- limitations of Bag semantic)</entry>
-
- <entry>java.util.List, java.util.Collection</entry>
-
- <entry>(@org.hibernate.annotations.CollectionOfElements or
- @OneToMany or @ManyToMany) and @CollectionId</entry>
- </row>
-
- <row>
- <entry>List semantic</entry>
-
- <entry>java.util.List</entry>
-
- <entry>(@org.hibernate.annotations.CollectionOfElements or
- @OneToMany or @ManyToMany) and
- @org.hibernate.annotations.IndexColumn</entry>
- </row>
-
- <row>
- <entry>Set semantic</entry>
-
- <entry>java.util.Set</entry>
-
- <entry>@org.hibernate.annotations.CollectionOfElements or
- @OneToMany or @ManyToMany</entry>
- </row>
-
- <row>
- <entry>Map semantic</entry>
-
- <entry>java.util.Map</entry>
-
- <entry>(@org.hibernate.annotations.CollectionOfElements or
- @OneToMany or @ManyToMany) and (nothing or
- @org.hibernate.annotations.MapKey/MapKeyManyToMany for true
- map support, OR @javax.persistence.MapKey</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <remark>So specifically, java.util.List collections without
- @org.hibernate.annotations.IndexColumn are going to be considered as
- bags.</remark>
-
- <para>Collection of primitive, core type or embedded objects is not
- supported by the EJB3 specification. Hibernate Annotations allows
- them however (see <xref linkend="entity-hibspec" />).</para>
-
- <programlisting>@Entity public class City {
- @OneToMany(mappedBy="city")
- <emphasis role="bold">@OrderBy("streetName")</emphasis>
- public List<Street> getStreets() {
- return streets;
- }
-...
-}
-
- at Entity public class Street {
- <emphasis role="bold">public String getStreetName()</emphasis> {
- return streetName;
- }
-
- @ManyToOne
- public City getCity() {
- return city;
- }
- ...
-}
-
-
- at Entity
-public class Software {
- @OneToMany(mappedBy="software")
- <emphasis role="bold">@MapKey(name="codeName")</emphasis>
- public Map<String, Version> getVersions() {
- return versions;
- }
-...
-}
-
- at Entity
- at Table(name="tbl_version")
-public class Version {
- <emphasis role="bold">public String getCodeName()</emphasis> {...}
-
- @ManyToOne
- public Software getSoftware() { ... }
-...
-}</programlisting>
-
- <para>So <literal>City</literal> has a collection of
- <literal>Street</literal>s that are ordered by
- <literal>streetName</literal> (of <literal>Street</literal>) when
- the collection is loaded. <literal>Software</literal> has a map of
- <literal>Version</literal>s which key is the
- <literal>Version</literal> <literal>codeName</literal>.</para>
-
- <para>Unless the collection is a generic, you will have to define
- <literal>targetEntity</literal>. This is a annotation attribute that
- take the target entity class as a value.</para>
- </sect4>
-
- <sect4 id="entity-mapping-association-collection-onetomany"
- revision="2">
- <title>One-to-many</title>
-
- <para>One-to-many associations are declared at the property level
- with the annotation <literal>@OneToMany</literal>. One to many
- associations may be bidirectional.</para>
-
- <sect5>
- <title>Bidirectional</title>
-
- <para>Since many to one are (almost) always the owner side of a
- bidirectional relationship in the EJB3 spec, the one to many
- association is annotated by <literal>@OneToMany( mappedBy=...
- )</literal></para>
-
- <programlisting>@Entity
-public class Troop {
- @OneToMany(mappedBy="troop")
- public Set<Soldier> getSoldiers() {
- ...
-}
-
- at Entity
-public class Soldier {
- @ManyToOne
- @JoinColumn(name="troop_fk")
- public Troop getTroop() {
- ...
-} </programlisting>
-
- <para><classname>Troop</classname> has a bidirectional one to many
- relationship with <literal>Soldier</literal> through the
- <literal>troop</literal> property. You don't have to (must not)
- define any physical mapping in the <literal>mappedBy</literal>
- side.</para>
-
- <para>To map a bidirectional one to many, with the one-to-many
- side as the owning side, you have to remove the
- <literal>mappedBy</literal> element and set the many to one
- <literal>@JoinColumn</literal> as insertable and updatable to
- false. This solution is obviously not optimized and will produce
- some additional UPDATE statements.</para>
-
- <programlisting>@Entity
-public class Troop {
- @OneToMany
- @JoinColumn(name="troop_fk") //we need to duplicate the physical information
- public Set<Soldier> getSoldiers() {
- ...
-}
-
- at Entity
-public class Soldier {
- @ManyToOne
- @JoinColumn(name="troop_fk", insertable=false, updatable=false)
- public Troop getTroop() {
- ...
-}</programlisting>
- </sect5>
-
- <sect5>
- <title>Unidirectional</title>
-
- <para>A unidirectional one to many using a foreign key column in
- the owned entity is not that common and not really recommended. We
- strongly advise you to use a join table for this kind of
- association (as explained in the next section). This kind of
- association is described through a
- <literal>@JoinColumn</literal></para>
-
- <programlisting>
- at Entity
-public class Customer implements Serializable {
- @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
- @JoinColumn(name="CUST_ID")
- public Set<Ticket> getTickets() {
- ...
-}
-
- at Entity
-public class Ticket implements Serializable {
- ... //no bidir
-}
- </programlisting>
-
- <para><literal>Customer</literal> describes a unidirectional
- relationship with <literal>Ticket</literal> using the join column
- <literal>CUST_ID</literal>.</para>
- </sect5>
-
- <sect5>
- <title>Unidirectional with join table</title>
-
- <para>A unidirectional one to many with join table is much
- preferred. This association is described through an
- <literal>@JoinTable</literal>.</para>
-
- <programlisting>
- at Entity
-public class Trainer {
- @OneToMany
- @JoinTable(
- name="TrainedMonkeys",
- joinColumns = { @JoinColumn( name="trainer_id") },
- inverseJoinColumns = @JoinColumn( name="monkey_id")
- )
- public Set<Monkey> getTrainedMonkeys() {
- ...
-}
-
- at Entity
-public class Monkey {
- ... //no bidir
-}
- </programlisting>
-
- <para><literal>Trainer</literal> describes a unidirectional
- relationship with <classname>Monkey</classname> using the join
- table <classname>TrainedMonkeys</classname>, with a foreign key
- <literal>trainer_id</literal> to <literal>Trainer</literal>
- (<literal>joinColumns</literal>) and a foreign key
- <literal>monkey_id</literal> to <literal>Monkey</literal>
- (<literal>inversejoinColumns</literal>).</para>
- </sect5>
-
- <sect5 id="entity-mapping-association-collection-manytomany-default"
- revision="1">
- <title>Defaults</title>
-
- <para>Without describing any physical mapping, a unidirectional
- one to many with join table is used. The table name is the
- concatenation of the owner table name, <keycap>_</keycap>, and the
- other side table name. The foreign key name(s) referencing the
- owner table is the concatenation of the owner table,
- <keycap>_</keycap>, and the owner primary key column(s) name. The
- foreign key name(s) referencing the other side is the
- concatenation of the owner property name, <keycap>_</keycap>, and
- the other side primary key column(s) name. A unique constraint is
- added to the foreign key referencing the other side table to
- reflect the one to many.</para>
-
- <programlisting>
- at Entity
-public class Trainer {
- @OneToMany
- public Set<Tiger> getTrainedTigers() {
- ...
-}
-
- at Entity
-public class Tiger {
- ... //no bidir
-}
- </programlisting>
-
- <para><classname>Trainer</classname> describes a unidirectional
- relationship with <classname>Tiger</classname> using the join
- table <literal>Trainer_Tiger</literal>, with a foreign key
- <literal>trainer_id</literal> to <literal>Trainer</literal> (table
- name, <keycap>_</keycap>, trainer id) and a foreign key
- <literal>trainedTigers_id</literal> to <literal>Monkey</literal>
- (property name, <keycap>_</keycap>, Tiger primary column).</para>
- </sect5>
- </sect4>
-
- <sect4 id="eentity-mapping-association-collection-manytomany"
- revision="">
- <title>Many-to-many</title>
-
- <sect5>
- <title>Definition</title>
-
- <para>A many-to-many association is defined logically using the
- <literal>@ManyToMany</literal> annotation. You also have to
- describe the association table and the join conditions using the
- <literal>@JoinTable</literal> annotation. If the association is
- bidirectional, one side has to be the owner and one side has to be
- the inverse end (ie. it will be ignored when updating the
- relationship values in the association table):</para>
-
- <programlisting>
- at Entity
-public class Employer implements Serializable {
- @ManyToMany(
- targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,
- cascade={CascadeType.PERSIST, CascadeType.MERGE}
- )
- @JoinTable(
- name="EMPLOYER_EMPLOYEE",
- joinColumns={@JoinColumn(name="EMPER_ID")},
- inverseJoinColumns={@JoinColumn(name="EMPEE_ID")}
- )
- public Collection getEmployees() {
- return employees;
- }
- ...
-}
- </programlisting>
-
- <programlisting>
- at Entity
-public class Employee implements Serializable {
- @ManyToMany(
- cascade={CascadeType.PERSIST, CascadeType.MERGE},
- mappedBy="employees"
- targetEntity=Employer.class
- )
- public Collection getEmployers() {
- return employers;
- }
-}
- </programlisting>
-
- <para>We've already shown the many declarations and the detailed
- attributes for associations. We'll go deeper in the
- <literal>@JoinTable</literal> description, it defines a
- <literal>name</literal>, an array of join columns (an array in
- annotation is defined using { A, B, C }), and an array of inverse
- join columns. The latter ones are the columns of the association
- table which refer to the <classname>Employee</classname> primary
- key (the "other side").</para>
-
- <para>As seen previously, the other side don't have to (must not)
- describe the physical mapping: a simple
- <literal>mappedBy</literal> argument containing the owner side
- property name bind the two.</para>
- </sect5>
-
- <sect5>
- <title>Default values</title>
-
- <para>As any other annotations, most values are guessed in a many
- to many relationship. Without describing any physical mapping in a
- unidirectional many to many the following rules applied. The table
- name is the concatenation of the owner table name,
- <keycap>_</keycap> and the other side table name. The foreign key
- name(s) referencing the owner table is the concatenation of the
- owner table name, <keycap>_</keycap> and the owner primary key
- column(s). The foreign key name(s) referencing the other side is
- the concatenation of the owner property name, <keycap>_</keycap>,
- and the other side primary key column(s). These are the same rules
- used for a unidirectional one to many relationship.</para>
-
- <programlisting>
- at Entity
-public class Store {
- @ManyToMany(cascade = CascadeType.PERSIST)
- public Set<City> getImplantedIn() {
- ...
- }
-}
-
- at Entity
-public class City {
- ... //no bidirectional relationship
-}
- </programlisting>
-
- <para>A <literal>Store_City</literal> is used as the join table.
- The <literal>Store_id</literal> column is a foreign key to the
- <literal>Store</literal> table. The
- <literal>implantedIn_id</literal> column is a foreign key to the
- <literal>City</literal> table.</para>
-
- <para>Without describing any physical mapping in a bidirectional
- many to many the following rules applied. The table name is the
- concatenation of the owner table name, <keycap>_</keycap> and the
- other side table name. The foreign key name(s) referencing the
- owner table is the concatenation of the other side property name,
- <keycap>_</keycap>, and the owner primary key column(s). The
- foreign key name(s) referencing the other side is the
- concatenation of the owner property name, <keycap>_</keycap>, and
- the other side primary key column(s). These are the same rules
- used for a unidirectional one to many relationship.</para>
-
- <programlisting>
- at Entity
-public class Store {
- @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
- public Set<Customer> getCustomers() {
- ...
- }
-}
-
- at Entity
-public class Customer {
- @ManyToMany(mappedBy="customers")
- public Set<Store> getStores() {
- ...
- }
-}
- </programlisting>
-
- <para>A <literal>Store_Customer</literal> is used as the join
- table. The <literal>stores_id</literal> column is a foreign key to
- the <literal>Store</literal> table. The
- <literal>customers_id</literal> column is a foreign key to the
- <literal>Customer</literal> table.</para>
- </sect5>
- </sect4>
- </sect3>
-
- <sect3>
- <title>Transitive persistence with cascading</title>
-
- <para>You probably have noticed the <literal>cascade</literal>
- attribute taking an array of <classname>CascadeType</classname> as a
- value. The cascade concept in EJB3 is very is similar to the
- transitive persistence and cascading of operations in Hibernate, but
- with slightly different semantics and cascading types:</para>
-
- <itemizedlist>
- <listitem>
- CascadeType.PERSIST: cascades the persist (create) operation to associated entities persist() is called or if the entity is managed
- </listitem>
-
- <listitem>
- CascadeType.MERGE: cascades the merge operation to associated entities if merge() is called or if the entity is managed
- </listitem>
-
- <listitem>
- CascadeType.REMOVE: cascades the remove operation to associated entities if delete() is called
- </listitem>
-
- <listitem>
- CascadeType.REFRESH: cascades the refresh operation to associated entities if refresh() is called
- </listitem>
-
- <listitem>
- CascadeType.ALL: all of the above
- </listitem>
- </itemizedlist>
-
- <para>Please refer to the chapter 6.3 of the EJB3 specification for
- more information on cascading and create/merge semantics.</para>
- </sect3>
-
- <sect3 id="entity-mapping-association-fetching" revision="1">
- <title>Association fetching</title>
-
- <para>You have the ability to either eagerly or lazily fetch
- associated entities. The <literal>fetch</literal> parameter can be set
- to <literal>FetchType.LAZY</literal> or
- <literal>FetchType.EAGER</literal>. <literal>EAGER</literal> will try
- to use an outer join select to retrieve the associated object, while
- <literal>LAZY</literal> will only trigger a select when the associated
- object is accessed for the first time. <literal>@OneToMany</literal>
- and <literal>@ManyToMany</literal> associations are defaulted to
- <literal>LAZY</literal> and <literal>@OneToOne</literal> and
- <literal>@ManyToOne</literal> are defaulted to
- <literal>EAGER</literal>. For more information about static fetching,
- check <xref linkend="entity-hibspec-singleassoc-fetching" />.</para>
-
- <para>The recommanded approach is to use <literal>LAZY</literal> onn
- all static fetching definitions and override this choice dynamically
- through JPA-QL. JPA-QL has a <literal>fetch</literal> keyword that
- allows you to override laziness when doing a particular query. This is
- very useful to improve performance and is decided on a use case to use
- case basis.</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Mapping composite primary and foreign keys</title>
-
- <para>Composite primary keys use a embedded class as the primary key
- representation, so you'd use the <literal>@Id</literal> and
- <literal>@Embeddable</literal> annotations. Alternatively, you can use
- the <literal>@EmbeddedId</literal> annotation. Note that the dependent
- class has to be serializable and implements
- <methodname>equals()</methodname>/<methodname>hashCode()</methodname>.
- You can also use <literal>@IdClass</literal> as described in <xref
- linkend="entity-mapping-identifier" />.</para>
-
- <programlisting>
- at Entity
-public class RegionalArticle implements Serializable {
-
- @Id
- public RegionalArticlePk getPk() { ... }
-}
-
- at Embeddable
-public class RegionalArticlePk implements Serializable { ... }
- </programlisting>
-
- <para>or alternatively</para>
-
- <programlisting>
- at Entity
-public class RegionalArticle implements Serializable {
-
- @EmbeddedId
- public RegionalArticlePk getPk() { ... }
-}
-
-public class RegionalArticlePk implements Serializable { ... }
- </programlisting>
-
- <para><literal>@Embeddable</literal> inherit the access type of its
- owning entity unless the Hibernate specific annotation
- <literal>@AccessType</literal> is used. Composite foreign keys (if not
- using the default sensitive values) are defined on associations using
- the <literal>@JoinColumns</literal> element, which is basically an array
- of <literal>@JoinColumn</literal>. It is considered a good practice to
- express <literal>referencedColumnNames</literal> explicitly. Otherwise,
- Hibernate will suppose that you use the same order of columns as in the
- primary key declaration.</para>
-
- <programlisting>
- at Entity
-public class Parent implements Serializable {
- @Id
- public ParentPk id;
- public int age;
-
- @OneToMany(cascade=CascadeType.ALL)
- @JoinColumns ({
- @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
- @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
- @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
- })
- public Set<Child> children; //unidirectional
- ...
-}
- </programlisting>
-
- <programlisting>
- at Entity
-public class Child implements Serializable {
- @Id @GeneratedValue
- public Integer id;
-
- @ManyToOne
- @JoinColumns ({
- @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
- @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
- @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
- })
- public Parent parent; //unidirectional
-}
- </programlisting>
-
- <programlisting>
- at Embeddable
-public class ParentPk implements Serializable {
- String firstName;
- String lastName;
- ...
-}
- </programlisting>
-
- <para>Note the explicit usage of the
- <literal>referencedColumnName</literal>.</para>
- </sect2>
-
- <sect2>
- <title>Mapping secondary tables</title>
-
- <para>You can map a single entity bean to several tables using the
- <literal>@SecondaryTable</literal> or
- <literal>@SecondaryTables</literal> class level annotations. To express
- that a column is in a particular table, use the <literal>table</literal>
- parameter of <literal>@Column</literal> or
- <literal>@JoinColumn</literal>.</para>
-
- <programlisting>
- at Entity
- at Table(name="MainCat")
-<emphasis role="bold">@SecondaryTables({
- @SecondaryTable(name="Cat1", pkJoinColumns={
- @PrimaryKeyJoinColumn(name="cat_id", referencedColumnName="id")
- ),
- @SecondaryTable(name="Cat2", uniqueConstraints={@UniqueConstraint(columnNames={"storyPart2"})})
-})</emphasis>
-public class Cat implements Serializable {
-
- private Integer id;
- private String name;
- private String storyPart1;
- private String storyPart2;
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- <emphasis role="bold">@Column(table="Cat1")</emphasis>
- public String getStoryPart1() {
- return storyPart1;
- }
-
- <emphasis role="bold">@Column(table="Cat2")</emphasis>
- public String getStoryPart2() {
- return storyPart2;
- }
-</programlisting>
-
- <para>In this example, <literal>name</literal> will be in
- <literal>MainCat</literal>. <literal>storyPart1</literal> will be in
- <literal>Cat1</literal> and <literal>storyPart2</literal> will be in
- <literal>Cat2</literal>. <literal>Cat1</literal> will be joined to
- <literal>MainCat</literal> using the <literal>cat_id</literal> as a
- foreign key, and <literal>Cat2</literal> using <literal>id</literal> (ie
- the same column name, the <literal>MainCat</literal> id column has).
- Plus a unique constraint on <literal>storyPart2</literal> has been
- set.</para>
-
- <para>Check out the JBoss EJB 3 tutorial or the Hibernate Annotations
- unit test suite for more examples.</para>
- </sect2>
- </sect1>
-
- <sect1 id="entity-mapping-query">
- <title>Mapping Queries</title>
-
- <sect2 id="entity-mapping-query-hql" label="Mapping JPAQL/HQL queries"
- revision="1">
- <title>Mapping JPAQL/HQL queries</title>
-
- <para>You can map EJBQL/HQL queries using annotations.
- <literal>@NamedQuery</literal> and <literal>@NamedQueries</literal> can
- be defined at the class level or in a JPA XML file. However their
- definitions are global to the session factory/entity manager factory
- scope. A named query is defined by its name and the actual query
- string.</para>
-
- <programlisting><entity-mappings>
- <named-query name="plane.getAll">
- <query>select p from Plane p</query>
- </named-query>
- ...
-</entity-mappings>
-...
-
- at Entity
- at NamedQuery(name="night.moreRecentThan", query="select n from Night n where n.date >= :date")
-public class Night {
- ...
-}
-
-public class MyDao {
- doStuff() {
- Query q = s.getNamedQuery("night.moreRecentThan");
- q.setDate( "date", aMonthAgo );
- List results = q.list();
- ...
- }
- ...
-}
- </programlisting>
-
- <para>You can also provide some hints to a query through an array of
- <literal>QueryHint</literal> through a <literal>hints</literal>
- attribute.</para>
-
- <para>The availabe Hibernate hints are</para>
-
- <para></para>
-
- <table>
- <title>Query hints</title>
-
- <tgroup cols="2">
- <thead>
- <colspec colname="c1" />
-
- <colspec colname="c2" colnum="2" />
-
- <row>
- <entry>hint</entry>
-
- <entry colname="c2">description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>org.hibernate.cacheable</entry>
-
- <entry>Whether the query should interact with the second level
- cache (defualt to false)</entry>
- </row>
-
- <row>
- <entry>org.hibernate.cacheRegion</entry>
-
- <entry>Cache region name (default used otherwise)</entry>
- </row>
-
- <row>
- <entry>org.hibernate.timeout</entry>
-
- <entry>Query timeout</entry>
- </row>
-
- <row>
- <entry>org.hibernate.fetchSize</entry>
-
- <entry>resultset fetch size</entry>
- </row>
-
- <row>
- <entry>org.hibernate.flushMode</entry>
-
- <entry>Flush mode used for this query</entry>
- </row>
-
- <row>
- <entry>org.hibernate.cacheMode</entry>
-
- <entry>Cache mode used for this query</entry>
- </row>
-
- <row>
- <entry>org.hibernate.readOnly</entry>
-
- <entry>Entities loaded by this query should be in read only mode
- or not (default to false)</entry>
- </row>
-
- <row>
- <entry>org.hibernate.comment</entry>
-
- <entry>Query comment added to the generated SQL</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect2>
-
- <sect2 id="entity-mapping-query-native" revision="2">
- <title>Mapping native queries</title>
-
- <para>You can also map a native query (ie a plain SQL query). To achieve
- that, you need to describe the SQL resultset structure using
- <literal>@SqlResultSetMapping</literal> (or
- <literal>@SqlResultSetMappings</literal> if you plan to define several
- resulset mappings). Like <literal>@NamedQuery</literal>, a
- <literal>@SqlResultSetMapping</literal> can be defined at class level or
- in a JPA XML file. However its scope is global to the
- application.</para>
-
- <para>As we will see, a <literal>resultSetMapping</literal> parameter is
- defined in <literal>@NamedNativeQuery</literal>, it represents the name
- of a defined <literal>@SqlResultSetMapping</literal>. The resultset
- mapping declares the entities retrieved by this native query. Each field
- of the entity is bound to an SQL alias (or column name). All fields of
- the entity including the ones of subclasses and the foreign key columns
- of related entities have to be present in the SQL query. Field
- definitions are optional provided that they map to the same column name
- as the one declared on the class property.</para>
-
- <para><programlisting>@NamedNativeQuery(name="night&area", query="select night.id nid, night.night_duration, "
- + " night.night_date, area.id aid, night.area_id, area.name "
- + "from Night night, Area area where night.area_id = area.id", <emphasis
- role="bold">resultSetMapping="joinMapping"</emphasis>)
- at SqlResultSetMapping(name="joinMapping", entities={
- @EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class, fields = {
- @FieldResult(name="id", column="nid"),
- @FieldResult(name="duration", column="night_duration"),
- @FieldResult(name="date", column="night_date"),
- @FieldResult(name="area", column="area_id"),
- discriminatorColumn="disc"
- }),
- @EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class, fields = {
- @FieldResult(name="id", column="aid"),
- @FieldResult(name="name", column="name")
- })
- }
-)</programlisting></para>
-
- <para>In the above example, the <literal>night&area</literal> named
- query use the <literal>joinMapping</literal> result set mapping. This
- mapping returns 2 entities, <literal>Night</literal> and
- <literal>Area</literal>, each property is declared and associated to a
- column name, actually the column name retrieved by the query. Let's now
- see an implicit declaration of the property / column.</para>
-
- <programlisting>@Entity
-<emphasis role="bold">@SqlResultSetMapping(name="implicit", entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class))
- at NamedNativeQuery(name="implicitSample", query="select * from SpaceShip", resultSetMapping="implicit")</emphasis>
-public class SpaceShip {
- private String name;
- private String model;
- private double speed;
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Column(name="model_txt")
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- public double getSpeed() {
- return speed;
- }
-
- public void setSpeed(double speed) {
- this.speed = speed;
- }
-}</programlisting>
-
- <para>In this example, we only describe the entity member of the result
- set mapping. The property / column mappings is done using the entity
- mapping values. In this case the <literal>model</literal> property is
- bound to the <literal>model_txt </literal>column. If the association to
- a related entity involve a composite primary key, a
- <literal>@FieldResult</literal> element should be used for each foreign
- key column. The <literal>@FieldResult</literal> name is composed of the
- property name for the relationship, followed by a dot ("."), followed by
- the name or the field or property of the primary key.</para>
-
- <programlisting>@Entity
- at SqlResultSetMapping(name="compositekey",
- entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class,
- fields = {
- @FieldResult(name="name", column = "name"),
- @FieldResult(name="model", column = "model"),
- @FieldResult(name="speed", column = "speed"),
-<emphasis role="bold"> @FieldResult(name="captain.firstname", column = "firstn"),
- @FieldResult(name="captain.lastname", column = "lastn"),</emphasis>
- @FieldResult(name="dimensions.length", column = "length"),
- @FieldResult(name="dimensions.width", column = "width")
- }),
- columns = { @ColumnResult(name = "surface"),
- @ColumnResult(name = "volume") } )
-
- at NamedNativeQuery(name="compositekey",
- query="select name, model, speed, lname as lastn, fname as firstn, length, width, length * width as surface from SpaceShip",
- resultSetMapping="compositekey")
-} )
-public class SpaceShip {
- private String name;
- private String model;
- private double speed;
- private Captain captain;
- private Dimensions dimensions;
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne(fetch= FetchType.LAZY)
- @JoinColumns( {
- @JoinColumn(name="fname", referencedColumnName = "firstname"),
- @JoinColumn(name="lname", referencedColumnName = "lastname")
- } )
- public Captain getCaptain() {
- return captain;
- }
-
- public void setCaptain(Captain captain) {
- this.captain = captain;
- }
-
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- public double getSpeed() {
- return speed;
- }
-
- public void setSpeed(double speed) {
- this.speed = speed;
- }
-
- public Dimensions getDimensions() {
- return dimensions;
- }
-
- public void setDimensions(Dimensions dimensions) {
- this.dimensions = dimensions;
- }
-}
-
- at Entity
- at IdClass(Identity.class)
-public class Captain implements Serializable {
- private String firstname;
- private String lastname;
-
- @Id
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- @Id
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-}
-</programlisting>
-
- <note>
- <para>If you look at the dimension property, you'll see that Hibernate
- supports the dotted notation for embedded objects (you can even have
- nested embedded objects). EJB3 implementations do not have to support
- this feature, we do :-)</para>
- </note>
-
- <para>If you retrieve a single entity and if you use the default
- mapping, you can use the <literal>resultClass</literal> attribute
- instead of <literal>resultSetMapping</literal>:</para>
-
- <programlisting><emphasis role="bold">@NamedNativeQuery(name="implicitSample", query="select * from SpaceShip",
- resultClass=SpaceShip.class)</emphasis>
-public class SpaceShip {</programlisting>
-
- <para>In some of your native queries, you'll have to return scalar
- values, for example when building report queries. You can map them in
- the <literal>@SqlResultsetMapping</literal> through
- <literal>@ColumnResult</literal>. You actually can even mix, entities
- and scalar returns in the same native query (this is probably not that
- common though).</para>
-
- <programlisting><emphasis role="bold">@SqlResultSetMapping(name="scalar", columns=@ColumnResult(name="dimension"))
- at NamedNativeQuery(name="scalar", query="select length*width as dimension from SpaceShip", resultSetMapping="scalar")</emphasis></programlisting>
-
- <para>An other query hint specific to native queries has been
- introduced: <literal>org.hibernate.callable</literal> which can be true
- or false depending on whether the query is a stored procedure or
- not.</para>
- </sect2>
- </sect1>
-
- <sect1 id="entity-hibspec" xreflabel="Hibernate Annotation Extensions">
- <title>Hibernate Annotation Extensions</title>
-
- <para>Hibernate 3.1 offers a variety of additional annotations that you
- can mix/match with your EJB 3 entities. They have been designed as a
- natural extension of EJB3 annotations.</para>
-
- <para>To empower the EJB3 capabilities, hibernate provides specific
- annotations that match hibernate features. The
- <classname>org.hibernate.annotations</classname> package contains all
- these annotations extensions.</para>
-
- <sect2 id="entity-hibspec-entity" revision="3">
- <title>Entity</title>
-
- <para>You can fine tune some of the actions done by Hibernate on
- entities beyond what the EJB3 spec offers.</para>
-
- <para><classname>@org.hibernate.annotations.Entity</classname> adds
- additional metadata that may be needed beyond what is defined in the
- standard <literal>@Entity</literal> <itemizedlist>
- <listitem>
- mutable: whether this entity is mutable or not
- </listitem>
-
- <listitem>
- dynamicInsert: allow dynamic SQL for inserts
- </listitem>
-
- <listitem>
- dynamicUpdate: allow dynamic SQL for updates
- </listitem>
-
- <listitem>
- selectBeforeUpdate: Specifies that Hibernate should never perform an SQL UPDATE unless it is certain that an object is actually modified.
- </listitem>
-
- <listitem>
- polymorphism: whether the entity polymorphism is of PolymorphismType.IMPLICIT (default) or PolymorphismType.EXPLICIT
- </listitem>
-
- <listitem>
- optimisticLock: optimistic locking strategy (OptimisticLockType.VERSION, OptimisticLockType.NONE, OptimisticLockType.DIRTY or OptimisticLockType.ALL)
- </listitem>
- </itemizedlist></para>
-
- <para><note>
- <para>@javax.persistence.Entity is still mandatory,
- @org.hibernate.annotations.Entity is not a replacement.</para>
- </note></para>
-
- <para>Here are some additional Hibernate annotation extensions</para>
-
- <para><literal>@org.hibernate.annotations.BatchSize</literal> allows you
- to define the batch size when fetching instances of this entity ( eg.
- <literal>@BatchSize(size=4)</literal> ). When loading a given entity,
- Hibernate will then load all the uninitialized entities of the same type
- in the persistence context up to the batch size.</para>
-
- <para><literal>@org.hibernate.annotations.Proxy</literal> defines the
- laziness attributes of the entity. lazy (default to true) define whether
- the class is lazy or not. proxyClassName is the interface used to
- generate the proxy (default is the class itself).</para>
-
- <para><literal>@org.hibernate.annotations.Where</literal> defines an
- optional SQL WHERE clause used when instances of this class is
- retrieved.</para>
-
- <para><literal>@org.hibernate.annotations.Check</literal> defines an
- optional check constraints defined in the DDL statetement.</para>
-
- <para><literal>@OnDelete(action=OnDeleteAction.CASCADE)</literal> on
- joined subclasses: use a SQL cascade delete on deletion instead of the
- regular Hibernate mechanism.</para>
-
- <para><literal>@Table(appliesTo="tableName", indexes = {
- @Index(name="index1", columnNames={"column1", "column2"} ) } )</literal>
- creates the defined indexes on the columns of table
- <literal>tableName</literal>. This can be applied on the primary table
- or any secondary table. The <literal>@Tables</literal> annotation allows
- your to apply indexes on different tables. This annotation is expected
- where <literal>@javax.persistence.Table</literal> or
- <literal>@javax.persistence.SecondaryTable</literal>(s) occurs.</para>
-
- <note>
- <para><literal>@org.hibernate.annotations.Table</literal> is a
- complement, not a replacement to
- <literal>@javax.persistence.Table</literal>. Especially, if you want
- to change the default name of a table, you must use
- <literal>@javax.persistence.Table</literal>, not
- <literal>@org.hibernate.annotations.Table</literal>.</para>
- </note>
-
- <para><literal>@org.hibernate.annotations.Table</literal> can also be
- used to define the following elements of secondary tables:</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>fetch</literal>: If set to JOIN, the default,
- Hibernate will use an inner join to retrieve a secondary table
- defined by a class or its superclasses and an outer join for a
- secondary table defined by a subclass. If set to select then
- Hibernate will use a sequential select for a secondary table defined
- on a subclass, which will be issued only if a row turns out to
- represent an instance of the subclass. Inner joins will still be
- used to retrieve a secondary defined by the class and its
- superclasses.</para>
- </listitem>
-
- <listitem>
- <para><literal>inverse</literal>: If true, Hibernate will not try to
- insert or update the properties defined by this join. Default to
- false.</para>
- </listitem>
-
- <listitem>
- <para><literal>optional</literal>: If enabled (the default),
- Hibernate will insert a row only if the properties defined by this
- join are non-null and will always use an outer join to retrieve the
- properties.</para>
- </listitem>
-
- <listitem>
- <para><literal>foreignKey</literal>: defines the Foreign Key name of
- a secondary table pointing back to the primary table.</para>
- </listitem>
- </itemizedlist>
-
- <para><literal>@Immutable</literal> marks an entity as immutable. The
- entity may not be updated or deleted by the application. This allows
- Hibernate to make some minor performance optimizations.</para>
-
- <para><literal>@Persister</literal> lets you define your own custom
- persistence strategy. You may, for example, specify your own subclass of
- <classname>org.hibernate.persister.EntityPersister</classname> or you
- might even provide a completely new implementation of the interface
- <literal>org.hibernate.persister.ClassPersister</literal> that
- implements persistence via, for example, stored procedure calls,
- serialization to flat files or LDAP.</para>
-
- <para><programlisting>@Entity
- at BatchSize(size=5)
- at org.hibernate.annotations.Entity(
- selectBeforeUpdate = true,
- dynamicInsert = true, dynamicUpdate = true,
- optimisticLock = OptimisticLockType.ALL,
- polymorphism = PolymorphismType.EXPLICIT)
- at Where(clause="1=1")
- at org.hibernate.annotations.Table(name="Forest", indexes = { @Index(name="idx", columnNames = { "name", "length" } ) } )
- at Persister(impl=MyEntityPersister.class)
-public class Forest { ... }</programlisting><programlisting>@Entity
- at Inheritance(
- strategy=InheritanceType.JOINED
-)
-public class Vegetable { ... }
-
- at Entity
- at OnDelete(action=OnDeleteAction.CASCADE)
-public class Carrot extends Vegetable { ... }</programlisting></para>
- </sect2>
-
- <sect2 id="entity-hibspec-identifier" label="Identifier" revision="1">
- <title>Identifier</title>
-
- <para><literal><literal>@org.hibernate.annotations.GenericGenerator</literal>
- allows you to define an Hibernate specific id
- generator.</literal></para>
-
- <para><programlisting>@Id @GeneratedValue(generator="system-uuid")
- at GenericGenerator(name="system-uuid", strategy = "uuid")
-public String getId() {
-
- at Id @GeneratedValue(generator="hibseq")
- at GenericGenerator(name="hibseq", strategy = "seqhilo",
- parameters = {
- @Parameter(name="max_lo", value = "5"),
- @Parameter(name="sequence", value="heybabyhey")
- }
-)
-public Integer getId() {</programlisting></para>
-
- <para><literal>strategy</literal> is the short name of an Hibernate3
- generator strategy or the fully qualified class name of an
- <classname>IdentifierGenerator</classname> implementation. You can add
- some parameters through the <literal>parameters</literal>
- attribute.</para>
-
- <para>Contrary to its standard counterpart,
- <literal>@GenericGenerator</literal> can be used in package level
- annotations, making it an application level generator (just like if it
- were in a JPA XML file).</para>
-
- <programlisting>@GenericGenerator(name="hibseq", strategy = "seqhilo",
- parameters = {
- @Parameter(name="max_lo", value = "5"),
- @Parameter(name="sequence", value="heybabyhey")
- }
-)
-package org.hibernate.test.model</programlisting>
- </sect2>
-
- <sect2 id="entity-hibspec-property" revision="2">
- <title>Property</title>
-
- <sect3>
- <title>Access type</title>
-
- <para>The access type is guessed from the position of
- <literal>@Id</literal> or <literal>@EmbeddedId</literal> in the entity
- hierarchy. Sub-entities, embedded objects and mapped superclass
- inherit the access type from the root entity.</para>
-
- <para>In Hibernate, you can override the access type to:</para>
-
- <itemizedlist>
- <listitem>
- <para>use a custom access type strategy</para>
- </listitem>
-
- <listitem>
- <para>fine tune the access type at the class level or at the
- property level</para>
- </listitem>
- </itemizedlist>
-
- <para>An @AccessType annotation has been introduced to support this
- behavior. You can define the access type on</para>
-
- <itemizedlist>
- <listitem>
- <para>an entity</para>
- </listitem>
-
- <listitem>
- <para>a superclass</para>
- </listitem>
-
- <listitem>
- <para>an embeddable object</para>
- </listitem>
-
- <listitem>
- <para>a property</para>
- </listitem>
- </itemizedlist>
-
- <para>The access type is overriden for the annotated element, if
- overriden on a class, all the properties of the given class inherit
- the access type. For root entities, the access type is considered to
- be the default one for the whole hierarchy (overridable at class or
- property level).</para>
-
- <para>If the access type is marked as "property", the getters are
- scanned for annotations, if the access type is marked as "field", the
- fields are scanned for annotations. Otherwise the elements marked with
- @Id or @embeddedId are scanned.</para>
-
- <para>You can override an access type for a property, but the element
- to annotate will not be influenced: for example an entity having
- access type <literal>field</literal>, can annotate a field with
- <literal>@AccessType("property")</literal>, the access type will then
- be property for this attribute, the the annotations still have to be
- carried on the field.</para>
-
- <para>If a superclass or an embeddable object is not annotated, the
- root entity access type is used (even if an access type has been
- define on an intermediate superclass or embeddable object). The
- russian doll principle does not apply.</para>
-
- <programlisting>@Entity
-public class Person implements Serializable {
- @Id @GeneratedValue //access type field
- Integer id;
-
- @Embedded
- @AttributeOverrides({
- @AttributeOverride(name = "iso2", column = @Column(name = "bornIso2")),
- @AttributeOverride(name = "name", column = @Column(name = "bornCountryName"))
- })
- Country bornIn;
-}
-
- at Embeddable
-<emphasis role="bold">@AccessType("property")</emphasis> //override access type for all properties in Country
-public class Country implements Serializable {
- private String iso2;
- private String name;
-
- public String getIso2() {
- return iso2;
- }
-
- public void setIso2(String iso2) {
- this.iso2 = iso2;
- }
-
- @Column(name = "countryName")
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
-</programlisting>
- </sect3>
-
- <sect3>
- <title>Formula</title>
-
- <para>Sometimes, you want the Database to do some computation for you
- rather than in the JVM, you might also create some kind of virtual
- column. You can use a SQL fragment (aka formula) instead of mapping a
- property into a column. This kind of property is read only (its value
- is calculated by your formula fragment).</para>
-
- <programlisting>@Formula("obj_length * obj_height * obj_width")
-public long getObjectVolume()</programlisting>
-
- <para>The SQL fragment can be as complex as you want avec even include
- subselects.</para>
- </sect3>
-
- <sect3>
- <title>Type</title>
-
- <para><literal>@org.hibernate.annotations.Type</literal> overrides the
- default hibernate type used: this is generally not necessary since the
- type is correctly inferred by Hibernate. Please refer to the Hibernate
- reference guide for more informations on the Hibernate types.</para>
-
- <para><literal>@org.hibernate.annotations.TypeDef</literal> and
- <literal>@org.hibernate.annotations.TypeDefs</literal> allows you to
- declare type definitions. These annotations are placed at the class or
- package level. Note that these definitions will be global for the
- session factory (even at the class level) and that type definition has
- to be defined before any usage.</para>
-
- <programlisting>@TypeDefs(
- {
- @TypeDef(
- name="caster",
- typeClass = CasterStringType.class,
- parameters = {
- @Parameter(name="cast", value="lower")
- }
- )
- }
-)
-package org.hibernate.test.annotations.entity;
-
-...
-public class Forest {
- @Type(type="caster")
- public String getSmallText() {
- ...
-}
- </programlisting>
-
- <para>When using composite user type, you will have to express column
- definitions. The <literal>@Columns</literal> has been introduced for
- that purpose.</para>
-
- <programlisting>@Type(type="org.hibernate.test.annotations.entity.MonetaryAmountUserType")
- at Columns(columns = {
- @Column(name="r_amount"),
- @Column(name="r_currency")
-})
-public MonetaryAmount getAmount() {
- return amount;
-}
-
-
-public class MonetaryAmount implements Serializable {
- private BigDecimal amount;
- private Currency currency;
- ...
-}</programlisting>
- </sect3>
-
- <sect3>
- <title>Index</title>
-
- <para>You can define an index on a particular column using the
- <literal>@Index</literal> annotation on a one column property, the
- columnNames attribute will then be ignored</para>
-
- <programlisting>@Column(secondaryTable="Cat1")
- at Index(name="story1index")
-public String getStoryPart1() {
- return storyPart1;
-}</programlisting>
- </sect3>
-
- <sect3>
- <title>@Parent</title>
-
- <para>When inside an embeddable object, you can define one of the
- properties as a pointer back to the owner element.</para>
-
- <programlisting>@Entity
-public class Person {
- @Embeddable public Address address;
- ...
-}
-
- at Embeddable
-public class Address {
- @Parent public Person owner;
- ...
-}
-
-
-person == person.address.owner</programlisting>
- </sect3>
-
- <sect3>
- <title>Generated properties</title>
-
- <para>Some properties are generated at insert or update time by your
- database. Hibernate can deal with such properties and triggers a
- subsequent select to read these properties.</para>
-
- <programlisting>@Entity
-public class Antenna {
- @Id public Integer id;
- @Generated(GenerationTime.ALWAYS) @Column(insertable = false, updatable = false)
- public String longitude;
-
- @Generated(GenerationTime.INSERT) @Column(insertable = false)
- public String latitude;
-}</programlisting>
-
- <para>Annotate your property as <literal>@Generated</literal> You have
- to make sure your insertability or updatability does not conflict with
- the generation strategy you have chosen. When GenerationTime.INSERT is
- chosen, the property must not contains insertable columns, when
- GenerationTime.ALWAYS is chosen, the property must not contains
- insertable nor updatable columns.</para>
-
- <para><literal>@Version</literal> properties cannot be
- <literal>@Generated(INSERT)</literal> by design, it has to be either
- <literal>NEVER</literal> or <literal>ALWAYS</literal>.</para>
- </sect3>
-
- <sect3>
- <title>@Target</title>
-
- <para>Sometimes, the type guessed by reflection is not the one you
- want Hibernate to use. This is especially true on components when an
- interface is used. You can use <literal>@Target</literal> to by pass
- the reflection guessing mechanism (very much like the
- <literal>targetEntity</literal> attribute available on
- associations.</para>
-
- <programlisting> @Embedded
- <emphasis role="bold">@Target(OwnerImpl.class)</emphasis>
- public Owner getOwner() {
- return owner;
- }</programlisting>
-
- <para></para>
- </sect3>
-
- <sect3>
- <title>Optimistic lock</title>
-
- <para>It is sometimes useful to avoid increasing the version number
- even if a given property is dirty (particularly collections). You can
- do that by annotating the property (or collection) with
- <literal>@OptimisticLock(excluded=true)</literal>.</para>
-
- <para>More formally, specifies that updates to this property do not
- require acquisition of the optimistic lock.</para>
- </sect3>
- </sect2>
-
- <sect2 id="entity-hibspec-inheritance" revision="3">
- <title>Inheritance</title>
-
- <para>SINGLE_TABLE is a very powerful strategy but sometimes, and
- especially for legacy systems, you cannot add an additional
- discriminator column. For that purpose Hibernate has introduced the
- notion of discriminator formula:
- <literal>@DiscriminatorFormula</literal> is a replacement of
- <literal>@DiscriminatorColumn</literal> and use a SQL fragment as a
- formula for discriminator resolution (no need to have a dedicated
- column).</para>
-
- <programlisting>@Entity
-<emphasis role="bold">@DiscriminatorFormula("case when forest_type is null then 0 else forest_type end")</emphasis>
-public class Forest { ... }</programlisting>
-
- <para>By default, when querying the top entities, Hibernate does not put
- a restriction clause on the discriminator column. This can be
- inconvenient if this column contains values not mapped in your hierarchy
- (through <literal>@DiscriminatorValue</literal>). To work around that
- you can use <literal>@ForceDiscriminator</literal> (at the class level,
- next to <literal>@DiscriminatorColumn</literal>). Hibernate will then
- list the available values when loading the entities.</para>
-
- <para>You can define the foreign key name generated by Hibernate for
- subclass tables in the JOINED inheritance strategy.</para>
-
- <programlisting>@Entity
- at Inheritance(strategy = InheritanceType.JOINED)
-public abstract class File { ... }
-
- at Entity
- at ForeignKey(name = "FK_DOCU_FILE")
-public class Document extends File {</programlisting>
-
- <para>The foreign key from the <literal>Document</literal> table to the
- <literal>File</literal> table will be named
- <literal>FK_DOCU_FILE</literal>.</para>
- </sect2>
-
- <sect2 id="entity-hibspec-singleassoc">
- <title>Single Association related annotations</title>
-
- <para>By default, when Hibernate cannot resolve the association because
- the expected associated element is not in database (wrong id on the
- association column), an exception is raised by Hibernate. This might be
- inconvenient for lecacy and badly maintained schemas. You can ask
- Hibernate to ignore such elements instead of raising an exception using
- the <literal>@NotFound</literal> annotation. This annotation can be used
- on a <literal>@OneToOne</literal> (with FK),
- <literal>@ManyToOne</literal>, <literal>@OneToMany</literal> or
- <literal>@ManyToMany</literal> association.</para>
-
- <programlisting>@Entity
-public class Child {
- ...
- @ManyToOne
- @NotFound(action=NotFoundAction.IGNORE)
- public Parent getParent() { ... }
- ...
-}</programlisting>
-
- <para>Sometimes you want to delegate to your database the deletion of
- cascade when a given entity is deleted.</para>
-
- <programlisting>@Entity
-public class Child {
- ...
- @ManyToOne
- @OnDelete(action=OnDeleteAction.CASCADE)
- public Parent getParent() { ... }
- ...
-}</programlisting>
-
- <para>In this case Hibernate generates a cascade delete constraint at
- the database level.</para>
-
- <para>Foreign key constraints, while generated by Hibernate, have a
- fairly unreadable name. You can override the constraint name by use
- <literal>@ForeignKey</literal>.</para>
-
- <programlisting>@Entity
-public class Child {
- ...
- @ManyToOne
- <emphasis role="bold">@ForeignKey(name="FK_PARENT")</emphasis>
- public Parent getParent() { ... }
- ...
-}
-
-alter table Child add constraint FK_PARENT foreign key (parent_id) references Parent</programlisting>
-
- <sect3 id="entity-hibspec-singleassoc-fetching"
- label="Lazy options and fetching modes">
- <title>Lazy options and fetching modes</title>
-
- <para>EJB3 comes with the <literal>fetch</literal> option to define
- lazy loading and fetching modes, however Hibernate has a much more
- option set in this area. To fine tune the lazy loading and fetching
- strategies, some additional annotations have been introduced:</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>@LazyToOne</literal>: defines the lazyness option
- on <literal>@ManyToOne</literal> and <literal>@OneToOne</literal>
- associations. <literal>LazyToOneOption</literal> can be
- <literal>PROXY</literal> (ie use a proxy based lazy loading),
- <literal>NO_PROXY</literal> (use a bytecode enhancement based lazy
- loading - note that build time bytecode processing is necessary)
- and <literal>FALSE</literal> (association not lazy)</para>
- </listitem>
-
- <listitem>
- <para><literal>@LazyCollection</literal>: defines the lazyness
- option on <literal>@ManyTo</literal>Many and
- <literal>@OneToMany</literal> associations. LazyCollectionOption
- can be <literal>TRUE</literal> (the collection is lazy and will be
- loaded when its state is accessed), <literal>EXTRA</literal> (the
- collection is lazy and all operations will try to avoid the
- collection loading, this is especially useful for huge collections
- when loading all the elements is not necessary) and FALSE
- (association not lazy)</para>
- </listitem>
-
- <listitem>
- <para><literal>@Fetch</literal>: defines the fetching strategy
- used to load the association. <literal>FetchMode</literal> can be
- <literal>SELECT</literal> (a select is triggered when the
- association needs to be loaded), <literal>SUBSELECT</literal>
- (only available for collections, use a subselect strategy - please
- refers to the Hibernate Reference Documentation for more
- information) or <literal>JOIN</literal> (use a SQL JOIN to load
- the association while loading the owner entity).
- <literal>JOIN</literal> overrides any lazy attribute (an
- association loaded through a <literal>JOIN</literal> strategy
- cannot be lazy).</para>
- </listitem>
- </itemizedlist>
-
- <para>The Hibernate annotations overrides the EJB3 fetching
- options.</para>
-
- <table>
- <title>Lazy and fetch options equivalent</title>
-
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Annotations</entry>
-
- <entry>Lazy</entry>
-
- <entry>Fetch</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>@[One|Many]ToOne](fetch=FetchType.LAZY)</entry>
-
- <entry>@LazyToOne(PROXY)</entry>
-
- <entry>@Fetch(SELECT)</entry>
- </row>
-
- <row>
- <entry>@[One|Many]ToOne](fetch=FetchType.EAGER)</entry>
-
- <entry>@LazyToOne(FALSE)</entry>
-
- <entry>@Fetch(JOIN)</entry>
- </row>
-
- <row>
- <entry>@ManyTo[One|Many](fetch=FetchType.LAZY)</entry>
-
- <entry>@LazyCollection(TRUE)</entry>
-
- <entry>@Fetch(SELECT)</entry>
- </row>
-
- <row>
- <entry>@ManyTo[One|Many](fetch=FetchType.EAGER)</entry>
-
- <entry>@LazyCollection(FALSE)</entry>
-
- <entry>@Fetch(JOIN)</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect3>
- </sect2>
-
- <sect2 id="entity-hibspec-collection" revision="2">
- <title>Collection related annotations</title>
-
- <sect3 id="entity-hibspec-collection-enhance" revision="3">
- <title>Enhance collection settings</title>
-
- <para>It is possible to set <itemizedlist>
- <listitem>
- the batch size for collections using @BatchSize
- </listitem>
-
- <listitem>
- the where clause, using @Where (applied on the target entity) or @WhereJoinTable (applied on the association table)
- </listitem>
-
- <listitem>
- the check clause, using @Check
- </listitem>
-
- <listitem>
- the SQL order by clause, using @OrderBy
- </listitem>
-
- <listitem>
- the delete cascade strategy through @OnDelete(action=OnDeleteAction.CASCADE)
- </listitem>
-
- <listitem>
- the collection immutability using @Immutable: if set specifies that the elements of the collection never change (a minor performance optimization in some cases)
- </listitem>
-
- <listitem>
- <para>a custom collection persister (ie the persistence strategy
- used) using <literal>@Persister</literal>: the class must
- implement
- <classname>org.hibernate.persister.collectionCollectionPersister</classname>
- </para>
- </listitem>
- </itemizedlist></para>
-
- <para>You can also declare a sort comparator. Use the
- <literal>@Sort</literal> annotation. Expressing the comparator type
- you want between unsorted, natural or custom comparator. If you want
- to use your own comparator implementation, you'll also have to express
- the implementation class using the <literal>comparator</literal>
- attribute. Note that you need to use either a
- <classname>SortedSet</classname> or a <classname>SortedMap</classname>
- interface.</para>
-
- <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
- @JoinColumn(name="CUST_ID")
- @Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
- @Where(clause="1=1")
- @OnDelete(action=OnDeleteAction.CASCADE)
- public SortedSet<Ticket> getTickets() {
- return tickets;
- }</programlisting>
-
- <para>Please refer to the previous descriptions of these annotations
- for more informations.</para>
-
- <para>Foreign key constraints, while generated by Hibernate, have a
- fairly unreadable name. You can override the constraint name by use
- <literal>@ForeignKey</literal>. Note that this annotation has to be
- placed on the owning side of the relationship,
- <literal>inverseName</literal> referencing to the other side
- constraint.</para>
-
- <programlisting>@Entity
-public class Woman {
- ...
- @ManyToMany(cascade = {CascadeType.ALL})
- <emphasis role="bold">@ForeignKey(name = "TO_WOMAN_FK", inverseName = "TO_MAN_FK")</emphasis>
- public Set<Man> getMens() {
- return mens;
- }
-}
-
-alter table Man_Woman add constraint TO_WOMAN_FK foreign key (woman_id) references Woman
-alter table Man_Woman add constraint TO_MAN_FK foreign key (man_id) references Man</programlisting>
- </sect3>
-
- <sect3 id="entity-hibspec-collection-extratype" revision="1">
- <title>Extra collection types</title>
-
- <sect4>
- <title>List</title>
-
- <para>Beyond EJB3, Hibernate Annotations supports true
- <classname>List</classname> and <classname>Array</classname>. Map
- your collection the same way as usual and add the
- @<literal>IndexColumn</literal>. This annotation allows you to
- describe the column that will hold the index. You can also declare
- the index value in DB that represent the first element (aka as base
- index). The usual value is <literal>0</literal> or
- <literal>1</literal>.</para>
-
- <programlisting>@OneToMany(cascade = CascadeType.ALL)
- at IndexColumn(name = "drawer_position", base=1)
-public List<Drawer> getDrawers() {
- return drawers;
-}</programlisting>
-
- <note>
- <para>If you forgot to set <literal>@IndexColumn</literal>, the
- bag semantic is applied. If you want the bag semantic without the
- limitations of it, consider using
- <literal>@CollectionId</literal>.</para>
- </note>
- </sect4>
-
- <sect4 id="entity-hibspec-collection-extratype-map" revision="1">
- <title>Map</title>
-
- <para>Hibernate Annotations also supports true Map mappings, if
- <literal>@javax.persistence.MapKey</literal> is not set, hibernate
- will map the key element or embeddable object in its/their own
- columns. To overrides the default columns, you can use
- <literal>@org.hibernate.annotations.MapKey</literal> if your key is
- a basic type (defaulted to <literal>mapkey</literal>) or an
- embeddable object, or you can use
- <literal>@org.hibernate.annotations.MapKeyManyToMany</literal> if
- your key is an entity.</para>
-
- <para>Both <literal>@org.hibernate.annotations.MapKey</literal> and
- <literal>@org.hibernate.annotations.MapKeyManyToMany</literal>
- allows you to override the target element to be used. This is
- especially useful if your collection does not use generics (or if
- you use interfaces).</para>
-
- <programlisting> @CollectionOfElements(targetElement = SizeImpl.class)
- @MapKeyManyToMany(<emphasis role="bold">targetEntity = LuggageImpl.class</emphasis>)
- private Map<Luggage, Size> sizePerLuggage = new HashMap<Luggage, Size>();</programlisting>
-
- <para></para>
- </sect4>
-
- <sect4 id="entity-hibspec-collection-extratype-indexbidir">
- <title>Bidirectional association with indexed collections</title>
-
- <para>A bidirectional association where one end is represented as a
- <literal>@IndexColumn</literal> or
- <literal>@org.hibernate.annotations.MapKey[ManyToMany]</literal>
- requires special consideration. If there is a property of the child
- class which maps to the index column, no problem, we can continue
- using <literal>mappedBy</literal> on the collection mapping:</para>
-
- <programlisting>@Entity
-public class Parent {
- @OneToMany(mappedBy="parent")
- @org.hibernate.annotations.MapKey(columns=@Column(name="name"))
- private Map<String, Child> children;
- ...
-}
-
- at Entity
-public class Parent {
- ...
- @Basic
- private String name;
-
- @ManyToOne
- @JoinColumn(name="parent_id", nullable=false)
- private Parent parent;
- ...
-}</programlisting>
-
- <para>But, if there is no such property on the child class, we can't
- think of the association as truly bidirectional (there is
- information available at one end of the association that is not
- available at the other end). In this case, we can't map the
- collection <literal>mappedBy</literal>. Instead, we could use the
- following mapping:</para>
-
- <programlisting>@Entity
-public class Parent {
- @OneToMany
- @org.hibernate.annotations.MapKey(columns=@Column(name="name"))
- @JoinColumn(name="parent_id", nullable=false)
- private Map<String, Child> children;
- ...
-}
-
- at Entity
-public class Parent {
- ...
- @ManyToOne
- @JoinColumn(name="parent_id", insertable=false, updatable=false, nullable=false)
- private Parent parent;
- ...
-}</programlisting>
-
- <para>Note that in this mapping, the collection-valued end of the
- association is responsible for updates to the foreign key.</para>
- </sect4>
-
- <sect4>
- <title>Bag with primary key</title>
-
- <para>Another interesting feature is the ability to define a
- surrogate primary key to a bag collection. This remove pretty much
- all of the drawbacks of bags: update and removal are efficient, more
- than one <literal>EAGER</literal> bag per query or per entity. This
- primary key will be contained in a additional column of your
- collection table but will not be visible to the Java application.
- @CollectionId is used to mark a collection as id bag, it also allow
- to override the primary key column(s), the primary key type and the
- generator strategy. The strategy can be <literal>identity</literal>,
- or any defined generator name of your application.</para>
-
- <programlisting>@Entity
- at TableGenerator(name="ids_generator", table="IDS")
-public class Passport {
- ...
-
- @ManyToMany(cascade = CascadeType.ALL)
- @JoinTable(name="PASSPORT_VISASTAMP")
- <emphasis role="bold">@CollectionId(
- columns = @Column(name="COLLECTION_ID"),
- type=@Type(type="long"),
- generator = "ids_generator"
- )</emphasis>
- private Collection<Stamp> visaStamp = new ArrayList();
- ...
-}</programlisting>
- </sect4>
-
- <sect4>
- <title>Collection of element or composite elements</title>
-
- <para>Hibernate Annotations also supports collections of core types
- (Integer, String, Enums, ...), collections of embeddable objects and
- even arrays of primitive types. This is known as collection of
- elements.</para>
-
- <para>A collection of elements has to be annotated as
- <literal>@CollectionOfElements</literal> (as a replacement of
- <literal>@OneToMany</literal>) To define the collection table, the
- <literal>@JoinTable</literal> annotation is used on the association
- property, <literal>joinColumns</literal> defines the join columns
- between the entity primary table and the collection table
- (inverseJoincolumn is useless and should be left empty). For
- collection of core types or array of primitive types, you can
- override the element column definition using a
- <literal>@Column</literal> on the association property. You can also
- override the columns of a collection of embeddable object using
- <literal>@AttributeOverride</literal>. To reach the collection
- element, you need to append "element" to the attribute override name
- (eg "element" for core types, or "element.serial" for the serial
- property of an embeddable element). To reach the index/key of a
- collection, append "key" instead.</para>
-
- <programlisting>@Entity
-public class Boy {
- private Integer id;
- private Set<String> nickNames = new HashSet<String>();
- private int[] favoriteNumbers;
- private Set<Toy> favoriteToys = new HashSet<Toy>();
- private Set<Character> characters = new HashSet<Character>();
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- <emphasis role="bold">@CollectionOfElements
- public Set<String></emphasis> getNickNames() {
- return nickNames;
- }
-
- <emphasis role="bold">@CollectionOfElements
- @JoinTable(
- table=@Table(name="BoyFavoriteNumbers"),
- joinColumns = @JoinColumn(name="BoyId")
- )
- @Column(name="favoriteNumber", nullable=false)</emphasis>
- @IndexColumn(name="nbr_index")
- public int[] getFavoriteNumbers() {
- return favoriteNumbers;
- }
-
- <emphasis role="bold">@CollectionOfElements
- @AttributeOverride( name="element.serial", column=@Column(name="serial_nbr") )</emphasis>
- public Set<Toy> getFavoriteToys() {
- return favoriteToys;
- }
-
- <emphasis role="bold">@CollectionOfElements
- public Set<Character></emphasis> getCharacters() {
- return characters;
- }
- ...
-}
-
-public enum Character {
- GENTLE,
- NORMAL,
- AGGRESSIVE,
- ATTENTIVE,
- VIOLENT,
- CRAFTY
-}
-
- at Embeddable
-public class Toy {
- public String name;
- public String serial;
- public Boy owner;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getSerial() {
- return serial;
- }
-
- public void setSerial(String serial) {
- this.serial = serial;
- }
-
- <emphasis role="bold">@Parent</emphasis>
- public Boy getOwner() {
- return owner;
- }
-
- public void setOwner(Boy owner) {
- this.owner = owner;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final Toy toy = (Toy) o;
-
- if ( !name.equals( toy.name ) ) return false;
- if ( !serial.equals( toy.serial ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = name.hashCode();
- result = 29 * result + serial.hashCode();
- return result;
- }
-}</programlisting>
-
- <para>On a collection of embeddable objects, the embeddable object
- can have a property annotated with <literal>@Parent</literal>. This
- property will then point back to the entity containing the
- collection.</para>
-
- <note>
- <para>Previous versions of Hibernate Annotations used the
- <literal>@OneToMany</literal> to mark a collection of elements.
- Due to semantic inconsistencies, we've introduced the annotation
- <literal>@CollectionOfElements</literal>. Marking collections of
- elements the old way still work but is considered deprecated and
- is going to be unsupported in future releases</para>
- </note>
- </sect4>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Cache</title>
-
- <para>In order to optimize your database accesses, you can activave the
- so called second level cache of Hibernate. This cache is configurable on
- a per entity and per collection basis.</para>
-
- <para><literal>@org.hibernate.annotations.Cache</literal> defines the
- caching strategy and region of a given second level cache. This
- annotation can be applied on the root entity (not the sub entities), and
- on the collections.</para>
-
- <programlisting>@Entity
- at Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-public class Forest { ... }</programlisting>
-
- <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
- @JoinColumn(name="CUST_ID")
- @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
- public SortedSet<Ticket> getTickets() {
- return tickets;
- }</programlisting>
-
- <para></para>
-
- <programlistingco>
- <areaspec>
- <area coords="2 55" id="hm1" />
-
- <area coords="3 55" id="hm2" />
-
- <area coords="4 55" id="hm3" />
- </areaspec>
-
- <programlisting>@Cache(
- CacheConcurrencyStrategy usage();
- String region() default "";
- String include() default "all";
-)</programlisting>
-
- <calloutlist>
- <callout arearefs="hm1">
- <para>usage: the given cache concurrency strategy (NONE,
- READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL)</para>
- </callout>
-
- <callout arearefs="hm2">
- <para>region (optional): the cache region (default to the fqcn of
- the class or the fq role name of the collection)</para>
- </callout>
-
- <callout arearefs="hm3">
- <para><literal>include</literal> (optional): all to include all
- properties, non-lazy to only include non lazy properties (default
- all).</para>
- </callout>
- </calloutlist>
- </programlistingco>
- </sect2>
-
- <sect2 id="entity-hibspec-filters">
- <title>Filters</title>
-
- <para>Hibernate has the ability to apply arbitrary filters on top of
- your data. Those filters are applied at runtime on a given session.
- First, you need to define them.</para>
-
- <para><literal>@org.hibernate.annotations.FilterDef</literal> or
- <literal>@FilterDefs</literal> define filter definition(s) used by
- filter(s) using the same name. A filter definition has a name() and an
- array of parameters(). A parameter will allow you to adjust the behavior
- of the filter at runtime. Each parameter is defined by a
- <literal>@ParamDef</literal> which has a name and a type. You can also
- define a defaultCondition() parameter for a given
- <literal>@FilterDef</literal> to set the default condition to use when
- none are defined in each individual <literal>@Filter</literal>. A
- <literal>@FilterDef</literal>(s) can be defined at the class or package
- level.</para>
-
- <para>We now need to define the SQL filter clause applied to either the
- entity load or the collection load. <literal>@Filter</literal> is used
- and placed either on the entity or the collection element</para>
-
- <para><programlisting>@Entity
- at FilterDef(name="minLength", parameters={ @ParamDef( name="minLength", type="integer" ) } )
- at Filters( {
- @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"),
- @Filter(name="minLength", condition=":minLength <= length")
-} )
-public class Forest { ... }</programlisting></para>
-
- <para>When the collection use an association table as a relational
- representation, you might want to apply the filter condition to the
- association table itself or to the target entity table. To apply the
- constraint on the target entity, use the regular
- <literal>@Filter</literal> annotation. However, if you wan to target the
- association table, use the <literal>@FilterJoinTable</literal>
- annotation.</para>
-
- <programlisting> @OneToMany
- @JoinTable
- //filter on the target entity table
- @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length")
- //filter on the association table
- @FilterJoinTable(name="security", condition=":userlevel >= requredLevel")
- public Set<Forest> getForests() { ... }</programlisting>
- </sect2>
-
- <sect2 id="entity-hibspec-query">
- <title>Queries</title>
-
- <para>Since Hibernate has more features on named queries than the one
- defined in the EJB3 specification,
- <literal>@org.hibernate.annotations.NamedQuery</literal>,
- <literal>@org.hibernate.annotations.NamedQueries</literal>,
- <literal>@org.hibernate.annotations.NamedNativeQuery</literal> and
- <literal>@org.hibernate.annotations.NamedNativeQueries</literal> have
- been introduced. They add some attributes to the standard version and
- can be used as a replacement:</para>
-
- <itemizedlist>
- <listitem>
- <para>flushMode: define the query flush mode (Always, Auto, Commit
- or Never)</para>
- </listitem>
-
- <listitem>
- <para>cacheable: whether the query should be cached or not</para>
- </listitem>
-
- <listitem>
- <para>cacheRegion: cache region used if the query is cached</para>
- </listitem>
-
- <listitem>
- <para>fetchSize: JDBC statement fetch size for this query</para>
- </listitem>
-
- <listitem>
- <para>timeout: query time out</para>
- </listitem>
-
- <listitem>
- <para>callable: for native queries only, to be set to true for
- stored procedures</para>
- </listitem>
-
- <listitem>
- <para>comment: if comments are activated, the comment seen when the
- query is sent to the database.</para>
- </listitem>
-
- <listitem>
- <para>cacheMode: Cache interaction mode (get, ignore, normal, put or
- refresh)</para>
- </listitem>
-
- <listitem>
- <para>readOnly: whether or not the elements retrievent from the
- query are in read only mode.</para>
- </listitem>
- </itemizedlist>
-
- <para>Those hints can be set in a standard
- <literal>@javax.persistence.NamedQuery</literal> annotations through the
- detyped <literal>@QueryHint</literal>. Another key advantage is the
- ability to set those annotations at a package level.</para>
- </sect2>
-
- <sect2 id="entity-hibspec-customsql" revision="1">
- <title>Custom SQL for CRUD operations</title>
-
- <para>Hibernate gives you the avility to override every single SQL
- statement generated. We have seen native SQL query usage already, but
- you can also override the SQL statement used to load or change the state
- of entities.</para>
-
- <programlisting>@Entity
- at Table(name="CHAOS")
-<emphasis role="bold">@SQLInsert( sql="INSERT INTO CHAOS(size, name, nickname, id) VALUES(?,upper(?),?,?)")
- at SQLUpdate( sql="UPDATE CHAOS SET size = ?, name = upper(?), nickname = ? WHERE id = ?")
- at SQLDelete( sql="DELETE CHAOS WHERE id = ?")
- at SQLDeleteAll( sql="DELETE CHAOS")
-</emphasis><emphasis role="bold">@Loader(namedQuery = "chaos")</emphasis>
- at NamedNativeQuery(name="chaos", query="select id, size, name, lower( nickname ) as nickname from CHAOS where id= ?", resultClass = Chaos.class)
-public class Chaos {
- @Id
- private Long id;
- private Long size;
- private String name;
- private String nickname;</programlisting>
-
- <para><literal>@SQLInsert</literal>, <literal>@SQLUpdate</literal>,
- <literal>@SQLDelete</literal>, <literal>@SQLDeleteAll</literal>
- respectively override the INSERT statement, UPDATE statement, DELETE
- statement, DELETE statement to remove all entities.</para>
-
- <para>If you expect to call a store procedure, be sure to set the
- <literal>callable</literal> attribute to true
- (<literal>@SQLInsert(callable=true, ...)</literal>).</para>
-
- <para>To check that the execution happens correctly, Hibernate allows
- you to define one of those three strategies:</para>
-
- <itemizedlist>
- <listitem>
- <para>NONE: no check is performed: the store procedure is expected
- to fail upon issues</para>
- </listitem>
-
- <listitem>
- <para>COUNT: use of rowcount to check that the update is
- successful</para>
- </listitem>
-
- <listitem>
- <para>PARAM: like COUNT but using an output parameter rather that
- the standard mechanism</para>
- </listitem>
- </itemizedlist>
-
- <para>To define the result check style, use the <literal>check</literal>
- parameter (<literal>@SQLUpdate(check=ResultCheckStyle.COUNT,
- ...)</literal>).</para>
-
- <para>You can also override the SQL load statement by a native SQL query
- or a HQL query. You just have to refer to a named query with the
- <literal><literal>@Loader</literal></literal> annotation.</para>
-
- <para>You can use the exact same set of annotations to override the
- collection related statements.</para>
-
- <programlisting>@OneToMany
- at JoinColumn(name="chaos_fk")
-<emphasis role="bold">@SQLInsert( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = ? where id = ?")
- at SQLDelete( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = null where id = ?")</emphasis>
-private Set<CasimirParticle> particles = new HashSet<CasimirParticle>();</programlisting>
-
- <para>The parameters order is important and is defined by the order
- Hibernate handle properties. You can see the expected order by enabling
- debug logging for the <literal>org.hibernate.persister.entity</literal>
- level. With this level enabled Hibernate will print out the static SQL
- that is used to create, update, delete etc. entities. (To see the
- expected sequence, remember to not include your custom SQL through
- annotations as that will override the Hibernate generated static
- sql.)</para>
-
- <para>Overriding SQL statements for secondary tables is also possible
- using <literal>@org.hibernate.annotations.Table</literal> and either (or
- all) attributes <literal>sqlInsert</literal>,
- <literal>sqlUpdate</literal>, <literal>sqlDelete</literal>:</para>
-
- <programlisting>@Entity
- at SecondaryTables({
- @SecondaryTable(name = "`Cat nbr1`"),
- @SecondaryTable(name = "Cat2"})
- at org.hibernate.annotations.Tables( {
- @Table(appliesTo = "Cat", comment = "My cat table" ),
- @Table(appliesTo = "Cat2", foreignKey = @ForeignKey(name="FK_CAT2_CAT"), fetch = FetchMode.SELECT,
- <emphasis role="bold">sqlInsert=@SQLInsert(sql="insert into Cat2(storyPart2, id) values(upper(?), ?)") )</emphasis>
-} )
-public class Cat implements Serializable {</programlisting>
-
- <para>The previous example also show that you can give a comment to a
- given table (promary or secondary): This comment will be used for DDL
- generation.</para>
- </sect2>
-
- <sect2>
- <title>Tuplizer</title>
-
- <para><classname>org.hibernate.tuple.Tuplizer</classname>, and its
- sub-interfaces, are responsible for managing a particular representation
- of a piece of data, given that representation's
- <literal>org.hibernate.EntityMode</literal>. If a given piece of data is
- thought of as a data structure, then a tuplizer is the thing which knows
- how to create such a data structure and how to extract values from and
- inject values into such a data structure. For example, for the POJO
- entity mode, the correpsonding tuplizer knows how create the POJO
- through its constructor and how to access the POJO properties using the
- defined property accessors. There are two high-level types of Tuplizers,
- represented by the
- <classname>org.hibernate.tuple.EntityTuplizer</classname> and
- <classname>org.hibernate.tuple.ComponentTuplizer</classname> interfaces.
- EntityTuplizers are responsible for managing the above mentioned
- contracts in regards to entities, while
- <classname>ComponentTuplizers</classname> do the same for components.
- Check the Hibernate reference documentation for more information.</para>
-
- <para>To define tuplixer in annotations, simply use the
- <literal>@Tuplizer</literal> annotation on the according element</para>
-
- <programlisting>@Entity
-<emphasis role="bold">@Tuplizer(impl = DynamicEntityTuplizer.class)</emphasis>
-public interface Cuisine {
- @Id
- @GeneratedValue
- public Long getId();
- public void setId(Long id);
-
- public String getName();
- public void setName(String name);
-
- <emphasis role="bold">@Tuplizer(impl = DynamicComponentTuplizer.class)</emphasis>
- public Country getCountry();
- public void setCountry(Country country);
-
-
-}</programlisting>
- </sect2>
- </sect1>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/en/modules/entity.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/entity.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/en/modules/entity.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/en/modules/entity.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,3583 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="entity">
+ <title>Entity Beans</title>
+
+ <sect1 id="entity-overview" revision="2">
+ <title>Intro</title>
+
+ <para>This section covers EJB 3.0 (aka Java Persistence) entity
+ annotations and Hibernate-specific extensions.</para>
+ </sect1>
+
+ <sect1 id="entity-mapping" revision="2">
+ <title>Mapping with EJB3/JPA Annotations</title>
+
+ <para>EJB3 entities are plain POJOs. Actually they represent the exact
+ same concept as the Hibernate persistent entities. Their mappings are
+ defined through JDK 5.0 annotations (an XML descriptor syntax for
+ overriding is defined in the EJB3 specification). Annotations can be split
+ in two categories, the logical mapping annotations (allowing you to
+ describe the object model, the class associations, etc.) and the physical
+ mapping annotations (describing the physical schema, tables, columns,
+ indexes, etc). We will mix annotations from both categories in the
+ following code examples.</para>
+
+ <para>EJB3 annotations are in the <literal>javax.persistence.*</literal>
+ package. Most JDK 5 compliant IDE (like Eclipse, IntelliJ IDEA and
+ Netbeans) can autocomplete annotation interfaces and attributes for you
+ (even without a specific "EJB3" module, since EJB3 annotations are plain
+ JDK 5 annotations).</para>
+
+ <para>For more and runnable concrete examples read the JBoss EJB 3.0
+ tutorial or review the Hibernate Annotations test suite. Most of the unit
+ tests have been designed to represent a concrete example and be a
+ inspiration source.</para>
+
+ <sect2 id="entity-mapping-entity">
+ <title>Declaring an entity bean</title>
+
+ <para>Every bound persistent POJO class is an entity bean and is
+ declared using the <literal>@Entity</literal> annotation (at the class
+ level):</para>
+
+ <programlisting>
+ at Entity
+public class Flight implements Serializable {
+ Long id;
+
+ @Id
+ public Long getId() { return id; }
+
+ public void setId(Long id) { this.id = id; }
+}
+ </programlisting>
+
+ <para><literal>@Entity</literal> declares the class as an entity bean
+ (i.e. a persistent POJO class), <literal>@Id</literal> declares the
+ identifier property of this entity bean. The other mapping declarations
+ are implicit. This configuration by exception concept is central to the
+ new EJB3 specification and a major improvement. The class Flight is
+ mapped to the Flight table, using the column id as its primary key
+ column.</para>
+
+ <para>Depending on whether you annotate fields or methods, the access
+ type used by Hibernate will be <literal>field</literal> or
+ <literal>property</literal>. The EJB3 spec requires that you declare
+ annotations on the element type that will be accessed, i.e. the getter
+ method if you use <literal>property</literal> access, the field if you
+ use <literal>field</literal> access. Mixing EJB3 annotations in both
+ fields and methods should be avoided. Hibernate will guess the access
+ type from the position of <literal>@Id</literal> or
+ <literal>@EmbeddedId</literal>.</para>
+
+ <sect3>
+ <title>Defining the table</title>
+
+ <para><literal>@Table</literal> is set at the class level; it allows
+ you to define the table, catalog, and schema names for your entity
+ bean mapping. If no <literal>@Table</literal> is defined the default
+ values are used: the unqualified class name of the entity.</para>
+
+ <programlisting>
+ at Entity
+ at Table(name="tbl_sky")
+public class Sky implements Serializable {
+...
+ </programlisting>
+
+ <para>The <literal>@Table</literal> element also contains a
+ <literal>schema</literal> and a <literal>catalog</literal> attributes,
+ if they need to be defined. You can also define unique constraints to
+ the table using the <literal>@UniqueConstraint</literal> annotation in
+ conjunction with <literal>@Table</literal> (for a unique constraint
+ bound to a single column, refer to <literal>@Column</literal>).</para>
+
+ <programlisting>@Table(name="tbl_sky",
+ <emphasis role="bold">uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})}</emphasis>
+)</programlisting>
+
+ <para>A unique constraint is applied to the tuple month, day. Note
+ that the <literal>columnNames</literal> array refers to the logical
+ column names.</para>
+
+ <remark>The logical column name is defined by the Hibernate
+ NamingStrategy implementation. The default EJB3 naming strategy use
+ the physical column name as the logical column name. Note that this
+ may be different than the property name (if the column name is
+ explicit). Unless you override the NamingStrategy, you shouldn't worry
+ about that.</remark>
+ </sect3>
+
+ <sect3 id="entity-mapping-entity-version" revision="1">
+ <title>Versioning for optimistic locking</title>
+
+ <para>You can add optimistic locking capability to an entity bean
+ using the <literal>@Version</literal> annotation:</para>
+
+ <programlisting>
+ at Entity
+public class Flight implements Serializable {
+...
+ @Version
+ @Column(name="OPTLOCK")
+ public Integer getVersion() { ... }
+} </programlisting>
+
+ <para>The version property will be mapped to the
+ <literal>OPTLOCK</literal> column, and the entity manager will use it
+ to detect conflicting updates (preventing lost updates you might
+ otherwise see with the last-commit-wins strategy).</para>
+
+ <para>The version column may be a numeric (the recommended solution)
+ or a timestamp as per the EJB3 spec. Hibernate support any kind of
+ type provided that you define and implement the appropriate
+ <classname>UserVersionType</classname>.</para>
+
+ <para>The application must not alter the version number set up by
+ Hibernate in any way. To artificially increase the version number,
+ check in Hibernate Entity Manager's reference documentation
+ <literal>LockMode.WRITE</literal></para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="entity-mapping-property" revision="1">
+ <title>Mapping simple properties</title>
+
+ <sect3>
+ <title>Declaring basic property mappings</title>
+
+ <para>Every non static non transient property (field or method) of an
+ entity bean is considered persistent, unless you annotate it as
+ <literal>@Transient</literal>. Not having an annotation for your
+ property is equivalent to the appropriate <literal>@Basic</literal>
+ annotation. The <literal>@Basic</literal> annotation allows you to
+ declare the fetching strategy for a property:</para>
+
+ <programlisting>public transient int counter; //transient property
+
+private String firstname; //persistent property
+
+ at Transient
+String getLengthInMeter() { ... } //transient property
+
+String getName() {... } // persistent property
+
+ at Basic
+int getLength() { ... } // persistent property
+
+ at Basic(fetch = FetchType.LAZY)
+String getDetailedComment() { ... } // persistent property
+
+ at Temporal(TemporalType.TIME)
+java.util.Date getDepartureTime() { ... } // persistent property
+
+ at Enumerated(STRING)
+Starred getNote() { ... } //enum persisted as String in database</programlisting>
+
+ <para><literal>counter</literal>, a transient field, and
+ <literal>lengthInMeter</literal>, a method annotated as
+ <literal>@Transient</literal>, and will be ignored by the entity
+ manager. <literal>name</literal>, <literal>length</literal>, and
+ <literal>firstname</literal> properties are mapped persistent and
+ eagerly fetched (the default for simple properties). The
+ <literal>detailedComment</literal> property value will be lazily
+ fetched from the database once a lazy property of the entity is
+ accessed for the first time. Usually you don't need to lazy simple
+ properties (not to be confused with lazy association fetching).</para>
+
+ <note>
+ <para>To enable property level lazy fetching, your classes have to
+ be instrumented: bytecode is added to the original one to enable
+ such feature, please refer to the Hibernate reference documentation.
+ If your classes are not instrumented, property level lazy loading is
+ silently ignored.</para>
+ </note>
+
+ <para>The recommended alternative is to use the projection capability
+ of EJB-QL or Criteria queries.</para>
+
+ <para>EJB3 support property mapping of all basic types supported by
+ Hibernate (all basic Java types , their respective wrappers and
+ serializable classes). Hibernate Annotations support out of the box
+ Enum type mapping either into a ordinal column (saving the enum
+ ordinal) or a string based column (saving the enum string
+ representation): the persistence representation, defaulted to ordinal,
+ can be overriden through the <literal>@Enumerated</literal> annotation
+ as shown in the <literal>note</literal> property example.</para>
+
+ <para>In core Java APIs, the temporal precision is not defined. When
+ dealing with temporal data you might want to describe the expected
+ precision in database. Temporal data can have <literal>DATE</literal>,
+ <literal>TIME</literal>, or <literal>TIMESTAMP</literal> precision (ie
+ the actual date, only the time, or both). Use the
+ <literal>@Temporal</literal> annotation to fine tune that.</para>
+
+ <para><literal>@Lob</literal> indicates that the property should be
+ persisted in a Blob or a Clob depending on the property type:
+ <classname>java.sql.Clob</classname>,
+ <classname>Character[]</classname>, <classname>char[]</classname> and
+ java.lang.<classname>String</classname> will be persisted in a Clob.
+ <classname>java.sql.Blob</classname>, <classname>Byte[]</classname>,
+ <classname>byte[] </classname>and serializable type will be persisted
+ in a Blob.</para>
+
+ <programlisting>
+ at Lob
+public String getFullText() {
+ return fullText;
+}
+
+ at Lob
+public byte[] getFullCode() {
+ return fullCode;
+}
+ </programlisting>
+
+ <para>If the property type implements
+ <classname>java.io.Serializable</classname> and is not a basic type,
+ and if the property is not annotated with <literal>@Lob</literal>,
+ then the Hibernate <literal>serializable</literal> type is
+ used.</para>
+ </sect3>
+
+ <sect3 id="entity-mapping-property-column" revision="1">
+ <title>Declaring column attributes</title>
+
+ <para>The column(s) used for a property mapping can be defined using
+ the <literal>@Column</literal> annotation. Use it to override default
+ values (see the EJB3 specification for more information on the
+ defaults). You can use this annotation at the property level for
+ properties that are:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>not annotated at all</para>
+ </listitem>
+
+ <listitem>
+ <para>annotated with <literal>@Basic</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>annotated with <literal>@Version</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>annotated with <literal>@Lob</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>annotated with <literal>@Temporal</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>annotated with
+ <literal>@org.hibernate.annotations.CollectionOfElements</literal>
+ (for Hibernate only)</para>
+ </listitem>
+ </itemizedlist>
+
+ <programlisting>
+ at Entity
+public class Flight implements Serializable {
+...
+ at Column(updatable = false, name = "flight_name", nullable = false, length=50)
+public String getName() { ... }
+ </programlisting>
+
+ <para>The <literal>name</literal> property is mapped to the
+ <literal>flight_name</literal> column, which is not nullable, has a
+ length of 50 and is not updatable (making the property
+ immutable).</para>
+
+ <para>This annotation can be applied to regular properties as well as
+ <literal>@Id</literal> or <literal>@Version</literal>
+ properties.</para>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="2 55" id="hm1" />
+
+ <area coords="3 55" id="hm2" />
+
+ <area coords="4 55" id="hm3" />
+
+ <area coords="5 55" id="hm4" />
+
+ <area coords="6 55" id="hm5" />
+
+ <area coords="7 55" id="hm6" />
+
+ <area coords="8 55" id="hm7" />
+
+ <area coords="9 55" id="hm8" />
+
+ <area coords="10 55" id="hm9" />
+
+ <area coords="11 55" id="hm10" />
+ </areaspec>
+
+ <programlisting>@Column(
+ name="columnName";
+ boolean unique() default false;
+ boolean nullable() default true;
+ boolean insertable() default true;
+ boolean updatable() default true;
+ String columnDefinition() default "";
+ String table() default "";
+ int length() default 255;
+ int precision() default 0; // decimal precision
+ int scale() default 0; // decimal scale</programlisting>
+
+ <calloutlist>
+ <callout arearefs="hm1">
+ <para><literal>name</literal> (optional): the column name
+ (default to the property name)</para>
+ </callout>
+
+ <callout arearefs="hm2">
+ <para><literal>unique</literal> (optional): set a unique
+ constraint on this column or not (default false)</para>
+ </callout>
+
+ <callout arearefs="hm3">
+ <para><literal>nullable</literal> (optional): set the column as
+ nullable (default true).</para>
+ </callout>
+
+ <callout arearefs="hm4">
+ <para><literal>insertable</literal> (optional): whether or not
+ the column will be part of the insert statement (default
+ true)</para>
+ </callout>
+
+ <callout arearefs="hm5">
+ <para><literal>updatable</literal> (optional): whether or not
+ the column will be part of the update statement (default
+ true)</para>
+ </callout>
+
+ <callout arearefs="hm6">
+ <para><literal>columnDefinition</literal> (optional): override
+ the sql DDL fragment for this particular column (non
+ portable)</para>
+ </callout>
+
+ <callout arearefs="hm7">
+ <para><literal>table</literal> (optional): define the targeted
+ table (default primary table)</para>
+ </callout>
+
+ <callout arearefs="hm8">
+ <para><literal><literal>length</literal></literal> (optional):
+ column length (default 255)</para>
+ </callout>
+
+ <callout arearefs="hm8">
+ <para><literal><literal>precision</literal></literal>
+ (optional): column decimal precision (default 0)</para>
+ </callout>
+
+ <callout arearefs="hm10">
+ <para><literal><literal>scale</literal></literal> (optional):
+ column decimal scale if useful (default 0)</para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+ </sect3>
+
+ <sect3>
+ <title>Embedded objects (aka components)</title>
+
+ <para>It is possible to declare an embedded component inside an entity
+ and even override its column mapping. Component classes have to be
+ annotated at the class level with the <literal>@Embeddable</literal>
+ annotation. It is possible to override the column mapping of an
+ embedded object for a particular entity using the
+ <literal>@Embedded</literal> and <literal>@AttributeOverride</literal>
+ annotation in the associated property:</para>
+
+ <programlisting>
+ at Entity
+public class Person implements Serializable {
+
+ // Persistent component using defaults
+ Address homeAddress;
+
+ @Embedded
+ @AttributeOverrides( {
+ @AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),
+ @AttributeOverride(name="name", column = @Column(name="bornCountryName") )
+ } )
+ Country bornIn;
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Embeddable
+public class Address implements Serializable {
+ String city;
+ Country nationality; //no overriding here
+}
+ </programlisting>
+
+ <programlisting>
+ at Embeddable
+public class Country implements Serializable {
+ private String iso2;
+ @Column(name="countryName") private String name;
+
+ public String getIso2() { return iso2; }
+ public void setIso2(String iso2) { this.iso2 = iso2; }
+
+
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ ...
+}
+ </programlisting>
+
+ <para>A embeddable object inherit the access type of its owning entity
+ (note that you can override that using the Hibernate specific
+ <literal>@AccessType</literal> annotations (see <xref
+ linkend="entity-hibspec" />).</para>
+
+ <para>The <literal>Person</literal> entity bean has two component
+ properties, <literal>homeAddress</literal> and
+ <literal>bornIn</literal>. <literal>homeAddress</literal> property has
+ not been annotated, but Hibernate will guess that it is a persistent
+ component by looking for the <literal>@Embeddable</literal> annotation
+ in the Address class. We also override the mapping of a column name
+ (to <literal>bornCountryName</literal>) with the
+ <literal>@Embedded</literal> and <literal>@AttributeOverride
+ </literal>annotations for each mapped attribute of
+ <literal>Country</literal>. As you can see, <literal>Country
+ </literal>is also a nested component of <literal>Address</literal>,
+ again using auto-detection by Hibernate and EJB3 defaults. Overriding
+ columns of embedded objects of embedded objects is currently not
+ supported in the EJB3 spec, however, Hibernate Annotations supports it
+ through dotted expressions.</para>
+
+ <para><programlisting> @Embedded
+ @AttributeOverrides( {
+ @AttributeOverride(name="city", column = @Column(name="fld_city") )
+ @AttributeOverride(name="<emphasis role="bold">nationality.iso2</emphasis>", column = @Column(name="nat_Iso2") ),
+ @AttributeOverride(name="<emphasis role="bold">nationality.name</emphasis>", column = @Column(name="nat_CountryName") )
+ //nationality columns in homeAddress are overridden
+ } )
+ Address homeAddress;</programlisting>Hibernate Annotations supports one
+ more feature that is not explicitly supported by the EJB3
+ specification. You can annotate a embedded object with the
+ <literal>@MappedSuperclass</literal> annotation to make the superclass
+ properties persistent (see <literal>@MappedSuperclass</literal> for
+ more informations).</para>
+
+ <para>While not supported by the EJB3 specification, Hibernate
+ Annotations allows you to use association annotations in an embeddable
+ object (ie <literal>@*ToOne</literal> nor
+ <literal>@*ToMany</literal>). To override the association columns you
+ can use <literal>@AssociationOverride</literal>.</para>
+
+ <para>If you want to have the same embeddable object type twice in the
+ same entity, the column name defaulting will not work: at least one of
+ the columns will have to be explicit. Hibernate goes beyond the EJB3
+ spec and allows you to enhance the defaulting mechanism through the
+ <classname>NamingStrategy</classname>.
+ <classname>DefaultComponentSafeNamingStrategy</classname> is a small
+ improvement over the default EJB3NamingStrategy that allows embedded
+ objects to be defaulted even if used twice in the same entity.</para>
+ </sect3>
+
+ <sect3>
+ <title>Non-annotated property defaults</title>
+
+ <para>If a property is not annotated, the following rules
+ apply:</para>
+
+ <itemizedlist>
+ <listitem>
+ If the property is of a single type, it is mapped as @Basic
+ </listitem>
+
+ <listitem>
+ Otherwise, if the type of the property is annotated as @Embeddable, it is mapped as @Embedded
+ </listitem>
+
+ <listitem>
+ Otherwise, if the type of the property is Serializable, it is mapped as @Basic in a column holding the object in its serialized version
+ </listitem>
+
+ <listitem>
+ Otherwise, if the type of the property is java.sql.Clob or java.sql.Blob, it is mapped as @Lob with the appropriate LobType
+ </listitem>
+ </itemizedlist>
+ </sect3>
+ </sect2>
+
+ <sect2 id="entity-mapping-identifier" label=""
+ xreflabel="Mapping identifier properties">
+ <title>Mapping identifier properties</title>
+
+ <para>The <literal>@Id</literal> annotation lets you define which
+ property is the identifier of your entity bean. This property can be set
+ by the application itself or be generated by Hibernate (preferred). You
+ can define the identifier generation strategy thanks to the
+ <literal>@GeneratedValue</literal> annotation:</para>
+
+ <itemizedlist>
+ <listitem>
+ AUTO - either identity column, sequence or table depending on the underlying DB
+ </listitem>
+
+ <listitem>
+ TABLE - table holding the id
+ </listitem>
+
+ <listitem>
+ IDENTITY - identity column
+ </listitem>
+
+ <listitem>
+ SEQUENCE - sequence
+ </listitem>
+ </itemizedlist>
+
+ <para>Hibernate provides more id generators than the basic EJB3 ones.
+ Check <xref linkend="entity-hibspec" /> for more informations.</para>
+
+ <para>The following example shows a sequence generator using the
+ SEQ_STORE configuration (see below)</para>
+
+ <programlisting>
+ at Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
+public Integer getId() { ... }
+ </programlisting>
+
+ <para>The next example uses the identity generator:</para>
+
+ <programlisting>
+ at Id @GeneratedValue(strategy=GenerationType.IDENTITY)
+public Long getId() { ... }
+ </programlisting>
+
+ <para>The <literal>AUTO</literal> generator is the preferred type for
+ portable applications (across several DB vendors). The identifier
+ generation configuration can be shared for several
+ <literal>@Id</literal> mappings with the generator attribute. There are
+ several configurations available through
+ <literal>@SequenceGenerator</literal> and
+ <literal>@TableGenerator</literal>. The scope of a generator can be the
+ application or the class. Class-defined generators are not visible
+ outside the class and can override application level generators.
+ Application level generators are defined at XML level (see <xref
+ linkend="xml-overriding" />):</para>
+
+ <programlisting><table-generator name="EMP_GEN"
+ table="GENERATOR_TABLE"
+ pk-column-name="key"
+ value-column-name="hi"
+ pk-column-value="EMP"
+ allocation-size="20"/>
+
+//and the annotation equivalent
+
+ at javax.persistence.TableGenerator(
+ name="EMP_GEN",
+ table="GENERATOR_TABLE",
+ pkColumnName = "key",
+ valueColumnName = "hi"
+ pkColumnValue="EMP",
+ allocationSize=20
+)
+
+<sequence-generator name="SEQ_GEN"
+ sequence-name="my_sequence"
+ allocation-size="20"/>
+
+//and the annotation equivalent
+
+ at javax.persistence.SequenceGenerator(
+ name="SEQ_GEN",
+ sequenceName="my_sequence",
+ allocationSize=20
+)
+ </programlisting>
+
+ <para>If JPA XML (like <filename>META-INF/orm.xml</filename>) is used to
+ define thegenerators, <literal>EMP_GEN</literal> and
+ <literal>SEQ_GEN</literal> are application level generators.
+ <literal>EMP_GEN</literal> defines a table based id generator using the
+ hilo algorithm with a <literal>max_lo</literal> of 20. The hi value is
+ kept in a <literal>table</literal> "<literal>GENERATOR_TABLE</literal>".
+ The information is kept in a row where <literal>pkColumnName</literal>
+ "key" is equals to <literal>pkColumnValue</literal>
+ "<literal>EMP</literal>" and column <literal>valueColumnName</literal>
+ "<literal>hi</literal>" contains the the next high value used.</para>
+
+ <para><literal>SEQ_GEN</literal> defines a sequence generator using a
+ sequence named <literal>my_sequence</literal>. The allocation size used
+ for this sequence based hilo algorithm is 20. Note that this version of
+ Hibernate Annotations does not handle <literal>initialValue</literal> in
+ the sequence generator. The default allocation size is 50, so if you
+ want to use a sequence and pickup the value each time, you must set the
+ allocation size to 1.</para>
+
+ <note>
+ <para>Package level definition is no longer supported by the EJB 3.0
+ specification. However, you can use the
+ <literal>@GenericGenerator</literal> at the package level (see <xref
+ linkend="entity-hibspec-identifier" />).</para>
+ </note>
+
+ <para>The next example shows the definition of a sequence generator in a
+ class scope:</para>
+
+ <programlisting>
+ at Entity
+ at javax.persistence.SequenceGenerator(
+ name="SEQ_STORE",
+ sequenceName="my_sequence"
+)
+public class Store implements Serializable {
+ private Long id;
+
+ @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
+ public Long getId() { return id; }
+}
+ </programlisting>
+
+ <para>This class will use a sequence named my_sequence and the SEQ_STORE
+ generator is not visible in other classes. Note that you can check the
+ Hibernate Annotations tests in the org.hibernate.test.metadata.id
+ package for more examples.</para>
+
+ <para>You can define a composite primary key through several
+ syntaxes:</para>
+
+ <itemizedlist>
+ <listitem>
+ annotate the component property as @Id and make the component class @Embeddable
+ </listitem>
+
+ <listitem>
+ annotate the component property as @EmbeddedId
+ </listitem>
+
+ <listitem>
+ annotate the class as @IdClass and annotate each property of the entity involved in the primary key with @Id
+ </listitem>
+ </itemizedlist>
+
+ <para>While quite common to the EJB2 developer,
+ <literal>@IdClass</literal> is likely new for Hibernate users. The
+ composite primary key class corresponds to multiple fields or properties
+ of the entity class, and the names of primary key fields or properties
+ in the primary key class and those of the entity class must match and
+ their types must be the same. Let's look at an example:</para>
+
+ <programlisting>@Entity
+<emphasis role="bold">@IdClass(FootballerPk.class)</emphasis>
+public class Footballer {
+ //part of the id key
+ <emphasis role="bold">@Id</emphasis> public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ //part of the id key
+ <emphasis role="bold">@Id</emphasis> public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public String getClub() {
+ return club;
+ }
+
+ public void setClub(String club) {
+ this.club = club;
+ }
+
+ //appropriate equals() and hashCode() implementation
+}
+
+ at Embeddable
+public class FootballerPk implements Serializable {
+ //same name and type as in Footballer
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ //same name and type as in Footballer
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ //appropriate equals() and hashCode() implementation
+}
+</programlisting>
+
+ <para>As you may have seen, <literal>@IdClass</literal> points to the
+ corresponding primary key class.</para>
+
+ <para>While not supported by the EJB3 specification, Hibernate allows
+ you to define associations inside a composite identifier. Simply use the
+ regular annotations for that</para>
+
+ <programlisting>@Entity
+ at AssociationOverride( name="id.channel", joinColumns = @JoinColumn(name="chan_id") )
+public class TvMagazin {
+ @EmbeddedId public TvMagazinPk id;
+ @Temporal(TemporalType.TIME) Date time;
+}
+
+ at Embeddable
+public class TvMagazinPk implements Serializable {
+ @ManyToOne
+ public Channel channel;
+ public String name;
+ @ManyToOne
+ public Presenter presenter;
+}
+</programlisting>
+ </sect2>
+
+ <sect2>
+ <title>Mapping inheritance</title>
+
+ <para>EJB3 supports the three types of inheritance:</para>
+
+ <itemizedlist>
+ <listitem>
+ Table per Class Strategy: the <union-class> element in Hibernate
+ </listitem>
+
+ <listitem>
+ Single Table per Class Hierarchy Strategy: the <subclass> element in Hibernate
+ </listitem>
+
+ <listitem>
+ Joined Subclass Strategy: the <joined-subclass> element in Hibernate
+ </listitem>
+ </itemizedlist>
+
+ <para>The chosen strategy is declared at the class level of the top
+ level entity in the hierarchy using the <literal>@Inheritance</literal>
+ annotation.</para>
+
+ <note>
+ <para>Annotating interfaces is currently not supported.</para>
+ </note>
+
+ <sect3>
+ <title>Table per class</title>
+
+ <para>This strategy has many drawbacks (esp. with polymorphic queries
+ and associations) explained in the EJB3 spec, the Hibernate reference
+ documentation, Hibernate in Action, and many other places. Hibernate
+ work around most of them implementing this strategy using <literal>SQL
+ UNION</literal> queries. It is commonly used for the top level of an
+ inheritance hierarchy:</para>
+
+ <programlisting>
+ at Entity
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Flight implements Serializable {
+ </programlisting>
+
+ <para>This strategy support one to many associations provided that
+ they are bidirectional. This strategy does not support the
+ <literal>IDENTITY</literal> generator strategy: the id has to be
+ shared across several tables. Consequently, when using this strategy,
+ you should not use <literal>AUTO </literal>nor
+ <literal>IDENTITY</literal>.</para>
+ </sect3>
+
+ <sect3>
+ <title>Single table per class hierarchy</title>
+
+ <para>All properties of all super- and subclasses are mapped into the
+ same table, instances are distinguished by a special discriminator
+ column:</para>
+
+ <programlisting>
+ at Entity
+ at Inheritance(strategy=InheritanceType.SINGLE_TABLE)
+ at DiscriminatorColumn(
+ name="planetype",
+ discriminatorType=DiscriminatorType.STRING
+)
+ at DiscriminatorValue("Plane")
+public class Plane { ... }
+
+ at Entity
+ at DiscriminatorValue("A320")
+public class A320 extends Plane { ... }
+ </programlisting>
+
+ <para><classname>Plane</classname> is the superclass, it defines the
+ inheritance strategy <literal>InheritanceType.SINGLE_TABLE</literal>.
+ It also defines the discriminator column through the
+ <literal>@DiscriminatorColumn</literal> annotation, a discriminator
+ column can also define the discriminator type. Finally, the
+ <literal>@DiscriminatorValue</literal> annotation defines the value
+ used to differentiate a class in the hierarchy. All of these
+ attributes have sensible default values. The default name of the
+ discriminator column is <literal>DTYPE</literal>. The default
+ discriminator value is the entity name (as defined in
+ <literal>@Entity.name</literal>) for DiscriminatorType.STRING.
+ <classname>A320</classname> is a subclass; you only have to define
+ discriminator value if you don't want to use the default value. The
+ strategy and the discriminator type are implicit.</para>
+
+ <para><literal>@Inheritance</literal> and
+ <literal>@DiscriminatorColumn</literal> should only be defined at the
+ top of the entity hierarchy.</para>
+ </sect3>
+
+ <sect3>
+ <title>Joined subclasses</title>
+
+ <para>The<literal> @PrimaryKeyJoinColumn</literal> and
+ <literal>@PrimaryKeyJoinColumns</literal> annotations define the
+ primary key(s) of the joined subclass table:</para>
+
+ <programlisting>
+ at Entity
+ at Inheritance(strategy=InheritanceType.JOINED)
+public class Boat implements Serializable { ... }
+
+ at Entity
+public class Ferry extends Boat { ... }
+
+ at Entity
+ at PrimaryKeyJoinColumn(name="BOAT_ID")
+public class AmericaCupClass extends Boat { ... }
+ </programlisting>
+
+ <para>All of the above entities use the <literal>JOINED</literal>
+ strategy, the <literal>Ferry</literal> table is joined with the
+ <literal>Boat</literal> table using the same primary key names. The
+ <literal>AmericaCupClass</literal> table is joined with
+ <literal>Boat</literal> using the join condition <code>Boat.id =
+ AmericaCupClass.BOAT_ID</code>.</para>
+ </sect3>
+
+ <sect3>
+ <title>Inherit properties from superclasses</title>
+
+ <para>This is sometimes useful to share common properties through a
+ technical or a business superclass without including it as a regular
+ mapped entity (ie no specific table for this entity). For that purpose
+ you can map them as <literal>@MappedSuperclass</literal>.</para>
+
+ <programlisting>@MappedSuperclass
+public class BaseEntity {
+ @Basic
+ @Temporal(TemporalType.TIMESTAMP)
+ public Date getLastUpdate() { ... }
+ public String getLastUpdater() { ... }
+ ...
+}
+
+ at Entity class Order extends BaseEntity {
+ @Id public Integer getId() { ... }
+ ...
+}</programlisting>
+
+ <para>In database, this hierarchy will be represented as an
+ <literal>Order</literal> table having the <literal>id</literal>,
+ <literal>lastUpdate</literal> and <literal>lastUpdater</literal>
+ columns. The embedded superclass property mappings are copied into
+ their entity subclasses. Remember that the embeddable superclass is
+ not the root of the hierarchy though.</para>
+
+ <note>
+ <para>Properties from superclasses not mapped as
+ <literal>@MappedSuperclass</literal> are ignored.</para>
+ </note>
+
+ <note>
+ <para>The access type (field or methods), is inherited from the root
+ entity, unless you use the Hibernate annotation
+ <literal>@AccessType</literal></para>
+ </note>
+
+ <note>
+ <para>The same notion can be applied to
+ <literal>@Embeddable</literal> objects to persist properties from
+ their superclasses. You also need to use
+ <literal>@MappedSuperclass</literal> to do that (this should not be
+ considered as a standard EJB3 feature though)</para>
+ </note>
+
+ <note>
+ <para>It is allowed to mark a class as
+ <literal>@MappedSuperclass</literal> in the middle of the mapped
+ inheritance hierarchy.</para>
+ </note>
+
+ <note>
+ <para>Any class in the hierarchy non annotated with
+ <literal>@MappedSuperclass</literal> nor <literal>@Entity</literal>
+ will be ignored.</para>
+ </note>
+
+ <para>You can override columns defined in entity superclasses at the
+ root entity level using the <literal>@AttributeOverride</literal>
+ annotation.</para>
+
+ <programlisting>@MappedSuperclass
+public class FlyingObject implements Serializable {
+
+ public int getAltitude() {
+ return altitude;
+ }
+
+ @Transient
+ public int getMetricAltitude() {
+ return metricAltitude;
+ }
+
+ @ManyToOne
+ public PropulsionType getPropulsion() {
+ return metricAltitude;
+ }
+ ...
+}
+
+ at Entity
+ at AttributeOverride( name="altitude", column = @Column(name="fld_altitude") )
+ at AssociationOverride( name="propulsion", joinColumns = @JoinColumn(name="fld_propulsion_fk") )
+public class Plane extends FlyingObject {
+ ...
+}</programlisting>
+
+ <para>The <literal>altitude</literal> property will be persisted in an
+ <literal>fld_altitude</literal> column of table
+ <literal>Plane</literal> and the propulsion association will be
+ materialized in a <literal>fld_propulsion_fk</literal> foreign key
+ column.</para>
+
+ <para>You can define <literal>@AttributeOverride</literal>(s) and
+ <literal>@AssociationOverride</literal>(s) on
+ <literal>@Entity</literal> classes,
+ <literal>@MappedSuperclass</literal> classes and properties pointing
+ to an <literal>@Embeddable</literal> object.</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="entity-mapping-association">
+ <title>Mapping entity bean associations/relationships</title>
+
+ <sect3>
+ <title>One-to-one</title>
+
+ <para>You can associate entity beans through a one-to-one relationship
+ using <literal>@OneToOne</literal>. There are three cases for
+ one-to-one associations: either the associated entities share the same
+ primary keys values, a foreign key is held by one of the entities
+ (note that this FK column in the database should be constrained unique
+ to simulate one-to-one multiplicity), or a association table is used
+ to store the link between the 2 entities (a unique constraint has to
+ be defined on each fk to ensure the one to one multiplicity)</para>
+
+ <para>First, we map a real one-to-one association using shared primary
+ keys:</para>
+
+ <programlisting>
+ at Entity
+public class Body {
+ @Id
+ public Long getId() { return id; }
+
+ @OneToOne(cascade = CascadeType.ALL)
+ @PrimaryKeyJoinColumn
+ public Heart getHeart() {
+ return heart;
+ }
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Entity
+public class Heart {
+ @Id
+ public Long getId() { ...}
+}
+ </programlisting>
+
+ <para>The one to one is marked as true by using the
+ <literal>@PrimaryKeyJoinColumn</literal> annotation.</para>
+
+ <para>In the following example, the associated entities are linked
+ through a foreign key column:</para>
+
+ <programlisting>
+ at Entity
+public class Customer implements Serializable {
+ @OneToOne(cascade = CascadeType.ALL)
+ <emphasis role="bold">@JoinColumn(name="passport_fk")</emphasis>
+ public Passport getPassport() {
+ ...
+ }
+
+ at Entity
+public class Passport implements Serializable {
+ @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
+ public Customer getOwner() {
+ ...
+}
+ </programlisting>
+
+ <para>A <classname>Customer</classname> is linked to a
+ <classname>Passport</classname>, with a foreign key column named
+ <literal>passport_fk</literal> in the <literal>Customer</literal>
+ table. The join column is declared with the
+ <literal>@JoinColumn</literal> annotation which looks like the
+ <literal>@Column</literal> annotation. It has one more parameters
+ named <literal>referencedColumnName</literal>. This parameter declares
+ the column in the targeted entity that will be used to the join. Note
+ that when using
+ <literal><literal>referencedColumnName</literal></literal> to a non
+ primary key column, the associated class has to be
+ <classname>Serializable</classname>. Also note that the
+ <literal><literal>referencedColumnName</literal></literal> to a non
+ primary key column has to be mapped to a property having a single
+ column (other cases might not work).</para>
+
+ <para>The association may be bidirectional. In a bidirectional
+ relationship, one of the sides (and only one) has to be the owner: the
+ owner is responsible for the association column(s) update. To declare
+ a side as <emphasis>not</emphasis> responsible for the relationship,
+ the attribute <literal>mappedBy</literal> is used.
+ <literal>mappedBy</literal> refers to the property name of the
+ association on the owner side. In our case, this is
+ <literal>passport</literal>. As you can see, you don't have to (must
+ not) declare the join column since it has already been declared on the
+ owners side.</para>
+
+ <para>If no <literal>@JoinColumn</literal> is declared on the owner
+ side, the defaults apply. A join column(s) will be created in the
+ owner table and its name will be the concatenation of the name of the
+ relationship in the owner side, <keycap>_</keycap> (underscore), and
+ the name of the primary key column(s) in the owned side. In this
+ example <literal>passport_id</literal> because the property name is
+ <literal>passport</literal> and the column id of <literal>Passport
+ </literal>is <literal>id</literal>.</para>
+
+ <para>The third possibility (using an association table) is very
+ exotic.</para>
+
+ <programlisting>
+ at Entity
+public class Customer implements Serializable {
+ @OneToOne(cascade = CascadeType.ALL)
+ <emphasis role="bold">@JoinTable(name = "CustomerPassports"
+ joinColumns = @JoinColumn(name="customer_fk"),
+ inverseJoinColumns = @JoinColumns(name="passport_fk")</emphasis>
+ )
+ public Passport getPassport() {
+ ...
+ }
+
+ at Entity
+public class Passport implements Serializable {
+ @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
+ public Customer getOwner() {
+ ...
+}
+ </programlisting>
+
+ <para>A <classname>Customer</classname> is linked to a
+ <classname>Passport</classname> through a association table named
+ <literal>CustomerPassports</literal> ; this association table has a
+ foreign key column named <literal>passport_fk</literal> pointing to
+ the <literal>Passport</literal> table (materialized by the
+ <literal>inverseJoinColumn</literal>, and a foreign key column named
+ <literal>customer_fk</literal> pointing to the
+ <literal>Customer</literal> table materialized by the
+ <literal>joinColumns</literal> attribute.</para>
+
+ <para>You must declare the join table name and the join columns
+ explicitly in such a mapping.</para>
+ </sect3>
+
+ <sect3>
+ <title>Many-to-one</title>
+
+ <para>Many-to-one associations are declared at the property level with
+ the annotation <literal>@ManyToOne</literal>:</para>
+
+ <programlisting>
+ at Entity()
+public class Flight implements Serializable {
+ <emphasis role="bold">@ManyToOne</emphasis>( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
+ @JoinColumn(name="COMP_ID")
+ public Company getCompany() {
+ return company;
+ }
+ ...
+}
+ </programlisting>
+
+ <para>The <literal>@JoinColumn</literal> attribute is optional, the
+ default value(s) is like in one to one, the concatenation of the name
+ of the relationship in the owner side, <keycap>_</keycap>
+ (underscore), and the name of the primary key column in the owned
+ side. In this example <literal>company_id</literal> because the
+ property name is <literal>company</literal> and the column id of
+ Company is <literal>id</literal>.</para>
+
+ <para><literal>@ManyToOne</literal> has a parameter named
+ <literal>targetEntity</literal> which describes the target entity
+ name. You usually don't need this parameter since the default value
+ (the type of the property that stores the association) is good in
+ almost all cases. However this is useful when you want to use
+ interfaces as the return type instead of the regular entity.</para>
+
+ <programlisting>
+ at Entity()
+public class Flight implements Serializable {
+ @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, <emphasis
+ role="bold">targetEntity=CompanyImpl.class</emphasis> )
+ @JoinColumn(name="COMP_ID")
+ public Company getCompany() {
+ return company;
+ }
+ ...
+}
+
+public interface Company {
+ ...
+ </programlisting>
+
+ <para>You can alse map a many to one association through an
+ association table. This association table described by the
+ <literal>@JoinTable</literal> annotation will contains a foreign key
+ referencing back the entity table (through
+ <literal>@JoinTable.joinColumns</literal>) and a a foreign key
+ referencing the target entity table (through
+ <literal>@JoinTable.inverseJoinColumns</literal>).</para>
+
+ <programlisting>
+ at Entity()
+public class Flight implements Serializable {
+ @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
+ <emphasis role="bold">@JoinTable(name="Flight_Company",
+ joinColumns = @JoinColumn(name="FLIGHT_ID"),
+ inverseJoinColumns = @JoinColumns(name="COMP_ID")
+ )</emphasis>
+ public Company getCompany() {
+ return company;
+ }
+ ...
+}
+ </programlisting>
+ </sect3>
+
+ <sect3 id="entity-mapping-association-collections" revision="1">
+ <title>Collections</title>
+
+ <sect4 id="entity-mapping-association-collections-overview"
+ revision="1">
+ <title>Overview</title>
+
+ <para>You can map <classname>Collection</classname>,
+ <literal>List</literal> (ie ordered lists, not indexed lists),
+ <literal>Map</literal> and <classname>Set</classname>. The EJB3
+ specification describes how to map an ordered list (ie a list
+ ordered at load time) using
+ <literal>@javax.persistence.OrderBy</literal> annotation: this
+ annotation takes into parameter a list of comma separated (target
+ entity) properties to order the collection by (eg <code>firstname
+ asc, age desc</code>), if the string is empty, the collection will
+ be ordered by id. For true indexed collections, please refer to the
+ <xref linkend="entity-hibspec" />. EJB3 allows you to map Maps using
+ as a key one of the target entity property using
+ <literal>@MapKey(name="myProperty")</literal> (myProperty is a
+ property name in the target entity). When using
+ <literal>@MapKey</literal> (without property name), the target
+ entity primary key is used. The map key uses the same column as the
+ property pointed out: there is no additional column defined to hold
+ the map key, and it does make sense since the map key actually
+ represent a target property. Be aware that once loaded, the key is
+ no longer kept in sync with the property, in other words, if you
+ change the property value, the key will not change automatically in
+ your Java model (for true map support please refers to <xref
+ linkend="entity-hibspec" />). Many people confuse
+ <literal><map></literal> capabilities and
+ <literal>@MapKey</literal> ones. These are two different features.
+ <literal>@MapKey</literal> still has some limitations, please check
+ the forum or the JIRA tracking system for more informations.</para>
+
+ <para>Hibernate has several notions of collections.</para>
+
+ <para></para>
+
+ <table>
+ <title>Collections semantics</title>
+
+ <tgroup cols="3">
+ <colspec colname="c1" />
+
+ <colspec colname="c2" />
+
+ <colspec colname="c3" colnum="2" />
+
+ <thead>
+ <row>
+ <entry>Semantic</entry>
+
+ <entry>java representation</entry>
+
+ <entry>annotations</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>Bag semantic</entry>
+
+ <entry>java.util.List, java.util.Collection</entry>
+
+ <entry>@org.hibernate.annotations.CollectionOfElements or
+ @OneToMany or @ManyToMany</entry>
+ </row>
+
+ <row>
+ <entry>Bag semantic with primary key (withtout the
+ limitations of Bag semantic)</entry>
+
+ <entry>java.util.List, java.util.Collection</entry>
+
+ <entry>(@org.hibernate.annotations.CollectionOfElements or
+ @OneToMany or @ManyToMany) and @CollectionId</entry>
+ </row>
+
+ <row>
+ <entry>List semantic</entry>
+
+ <entry>java.util.List</entry>
+
+ <entry>(@org.hibernate.annotations.CollectionOfElements or
+ @OneToMany or @ManyToMany) and
+ @org.hibernate.annotations.IndexColumn</entry>
+ </row>
+
+ <row>
+ <entry>Set semantic</entry>
+
+ <entry>java.util.Set</entry>
+
+ <entry>@org.hibernate.annotations.CollectionOfElements or
+ @OneToMany or @ManyToMany</entry>
+ </row>
+
+ <row>
+ <entry>Map semantic</entry>
+
+ <entry>java.util.Map</entry>
+
+ <entry>(@org.hibernate.annotations.CollectionOfElements or
+ @OneToMany or @ManyToMany) and (nothing or
+ @org.hibernate.annotations.MapKey/MapKeyManyToMany for true
+ map support, OR @javax.persistence.MapKey</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <remark>So specifically, java.util.List collections without
+ @org.hibernate.annotations.IndexColumn are going to be considered as
+ bags.</remark>
+
+ <para>Collection of primitive, core type or embedded objects is not
+ supported by the EJB3 specification. Hibernate Annotations allows
+ them however (see <xref linkend="entity-hibspec" />).</para>
+
+ <programlisting>@Entity public class City {
+ @OneToMany(mappedBy="city")
+ <emphasis role="bold">@OrderBy("streetName")</emphasis>
+ public List<Street> getStreets() {
+ return streets;
+ }
+...
+}
+
+ at Entity public class Street {
+ <emphasis role="bold">public String getStreetName()</emphasis> {
+ return streetName;
+ }
+
+ @ManyToOne
+ public City getCity() {
+ return city;
+ }
+ ...
+}
+
+
+ at Entity
+public class Software {
+ @OneToMany(mappedBy="software")
+ <emphasis role="bold">@MapKey(name="codeName")</emphasis>
+ public Map<String, Version> getVersions() {
+ return versions;
+ }
+...
+}
+
+ at Entity
+ at Table(name="tbl_version")
+public class Version {
+ <emphasis role="bold">public String getCodeName()</emphasis> {...}
+
+ @ManyToOne
+ public Software getSoftware() { ... }
+...
+}</programlisting>
+
+ <para>So <literal>City</literal> has a collection of
+ <literal>Street</literal>s that are ordered by
+ <literal>streetName</literal> (of <literal>Street</literal>) when
+ the collection is loaded. <literal>Software</literal> has a map of
+ <literal>Version</literal>s which key is the
+ <literal>Version</literal> <literal>codeName</literal>.</para>
+
+ <para>Unless the collection is a generic, you will have to define
+ <literal>targetEntity</literal>. This is a annotation attribute that
+ take the target entity class as a value.</para>
+ </sect4>
+
+ <sect4 id="entity-mapping-association-collection-onetomany"
+ revision="2">
+ <title>One-to-many</title>
+
+ <para>One-to-many associations are declared at the property level
+ with the annotation <literal>@OneToMany</literal>. One to many
+ associations may be bidirectional.</para>
+
+ <sect5>
+ <title>Bidirectional</title>
+
+ <para>Since many to one are (almost) always the owner side of a
+ bidirectional relationship in the EJB3 spec, the one to many
+ association is annotated by <literal>@OneToMany( mappedBy=...
+ )</literal></para>
+
+ <programlisting>@Entity
+public class Troop {
+ @OneToMany(mappedBy="troop")
+ public Set<Soldier> getSoldiers() {
+ ...
+}
+
+ at Entity
+public class Soldier {
+ @ManyToOne
+ @JoinColumn(name="troop_fk")
+ public Troop getTroop() {
+ ...
+} </programlisting>
+
+ <para><classname>Troop</classname> has a bidirectional one to many
+ relationship with <literal>Soldier</literal> through the
+ <literal>troop</literal> property. You don't have to (must not)
+ define any physical mapping in the <literal>mappedBy</literal>
+ side.</para>
+
+ <para>To map a bidirectional one to many, with the one-to-many
+ side as the owning side, you have to remove the
+ <literal>mappedBy</literal> element and set the many to one
+ <literal>@JoinColumn</literal> as insertable and updatable to
+ false. This solution is obviously not optimized and will produce
+ some additional UPDATE statements.</para>
+
+ <programlisting>@Entity
+public class Troop {
+ @OneToMany
+ @JoinColumn(name="troop_fk") //we need to duplicate the physical information
+ public Set<Soldier> getSoldiers() {
+ ...
+}
+
+ at Entity
+public class Soldier {
+ @ManyToOne
+ @JoinColumn(name="troop_fk", insertable=false, updatable=false)
+ public Troop getTroop() {
+ ...
+}</programlisting>
+ </sect5>
+
+ <sect5>
+ <title>Unidirectional</title>
+
+ <para>A unidirectional one to many using a foreign key column in
+ the owned entity is not that common and not really recommended. We
+ strongly advise you to use a join table for this kind of
+ association (as explained in the next section). This kind of
+ association is described through a
+ <literal>@JoinColumn</literal></para>
+
+ <programlisting>
+ at Entity
+public class Customer implements Serializable {
+ @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+ @JoinColumn(name="CUST_ID")
+ public Set<Ticket> getTickets() {
+ ...
+}
+
+ at Entity
+public class Ticket implements Serializable {
+ ... //no bidir
+}
+ </programlisting>
+
+ <para><literal>Customer</literal> describes a unidirectional
+ relationship with <literal>Ticket</literal> using the join column
+ <literal>CUST_ID</literal>.</para>
+ </sect5>
+
+ <sect5>
+ <title>Unidirectional with join table</title>
+
+ <para>A unidirectional one to many with join table is much
+ preferred. This association is described through an
+ <literal>@JoinTable</literal>.</para>
+
+ <programlisting>
+ at Entity
+public class Trainer {
+ @OneToMany
+ @JoinTable(
+ name="TrainedMonkeys",
+ joinColumns = { @JoinColumn( name="trainer_id") },
+ inverseJoinColumns = @JoinColumn( name="monkey_id")
+ )
+ public Set<Monkey> getTrainedMonkeys() {
+ ...
+}
+
+ at Entity
+public class Monkey {
+ ... //no bidir
+}
+ </programlisting>
+
+ <para><literal>Trainer</literal> describes a unidirectional
+ relationship with <classname>Monkey</classname> using the join
+ table <classname>TrainedMonkeys</classname>, with a foreign key
+ <literal>trainer_id</literal> to <literal>Trainer</literal>
+ (<literal>joinColumns</literal>) and a foreign key
+ <literal>monkey_id</literal> to <literal>Monkey</literal>
+ (<literal>inversejoinColumns</literal>).</para>
+ </sect5>
+
+ <sect5 id="entity-mapping-association-collection-manytomany-default"
+ revision="1">
+ <title>Defaults</title>
+
+ <para>Without describing any physical mapping, a unidirectional
+ one to many with join table is used. The table name is the
+ concatenation of the owner table name, <keycap>_</keycap>, and the
+ other side table name. The foreign key name(s) referencing the
+ owner table is the concatenation of the owner table,
+ <keycap>_</keycap>, and the owner primary key column(s) name. The
+ foreign key name(s) referencing the other side is the
+ concatenation of the owner property name, <keycap>_</keycap>, and
+ the other side primary key column(s) name. A unique constraint is
+ added to the foreign key referencing the other side table to
+ reflect the one to many.</para>
+
+ <programlisting>
+ at Entity
+public class Trainer {
+ @OneToMany
+ public Set<Tiger> getTrainedTigers() {
+ ...
+}
+
+ at Entity
+public class Tiger {
+ ... //no bidir
+}
+ </programlisting>
+
+ <para><classname>Trainer</classname> describes a unidirectional
+ relationship with <classname>Tiger</classname> using the join
+ table <literal>Trainer_Tiger</literal>, with a foreign key
+ <literal>trainer_id</literal> to <literal>Trainer</literal> (table
+ name, <keycap>_</keycap>, trainer id) and a foreign key
+ <literal>trainedTigers_id</literal> to <literal>Monkey</literal>
+ (property name, <keycap>_</keycap>, Tiger primary column).</para>
+ </sect5>
+ </sect4>
+
+ <sect4 id="eentity-mapping-association-collection-manytomany"
+ revision="">
+ <title>Many-to-many</title>
+
+ <sect5>
+ <title>Definition</title>
+
+ <para>A many-to-many association is defined logically using the
+ <literal>@ManyToMany</literal> annotation. You also have to
+ describe the association table and the join conditions using the
+ <literal>@JoinTable</literal> annotation. If the association is
+ bidirectional, one side has to be the owner and one side has to be
+ the inverse end (ie. it will be ignored when updating the
+ relationship values in the association table):</para>
+
+ <programlisting>
+ at Entity
+public class Employer implements Serializable {
+ @ManyToMany(
+ targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,
+ cascade={CascadeType.PERSIST, CascadeType.MERGE}
+ )
+ @JoinTable(
+ name="EMPLOYER_EMPLOYEE",
+ joinColumns={@JoinColumn(name="EMPER_ID")},
+ inverseJoinColumns={@JoinColumn(name="EMPEE_ID")}
+ )
+ public Collection getEmployees() {
+ return employees;
+ }
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Entity
+public class Employee implements Serializable {
+ @ManyToMany(
+ cascade={CascadeType.PERSIST, CascadeType.MERGE},
+ mappedBy="employees"
+ targetEntity=Employer.class
+ )
+ public Collection getEmployers() {
+ return employers;
+ }
+}
+ </programlisting>
+
+ <para>We've already shown the many declarations and the detailed
+ attributes for associations. We'll go deeper in the
+ <literal>@JoinTable</literal> description, it defines a
+ <literal>name</literal>, an array of join columns (an array in
+ annotation is defined using { A, B, C }), and an array of inverse
+ join columns. The latter ones are the columns of the association
+ table which refer to the <classname>Employee</classname> primary
+ key (the "other side").</para>
+
+ <para>As seen previously, the other side don't have to (must not)
+ describe the physical mapping: a simple
+ <literal>mappedBy</literal> argument containing the owner side
+ property name bind the two.</para>
+ </sect5>
+
+ <sect5>
+ <title>Default values</title>
+
+ <para>As any other annotations, most values are guessed in a many
+ to many relationship. Without describing any physical mapping in a
+ unidirectional many to many the following rules applied. The table
+ name is the concatenation of the owner table name,
+ <keycap>_</keycap> and the other side table name. The foreign key
+ name(s) referencing the owner table is the concatenation of the
+ owner table name, <keycap>_</keycap> and the owner primary key
+ column(s). The foreign key name(s) referencing the other side is
+ the concatenation of the owner property name, <keycap>_</keycap>,
+ and the other side primary key column(s). These are the same rules
+ used for a unidirectional one to many relationship.</para>
+
+ <programlisting>
+ at Entity
+public class Store {
+ @ManyToMany(cascade = CascadeType.PERSIST)
+ public Set<City> getImplantedIn() {
+ ...
+ }
+}
+
+ at Entity
+public class City {
+ ... //no bidirectional relationship
+}
+ </programlisting>
+
+ <para>A <literal>Store_City</literal> is used as the join table.
+ The <literal>Store_id</literal> column is a foreign key to the
+ <literal>Store</literal> table. The
+ <literal>implantedIn_id</literal> column is a foreign key to the
+ <literal>City</literal> table.</para>
+
+ <para>Without describing any physical mapping in a bidirectional
+ many to many the following rules applied. The table name is the
+ concatenation of the owner table name, <keycap>_</keycap> and the
+ other side table name. The foreign key name(s) referencing the
+ owner table is the concatenation of the other side property name,
+ <keycap>_</keycap>, and the owner primary key column(s). The
+ foreign key name(s) referencing the other side is the
+ concatenation of the owner property name, <keycap>_</keycap>, and
+ the other side primary key column(s). These are the same rules
+ used for a unidirectional one to many relationship.</para>
+
+ <programlisting>
+ at Entity
+public class Store {
+ @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+ public Set<Customer> getCustomers() {
+ ...
+ }
+}
+
+ at Entity
+public class Customer {
+ @ManyToMany(mappedBy="customers")
+ public Set<Store> getStores() {
+ ...
+ }
+}
+ </programlisting>
+
+ <para>A <literal>Store_Customer</literal> is used as the join
+ table. The <literal>stores_id</literal> column is a foreign key to
+ the <literal>Store</literal> table. The
+ <literal>customers_id</literal> column is a foreign key to the
+ <literal>Customer</literal> table.</para>
+ </sect5>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>Transitive persistence with cascading</title>
+
+ <para>You probably have noticed the <literal>cascade</literal>
+ attribute taking an array of <classname>CascadeType</classname> as a
+ value. The cascade concept in EJB3 is very is similar to the
+ transitive persistence and cascading of operations in Hibernate, but
+ with slightly different semantics and cascading types:</para>
+
+ <itemizedlist>
+ <listitem>
+ CascadeType.PERSIST: cascades the persist (create) operation to associated entities persist() is called or if the entity is managed
+ </listitem>
+
+ <listitem>
+ CascadeType.MERGE: cascades the merge operation to associated entities if merge() is called or if the entity is managed
+ </listitem>
+
+ <listitem>
+ CascadeType.REMOVE: cascades the remove operation to associated entities if delete() is called
+ </listitem>
+
+ <listitem>
+ CascadeType.REFRESH: cascades the refresh operation to associated entities if refresh() is called
+ </listitem>
+
+ <listitem>
+ CascadeType.ALL: all of the above
+ </listitem>
+ </itemizedlist>
+
+ <para>Please refer to the chapter 6.3 of the EJB3 specification for
+ more information on cascading and create/merge semantics.</para>
+ </sect3>
+
+ <sect3 id="entity-mapping-association-fetching" revision="1">
+ <title>Association fetching</title>
+
+ <para>You have the ability to either eagerly or lazily fetch
+ associated entities. The <literal>fetch</literal> parameter can be set
+ to <literal>FetchType.LAZY</literal> or
+ <literal>FetchType.EAGER</literal>. <literal>EAGER</literal> will try
+ to use an outer join select to retrieve the associated object, while
+ <literal>LAZY</literal> will only trigger a select when the associated
+ object is accessed for the first time. <literal>@OneToMany</literal>
+ and <literal>@ManyToMany</literal> associations are defaulted to
+ <literal>LAZY</literal> and <literal>@OneToOne</literal> and
+ <literal>@ManyToOne</literal> are defaulted to
+ <literal>EAGER</literal>. For more information about static fetching,
+ check <xref linkend="entity-hibspec-singleassoc-fetching" />.</para>
+
+ <para>The recommanded approach is to use <literal>LAZY</literal> onn
+ all static fetching definitions and override this choice dynamically
+ through JPA-QL. JPA-QL has a <literal>fetch</literal> keyword that
+ allows you to override laziness when doing a particular query. This is
+ very useful to improve performance and is decided on a use case to use
+ case basis.</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>Mapping composite primary and foreign keys</title>
+
+ <para>Composite primary keys use a embedded class as the primary key
+ representation, so you'd use the <literal>@Id</literal> and
+ <literal>@Embeddable</literal> annotations. Alternatively, you can use
+ the <literal>@EmbeddedId</literal> annotation. Note that the dependent
+ class has to be serializable and implements
+ <methodname>equals()</methodname>/<methodname>hashCode()</methodname>.
+ You can also use <literal>@IdClass</literal> as described in <xref
+ linkend="entity-mapping-identifier" />.</para>
+
+ <programlisting>
+ at Entity
+public class RegionalArticle implements Serializable {
+
+ @Id
+ public RegionalArticlePk getPk() { ... }
+}
+
+ at Embeddable
+public class RegionalArticlePk implements Serializable { ... }
+ </programlisting>
+
+ <para>or alternatively</para>
+
+ <programlisting>
+ at Entity
+public class RegionalArticle implements Serializable {
+
+ @EmbeddedId
+ public RegionalArticlePk getPk() { ... }
+}
+
+public class RegionalArticlePk implements Serializable { ... }
+ </programlisting>
+
+ <para><literal>@Embeddable</literal> inherit the access type of its
+ owning entity unless the Hibernate specific annotation
+ <literal>@AccessType</literal> is used. Composite foreign keys (if not
+ using the default sensitive values) are defined on associations using
+ the <literal>@JoinColumns</literal> element, which is basically an array
+ of <literal>@JoinColumn</literal>. It is considered a good practice to
+ express <literal>referencedColumnNames</literal> explicitly. Otherwise,
+ Hibernate will suppose that you use the same order of columns as in the
+ primary key declaration.</para>
+
+ <programlisting>
+ at Entity
+public class Parent implements Serializable {
+ @Id
+ public ParentPk id;
+ public int age;
+
+ @OneToMany(cascade=CascadeType.ALL)
+ @JoinColumns ({
+ @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
+ @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
+ @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
+ })
+ public Set<Child> children; //unidirectional
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Entity
+public class Child implements Serializable {
+ @Id @GeneratedValue
+ public Integer id;
+
+ @ManyToOne
+ @JoinColumns ({
+ @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
+ @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
+ @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
+ })
+ public Parent parent; //unidirectional
+}
+ </programlisting>
+
+ <programlisting>
+ at Embeddable
+public class ParentPk implements Serializable {
+ String firstName;
+ String lastName;
+ ...
+}
+ </programlisting>
+
+ <para>Note the explicit usage of the
+ <literal>referencedColumnName</literal>.</para>
+ </sect2>
+
+ <sect2>
+ <title>Mapping secondary tables</title>
+
+ <para>You can map a single entity bean to several tables using the
+ <literal>@SecondaryTable</literal> or
+ <literal>@SecondaryTables</literal> class level annotations. To express
+ that a column is in a particular table, use the <literal>table</literal>
+ parameter of <literal>@Column</literal> or
+ <literal>@JoinColumn</literal>.</para>
+
+ <programlisting>
+ at Entity
+ at Table(name="MainCat")
+<emphasis role="bold">@SecondaryTables({
+ @SecondaryTable(name="Cat1", pkJoinColumns={
+ @PrimaryKeyJoinColumn(name="cat_id", referencedColumnName="id")
+ ),
+ @SecondaryTable(name="Cat2", uniqueConstraints={@UniqueConstraint(columnNames={"storyPart2"})})
+})</emphasis>
+public class Cat implements Serializable {
+
+ private Integer id;
+ private String name;
+ private String storyPart1;
+ private String storyPart2;
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ <emphasis role="bold">@Column(table="Cat1")</emphasis>
+ public String getStoryPart1() {
+ return storyPart1;
+ }
+
+ <emphasis role="bold">@Column(table="Cat2")</emphasis>
+ public String getStoryPart2() {
+ return storyPart2;
+ }
+</programlisting>
+
+ <para>In this example, <literal>name</literal> will be in
+ <literal>MainCat</literal>. <literal>storyPart1</literal> will be in
+ <literal>Cat1</literal> and <literal>storyPart2</literal> will be in
+ <literal>Cat2</literal>. <literal>Cat1</literal> will be joined to
+ <literal>MainCat</literal> using the <literal>cat_id</literal> as a
+ foreign key, and <literal>Cat2</literal> using <literal>id</literal> (ie
+ the same column name, the <literal>MainCat</literal> id column has).
+ Plus a unique constraint on <literal>storyPart2</literal> has been
+ set.</para>
+
+ <para>Check out the JBoss EJB 3 tutorial or the Hibernate Annotations
+ unit test suite for more examples.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="entity-mapping-query">
+ <title>Mapping Queries</title>
+
+ <sect2 id="entity-mapping-query-hql" label="Mapping JPAQL/HQL queries"
+ revision="1">
+ <title>Mapping JPAQL/HQL queries</title>
+
+ <para>You can map EJBQL/HQL queries using annotations.
+ <literal>@NamedQuery</literal> and <literal>@NamedQueries</literal> can
+ be defined at the class level or in a JPA XML file. However their
+ definitions are global to the session factory/entity manager factory
+ scope. A named query is defined by its name and the actual query
+ string.</para>
+
+ <programlisting><entity-mappings>
+ <named-query name="plane.getAll">
+ <query>select p from Plane p</query>
+ </named-query>
+ ...
+</entity-mappings>
+...
+
+ at Entity
+ at NamedQuery(name="night.moreRecentThan", query="select n from Night n where n.date >= :date")
+public class Night {
+ ...
+}
+
+public class MyDao {
+ doStuff() {
+ Query q = s.getNamedQuery("night.moreRecentThan");
+ q.setDate( "date", aMonthAgo );
+ List results = q.list();
+ ...
+ }
+ ...
+}
+ </programlisting>
+
+ <para>You can also provide some hints to a query through an array of
+ <literal>QueryHint</literal> through a <literal>hints</literal>
+ attribute.</para>
+
+ <para>The availabe Hibernate hints are</para>
+
+ <para></para>
+
+ <table>
+ <title>Query hints</title>
+
+ <tgroup cols="2">
+ <thead>
+ <colspec colname="c1" />
+
+ <colspec colname="c2" colnum="2" />
+
+ <row>
+ <entry>hint</entry>
+
+ <entry colname="c2">description</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>org.hibernate.cacheable</entry>
+
+ <entry>Whether the query should interact with the second level
+ cache (defualt to false)</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.cacheRegion</entry>
+
+ <entry>Cache region name (default used otherwise)</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.timeout</entry>
+
+ <entry>Query timeout</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.fetchSize</entry>
+
+ <entry>resultset fetch size</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.flushMode</entry>
+
+ <entry>Flush mode used for this query</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.cacheMode</entry>
+
+ <entry>Cache mode used for this query</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.readOnly</entry>
+
+ <entry>Entities loaded by this query should be in read only mode
+ or not (default to false)</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.comment</entry>
+
+ <entry>Query comment added to the generated SQL</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+
+ <sect2 id="entity-mapping-query-native" revision="2">
+ <title>Mapping native queries</title>
+
+ <para>You can also map a native query (ie a plain SQL query). To achieve
+ that, you need to describe the SQL resultset structure using
+ <literal>@SqlResultSetMapping</literal> (or
+ <literal>@SqlResultSetMappings</literal> if you plan to define several
+ resulset mappings). Like <literal>@NamedQuery</literal>, a
+ <literal>@SqlResultSetMapping</literal> can be defined at class level or
+ in a JPA XML file. However its scope is global to the
+ application.</para>
+
+ <para>As we will see, a <literal>resultSetMapping</literal> parameter is
+ defined in <literal>@NamedNativeQuery</literal>, it represents the name
+ of a defined <literal>@SqlResultSetMapping</literal>. The resultset
+ mapping declares the entities retrieved by this native query. Each field
+ of the entity is bound to an SQL alias (or column name). All fields of
+ the entity including the ones of subclasses and the foreign key columns
+ of related entities have to be present in the SQL query. Field
+ definitions are optional provided that they map to the same column name
+ as the one declared on the class property.</para>
+
+ <para><programlisting>@NamedNativeQuery(name="night&area", query="select night.id nid, night.night_duration, "
+ + " night.night_date, area.id aid, night.area_id, area.name "
+ + "from Night night, Area area where night.area_id = area.id", <emphasis
+ role="bold">resultSetMapping="joinMapping"</emphasis>)
+ at SqlResultSetMapping(name="joinMapping", entities={
+ @EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class, fields = {
+ @FieldResult(name="id", column="nid"),
+ @FieldResult(name="duration", column="night_duration"),
+ @FieldResult(name="date", column="night_date"),
+ @FieldResult(name="area", column="area_id"),
+ discriminatorColumn="disc"
+ }),
+ @EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class, fields = {
+ @FieldResult(name="id", column="aid"),
+ @FieldResult(name="name", column="name")
+ })
+ }
+)</programlisting></para>
+
+ <para>In the above example, the <literal>night&area</literal> named
+ query use the <literal>joinMapping</literal> result set mapping. This
+ mapping returns 2 entities, <literal>Night</literal> and
+ <literal>Area</literal>, each property is declared and associated to a
+ column name, actually the column name retrieved by the query. Let's now
+ see an implicit declaration of the property / column.</para>
+
+ <programlisting>@Entity
+<emphasis role="bold">@SqlResultSetMapping(name="implicit", entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class))
+ at NamedNativeQuery(name="implicitSample", query="select * from SpaceShip", resultSetMapping="implicit")</emphasis>
+public class SpaceShip {
+ private String name;
+ private String model;
+ private double speed;
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Column(name="model_txt")
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public double getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(double speed) {
+ this.speed = speed;
+ }
+}</programlisting>
+
+ <para>In this example, we only describe the entity member of the result
+ set mapping. The property / column mappings is done using the entity
+ mapping values. In this case the <literal>model</literal> property is
+ bound to the <literal>model_txt </literal>column. If the association to
+ a related entity involve a composite primary key, a
+ <literal>@FieldResult</literal> element should be used for each foreign
+ key column. The <literal>@FieldResult</literal> name is composed of the
+ property name for the relationship, followed by a dot ("."), followed by
+ the name or the field or property of the primary key.</para>
+
+ <programlisting>@Entity
+ at SqlResultSetMapping(name="compositekey",
+ entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class,
+ fields = {
+ @FieldResult(name="name", column = "name"),
+ @FieldResult(name="model", column = "model"),
+ @FieldResult(name="speed", column = "speed"),
+<emphasis role="bold"> @FieldResult(name="captain.firstname", column = "firstn"),
+ @FieldResult(name="captain.lastname", column = "lastn"),</emphasis>
+ @FieldResult(name="dimensions.length", column = "length"),
+ @FieldResult(name="dimensions.width", column = "width")
+ }),
+ columns = { @ColumnResult(name = "surface"),
+ @ColumnResult(name = "volume") } )
+
+ at NamedNativeQuery(name="compositekey",
+ query="select name, model, speed, lname as lastn, fname as firstn, length, width, length * width as surface from SpaceShip",
+ resultSetMapping="compositekey")
+} )
+public class SpaceShip {
+ private String name;
+ private String model;
+ private double speed;
+ private Captain captain;
+ private Dimensions dimensions;
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne(fetch= FetchType.LAZY)
+ @JoinColumns( {
+ @JoinColumn(name="fname", referencedColumnName = "firstname"),
+ @JoinColumn(name="lname", referencedColumnName = "lastname")
+ } )
+ public Captain getCaptain() {
+ return captain;
+ }
+
+ public void setCaptain(Captain captain) {
+ this.captain = captain;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public double getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(double speed) {
+ this.speed = speed;
+ }
+
+ public Dimensions getDimensions() {
+ return dimensions;
+ }
+
+ public void setDimensions(Dimensions dimensions) {
+ this.dimensions = dimensions;
+ }
+}
+
+ at Entity
+ at IdClass(Identity.class)
+public class Captain implements Serializable {
+ private String firstname;
+ private String lastname;
+
+ @Id
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ @Id
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+}
+</programlisting>
+
+ <note>
+ <para>If you look at the dimension property, you'll see that Hibernate
+ supports the dotted notation for embedded objects (you can even have
+ nested embedded objects). EJB3 implementations do not have to support
+ this feature, we do :-)</para>
+ </note>
+
+ <para>If you retrieve a single entity and if you use the default
+ mapping, you can use the <literal>resultClass</literal> attribute
+ instead of <literal>resultSetMapping</literal>:</para>
+
+ <programlisting><emphasis role="bold">@NamedNativeQuery(name="implicitSample", query="select * from SpaceShip",
+ resultClass=SpaceShip.class)</emphasis>
+public class SpaceShip {</programlisting>
+
+ <para>In some of your native queries, you'll have to return scalar
+ values, for example when building report queries. You can map them in
+ the <literal>@SqlResultsetMapping</literal> through
+ <literal>@ColumnResult</literal>. You actually can even mix, entities
+ and scalar returns in the same native query (this is probably not that
+ common though).</para>
+
+ <programlisting><emphasis role="bold">@SqlResultSetMapping(name="scalar", columns=@ColumnResult(name="dimension"))
+ at NamedNativeQuery(name="scalar", query="select length*width as dimension from SpaceShip", resultSetMapping="scalar")</emphasis></programlisting>
+
+ <para>An other query hint specific to native queries has been
+ introduced: <literal>org.hibernate.callable</literal> which can be true
+ or false depending on whether the query is a stored procedure or
+ not.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="entity-hibspec" xreflabel="Hibernate Annotation Extensions">
+ <title>Hibernate Annotation Extensions</title>
+
+ <para>Hibernate 3.1 offers a variety of additional annotations that you
+ can mix/match with your EJB 3 entities. They have been designed as a
+ natural extension of EJB3 annotations.</para>
+
+ <para>To empower the EJB3 capabilities, hibernate provides specific
+ annotations that match hibernate features. The
+ <classname>org.hibernate.annotations</classname> package contains all
+ these annotations extensions.</para>
+
+ <sect2 id="entity-hibspec-entity" revision="3">
+ <title>Entity</title>
+
+ <para>You can fine tune some of the actions done by Hibernate on
+ entities beyond what the EJB3 spec offers.</para>
+
+ <para><classname>@org.hibernate.annotations.Entity</classname> adds
+ additional metadata that may be needed beyond what is defined in the
+ standard <literal>@Entity</literal> <itemizedlist>
+ <listitem>
+ mutable: whether this entity is mutable or not
+ </listitem>
+
+ <listitem>
+ dynamicInsert: allow dynamic SQL for inserts
+ </listitem>
+
+ <listitem>
+ dynamicUpdate: allow dynamic SQL for updates
+ </listitem>
+
+ <listitem>
+ selectBeforeUpdate: Specifies that Hibernate should never perform an SQL UPDATE unless it is certain that an object is actually modified.
+ </listitem>
+
+ <listitem>
+ polymorphism: whether the entity polymorphism is of PolymorphismType.IMPLICIT (default) or PolymorphismType.EXPLICIT
+ </listitem>
+
+ <listitem>
+ optimisticLock: optimistic locking strategy (OptimisticLockType.VERSION, OptimisticLockType.NONE, OptimisticLockType.DIRTY or OptimisticLockType.ALL)
+ </listitem>
+ </itemizedlist></para>
+
+ <para><note>
+ <para>@javax.persistence.Entity is still mandatory,
+ @org.hibernate.annotations.Entity is not a replacement.</para>
+ </note></para>
+
+ <para>Here are some additional Hibernate annotation extensions</para>
+
+ <para><literal>@org.hibernate.annotations.BatchSize</literal> allows you
+ to define the batch size when fetching instances of this entity ( eg.
+ <literal>@BatchSize(size=4)</literal> ). When loading a given entity,
+ Hibernate will then load all the uninitialized entities of the same type
+ in the persistence context up to the batch size.</para>
+
+ <para><literal>@org.hibernate.annotations.Proxy</literal> defines the
+ laziness attributes of the entity. lazy (default to true) define whether
+ the class is lazy or not. proxyClassName is the interface used to
+ generate the proxy (default is the class itself).</para>
+
+ <para><literal>@org.hibernate.annotations.Where</literal> defines an
+ optional SQL WHERE clause used when instances of this class is
+ retrieved.</para>
+
+ <para><literal>@org.hibernate.annotations.Check</literal> defines an
+ optional check constraints defined in the DDL statetement.</para>
+
+ <para><literal>@OnDelete(action=OnDeleteAction.CASCADE)</literal> on
+ joined subclasses: use a SQL cascade delete on deletion instead of the
+ regular Hibernate mechanism.</para>
+
+ <para><literal>@Table(appliesTo="tableName", indexes = {
+ @Index(name="index1", columnNames={"column1", "column2"} ) } )</literal>
+ creates the defined indexes on the columns of table
+ <literal>tableName</literal>. This can be applied on the primary table
+ or any secondary table. The <literal>@Tables</literal> annotation allows
+ your to apply indexes on different tables. This annotation is expected
+ where <literal>@javax.persistence.Table</literal> or
+ <literal>@javax.persistence.SecondaryTable</literal>(s) occurs.</para>
+
+ <note>
+ <para><literal>@org.hibernate.annotations.Table</literal> is a
+ complement, not a replacement to
+ <literal>@javax.persistence.Table</literal>. Especially, if you want
+ to change the default name of a table, you must use
+ <literal>@javax.persistence.Table</literal>, not
+ <literal>@org.hibernate.annotations.Table</literal>.</para>
+ </note>
+
+ <para><literal>@org.hibernate.annotations.Table</literal> can also be
+ used to define the following elements of secondary tables:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>fetch</literal>: If set to JOIN, the default,
+ Hibernate will use an inner join to retrieve a secondary table
+ defined by a class or its superclasses and an outer join for a
+ secondary table defined by a subclass. If set to select then
+ Hibernate will use a sequential select for a secondary table defined
+ on a subclass, which will be issued only if a row turns out to
+ represent an instance of the subclass. Inner joins will still be
+ used to retrieve a secondary defined by the class and its
+ superclasses.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>inverse</literal>: If true, Hibernate will not try to
+ insert or update the properties defined by this join. Default to
+ false.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>optional</literal>: If enabled (the default),
+ Hibernate will insert a row only if the properties defined by this
+ join are non-null and will always use an outer join to retrieve the
+ properties.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>foreignKey</literal>: defines the Foreign Key name of
+ a secondary table pointing back to the primary table.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para><literal>@Immutable</literal> marks an entity as immutable. The
+ entity may not be updated or deleted by the application. This allows
+ Hibernate to make some minor performance optimizations.</para>
+
+ <para><literal>@Persister</literal> lets you define your own custom
+ persistence strategy. You may, for example, specify your own subclass of
+ <classname>org.hibernate.persister.EntityPersister</classname> or you
+ might even provide a completely new implementation of the interface
+ <literal>org.hibernate.persister.ClassPersister</literal> that
+ implements persistence via, for example, stored procedure calls,
+ serialization to flat files or LDAP.</para>
+
+ <para><programlisting>@Entity
+ at BatchSize(size=5)
+ at org.hibernate.annotations.Entity(
+ selectBeforeUpdate = true,
+ dynamicInsert = true, dynamicUpdate = true,
+ optimisticLock = OptimisticLockType.ALL,
+ polymorphism = PolymorphismType.EXPLICIT)
+ at Where(clause="1=1")
+ at org.hibernate.annotations.Table(name="Forest", indexes = { @Index(name="idx", columnNames = { "name", "length" } ) } )
+ at Persister(impl=MyEntityPersister.class)
+public class Forest { ... }</programlisting><programlisting>@Entity
+ at Inheritance(
+ strategy=InheritanceType.JOINED
+)
+public class Vegetable { ... }
+
+ at Entity
+ at OnDelete(action=OnDeleteAction.CASCADE)
+public class Carrot extends Vegetable { ... }</programlisting></para>
+ </sect2>
+
+ <sect2 id="entity-hibspec-identifier" label="Identifier" revision="1">
+ <title>Identifier</title>
+
+ <para><literal><literal>@org.hibernate.annotations.GenericGenerator</literal>
+ allows you to define an Hibernate specific id
+ generator.</literal></para>
+
+ <para><programlisting>@Id @GeneratedValue(generator="system-uuid")
+ at GenericGenerator(name="system-uuid", strategy = "uuid")
+public String getId() {
+
+ at Id @GeneratedValue(generator="hibseq")
+ at GenericGenerator(name="hibseq", strategy = "seqhilo",
+ parameters = {
+ @Parameter(name="max_lo", value = "5"),
+ @Parameter(name="sequence", value="heybabyhey")
+ }
+)
+public Integer getId() {</programlisting></para>
+
+ <para><literal>strategy</literal> is the short name of an Hibernate3
+ generator strategy or the fully qualified class name of an
+ <classname>IdentifierGenerator</classname> implementation. You can add
+ some parameters through the <literal>parameters</literal>
+ attribute.</para>
+
+ <para>Contrary to its standard counterpart,
+ <literal>@GenericGenerator</literal> can be used in package level
+ annotations, making it an application level generator (just like if it
+ were in a JPA XML file).</para>
+
+ <programlisting>@GenericGenerator(name="hibseq", strategy = "seqhilo",
+ parameters = {
+ @Parameter(name="max_lo", value = "5"),
+ @Parameter(name="sequence", value="heybabyhey")
+ }
+)
+package org.hibernate.test.model</programlisting>
+ </sect2>
+
+ <sect2 id="entity-hibspec-property" revision="2">
+ <title>Property</title>
+
+ <sect3>
+ <title>Access type</title>
+
+ <para>The access type is guessed from the position of
+ <literal>@Id</literal> or <literal>@EmbeddedId</literal> in the entity
+ hierarchy. Sub-entities, embedded objects and mapped superclass
+ inherit the access type from the root entity.</para>
+
+ <para>In Hibernate, you can override the access type to:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>use a custom access type strategy</para>
+ </listitem>
+
+ <listitem>
+ <para>fine tune the access type at the class level or at the
+ property level</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>An @AccessType annotation has been introduced to support this
+ behavior. You can define the access type on</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>an entity</para>
+ </listitem>
+
+ <listitem>
+ <para>a superclass</para>
+ </listitem>
+
+ <listitem>
+ <para>an embeddable object</para>
+ </listitem>
+
+ <listitem>
+ <para>a property</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The access type is overriden for the annotated element, if
+ overriden on a class, all the properties of the given class inherit
+ the access type. For root entities, the access type is considered to
+ be the default one for the whole hierarchy (overridable at class or
+ property level).</para>
+
+ <para>If the access type is marked as "property", the getters are
+ scanned for annotations, if the access type is marked as "field", the
+ fields are scanned for annotations. Otherwise the elements marked with
+ @Id or @embeddedId are scanned.</para>
+
+ <para>You can override an access type for a property, but the element
+ to annotate will not be influenced: for example an entity having
+ access type <literal>field</literal>, can annotate a field with
+ <literal>@AccessType("property")</literal>, the access type will then
+ be property for this attribute, the the annotations still have to be
+ carried on the field.</para>
+
+ <para>If a superclass or an embeddable object is not annotated, the
+ root entity access type is used (even if an access type has been
+ define on an intermediate superclass or embeddable object). The
+ russian doll principle does not apply.</para>
+
+ <programlisting>@Entity
+public class Person implements Serializable {
+ @Id @GeneratedValue //access type field
+ Integer id;
+
+ @Embedded
+ @AttributeOverrides({
+ @AttributeOverride(name = "iso2", column = @Column(name = "bornIso2")),
+ @AttributeOverride(name = "name", column = @Column(name = "bornCountryName"))
+ })
+ Country bornIn;
+}
+
+ at Embeddable
+<emphasis role="bold">@AccessType("property")</emphasis> //override access type for all properties in Country
+public class Country implements Serializable {
+ private String iso2;
+ private String name;
+
+ public String getIso2() {
+ return iso2;
+ }
+
+ public void setIso2(String iso2) {
+ this.iso2 = iso2;
+ }
+
+ @Column(name = "countryName")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
+</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>Formula</title>
+
+ <para>Sometimes, you want the Database to do some computation for you
+ rather than in the JVM, you might also create some kind of virtual
+ column. You can use a SQL fragment (aka formula) instead of mapping a
+ property into a column. This kind of property is read only (its value
+ is calculated by your formula fragment).</para>
+
+ <programlisting>@Formula("obj_length * obj_height * obj_width")
+public long getObjectVolume()</programlisting>
+
+ <para>The SQL fragment can be as complex as you want avec even include
+ subselects.</para>
+ </sect3>
+
+ <sect3>
+ <title>Type</title>
+
+ <para><literal>@org.hibernate.annotations.Type</literal> overrides the
+ default hibernate type used: this is generally not necessary since the
+ type is correctly inferred by Hibernate. Please refer to the Hibernate
+ reference guide for more informations on the Hibernate types.</para>
+
+ <para><literal>@org.hibernate.annotations.TypeDef</literal> and
+ <literal>@org.hibernate.annotations.TypeDefs</literal> allows you to
+ declare type definitions. These annotations are placed at the class or
+ package level. Note that these definitions will be global for the
+ session factory (even at the class level) and that type definition has
+ to be defined before any usage.</para>
+
+ <programlisting>@TypeDefs(
+ {
+ @TypeDef(
+ name="caster",
+ typeClass = CasterStringType.class,
+ parameters = {
+ @Parameter(name="cast", value="lower")
+ }
+ )
+ }
+)
+package org.hibernate.test.annotations.entity;
+
+...
+public class Forest {
+ @Type(type="caster")
+ public String getSmallText() {
+ ...
+}
+ </programlisting>
+
+ <para>When using composite user type, you will have to express column
+ definitions. The <literal>@Columns</literal> has been introduced for
+ that purpose.</para>
+
+ <programlisting>@Type(type="org.hibernate.test.annotations.entity.MonetaryAmountUserType")
+ at Columns(columns = {
+ @Column(name="r_amount"),
+ @Column(name="r_currency")
+})
+public MonetaryAmount getAmount() {
+ return amount;
+}
+
+
+public class MonetaryAmount implements Serializable {
+ private BigDecimal amount;
+ private Currency currency;
+ ...
+}</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>Index</title>
+
+ <para>You can define an index on a particular column using the
+ <literal>@Index</literal> annotation on a one column property, the
+ columnNames attribute will then be ignored</para>
+
+ <programlisting>@Column(secondaryTable="Cat1")
+ at Index(name="story1index")
+public String getStoryPart1() {
+ return storyPart1;
+}</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>@Parent</title>
+
+ <para>When inside an embeddable object, you can define one of the
+ properties as a pointer back to the owner element.</para>
+
+ <programlisting>@Entity
+public class Person {
+ @Embeddable public Address address;
+ ...
+}
+
+ at Embeddable
+public class Address {
+ @Parent public Person owner;
+ ...
+}
+
+
+person == person.address.owner</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>Generated properties</title>
+
+ <para>Some properties are generated at insert or update time by your
+ database. Hibernate can deal with such properties and triggers a
+ subsequent select to read these properties.</para>
+
+ <programlisting>@Entity
+public class Antenna {
+ @Id public Integer id;
+ @Generated(GenerationTime.ALWAYS) @Column(insertable = false, updatable = false)
+ public String longitude;
+
+ @Generated(GenerationTime.INSERT) @Column(insertable = false)
+ public String latitude;
+}</programlisting>
+
+ <para>Annotate your property as <literal>@Generated</literal> You have
+ to make sure your insertability or updatability does not conflict with
+ the generation strategy you have chosen. When GenerationTime.INSERT is
+ chosen, the property must not contains insertable columns, when
+ GenerationTime.ALWAYS is chosen, the property must not contains
+ insertable nor updatable columns.</para>
+
+ <para><literal>@Version</literal> properties cannot be
+ <literal>@Generated(INSERT)</literal> by design, it has to be either
+ <literal>NEVER</literal> or <literal>ALWAYS</literal>.</para>
+ </sect3>
+
+ <sect3>
+ <title>@Target</title>
+
+ <para>Sometimes, the type guessed by reflection is not the one you
+ want Hibernate to use. This is especially true on components when an
+ interface is used. You can use <literal>@Target</literal> to by pass
+ the reflection guessing mechanism (very much like the
+ <literal>targetEntity</literal> attribute available on
+ associations.</para>
+
+ <programlisting> @Embedded
+ <emphasis role="bold">@Target(OwnerImpl.class)</emphasis>
+ public Owner getOwner() {
+ return owner;
+ }</programlisting>
+
+ <para></para>
+ </sect3>
+
+ <sect3>
+ <title>Optimistic lock</title>
+
+ <para>It is sometimes useful to avoid increasing the version number
+ even if a given property is dirty (particularly collections). You can
+ do that by annotating the property (or collection) with
+ <literal>@OptimisticLock(excluded=true)</literal>.</para>
+
+ <para>More formally, specifies that updates to this property do not
+ require acquisition of the optimistic lock.</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="entity-hibspec-inheritance" revision="3">
+ <title>Inheritance</title>
+
+ <para>SINGLE_TABLE is a very powerful strategy but sometimes, and
+ especially for legacy systems, you cannot add an additional
+ discriminator column. For that purpose Hibernate has introduced the
+ notion of discriminator formula:
+ <literal>@DiscriminatorFormula</literal> is a replacement of
+ <literal>@DiscriminatorColumn</literal> and use a SQL fragment as a
+ formula for discriminator resolution (no need to have a dedicated
+ column).</para>
+
+ <programlisting>@Entity
+<emphasis role="bold">@DiscriminatorFormula("case when forest_type is null then 0 else forest_type end")</emphasis>
+public class Forest { ... }</programlisting>
+
+ <para>By default, when querying the top entities, Hibernate does not put
+ a restriction clause on the discriminator column. This can be
+ inconvenient if this column contains values not mapped in your hierarchy
+ (through <literal>@DiscriminatorValue</literal>). To work around that
+ you can use <literal>@ForceDiscriminator</literal> (at the class level,
+ next to <literal>@DiscriminatorColumn</literal>). Hibernate will then
+ list the available values when loading the entities.</para>
+
+ <para>You can define the foreign key name generated by Hibernate for
+ subclass tables in the JOINED inheritance strategy.</para>
+
+ <programlisting>@Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+public abstract class File { ... }
+
+ at Entity
+ at ForeignKey(name = "FK_DOCU_FILE")
+public class Document extends File {</programlisting>
+
+ <para>The foreign key from the <literal>Document</literal> table to the
+ <literal>File</literal> table will be named
+ <literal>FK_DOCU_FILE</literal>.</para>
+ </sect2>
+
+ <sect2 id="entity-hibspec-singleassoc">
+ <title>Single Association related annotations</title>
+
+ <para>By default, when Hibernate cannot resolve the association because
+ the expected associated element is not in database (wrong id on the
+ association column), an exception is raised by Hibernate. This might be
+ inconvenient for lecacy and badly maintained schemas. You can ask
+ Hibernate to ignore such elements instead of raising an exception using
+ the <literal>@NotFound</literal> annotation. This annotation can be used
+ on a <literal>@OneToOne</literal> (with FK),
+ <literal>@ManyToOne</literal>, <literal>@OneToMany</literal> or
+ <literal>@ManyToMany</literal> association.</para>
+
+ <programlisting>@Entity
+public class Child {
+ ...
+ @ManyToOne
+ @NotFound(action=NotFoundAction.IGNORE)
+ public Parent getParent() { ... }
+ ...
+}</programlisting>
+
+ <para>Sometimes you want to delegate to your database the deletion of
+ cascade when a given entity is deleted.</para>
+
+ <programlisting>@Entity
+public class Child {
+ ...
+ @ManyToOne
+ @OnDelete(action=OnDeleteAction.CASCADE)
+ public Parent getParent() { ... }
+ ...
+}</programlisting>
+
+ <para>In this case Hibernate generates a cascade delete constraint at
+ the database level.</para>
+
+ <para>Foreign key constraints, while generated by Hibernate, have a
+ fairly unreadable name. You can override the constraint name by use
+ <literal>@ForeignKey</literal>.</para>
+
+ <programlisting>@Entity
+public class Child {
+ ...
+ @ManyToOne
+ <emphasis role="bold">@ForeignKey(name="FK_PARENT")</emphasis>
+ public Parent getParent() { ... }
+ ...
+}
+
+alter table Child add constraint FK_PARENT foreign key (parent_id) references Parent</programlisting>
+
+ <sect3 id="entity-hibspec-singleassoc-fetching"
+ label="Lazy options and fetching modes">
+ <title>Lazy options and fetching modes</title>
+
+ <para>EJB3 comes with the <literal>fetch</literal> option to define
+ lazy loading and fetching modes, however Hibernate has a much more
+ option set in this area. To fine tune the lazy loading and fetching
+ strategies, some additional annotations have been introduced:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>@LazyToOne</literal>: defines the lazyness option
+ on <literal>@ManyToOne</literal> and <literal>@OneToOne</literal>
+ associations. <literal>LazyToOneOption</literal> can be
+ <literal>PROXY</literal> (ie use a proxy based lazy loading),
+ <literal>NO_PROXY</literal> (use a bytecode enhancement based lazy
+ loading - note that build time bytecode processing is necessary)
+ and <literal>FALSE</literal> (association not lazy)</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>@LazyCollection</literal>: defines the lazyness
+ option on <literal>@ManyTo</literal>Many and
+ <literal>@OneToMany</literal> associations. LazyCollectionOption
+ can be <literal>TRUE</literal> (the collection is lazy and will be
+ loaded when its state is accessed), <literal>EXTRA</literal> (the
+ collection is lazy and all operations will try to avoid the
+ collection loading, this is especially useful for huge collections
+ when loading all the elements is not necessary) and FALSE
+ (association not lazy)</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>@Fetch</literal>: defines the fetching strategy
+ used to load the association. <literal>FetchMode</literal> can be
+ <literal>SELECT</literal> (a select is triggered when the
+ association needs to be loaded), <literal>SUBSELECT</literal>
+ (only available for collections, use a subselect strategy - please
+ refers to the Hibernate Reference Documentation for more
+ information) or <literal>JOIN</literal> (use a SQL JOIN to load
+ the association while loading the owner entity).
+ <literal>JOIN</literal> overrides any lazy attribute (an
+ association loaded through a <literal>JOIN</literal> strategy
+ cannot be lazy).</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The Hibernate annotations overrides the EJB3 fetching
+ options.</para>
+
+ <table>
+ <title>Lazy and fetch options equivalent</title>
+
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Annotations</entry>
+
+ <entry>Lazy</entry>
+
+ <entry>Fetch</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>@[One|Many]ToOne](fetch=FetchType.LAZY)</entry>
+
+ <entry>@LazyToOne(PROXY)</entry>
+
+ <entry>@Fetch(SELECT)</entry>
+ </row>
+
+ <row>
+ <entry>@[One|Many]ToOne](fetch=FetchType.EAGER)</entry>
+
+ <entry>@LazyToOne(FALSE)</entry>
+
+ <entry>@Fetch(JOIN)</entry>
+ </row>
+
+ <row>
+ <entry>@ManyTo[One|Many](fetch=FetchType.LAZY)</entry>
+
+ <entry>@LazyCollection(TRUE)</entry>
+
+ <entry>@Fetch(SELECT)</entry>
+ </row>
+
+ <row>
+ <entry>@ManyTo[One|Many](fetch=FetchType.EAGER)</entry>
+
+ <entry>@LazyCollection(FALSE)</entry>
+
+ <entry>@Fetch(JOIN)</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect3>
+ </sect2>
+
+ <sect2 id="entity-hibspec-collection" revision="2">
+ <title>Collection related annotations</title>
+
+ <sect3 id="entity-hibspec-collection-enhance" revision="3">
+ <title>Enhance collection settings</title>
+
+ <para>It is possible to set <itemizedlist>
+ <listitem>
+ the batch size for collections using @BatchSize
+ </listitem>
+
+ <listitem>
+ the where clause, using @Where (applied on the target entity) or @WhereJoinTable (applied on the association table)
+ </listitem>
+
+ <listitem>
+ the check clause, using @Check
+ </listitem>
+
+ <listitem>
+ the SQL order by clause, using @OrderBy
+ </listitem>
+
+ <listitem>
+ the delete cascade strategy through @OnDelete(action=OnDeleteAction.CASCADE)
+ </listitem>
+
+ <listitem>
+ the collection immutability using @Immutable: if set specifies that the elements of the collection never change (a minor performance optimization in some cases)
+ </listitem>
+
+ <listitem>
+ <para>a custom collection persister (ie the persistence strategy
+ used) using <literal>@Persister</literal>: the class must
+ implement
+ <classname>org.hibernate.persister.collectionCollectionPersister</classname>
+ </para>
+ </listitem>
+ </itemizedlist></para>
+
+ <para>You can also declare a sort comparator. Use the
+ <literal>@Sort</literal> annotation. Expressing the comparator type
+ you want between unsorted, natural or custom comparator. If you want
+ to use your own comparator implementation, you'll also have to express
+ the implementation class using the <literal>comparator</literal>
+ attribute. Note that you need to use either a
+ <classname>SortedSet</classname> or a <classname>SortedMap</classname>
+ interface.</para>
+
+ <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+ @JoinColumn(name="CUST_ID")
+ @Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
+ @Where(clause="1=1")
+ @OnDelete(action=OnDeleteAction.CASCADE)
+ public SortedSet<Ticket> getTickets() {
+ return tickets;
+ }</programlisting>
+
+ <para>Please refer to the previous descriptions of these annotations
+ for more informations.</para>
+
+ <para>Foreign key constraints, while generated by Hibernate, have a
+ fairly unreadable name. You can override the constraint name by use
+ <literal>@ForeignKey</literal>. Note that this annotation has to be
+ placed on the owning side of the relationship,
+ <literal>inverseName</literal> referencing to the other side
+ constraint.</para>
+
+ <programlisting>@Entity
+public class Woman {
+ ...
+ @ManyToMany(cascade = {CascadeType.ALL})
+ <emphasis role="bold">@ForeignKey(name = "TO_WOMAN_FK", inverseName = "TO_MAN_FK")</emphasis>
+ public Set<Man> getMens() {
+ return mens;
+ }
+}
+
+alter table Man_Woman add constraint TO_WOMAN_FK foreign key (woman_id) references Woman
+alter table Man_Woman add constraint TO_MAN_FK foreign key (man_id) references Man</programlisting>
+ </sect3>
+
+ <sect3 id="entity-hibspec-collection-extratype" revision="1">
+ <title>Extra collection types</title>
+
+ <sect4>
+ <title>List</title>
+
+ <para>Beyond EJB3, Hibernate Annotations supports true
+ <classname>List</classname> and <classname>Array</classname>. Map
+ your collection the same way as usual and add the
+ @<literal>IndexColumn</literal>. This annotation allows you to
+ describe the column that will hold the index. You can also declare
+ the index value in DB that represent the first element (aka as base
+ index). The usual value is <literal>0</literal> or
+ <literal>1</literal>.</para>
+
+ <programlisting>@OneToMany(cascade = CascadeType.ALL)
+ at IndexColumn(name = "drawer_position", base=1)
+public List<Drawer> getDrawers() {
+ return drawers;
+}</programlisting>
+
+ <note>
+ <para>If you forgot to set <literal>@IndexColumn</literal>, the
+ bag semantic is applied. If you want the bag semantic without the
+ limitations of it, consider using
+ <literal>@CollectionId</literal>.</para>
+ </note>
+ </sect4>
+
+ <sect4 id="entity-hibspec-collection-extratype-map" revision="1">
+ <title>Map</title>
+
+ <para>Hibernate Annotations also supports true Map mappings, if
+ <literal>@javax.persistence.MapKey</literal> is not set, hibernate
+ will map the key element or embeddable object in its/their own
+ columns. To overrides the default columns, you can use
+ <literal>@org.hibernate.annotations.MapKey</literal> if your key is
+ a basic type (defaulted to <literal>mapkey</literal>) or an
+ embeddable object, or you can use
+ <literal>@org.hibernate.annotations.MapKeyManyToMany</literal> if
+ your key is an entity.</para>
+
+ <para>Both <literal>@org.hibernate.annotations.MapKey</literal> and
+ <literal>@org.hibernate.annotations.MapKeyManyToMany</literal>
+ allows you to override the target element to be used. This is
+ especially useful if your collection does not use generics (or if
+ you use interfaces).</para>
+
+ <programlisting> @CollectionOfElements(targetElement = SizeImpl.class)
+ @MapKeyManyToMany(<emphasis role="bold">targetEntity = LuggageImpl.class</emphasis>)
+ private Map<Luggage, Size> sizePerLuggage = new HashMap<Luggage, Size>();</programlisting>
+
+ <para></para>
+ </sect4>
+
+ <sect4 id="entity-hibspec-collection-extratype-indexbidir">
+ <title>Bidirectional association with indexed collections</title>
+
+ <para>A bidirectional association where one end is represented as a
+ <literal>@IndexColumn</literal> or
+ <literal>@org.hibernate.annotations.MapKey[ManyToMany]</literal>
+ requires special consideration. If there is a property of the child
+ class which maps to the index column, no problem, we can continue
+ using <literal>mappedBy</literal> on the collection mapping:</para>
+
+ <programlisting>@Entity
+public class Parent {
+ @OneToMany(mappedBy="parent")
+ @org.hibernate.annotations.MapKey(columns=@Column(name="name"))
+ private Map<String, Child> children;
+ ...
+}
+
+ at Entity
+public class Parent {
+ ...
+ @Basic
+ private String name;
+
+ @ManyToOne
+ @JoinColumn(name="parent_id", nullable=false)
+ private Parent parent;
+ ...
+}</programlisting>
+
+ <para>But, if there is no such property on the child class, we can't
+ think of the association as truly bidirectional (there is
+ information available at one end of the association that is not
+ available at the other end). In this case, we can't map the
+ collection <literal>mappedBy</literal>. Instead, we could use the
+ following mapping:</para>
+
+ <programlisting>@Entity
+public class Parent {
+ @OneToMany
+ @org.hibernate.annotations.MapKey(columns=@Column(name="name"))
+ @JoinColumn(name="parent_id", nullable=false)
+ private Map<String, Child> children;
+ ...
+}
+
+ at Entity
+public class Parent {
+ ...
+ @ManyToOne
+ @JoinColumn(name="parent_id", insertable=false, updatable=false, nullable=false)
+ private Parent parent;
+ ...
+}</programlisting>
+
+ <para>Note that in this mapping, the collection-valued end of the
+ association is responsible for updates to the foreign key.</para>
+ </sect4>
+
+ <sect4>
+ <title>Bag with primary key</title>
+
+ <para>Another interesting feature is the ability to define a
+ surrogate primary key to a bag collection. This remove pretty much
+ all of the drawbacks of bags: update and removal are efficient, more
+ than one <literal>EAGER</literal> bag per query or per entity. This
+ primary key will be contained in a additional column of your
+ collection table but will not be visible to the Java application.
+ @CollectionId is used to mark a collection as id bag, it also allow
+ to override the primary key column(s), the primary key type and the
+ generator strategy. The strategy can be <literal>identity</literal>,
+ or any defined generator name of your application.</para>
+
+ <programlisting>@Entity
+ at TableGenerator(name="ids_generator", table="IDS")
+public class Passport {
+ ...
+
+ @ManyToMany(cascade = CascadeType.ALL)
+ @JoinTable(name="PASSPORT_VISASTAMP")
+ <emphasis role="bold">@CollectionId(
+ columns = @Column(name="COLLECTION_ID"),
+ type=@Type(type="long"),
+ generator = "ids_generator"
+ )</emphasis>
+ private Collection<Stamp> visaStamp = new ArrayList();
+ ...
+}</programlisting>
+ </sect4>
+
+ <sect4>
+ <title>Collection of element or composite elements</title>
+
+ <para>Hibernate Annotations also supports collections of core types
+ (Integer, String, Enums, ...), collections of embeddable objects and
+ even arrays of primitive types. This is known as collection of
+ elements.</para>
+
+ <para>A collection of elements has to be annotated as
+ <literal>@CollectionOfElements</literal> (as a replacement of
+ <literal>@OneToMany</literal>) To define the collection table, the
+ <literal>@JoinTable</literal> annotation is used on the association
+ property, <literal>joinColumns</literal> defines the join columns
+ between the entity primary table and the collection table
+ (inverseJoincolumn is useless and should be left empty). For
+ collection of core types or array of primitive types, you can
+ override the element column definition using a
+ <literal>@Column</literal> on the association property. You can also
+ override the columns of a collection of embeddable object using
+ <literal>@AttributeOverride</literal>. To reach the collection
+ element, you need to append "element" to the attribute override name
+ (eg "element" for core types, or "element.serial" for the serial
+ property of an embeddable element). To reach the index/key of a
+ collection, append "key" instead.</para>
+
+ <programlisting>@Entity
+public class Boy {
+ private Integer id;
+ private Set<String> nickNames = new HashSet<String>();
+ private int[] favoriteNumbers;
+ private Set<Toy> favoriteToys = new HashSet<Toy>();
+ private Set<Character> characters = new HashSet<Character>();
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ public Set<String></emphasis> getNickNames() {
+ return nickNames;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ @JoinTable(
+ table=@Table(name="BoyFavoriteNumbers"),
+ joinColumns = @JoinColumn(name="BoyId")
+ )
+ @Column(name="favoriteNumber", nullable=false)</emphasis>
+ @IndexColumn(name="nbr_index")
+ public int[] getFavoriteNumbers() {
+ return favoriteNumbers;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ @AttributeOverride( name="element.serial", column=@Column(name="serial_nbr") )</emphasis>
+ public Set<Toy> getFavoriteToys() {
+ return favoriteToys;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ public Set<Character></emphasis> getCharacters() {
+ return characters;
+ }
+ ...
+}
+
+public enum Character {
+ GENTLE,
+ NORMAL,
+ AGGRESSIVE,
+ ATTENTIVE,
+ VIOLENT,
+ CRAFTY
+}
+
+ at Embeddable
+public class Toy {
+ public String name;
+ public String serial;
+ public Boy owner;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSerial() {
+ return serial;
+ }
+
+ public void setSerial(String serial) {
+ this.serial = serial;
+ }
+
+ <emphasis role="bold">@Parent</emphasis>
+ public Boy getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Boy owner) {
+ this.owner = owner;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final Toy toy = (Toy) o;
+
+ if ( !name.equals( toy.name ) ) return false;
+ if ( !serial.equals( toy.serial ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = name.hashCode();
+ result = 29 * result + serial.hashCode();
+ return result;
+ }
+}</programlisting>
+
+ <para>On a collection of embeddable objects, the embeddable object
+ can have a property annotated with <literal>@Parent</literal>. This
+ property will then point back to the entity containing the
+ collection.</para>
+
+ <note>
+ <para>Previous versions of Hibernate Annotations used the
+ <literal>@OneToMany</literal> to mark a collection of elements.
+ Due to semantic inconsistencies, we've introduced the annotation
+ <literal>@CollectionOfElements</literal>. Marking collections of
+ elements the old way still work but is considered deprecated and
+ is going to be unsupported in future releases</para>
+ </note>
+ </sect4>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>Cache</title>
+
+ <para>In order to optimize your database accesses, you can activave the
+ so called second level cache of Hibernate. This cache is configurable on
+ a per entity and per collection basis.</para>
+
+ <para><literal>@org.hibernate.annotations.Cache</literal> defines the
+ caching strategy and region of a given second level cache. This
+ annotation can be applied on the root entity (not the sub entities), and
+ on the collections.</para>
+
+ <programlisting>@Entity
+ at Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
+public class Forest { ... }</programlisting>
+
+ <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+ @JoinColumn(name="CUST_ID")
+ @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
+ public SortedSet<Ticket> getTickets() {
+ return tickets;
+ }</programlisting>
+
+ <para></para>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="2 55" id="hm1" />
+
+ <area coords="3 55" id="hm2" />
+
+ <area coords="4 55" id="hm3" />
+ </areaspec>
+
+ <programlisting>@Cache(
+ CacheConcurrencyStrategy usage();
+ String region() default "";
+ String include() default "all";
+)</programlisting>
+
+ <calloutlist>
+ <callout arearefs="hm1">
+ <para>usage: the given cache concurrency strategy (NONE,
+ READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL)</para>
+ </callout>
+
+ <callout arearefs="hm2">
+ <para>region (optional): the cache region (default to the fqcn of
+ the class or the fq role name of the collection)</para>
+ </callout>
+
+ <callout arearefs="hm3">
+ <para><literal>include</literal> (optional): all to include all
+ properties, non-lazy to only include non lazy properties (default
+ all).</para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+ </sect2>
+
+ <sect2 id="entity-hibspec-filters">
+ <title>Filters</title>
+
+ <para>Hibernate has the ability to apply arbitrary filters on top of
+ your data. Those filters are applied at runtime on a given session.
+ First, you need to define them.</para>
+
+ <para><literal>@org.hibernate.annotations.FilterDef</literal> or
+ <literal>@FilterDefs</literal> define filter definition(s) used by
+ filter(s) using the same name. A filter definition has a name() and an
+ array of parameters(). A parameter will allow you to adjust the behavior
+ of the filter at runtime. Each parameter is defined by a
+ <literal>@ParamDef</literal> which has a name and a type. You can also
+ define a defaultCondition() parameter for a given
+ <literal>@FilterDef</literal> to set the default condition to use when
+ none are defined in each individual <literal>@Filter</literal>. A
+ <literal>@FilterDef</literal>(s) can be defined at the class or package
+ level.</para>
+
+ <para>We now need to define the SQL filter clause applied to either the
+ entity load or the collection load. <literal>@Filter</literal> is used
+ and placed either on the entity or the collection element</para>
+
+ <para><programlisting>@Entity
+ at FilterDef(name="minLength", parameters={ @ParamDef( name="minLength", type="integer" ) } )
+ at Filters( {
+ @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"),
+ @Filter(name="minLength", condition=":minLength <= length")
+} )
+public class Forest { ... }</programlisting></para>
+
+ <para>When the collection use an association table as a relational
+ representation, you might want to apply the filter condition to the
+ association table itself or to the target entity table. To apply the
+ constraint on the target entity, use the regular
+ <literal>@Filter</literal> annotation. However, if you wan to target the
+ association table, use the <literal>@FilterJoinTable</literal>
+ annotation.</para>
+
+ <programlisting> @OneToMany
+ @JoinTable
+ //filter on the target entity table
+ @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length")
+ //filter on the association table
+ @FilterJoinTable(name="security", condition=":userlevel >= requredLevel")
+ public Set<Forest> getForests() { ... }</programlisting>
+ </sect2>
+
+ <sect2 id="entity-hibspec-query">
+ <title>Queries</title>
+
+ <para>Since Hibernate has more features on named queries than the one
+ defined in the EJB3 specification,
+ <literal>@org.hibernate.annotations.NamedQuery</literal>,
+ <literal>@org.hibernate.annotations.NamedQueries</literal>,
+ <literal>@org.hibernate.annotations.NamedNativeQuery</literal> and
+ <literal>@org.hibernate.annotations.NamedNativeQueries</literal> have
+ been introduced. They add some attributes to the standard version and
+ can be used as a replacement:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>flushMode: define the query flush mode (Always, Auto, Commit
+ or Never)</para>
+ </listitem>
+
+ <listitem>
+ <para>cacheable: whether the query should be cached or not</para>
+ </listitem>
+
+ <listitem>
+ <para>cacheRegion: cache region used if the query is cached</para>
+ </listitem>
+
+ <listitem>
+ <para>fetchSize: JDBC statement fetch size for this query</para>
+ </listitem>
+
+ <listitem>
+ <para>timeout: query time out</para>
+ </listitem>
+
+ <listitem>
+ <para>callable: for native queries only, to be set to true for
+ stored procedures</para>
+ </listitem>
+
+ <listitem>
+ <para>comment: if comments are activated, the comment seen when the
+ query is sent to the database.</para>
+ </listitem>
+
+ <listitem>
+ <para>cacheMode: Cache interaction mode (get, ignore, normal, put or
+ refresh)</para>
+ </listitem>
+
+ <listitem>
+ <para>readOnly: whether or not the elements retrievent from the
+ query are in read only mode.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Those hints can be set in a standard
+ <literal>@javax.persistence.NamedQuery</literal> annotations through the
+ detyped <literal>@QueryHint</literal>. Another key advantage is the
+ ability to set those annotations at a package level.</para>
+ </sect2>
+
+ <sect2 id="entity-hibspec-customsql" revision="1">
+ <title>Custom SQL for CRUD operations</title>
+
+ <para>Hibernate gives you the avility to override every single SQL
+ statement generated. We have seen native SQL query usage already, but
+ you can also override the SQL statement used to load or change the state
+ of entities.</para>
+
+ <programlisting>@Entity
+ at Table(name="CHAOS")
+<emphasis role="bold">@SQLInsert( sql="INSERT INTO CHAOS(size, name, nickname, id) VALUES(?,upper(?),?,?)")
+ at SQLUpdate( sql="UPDATE CHAOS SET size = ?, name = upper(?), nickname = ? WHERE id = ?")
+ at SQLDelete( sql="DELETE CHAOS WHERE id = ?")
+ at SQLDeleteAll( sql="DELETE CHAOS")
+</emphasis><emphasis role="bold">@Loader(namedQuery = "chaos")</emphasis>
+ at NamedNativeQuery(name="chaos", query="select id, size, name, lower( nickname ) as nickname from CHAOS where id= ?", resultClass = Chaos.class)
+public class Chaos {
+ @Id
+ private Long id;
+ private Long size;
+ private String name;
+ private String nickname;</programlisting>
+
+ <para><literal>@SQLInsert</literal>, <literal>@SQLUpdate</literal>,
+ <literal>@SQLDelete</literal>, <literal>@SQLDeleteAll</literal>
+ respectively override the INSERT statement, UPDATE statement, DELETE
+ statement, DELETE statement to remove all entities.</para>
+
+ <para>If you expect to call a store procedure, be sure to set the
+ <literal>callable</literal> attribute to true
+ (<literal>@SQLInsert(callable=true, ...)</literal>).</para>
+
+ <para>To check that the execution happens correctly, Hibernate allows
+ you to define one of those three strategies:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>NONE: no check is performed: the store procedure is expected
+ to fail upon issues</para>
+ </listitem>
+
+ <listitem>
+ <para>COUNT: use of rowcount to check that the update is
+ successful</para>
+ </listitem>
+
+ <listitem>
+ <para>PARAM: like COUNT but using an output parameter rather that
+ the standard mechanism</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>To define the result check style, use the <literal>check</literal>
+ parameter (<literal>@SQLUpdate(check=ResultCheckStyle.COUNT,
+ ...)</literal>).</para>
+
+ <para>You can also override the SQL load statement by a native SQL query
+ or a HQL query. You just have to refer to a named query with the
+ <literal><literal>@Loader</literal></literal> annotation.</para>
+
+ <para>You can use the exact same set of annotations to override the
+ collection related statements.</para>
+
+ <programlisting>@OneToMany
+ at JoinColumn(name="chaos_fk")
+<emphasis role="bold">@SQLInsert( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = ? where id = ?")
+ at SQLDelete( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = null where id = ?")</emphasis>
+private Set<CasimirParticle> particles = new HashSet<CasimirParticle>();</programlisting>
+
+ <para>The parameters order is important and is defined by the order
+ Hibernate handle properties. You can see the expected order by enabling
+ debug logging for the <literal>org.hibernate.persister.entity</literal>
+ level. With this level enabled Hibernate will print out the static SQL
+ that is used to create, update, delete etc. entities. (To see the
+ expected sequence, remember to not include your custom SQL through
+ annotations as that will override the Hibernate generated static
+ sql.)</para>
+
+ <para>Overriding SQL statements for secondary tables is also possible
+ using <literal>@org.hibernate.annotations.Table</literal> and either (or
+ all) attributes <literal>sqlInsert</literal>,
+ <literal>sqlUpdate</literal>, <literal>sqlDelete</literal>:</para>
+
+ <programlisting>@Entity
+ at SecondaryTables({
+ @SecondaryTable(name = "`Cat nbr1`"),
+ @SecondaryTable(name = "Cat2"})
+ at org.hibernate.annotations.Tables( {
+ @Table(appliesTo = "Cat", comment = "My cat table" ),
+ @Table(appliesTo = "Cat2", foreignKey = @ForeignKey(name="FK_CAT2_CAT"), fetch = FetchMode.SELECT,
+ <emphasis role="bold">sqlInsert=@SQLInsert(sql="insert into Cat2(storyPart2, id) values(upper(?), ?)") )</emphasis>
+} )
+public class Cat implements Serializable {</programlisting>
+
+ <para>The previous example also show that you can give a comment to a
+ given table (promary or secondary): This comment will be used for DDL
+ generation.</para>
+ </sect2>
+
+ <sect2>
+ <title>Tuplizer</title>
+
+ <para><classname>org.hibernate.tuple.Tuplizer</classname>, and its
+ sub-interfaces, are responsible for managing a particular representation
+ of a piece of data, given that representation's
+ <literal>org.hibernate.EntityMode</literal>. If a given piece of data is
+ thought of as a data structure, then a tuplizer is the thing which knows
+ how to create such a data structure and how to extract values from and
+ inject values into such a data structure. For example, for the POJO
+ entity mode, the correpsonding tuplizer knows how create the POJO
+ through its constructor and how to access the POJO properties using the
+ defined property accessors. There are two high-level types of Tuplizers,
+ represented by the
+ <classname>org.hibernate.tuple.EntityTuplizer</classname> and
+ <classname>org.hibernate.tuple.ComponentTuplizer</classname> interfaces.
+ EntityTuplizers are responsible for managing the above mentioned
+ contracts in regards to entities, while
+ <classname>ComponentTuplizers</classname> do the same for components.
+ Check the Hibernate reference documentation for more information.</para>
+
+ <para>To define tuplixer in annotations, simply use the
+ <literal>@Tuplizer</literal> annotation on the according element</para>
+
+ <programlisting>@Entity
+<emphasis role="bold">@Tuplizer(impl = DynamicEntityTuplizer.class)</emphasis>
+public interface Cuisine {
+ @Id
+ @GeneratedValue
+ public Long getId();
+ public void setId(Long id);
+
+ public String getName();
+ public void setName(String name);
+
+ <emphasis role="bold">@Tuplizer(impl = DynamicComponentTuplizer.class)</emphasis>
+ public Country getCountry();
+ public void setCountry(Country country);
+
+
+}</programlisting>
+ </sect2>
+ </sect1>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/en/modules/setup.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/setup.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/en/modules/setup.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,194 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter>
- <title id="setup" revision="1">Setting up an annotations project</title>
-
- <section id="setup-requirements" revision="1">
- <title>Requirements</title>
-
- <itemizedlist>
- <listitem>
- <para>Download and unpack the Hibernate Annotations distribution from
- the Hibernate website.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>This release requires Hibernate 3.2.0.GA and above. Do
- not use this release of Hibernate Annotations with an older version of
- Hibernate 3.x!</emphasis></para>
- </listitem>
-
- <listitem>
- <para>This release is known to work on Hibernate core 3.2.0.CR5 and
- 3.2.x.GA</para>
- </listitem>
-
- <listitem>
- <para>Make sure you have JDK 5.0 installed or above. You can of course
- continue using XDoclet and get some of the benefits of
- annotation-based metadata with older JDK versions. Note that this
- document only describes JDK 5.0 annotations and you have to refer to
- the XDoclet documentation for more information.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="setup-configuration" revision="1">
- <title>Configuration</title>
-
- <para>First, set up your classpath (after you have created a new project
- in your favorite IDE): <itemizedlist>
- <listitem>
- <para>Copy all Hibernate3 core and required 3rd party library files
- (see lib/README.txt in Hibernate).</para>
- </listitem>
-
- <listitem>
- <para>Copy <filename>hibernate-annotations.jar</filename>,
- <filename>lib/hibernate-comons-annotations.jar</filename> and
- <filename>lib/ejb3-persistence.jar</filename> from the Hibernate
- Annotations distribution to your classpath as well.</para>
- </listitem>
- </itemizedlist></para>
-
- <para>If you wish to use Hibernate Validator (TODO make a link to HV doc),
- download it from the Hibernate website and add
- <filename>hibernate-validator.jar</filename> in your classpath.</para>
-
- <para>If you wish to use Hibernate Search (TODO make a link to HSearch
- doc), download it from the Hibernate website and add
- <filename>hibernate-search.jar</filename> and
- <filename>lucene-core-x.y.z.jar</filename> in your classpath.</para>
-
- <para>We also recommend a small wrapper class to startup Hibernate in a
- static initializer block, known as <classname>HibernateUtil</classname>.
- You might have seen this class in various forms in other areas of the
- Hibernate documentation. For Annotation support you have to enhance this
- helper class as follows: <programlisting>package hello;
-
-import org.hibernate.*;
-import org.hibernate.cfg.*;
-import test.*;
-import test.animals.Dog;
-
-public class HibernateUtil {
-
-private static final SessionFactory sessionFactory;
-
- static {
- try {
-
- sessionFactory = new <emphasis role="bold">AnnotationConfiguration()</emphasis>.buildSessionFactory();
- } catch (Throwable ex) {
- // Log exception!
- throw new ExceptionInInitializerError(ex);
- }
- }
-
- public static Session getSession()
- throws HibernateException {
- return sessionFactory.openSession();
- }
-}
- </programlisting></para>
-
- <para>Interesting here is the use of
- <classname>AnnotationConfiguration</classname>. The packages and annotated
- classes are declared in your regular XML configuration file (usually
- <filename>hibernate.cfg.xml</filename>). Here is the equivalent of the
- above declaration:</para>
-
- <programlisting><!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
-
- <hibernate-configuration>
- <session-factory>
- <emphasis role="bold"><mapping package="test.animals"/>
- <mapping class="test.Flight"/>
- <mapping class="test.Sky"/>
- <mapping class="test.Person"/>
- <mapping class="test.animals.Dog"/></emphasis>
-<emphasis role="bold"> <mapping resource="test/animals/orm.xml"/></emphasis>
- </session-factory>
- </hibernate-configuration>
- </programlisting>
-
- <para>Note that you can mix the hbm.xml use and the new annotation one.
- The resource element can be either an hbm file or an EJB3 XML deployment
- descriptor. The distinction is transparent for your configuration
- process.</para>
-
- <para>Alternatively, you can define the annotated classes and packages
- using the programmatic API</para>
-
- <programlisting> sessionFactory = new <emphasis role="bold">AnnotationConfiguration()
- .addPackage("test.animals") //the fully qualified package name
- .addAnnotatedClass(Flight.class)
- .addAnnotatedClass(Sky.class)
- .addAnnotatedClass(Person.class)
- .addAnnotatedClass(Dog.class)</emphasis>
-<emphasis role="bold"> .addResource("test/animals/orm.xml")</emphasis>
- .buildSessionFactory();</programlisting>
-
- <para>You can also use the Hibernate EntityManager which has its own
- configuration mechanism. Please refer to this project documentation for
- more details.</para>
-
- <para>There is no other difference in the way you use Hibernate APIs with
- annotations, except for this startup routine change or in the
- configuration file. You can use your favorite configuration method for
- other properties ( <filename>hibernate.properties</filename>,
- <filename>hibernate.cfg.xml</filename>, programmatic APIs, etc). You can
- even mix annotated persistent classes and classic
- <filename>hbm.cfg.xml</filename> declarations with the same
- <classname>SessionFactory</classname>. You can however not declare a class
- several times (whether annotated or through hbm.xml). You cannot mix
- configuration strategies (hbm vs annotations) in a mapped entity hierarchy
- either.</para>
-
- <para>To ease the migration process from hbm files to annotations, the
- configuration mechanism detects the mapping duplication between
- annotations and hbm files. HBM files are then prioritized over annotated
- metadata on a class to class basis. You can change the priority using
- <literal>hibernate.mapping.precedence</literal> property. The default is
- <literal>hbm, class</literal>, changing it to <literal>class,
- hbm</literal> will prioritize the annotated classes over hbm files when a
- conflict occurs.</para>
- </section>
-
- <section>
- <title id="setup-properties">Properties</title>
-
- <para>Asides from the Hibernate core properties, Hibernate Annotations
- reacts to the following one</para>
-
- <table>
- <title>List of properties</title>
-
- <tgroup cols="2">
- <thead>
- <row>
- <entry align="center">Property</entry>
-
- <entry align="center">Definition</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>hibernate.validator.apply_to_ddl</entry>
-
- <entry>Use Hibernate Validator annotations to refine the database
- schema generation. Default to true.</entry>
- </row>
-
- <row>
- <entry></entry>
-
- <entry></entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/en/modules/setup.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/setup.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/en/modules/setup.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/en/modules/setup.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter>
+ <title id="setup" revision="1">Setting up an annotations project</title>
+
+ <section id="setup-requirements" revision="1">
+ <title>Requirements</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Download and unpack the Hibernate Annotations distribution from
+ the Hibernate website.</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>This release requires Hibernate 3.2.0.GA and above. Do
+ not use this release of Hibernate Annotations with an older version of
+ Hibernate 3.x!</emphasis></para>
+ </listitem>
+
+ <listitem>
+ <para>This release is known to work on Hibernate core 3.2.0.CR5 and
+ 3.2.x.GA</para>
+ </listitem>
+
+ <listitem>
+ <para>Make sure you have JDK 5.0 installed or above. You can of course
+ continue using XDoclet and get some of the benefits of
+ annotation-based metadata with older JDK versions. Note that this
+ document only describes JDK 5.0 annotations and you have to refer to
+ the XDoclet documentation for more information.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="setup-configuration" revision="1">
+ <title>Configuration</title>
+
+ <para>First, set up your classpath (after you have created a new project
+ in your favorite IDE): <itemizedlist>
+ <listitem>
+ <para>Copy all Hibernate3 core and required 3rd party library files
+ (see lib/README.txt in Hibernate).</para>
+ </listitem>
+
+ <listitem>
+ <para>Copy <filename>hibernate-annotations.jar</filename>,
+ <filename>lib/hibernate-comons-annotations.jar</filename> and
+ <filename>lib/ejb3-persistence.jar</filename> from the Hibernate
+ Annotations distribution to your classpath as well.</para>
+ </listitem>
+ </itemizedlist></para>
+
+ <para>If you wish to use Hibernate Validator (TODO make a link to HV doc),
+ download it from the Hibernate website and add
+ <filename>hibernate-validator.jar</filename> in your classpath.</para>
+
+ <para>If you wish to use Hibernate Search (TODO make a link to HSearch
+ doc), download it from the Hibernate website and add
+ <filename>hibernate-search.jar</filename> and
+ <filename>lucene-core-x.y.z.jar</filename> in your classpath.</para>
+
+ <para>We also recommend a small wrapper class to startup Hibernate in a
+ static initializer block, known as <classname>HibernateUtil</classname>.
+ You might have seen this class in various forms in other areas of the
+ Hibernate documentation. For Annotation support you have to enhance this
+ helper class as follows: <programlisting>package hello;
+
+import org.hibernate.*;
+import org.hibernate.cfg.*;
+import test.*;
+import test.animals.Dog;
+
+public class HibernateUtil {
+
+private static final SessionFactory sessionFactory;
+
+ static {
+ try {
+
+ sessionFactory = new <emphasis role="bold">AnnotationConfiguration()</emphasis>.buildSessionFactory();
+ } catch (Throwable ex) {
+ // Log exception!
+ throw new ExceptionInInitializerError(ex);
+ }
+ }
+
+ public static Session getSession()
+ throws HibernateException {
+ return sessionFactory.openSession();
+ }
+}
+ </programlisting></para>
+
+ <para>Interesting here is the use of
+ <classname>AnnotationConfiguration</classname>. The packages and annotated
+ classes are declared in your regular XML configuration file (usually
+ <filename>hibernate.cfg.xml</filename>). Here is the equivalent of the
+ above declaration:</para>
+
+ <programlisting><!DOCTYPE hibernate-configuration PUBLIC
+ "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+ <hibernate-configuration>
+ <session-factory>
+ <emphasis role="bold"><mapping package="test.animals"/>
+ <mapping class="test.Flight"/>
+ <mapping class="test.Sky"/>
+ <mapping class="test.Person"/>
+ <mapping class="test.animals.Dog"/></emphasis>
+<emphasis role="bold"> <mapping resource="test/animals/orm.xml"/></emphasis>
+ </session-factory>
+ </hibernate-configuration>
+ </programlisting>
+
+ <para>Note that you can mix the hbm.xml use and the new annotation one.
+ The resource element can be either an hbm file or an EJB3 XML deployment
+ descriptor. The distinction is transparent for your configuration
+ process.</para>
+
+ <para>Alternatively, you can define the annotated classes and packages
+ using the programmatic API</para>
+
+ <programlisting> sessionFactory = new <emphasis role="bold">AnnotationConfiguration()
+ .addPackage("test.animals") //the fully qualified package name
+ .addAnnotatedClass(Flight.class)
+ .addAnnotatedClass(Sky.class)
+ .addAnnotatedClass(Person.class)
+ .addAnnotatedClass(Dog.class)</emphasis>
+<emphasis role="bold"> .addResource("test/animals/orm.xml")</emphasis>
+ .buildSessionFactory();</programlisting>
+
+ <para>You can also use the Hibernate EntityManager which has its own
+ configuration mechanism. Please refer to this project documentation for
+ more details.</para>
+
+ <para>There is no other difference in the way you use Hibernate APIs with
+ annotations, except for this startup routine change or in the
+ configuration file. You can use your favorite configuration method for
+ other properties ( <filename>hibernate.properties</filename>,
+ <filename>hibernate.cfg.xml</filename>, programmatic APIs, etc). You can
+ even mix annotated persistent classes and classic
+ <filename>hbm.cfg.xml</filename> declarations with the same
+ <classname>SessionFactory</classname>. You can however not declare a class
+ several times (whether annotated or through hbm.xml). You cannot mix
+ configuration strategies (hbm vs annotations) in a mapped entity hierarchy
+ either.</para>
+
+ <para>To ease the migration process from hbm files to annotations, the
+ configuration mechanism detects the mapping duplication between
+ annotations and hbm files. HBM files are then prioritized over annotated
+ metadata on a class to class basis. You can change the priority using
+ <literal>hibernate.mapping.precedence</literal> property. The default is
+ <literal>hbm, class</literal>, changing it to <literal>class,
+ hbm</literal> will prioritize the annotated classes over hbm files when a
+ conflict occurs.</para>
+ </section>
+
+ <section>
+ <title id="setup-properties">Properties</title>
+
+ <para>Asides from the Hibernate core properties, Hibernate Annotations
+ reacts to the following one</para>
+
+ <table>
+ <title>List of properties</title>
+
+ <tgroup cols="2">
+ <thead>
+ <row>
+ <entry align="center">Property</entry>
+
+ <entry align="center">Definition</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>hibernate.validator.apply_to_ddl</entry>
+
+ <entry>Use Hibernate Validator annotations to refine the database
+ schema generation. Default to true.</entry>
+ </row>
+
+ <row>
+ <entry></entry>
+
+ <entry></entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/en/modules/xml-overriding.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/xml-overriding.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/en/modules/xml-overriding.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,402 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="xml-overriding" label="Overriding metadata through XML">
- <title>Overriding metadata through XML</title>
-
- <para>The primary target for metadata in EJB3 is annotations, but the EJB3
- specification provides a way to override or replace the annotation defined
- metadata through an XML deployment descriptor. In the current release only
- pure EJB3 annotations overriding are supported. If you wish to use Hibernate
- specific features in some entities, you'll have to either use annotations or
- fallback to hbm files. You can of course mix and match annotated entities
- and entities describes in hbm files.</para>
-
- <para>The unit test suite shows some additional XML file samples.</para>
-
- <section id="xml-overriding-principles">
- <title>Principles</title>
-
- <para>The XML deployment descriptor structure has been designed to reflect
- the annotations one. So if you know the annotations structure, using the
- XML schema will be straightforward for you.</para>
-
- <para>You can define one ot more XML files describing your metadata, these
- files will be merged by the overriding engine.</para>
-
- <section>
- <title>Global level metadata</title>
-
- <para>You can define global level metadata available for all XML files.
- You must not define these metadata more than once per deployment.</para>
-
- <programlisting><?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">
-
- <persistence-unit-metadata>
- <xml-mapping-metadata-complete/>
- <persistence-unit-defaults>
- <schema>myschema</schema>
- <catalog>mycatalog</catalog>
- <cascade-persist/>
- </persistence-unit-defaults>
- </persistence-unit-metadata></programlisting>
-
- <para><literal>xml-mapping-metadata-complete</literal> means that all
- entity, mapped-superclasses and embeddable metadata should be picked up
- from XML (ie ignore annotations).</para>
-
- <para><literal>schema / catalog</literal> will override all default
- definitions of schema and catalog in the metadata (both XML and
- annotations).</para>
-
- <para><literal>cascade-persist</literal> means that all associations
- have PERSIST as a cascade type. We recommend you to not use this
- feature.</para>
- </section>
-
- <section id="xml-overriding-principles-entity" revision="1">
- <title>Entity level metadata</title>
-
- <para>You can either define or override metadata informations on a given
- entity.</para>
-
- <programlistingco>
- <areaspec>
- <area coords="3 85" id="aa1" />
-
- <area coords="9 85" id="aa2" />
-
- <area coords="10 85" id="aa3" />
-
- <area coords="11 85" id="aa4" />
-
- <area coords="17 85" id="aa5" />
-
- <area coords="23 85" id="aa6" />
-
- <area coords="24 85" id="aa7" />
-
- <area coords="25 85" id="aa8" />
-
- <area coords="26 85" id="aa9" />
-
- <area coords="31 85" id="aa10" />
- </areaspec>
-
- <programlisting><?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>org.hibernate.test.annotations.reflection</package>
- <entity class="Administration" access="PROPERTY" metadata-complete="true">
- <table name="tbl_admin">
- <unique-constraint>
- <column-name>firstname</column-name>
- <column-name>lastname</column-name>
- </unique-constraint>
- </table>
- <secondary-table name="admin2">
- <primary-key-join-column name="admin_id" referenced-column-name="id"/>
- <unique-constraint>
- <column-name>address</column-name>
- </unique-constraint>
- </secondary-table>
- <id-class class="SocialSecurityNumber"/>
- <inheritance strategy="JOINED"/>
- <sequence-generator name="seqhilo" sequence-name="seqhilo"/>
- <table-generator name="table" table="tablehilo"/>
- ...
- </entity>
-
- <entity class="PostalAdministration">
- <primary-key-join-column name="id"/>
- ...
- </entity>
-</entity-mappings></programlisting>
-
- <calloutlist>
- <callout arearefs="aa1">
- <para><literal>entity-mappings</literal>: entity-mappings is the
- root element for all XML files. You must declare the xml schema,
- the schema file is included in the hibernate-annotations.jar file,
- no internet access will be processed by Hibernate
- Annotations.</para>
- </callout>
-
- <callout arearefs="aa2">
- <para><literal>package</literal> (optional): default package used
- for all non qualified class names in the given deployment
- descriptor file.</para>
- </callout>
-
- <callout arearefs="aa3">
- <para><literal>entity</literal>: desribes an entity.</para>
-
- <para><literal>metadata-complete</literal> defines whether the
- metadata description for this element is complete or not (in other
- words, if annotations present at the class level should be
- considered or not).</para>
-
- <para>An entity has to have a <literal>class</literal> attribute
- refering the java class the metadata applies on.</para>
-
- <para>You can overrides entity name through the
- <literal>name</literal> attribute, if none is defined and if an
- <literal>@Entity.name</literal> is present, then it is used
- (provided that metadata complete is not set).</para>
-
- <para>For netadata complete (see below) element, you can define an
- <literal>access</literal> (either <literal>FIELD</literal> or
- <literal>PROPERTY</literal> (default)). For non medatada complete
- element, if <literal>access</literal> is not defined, the @Id
- position will lead position, if <literal>access</literal> is
- defined, the value is used.</para>
- </callout>
-
- <callout arearefs="aa4">
- <para><literal>table</literal>: you can declare table properties
- (name, schema, catalog), if none is defined, the java annotation
- is used.</para>
-
- <para>You can define one or several unique constraints as seen in
- the example</para>
- </callout>
-
- <callout arearefs="aa5">
- <para><literal>secondary-table</literal>: defines a secondary
- table very much like a regular table except that you can define
- the primary key / foreign key column(s) through the
- <literal>primary-key-join-column</literal> element. On non
- metadata complete, annotation secondary tables are used only if
- there is no <literal>secondary-table</literal> definition,
- annotations are ignored otherwise.</para>
- </callout>
-
- <callout arearefs="aa6">
- <para><literal>id-class</literal>: defines the id class in a
- similar way <literal>@IdClass</literal> does</para>
- </callout>
-
- <callout arearefs="aa7">
- <para><literal>inheritance</literal>: defines the inheritance
- strategy (<literal>JOINED</literal>,
- <literal>TABLE_PER_CLASS</literal>,
- <literal>SINGLE_TABLE</literal>), Available only at the root
- entity level</para>
- </callout>
-
- <callout arearefs="aa8">
- <para><literal>sequence-generator</literal>: defines a sequence
- generator</para>
- </callout>
-
- <callout arearefs="aa9">
- <para><literal>table-generator</literal>: defines a table
- generator</para>
- </callout>
-
- <callout arearefs="aa10">
- <para><literal><literal>primary-key-join-column</literal></literal>:
- defines the primary key join column for sub entities when JOINED
- inheritance strategy is used</para>
- </callout>
- </calloutlist>
- </programlistingco>
-
- <programlistingco>
- <areaspec>
- <area coords="11 85" id="ab1" />
-
- <area coords="18 85" id="ab2" />
-
- <area coords="22 85" id="ab3" />
-
- <area coords="28 85" id="ab4" />
-
- <area coords="34 85" id="ab5" />
- </areaspec>
-
- <programlisting><?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>org.hibernate.test.annotations.reflection</package>
- <entity class="Music" access="PROPERTY" metadata-complete="true">
- <discriminator-value>Generic</discriminator-value>
- <discriminator-column length="34"/>
- ...
- </entity>
-
- <entity class="PostalAdministration">
- <primary-key-join-column name="id"/>
- <named-query name="adminById">
- <query>select m from Administration m where m.id = :id</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-query>
- <named-native-query name="allAdmin" result-set-mapping="adminrs">
- <query>select *, count(taxpayer_id) as taxPayerNumber
- from Administration, TaxPayer
- where taxpayer_admin_id = admin_id group by ...</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-native-query>
- <sql-result-set-mapping name="adminrs">
- <entity-result entity-class="Administration">
- <field-result name="name" column="fld_name"/>
- </entity-result>
- <column-result name="taxPayerNumber"/>
- </sql-result-set-mapping>
- <attribute-override name="ground">
- <column name="fld_ground" unique="true" scale="2"/>
- </attribute-override>
- <association-override name="referer">
- <join-column name="referer_id" referenced-column-name="id"/>
- </association-override>
- ...
- </entity>
-</entity-mappings></programlisting>
-
- <calloutlist>
- <callout arearefs="ab1">
- <para><literal>discriminator-value /
- discriminator-column</literal>: defines the discriminator value
- and the column holding it when the SINGLE_TABLE inheritance
- strategy is chosen</para>
- </callout>
-
- <callout arearefs="ab2">
- <para><literal>named-query</literal>: defines named queries and
- possibly the hints associated to them. Those definitions are
- additive to the one defined in annotations, if two definitions
- have the same name, the XML one has priority.</para>
- </callout>
-
- <callout arearefs="ab3">
- <para><literal>named-native-query</literal>: defines an named
- native query and its sql result set mapping. Alternatively, you
- can define the <literal>result-class</literal>. Those definitions
- are additive to the one defined in annotations, if two definitions
- have the same name, the XML one has priority.</para>
- </callout>
-
- <callout arearefs="ab4">
- <para><literal>sql-result-set-mapping</literal>: describes the
- result set mapping structure. You can define both entity and
- column mappings. Those definitions are additive to the one defined
- in annotations, if two definitions have the same name, the XML one
- has priority</para>
- </callout>
-
- <callout arearefs="ab5">
- <para><literal>attribute-override /
- association-override</literal>: defines a column or join column
- overriding. This overriding is additive to the one defined in
- annotations</para>
- </callout>
- </calloutlist>
- </programlistingco>
-
- <para>Same applies for <literal><embeddable></literal> and
- <literal><mapped-superclass></literal>.</para>
- </section>
-
- <section>
- <title>Property level metadata</title>
-
- <para>You can of course defines XML overriding for properties. If
- metadata complete is defined, then additional properties (ie at the Java
- level) will be ignored. Otherwise, once you start overriding a property,
- all annotations on the given property are ignored. All property level
- metadata behave in <literal>entity/attributes</literal>,
- <literal>mapped-superclass/attributes</literal> or
- <literal>embeddable/attributes</literal>.</para>
-
- <programlisting> <attributes>
- <id name="id">
- <column name="fld_id"/>
- <generated-value generator="generator" strategy="SEQUENCE"/>
- <temporal>DATE</temporal>
- <sequence-generator name="generator" sequence-name="seq"/>
- </id>
- <version name="version"/>
- <embedded name="embeddedObject">
- <attribute-override name"subproperty">
- <column name="my_column"/>
- </attribute-override>
- </embedded>
- <basic name="status" optional="false">
- <enumerated>STRING</enumerated>
- </basic>
- <basic name="serial" optional="true">
- <column name="serialbytes"/>
- <lob/>
- </basic>
- <basic name="terminusTime" fetch="LAZY">
- <temporal>TIMESTAMP</temporal>
- </basic>
- </attributes></programlisting>
-
- <para>You can override a property through <literal>id</literal>,
- <literal>embedded-id</literal>, <literal>version</literal>,
- <literal>embedded</literal> and <literal>basic</literal>. Each of these
- elements can have subelements accordingly: <literal>lob</literal>,
- <literal>temporal</literal>, <literal>enumerated</literal>,
- <literal>column</literal>.</para>
- </section>
-
- <section>
- <title>Association level metadata</title>
-
- <para>You can define XML overriding for associations. All association
- level metadata behave in <literal>entity/attributes</literal>,
- <literal>mapped-superclass/attributes</literal> or
- <literal>embeddable/attributes</literal>.</para>
-
- <programlisting> <attributes>
- <one-to-many name="players" fetch="EAGER">
- <map-key name="name"/>
- <join-column name="driver"/>
- <join-column name="number"/>
- </one-to-many>
- <many-to-many name="roads" target-entity="Administration">
- <order-by>maxSpeed</order-by>
- <join-table name="bus_road">
- <join-column name="driver"/>
- <join-column name="number"/>
- <inverse-join-column name="road_id"/>
- <unique-constraint>
- <column-name>driver</column-name>
- <column-name>number</column-name>
- </unique-constraint>
- </join-table>
- </many-to-many>
- <many-to-many name="allTimeDrivers" mapped-by="drivenBuses">
- </attributes></programlisting>
-
- <para>You can override an association through
- <literal>one-to-many</literal>, <literal>one-to-one</literal>,
- <literal>many-to-one</literal>, and <literal>many-to-many</literal>.
- Each of these elements can have subelements accordingly:
- <literal>join-table</literal> (which can have
- <literal>join-column</literal>s and
- <literal>inverse-join-column</literal>s),
- <literal><literal>join-column</literal>s</literal>,
- <literal>map-key</literal>, and <literal>order-by</literal>.
- <literal>mapped-by</literal> and <literal>target-entity</literal> can be
- defined as attributes when it makes sense. Once again the structure is
- reflects the annotations structure. You can find all semantic
- informations in the chapter describing annotations.</para>
- </section>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/en/modules/xml-overriding.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/modules/xml-overriding.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/en/modules/xml-overriding.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/en/modules/xml-overriding.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,402 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="xml-overriding" label="Overriding metadata through XML">
+ <title>Overriding metadata through XML</title>
+
+ <para>The primary target for metadata in EJB3 is annotations, but the EJB3
+ specification provides a way to override or replace the annotation defined
+ metadata through an XML deployment descriptor. In the current release only
+ pure EJB3 annotations overriding are supported. If you wish to use Hibernate
+ specific features in some entities, you'll have to either use annotations or
+ fallback to hbm files. You can of course mix and match annotated entities
+ and entities describes in hbm files.</para>
+
+ <para>The unit test suite shows some additional XML file samples.</para>
+
+ <section id="xml-overriding-principles">
+ <title>Principles</title>
+
+ <para>The XML deployment descriptor structure has been designed to reflect
+ the annotations one. So if you know the annotations structure, using the
+ XML schema will be straightforward for you.</para>
+
+ <para>You can define one ot more XML files describing your metadata, these
+ files will be merged by the overriding engine.</para>
+
+ <section>
+ <title>Global level metadata</title>
+
+ <para>You can define global level metadata available for all XML files.
+ You must not define these metadata more than once per deployment.</para>
+
+ <programlisting><?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">
+
+ <persistence-unit-metadata>
+ <xml-mapping-metadata-complete/>
+ <persistence-unit-defaults>
+ <schema>myschema</schema>
+ <catalog>mycatalog</catalog>
+ <cascade-persist/>
+ </persistence-unit-defaults>
+ </persistence-unit-metadata></programlisting>
+
+ <para><literal>xml-mapping-metadata-complete</literal> means that all
+ entity, mapped-superclasses and embeddable metadata should be picked up
+ from XML (ie ignore annotations).</para>
+
+ <para><literal>schema / catalog</literal> will override all default
+ definitions of schema and catalog in the metadata (both XML and
+ annotations).</para>
+
+ <para><literal>cascade-persist</literal> means that all associations
+ have PERSIST as a cascade type. We recommend you to not use this
+ feature.</para>
+ </section>
+
+ <section id="xml-overriding-principles-entity" revision="1">
+ <title>Entity level metadata</title>
+
+ <para>You can either define or override metadata informations on a given
+ entity.</para>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="3 85" id="aa1" />
+
+ <area coords="9 85" id="aa2" />
+
+ <area coords="10 85" id="aa3" />
+
+ <area coords="11 85" id="aa4" />
+
+ <area coords="17 85" id="aa5" />
+
+ <area coords="23 85" id="aa6" />
+
+ <area coords="24 85" id="aa7" />
+
+ <area coords="25 85" id="aa8" />
+
+ <area coords="26 85" id="aa9" />
+
+ <area coords="31 85" id="aa10" />
+ </areaspec>
+
+ <programlisting><?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>org.hibernate.test.annotations.reflection</package>
+ <entity class="Administration" access="PROPERTY" metadata-complete="true">
+ <table name="tbl_admin">
+ <unique-constraint>
+ <column-name>firstname</column-name>
+ <column-name>lastname</column-name>
+ </unique-constraint>
+ </table>
+ <secondary-table name="admin2">
+ <primary-key-join-column name="admin_id" referenced-column-name="id"/>
+ <unique-constraint>
+ <column-name>address</column-name>
+ </unique-constraint>
+ </secondary-table>
+ <id-class class="SocialSecurityNumber"/>
+ <inheritance strategy="JOINED"/>
+ <sequence-generator name="seqhilo" sequence-name="seqhilo"/>
+ <table-generator name="table" table="tablehilo"/>
+ ...
+ </entity>
+
+ <entity class="PostalAdministration">
+ <primary-key-join-column name="id"/>
+ ...
+ </entity>
+</entity-mappings></programlisting>
+
+ <calloutlist>
+ <callout arearefs="aa1">
+ <para><literal>entity-mappings</literal>: entity-mappings is the
+ root element for all XML files. You must declare the xml schema,
+ the schema file is included in the hibernate-annotations.jar file,
+ no internet access will be processed by Hibernate
+ Annotations.</para>
+ </callout>
+
+ <callout arearefs="aa2">
+ <para><literal>package</literal> (optional): default package used
+ for all non qualified class names in the given deployment
+ descriptor file.</para>
+ </callout>
+
+ <callout arearefs="aa3">
+ <para><literal>entity</literal>: desribes an entity.</para>
+
+ <para><literal>metadata-complete</literal> defines whether the
+ metadata description for this element is complete or not (in other
+ words, if annotations present at the class level should be
+ considered or not).</para>
+
+ <para>An entity has to have a <literal>class</literal> attribute
+ refering the java class the metadata applies on.</para>
+
+ <para>You can overrides entity name through the
+ <literal>name</literal> attribute, if none is defined and if an
+ <literal>@Entity.name</literal> is present, then it is used
+ (provided that metadata complete is not set).</para>
+
+ <para>For netadata complete (see below) element, you can define an
+ <literal>access</literal> (either <literal>FIELD</literal> or
+ <literal>PROPERTY</literal> (default)). For non medatada complete
+ element, if <literal>access</literal> is not defined, the @Id
+ position will lead position, if <literal>access</literal> is
+ defined, the value is used.</para>
+ </callout>
+
+ <callout arearefs="aa4">
+ <para><literal>table</literal>: you can declare table properties
+ (name, schema, catalog), if none is defined, the java annotation
+ is used.</para>
+
+ <para>You can define one or several unique constraints as seen in
+ the example</para>
+ </callout>
+
+ <callout arearefs="aa5">
+ <para><literal>secondary-table</literal>: defines a secondary
+ table very much like a regular table except that you can define
+ the primary key / foreign key column(s) through the
+ <literal>primary-key-join-column</literal> element. On non
+ metadata complete, annotation secondary tables are used only if
+ there is no <literal>secondary-table</literal> definition,
+ annotations are ignored otherwise.</para>
+ </callout>
+
+ <callout arearefs="aa6">
+ <para><literal>id-class</literal>: defines the id class in a
+ similar way <literal>@IdClass</literal> does</para>
+ </callout>
+
+ <callout arearefs="aa7">
+ <para><literal>inheritance</literal>: defines the inheritance
+ strategy (<literal>JOINED</literal>,
+ <literal>TABLE_PER_CLASS</literal>,
+ <literal>SINGLE_TABLE</literal>), Available only at the root
+ entity level</para>
+ </callout>
+
+ <callout arearefs="aa8">
+ <para><literal>sequence-generator</literal>: defines a sequence
+ generator</para>
+ </callout>
+
+ <callout arearefs="aa9">
+ <para><literal>table-generator</literal>: defines a table
+ generator</para>
+ </callout>
+
+ <callout arearefs="aa10">
+ <para><literal><literal>primary-key-join-column</literal></literal>:
+ defines the primary key join column for sub entities when JOINED
+ inheritance strategy is used</para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="11 85" id="ab1" />
+
+ <area coords="18 85" id="ab2" />
+
+ <area coords="22 85" id="ab3" />
+
+ <area coords="28 85" id="ab4" />
+
+ <area coords="34 85" id="ab5" />
+ </areaspec>
+
+ <programlisting><?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>org.hibernate.test.annotations.reflection</package>
+ <entity class="Music" access="PROPERTY" metadata-complete="true">
+ <discriminator-value>Generic</discriminator-value>
+ <discriminator-column length="34"/>
+ ...
+ </entity>
+
+ <entity class="PostalAdministration">
+ <primary-key-join-column name="id"/>
+ <named-query name="adminById">
+ <query>select m from Administration m where m.id = :id</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-query>
+ <named-native-query name="allAdmin" result-set-mapping="adminrs">
+ <query>select *, count(taxpayer_id) as taxPayerNumber
+ from Administration, TaxPayer
+ where taxpayer_admin_id = admin_id group by ...</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-native-query>
+ <sql-result-set-mapping name="adminrs">
+ <entity-result entity-class="Administration">
+ <field-result name="name" column="fld_name"/>
+ </entity-result>
+ <column-result name="taxPayerNumber"/>
+ </sql-result-set-mapping>
+ <attribute-override name="ground">
+ <column name="fld_ground" unique="true" scale="2"/>
+ </attribute-override>
+ <association-override name="referer">
+ <join-column name="referer_id" referenced-column-name="id"/>
+ </association-override>
+ ...
+ </entity>
+</entity-mappings></programlisting>
+
+ <calloutlist>
+ <callout arearefs="ab1">
+ <para><literal>discriminator-value /
+ discriminator-column</literal>: defines the discriminator value
+ and the column holding it when the SINGLE_TABLE inheritance
+ strategy is chosen</para>
+ </callout>
+
+ <callout arearefs="ab2">
+ <para><literal>named-query</literal>: defines named queries and
+ possibly the hints associated to them. Those definitions are
+ additive to the one defined in annotations, if two definitions
+ have the same name, the XML one has priority.</para>
+ </callout>
+
+ <callout arearefs="ab3">
+ <para><literal>named-native-query</literal>: defines an named
+ native query and its sql result set mapping. Alternatively, you
+ can define the <literal>result-class</literal>. Those definitions
+ are additive to the one defined in annotations, if two definitions
+ have the same name, the XML one has priority.</para>
+ </callout>
+
+ <callout arearefs="ab4">
+ <para><literal>sql-result-set-mapping</literal>: describes the
+ result set mapping structure. You can define both entity and
+ column mappings. Those definitions are additive to the one defined
+ in annotations, if two definitions have the same name, the XML one
+ has priority</para>
+ </callout>
+
+ <callout arearefs="ab5">
+ <para><literal>attribute-override /
+ association-override</literal>: defines a column or join column
+ overriding. This overriding is additive to the one defined in
+ annotations</para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>Same applies for <literal><embeddable></literal> and
+ <literal><mapped-superclass></literal>.</para>
+ </section>
+
+ <section>
+ <title>Property level metadata</title>
+
+ <para>You can of course defines XML overriding for properties. If
+ metadata complete is defined, then additional properties (ie at the Java
+ level) will be ignored. Otherwise, once you start overriding a property,
+ all annotations on the given property are ignored. All property level
+ metadata behave in <literal>entity/attributes</literal>,
+ <literal>mapped-superclass/attributes</literal> or
+ <literal>embeddable/attributes</literal>.</para>
+
+ <programlisting> <attributes>
+ <id name="id">
+ <column name="fld_id"/>
+ <generated-value generator="generator" strategy="SEQUENCE"/>
+ <temporal>DATE</temporal>
+ <sequence-generator name="generator" sequence-name="seq"/>
+ </id>
+ <version name="version"/>
+ <embedded name="embeddedObject">
+ <attribute-override name"subproperty">
+ <column name="my_column"/>
+ </attribute-override>
+ </embedded>
+ <basic name="status" optional="false">
+ <enumerated>STRING</enumerated>
+ </basic>
+ <basic name="serial" optional="true">
+ <column name="serialbytes"/>
+ <lob/>
+ </basic>
+ <basic name="terminusTime" fetch="LAZY">
+ <temporal>TIMESTAMP</temporal>
+ </basic>
+ </attributes></programlisting>
+
+ <para>You can override a property through <literal>id</literal>,
+ <literal>embedded-id</literal>, <literal>version</literal>,
+ <literal>embedded</literal> and <literal>basic</literal>. Each of these
+ elements can have subelements accordingly: <literal>lob</literal>,
+ <literal>temporal</literal>, <literal>enumerated</literal>,
+ <literal>column</literal>.</para>
+ </section>
+
+ <section>
+ <title>Association level metadata</title>
+
+ <para>You can define XML overriding for associations. All association
+ level metadata behave in <literal>entity/attributes</literal>,
+ <literal>mapped-superclass/attributes</literal> or
+ <literal>embeddable/attributes</literal>.</para>
+
+ <programlisting> <attributes>
+ <one-to-many name="players" fetch="EAGER">
+ <map-key name="name"/>
+ <join-column name="driver"/>
+ <join-column name="number"/>
+ </one-to-many>
+ <many-to-many name="roads" target-entity="Administration">
+ <order-by>maxSpeed</order-by>
+ <join-table name="bus_road">
+ <join-column name="driver"/>
+ <join-column name="number"/>
+ <inverse-join-column name="road_id"/>
+ <unique-constraint>
+ <column-name>driver</column-name>
+ <column-name>number</column-name>
+ </unique-constraint>
+ </join-table>
+ </many-to-many>
+ <many-to-many name="allTimeDrivers" mapped-by="drivenBuses">
+ </attributes></programlisting>
+
+ <para>You can override an association through
+ <literal>one-to-many</literal>, <literal>one-to-one</literal>,
+ <literal>many-to-one</literal>, and <literal>many-to-many</literal>.
+ Each of these elements can have subelements accordingly:
+ <literal>join-table</literal> (which can have
+ <literal>join-column</literal>s and
+ <literal>inverse-join-column</literal>s),
+ <literal><literal>join-column</literal>s</literal>,
+ <literal>map-key</literal>, and <literal>order-by</literal>.
+ <literal>mapped-by</literal> and <literal>target-entity</literal> can be
+ defined as attributes when it makes sense. Once again the structure is
+ reflects the annotations structure. You can find all semantic
+ informations in the chapter describing annotations.</para>
+ </section>
+ </section>
+</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/en/styles (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/styles)
Deleted: trunk/HibernateExt/annotations/doc/reference/en/styles/fopdf.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/styles/fopdf.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/en/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,519 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL FO configuration file for the Hibernate
- Reference Documentation. It defines a custom titlepage and
- the parameters for the A4 sized PDF printable output.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
-
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- exclude-result-prefixes="#default">
-
- <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
-
- <!--###################################################
- Custom Title Page
- ################################################### -->
-
- <xsl:template name="book.titlepage.recto">
- <fo:block>
- <fo:table table-layout="fixed" width="175mm">
- <fo:table-column column-width="175mm"/>
- <fo:table-body>
- <fo:table-row>
- <fo:table-cell text-align="center">
- <fo:block>
- <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/title"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="18pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/subtitle"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
- Version:
- <xsl:value-of select="bookinfo/releaseinfo"/>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </fo:block>
- </xsl:template>
-
- <!-- Prevent blank pages in output -->
- <xsl:template name="book.titlepage.before.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.separator">
- </xsl:template>
-
- <!--###################################################
- Header
- ################################################### -->
-
- <!-- More space in the center header for long text -->
- <xsl:attribute-set name="header.content.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$body.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="margin-left">-5em</xsl:attribute>
- <xsl:attribute name="margin-right">-5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Custom Footer
- ################################################### -->
-
- <!-- This footer prints the Hibernate version number on the left side -->
- <xsl:template name="footer.content">
- <xsl:param name="pageclass" select="''"/>
- <xsl:param name="sequence" select="''"/>
- <xsl:param name="position" select="''"/>
- <xsl:param name="gentext-key" select="''"/>
-
- <xsl:variable name="Version">
- <xsl:choose>
- <xsl:when test="//releaseinfo">
- <xsl:text>Hibernate </xsl:text>
- <xsl:value-of select="//releaseinfo"/>
- </xsl:when>
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
-
- <xsl:choose>
- <xsl:when test="$sequence='blank'">
- <xsl:choose>
- <xsl:when test="$double.sided != 0 and $position = 'left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position = 'center'">
- <!-- nop -->
- </xsl:when>
-
- <xsl:otherwise>
- <fo:page-number/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
-
- <xsl:when test="$pageclass='titlepage'">
- <!-- nop: other titlepage sequences have no footer -->
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <!--###################################################
- Custom Toc Line
- ################################################### -->
-
- <!-- Improve the TOC. -->
- <xsl:template name="toc.line">
- <xsl:variable name="id">
- <xsl:call-template name="object.id"/>
- </xsl:variable>
-
- <xsl:variable name="label">
- <xsl:apply-templates select="." mode="label.markup"/>
- </xsl:variable>
-
- <fo:block text-align-last="justify"
- end-indent="{$toc.indent.width}pt"
- last-line-end-indent="-{$toc.indent.width}pt">
- <fo:inline keep-with-next.within-line="always">
- <fo:basic-link internal-destination="{$id}">
-
- <!-- Chapter titles should be bold. -->
- <xsl:choose>
- <xsl:when test="local-name(.) = 'chapter'">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="$label != ''">
- <xsl:copy-of select="$label"/>
- <xsl:value-of select="$autotoc.label.separator"/>
- </xsl:if>
- <xsl:apply-templates select="." mode="titleabbrev.markup"/>
- </fo:basic-link>
- </fo:inline>
- <fo:inline keep-together.within-line="always">
- <xsl:text> </xsl:text>
- <fo:leader leader-pattern="dots"
- leader-pattern-width="3pt"
- leader-alignment="reference-area"
- keep-with-next.within-line="always"/>
- <xsl:text> </xsl:text>
- <fo:basic-link internal-destination="{$id}">
- <fo:page-number-citation ref-id="{$id}"/>
- </fo:basic-link>
- </fo:inline>
- </fo:block>
- </xsl:template>
-
- <!--###################################################
- Extensions
- ################################################### -->
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <!-- FOP provide only PDF Bookmarks at the moment -->
- <xsl:param name="fop.extensions">1</xsl:param>
-
- <!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
- <!-- Dot and Whitespace as separator in TOC between Label and Title-->
- <xsl:param name="autotoc.label.separator" select="'. '"/>
-
-
- <!--###################################################
- Paper & Page Size
- ################################################### -->
-
- <!-- Paper type, no headers on blank pages, no double sided printing -->
- <xsl:param name="paper.type" select="'A4'"/>
- <xsl:param name="double.sided">0</xsl:param>
- <xsl:param name="headers.on.blank.pages">0</xsl:param>
- <xsl:param name="footers.on.blank.pages">0</xsl:param>
-
- <!-- Space between paper border and content (chaotic stuff, don't touch) -->
- <xsl:param name="page.margin.top">5mm</xsl:param>
- <xsl:param name="region.before.extent">10mm</xsl:param>
- <xsl:param name="body.margin.top">10mm</xsl:param>
-
- <xsl:param name="body.margin.bottom">15mm</xsl:param>
- <xsl:param name="region.after.extent">10mm</xsl:param>
- <xsl:param name="page.margin.bottom">0mm</xsl:param>
-
- <xsl:param name="page.margin.outer">18mm</xsl:param>
- <xsl:param name="page.margin.inner">18mm</xsl:param>
-
- <!-- No intendation of Titles -->
- <xsl:param name="title.margin.left">0pc</xsl:param>
-
- <!--###################################################
- Fonts & Styles
- ################################################### -->
-
- <!-- Default Font size -->
- <xsl:param name="body.font.master">11</xsl:param>
-
- <!-- Line height in body text -->
- <xsl:param name="line-height">1.4</xsl:param>
-
- <!-- Monospaced fonts are smaller than regular text -->
- <xsl:attribute-set name="monospace.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$monospace.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="font-size">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Tables
- ################################################### -->
-
- <!-- The table width should be adapted to the paper size -->
- <xsl:param name="default.table.width">17.4cm</xsl:param>
-
- <!-- Some padding inside tables -->
- <xsl:attribute-set name="table.cell.padding">
- <xsl:attribute name="padding-left">4pt</xsl:attribute>
- <xsl:attribute name="padding-right">4pt</xsl:attribute>
- <xsl:attribute name="padding-top">4pt</xsl:attribute>
- <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Only hairlines as frame and cell borders in tables -->
- <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
- <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
-
- <!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
- <!-- Label only Sections up to level 2 -->
- <xsl:param name="local.l10n.xml" select="document('')"/>
- <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
- <l:l10n language="en">
- <l:context name="title-numbered">
- <l:template name="sect3" text="%t"/>
- <l:template name="sect4" text="%t"/>
- <l:template name="sect5" text="%t"/>
- </l:context>
- <l:context name="section-xref-numbered">
- <l:template name="sect3" text="the section called %t"/>
- <l:template name="sect4" text="the section called %t"/>
- <l:template name="sect5" text="the section called %t"/>
- </l:context>
- </l:l10n>
- </l:i18n>
-
- <!--###################################################
- Titles
- ################################################### -->
-
- <!-- Chapter title size -->
- <xsl:attribute-set name="chapter.titlepage.recto.style">
- <xsl:attribute name="text-align">left</xsl:attribute>
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.8"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
- Let's remove it, so this sucker can use our attribute-set only... -->
- <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
- <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xsl:use-attribute-sets="chapter.titlepage.recto.style">
- <xsl:call-template name="component.title">
- <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
- </xsl:call-template>
- </fo:block>
- </xsl:template>
-
- <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
- <xsl:attribute-set name="section.title.level1.properties">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.5"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level2.properties">
- <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.25"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level3.properties">
- <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.0"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Titles of formal objects (tables, examples, ...) -->
- <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="hyphenate">false</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Programlistings
- ################################################### -->
-
- <!-- Verbatim text formatting (programlistings) -->
- <xsl:attribute-set name="verbatim.properties">
- <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- <xsl:attribute name="border-color">#444444</xsl:attribute>
- <xsl:attribute name="border-style">solid</xsl:attribute>
- <xsl:attribute name="border-width">0.1pt</xsl:attribute>
- <xsl:attribute name="padding-top">0.5em</xsl:attribute>
- <xsl:attribute name="padding-left">0.5em</xsl:attribute>
- <xsl:attribute name="padding-right">0.5em</xsl:attribute>
- <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
- <xsl:attribute name="margin-left">0.5em</xsl:attribute>
- <xsl:attribute name="margin-right">0.5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Shade (background) programlistings -->
- <xsl:param name="shade.verbatim">1</xsl:param>
- <xsl:attribute-set name="shade.verbatim.style">
- <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Callouts
- ################################################### -->
-
- <!-- We want to use callouts... -->
- <xsl:param name="callout.extensions">1</xsl:param>
-
- <!-- Place callout bullets at this column in programmlisting.-->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
- <!--
- No, don't use crappy graphics for the callout bullets. This setting
- enables some weird Unicode rendering for some fancy bullet points
- in callouts. By default, this can only count to 10 and produces
- strange results if you ever have more than 10 callouts for one
- programlisting. We will fix that next.
- -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!--
- Again, fun with DocBook XSL: The callout bullets are rendered in
- two places: In the programlisting itself and in the list below
- the listing, with the actual callout text. The rendering in the
- programlisting is some XSL transformer extension (e.g. a Saxon
- extension), so we can't change that without messing with the
- extensions. We only can turn it off by setting this limit to
- zero, then, a simple bracket style like "(3)" and "(4)" will
- be used in the programlisting.
- -->
- <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
-
- <!--
- The callout bullets in the actual callout list will be rendered
- with an XSL FO template. The default template is broken: limited to 10
- nice looking Unicode bullet points and then it doesn't print anything,
- the fallback doesn't work. We implement our own template, which is not
- as complicated, more ugly, but works. As always, function is more
- important than form.
- -->
- <xsl:template name="callout-bug">
- <xsl:param name="conum" select='1'/>
- <fo:inline
- color="black"
- padding-top="0.1em"
- padding-bottom="0.1em"
- padding-start="0.2em"
- padding-end="0.2em"
- baseline-shift="0.1em"
- font-family="{$monospace.font.family}"
- font-weight="bold"
- font-size="75%">
- <xsl:text>(</xsl:text>
- <xsl:value-of select="$conum"/>
- <xsl:text>)</xsl:text>
- </fo:inline>
-
- </xsl:template>
-
- <!--###################################################
- Misc
- ################################################### -->
-
- <!-- Correct placement of titles for figures and examples. -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
- <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
- <xsl:param name="variablelist.as.blocks">1</xsl:param>
-
- <!-- The horrible list spacing problems, this is much better. -->
- <xsl:attribute-set name="list.block.spacing">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Newer DocBook XSL apparently thinks that some sections are by
- default "draft" status, and this idiotic thing is by default
- also set to "maybe", so it spits out a lot of errors with the
- latest FOP as the XSL/FO styles have references to some draft
- watermarks, which you actually don't want in the first place.
- Turn this crap off. If you have to work with the "status"
- attribute, don't.
- -->
- <xsl:param name="draft.mode" select="'no'"/>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/en/styles/fopdf.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/styles/fopdf.xsl)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/en/styles/fopdf.xsl (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/en/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,519 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL FO configuration file for the Hibernate
+ Reference Documentation. It defines a custom titlepage and
+ the parameters for the A4 sized PDF printable output.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ exclude-result-prefixes="#default">
+
+ <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
+
+ <!--###################################################
+ Custom Title Page
+ ################################################### -->
+
+ <xsl:template name="book.titlepage.recto">
+ <fo:block>
+ <fo:table table-layout="fixed" width="175mm">
+ <fo:table-column column-width="175mm"/>
+ <fo:table-body>
+ <fo:table-row>
+ <fo:table-cell text-align="center">
+ <fo:block>
+ <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/title"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="18pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/subtitle"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
+ Version:
+ <xsl:value-of select="bookinfo/releaseinfo"/>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Prevent blank pages in output -->
+ <xsl:template name="book.titlepage.before.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.separator">
+ </xsl:template>
+
+ <!--###################################################
+ Header
+ ################################################### -->
+
+ <!-- More space in the center header for long text -->
+ <xsl:attribute-set name="header.content.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-left">-5em</xsl:attribute>
+ <xsl:attribute name="margin-right">-5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Custom Footer
+ ################################################### -->
+
+ <!-- This footer prints the Hibernate version number on the left side -->
+ <xsl:template name="footer.content">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="position" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+ <xsl:variable name="Version">
+ <xsl:choose>
+ <xsl:when test="//releaseinfo">
+ <xsl:text>Hibernate </xsl:text>
+ <xsl:value-of select="//releaseinfo"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$sequence='blank'">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0 and $position = 'left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position = 'center'">
+ <!-- nop -->
+ </xsl:when>
+
+ <xsl:otherwise>
+ <fo:page-number/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$pageclass='titlepage'">
+ <!-- nop: other titlepage sequences have no footer -->
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!--###################################################
+ Custom Toc Line
+ ################################################### -->
+
+ <!-- Improve the TOC. -->
+ <xsl:template name="toc.line">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+
+ <fo:block text-align-last="justify"
+ end-indent="{$toc.indent.width}pt"
+ last-line-end-indent="-{$toc.indent.width}pt">
+ <fo:inline keep-with-next.within-line="always">
+ <fo:basic-link internal-destination="{$id}">
+
+ <!-- Chapter titles should be bold. -->
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'chapter'">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$label != ''">
+ <xsl:copy-of select="$label"/>
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </fo:basic-link>
+ </fo:inline>
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="dots"
+ leader-pattern-width="3pt"
+ leader-alignment="reference-area"
+ keep-with-next.within-line="always"/>
+ <xsl:text> </xsl:text>
+ <fo:basic-link internal-destination="{$id}">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ </fo:inline>
+ </fo:block>
+ </xsl:template>
+
+ <!--###################################################
+ Extensions
+ ################################################### -->
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <!-- FOP provide only PDF Bookmarks at the moment -->
+ <xsl:param name="fop.extensions">1</xsl:param>
+
+ <!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+ <!-- Dot and Whitespace as separator in TOC between Label and Title-->
+ <xsl:param name="autotoc.label.separator" select="'. '"/>
+
+
+ <!--###################################################
+ Paper & Page Size
+ ################################################### -->
+
+ <!-- Paper type, no headers on blank pages, no double sided printing -->
+ <xsl:param name="paper.type" select="'A4'"/>
+ <xsl:param name="double.sided">0</xsl:param>
+ <xsl:param name="headers.on.blank.pages">0</xsl:param>
+ <xsl:param name="footers.on.blank.pages">0</xsl:param>
+
+ <!-- Space between paper border and content (chaotic stuff, don't touch) -->
+ <xsl:param name="page.margin.top">5mm</xsl:param>
+ <xsl:param name="region.before.extent">10mm</xsl:param>
+ <xsl:param name="body.margin.top">10mm</xsl:param>
+
+ <xsl:param name="body.margin.bottom">15mm</xsl:param>
+ <xsl:param name="region.after.extent">10mm</xsl:param>
+ <xsl:param name="page.margin.bottom">0mm</xsl:param>
+
+ <xsl:param name="page.margin.outer">18mm</xsl:param>
+ <xsl:param name="page.margin.inner">18mm</xsl:param>
+
+ <!-- No intendation of Titles -->
+ <xsl:param name="title.margin.left">0pc</xsl:param>
+
+ <!--###################################################
+ Fonts & Styles
+ ################################################### -->
+
+ <!-- Default Font size -->
+ <xsl:param name="body.font.master">11</xsl:param>
+
+ <!-- Line height in body text -->
+ <xsl:param name="line-height">1.4</xsl:param>
+
+ <!-- Monospaced fonts are smaller than regular text -->
+ <xsl:attribute-set name="monospace.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$monospace.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Tables
+ ################################################### -->
+
+ <!-- The table width should be adapted to the paper size -->
+ <xsl:param name="default.table.width">17.4cm</xsl:param>
+
+ <!-- Some padding inside tables -->
+ <xsl:attribute-set name="table.cell.padding">
+ <xsl:attribute name="padding-left">4pt</xsl:attribute>
+ <xsl:attribute name="padding-right">4pt</xsl:attribute>
+ <xsl:attribute name="padding-top">4pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Only hairlines as frame and cell borders in tables -->
+ <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
+ <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
+
+ <!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+ <!-- Label only Sections up to level 2 -->
+ <xsl:param name="local.l10n.xml" select="document('')"/>
+ <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+ <l:l10n language="en">
+ <l:context name="title-numbered">
+ <l:template name="sect3" text="%t"/>
+ <l:template name="sect4" text="%t"/>
+ <l:template name="sect5" text="%t"/>
+ </l:context>
+ <l:context name="section-xref-numbered">
+ <l:template name="sect3" text="the section called %t"/>
+ <l:template name="sect4" text="the section called %t"/>
+ <l:template name="sect5" text="the section called %t"/>
+ </l:context>
+ </l:l10n>
+ </l:i18n>
+
+ <!--###################################################
+ Titles
+ ################################################### -->
+
+ <!-- Chapter title size -->
+ <xsl:attribute-set name="chapter.titlepage.recto.style">
+ <xsl:attribute name="text-align">left</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.8"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
+ Let's remove it, so this sucker can use our attribute-set only... -->
+ <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xsl:use-attribute-sets="chapter.titlepage.recto.style">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
+ <xsl:attribute-set name="section.title.level1.properties">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.5"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level2.properties">
+ <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.25"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level3.properties">
+ <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.0"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Titles of formal objects (tables, examples, ...) -->
+ <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Programlistings
+ ################################################### -->
+
+ <!-- Verbatim text formatting (programlistings) -->
+ <xsl:attribute-set name="verbatim.properties">
+ <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ <xsl:attribute name="border-color">#444444</xsl:attribute>
+ <xsl:attribute name="border-style">solid</xsl:attribute>
+ <xsl:attribute name="border-width">0.1pt</xsl:attribute>
+ <xsl:attribute name="padding-top">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-left">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-right">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-left">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-right">0.5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Shade (background) programlistings -->
+ <xsl:param name="shade.verbatim">1</xsl:param>
+ <xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- We want to use callouts... -->
+ <xsl:param name="callout.extensions">1</xsl:param>
+
+ <!-- Place callout bullets at this column in programmlisting.-->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+ <!--
+ No, don't use crappy graphics for the callout bullets. This setting
+ enables some weird Unicode rendering for some fancy bullet points
+ in callouts. By default, this can only count to 10 and produces
+ strange results if you ever have more than 10 callouts for one
+ programlisting. We will fix that next.
+ -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!--
+ Again, fun with DocBook XSL: The callout bullets are rendered in
+ two places: In the programlisting itself and in the list below
+ the listing, with the actual callout text. The rendering in the
+ programlisting is some XSL transformer extension (e.g. a Saxon
+ extension), so we can't change that without messing with the
+ extensions. We only can turn it off by setting this limit to
+ zero, then, a simple bracket style like "(3)" and "(4)" will
+ be used in the programlisting.
+ -->
+ <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
+
+ <!--
+ The callout bullets in the actual callout list will be rendered
+ with an XSL FO template. The default template is broken: limited to 10
+ nice looking Unicode bullet points and then it doesn't print anything,
+ the fallback doesn't work. We implement our own template, which is not
+ as complicated, more ugly, but works. As always, function is more
+ important than form.
+ -->
+ <xsl:template name="callout-bug">
+ <xsl:param name="conum" select='1'/>
+ <fo:inline
+ color="black"
+ padding-top="0.1em"
+ padding-bottom="0.1em"
+ padding-start="0.2em"
+ padding-end="0.2em"
+ baseline-shift="0.1em"
+ font-family="{$monospace.font.family}"
+ font-weight="bold"
+ font-size="75%">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </fo:inline>
+
+ </xsl:template>
+
+ <!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Correct placement of titles for figures and examples. -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+ <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
+ <xsl:param name="variablelist.as.blocks">1</xsl:param>
+
+ <!-- The horrible list spacing problems, this is much better. -->
+ <xsl:attribute-set name="list.block.spacing">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Newer DocBook XSL apparently thinks that some sections are by
+ default "draft" status, and this idiotic thing is by default
+ also set to "maybe", so it spits out a lot of errors with the
+ latest FOP as the XSL/FO styles have references to some draft
+ watermarks, which you actually don't want in the first place.
+ Turn this crap off. If you have to work with the "status"
+ attribute, don't.
+ -->
+ <xsl:param name="draft.mode" select="'no'"/>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/annotations/doc/reference/en/styles/html.css
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/styles/html.css 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/en/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,97 +0,0 @@
-A {
- color: #003399;
-}
-
-A:active {
- color: #003399;
-}
-
-A:visited {
- color: #888888;
-}
-
-P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
- color: #000000;
-}
-
-TD, TH, SPAN {
- color: #000000;
-}
-
-BLOCKQUOTE {
- margin-right: 0px;
-}
-
-
-H1, H2, H3, H4, H5, H6 {
- color: #000000;
- font-weight:500;
- margin-top:10px;
- padding-top:15px;
-}
-
-TABLE {
- border-collapse: collapse;
- border-spacing:0;
- border: 1px thin black;
- empty-cells: hide;
-}
-
-TD {
- padding: 4pt;
-}
-
-H1 { font-size: 150%; }
-H2 { font-size: 140%; }
-H3 { font-size: 110%; font-weight: bold; }
-H4 { font-size: 110%; font-weight: bold;}
-H5 { font-size: 100%; font-style: italic; }
-H6 { font-size: 100%; font-style: italic; }
-
-TT {
-font-size: 90%;
- font-family: "Courier New", Courier, monospace;
- color: #000000;
-}
-
-PRE {
-font-size: 100%;
- padding: 5px;
- border-style: solid;
- border-width: 1px;
- border-color: #CCCCCC;
- background-color: #F4F4F4;
-}
-
-UL, OL, LI {
- list-style: disc;
-}
-
-HR {
- width: 100%;
- height: 1px;
- background-color: #CCCCCC;
- border-width: 0px;
- padding: 0px;
- color: #CCCCCC;
-}
-
-.variablelist {
- padding-top: 10;
- padding-bottom:10;
- margin:0;
-}
-
-.itemizedlist, UL {
- padding-top: 0;
- padding-bottom:0;
- margin:0;
-}
-
-.term {
- font-weight:bold;
-}
-
-
-
-
Copied: trunk/HibernateExt/annotations/doc/reference/en/styles/html.css (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/styles/html.css)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/en/styles/html.css (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/en/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,97 @@
+A {
+ color: #003399;
+}
+
+A:active {
+ color: #003399;
+}
+
+A:visited {
+ color: #888888;
+}
+
+P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
+ color: #000000;
+}
+
+TD, TH, SPAN {
+ color: #000000;
+}
+
+BLOCKQUOTE {
+ margin-right: 0px;
+}
+
+
+H1, H2, H3, H4, H5, H6 {
+ color: #000000;
+ font-weight:500;
+ margin-top:10px;
+ padding-top:15px;
+}
+
+TABLE {
+ border-collapse: collapse;
+ border-spacing:0;
+ border: 1px thin black;
+ empty-cells: hide;
+}
+
+TD {
+ padding: 4pt;
+}
+
+H1 { font-size: 150%; }
+H2 { font-size: 140%; }
+H3 { font-size: 110%; font-weight: bold; }
+H4 { font-size: 110%; font-weight: bold;}
+H5 { font-size: 100%; font-style: italic; }
+H6 { font-size: 100%; font-style: italic; }
+
+TT {
+font-size: 90%;
+ font-family: "Courier New", Courier, monospace;
+ color: #000000;
+}
+
+PRE {
+font-size: 100%;
+ padding: 5px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #CCCCCC;
+ background-color: #F4F4F4;
+}
+
+UL, OL, LI {
+ list-style: disc;
+}
+
+HR {
+ width: 100%;
+ height: 1px;
+ background-color: #CCCCCC;
+ border-width: 0px;
+ padding: 0px;
+ color: #CCCCCC;
+}
+
+.variablelist {
+ padding-top: 10;
+ padding-bottom:10;
+ margin:0;
+}
+
+.itemizedlist, UL {
+ padding-top: 0;
+ padding-bottom:0;
+ margin:0;
+}
+
+.term {
+ font-weight:bold;
+}
+
+
+
+
Deleted: trunk/HibernateExt/annotations/doc/reference/en/styles/html.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/styles/html.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/en/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,84 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/en/styles/html.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/styles/html.xsl)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/en/styles/html.xsl (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/en/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/annotations/doc/reference/en/styles/html_chunk.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/styles/html_chunk.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/en/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="chunk.section.depth">'5'</xsl:param>
- <xsl:param name="use.id.as.filename">'1'</xsl:param>
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/en/styles/html_chunk.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/en/styles/html_chunk.xsl)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/en/styles/html_chunk.xsl (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/en/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="chunk.section.depth">'5'</xsl:param>
+ <xsl:param name="use.id.as.filename">'1'</xsl:param>
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/fr (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr)
Copied: trunk/HibernateExt/annotations/doc/reference/fr/images (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/images)
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/images/hibernate_logo_a.png
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/annotations/doc/reference/fr/images/hibernate_logo_a.png (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/images/hibernate_logo_a.png)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/master.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/master.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/fr/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,82 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
-"../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
-<!ENTITY setup SYSTEM "modules/setup.xml">
-<!ENTITY entity SYSTEM "modules/entity.xml">
-<!ENTITY xml-overriding SYSTEM "modules/xml-overriding.xml">
-<!ENTITY validator SYSTEM "modules/validator.xml">
-<!ENTITY lucene SYSTEM "modules/lucene.xml">
-]>
-<book lang="fr">
- <bookinfo>
- <title>Hibernate Annotations</title>
-
- <subtitle>Guide de référence</subtitle>
-
- <releaseinfo>3.2.0.GA</releaseinfo>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="images/hibernate_logo_a.png" format="png" />
- </imageobject>
- </mediaobject>
- </bookinfo>
-
- <toc></toc>
-
- <preface id="preface" revision="1">
- <title>Préface</title>
- <para>Traducteur(s): Vincent Ricard</para>
-
- <para>Hibernate, comme tous les autres outils de mapping objet/relationnel,
- nécessite des méta-données qui régissent la transformation des données
- d'une représentation vers l'autre (et vice versa). Dans Hibernate 2.x, les
- méta-données de mapping sont la plupart du temps déclarées dans des fichiers
- XML. Une autre option est XDoclet, qui utilise les annotations du code source
- Javadoc et un préprocesseur au moment de la compilation. Le même genre
- d'annotation est maintenant disponible avec le JDK standard, quoique plus
- puissant et mieux pris en charge par les outils. IntelliJ IDEA et Eclipse,
- par exemple, prennent en charge la complétion automatique et la coloration
- syntaxique des annotations du JDK 5.0. Les annotations sont compilées en
- bytecode et lues au moment de l'exécution (dans le cas d'Hibernate, au
- démarrage) en utilisant la réflexion, donc pas besoin de fichiers XML
- externes.</para>
-
- <para>La spécification EJB3 reconnaît l'intérêt et le succès du paradigme
- du mapping objet/relationnel transparent. La spécification EJB3 standardise
- les APIs de base et les méta-données requises par n'importe quel mécanisme
- de persistance objet/relationnel. <emphasis>Hibernate EntityManager</emphasis>
- implémente les interfaces de programmation et les règles de cycle de vie
- telles que définies par la spécification de persistance EJB3. Avec
- <emphasis>Hibernate Annotations</emphasis>, ce wrapper implémente une
- solution de persistance EJB3 complète (et autonome) au-dessus du noyau
- mature d'Hibernate. Vous pouvez utiliser soit les trois ensembles, soit les
- annotations sans le cycle de vie et les interfaces de programmations EJB3,
- ou même Hibernate tout seul, selon les besoins techniques et fonctionnels
- de votre projet. Vous pouvez à tout moment recourir aux APIs natives
- d'Hibernate ou même, si besoin est, à celles de JDBC et au SQL.</para>
-
- <para>Cette version est basée sur la dernière version de la spécification
- EJB 3.0 / JPA (alias JSP-220) et prend en charge toutes les fonctionnalités
- de la spécification (dont certaines optionnelles). La plupart des
- fonctionnalités d'Hibernate et des extensions sont aussi disponibles à
- travers des annotations spécifiques à Hibernate. Bien que la couverture
- d'Hibernate en termes de fonctionnalités soit maintenant très grande,
- certaines sont encore manquantes. Le but ultime est de tout couvrir. Voir la
- section JIRA "road map" pour plus d'informations.</para>
-
- <para>Si vous utilisiez une version précédente d'Hibernate Annotations,
- veuillez regarder <uri>http://www.hibernate.org/371.html</uri> pour un guide
- de migration.</para>
- </preface>
-
- &setup;
-
- &entity;
-
- &xml-overriding;
-
- &validator;
-
- &lucene;
-</book>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/fr/master.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/master.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/fr/master.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/fr/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,82 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
+"../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
+<!ENTITY setup SYSTEM "modules/setup.xml">
+<!ENTITY entity SYSTEM "modules/entity.xml">
+<!ENTITY xml-overriding SYSTEM "modules/xml-overriding.xml">
+<!ENTITY validator SYSTEM "modules/validator.xml">
+<!ENTITY lucene SYSTEM "modules/lucene.xml">
+]>
+<book lang="fr">
+ <bookinfo>
+ <title>Hibernate Annotations</title>
+
+ <subtitle>Guide de référence</subtitle>
+
+ <releaseinfo>3.2.0.GA</releaseinfo>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/hibernate_logo_a.png" format="png" />
+ </imageobject>
+ </mediaobject>
+ </bookinfo>
+
+ <toc></toc>
+
+ <preface id="preface" revision="1">
+ <title>Préface</title>
+ <para>Traducteur(s): Vincent Ricard</para>
+
+ <para>Hibernate, comme tous les autres outils de mapping objet/relationnel,
+ nécessite des méta-données qui régissent la transformation des données
+ d'une représentation vers l'autre (et vice versa). Dans Hibernate 2.x, les
+ méta-données de mapping sont la plupart du temps déclarées dans des fichiers
+ XML. Une autre option est XDoclet, qui utilise les annotations du code source
+ Javadoc et un préprocesseur au moment de la compilation. Le même genre
+ d'annotation est maintenant disponible avec le JDK standard, quoique plus
+ puissant et mieux pris en charge par les outils. IntelliJ IDEA et Eclipse,
+ par exemple, prennent en charge la complétion automatique et la coloration
+ syntaxique des annotations du JDK 5.0. Les annotations sont compilées en
+ bytecode et lues au moment de l'exécution (dans le cas d'Hibernate, au
+ démarrage) en utilisant la réflexion, donc pas besoin de fichiers XML
+ externes.</para>
+
+ <para>La spécification EJB3 reconnaît l'intérêt et le succès du paradigme
+ du mapping objet/relationnel transparent. La spécification EJB3 standardise
+ les APIs de base et les méta-données requises par n'importe quel mécanisme
+ de persistance objet/relationnel. <emphasis>Hibernate EntityManager</emphasis>
+ implémente les interfaces de programmation et les règles de cycle de vie
+ telles que définies par la spécification de persistance EJB3. Avec
+ <emphasis>Hibernate Annotations</emphasis>, ce wrapper implémente une
+ solution de persistance EJB3 complète (et autonome) au-dessus du noyau
+ mature d'Hibernate. Vous pouvez utiliser soit les trois ensembles, soit les
+ annotations sans le cycle de vie et les interfaces de programmations EJB3,
+ ou même Hibernate tout seul, selon les besoins techniques et fonctionnels
+ de votre projet. Vous pouvez à tout moment recourir aux APIs natives
+ d'Hibernate ou même, si besoin est, à celles de JDBC et au SQL.</para>
+
+ <para>Cette version est basée sur la dernière version de la spécification
+ EJB 3.0 / JPA (alias JSP-220) et prend en charge toutes les fonctionnalités
+ de la spécification (dont certaines optionnelles). La plupart des
+ fonctionnalités d'Hibernate et des extensions sont aussi disponibles à
+ travers des annotations spécifiques à Hibernate. Bien que la couverture
+ d'Hibernate en termes de fonctionnalités soit maintenant très grande,
+ certaines sont encore manquantes. Le but ultime est de tout couvrir. Voir la
+ section JIRA "road map" pour plus d'informations.</para>
+
+ <para>Si vous utilisiez une version précédente d'Hibernate Annotations,
+ veuillez regarder <uri>http://www.hibernate.org/371.html</uri> pour un guide
+ de migration.</para>
+ </preface>
+
+ &setup;
+
+ &entity;
+
+ &xml-overriding;
+
+ &validator;
+
+ &lucene;
+</book>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/fr/modules (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules)
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/modules/entity.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules/entity.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/fr/modules/entity.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,3458 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="entity">
- <title>Entity Beans</title>
-
- <sect1 id="entity-overview" revision="1">
- <title>Introduction</title>
-
- <para>Cette section couvre les annotations entity bean EJB 3.0 (alias JPA)
- et les extensions spécifiques à Hibernate.</para>
- </sect1>
-
- <sect1 id="entity-mapping" revision="2">
- <title>Mapping avec les annotations EJB3/JPA</title>
-
- <para>Les entités EJB3 sont des POJOs ordinaires. En fait, ils
- représentent exactement le même concept que les entités de persistance
- Hibernate. Leur mapping est défini à travers les annotations du JDK 5.0
- (une syntaxe de descripteur XML pour la surcharge est définie dans la
- spécification EJB3). Les annotations peuvent être divisées en deux
- catégories, les annotations de mapping logique (vous permettant de décrire
- le modèle objet, les associations de classe, etc) et les annotations de
- mapping physique (décrivant le schéma physique, les tables, les colonnes,
- les index, etc). Nous mélangerons les annotations des deux catégories dans
- les exemples de code.</para>
-
- <para>Les annotations EJB3 sont dans le package
- <literal>javax.persistence.*</literal>. La plupart des IDE compatibles JDK 5
- (comme Eclipse, IntelliJ IDEA et Netbeans) peuvent auto-compléter les
- interfaces et les attributes d'annotation pour vous (même sans module "EJB3"
- spécifique, puisque les annotations EJB3 sont des annotations ordinaires de
- JDK 5).</para>
-
- <para>Pour plus d'exemples concrets, lisez le tutorial EJB 3.0 de JBoss ou
- parcourez la suite de tests d'Hibernate Annotations. La plupart des tests
- unitaires ont été conçus pour représenter un exemple concret et être une
- source d'inspiration.</para>
-
- <sect2>
- <title>Déclarer un entity bean</title>
-
- <para>Chaque classe POJO persistante liée est un entity bean et est
- déclarée en utilisant l'annotation <literal>@Entity</literal> (au niveau
- de la classe) :</para>
-
- <programlisting>
- at Entity
-public class Flight implements Serializable {
- Long id;
-
- @Id
- public Long getId() { return id; }
-
- public void setId(Long id) { this.id = id; }
-}
-</programlisting>
-
- <para><literal>@Entity</literal> déclare la classe comme un entity bean
- (ie une classe POJO persistante), <literal>@Id</literal> déclare la
- propriété identifiante de cet entity bean. Les autres déclarations de
- mapping sont implicites. Ce concept de déclaration par exception est
- un composant essentiel de la nouvelle spécification EJB3 et une
- amélioration majeure. La classe Flight est mappée sur la table Flight, en
- utilisant la colonne id comme colonne de la clef primaire.</para>
-
- <para>Selon que vous annotez des champs ou des méthodes, le type d'accès
- utilisé par Hibernate sera <literal>field</literal> ou
- <literal>property</literal>. La spécification EJB3 exige que vous
- déclariez les annotations sur le type d'élément qui sera accédé,
- c'est-à-dire le getter si vous utilisez l'accès
- <literal>property</literal>, le champ si vous utilisez l'accès
- <literal>field</literal>. Mélanger des EJB3 annotations dans les champs et
- les méthodes devrait être évité. Hibernate devinera le type d'accès de
- l'identifiant à partir de la position d'<literal>@Id</literal> ou
- d'<literal>@EmbeddedId</literal>.</para>
-
- <sect3>
- <title>Définir la table</title>
-
- <para><literal>@Table</literal> est positionnée au niveau de la classe ;
- cela vous permet de définir le nom de la table, du catalogue et du
- schéma pour le mapping de votre entity bean. Si aucune
- <literal>@Table</literal> n'est définie les valeurs par défaut sont
- utilisées : le nom de la classe de l'entité (sans le nom de
- package).</para>
-
- <programlisting>
- at Entity
- at Table(name="tbl_sky")
-public class Sky implements Serializable {
-...
- </programlisting>
-
- <para>L'élément <literal>@Table</literal> contient aussi un attribut
- <literal>schema</literal> et un attribut <literal>catalog</literal>,
- si vous avez besoin de les définir. Vous pouvez aussi définir des
- contraintes d'unicité sur la table en utilisant l'annotation
- <literal>@UniqueConstraint</literal> en conjonction avec
- <literal>@Table</literal> (pour une contrainte d'unicité n'impliquant
- qu'une seule colonne, référez-vous à <literal>@Column</literal>).</para>
-
- <programlisting>@Table(name="tbl_sky",
- <emphasis role="bold">uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})}</emphasis>
-)</programlisting>
-
- <para>Une contrainte d'unicité est appliquée au tuple {month, day}.
- Notez que le tableau <literal>columnNames</literal> fait référence aux
- noms logiques des colonnes.</para>
-
- <remark>Le nom logique d'une colonne est défini par l'implémentation
- de NamingStrategy d'Hibernate. La stratégie de nommage EJB3 par défaut
- utilise le nom de colonne physique comme nom de colonne logique. Notez
- qu'il peut être différent du nom de la propriété (si le nom de colonne
- est explicite). A moins que vous surchargiez la stratégie de nommage,
- vous ne devriez pas vous soucier de ça.</remark>
- </sect3>
-
- <sect3>
- <title>Versionner pour un contrôle de concurrence optimiste</title>
-
- <para>Vous pouvez ajouter un contrôle de concurrence optimiste à un
- entity bean en utilisant l'annotation
- <literal>@Version</literal> :</para>
-
- <programlisting>
- at Entity
-public class Flight implements Serializable {
-...
- @Version
- @Column(name="OPTLOCK")
- public Integer getVersion() { ... }
-} </programlisting>
-
- <para>La propriété de version sera mappée sur la colonne
- <literal>OPTLOCK</literal>, et le gestionnaire d'entités l'utilisera
- pour détecter des conflits lors des mises à jour (prévenant des pertes
- de données lors de mises à jours que vous pourriez voir avec la
- stratégie du last-commit-wins).</para>
-
- <para>La colonne de version peut être un numérique (solution
- recommandée) ou un timestamp comme pour la spécification EJB3. Hibernate
- prend en charge n'importe quel type fourni que vous définissez et
- implémentez avec la classe <classname>UserVersionType</classname>
- appropriée.</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Mapping de simples propriétés</title>
-
- <sect3>
- <title>Déclarer des mappings de propriétés élémentaires</title>
-
- <para>Chaque propriété (champ ou méthode) non statique non transient
- d'un entity bean est considérée persistante, à moins que vous l'annotiez
- comme <literal>@Transient</literal>. Ne pas avoir d'annotation pour
- votre propriété est équivalent à l'annotation <literal>@Basic</literal>.
- L'annotation <literal>@Basic</literal> vous permet de déclarer la
- stratégie de récupération pour une propriété :</para>
-
- <programlisting>public transient int counter; // propriété transient
-
-private String firstname; // propriété persistante
-
- at Transient
-String getLengthInMeter() { ... } // propriété transient
-
-String getName() {... } // propriété persistante
-
- at Basic
-int getLength() { ... } // propriété persistante
-
- at Basic(fetch = FetchType.LAZY)
-String getDetailedComment() { ... } // propriété persistante
-
- at Temporal(TemporalType.TIME)
-java.util.Date getDepartureTime() { ... } // propriété persistante
-
- at Enumerated(STRING)
-Starred getNote() { ... } // enum persistée en tant que String dans la base de données</programlisting>
-
- <para><literal>counter</literal>, un champ transient, et
- <literal>lengthInMeter</literal>, une méthode annotée comme
- <literal>@Transient</literal>, seront ignorés par le gestionnaire
- d'entités. Les propriétés <literal>name</literal>,
- <literal>length</literal>, et <literal>firstname</literal> sont mappées
- comme persistantes et à charger immédiatement (ce sont les valeurs
- par défaut pour les propriétés simples). La valeur de la propriété
- <literal>detailedComment</literal> sera chargée à partir de la base de
- données dès que la propriété de l'entité sera accédée pour la première
- fois. En général vous n'avez pas besoin de marquer de simples propriétés
- comme "à charger à la demande" (NdT: lazy) (à ne pas confondre avec la
- récupération d'association "lazy").</para>
-
- <note>
- <para>Pour activer la récupération à la demande au niveau de la
- propriété, vos classes doivent être instrumentées : du bytecode est
- ajouté au code original pour activer cette fonctionnalité, veuillez
- vous référer à la documentation de référence d'Hibernate. Si vos
- classes ne sont pas instrumentées, le chargement à la demande au
- niveau de la propriété est silencieusement ignoré.</para>
- </note>
-
- <para>L'alternative recommandée est d'utiliser la capacité de projection
- de JPA-QL ou des requêtes Criteria.</para>
-
- <para>EJB3 prend en charge le mapping de propriété de tous les types
- élémentaires pris en charge par Hibernate (tous les types de base Java,
- leur wrapper respectif et les classes sérialisables). Hibernate
- Annotations prend en charge le mapping des types Enum soit vers une
- colonne ordinale (en stockant le numéro ordinal de l'enum), soit vers
- une colonne de type chaîne de caractères (en stockant la chaîne de
- caractères représentant l'enum) : la représentation de la persistance,
- par défaut ordinale, peut être surchargée grâce à l'annotation
- <literal>@Enumerated</literal> comme montré avec la propriété
- <literal>note</literal> de l'exemple.</para>
-
- <para>Dans les APIs core de Java, la précision temporelle n'est pas
- définie. Lors du traitement de données temporelles vous pourriez vouloir
- décrire la précision attendue dans la base de données. Les données
- temporelles peuvent avoir une précision de type <literal>DATE</literal>,
- <literal>TIME</literal>, ou <literal>TIMESTAMP</literal> (c'est-à-dire
- seulement la date, seulement l'heure, ou les deux). Utilisez
- l'annotation <literal>@Temporal</literal> pour ajuster cela.</para>
-
- <para><literal>@Lob</literal> indique que la propriété devrait être
- persistée dans un Blob ou un Clob selon son type :
- <classname>java.sql.Clob</classname>,
- <classname>Character[]</classname>, <classname>char[]</classname> et
- java.lang.<classname>String</classname> seront persistés dans un Clob.
- <classname>java.sql.Blob</classname>, <classname>Byte[]</classname>,
- <classname>byte[] </classname> et les types sérialisables seront
- persistés dans un Blob.</para>
-
- <programlisting>
- at Lob
-public String getFullText() {
- return fullText;
-}
-
- at Lob
-public byte[] getFullCode() {
- return fullCode;
-}
- </programlisting>
-
- <para>Si le type de la propriété implémente
- <classname>java.io.Serializable</classname> et n'est pas un type de
- base, et si la propriété n'est pas annotée avec <literal>@Lob</literal>,
- alors le type Hibernate <literal>serializable</literal> est
- utilisé.</para>
- </sect3>
-
- <sect3>
- <title>Déclarer des attributs de colonne</title>
-
- <para>La(les) colonne(s) utilisée(s) pour mapper une propriété peuvent
- être définies en utilisant l'annotation <literal>@Column</literal>.
- Utilisez-la pour surcharger les valeurs par défaut (voir la
- spécification EJB3 pour plus d'informations sur les valeurs par défaut).
- Vous pouvez utilisez cette annotation au niveau de la propriété pour
- celles qui sont :</para>
-
- <itemizedlist>
- <listitem>
- <para>pas du tout annotées</para>
- </listitem>
-
- <listitem>
- <para>annotées avec <literal>@Basic</literal></para>
- </listitem>
-
- <listitem>
- <para>annotées avec <literal>@Version</literal></para>
- </listitem>
-
- <listitem>
- <para>annotées avec <literal>@Lob</literal></para>
- </listitem>
-
- <listitem>
- <para>annotées avec <literal>@Temporal</literal></para>
- </listitem>
-
- <listitem>
- <para>annotées avec
- <literal>@org.hibernate.annotations.CollectionOfElements</literal>
- (pour Hibernate uniquement)</para>
- </listitem>
- </itemizedlist>
-
- <programlisting>
- at Entity
-public class Flight implements Serializable {
-...
- at Column(updatable = false, name = "flight_name", nullable = false, length=50)
-public String getName() { ... }
- </programlisting>
-
- <para>La propriété <literal>name</literal> est mappée sur la colonne
- <literal>flight_name</literal>, laquelle ne peut pas avoir de valeur
- nulle, a une longueur de 50 et ne peut pas être mise à jour (rendant
- la propriété immuable).</para>
-
- <para>Cette annotation peut être appliquée aux propriétés habituelles
- ainsi qu'aux propriétés <literal>@Id</literal> ou
- <literal>@Version</literal>.</para>
-
- <programlistingco>
- <areaspec>
- <area coords="2 55" id="hm1" />
-
- <area coords="3 55" id="hm2" />
-
- <area coords="4 55" id="hm3" />
-
- <area coords="5 55" id="hm4" />
-
- <area coords="6 55" id="hm5" />
-
- <area coords="7 55" id="hm6" />
-
- <area coords="8 55" id="hm7" />
-
- <area coords="9 55" id="hm8" />
-
- <area coords="10 55" id="hm9" />
-
- <area coords="11 55" id="hm10" />
- </areaspec>
-
- <programlisting>@Column(
- name="columnName";
- boolean unique() default false;
- boolean nullable() default true;
- boolean insertable() default true;
- boolean updatable() default true;
- String columnDefinition() default "";
- String table() default "";
- int length() default 255;
- int precision() default 0; // decimal precision
- int scale() default 0; // decimal scale</programlisting>
-
- <calloutlist>
- <callout arearefs="hm1">
- <para><literal>name</literal> (optionnel) : le nom de la colonne
- (par défaut le nom de la propriété)</para>
- </callout>
-
- <callout arearefs="hm2">
- <para><literal>unique</literal> (optionnel) : indique si la colonne
- fait partie d'une contrainte d'unicité ou non (par défaut
- false)</para>
- </callout>
-
- <callout arearefs="hm3">
- <para><literal>nullable</literal> (optionnel) : indique si la
- colonne peut avoir une valeur nulle (par défaut false).</para>
- </callout>
-
- <callout arearefs="hm4">
- <para><literal>insertable</literal> (optionnel) : indique si la
- colonne fera partie de la commande insert (par défaut true)</para>
- </callout>
-
- <callout arearefs="hm5">
- <para><literal>updatable</literal> (optionnel) : indique si la
- colonne fera partie de la commande update (par défaut true)</para>
- </callout>
-
- <callout arearefs="hm6">
- <para><literal>columnDefinition</literal> (optionnel) : surcharge
- le fragment DDL sql pour cette colonne en particulier (non
- portable)</para>
- </callout>
-
- <callout arearefs="hm7">
- <para><literal>table</literal> (optionnel) : définit la table
- cible (par défaut la table principale)</para>
- </callout>
-
- <callout arearefs="hm8">
- <para><literal><literal>length</literal></literal> (optionnel) :
- longueur de la colonne (par défaut 255)</para>
- </callout>
-
- <callout arearefs="hm8">
- <para><literal><literal>precision</literal></literal>
- (optionnel) : précision décimale de la colonne (par défaut
- 0)</para>
- </callout>
-
- <callout arearefs="hm10">
- <para><literal><literal>scale</literal></literal> (optionnel) :
- échelle décimale de la colonne si nécessaire (par défaut 0)</para>
- </callout>
- </calloutlist>
- </programlistingco>
- </sect3>
-
- <sect3>
- <title>Objets embarqués (alias composants)</title>
-
- <para>Il est possible de déclarer un composant embarqué à l'intérieur
- d'une entité et même de surcharger le mapping de ses colonnes. Les
- classes de composant doivent être annotées au niveau de la classe avec
- l'annotation <literal>@Embeddable</literal>. Il est possible de
- surcharger le mapping de colonne d'un objet embarqué pour une entité
- particulière en utilisant les annotations
- <literal>@Embedded</literal> et <literal>@AttributeOverride</literal>
- sur la propriété associée :</para>
-
- <programlisting>
- at Entity
-public class Person implements Serializable {
-
- // Composant persistant utilisant les valeurs par défaut
- Address homeAddress;
-
- @Embedded
- @AttributeOverrides( {
- @AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),
- @AttributeOverride(name="name", column = @Column(name="bornCountryName") )
- } )
- Country bornIn;
- ...
-}
- </programlisting>
-
- <programlisting>
- at Embeddable
-public class Address implements Serializable {
- String city;
- Country nationality; // par de surcharge ici
-}
- </programlisting>
-
- <programlisting>
- at Embeddable
-public class Country implements Serializable {
- private String iso2;
- @Column(name="countryName") private String name;
-
- public String getIso2() { return iso2; }
- public void setIso2(String iso2) { this.iso2 = iso2; }
-
-
- public String getName() { return name; }
- public void setName(String name) { this.name = name; }
- ...
-}
- </programlisting>
-
- <para>Un objet embarquable hérite du type d'accès de son entité
- d'appartenance (notez que vous pouvez surcharger cela en utilisant les
- annotations spécifiques à Hibernate <literal>@AccessType</literal>,
- voir <xref linkend="entity-hibspec" />).</para>
-
- <para>L'entity bean <literal>Person</literal> a deux propriétés
- composant, <literal>homeAddress</literal> et
- <literal>bornIn</literal>. La propriété <literal>homeAddress</literal>
- n'a pas été annotée, mais Hibernate devinera que c'est un composant
- persistant en cherchant l'annotation <literal>@Embeddable</literal>
- dans la classe Address. Nous surchargeons aussi le mapping d'un nom de
- colonne (pour <literal>bornCountryName</literal>) avec les annotations
- <literal>@Embedded</literal> et <literal>@AttributeOverride</literal>
- pour chaque attribut mappé de <literal>Country</literal>. Comme vous
- pouvez le voir, <literal>Country</literal> est aussi un composant
- imbriqué de <literal>Address</literal>, utilisant de nouveau la
- détection automatique d'Hibernate et les valeurs par défaut EJB3.
- Surcharger des colonnes d'objets embarqués d'objets (eux-mêmes)
- embarqués n'est actuellement pas pris en charge par la spécification
- EJB3, cependant, Hibernate Annotations le prend en charge à travers des
- expressions séparées par des points.</para>
-
- <para><programlisting> @Embedded
- @AttributeOverrides( {
- @AttributeOverride(name="city", column = @Column(name="fld_city") )
- @AttributeOverride(name="<emphasis role="bold">nationality.iso2</emphasis>", column = @Column(name="nat_Iso2") ),
- @AttributeOverride(name="<emphasis role="bold">nationality.name</emphasis>", column = @Column(name="nat_CountryName") )
- // les colonnes de nationality dans homeAddress sont surchargées
- } )
- Address homeAddress;</programlisting>Hibernate Annotations prend en charge
- une fonctionnalité de plus qui n'est pas explicitement prise en charge
- par la spécification EJB3. Vous pouvez annoter un objet embarqué avec
- l'annotation
- <literal>@MappedSuperclass</literal> pour rendre les propriétés de la
- classe parente persistantes (voir <literal>@MappedSuperclass</literal>
- pour plus d'informations).</para>
-
- <para>Alors que ce n'est pas pris en charge par la spécification EJB3,
- Hibernate Annotations vous permet d'utiliser les annotations
- d'association dans un objet embarquable (ie <literal>@*ToOne</literal>
- ou <literal>@*ToMany</literal>). Pour surcharger les colonnes de
- l'association vous pouvez utiliser
- <literal>@AssociationOverride</literal>.</para>
-
- <para>Si vous voulez avoir le même type d'objet embarquable deux fois
- dans la même entité, le nom de colonne par défaut ne fonctionnera pas :
- au moins une des colonnes devra être explicitée. Hibernate va au-delà
- de la spécification EJB3 et vous permet d'améliorer le mécanisme par
- défaut avec <classname>NamingStrategy</classname>.
- <classname>DefaultComponentSafeNamingStrategy</classname> est une petite
- amélioration par rapport à la stratégie par défaut
- <classname>EJB3NamingStrategy</classname> qui permet aux objets
- embarqués de fonctionner avec leur valeur par défaut même s'ils sont
- utilisés deux fois dans la même entité.</para>
- </sect3>
-
- <sect3>
- <title>Valeurs par défaut des propriétés non annotées</title>
-
- <para>Si une propriété n'est pas annotée, les règles suivantes
- s'appliquent :</para>
-
- <itemizedlist>
- <listitem>
- Si la propriété est de type simple, elle est mappée comme @Basic
- </listitem>
-
- <listitem>
- Sinon, si le type de la propriété est annoté comme @Embeddable,
- elle est mappée comme @Embedded
- </listitem>
-
- <listitem>
- Sinon, si le type de la propriété est Serializable, elle est mappée
- comme @Basic vers une colonne contenant l'objet sous sa forme
- sérialisée
- </listitem>
-
- <listitem>
- Sinon, si le type de la propriété est java.sql.Clob ou
- java.sql.Blob, elle est mappée comme @Lob avec le LobType
- approprié
- </listitem>
- </itemizedlist>
- </sect3>
- </sect2>
-
- <sect2 id="entity-mapping-identifier"
- xreflabel="Mapper des propriétés identifiantes">
- <title>Mapper des propriétés identifiantes</title>
-
- <para>L'annotation <literal>@Id</literal> vous permet de définir quelle
- propriété identifie votre entity bean. Cette propriété peut être
- positionnée par l'application elle-même ou générée par Hibernate
- (préféré). Vous pouvez définir la stratégie de génération de l'identifiant
- grâce à l'annotation <literal>@GeneratedValue</literal> :</para>
-
- <itemizedlist>
- <listitem>
- AUTO - soit la colonne identity, soit la séquence, soit la table
- selon la base de données sous-jacente
- </listitem>
-
- <listitem>
- TABLE - table contenant l'id
- </listitem>
-
- <listitem>
- IDENTITY - colonne identity
- </listitem>
-
- <listitem>
- SEQUENCE - séquence
- </listitem>
- </itemizedlist>
-
- <para>Hibernate fournit plus de générateurs d'identifiant que les simples
- générateurs EJB3. Vérifiez <xref linkend="entity-hibspec" /> pour plus
- d'informations.</para>
-
- <para>L'exemple suivant montre un générateur par séquence utilisant la
- configuration SEQ_STORE (voir plus bas) :</para>
-
- <programlisting>
- at Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
-public Integer getId() { ... }
- </programlisting>
-
- <para>L'exemple suivant utilise le générateur identity :</para>
-
- <programlisting>
- at Id @GeneratedValue(strategy=GenerationType.IDENTITY)
-public Long getId() { ... }
- </programlisting>
-
- <para>Le générateur <literal>AUTO</literal> est le type préféré pour les
- applications portables (vers différentes base de données). La
- configuration de la génération d'identifiant peut être partagée par
- différents mappings <literal>@Id</literal> avec l'attribut du générateur.
- Il y a différentes configurations disponibles avec
- <literal>@SequenceGenerator</literal> et
- <literal>@TableGenerator</literal>. La portée d'un générateur peut être
- l'application ou la classe. Les générateurs définis dans les classes ne
- sont pas visibles à l'extérieur de la classe et peuvent surcharger les
- générateurs de niveau applicatif. Les générateurs de niveau applicatif
- sont définis au niveau XML (voir
- <xref linkend="xml-overriding" />) :</para>
-
- <programlisting><table-generator name="EMP_GEN"
- table="GENERATOR_TABLE"
- pk-column-name="key"
- value-column-name="hi"
- pk-column-value="EMP"
- allocation-size="20"/>
-
-// et l'annotation équivalente
-
- at javax.persistence.TableGenerator(
- name="EMP_GEN",
- table="GENERATOR_TABLE",
- pkColumnName = "key",
- valueColumnName = "hi"
- pkColumnValue="EMP",
- allocationSize=20
-)
-
-<sequence-generator name="SEQ_GEN"
- sequence-name="my_sequence"
- allocation-size="20"/>
-
-// et l'annotation équivalente
-
- at javax.persistence.SequenceGenerator(
- name="SEQ_GEN",
- sequenceName="my_sequence",
- allocationSize=20
-)
- </programlisting>
-
- <para>Si JPA XML (comme <filename>META-INF/orm.xml</filename>) est utilisé
- pour définir les générateurs, <literal>EMP_GEN</literal> et
- <literal>SEQ_GEN</literal> sont des générateurs de niveau applicatif.
- <literal>EMP_GEN</literal> définit un générateur d'identifiant basé sur
- une table utilisant l'algorithme hilo avec un <literal>max_lo</literal> de
- 20. La valeur haute est conservée dans une <literal>table</literal>
- "<literal>GENERATOR_TABLE</literal>". L'information est gardée dans une
- ligne où la colonne <literal>pkColumnName</literal> ("clef") est égale à
- <literal>pkColumnValue</literal> "<literal>EMP</literal>" et une colonne
- <literal>valueColumnName</literal> "<literal>hi</literal>" contient la
- prochaine valeur haute utilisée.</para>
-
- <para><literal>SEQ_GEN</literal> définit un générateur par séquence
- utilisant une séquence nommée <literal>my_sequence</literal>. La taille
- d'allocation utilisée pour cet algorithme hilo basé sur une séquence est
- 20. Notez que cette version d'Hibernate Annotations ne gère pas
- <literal>initialValue</literal> dans le générateur par séquence.
- La taille par défaut de l'allocation est 50, donc si vous voulez utiliser
- une séquence et récupérer la valeur chaque fois, vous devez positionner
- la taille de l'allocation à 1.</para>
-
- <note>
- <para>La définition au niveau package n'est plus prise en charge par la
- spécification EJB 3.0. Vous pouvez cependant utiliser
- <literal>@GenericGenerator</literal> au niveau du package (voir <xref
- linkend="entity-hibspec-identifier" />).</para>
- </note>
-
- <para>Le prochain exemple montre la définition d'un générateur par
- séquence dans la portée d'une classe :</para>
-
- <programlisting>
- at Entity
- at javax.persistence.SequenceGenerator(
- name="SEQ_STORE",
- sequenceName="my_sequence"
-)
-public class Store implements Serializable {
- private Long id;
-
- @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
- public Long getId() { return id; }
-}
- </programlisting>
-
- <para>Cette classe utilisera une séquence nommée my_sequence et le
- générateur SEQ_STORE n'est pas visible dans les autres classes. Notez que
- vous pouvez regarder les tests unitaires d'Hibernate Annotations dans le
- package org.hibernate.test.metadata.id pour plus d'exemples.</para>
-
- <para>Vous pouvez définir une clef primaire composée à travers différentes
- syntaxes :</para>
-
- <itemizedlist>
- <listitem>
- annote la propriété du composant comme @Id et rend la classe du
- composant @Embeddable
- </listitem>
-
- <listitem>
- annote la propriété du composant comme @EmbeddedId
- </listitem>
-
- <listitem>
- annote la classe comme @IdClass et annote chaque propriété de
- l'entité impliquée dans la clef primaire avec @Id
- </listitem>
- </itemizedlist>
-
- <para>Bien qu'assez commun pour le développeur EJB2,
- <literal>@IdClass</literal> est probablement nouveau pour les utilisateurs
- d'Hibernate. La classe de la clef primaire composée correspond aux
- multiples champs ou propriétés de l'entité ; de plus, les noms des champs
- ou propriétés de la clef primaire et ceux de l'entité doivent
- correspondre ; et enfin, leur type doit être le même. Regardons un
- exemple :</para>
-
- <programlisting>@Entity
-<emphasis role="bold">@IdClass(FootballerPk.class)</emphasis>
-public class Footballer {
- // partie de la clef
- <emphasis role="bold">@Id</emphasis> public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- // partie de la clef
- <emphasis role="bold">@Id</emphasis> public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- public String getClub() {
- return club;
- }
-
- public void setClub(String club) {
- this.club = club;
- }
-
- // implémentation appropriée de equals() et hashCode()
-}
-
- at Embeddable
-public class FootballerPk implements Serializable {
- // même nom et même type que dans Footballer
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- // même nom et même type que dans Footballer
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- // implémentation appropriée de equals() et hashCode()
-}
-</programlisting>
-
- <para>Comme vous pouvez le voir, <literal>@IdClass</literal> pointe vers
- la classe de la clef primaire correspondante.</para>
-
- <para>Bien que ce ne soit pas pris en charge par la spécification EJB3,
- Hibernate vous permet de définir des associations à l'intérieur d'un
- identifiant composé. Pour cela, utilisez simplement les annotations
- habituelles.</para>
-
- <programlisting>@Entity
- at AssociationOverride( name="id.channel", joinColumns = @JoinColumn(name="chan_id") )
-public class TvMagazin {
- @EmbeddedId public TvMagazinPk id;
- @Temporal(TemporalType.TIME) Date time;
-}
-
- at Embeddable
-public class TvMagazinPk implements Serializable {
- @ManyToOne
- public Channel channel;
- public String name;
- @ManyToOne
- public Presenter presenter;
-}
-</programlisting>
- </sect2>
-
- <sect2>
- <title>Mapper l'héritage</title>
-
- <para>EJB3 prend en charge les trois types d'héritage :</para>
-
- <itemizedlist>
- <listitem>
- Stratégie d'une table par classe concrète : l'élément
- <union-class> dans Hibernate
- </listitem>
-
- <listitem>
- Stratégie d'une seule table par hiérarchie de classe : l'élément
- <subclass> dans Hibernate
- </listitem>
-
- <listitem>
- Stratégie d'une table par classe fille : l'élément
- <joined-subclass> dans Hibernate
- </listitem>
- </itemizedlist>
-
- <para>La stratégie choisie est déclarée au niveau de la classe de l'entité
- la plus haute dans la hiérarhie en utilisant l'annotation
- <literal>@Inheritance</literal>.</para>
-
- <note>
- <para>Annoter des interfaces n'est pour le moment pas pris en
- charge.</para>
- </note>
-
- <sect3>
- <title>Une table par classe concrète</title>
-
- <para>Cette stratégie a beaucoup d'inconvénients (surtout avec les
- requêtes polymorphiques et les associations) expliqués dans la
- spécification EJB3, la documentation de référence d'Hibernate, Hibernate
- in Action, et plusieurs autres endroits. Hibernate en contourne la
- plupart en implémentant cette stratégie en utilisant des requêtes
- <literal>SQL UNION</literal>. Elle est habituellement utilisée pour le
- niveau le plus haut d'une hiérarchie d'héritage :</para>
-
- <programlisting>
- at Entity
- at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public class Flight implements Serializable {
- </programlisting>
-
- <para>Cette stratégie prend en charge les associations de un vers
- plusieurs bidirectionnelles. Cette stratégie ne prend pas en charge
- la stratégie de générateur <literal>IDENTITY</literal> : l'identifiant
- doit être partagé par plusieurs tables. Par conséquent, lors de
- l'utilisation de cette stratégie, vous ne devriez pas utilisez
- <literal>AUTO</literal> ni <literal>IDENTITY</literal>.</para>
- </sect3>
-
- <sect3>
- <title>Une seule table par hiérarchie de classe</title>
-
- <para>Toutes les propriétés de toutes les classes parentes et classes
- filles sont mappées dans la même table, les instances sont différenciées
- par une colonne spéciale discriminante :</para>
-
- <programlisting>
- at Entity
- at Inheritance(strategy=InheritanceType.SINGLE_TABLE)
- at DiscriminatorColumn(
- name="planetype",
- discriminatorType=DiscriminatorType.STRING
-)
- at DiscriminatorValue("Plane")
-public class Plane { ... }
-
- at Entity
- at DiscriminatorValue("A320")
-public class A320 extends Plane { ... }
- </programlisting>
-
- <para><classname>Plane</classname> est la classe parente, elle définit
- la stratégie d'héritage <literal>InheritanceType.SINGLE_TABLE</literal>.
- Elle définit aussi la colonne discriminante avec l'annotation
- <literal>@DiscriminatorColumn</literal>, une colonne discriminante peut
- aussi définir le type du discriminant. Finalement, l'annotation
- <literal>@DiscriminatorValue</literal> définit la valeur utilisée pour
- différencier une classe dans la hiérarchie. Tous ces attributs ont des
- valeurs par défaut sensées. Le nom par défaut de la colonne
- discriminante est <literal>DTYPE</literal>. La valeur discriminante par
- défaut est le nom de l'entité (comme défini dans
- <literal>@Entity.name</literal>) avec le type
- <literal>DiscriminatorType.STRING</literal>. <classname>A320</classname>
- est une classe fille ; vous devez seulement définir la valeur
- discriminante si vous ne voulez pas utiliser la valeur par défaut. La
- stratégie et le type du discriminant sont implicites.</para>
-
- <para><literal>@Inheritance</literal> et
- <literal>@DiscriminatorColumn</literal> devraient seulement être
- définies sur l'entité la plus haute de la hiérarchie.</para>
- </sect3>
-
- <sect3>
- <title>Une table par classe fille</title>
-
- <para>Les annotations <literal> @PrimaryKeyJoinColumn</literal> et
- <literal>@PrimaryKeyJoinColumns</literal> définissent la (les) clef(s)
- primaire(s) de la table de la classe fille jointe :</para>
-
- <programlisting>
- at Entity
- at Inheritance(strategy=InheritanceType.JOINED)
-public class Boat implements Serializable { ... }
-
- at Entity
-public class Ferry extends Boat { ... }
-
- at Entity
- at PrimaryKeyJoinColumn(name="BOAT_ID")
-public class AmericaCupClass extends Boat { ... }
- </programlisting>
-
- <para>Toutes les entités ci-dessus utilisent la stratégie
- <literal>JOINED</literal>, la table <literal>Ferry</literal> est jointe
- avec la table <literal>Boat</literal> en utilisant les mêmes noms de
- clef primaire. La table <literal>AmericaCupClass</literal> est jointe
- avec <literal>Boat</literal> en utilisant la condition de jointure
- <code>Boat.id = AmericaCupClass.BOAT_ID</code>.</para>
- </sect3>
-
- <sect3>
- <title>Héritage de propriétés des classes parentes</title>
-
- <para>Il est parfois utile de partager des propriétés communes à travers
- une classe technique ou métier sans l'inclure comme une entité
- habituelle (c'est-à-dire aucune table spécifique pour cette entité).
- Pour cela, vous pouvez les mapper comme
- <literal>@MappedSuperclass</literal>.</para>
-
- <programlisting>@MappedSuperclass
-public class BaseEntity {
- @Basic
- @Temporal(TemporalType.TIMESTAMP)
- public Date getLastUpdate() { ... }
- public String getLastUpdater() { ... }
- ...
-}
-
- at Entity class Order extends BaseEntity {
- @Id public Integer getId() { ... }
- ...
-}</programlisting>
-
- <para>En base de données, cette hiérarchie sera représentée comme une
- table <literal>Order</literal> ayant les colonnes <literal>id</literal>,
- <literal>lastUpdate</literal> et <literal>lastUpdater</literal>.
- Les mappings de propriété de la classe parente embarquée sont copiés
- dans les classes filles de l'entité. Souvenez-vous que la classe parente
- embarquable n'est cependant pas la racine de la hiérarchie.</para>
-
- <note>
- <para>Les propriétés des classes parentes non mappées comme
- <literal>@MappedSuperclass</literal> sont ignorées.</para>
- </note>
-
- <note>
- <para>Le type d'accès (champ ou méthode) est hérité de l'entité
- racine, à moins que vous utilisiez l'annotation Hibernate
- <literal>@AccessType</literal>.</para>
- </note>
-
- <note>
- <para>La même notion peut être appliquée aux objets
- <literal>@Embeddable</literal> pour persister des propriétés de leurs
- classes parentes. Vous avez aussi besoin d'utiliser
- <literal>@MappedSuperclass</literal> pour faire ça (cependant cela ne
- devrait pas être considéré comme une fonctionnalité EJB3
- standard).</para>
- </note>
-
- <note>
- <para>Il est permis de marquer une classe comme
- <literal>@MappedSuperclass</literal> dans le milieu d'une hiérarchie
- d'héritage mappée.</para>
- </note>
-
- <note>
- <para>Toute classe de la hiérarchie non annotée avec
- <literal>@MappedSuperclass</literal> ou <literal>@Entity</literal>
- sera ignorée.</para>
- </note>
-
- <para>Vous pouvez surcharger des colonnes définies dans des entités
- parentes au niveau de l'entité racine en utilisant l'annotation
- <literal>@AttributeOverride</literal>.</para>
-
- <programlisting>@MappedSuperclass
-public class FlyingObject implements Serializable {
-
- public int getAltitude() {
- return altitude;
- }
-
- @Transient
- public int getMetricAltitude() {
- return metricAltitude;
- }
-
- @ManyToOne
- public PropulsionType getPropulsion() {
- return metricAltitude;
- }
- ...
-}
-
- at Entity
- at AttributeOverride( name="altitude", column = @Column(name="fld_altitude") )
- at AssociationOverride( name="propulsion", joinColumns = @JoinColumn(name="fld_propulsion_fk") )
-public class Plane extends FlyingObject {
- ...
-}</programlisting>
-
- <para>La propriété <literal>altitude</literal> sera persistée dans la
- colonne <literal>fld_altitude</literal> de la table
- <literal>Plane</literal> et l'association <literal>propulsion</literal>
- sera matérialisée dans la colonne de clef étrangère
- <literal>fld_propulsion_fk</literal>.</para>
-
- <para>Vous pouvez définir <literal>@AttributeOverride</literal>(s) et
- <literal>@AssociationOverride</literal>(s) sur des classes
- <literal>@Entity</literal>, des classes
- <literal>@MappedSuperclass</literal> et des propriétés pointant vers un
- objet <literal>@Embeddable</literal>.</para>
- </sect3>
- </sect2>
-
- <sect2 id="entity-mapping-association">
- <title>Mapper des associations/relations d'entity beans</title>
-
- <sect3>
- <title>One-to-one</title>
-
- <para>Vous pouvez associer des entity beans avec une relation one-to-one
- en utilisant <literal>@OneToOne</literal>. Il y a trois cas pour les
- associations one-to-one : soit les entités associées partagent les mêmes
- valeurs de clef primaire, soit une clef étrangère est détenue par une
- des entités (notez que cette colonne de clef étrangère dans la base de
- données devrait être avoir une contrainte d'unicité pour simuler la
- cardinalité one-to-one), soit une table d'association est utilisée pour
- stocker le lien entre les 2 entités (une contrainte d'unicité doit être
- définie sur chaque clef étrangère pour assurer la cardinalité un à
- un).</para>
-
- <para>Tout d'abord, nous mappons une véritable association one-to-one en
- utilisant des clefs primaires partagées :</para>
-
- <programlisting>
- at Entity
-public class Body {
- @Id
- public Long getId() { return id; }
-
- @OneToOne(cascade = CascadeType.ALL)
- @PrimaryKeyJoinColumn
- public Heart getHeart() {
- return heart;
- }
- ...
-}
- </programlisting>
-
- <programlisting>
- at Entity
-public class Heart {
- @Id
- public Long getId() { ...}
-}
- </programlisting>
-
- <para>L'association un à un est activée en utilisant l'annotation
- <literal>@PrimaryKeyJoinColumn</literal>.</para>
-
- <para>Dans l'exemple suivant, les entités associées sont liées à travers
- une clef étrangère :</para>
-
- <programlisting>
- at Entity
-public class Customer implements Serializable {
- @OneToOne(cascade = CascadeType.ALL)
- <emphasis role="bold">@JoinColumn(name="passport_fk")</emphasis>
- public Passport getPassport() {
- ...
- }
-
- at Entity
-public class Passport implements Serializable {
- @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
- public Customer getOwner() {
- ...
-}
- </programlisting>
-
- <para>Un <classname>Customer</classname> est lié à un
- <classname>Passport</classname>, avec une colonne de clef étrangère
- nommée <literal>passport_fk</literal> dans la table
- <literal>Customer</literal>. La colonne de jointure est déclarée avec
- l'annotation <literal>@JoinColumn</literal> qui ressemble à l'annotation
- <literal>@Column</literal>. Elle a un paramètre de plus nommé
- <literal>referencedColumnName</literal>. Ce paramètre déclare la colonne
- dans l'entité cible qui sera utilisée pour la jointure. Notez que lors
- de l'utilisation de <literal>referencedColumnName</literal> vers une
- colonne qui ne fait pas partie de la clef primaire, la classe associée
- doit être <classname>Serializable</classname>. Notez aussi que
- <literal>referencedColumnName</literal> doit être mappé sur une
- propriété ayant une seule colonne lorsqu'elle pointe vers une colonne
- qui ne fait pas partie de la clef primaire (d'autres cas pourraient ne
- pas fonctionnner).</para>
-
- <para>L'association peut être bidirectionnelle. Dans une relation
- bidirectionnelle, une des extrémités (et seulement une) doit être la
- propriétaire : la propriétaire est responsable de la mise à jour des
- colonnes de l'association. Pour déclarer une extrémité comme
- <emphasis>non</emphasis> responsable de la relation, l'attribut
- <literal>mappedBy</literal> est utilisé.
- <literal>mappedBy</literal> référence le nom de la propriété de
- l'association du côté du propriétaire. Dans notre cas, c'est
- <literal>passport</literal>. Comme vous pouvez le voir, vous ne devez
- (absolument) pas déclarer la colonne de jointure puisqu'elle a déjà été
- déclarée du côté du propriétaire.</para>
-
- <para>Si aucune <literal>@JoinColumn</literal> n'est déclarée du côté du
- propriétaire, les valeurs par défaut s'appliquent. Une(des) colonne(s)
- de jointure sera(ont) créée(s) dans la table propriétaire, et son(leur)
- nom sera la concaténation du nom de la relation du côté propriétaire,
- <keycap>_</keycap> (underscore), et le nom de la (des) colonne(s) de la
- clef primaire du propriétaire. Dans cet exemple
- <literal>passport_id</literal> parce que le nom de la propriété est
- <literal>passport</literal> et la colonne identifiante de
- <literal>Passport</literal> est <literal>id</literal>.</para>
-
- <para>La troisième possibilité (utilisant une table d'association) est
- très exotique.</para>
-
- <programlisting>
- at Entity
-public class Customer implements Serializable {
- @OneToOne(cascade = CascadeType.ALL)
- <emphasis role="bold">@JoinTable(name = "CustomerPassports"
- joinColumns = @JoinColumn(name="customer_fk"),
- inverseJoinColumns = @JoinColumns(name="passport_fk")</emphasis>
- )
- public Passport getPassport() {
- ...
- }
-
- at Entity
-public class Passport implements Serializable {
- @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
- public Customer getOwner() {
- ...
-}
- </programlisting>
-
- <para>Un <classname>Customer</classname> est lié à un
- <classname>Passport</classname> à travers une table d'association
- nommée <literal>CustomerPassports</literal> ; cette table d'association
- a une colonne de clef étrangère nommée <literal>passport_fk</literal>
- pointant vers la table <literal>Passport</literal> (matérialisée par
- l'attribut <literal>inverseJoinColumn</literal>), et une colonne de clef
- étrangère nommée <literal>customer_fk</literal> pointant vers la table
- <literal>Customer</literal> (matérialisée par l'attribut
- <literal>joinColumns</literal>).</para>
-
- <para>Vous devez déclarer le nom de la table de jointure et les colonnes
- de jointure explicitement dans un tel mapping.</para>
- </sect3>
-
- <sect3>
- <title>Many-to-one</title>
-
- <para>Les associations Many-to-one sont déclarées au niveau de la
- propriété avec l'annotation <literal>@ManyToOne</literal> :</para>
-
- <programlisting>
- at Entity()
-public class Flight implements Serializable {
- <emphasis role="bold">@ManyToOne</emphasis>( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
- @JoinColumn(name="COMP_ID")
- public Company getCompany() {
- return company;
- }
- ...
-}
- </programlisting>
-
- <para>L'attribut <literal>@JoinColumn</literal> est optionnel, la valeur
- par défaut est comme l'association un à un, la concaténation du nom
- de la relation du côté propriétaire, <keycap>_</keycap>
- (underscore), et le nom de la colonne de la clef primaire du côté
- propriétaire. Dans cet exemple, <literal>company_id</literal> parce que
- le nom de la propriété est <literal>company</literal> et la colonne
- identifiante de Company est <literal>id</literal>.</para>
-
- <para><literal>@ManyToOne</literal> a un paramètre nommé
- <literal>targetEntity</literal> qui décrit le nom de l'entité cible.
- Généralement, vous ne devriez pas avoir besoin de ce paramètre puisque
- la valeur par défaut (le type de la propriété qui stocke l'association)
- est correcte dans la plupart des cas. Il est cependant utile lorsque
- vous souhaitez retourner une interface plutôt qu'une entité
- normale.</para>
-
- <programlisting>
- at Entity()
-public class Flight implements Serializable {
- @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, <emphasis
- role="bold">targetEntity=CompanyImpl.class</emphasis> )
- @JoinColumn(name="COMP_ID")
- public Company getCompany() {
- return company;
- }
- ...
-}
-
-public interface Company {
- ...
- </programlisting>
-
- <para>Vous pouvez sinon mapper une association plusieurs à un avec une
- table d'association. Cette association décrite par l'annotation
- <literal>@JoinTable</literal> contiendra une clef étrangère référençant
- la table de l'entité (avec
- <literal>@JoinTable.joinColumns</literal>) et une clef étrangère
- référençant la table de l'entité cible (avec
- <literal>@JoinTable.inverseJoinColumns</literal>).</para>
-
- <programlisting>
- at Entity()
-public class Flight implements Serializable {
- @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
- <emphasis role="bold">@JoinTable(name="Flight_Company",
- joinColumns = @JoinColumn(name="FLIGHT_ID"),
- inverseJoinColumns = @JoinColumns(name="COMP_ID")
- )</emphasis>
- public Company getCompany() {
- return company;
- }
- ...
-}
- </programlisting>
- </sect3>
-
- <sect3 id="entity-mapping-association-collections">
- <title>Collections</title>
-
- <sect4 id="entity-mapping-association-collections-overview"
- revision="1">
- <title>Vue d'ensemble</title>
-
- <para>Vous pouvez mapper des <classname>Collection</classname>s, des
- <literal>List</literal>s (ie des listes ordonnées, pas des listes
- indexées), des <literal>Map</literal>s et des
- <classname>Set</classname>s. La spécification EJB3 décrit comment
- mapper une liste ordonnée (ie une liste ordonnée au chargement) en
- utilisant l'annotation <literal>@javax.persistence.OrderBy</literal> :
- pour ordonner la collection, cette annotation prend en paramètre une
- liste de propriétés (de l'entité cible) séparées par des virgules
- (p. ex. <code>firstname asc, age desc</code>) ; si la chaîne de
- caractères est vide, la collection sera ordonnée par les identifiants.
- Pour le moment <literal>@OrderBy</literal> fonctionne seulement sur
- des collections n'ayant pas de table d'association. Pour les
- véritables collections indexées, veuillez vous référer à
- <xref linkend="entity-hibspec" />. EJB3 vous permet de mapper des
- <literal>Map</literal>s en utilisant comme clef une des propriétés de
- l'entité cible avec <literal>@MapKey(name="myProperty")</literal>
- (myProperty est un nom de propriété de l'entité cible). Lorsque vous
- utilisez <literal>@MapKey</literal> sans nom de propriété, la clef
- primaire de l'entité cible est utilisée. La clef de la map utilise la
- même colonne que celle pointée par la propriété : il n'y a pas de
- colonne supplémentaire définie pour la clef de la map, et c'est normal
- puisque la clef de la map représente en fait un propriété de la cible.
- Faites attention qu'une fois chargée, la clef n'est plus synchronisée
- avec la propriété, en d'autres mots, si vous modifiez la valeur de la
- propriété, la clef ne sera pas changée automatiquement dans votre
- modèle Java (pour une véritable prise en charge des maps veuillez vous
- référer à <xref linkend="entity-hibspec" />). Beaucoup de gens
- confondent les capacités de <literal><map></literal> et celles
- de <literal>@MapKey</literal>. Ce sont deux fonctionnalités
- différentes. <literal>@MapKey</literal> a encore quelques limitations,
- veuillez vous référer au forum ou au système de suivi de bogues JIRA
- pour plus d'informations.</para>
-
- <para>Hibernate a plusieurs notions de collections.</para>
-
- <para></para>
-
- <table>
- <title>Sémantique des collections</title>
-
- <tgroup cols="3">
- <colspec colname="c1" />
-
- <colspec colname="c2" />
-
- <colspec colname="c3" colnum="2" />
-
- <thead>
- <row>
- <entry>Sémantique</entry>
-
- <entry>Représentation Java</entry>
-
- <entry>Annotations</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>Sémantique de Bag</entry>
-
- <entry>java.util.List, java.util.Collection</entry>
-
- <entry>@org.hibernate.annotations.CollectionOfElements ou
- @OneToMany ou @ManyToMany</entry>
- </row>
-
- <row>
- <entry>Sémantique de Bag avec une clef primaire (sans les
- limitations de la sémantique de Bag)</entry>
-
- <entry>java.util.List, java.util.Collection</entry>
-
- <entry>(@org.hibernate.annotations.CollectionOfElements ou
- @OneToMany ou @ManyToMany) et @CollectionId</entry>
- </row>
-
- <row>
- <entry>Sémantique de List</entry>
-
- <entry>java.util.List</entry>
-
- <entry>(@org.hibernate.annotations.CollectionOfElements ou
- @OneToMany ou @ManyToMany) et
- @org.hibernate.annotations.IndexColumn</entry>
- </row>
-
- <row>
- <entry>Sémantique de Set</entry>
-
- <entry>java.util.Set</entry>
-
- <entry>@org.hibernate.annotations.CollectionOfElements ou
- @OneToMany ou @ManyToMany</entry>
- </row>
-
- <row>
- <entry>Sémantique de Map</entry>
-
- <entry>java.util.Map</entry>
-
- <entry>(@org.hibernate.annotations.CollectionOfElements ou
- @OneToMany ou @ManyToMany) et (rien ou
- @org.hibernate.annotations.MapKey/MapKeyManyToMany pour une
- véritable prise en charge des maps, ou
- @javax.persistence.MapKey</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <remark>Donc spécifiquement, les collections java.util.List sans
- @org.hibernate.annotations.IndexColumn vont être considérées commes
- des bags.</remark>
-
- <para>Les collections de types primitifs, de types core ou d'objets
- embarqués ne sont pas prises en charge par la spécification EJB3.
- Cependant Hibernate Annotations les autorise
- (voir <xref linkend="entity-hibspec" />).</para>
-
- <programlisting>@Entity public class City {
- @OneToMany(mappedBy="city")
- <emphasis role="bold">@OrderBy("streetName")</emphasis>
- public List<Street> getStreets() {
- return streets;
- }
-...
-}
-
- at Entity public class Street {
- <emphasis role="bold">public String getStreetName()</emphasis> {
- return streetName;
- }
-
- @ManyToOne
- public City getCity() {
- return city;
- }
- ...
-}
-
-
- at Entity
-public class Software {
- @OneToMany(mappedBy="software")
- <emphasis role="bold">@MapKey(name="codeName")</emphasis>
- public Map<String, Version> getVersions() {
- return versions;
- }
-...
-}
-
- at Entity
- at Table(name="tbl_version")
-public class Version {
- <emphasis role="bold">public String getCodeName()</emphasis> {...}
-
- @ManyToOne
- public Software getSoftware() { ... }
-...
-}</programlisting>
-
- <para>Donc <literal>City</literal> a une collection de
- <literal>Street</literal>s qui sont ordonnées par
- <literal>streetName</literal> (de <literal>Street</literal>) lorsque
- la collection est chargée. <literal>Software</literal> a une map de
- <literal>Version</literal>s dont la clef est
- <literal>codeName</literal> de <literal>Version</literal>.</para>
-
- <para>A moins que la collection soit une "generic", vous devrez
- définir <literal>targetEntity</literal>. C'est un attribut de
- l'annotation qui prend comme valeur la classe de l'entité
- cible.</para>
- </sect4>
-
- <sect4 id="entity-mapping-association-collection-onetomany"
- revision="2">
- <title>One-to-many</title>
-
- <para>Les associations one-to-many sont déclarées au niveau propriété
- avec l'annotation <literal>@OneToMany</literal>. Les associations un
- à plusieurs peuvent être bidirectionnelles.</para>
-
- <sect5>
- <title>Relation bidirectionnelle</title>
-
- <para>Puisque les associations plusieurs à un sont (presque)
- toujours l'extrémité propriétaire de la relation bidirectionnelle
- dans la spécification EJB3, l'association un à plusieurs est
- annotée par <literal>@OneToMany(mappedBy=...)</literal>.</para>
-
- <programlisting>@Entity
-public class Troop {
- @OneToMany(mappedBy="troop")
- public Set<Soldier> getSoldiers() {
- ...
-}
-
- at Entity
-public class Soldier {
- @ManyToOne
- @JoinColumn(name="troop_fk")
- public Troop getTroop() {
- ...
-} </programlisting>
-
- <para><classname>Troop</classname> a une relation bidirectionnelle
- un à plusieurs avec <literal>Soldier</literal> à travers la
- propriété <literal>troop</literal>. Vous ne devez pas définir
- de mapping physique à l'extrémité de
- <literal>mappedBy</literal>.</para>
-
- <para>Pour mapper une relation bidirectionnelle un à plusieurs, avec
- l'extrémité one-to-many comme extrémité propriétaire, vous devez
- enlever l'élément <literal>mappedBy</literal> et marquer
- l'annotation <literal>@JoinColumn</literal> de l'extrémité plusieurs
- à un comme ne pouvant pas être insérée et ni mise à jour. Cette
- solution n'est certainement pas optimisée et produira quelques
- commandes UPDATE supplémentaires.</para>
-
- <programlisting>@Entity
-public class Troop {
- @OneToMany
- @JoinColumn(name="troop_fk") // nous avons besoin de dupliquer l'information physique
- public Set<Soldier> getSoldiers() {
- ...
-}
-
- at Entity
-public class Soldier {
- @ManyToOne
- @JoinColumn(name="troop_fk", insertable=false, updatable=false)
- public Troop getTroop() {
- ...
-}</programlisting>
- </sect5>
-
- <sect5>
- <title>Relation unidirectionnelle</title>
-
- <para>Une relation un à plusieurs unidirectionnelle utilisant une
- colonne de clef étrangère de l'entité propriétaire n'est pas si
- commune, réellement recommandée. Nous vous conseillons
- fortement d'utiliser une table de jointure pour cette sorte
- d'association (comme expliqué dans la prochaine section). Cette
- sorte d'association est décrite à travers
- <literal>@JoinColumn</literal>.</para>
-
- <programlisting>
- at Entity
-public class Customer implements Serializable {
- @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
- @JoinColumn(name="CUST_ID")
- public Set<Ticket> getTickets() {
- ...
-}
-
- at Entity
-public class Ticket implements Serializable {
- ... // pas de relation bidirectionnelle
-}
- </programlisting>
-
- <para><literal>Customer</literal> décrit une relation
- unidirectionnelle avec <literal>Ticket</literal> en utilisant la
- colonne de jointure <literal>CUST_ID</literal>.</para>
- </sect5>
-
- <sect5>
- <title>Relation unidirectionnel avec une table de jointure</title>
-
- <para>Une relation unidirectionnelle un à plusieurs avec une table
- de jointure est largement préférée. Cette association est décrite
- à travers l'annotation <literal>@JoinTable</literal>.</para>
-
- <programlisting>
- at Entity
-public class Trainer {
- @OneToMany
- @JoinTable(
- name="TrainedMonkeys",
- joinColumns = { @JoinColumn( name="trainer_id") },
- inverseJoinColumns = @JoinColumn( name="monkey_id")
- )
- public Set<Monkey> getTrainedMonkeys() {
- ...
-}
-
- at Entity
-public class Monkey {
- ... // pas de relation bidirectionnelle
-}
- </programlisting>
-
- <para><literal>Trainer</literal> décrit une relation
- unidirectionelle avec <classname>Monkey</classname> en utilisant la
- table de jointure <classname>TrainedMonkeys</classname>, avec une
- clef étrangère <literal>trainer_id</literal> vers
- <literal>Trainer</literal> (<literal>joinColumns</literal>) et une
- clef étrangère <literal>monkey_id</literal> vers
- <literal>Monkey</literal>
- (<literal>inversejoinColumns</literal>).</para>
- </sect5>
-
- <sect5 id="entity-mapping-association-collection-manytomany-default"
- revision="1">
- <title>Valeurs par défaut</title>
-
- <para>Si aucun mapping physique n'est déclaré, une relation
- unidirectionnelle un vers plusieurs utilise une table de jointure.
- Le nom de la table est la concaténation du nom de la table
- propriétaire, <keycap>_</keycap>, et le nom de la table de l'autre
- extrémité. Le nom des colonnes de la clef étrangère référençant la
- table propriétaire est la concaténation de la table propriétaire,
- <keycap>_</keycap>, et le nom des colonnes de la clef primaire. Le
- nom des colonnes de la clef étrangère référençant l'autre extrémité
- est la concaténation du nom de la propriété du propriétaire,
- <keycap>_</keycap>, et le nom des colonnes de la clef primaire de
- l'autre extrémité. Une contrainte d'unicité est ajoutée sur la
- clef étrangère référençant la table de l'autre extrémité pour
- réfléter le un à plusieurs.</para>
-
- <programlisting>
- at Entity
-public class Trainer {
- @OneToMany
- public Set<Tiger> getTrainedTigers() {
- ...
-}
-
- at Entity
-public class Tiger {
- ... // non bidirectionnelle
-}
- </programlisting>
-
- <para><classname>Trainer</classname> décrit une relation
- unidirectionnelle avec <classname>Tiger</classname> utilisant la
- table de jointure <literal>Trainer_Tiger</literal>, avec une clef
- étrangère <literal>trainer_id</literal> vers
- <literal>Trainer</literal> (nom de la table, <keycap>_</keycap>,
- identifiant de trainer) et une clef étrangère
- <literal>trainedTigers_id</literal> vers <literal>Monkey</literal>
- (nom de la propriété, <keycap>_</keycap>, colonne de la clef
- primaire de Tiger).</para>
- </sect5>
- </sect4>
-
- <sect4 id="eentity-mapping-association-collection-manytomany"
- revision="">
- <title>Many-to-many</title>
-
- <sect5>
- <title>Définition</title>
-
- <para>Une association many-to-many est définie logiquement en
- utilisant l'annotation <literal>@ManyToMany</literal>. Vous devez
- aussi décrire la table d'association et les conditions de jointure
- en utilisant l'annotation <literal>@JoinTable</literal>. Si
- l'association est bidirectionnelle, une extrémité doit être la
- propriétaire et l'autre doit être marquée comme "inverse" (ie
- qu'elle sera ignorée lors de la mise à jour des valeurs de la
- relation dans la table d'association) :</para>
-
- <programlisting>
- at Entity
-public class Employer implements Serializable {
- @ManyToMany(
- targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,
- cascade={CascadeType.PERSIST, CascadeType.MERGE}
- )
- @JoinTable(
- name="EMPLOYER_EMPLOYEE",
- joinColumns={@JoinColumn(name="EMPER_ID")},
- inverseJoinColumns={@JoinColumn(name="EMPEE_ID")}
- )
- public Collection getEmployees() {
- return employees;
- }
- ...
-}
- </programlisting>
-
- <programlisting>
- at Entity
-public class Employee implements Serializable {
- @ManyToMany(
- cascade={CascadeType.PERSIST, CascadeType.MERGE},
- mappedBy="employees"
- targetEntity=Employer.class
- )
- public Collection getEmployers() {
- return employers;
- }
-}
- </programlisting>
-
- <para>Nous avons déjà montré les déclarations des relations
- "many" et détaillé les attributs de ces associations. Allons
- plus en profondeur dans la description de
- <literal>@JoinTable</literal> ; elle définit un
- <literal>name</literal>, un tableau de colonnes de jointure (un
- tableau dans une annotation est défini par {A, B, C}), et un tableau
- de colonnes de jointure inverse. Ces dernières sont les colonnes
- de la table d'association qui référencent la clef primaire de
- <classname>Employee</classname> ("l'autre extrémité").</para>
-
- <para>Comme vu précédemment, l'autre extrémité ne doit pas décrire
- le mapping physique : un simple argument
- <literal>mappedBy</literal> contenant le nom de la propriété de
- l'extrémité propriétaire suffit à relier les deux.</para>
- </sect5>
-
- <sect5>
- <title>Valeurs par défaut</title>
-
- <para>Comme d'autres annotations, la plupart des valeurs d'une
- relation plusieurs à plusieurs sont inférées. Si aucun mapping
- physique n'est décrit dans une relation plusieurs à plusieurs
- unidirectionnelle, alors les règles suivantes s'appliquent. Le nom
- de la table est la concaténation du nom de la table propriétaire,
- <keycap>_</keycap> et le nom de la table de l'autre extrémité. Le
- nom des colonnes de la clef étrangère référençant la table
- propriétaire est la concaténation du nom de la table propriétaire,
- <keycap>_</keycap> et le nom des colonnes de la clef primaire
- de cette table. Le nom des colonnes de la clef étrangère référençant
- l'autre extrémité est la concaténation du nom de la propriété du
- propriétaire, <keycap>_</keycap> et le nom des colonnes de la
- clef primaire de l'autre extrémité. Ce sont les mêmes règles que
- celles utilisées pour une relation un à plusieurs
- unidirectionnelle.</para>
-
- <programlisting>
- at Entity
-public class Store {
- @ManyToMany(cascade = CascadeType.PERSIST)
- public Set<City> getImplantedIn() {
- ...
- }
-}
-
- at Entity
-public class City {
- ... // pas de relation bidirectionnelle
-}
- </programlisting>
-
- <para>La table <literal>Store_City</literal> est utilisée comme
- table de jointure. La colonne <literal>Store_id</literal> est
- une clef étrangère vers la table <literal>Store</literal>. La
- colonne <literal>implantedIn_id</literal> est une clef étrangère
- vers la table <literal>City</literal>.</para>
-
- <para>Si aucun mapping physique n'est décrit dans une relation
- plusieurs à plusieurs bidirectionnelle, alors les règles suivantes
- s'appliquent. Le nom de la table est la concaténation du nom de la
- table propriétaire, <keycap>_</keycap> et le nom de la table de
- l'autre extrémité. Le nom des colonnes de la clef étrangère
- référençant la table propriétaire est la concaténation du nom de la
- propriété de l'autre extrémité, <keycap>_</keycap> et le nom des
- colonnes de la clef primaire du propriétaire. Le nom des colonnes de
- la clef étrangère référençant l'autre extrémité est la concaténation
- du nom de la propriété du propriétaire, <keycap>_</keycap> et le nom
- des colonnes de la clef primaire de l'autre extrémité. Ce sont les
- mêmes règles que celles utilisées pour une relation un à plusieurs
- unidirectionnelle.</para>
-
- <programlisting>
- at Entity
-public class Store {
- @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
- public Set<Customer> getCustomers() {
- ...
- }
-}
-
- at Entity
-public class Customer {
- @ManyToMany(mappedBy="customers")
- public Set<Store> getStores() {
- ...
- }
-}
- </programlisting>
-
- <para>La table <literal>Store_Customer</literal> est utilisée comme
- table de jointure. La colonne <literal>stores_id</literal> est une
- clef étrangère vers la table <literal>Store</literal>. La colonne
- <literal>customers_id</literal> est une clef étrangère vers la table
- <literal>Customer</literal>.</para>
- </sect5>
- </sect4>
- </sect3>
-
- <sect3>
- <title>Persistance transitive avec les opérations en cascade</title>
-
- <para>Vous avez probablement remarqué l'attribut
- <literal>cascade</literal> prenant comme valeur un tableau de
- <classname>CascadeType</classname>s. Le concept de cascade dans EJB3 est
- similaire à la persistance transitive et les opérations en cascade dans
- Hibernate, mais avec une sémantique légèrement différente et les types
- de cascade suivants :</para>
-
- <itemizedlist>
- <listitem>
- CascadeType.PERSIST : effectue en cascade l'opération de
- persistance (création) sur les entités associées si persist() est
- appelée ou si l'entité est supervisée (par le gestionnaire
- d'entités)
- </listitem>
-
- <listitem>
- CascadeType.MERGE : effectue en cascade l'opération de fusion sur
- les entités associées si merge() est appélée ou si l'entité est
- supervisée
- </listitem>
-
- <listitem>
- CascadeType.REMOVE : effectue en cascade l'opération de
- suppression sur les entités associées si delete() est appelée
- </listitem>
-
- <listitem>
- CascadeType.REFRESH : effectue en cascade l'opération de
- rafraîchissement sur les entités associées si refresh() est appelée
- </listitem>
-
- <listitem>
- CascadeType.ALL : tous ceux du dessus
- </listitem>
- </itemizedlist>
-
- <para>Veullez vous référer au chapitre 6.3 de la spécification EJB3 pour
- plus d'informations sur les opérations en cascade et la sémantique des
- opérations de création/fusion.</para>
- </sect3>
-
- <sect3>
- <title>Récupération d'associations</title>
-
- <para>Vous avez la possibilité de récupérer les entités associées soit
- immédiatement ("eager"), soit à la demande ("lazy"). Le paramètre
- <literal>fetch</literal> peut être positionné à
- <literal>FetchType.LAZY</literal> ou à
- <literal>FetchType.EAGER</literal>. <literal>EAGER</literal> essaiera
- d'utiliser une jointure externe pour rappatrier l'objet associé,
- alors que <literal>LAZY</literal> est la valeur par défaut et rapportera
- les données lorsque l'objet associé sera accédé pour la première fois.
- JPA-QL a aussi un mot clef <literal>fetch</literal> qui vous permet de
- surcharger le type de récupération pour une requête particulière. C'est
- très utile pour améliorer les performances et décider au cas par
- cas.</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Mapper des clefs primaires et étrangères composées</title>
-
- <para>Les clefs primaires composées utilisent une classe embarquée comme
- représentation de la clef primaire, donc vous devriez utiliser les
- annotations <literal>@Id</literal> et <literal>@Embeddable</literal>.
- Alternativement, vous pouvez utiliser l'annotation
- <literal>@EmbeddedId</literal>. Notez que la classe dépendante doit être
- sérialisable et implementer
- <methodname>equals()</methodname>/<methodname>hashCode()</methodname>.
- Vous pouvez aussi utiliser <literal>@IdClass</literal> comme décrit dans
- <xref linkend="entity-mapping-identifier" />.</para>
-
- <programlisting>
- at Entity
-public class RegionalArticle implements Serializable {
-
- @Id
- public RegionalArticlePk getPk() { ... }
-}
-
- at Embeddable
-public class RegionalArticlePk implements Serializable { ... }
- </programlisting>
-
- <para>ou alternativement</para>
-
- <programlisting>
- at Entity
-public class RegionalArticle implements Serializable {
-
- @EmbeddedId
- public RegionalArticlePk getPk() { ... }
-}
-
-public class RegionalArticlePk implements Serializable { ... }
- </programlisting>
-
- <para><literal>@Embeddable</literal> hérite le type d'accès de son entité
- d'appartenance à moins que l'annotation spécifique Hibernate
- <literal>@AccessType</literal> soit utilisée. Les clefs étrangères
- composées (si les valeurs par défaut ne sont pas utilisées) sont définies
- sur les associations en utilisant l'élément
- <literal>@JoinColumns</literal>, lequel est simplement un tableau de
- <literal>@JoinColumn</literal>s. Il est considéré comme une bonne pratique
- d'exprimer <literal>referencedColumnNames</literal> explicitement. Sinon,
- Hibernate supposera que vous utilisez le même ordre de colonnes que dans
- la déclaration de la clef primaire.</para>
-
- <programlisting>
- at Entity
-public class Parent implements Serializable {
- @Id
- public ParentPk id;
- public int age;
-
- @OneToMany(cascade=CascadeType.ALL)
- @JoinColumns ({
- @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
- @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
- @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
- })
- public Set<Child> children; //unidirectionnelle
- ...
-}
- </programlisting>
-
- <programlisting>
- at Entity
-public class Child implements Serializable {
- @Id @GeneratedValue
- public Integer id;
-
- @ManyToOne
- @JoinColumns ({
- @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
- @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
- @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
- })
- public Parent parent; // unidirectionnelle
-}
- </programlisting>
-
- <programlisting>
- at Embeddable
-public class ParentPk implements Serializable {
- String firstName;
- String lastName;
- ...
-}
- </programlisting>
-
- <para>Notez l'usage explicite de
- <literal>referencedColumnName</literal>.</para>
- </sect2>
-
- <sect2>
- <title>Mapper des tables secondaires</title>
-
- <para>Vous pouvez mapper un simple entity bean vers plusieurs tables en
- utilisant les annotations de niveau classe
- <literal>@SecondaryTable</literal> ou
- <literal>@SecondaryTables</literal>. Pour dire qu'une colonne est dans
- une table particulière, utlisez le paramètre <literal>table</literal> de
- <literal>@Column</literal> ou <literal>@JoinColumn</literal>.</para>
-
- <programlisting>
- at Entity
- at Table(name="MainCat")
-<emphasis role="bold">@SecondaryTables({
- @SecondaryTable(name="Cat1", pkJoinColumns={
- @PrimaryKeyJoinColumn(name="cat_id", referencedColumnName="id")
- ),
- @SecondaryTable(name="Cat2", uniqueConstraints={@UniqueConstraint(columnNames={"storyPart2"})})
-})</emphasis>
-public class Cat implements Serializable {
-
- private Integer id;
- private String name;
- private String storyPart1;
- private String storyPart2;
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- <emphasis role="bold">@Column(table="Cat1")</emphasis>
- public String getStoryPart1() {
- return storyPart1;
- }
-
- <emphasis role="bold">@Column(table="Cat2")</emphasis>
- public String getStoryPart2() {
- return storyPart2;
- }
-</programlisting>
-
- <para>Dans cet exemple, <literal>name</literal> sera dans
- <literal>MainCat</literal>. <literal>storyPart1</literal> sera dans
- <literal>Cat1</literal> et <literal>storyPart2</literal> sera dans
- <literal>Cat2</literal>. <literal>Cat1</literal> sera joint à
- <literal>MainCat</literal> avec <literal>cat_id</literal> comme clef
- étrangère, et <literal>Cat2</literal> avec <literal>id</literal> (ie
- le même nom de colonne que la colonne identifiante de
- <literal>MainCat</literal>). De plus, une contrainte d'unicité sur
- <literal>storyPart2</literal> a été renseignée.</para>
-
- <para>Regardez le tutoriel EJB3 de JBoss ou la suite de tests
- unitaires d'Hibernate Annotations pour plus d'exemples.</para>
- </sect2>
- </sect1>
-
- <sect1 id="entity-mapping-query">
- <title>Mapper des requêtes</title>
-
- <sect2 id="entity-mapping-query-hql"
- revision="1">
- <title>Mapper des requêtes JPAQL/HQL</title>
-
- <para>Vous pouvez mapper des requêtes JPA-QL/HQL en utilisant les
- annotations. <literal>@NamedQuery</literal> et
- <literal>@NamedQueries</literal> peuvent être définies au niveau de la
- classe ou dans un fichier JPA XML. Cependant, leurs définitions sont
- globales au scope de la session factory/entity manager factory. Une
- requête nommée est définie par son nom et la chaîne de caractères de la
- requête réelle.</para>
-
- <programlisting><entity-mappings>
- <named-query name="plane.getAll">
- <query>select p from Plane p</query>
- </named-query>
- ...
-</entity-mappings>
-...
-
- at Entity
- at NamedQuery(name="night.moreRecentThan", query="select n from Night n where n.date >= :date")
-public class Night {
- ...
-}
-
-public class MyDao {
- doStuff() {
- Query q = s.getNamedQuery("night.moreRecentThan");
- q.setDate( "date", aMonthAgo );
- List results = q.list();
- ...
- }
- ...
-}
- </programlisting>
-
- <para>Vous pouvez aussi fournir des indications de fonctionnement à une
- requête à travers un tableau de <literal>QueryHint</literal>s avec
- l'attribut <literal>hints</literal>.</para>
-
- <para>Les indications de fonctionnement Hibernate disponibles
- sont :</para>
-
- <para></para>
-
- <table>
- <title>Indications de fonctionnement d'une requête</title>
-
- <tgroup cols="2">
- <thead>
- <colspec colname="c1" />
-
- <colspec colname="c2" colnum="2" />
-
- <row>
- <entry>Indication</entry>
-
- <entry colname="c2">description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>org.hibernate.cacheable</entry>
-
- <entry>Indique si la requête devrait interagir avec le cache de
- second niveau (par défaut à false)</entry>
- </row>
-
- <row>
- <entry>org.hibernate.cacheRegion</entry>
-
- <entry>Nom de la région du cache (si indéfinie, la valeur par
- défaut est utilisée)</entry>
- </row>
-
- <row>
- <entry>org.hibernate.timeout</entry>
-
- <entry>Timeout des requêtes</entry>
- </row>
-
- <row>
- <entry>org.hibernate.fetchSize</entry>
-
- <entry>Taille des result sets par fetch</entry>
- </row>
-
- <row>
- <entry>org.hibernate.flushMode</entry>
-
- <entry>Mode de flush utilisé pour cette requête</entry>
- </row>
-
- <row>
- <entry>org.hibernate.cacheMode</entry>
-
- <entry>Mode de cache utilisé pour cette requête</entry>
- </row>
-
- <row>
- <entry>org.hibernate.readOnly</entry>
-
- <entry>Indique si les entités chargées par cette requête devraient
- être en lecture seule ou pas (par défaut à false)</entry>
- </row>
-
- <row>
- <entry>org.hibernate.comment</entry>
-
- <entry>Commentaire de la requête, ajouté au SQL généré</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect2>
-
- <sect2 id="entity-mapping-query-native" revision="2">
- <title>Mapper des requêtes natives</title>
-
- <para>Vous pouvez aussi mapper une requête native (ie une requête SQL).
- Pour ce faire, vous devez décrire la structure de l'ensemble de résultat
- SQL en utilisant <literal>@SqlResultSetMapping</literal> (ou
- <literal>@SqlResultSetMappings</literal> si vous prévoyez de définir
- plusieurs mappings de résultats). Comme <literal>@NamedQuery</literal>, un
- <literal>@SqlResultSetMapping</literal> peut être défini au niveau de la
- classe ou dans un fichier XML JPA. Cependant sa portée est globale à
- l'application.</para>
-
- <para>Comme vous le verrez, un paramètre de
- <literal>resultSetMapping</literal> est défini dans
- <literal>@NamedNativeQuery</literal>, il représente le nom du
- <literal>@SqlResultSetMapping</literal> défini. Le mapping de l'ensemble
- des résultats déclare les entités récupérées par cette requête native.
- Chaque champ de l'entité est lié à un alias SQL (nom de colonne). Tous les
- champs de l'entité (dont ceux des classes filles) et les colonnes des
- clefs étrangères relatives aux entités doivent être présents dans la
- requête SQL. Les définitions des champs sont optionnelles, si elles ne
- sont pas fournies, elles mappent le même nom de colonne que celui déclaré
- sur la propriété de la classe.</para>
-
- <para><programlisting>@NamedNativeQuery(name="night&area", query="select night.id nid, night.night_duration, "
- + " night.night_date, area.id aid, night.area_id, area.name "
- + "from Night night, Area area where night.area_id = area.id", <emphasis
- role="bold">resultSetMapping="joinMapping"</emphasis>)
- at SqlResultSetMapping(name="joinMapping", entities={
- @EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class, fields = {
- @FieldResult(name="id", column="nid"),
- @FieldResult(name="duration", column="night_duration"),
- @FieldResult(name="date", column="night_date"),
- @FieldResult(name="area", column="area_id"),
- discriminatorColumn="disc"
- }),
- @EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class, fields = {
- @FieldResult(name="id", column="aid"),
- @FieldResult(name="name", column="name")
- })
- }
-)</programlisting></para>
-
- <para>Dans l'exemple ci-dessus, la requête nommée
- <literal>night&area</literal> utilise le mapping de résultats
- <literal>joinMapping</literal>. Ce mapping retourne 2 entités,
- <literal>Night</literal> et <literal>Area</literal>, chaque propriété est
- déclarée et associée à un nom de colonne, en fait le nom de colonne
- récupéré par la requête. Voyons maintenant une déclaration implicite de
- mapping propriété/colonne.</para>
-
- <programlisting>@Entity
-<emphasis role="bold">@SqlResultSetMapping(name="implicit", entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class))
- at NamedNativeQuery(name="implicitSample", query="select * from SpaceShip", resultSetMapping="implicit")</emphasis>
-public class SpaceShip {
- private String name;
- private String model;
- private double speed;
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Column(name="model_txt")
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- public double getSpeed() {
- return speed;
- }
-
- public void setSpeed(double speed) {
- this.speed = speed;
- }
-}</programlisting>
-
- <para>Dans cet exemple, nous décrivons seulement le membre de l'entité du
- mapping de résultats. Le mapping de propriété/colonne est fait en
- utilisant les valeurs de mapping de l'entité. Dans ce cas, la propriété
- <literal>model</literal> est liée à la colonne
- <literal>model_txt</literal>. Si l'association à une entité concernée
- implique une clef primaire composée, un élément
- <literal>@FieldResult</literal> devrait être utilisé pour chaque colonne
- de la clef étrangère. Le nom de <literal>@FieldResult</literal> est
- composé du nom de la propriété pour la relation, suivi par un point ("."),
- suivi par le nom ou le champ ou la propriété de la clef primaire.</para>
-
- <programlisting>@Entity
- at SqlResultSetMapping(name="compositekey",
- entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class,
- fields = {
- @FieldResult(name="name", column = "name"),
- @FieldResult(name="model", column = "model"),
- @FieldResult(name="speed", column = "speed"),
-<emphasis role="bold"> @FieldResult(name="captain.firstname", column = "firstn"),
- @FieldResult(name="captain.lastname", column = "lastn"),</emphasis>
- @FieldResult(name="dimensions.length", column = "length"),
- @FieldResult(name="dimensions.width", column = "width")
- }),
- columns = { @ColumnResult(name = "surface"),
- @ColumnResult(name = "volume") } )
-
- at NamedNativeQuery(name="compositekey",
- query="select name, model, speed, lname as lastn, fname as firstn, length, width, length * width as surface from SpaceShip",
- resultSetMapping="compositekey")
-} )
-public class SpaceShip {
- private String name;
- private String model;
- private double speed;
- private Captain captain;
- private Dimensions dimensions;
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne(fetch= FetchType.LAZY)
- @JoinColumns( {
- @JoinColumn(name="fname", referencedColumnName = "firstname"),
- @JoinColumn(name="lname", referencedColumnName = "lastname")
- } )
- public Captain getCaptain() {
- return captain;
- }
-
- public void setCaptain(Captain captain) {
- this.captain = captain;
- }
-
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- public double getSpeed() {
- return speed;
- }
-
- public void setSpeed(double speed) {
- this.speed = speed;
- }
-
- public Dimensions getDimensions() {
- return dimensions;
- }
-
- public void setDimensions(Dimensions dimensions) {
- this.dimensions = dimensions;
- }
-}
-
- at Entity
- at IdClass(Identity.class)
-public class Captain implements Serializable {
- private String firstname;
- private String lastname;
-
- @Id
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- @Id
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-}
-</programlisting>
-
- <note>
- <para>Si vous regardez la propriété dimension, vous verrez qu'Hibernate
- prend en charge la notation avec les points pour les objets embarqués
- (vous pouvez même avoir des objets embarqués imbriqués). Les
- implémentations EJB3 n'ont pas à prendre en charge cette fonctionnalité,
- mais nous le faisons :-)</para>
- </note>
-
- <para>Si vous récupérez une simple entité et si vous utilisez le mapping
- par défaut, vous pouvez utiliser l'attribut <literal>resultClass</literal>
- à la place de <literal>resultSetMapping</literal> :</para>
-
- <programlisting><emphasis role="bold">@NamedNativeQuery(name="implicitSample", query="select * from SpaceShip",
- resultClass=SpaceShip.class)</emphasis>
-public class SpaceShip {</programlisting>
-
- <para>Dans certaines de vos requêtes natives, vous devrez retourner des
- valeurs scalaires, par exemple lors de la construction de requêtes de
- rapport. Vous pouvez les mapper dans
- <literal>@SqlResultsetMapping</literal> avec
- <literal>@ColumnResult</literal>. En fait, vous pouvez même mélanger des
- retours d'entités et de valeurs scalaires dans la même requête native (ce
- n'est cependant probablement pas commun).</para>
-
- <programlisting><emphasis role="bold">@SqlResultSetMapping(name="scalar", columns=@ColumnResult(name="dimension"))
- at NamedNativeQuery(name="scalar", query="select length*width as dimension from SpaceShip", resultSetMapping="scalar")</emphasis></programlisting>
-
- <para>Une autre indication de fonctionnement spécifique aux requêtes
- natives a été présentée : <literal>org.hibernate.callable</literal>
- laquelle peut être à true ou à false fausse selon que la requête est une
- procédure stockée ou pas.</para>
- </sect2>
- </sect1>
-
- <sect1 id="entity-hibspec" xreflabel="Extensions d'Hibernate Annotation">
- <title>Extensions d'Hibernate Annotation</title>
-
- <para>Hibernate 3.1 offre une variété d'annotations supplémentaires que vous
- pouvez mélanger/faire correspondre avec des entités EJB3. Elles ont été
- conçues comme une extension naturelle aux annotations EJB3.</para>
-
- <para>Pour aller plus loin que les capacités d'EJB3, Hibernate fournit des
- annotations spécifiques qui correspondent aux fonctionnalités d'Hibernate.
- Le package <classname>org.hibernate.annotations</classname> contient toutes
- ces extensions d'annotations.</para>
-
- <sect2 id="entity-hibspec-entity" revision="2">
- <title>Entité</title>
-
- <para>Vous pouvez finement paramétrer certaines des actions faites par
- Hibernate sur les entités au-delà de ce qu'offre la spécification
- EJB3.</para>
-
- <para><classname>@org.hibernate.annotations.Entity</classname> ajoute des
- méta-données supplémentaires qui peuvent être nécessaires au-delà de ce
- qui est défini dans l'annotation <literal>@Entity</literal>
- standard :<itemizedlist>
- <listitem>
- mutable : indique si l'entité est modifiable ou non
- </listitem>
-
- <listitem>
- dynamicInsert : autorise le SQL dynamique pour les insertions
- </listitem>
-
- <listitem>
- dynamicUpdate : autorise le SQL dynamique pour les mise à jour
- </listitem>
-
- <listitem>
- selectBeforeUpdate : spécifie qu'Hibernate ne devrait jamais
- exécuter un UPDATE SQL à moins qu'il ne soit certain qu'un objet
- est réellement modifié
- </listitem>
-
- <listitem>
- polymorphism : indique si le polymorphisme d'entité est de type
- PolymorphismType.IMPLICIT (valeur par défaut) ou
- PolymorphismType.EXPLICIT
- </listitem>
-
- <listitem>
- persister : autorise la surcharge de l'implémentation de
- persistance fournie par défaut
- </listitem>
-
- <listitem>
- optimisticLock : stratégie de verrouillage optmiste
- (OptimisticLockType.VERSION,
- OptimisticLockType.NONE, OptimisticLockType.DIRTY ou
- OptimisticLockType.ALL)
- </listitem>
- </itemizedlist></para>
-
- <para><note>
- <para>@javax.persistence.Entity est encore obligatoire,
- @org.hibernate.annotations.Entity ne la remplace pas.</para>
- </note></para>
-
- <para>Voici quelques extensions d'annotations Hibernate
- supplémentaires.</para>
-
- <para><literal>@org.hibernate.annotations.BatchSize</literal> vous permet
- de définir la taille du batch lors de la récupération d'instances de
- cette entité (p. ex. <literal>@BatchSize(size=4)</literal>). Lors du
- chargement d'une entité donnée, Hibernate chargera alors toutes les
- entités non initialisées du même type dans le contexte de la persistance
- jusqu'à la taille du batch.</para>
-
- <para><literal>@org.hibernate.annotations.Proxy</literal> définit les
- attributs de chargement de l'entité. lazy (valeur par défaut) définit si
- la classe est chargée à la demande ou non. proxyClassName est l'interface
- utilisée pour générer le proxy (par défaut, la classe elle-même).</para>
-
- <para><literal>@org.hibernate.annotations.Where</literal> définit une
- clause WHERE SQL optionnelle utilisée lorsque des instances de cette
- classe sont récupérées.</para>
-
- <para><literal>@org.hibernate.annotations.Check</literal> déclare une
- contrainte de vérification optionnelle définie dans l'expression
- DDL.</para>
-
- <para><literal>@OnDelete(action=OnDeleteAction.CASCADE)</literal> sur des
- classes filles jointes : utilise une commande SQL DELETE en cascade lors
- de la suppression plutôt que le mécanisme habituel d'Hibernate.</para>
-
- <para><literal>@Table(appliesTo="tableName", indexes = {
- @Index(name="index1", columnNames={"column1", "column2"} ) } )</literal>
- crée les index définis sur les colonnes de la table
- <literal>tableName</literal>. Cela peut s'appliquer sur une table primaire
- ou une table secondaire. L'annotation <literal>@Tables</literal> vous
- permet d'avoir des index sur des tables différentes. Cette annotation est
- attendue là où <literal>@javax.persistence.Table</literal> ou
- <literal>@javax.persistence.SecondaryTable</literal>(s) sont
- déclarées.</para>
-
- <note>
- <para><literal>@org.hibernate.annotations.Table</literal> est un
- complément, pas un remplacement de
- <literal>@javax.persistence.Table</literal>. Surtout, si vous souhaitez
- changer le nom par défaut d'une table, vous devez utiliser
- <literal>@javax.persistence.Table</literal>, pas
- <literal>@org.hibernate.annotations.Table</literal>.</para>
- </note>
-
- <para><programlisting>@Entity
- at BatchSize(size=5)
- at org.hibernate.annotations.Entity(
- selectBeforeUpdate = true,
- dynamicInsert = true, dynamicUpdate = true,
- optimisticLock = OptimisticLockType.ALL,
- polymorphism = PolymorphismType.EXPLICIT)
- at Where(clause="1=1")
- at org.hibernate.annotations.Table(name="Forest", indexes = { @Index(name="idx", columnNames = { "name", "length" } ) } )
-public class Forest { ... }</programlisting><programlisting>@Entity
- at Inheritance(
- strategy=InheritanceType.JOINED
-)
-public class Vegetable { ... }
-
- at Entity
- at OnDelete(action=OnDeleteAction.CASCADE)
-public class Carrot extends Vegetable { ... }</programlisting></para>
- </sect2>
-
- <sect2 id="entity-hibspec-identifier" revision="1">
- <title>Identifiant</title>
-
- <para><literal>@org.hibernate.annotations.GenericGenerator</literal> vous
- permet de définir un générateur d'identifiants Hibernate
- spécifique.</para>
-
- <para><programlisting>@Id @GeneratedValue(generator="system-uuid")
- at GenericGenerator(name="system-uuid", strategy = "uuid")
-public String getId() {
-
- at Id @GeneratedValue(generator="hibseq")
- at GenericGenerator(name="hibseq", strategy = "seqhilo",
- parameters = {
- @Parameter(name="max_lo", value = "5"),
- @Parameter(name="sequence", value="heybabyhey")
- }
-)
-public Integer getId() {</programlisting></para>
-
- <para><literal>strategy</literal> est le nom court de la stratégie du
- générateur Hibernate3 ou le nom pleinement qualifié de la classe d'une
- implémentation de <classname>IdentifierGenerator</classname>. Vous pouvez
- ajouter des paramètres avec l'attribut
- <literal>parameters</literal>.</para>
-
- <para>Contrairement à son pendant standard,
- <literal>@GenericGenerator</literal> peut ête utilisée dans les
- annotations au niveau du package, en faisant ainsi un générateur de niveau
- applicatif (comme s'il était dans un fichier JPA XML).</para>
-
- <programlisting>@GenericGenerator(name="hibseq", strategy = "seqhilo",
- parameters = {
- @Parameter(name="max_lo", value = "5"),
- @Parameter(name="sequence", value="heybabyhey")
- }
-)
-package org.hibernate.test.model</programlisting>
- </sect2>
-
- <sect2 id="entity-hibspec-property" revision="2">
- <title>Propriété</title>
-
- <sect3>
- <title>Type d'accès</title>
-
- <para>Le type d'accès est déduit de la position de
- <literal>@Id</literal> ou de <literal>@EmbeddedId</literal> dans la
- hiérarchie de l'entité. Les entités filles, les objets embarqués et les
- entités parentes mappés héritent du type d'accès de l'entité
- racine.</para>
-
- <para>Dans Hibernate, vous pouvez surcharger le type d'accès
- pour :</para>
-
- <itemizedlist>
- <listitem>
- <para>utiliser une stratégie d'accès personnalisée</para>
- </listitem>
-
- <listitem>
- <para>paramétrer finement le type d'accès au niveau de la classe ou
- au niveau de la propriété</para>
- </listitem>
- </itemizedlist>
-
- <para>Une annocation @AccessType a été présentée pour prendre en charge
- ce comportement. Vous pouvez définir le type d'accès sur :</para>
-
- <itemizedlist>
- <listitem>
- <para>une entité</para>
- </listitem>
-
- <listitem>
- <para>une classe parente</para>
- </listitem>
-
- <listitem>
- <para>un objet embarqué</para>
- </listitem>
-
- <listitem>
- <para>une propriété</para>
- </listitem>
- </itemizedlist>
-
- <para>Le type d'accès est surchargé pour l'élément annoté, si surchargé
- sur une classe, toutes les propriétés de la classe donnée héritent du
- type d'accès. Pour les entités racines, le type d'accès est considéré
- par défaut comme celui de la hiérarchie entière (surchargeable au niveau
- de la classe ou de la propriété).</para>
-
- <para>Si le type d'accès est marqué comme "propriété", les getters sont
- parcourus pour examiner les annotations, si le type d'accès est marqué
- comme "champ", ce sont les champs qui sont parcourus pour les
- annotations. Sinon les éléments marqués avec @Id ou @embeddedId sont
- scannés.</para>
-
- <para>Vous pouvez surcharger une type d'accès pour une propriété, mais
- l'élément annoté ne sera pas influencé : par exemple, une entité ayant
- un type d'accès <literal>field</literal>, peut annoter un champ avec
- <literal>@AccessType("property")</literal>, le type d'accès sera alors
- "property" pour cet attribut, des annotations devront encore être
- portées sur les champs.</para>
-
- <para>Si une classe parente ou un objet embarquable n'est pas annoté, le
- type d'accès de l'entité racine est utilisé (même si un type d'accès a
- été défini sur une classe parente ou un objet embarquable
- intermédiaire). Le principe de la poupée russe ne s'applique pas.</para>
-
- <programlisting>@Entity
-public class Person implements Serializable {
- @Id @GeneratedValue // type d'accès "champ"
- Integer id;
-
- @Embedded
- @AttributeOverrides({
- @AttributeOverride(name = "iso2", column = @Column(name = "bornIso2")),
- @AttributeOverride(name = "name", column = @Column(name = "bornCountryName"))
- })
- Country bornIn;
-}
-
- at Embeddable
-<emphasis role="bold">@AccessType("property")</emphasis> // surcharge le type d'accès pour toutes les propriétés dans Country
-public class Country implements Serializable {
- private String iso2;
- private String name;
-
- public String getIso2() {
- return iso2;
- }
-
- public void setIso2(String iso2) {
- this.iso2 = iso2;
- }
-
- @Column(name = "countryName")
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
-</programlisting>
- </sect3>
-
- <sect3>
- <title>Formule</title>
-
- <para>Parfois, vous voulez effectuer certains calculs par la base de
- données plutôt que par la JVM, ou vous pourriez aussi vouloir créer une
- sorte de colonne virtuelle. Vous pouvez utilisez un fragment SQL (alias
- une formule) plutôt que de mapper un propriété sur une colonne. Cette
- sorte de propriété est en lecture seule (sa valeur est calculée par
- votre formule).</para>
-
- <programlisting>@Formula("obj_length * obj_height * obj_width")
-public long getObjectVolume()</programlisting>
-
- <para>Le fragment SQL peut être aussi complexe que vous le souhaitez,
- même avec des sous-selects inclus.</para>
- </sect3>
-
- <sect3>
- <title>Type</title>
-
- <para><literal>@org.hibernate.annotations.Type</literal> surcharge le
- type Hibernate utilisé par défaut : ce n'est généralement pas nécessaire
- puisque le type est correctement inféré par Hibernate. Veuillez vous
- référer au guide de référence Hibernate pour plus d'informations sur les
- types Hibernate.</para>
-
- <para><literal>@org.hibernate.annotations.TypeDef</literal> et
- <literal>@org.hibernate.annotations.TypeDefs</literal> vous permettent
- de déclarer des définitions de type. Ces annotations sont placées au
- niveau de la classe ou du package. Notez que ces définitions seront
- globales pour la session factory (même au niveau de la classe) et que la
- définition du type doit être définie avant n'importe quelle
- utilisation.</para>
-
- <programlisting>@TypeDefs(
- {
- @TypeDef(
- name="caster",
- typeClass = CasterStringType.class,
- parameters = {
- @Parameter(name="cast", value="lower")
- }
- )
- }
-)
-package org.hibernate.test.annotations.entity;
-
-...
-public class Forest {
- @Type(type="caster")
- public String getSmallText() {
- ...
-}
- </programlisting>
-
- <para>Lors de l'utilisation d'un type utilisateur composé, vous devrez
- exprimer les définitions des colonnes. L'annotation
- <literal>@Columns</literal> a été mise en place dans ce but.</para>
-
- <programlisting>@Type(type="org.hibernate.test.annotations.entity.MonetaryAmountUserType")
- at Columns(columns = {
- @Column(name="r_amount"),
- @Column(name="r_currency")
-})
-public MonetaryAmount getAmount() {
- return amount;
-}
-
-
-public class MonetaryAmount implements Serializable {
- private BigDecimal amount;
- private Currency currency;
- ...
-}</programlisting>
- </sect3>
-
- <sect3>
- <title>Index</title>
-
- <para>Vous pouvez définir un index sur une colonne particulière en
- utilisant l'annotation <literal>@Index</literal> sur une propriété d'une
- colonne, l'attribut columnNames sera ignoré.</para>
-
- <programlisting>@Column(secondaryTable="Cat1")
- at Index(name="story1index")
-public String getStoryPart1() {
- return storyPart1;
-}</programlisting>
- </sect3>
-
- <sect3>
- <title>@Parent</title>
-
- <para>A l'intérieur d'un objet embarquable, vous pouvez définir
- une des propriétés comme un pointeur vers l'élément
- propriétaire.</para>
-
- <programlisting>@Entity
-public class Person {
- @Embeddable public Address address;
- ...
-}
-
- at Embeddable
-public class Address {
- @Parent public Person owner;
- ...
-}
-
-
-person == person.address.owner</programlisting>
- </sect3>
-
- <sect3>
- <title>Propriétés générées</title>
-
- <para>Certaines propriétés sont générées au moment de l'insertion ou de
- la mise à jour par votre base de données. Hibernate peut traiter de
- telles propriétés et déclencher un select subséquent pour lire ces
- propriétés.</para>
-
- <programlisting>@Entity
-public class Antenna {
- @Id public Integer id;
- @Generated(GenerationTime.ALWAYS) @Column(insertable = false, updatable = false)
- public String longitude;
-
- @Generated(GenerationTime.INSERT) @Column(insertable = false)
- public String latitude;
-}</programlisting>
-
- <para>Quand vous annotez votre propriété avec
- <literal>@Generated</literal>, vous devez vous assurer que l'insertion
- et la mise à jour n'entreront pas en conflit avec la stratégie de
- génération que vous avez choisie. Lorsque GenerationTime.INSERT est
- choisi, la propriété ne doit pas contenir de colonnes insérables ;
- lorsque GenerationTime.ALWAYS est choisi, la propriété ne doit pas
- contenir de colonnes qui puissent être insérées ou mises à jour.</para>
-
- <para>Les propriétés <literal>@Version</literal> ne peuvent pas (par
- conception) être <literal>@Generated(INSERT)</literal>, elles doivent
- être <literal>NEVER</literal> ou <literal>ALWAYS</literal>.</para>
- </sect3>
- </sect2>
-
- <sect2 id="entity-hibspec-inheritance" revision="1">
- <title>Héritage</title>
-
- <para>SINGLE_TABLE est une stratégie très puissante mais parfois, et
- surtout pour des systèmes pré-existants, vous ne pouvez pas ajouter une
- colonne discriminante supplémentaire. Pour cela Hibernate a mis en place
- la notion de formule discriminante :
- <literal>@DiscriminatorFormula</literal> est une remplaçcant de
- <literal>@DiscriminatorColumn</literal> et utilise un fragment SQL en tant
- que formule pour la résolution du discriminant (pas besoin d'avoir une
- colonne dédiée).</para>
-
- <programlisting>@Entity
- at DiscriminatorForumla("case when forest_type is null then 0 else forest_type end")
-public class Forest { ... }</programlisting>
-
- <para>Par défaut, lors du requêtage sur les entités les plus hautes,
- Hibernate ne met pas de restriction sur la colonne discriminante. Ceci
- peut être un inconvénient si cette colonne contient des valeurs qui ne sont
- pas mappées dans votre hiérarchie (avec
- <literal>@DiscriminatorValue</literal>). Pour contourner ca, vous pouvez
- utilser <literal>@ForceDiscriminator</literal> (au niveau de la classe,
- à côté de <literal>@DiscriminatorColumn</literal>). Hibernate listera
- alors les valeurs disponibles lors du chargement des entités.</para>
- </sect2>
-
- <sect2 id="entity-hibspec-singleassoc">
- <title>Annotations concernant les simples associations</title>
-
- <para>Par défaut, lorsqu'Hibernate ne peut pas résoudre l'association
- parce que l'élément associé attendu n'est pas dans la base de données
- (mauvais identifiant sur la colonne de l'association), une exception est
- levée par Hibernate. Cela pourrait être un inconvénient pour des schémas
- pré-existants et mal maintenus. Vous pouvez demander à Hibernate d'ignorer
- de tels éléments plutôt que de lever une exception en utilisant
- l'annotation <literal>@NotFound</literal>. Cette annotation peut être
- utilisée sur une association <literal>@OneToOne</literal> (avec une clef
- étrangère), <literal>@ManyToOne</literal>, <literal>@OneToMany</literal>
- ou <literal>@ManyToMany</literal>.</para>
-
- <programlisting>@Entity
-public class Child {
- ...
- @ManyToOne
- @NotFound(action=NotFoundAction.IGNORE)
- public Parent getParent() { ... }
- ...
-}</programlisting>
-
- <para>Parfois vous voulez déléguer à votre base de données la suppression
- en cascade lorsqu'une entité donnée est supprimée.</para>
-
- <programlisting>@Entity
-public class Child {
- ...
- @ManyToOne
- @OnDelete(action=OnDeleteAction.CASCADE)
- public Parent getParent() { ... }
- ...
-}</programlisting>
-
- <para>Dans ce cas, Hibernate génère une contrainte de suppression en
- cascade au niveau de la base de données.</para>
-
- <para>Les contraintes de clef étrangère, bien que générées par Hibernate,
- ont un nom justement illisible. Vous pouvez surcharger le nom de la
- contrainte par l'utilisation de <literal>@ForeignKey</literal>.</para>
-
- <programlisting>@Entity
-public class Child {
- ...
- @ManyToOne
- <emphasis role="bold">@ForeignKey(name="FK_PARENT")</emphasis>
- public Parent getParent() { ... }
- ...
-}
-
-alter table Child add constraint FK_PARENT foreign key (parent_id) references Parent</programlisting>
-
- <sect3>
- <title>Options de chargement et modes de récupération</title>
-
- <para>EJB3 arrive avec l'option <literal>fetch</literal> pour définir
- le chargement à la demande et les modes de récupération, cependant
- Hibernate a beaucoup plus d'options dans ce domaine. Pour finement
- paramétrer le chargement à la demande et les stratégies de récupération,
- quelques annotations supplémentaires ont été mises en place :</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>@LazyToOne</literal> : définit l'option de chargement
- à la demande sur les associations <literal>@ManyToOne</literal> et
- <literal>@OneToOne</literal>. <literal>LazyToOneOption</literal>
- peut être <literal>PROXY</literal> (ie utiliser un chargement à la
- demande basé sur un proxy), <literal>NO_PROXY</literal> (utilise
- un chargement à la demande sur l'ajout de bytecode - notez qu'un
- temps de construction du bytecode est nécessaire) et
- <literal>FALSE</literal> (association sans chargement à la
- demande) ;</para>
- </listitem>
-
- <listitem>
- <para><literal>@LazyCollection</literal> : définit l'option de
- chargement à la demande sur les associations
- <literal>@ManyToMany</literal> et <literal>@OneToMany</literal>.
- LazyCollectionOption peut être <literal>TRUE</literal> (la
- collection est chargée à la demande lorsque son état est accédé),
- <literal>EXTRA</literal> (la collection est chargée à la demande et
- toutes les opérations essaieront d'éviter le chargement de la
- collection, c'est surtout utile pour de grosses collections lorsque
- le chargement de tous les éléments n'est pas nécessaire) et
- <literal>FALSE</literal> (association sans chargement à la
- demande) ;</para>
- </listitem>
-
- <listitem>
- <para><literal>@Fetch</literal> : définit une stratégie de
- récupération utilisée pour charger l'association.
- <literal>FetchMode</literal> peut être
- <literal>SELECT</literal> (un select est déclenché lorsque
- l'association a besoin d'être chargée), <literal>SUBSELECT</literal>
- (disponible uniquement pour des collections, utilise une stratégie
- de sous select - veuillez vous référer à la documentation de
- référence d'Hibernate pour plus d'informations) ou
- <literal>JOIN</literal> (utilise un JOIN SQL pour charger
- l'association lors du chargement de l'entité propriétaire).
- <literal>JOIN</literal> surcharge n'importe quel attribut de
- chargement à la demande (une association chargée avec la stratégie
- <literal>JOIN</literal> ne peut pas être chargée à la
- demande).</para>
- </listitem>
- </itemizedlist>
-
- <para>Les annotations Hibernate surchargent les options de récupération
- EJB3.</para>
-
- <table>
- <title>Chargement à la demande et options de récupération
- équivalentes</title>
-
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Annotations</entry>
-
- <entry>Chargement à la demande</entry>
-
- <entry>Récupération</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>@[One|Many]ToOne](fetch=FetchType.LAZY)</entry>
-
- <entry>@LazyToOne(PROXY)</entry>
-
- <entry>@Fetch(SELECT)</entry>
- </row>
-
- <row>
- <entry>@[One|Many]ToOne](fetch=FetchType.EAGER)</entry>
-
- <entry>@LazyToOne(FALSE)</entry>
-
- <entry>@Fetch(JOIN)</entry>
- </row>
-
- <row>
- <entry>@ManyTo[One|Many](fetch=FetchType.LAZY)</entry>
-
- <entry>@LazyCollection(TRUE)</entry>
-
- <entry>@Fetch(SELECT)</entry>
- </row>
-
- <row>
- <entry>@ManyTo[One|Many](fetch=FetchType.EAGER)</entry>
-
- <entry>@LazyCollection(FALSE)</entry>
-
- <entry>@Fetch(JOIN)</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect3>
- </sect2>
-
- <sect2 id="entity-hibspec-collection" revision="2">
- <title>Annotations concernant les collections</title>
-
- <sect3 id="entity-hibspec-collection-enhance" revision="2">
- <title>Améliorer les configurations des collections</title>
-
- <para>Il est possible de configurer :<itemizedlist>
- <listitem>
- la taille des batchs pour les collections en utilisant @BatchSize
- </listitem>
-
- <listitem>
- la clause where, en utilisant @Where (appliquée à l'entité cible)
- ou @WhereJoinTable (appliquée à la table de l'association)
- </listitem>
-
- <listitem>
- la clause de vérification, en utilsant @Check
- </listitem>
-
- <listitem>
- la clause SQL order by, en utilisant @OrderBy
- </listitem>
-
- <listitem>
- la stratégie de suppression en cascade avec
- @OnDelete(action=OnDeleteAction.CASCADE)
- </listitem>
- </itemizedlist></para>
-
- <para>Vous pouvez aussi déclarer un comparateur de tri, utilisez
- l'annotation <literal>@Sort</literal>. Exprimez le type de comparateur
- que vous voulez entre "non trié" (NdT : unsorted), "ordre naturel"
- (NdT : natural) ou un comparateur personnalisé. Si vous voulez utilisez
- votre propre implémentation de comparateur, vous devrez indiquer la
- classe d'implémentation en utilisant l'attribut
- <literal>comparator</literal>. Notez que vous avez besoin d'utiliser
- l'interface <classname>SortedSet</classname> ou
- <classname>SortedMap</classname>.</para>
-
- <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
- @JoinColumn(name="CUST_ID")
- @Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
- @Where(clause="1=1")
- @OnDelete(action=OnDeleteAction.CASCADE)
- public SortedSet<Ticket> getTickets() {
- return tickets;
- }</programlisting>
-
- <para>Veuillez vous référer aux descriptions précédentes de ces
- annotations pour plus d'informations.</para>
-
- <para>Les contraintes de clef étrangère, bien que générées par
- Hibernate, ont un nom illisible. Vous pouvez surcharger le nom de la
- contrainte en utilisant <literal>@ForeignKey</literal>. Notez que cette
- annotation doit être placée du côté possédant la relation,
- <literal>inverseName</literal> référençant la contrainte de l'autre
- côté.</para>
-
- <programlisting>@Entity
-public class Woman {
- ...
- @ManyToMany(cascade = {CascadeType.ALL})
- <emphasis role="bold">@ForeignKey(name = "TO_WOMAN_FK", inverseName = "TO_MAN_FK")</emphasis>
- public Set<Man> getMens() {
- return mens;
- }
-}
-
-alter table Man_Woman add constraint TO_WOMAN_FK foreign key (woman_id) references Woman
-alter table Man_Woman add constraint TO_MAN_FK foreign key (man_id) references Man</programlisting>
- </sect3>
-
- <sect3 id="entity-hibspec-collection-extratype" revision="1">
- <title>Types de collection extra</title>
-
- <sect4>
- <title>List</title>
-
- <para>Outre EJB3, Hibernate Annotations prend en charge les véritables
- <classname>List</classname> et <classname>Array</classname>. Mappez
- votre collection de la même manière que d'habitude et ajoutez
- l'annotation @<literal>IndexColumn</literal>. Cette annotation vous
- permet de décrire la colonne qui contiendra l'index. Vous pouvez aussi
- déclarer la valeur de l'index en base de données qui représente le
- premier élément (alias index de base). La valeur habituelle est
- <literal>0</literal> ou <literal>1</literal>.</para>
-
- <programlisting>@OneToMany(cascade = CascadeType.ALL)
- at IndexColumn(name = "drawer_position", base=1)
-public List<Drawer> getDrawers() {
- return drawers;
-}</programlisting>
-
- <note>
- <para>Si vous oubliez de positionner
- <literal>@IndexColumn</literal>, la sémantique du bag est appliquée.
- Si vous voulez la sémantique du bag sans ses limitations, considérez
- l'utilisation de <literal>@CollectionId</literal>.</para>
- </note>
- </sect4>
-
- <sect4>
- <title>Map</title>
-
- <para>Hibernate Annotations prend aussi en charge le mapping de
- véritables Maps, si <literal>@javax.persistence.MapKey</literal> n'est
- pas positionnée, Hibernate mappera l'élément clef ou l'objet
- embarquable dans ses propres colonnes. Pour surcharger les colonnes
- par défaut, vous pouvez utiliser
- <literal>@org.hibernate.annotations.MapKey</literal> si votre clef est
- un type de base (par défaut à <literal>mapkey</literal>) ou un objet
- embarquable, ou vous pouvez utiliser
- <literal>@org.hibernate.annotations.MapKeyManyToMany</literal> si
- votre clef est une entité.</para>
- </sect4>
-
- <sect4 id="entity-hibspec-collection-extratype-indexbidir">
- <title>Associations bidirectionnelle avec des collections indexées</title>
-
- <para>Une association bidirectionnelle où une extrémité est
- représentée comme une <literal>@IndexColumn</literal> ou une
- <literal>@org.hibernate.annotations.MapKey[ManyToMany]</literal>
- requiert une considération spéciale. S'il y a une propriété de la
- classe enfante qui mappe la colonne de l'index, pas de problème, nous
- pouvons continuer en utilisant <literal>mappedBy</literal> sur le
- mapping de la collection :</para>
-
- <programlisting>@Entity
-public class Parent {
- @OneToMany(mappedBy="parent")
- @org.hibernate.annotations.MapKey(columns=@Column(name="name"))
- private Map<String, Child> children;
- ...
-}
-
- at Entity
-public class Parent {
- ...
- @Basic
- private String name;
-
- @ManyToOne
- @JoinColumn(name="parent_id", nullable=false)
- private Parent parent;
- ...
-}</programlisting>
-
- <para>Mais s'il n'y a pas de telle propriété sur la classe enfante,
- nous ne pouvons pas penser que l'association est vraiment
- bidirectionnelle (il y a des informations disponibles à une extrémité
- qui ne sont pas disponibles à l'autre). Dans ce cas, nous ne pouvons
- pas mapper la collection avec <literal>mappedBy</literal>. A la place,
- nous pourrions utiliser le mapping suivant :</para>
-
- <programlisting>@Entity
-public class Parent {
- @OneToMany
- @org.hibernate.annotations.MapKey(columns=@Column(name="name"))
- @JoinColumn(name="parent_id", nullable=false)
- private Map<String, Child> children;
- ...
-}
-
- at Entity
-public class Parent {
- ...
- @ManyToOne
- @JoinColumn(name="parent_id", insertable=false, updatable=false, nullable=false)
- private Parent parent;
- ...
-}</programlisting>
-
- <para>Notez que dans ce mapping, l'extrémité de l'association dont la
- valeur est une collection est responsable des mises à jour pour la
- clef étrangère.</para>
- </sect4>
-
- <sect4>
- <title>Bag avec une clef primaire</title>
-
- <para>Une autre fonctionnalité intéressante est la possibilité de
- définir une clef primaire subrogée à une collection bag. Ceci enlève
- pas mal d'inconvénients des bags : mise à jour et suppression
- sont efficaces, plus d'un bag <literal>EAGER</literal> par requête ou
- par entité. Cette clef primaire sera contenue dans une colonne
- supplémentaire de votre table de collection mais ne sea pas visible
- par l'application Java. @CollectionId est utilisée pour marquer une
- collection comme "id bag", ca permet aussi de surcharger les colonnes
- de la clef primaire, le type de la clef primaire et la stratégie du
- générateur. La stratégie peut être <literal>identity</literal>, ou
- n'importe quel nom de générateur défini de votre application.</para>
-
- <programlisting>@Entity
- at TableGenerator(name="ids_generator", table="IDS")
-public class Passport {
- ...
-
- @ManyToMany(cascade = CascadeType.ALL)
- @JoinTable(name="PASSPORT_VISASTAMP")
- <emphasis role="bold">@CollectionId(
- columns = @Column(name="COLLECTION_ID"),
- type=@Type(type="long"),
- generator = "ids_generator"
- )</emphasis>
- private Collection<Stamp> visaStamp = new ArrayList();
- ...
-}</programlisting>
- </sect4>
-
- <sect4>
- <title>Collection d'éléments ou d'éléments composés</title>
-
- <para>Hibernate Annotations prend aussi en charge les collections de
- types core (Integer, String, Enums, ...), les collections d'objets
- embarquables et même les tableaux de types primitifs. Ce sont des
- collections d'éléments.</para>
-
- <para>Une collection d'éléments doit être annotée comme
- <literal>@CollectionOfElements</literal> (en tant que remplaçant de
- <literal>@OneToMany</literal>). Pour définir la table de la
- collection, l'annotation <literal>@JoinTable</literal> est utilisée
- sur la propriété de l'association, <literal>joinColumns</literal>
- définit les colonnes de jointure entre la table de l'entité primaire
- et la table de la collection (inverseJoincolumn est inutile et
- devrait être laissé à vide). Pour une collection de types core ou un
- tableau de types primitifs, vous pouvez surcharger la définition de la
- colonne de l'élément en utilisant <literal>@Column</literal> sur la
- propriété de l'association. Vous pouvez aussi surcharger les colonnes
- d'une collection d'objets embarquables en utilisant
- <literal>@AttributeOverride</literal>. Pour atteindre l'élément de la
- collection, vous avez besoin d'ajouter "element" au nom de l'attribut
- surchargé (p. ex. "element" pour les types core, ou "element.serial"
- pour la propriété serial d'un élément embarqué). Pour atteindre
- l'index/clef d'une collection, ajoutez "key" à la place.</para>
-
- <programlisting>@Entity
-public class Boy {
- private Integer id;
- private Set<String> nickNames = new HashSet<String>();
- private int[] favoriteNumbers;
- private Set<Toy> favoriteToys = new HashSet<Toy>();
- private Set<Character> characters = new HashSet<Character>();
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- <emphasis role="bold">@CollectionOfElements
- public Set<String></emphasis> getNickNames() {
- return nickNames;
- }
-
- <emphasis role="bold">@CollectionOfElements
- @JoinTable(
- table=@Table(name="BoyFavoriteNumbers"),
- joinColumns = @JoinColumn(name="BoyId")
- )
- @Column(name="favoriteNumber", nullable=false)</emphasis>
- @IndexColumn(name="nbr_index")
- public int[] getFavoriteNumbers() {
- return favoriteNumbers;
- }
-
- <emphasis role="bold">@CollectionOfElements
- @AttributeOverride( name="element.serial", column=@Column(name="serial_nbr") )</emphasis>
- public Set<Toy> getFavoriteToys() {
- return favoriteToys;
- }
-
- <emphasis role="bold">@CollectionOfElements
- public Set<Character></emphasis> getCharacters() {
- return characters;
- }
- ...
-}
-
-public enum Character {
- GENTLE,
- NORMAL,
- AGGRESSIVE,
- ATTENTIVE,
- VIOLENT,
- CRAFTY
-}
-
- at Embeddable
-public class Toy {
- public String name;
- public String serial;
- public Boy owner;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getSerial() {
- return serial;
- }
-
- public void setSerial(String serial) {
- this.serial = serial;
- }
-
- <emphasis role="bold">@Parent</emphasis>
- public Boy getOwner() {
- return owner;
- }
-
- public void setOwner(Boy owner) {
- this.owner = owner;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final Toy toy = (Toy) o;
-
- if ( !name.equals( toy.name ) ) return false;
- if ( !serial.equals( toy.serial ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = name.hashCode();
- result = 29 * result + serial.hashCode();
- return result;
- }
-}</programlisting>
-
- <para>Sur une collection d'objets embarquables, l'objet embarquable
- peut avoir une propriété annotée avec <literal>@Parent</literal>.
- Cette propriété pointera alors vers l'entité contenant la
- collection.</para>
-
- <note>
- <para>Les versions précédentes d'Hibernate Annotations utilisaient
- <literal>@OneToMany</literal> pour marquer une collection
- d'éléments. Suite à des incohérences sémantiques, nous avons mis en
- place l'annotation <literal>@CollectionOfElements</literal>. Pour
- marquer des collections d'éléments, l'ancienne façon fonctionne
- encore mais elle est considérée comme "deprecated" et ne sera plus
- prise en charge dans les futures versions.</para>
- </note>
- </sect4>
- </sect3>
- </sect2>
-
- <sect2>
- <title>Cache</title>
-
- <para>Pour optimiser vos accès à la base de données, vous pouvez activer
- le cache de second niveau d'Hibernate. Ce cache est configurable par
- entité et par collection.</para>
-
- <para><literal>@org.hibernate.annotations.Cache</literal> définit la
- stratégie de cache et la région du cache de second niveau donné. Cette
- annotation peut être appliquée à une entité racine (pas les entités
- filles), et sur les collections.</para>
-
- <programlisting>@Entity
- at Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-public class Forest { ... }</programlisting>
-
- <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
- @JoinColumn(name="CUST_ID")
- @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
- public SortedSet<Ticket> getTickets() {
- return tickets;
- }</programlisting>
-
- <para></para>
-
- <programlistingco>
- <areaspec>
- <area coords="2 55" id="hm1" />
-
- <area coords="3 55" id="hm2" />
-
- <area coords="4 55" id="hm3" />
- </areaspec>
-
- <programlisting>@Cache(
- CacheConcurrencyStrategy usage();
- String region() default "";
- String include() default "all";
-)</programlisting>
-
- <calloutlist>
- <callout arearefs="hm1">
- <para>usage : la stratégie de concurrence du cache donné (NONE,
- READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL) ;</para>
- </callout>
-
- <callout arearefs="hm2">
- <para>region (optionnel) : la région du cache (par défaut le nom
- complet de la classe avec le nom du package, ou le nom complet du
- rôle de la collection) ;</para>
- </callout>
-
- <callout arearefs="hm3">
- <para><literal>include</literal> (optionnel) : "all" pour inclure
- toutes les propriétés, "non-lazy" pour inclure seulement les
- propriétés qui ne sont pas chargées à la demande (valeur par
- défaut : all).</para>
- </callout>
- </calloutlist>
- </programlistingco>
- </sect2>
-
- <sect2 id="entity-hibspec-filters">
- <title>Filtres</title>
-
- <para>Hibernate a la capacité d'appliquer des filtres arbitraires à la
- partie supérieure de vos données. Ces filtres sont appliqués au moment de
- l'exécution sur une session donnée. Vous avez tout d'abord besoin de les
- définir.</para>
-
- <para><literal>@org.hibernate.annotations.FilterDef</literal> ou
- <literal>@FilterDefs</literal> déclarent des définitions de filtre
- utilisées par les filtres ayant le même nom. Une définition de filtre a
- un name() et un tableau de parameters(). Un paramètre vous permettra
- d'ajuster le comportement du filtre au moment de l'exécution. Chaque
- paramètre est défini par une <literal>@ParamDef</literal> qui a un nom et
- un type. Vous pouvez aussi définir un paramètre defaultCondition() pour
- une <literal>@ParamDef</literal> donnée pour positionner la condition par
- défaut à utiliser lorsqu'aucune n'est définie dans chaque
- <literal>@Filter</literal> individuelle. Une <literal>@FilterDef</literal>
- peut être définie au niveau de la classe ou du package.</para>
-
- <para>Nous avons besoin de définir la clause du filtre SQL appliqué au
- chargement de l'entité ou au chargement de la collection.
- <literal>@Filter</literal> est utilisée et placée sur l'entité ou
- l'élément de la collection.</para>
-
- <para><programlisting>@Entity
- at FilterDef(name="minLength", parameters={ @ParamDef( name="minLength", type="integer" ) } )
- at Filters( {
- @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"),
- @Filter(name="minLength", condition=":minLength <= length")
-} )
-public class Forest { ... }</programlisting></para>
-
- <para>Lorsque la collection utilise une table d'association comme
- représentation relationnelle, vous pourriez vouloir appliquer la condition
- du filtre à la table de l'association elle-même ou à la table de l'entité
- cible. Pour appliquer la contrainte sur l'entité cible, utilisez
- l'annotation habituelle <literal>@Filter</literal>. Cependant, si vous
- voulez ciblez la table d'association, utilisez l'annotation
- <literal>@FilterJoinTable</literal>.</para>
-
- <programlisting> @OneToMany
- @JoinTable
- // filtre sur la table de l'entité cible
- @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length")
- // filtre sur la table d'association
- @FilterJoinTable(name="security", condition=":userlevel >= requredLevel")
- public Set<Forest> getForests() { ... }</programlisting>
- </sect2>
-
- <sect2 id="entity-hibspec-query">
- <title>Requête</title>
-
- <para>Puisqu'Hibernate a plus de fonctionnalités sur les requêtes nommées
- que définies dans la spécification EJB3,
- <literal>@org.hibernate.annotations.NamedQuery</literal>,
- <literal>@org.hibernate.annotations.NamedQueries</literal>,
- <literal>@org.hibernate.annotations.NamedNativeQuery</literal> et
- <literal>@org.hibernate.annotations.NamedNativeQueries</literal> ont été
- mis en place. Elles ajoutent des attributs à la version standard et
- peuvent être utilisées comme remplaçant :</para>
-
- <itemizedlist>
- <listitem>
- <para>flushMode : définit le mode de flush de la requête (Always,
- Auto, Commit ou Never)</para>
- </listitem>
-
- <listitem>
- <para>cacheable : indique si la requête devrait être cachée ou
- non</para>
- </listitem>
-
- <listitem>
- <para>cacheRegion : région du cache utilisée si la requête est
- cachée</para>
- </listitem>
-
- <listitem>
- <para>fetchSize : taille de l'expression de récupération JDBC pour
- cette requête</para>
- </listitem>
-
- <listitem>
- <para>timeout : timeout de la requête</para>
- </listitem>
-
- <listitem>
- <para>callable : pour les requêtes natives seulement, mettre à true
- pour les procédures stockées</para>
- </listitem>
-
- <listitem>
- <para>comment : si les commentaires sont activés, le commentaire vu
- lorsque la requête est envoyée vers la base de données</para>
- </listitem>
-
- <listitem>
- <para>cacheMode : mode d'intéraction du cache (get, ignore, normal,
- put ou refresh)</para>
- </listitem>
-
- <listitem>
- <para>readOnly : indique si les éléments récupérés à partir de la
- requête sont en lecture seule ou pas</para>
- </listitem>
- </itemizedlist>
-
- <para>Ces indications de fonctionnement peuvent être positionnées sur
- les annotations standards <literal>@javax.persistence.NamedQuery</literal>
- avec l'annotation <literal>@QueryHint</literal>. Un autre avantage clef
- est la possibilité de positionner ces annotations au niveau du
- package.</para>
- </sect2>
- </sect1>
-</chapter>
Copied: trunk/HibernateExt/annotations/doc/reference/fr/modules/entity.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules/entity.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/fr/modules/entity.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/fr/modules/entity.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,3458 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="entity">
+ <title>Entity Beans</title>
+
+ <sect1 id="entity-overview" revision="1">
+ <title>Introduction</title>
+
+ <para>Cette section couvre les annotations entity bean EJB 3.0 (alias JPA)
+ et les extensions spécifiques à Hibernate.</para>
+ </sect1>
+
+ <sect1 id="entity-mapping" revision="2">
+ <title>Mapping avec les annotations EJB3/JPA</title>
+
+ <para>Les entités EJB3 sont des POJOs ordinaires. En fait, ils
+ représentent exactement le même concept que les entités de persistance
+ Hibernate. Leur mapping est défini à travers les annotations du JDK 5.0
+ (une syntaxe de descripteur XML pour la surcharge est définie dans la
+ spécification EJB3). Les annotations peuvent être divisées en deux
+ catégories, les annotations de mapping logique (vous permettant de décrire
+ le modèle objet, les associations de classe, etc) et les annotations de
+ mapping physique (décrivant le schéma physique, les tables, les colonnes,
+ les index, etc). Nous mélangerons les annotations des deux catégories dans
+ les exemples de code.</para>
+
+ <para>Les annotations EJB3 sont dans le package
+ <literal>javax.persistence.*</literal>. La plupart des IDE compatibles JDK 5
+ (comme Eclipse, IntelliJ IDEA et Netbeans) peuvent auto-compléter les
+ interfaces et les attributes d'annotation pour vous (même sans module "EJB3"
+ spécifique, puisque les annotations EJB3 sont des annotations ordinaires de
+ JDK 5).</para>
+
+ <para>Pour plus d'exemples concrets, lisez le tutorial EJB 3.0 de JBoss ou
+ parcourez la suite de tests d'Hibernate Annotations. La plupart des tests
+ unitaires ont été conçus pour représenter un exemple concret et être une
+ source d'inspiration.</para>
+
+ <sect2>
+ <title>Déclarer un entity bean</title>
+
+ <para>Chaque classe POJO persistante liée est un entity bean et est
+ déclarée en utilisant l'annotation <literal>@Entity</literal> (au niveau
+ de la classe) :</para>
+
+ <programlisting>
+ at Entity
+public class Flight implements Serializable {
+ Long id;
+
+ @Id
+ public Long getId() { return id; }
+
+ public void setId(Long id) { this.id = id; }
+}
+</programlisting>
+
+ <para><literal>@Entity</literal> déclare la classe comme un entity bean
+ (ie une classe POJO persistante), <literal>@Id</literal> déclare la
+ propriété identifiante de cet entity bean. Les autres déclarations de
+ mapping sont implicites. Ce concept de déclaration par exception est
+ un composant essentiel de la nouvelle spécification EJB3 et une
+ amélioration majeure. La classe Flight est mappée sur la table Flight, en
+ utilisant la colonne id comme colonne de la clef primaire.</para>
+
+ <para>Selon que vous annotez des champs ou des méthodes, le type d'accès
+ utilisé par Hibernate sera <literal>field</literal> ou
+ <literal>property</literal>. La spécification EJB3 exige que vous
+ déclariez les annotations sur le type d'élément qui sera accédé,
+ c'est-à-dire le getter si vous utilisez l'accès
+ <literal>property</literal>, le champ si vous utilisez l'accès
+ <literal>field</literal>. Mélanger des EJB3 annotations dans les champs et
+ les méthodes devrait être évité. Hibernate devinera le type d'accès de
+ l'identifiant à partir de la position d'<literal>@Id</literal> ou
+ d'<literal>@EmbeddedId</literal>.</para>
+
+ <sect3>
+ <title>Définir la table</title>
+
+ <para><literal>@Table</literal> est positionnée au niveau de la classe ;
+ cela vous permet de définir le nom de la table, du catalogue et du
+ schéma pour le mapping de votre entity bean. Si aucune
+ <literal>@Table</literal> n'est définie les valeurs par défaut sont
+ utilisées : le nom de la classe de l'entité (sans le nom de
+ package).</para>
+
+ <programlisting>
+ at Entity
+ at Table(name="tbl_sky")
+public class Sky implements Serializable {
+...
+ </programlisting>
+
+ <para>L'élément <literal>@Table</literal> contient aussi un attribut
+ <literal>schema</literal> et un attribut <literal>catalog</literal>,
+ si vous avez besoin de les définir. Vous pouvez aussi définir des
+ contraintes d'unicité sur la table en utilisant l'annotation
+ <literal>@UniqueConstraint</literal> en conjonction avec
+ <literal>@Table</literal> (pour une contrainte d'unicité n'impliquant
+ qu'une seule colonne, référez-vous à <literal>@Column</literal>).</para>
+
+ <programlisting>@Table(name="tbl_sky",
+ <emphasis role="bold">uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})}</emphasis>
+)</programlisting>
+
+ <para>Une contrainte d'unicité est appliquée au tuple {month, day}.
+ Notez que le tableau <literal>columnNames</literal> fait référence aux
+ noms logiques des colonnes.</para>
+
+ <remark>Le nom logique d'une colonne est défini par l'implémentation
+ de NamingStrategy d'Hibernate. La stratégie de nommage EJB3 par défaut
+ utilise le nom de colonne physique comme nom de colonne logique. Notez
+ qu'il peut être différent du nom de la propriété (si le nom de colonne
+ est explicite). A moins que vous surchargiez la stratégie de nommage,
+ vous ne devriez pas vous soucier de ça.</remark>
+ </sect3>
+
+ <sect3>
+ <title>Versionner pour un contrôle de concurrence optimiste</title>
+
+ <para>Vous pouvez ajouter un contrôle de concurrence optimiste à un
+ entity bean en utilisant l'annotation
+ <literal>@Version</literal> :</para>
+
+ <programlisting>
+ at Entity
+public class Flight implements Serializable {
+...
+ @Version
+ @Column(name="OPTLOCK")
+ public Integer getVersion() { ... }
+} </programlisting>
+
+ <para>La propriété de version sera mappée sur la colonne
+ <literal>OPTLOCK</literal>, et le gestionnaire d'entités l'utilisera
+ pour détecter des conflits lors des mises à jour (prévenant des pertes
+ de données lors de mises à jours que vous pourriez voir avec la
+ stratégie du last-commit-wins).</para>
+
+ <para>La colonne de version peut être un numérique (solution
+ recommandée) ou un timestamp comme pour la spécification EJB3. Hibernate
+ prend en charge n'importe quel type fourni que vous définissez et
+ implémentez avec la classe <classname>UserVersionType</classname>
+ appropriée.</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>Mapping de simples propriétés</title>
+
+ <sect3>
+ <title>Déclarer des mappings de propriétés élémentaires</title>
+
+ <para>Chaque propriété (champ ou méthode) non statique non transient
+ d'un entity bean est considérée persistante, à moins que vous l'annotiez
+ comme <literal>@Transient</literal>. Ne pas avoir d'annotation pour
+ votre propriété est équivalent à l'annotation <literal>@Basic</literal>.
+ L'annotation <literal>@Basic</literal> vous permet de déclarer la
+ stratégie de récupération pour une propriété :</para>
+
+ <programlisting>public transient int counter; // propriété transient
+
+private String firstname; // propriété persistante
+
+ at Transient
+String getLengthInMeter() { ... } // propriété transient
+
+String getName() {... } // propriété persistante
+
+ at Basic
+int getLength() { ... } // propriété persistante
+
+ at Basic(fetch = FetchType.LAZY)
+String getDetailedComment() { ... } // propriété persistante
+
+ at Temporal(TemporalType.TIME)
+java.util.Date getDepartureTime() { ... } // propriété persistante
+
+ at Enumerated(STRING)
+Starred getNote() { ... } // enum persistée en tant que String dans la base de données</programlisting>
+
+ <para><literal>counter</literal>, un champ transient, et
+ <literal>lengthInMeter</literal>, une méthode annotée comme
+ <literal>@Transient</literal>, seront ignorés par le gestionnaire
+ d'entités. Les propriétés <literal>name</literal>,
+ <literal>length</literal>, et <literal>firstname</literal> sont mappées
+ comme persistantes et à charger immédiatement (ce sont les valeurs
+ par défaut pour les propriétés simples). La valeur de la propriété
+ <literal>detailedComment</literal> sera chargée à partir de la base de
+ données dès que la propriété de l'entité sera accédée pour la première
+ fois. En général vous n'avez pas besoin de marquer de simples propriétés
+ comme "à charger à la demande" (NdT: lazy) (à ne pas confondre avec la
+ récupération d'association "lazy").</para>
+
+ <note>
+ <para>Pour activer la récupération à la demande au niveau de la
+ propriété, vos classes doivent être instrumentées : du bytecode est
+ ajouté au code original pour activer cette fonctionnalité, veuillez
+ vous référer à la documentation de référence d'Hibernate. Si vos
+ classes ne sont pas instrumentées, le chargement à la demande au
+ niveau de la propriété est silencieusement ignoré.</para>
+ </note>
+
+ <para>L'alternative recommandée est d'utiliser la capacité de projection
+ de JPA-QL ou des requêtes Criteria.</para>
+
+ <para>EJB3 prend en charge le mapping de propriété de tous les types
+ élémentaires pris en charge par Hibernate (tous les types de base Java,
+ leur wrapper respectif et les classes sérialisables). Hibernate
+ Annotations prend en charge le mapping des types Enum soit vers une
+ colonne ordinale (en stockant le numéro ordinal de l'enum), soit vers
+ une colonne de type chaîne de caractères (en stockant la chaîne de
+ caractères représentant l'enum) : la représentation de la persistance,
+ par défaut ordinale, peut être surchargée grâce à l'annotation
+ <literal>@Enumerated</literal> comme montré avec la propriété
+ <literal>note</literal> de l'exemple.</para>
+
+ <para>Dans les APIs core de Java, la précision temporelle n'est pas
+ définie. Lors du traitement de données temporelles vous pourriez vouloir
+ décrire la précision attendue dans la base de données. Les données
+ temporelles peuvent avoir une précision de type <literal>DATE</literal>,
+ <literal>TIME</literal>, ou <literal>TIMESTAMP</literal> (c'est-à-dire
+ seulement la date, seulement l'heure, ou les deux). Utilisez
+ l'annotation <literal>@Temporal</literal> pour ajuster cela.</para>
+
+ <para><literal>@Lob</literal> indique que la propriété devrait être
+ persistée dans un Blob ou un Clob selon son type :
+ <classname>java.sql.Clob</classname>,
+ <classname>Character[]</classname>, <classname>char[]</classname> et
+ java.lang.<classname>String</classname> seront persistés dans un Clob.
+ <classname>java.sql.Blob</classname>, <classname>Byte[]</classname>,
+ <classname>byte[] </classname> et les types sérialisables seront
+ persistés dans un Blob.</para>
+
+ <programlisting>
+ at Lob
+public String getFullText() {
+ return fullText;
+}
+
+ at Lob
+public byte[] getFullCode() {
+ return fullCode;
+}
+ </programlisting>
+
+ <para>Si le type de la propriété implémente
+ <classname>java.io.Serializable</classname> et n'est pas un type de
+ base, et si la propriété n'est pas annotée avec <literal>@Lob</literal>,
+ alors le type Hibernate <literal>serializable</literal> est
+ utilisé.</para>
+ </sect3>
+
+ <sect3>
+ <title>Déclarer des attributs de colonne</title>
+
+ <para>La(les) colonne(s) utilisée(s) pour mapper une propriété peuvent
+ être définies en utilisant l'annotation <literal>@Column</literal>.
+ Utilisez-la pour surcharger les valeurs par défaut (voir la
+ spécification EJB3 pour plus d'informations sur les valeurs par défaut).
+ Vous pouvez utilisez cette annotation au niveau de la propriété pour
+ celles qui sont :</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>pas du tout annotées</para>
+ </listitem>
+
+ <listitem>
+ <para>annotées avec <literal>@Basic</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>annotées avec <literal>@Version</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>annotées avec <literal>@Lob</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>annotées avec <literal>@Temporal</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>annotées avec
+ <literal>@org.hibernate.annotations.CollectionOfElements</literal>
+ (pour Hibernate uniquement)</para>
+ </listitem>
+ </itemizedlist>
+
+ <programlisting>
+ at Entity
+public class Flight implements Serializable {
+...
+ at Column(updatable = false, name = "flight_name", nullable = false, length=50)
+public String getName() { ... }
+ </programlisting>
+
+ <para>La propriété <literal>name</literal> est mappée sur la colonne
+ <literal>flight_name</literal>, laquelle ne peut pas avoir de valeur
+ nulle, a une longueur de 50 et ne peut pas être mise à jour (rendant
+ la propriété immuable).</para>
+
+ <para>Cette annotation peut être appliquée aux propriétés habituelles
+ ainsi qu'aux propriétés <literal>@Id</literal> ou
+ <literal>@Version</literal>.</para>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="2 55" id="hm1" />
+
+ <area coords="3 55" id="hm2" />
+
+ <area coords="4 55" id="hm3" />
+
+ <area coords="5 55" id="hm4" />
+
+ <area coords="6 55" id="hm5" />
+
+ <area coords="7 55" id="hm6" />
+
+ <area coords="8 55" id="hm7" />
+
+ <area coords="9 55" id="hm8" />
+
+ <area coords="10 55" id="hm9" />
+
+ <area coords="11 55" id="hm10" />
+ </areaspec>
+
+ <programlisting>@Column(
+ name="columnName";
+ boolean unique() default false;
+ boolean nullable() default true;
+ boolean insertable() default true;
+ boolean updatable() default true;
+ String columnDefinition() default "";
+ String table() default "";
+ int length() default 255;
+ int precision() default 0; // decimal precision
+ int scale() default 0; // decimal scale</programlisting>
+
+ <calloutlist>
+ <callout arearefs="hm1">
+ <para><literal>name</literal> (optionnel) : le nom de la colonne
+ (par défaut le nom de la propriété)</para>
+ </callout>
+
+ <callout arearefs="hm2">
+ <para><literal>unique</literal> (optionnel) : indique si la colonne
+ fait partie d'une contrainte d'unicité ou non (par défaut
+ false)</para>
+ </callout>
+
+ <callout arearefs="hm3">
+ <para><literal>nullable</literal> (optionnel) : indique si la
+ colonne peut avoir une valeur nulle (par défaut false).</para>
+ </callout>
+
+ <callout arearefs="hm4">
+ <para><literal>insertable</literal> (optionnel) : indique si la
+ colonne fera partie de la commande insert (par défaut true)</para>
+ </callout>
+
+ <callout arearefs="hm5">
+ <para><literal>updatable</literal> (optionnel) : indique si la
+ colonne fera partie de la commande update (par défaut true)</para>
+ </callout>
+
+ <callout arearefs="hm6">
+ <para><literal>columnDefinition</literal> (optionnel) : surcharge
+ le fragment DDL sql pour cette colonne en particulier (non
+ portable)</para>
+ </callout>
+
+ <callout arearefs="hm7">
+ <para><literal>table</literal> (optionnel) : définit la table
+ cible (par défaut la table principale)</para>
+ </callout>
+
+ <callout arearefs="hm8">
+ <para><literal><literal>length</literal></literal> (optionnel) :
+ longueur de la colonne (par défaut 255)</para>
+ </callout>
+
+ <callout arearefs="hm8">
+ <para><literal><literal>precision</literal></literal>
+ (optionnel) : précision décimale de la colonne (par défaut
+ 0)</para>
+ </callout>
+
+ <callout arearefs="hm10">
+ <para><literal><literal>scale</literal></literal> (optionnel) :
+ échelle décimale de la colonne si nécessaire (par défaut 0)</para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+ </sect3>
+
+ <sect3>
+ <title>Objets embarqués (alias composants)</title>
+
+ <para>Il est possible de déclarer un composant embarqué à l'intérieur
+ d'une entité et même de surcharger le mapping de ses colonnes. Les
+ classes de composant doivent être annotées au niveau de la classe avec
+ l'annotation <literal>@Embeddable</literal>. Il est possible de
+ surcharger le mapping de colonne d'un objet embarqué pour une entité
+ particulière en utilisant les annotations
+ <literal>@Embedded</literal> et <literal>@AttributeOverride</literal>
+ sur la propriété associée :</para>
+
+ <programlisting>
+ at Entity
+public class Person implements Serializable {
+
+ // Composant persistant utilisant les valeurs par défaut
+ Address homeAddress;
+
+ @Embedded
+ @AttributeOverrides( {
+ @AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),
+ @AttributeOverride(name="name", column = @Column(name="bornCountryName") )
+ } )
+ Country bornIn;
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Embeddable
+public class Address implements Serializable {
+ String city;
+ Country nationality; // par de surcharge ici
+}
+ </programlisting>
+
+ <programlisting>
+ at Embeddable
+public class Country implements Serializable {
+ private String iso2;
+ @Column(name="countryName") private String name;
+
+ public String getIso2() { return iso2; }
+ public void setIso2(String iso2) { this.iso2 = iso2; }
+
+
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ ...
+}
+ </programlisting>
+
+ <para>Un objet embarquable hérite du type d'accès de son entité
+ d'appartenance (notez que vous pouvez surcharger cela en utilisant les
+ annotations spécifiques à Hibernate <literal>@AccessType</literal>,
+ voir <xref linkend="entity-hibspec" />).</para>
+
+ <para>L'entity bean <literal>Person</literal> a deux propriétés
+ composant, <literal>homeAddress</literal> et
+ <literal>bornIn</literal>. La propriété <literal>homeAddress</literal>
+ n'a pas été annotée, mais Hibernate devinera que c'est un composant
+ persistant en cherchant l'annotation <literal>@Embeddable</literal>
+ dans la classe Address. Nous surchargeons aussi le mapping d'un nom de
+ colonne (pour <literal>bornCountryName</literal>) avec les annotations
+ <literal>@Embedded</literal> et <literal>@AttributeOverride</literal>
+ pour chaque attribut mappé de <literal>Country</literal>. Comme vous
+ pouvez le voir, <literal>Country</literal> est aussi un composant
+ imbriqué de <literal>Address</literal>, utilisant de nouveau la
+ détection automatique d'Hibernate et les valeurs par défaut EJB3.
+ Surcharger des colonnes d'objets embarqués d'objets (eux-mêmes)
+ embarqués n'est actuellement pas pris en charge par la spécification
+ EJB3, cependant, Hibernate Annotations le prend en charge à travers des
+ expressions séparées par des points.</para>
+
+ <para><programlisting> @Embedded
+ @AttributeOverrides( {
+ @AttributeOverride(name="city", column = @Column(name="fld_city") )
+ @AttributeOverride(name="<emphasis role="bold">nationality.iso2</emphasis>", column = @Column(name="nat_Iso2") ),
+ @AttributeOverride(name="<emphasis role="bold">nationality.name</emphasis>", column = @Column(name="nat_CountryName") )
+ // les colonnes de nationality dans homeAddress sont surchargées
+ } )
+ Address homeAddress;</programlisting>Hibernate Annotations prend en charge
+ une fonctionnalité de plus qui n'est pas explicitement prise en charge
+ par la spécification EJB3. Vous pouvez annoter un objet embarqué avec
+ l'annotation
+ <literal>@MappedSuperclass</literal> pour rendre les propriétés de la
+ classe parente persistantes (voir <literal>@MappedSuperclass</literal>
+ pour plus d'informations).</para>
+
+ <para>Alors que ce n'est pas pris en charge par la spécification EJB3,
+ Hibernate Annotations vous permet d'utiliser les annotations
+ d'association dans un objet embarquable (ie <literal>@*ToOne</literal>
+ ou <literal>@*ToMany</literal>). Pour surcharger les colonnes de
+ l'association vous pouvez utiliser
+ <literal>@AssociationOverride</literal>.</para>
+
+ <para>Si vous voulez avoir le même type d'objet embarquable deux fois
+ dans la même entité, le nom de colonne par défaut ne fonctionnera pas :
+ au moins une des colonnes devra être explicitée. Hibernate va au-delà
+ de la spécification EJB3 et vous permet d'améliorer le mécanisme par
+ défaut avec <classname>NamingStrategy</classname>.
+ <classname>DefaultComponentSafeNamingStrategy</classname> est une petite
+ amélioration par rapport à la stratégie par défaut
+ <classname>EJB3NamingStrategy</classname> qui permet aux objets
+ embarqués de fonctionner avec leur valeur par défaut même s'ils sont
+ utilisés deux fois dans la même entité.</para>
+ </sect3>
+
+ <sect3>
+ <title>Valeurs par défaut des propriétés non annotées</title>
+
+ <para>Si une propriété n'est pas annotée, les règles suivantes
+ s'appliquent :</para>
+
+ <itemizedlist>
+ <listitem>
+ Si la propriété est de type simple, elle est mappée comme @Basic
+ </listitem>
+
+ <listitem>
+ Sinon, si le type de la propriété est annoté comme @Embeddable,
+ elle est mappée comme @Embedded
+ </listitem>
+
+ <listitem>
+ Sinon, si le type de la propriété est Serializable, elle est mappée
+ comme @Basic vers une colonne contenant l'objet sous sa forme
+ sérialisée
+ </listitem>
+
+ <listitem>
+ Sinon, si le type de la propriété est java.sql.Clob ou
+ java.sql.Blob, elle est mappée comme @Lob avec le LobType
+ approprié
+ </listitem>
+ </itemizedlist>
+ </sect3>
+ </sect2>
+
+ <sect2 id="entity-mapping-identifier"
+ xreflabel="Mapper des propriétés identifiantes">
+ <title>Mapper des propriétés identifiantes</title>
+
+ <para>L'annotation <literal>@Id</literal> vous permet de définir quelle
+ propriété identifie votre entity bean. Cette propriété peut être
+ positionnée par l'application elle-même ou générée par Hibernate
+ (préféré). Vous pouvez définir la stratégie de génération de l'identifiant
+ grâce à l'annotation <literal>@GeneratedValue</literal> :</para>
+
+ <itemizedlist>
+ <listitem>
+ AUTO - soit la colonne identity, soit la séquence, soit la table
+ selon la base de données sous-jacente
+ </listitem>
+
+ <listitem>
+ TABLE - table contenant l'id
+ </listitem>
+
+ <listitem>
+ IDENTITY - colonne identity
+ </listitem>
+
+ <listitem>
+ SEQUENCE - séquence
+ </listitem>
+ </itemizedlist>
+
+ <para>Hibernate fournit plus de générateurs d'identifiant que les simples
+ générateurs EJB3. Vérifiez <xref linkend="entity-hibspec" /> pour plus
+ d'informations.</para>
+
+ <para>L'exemple suivant montre un générateur par séquence utilisant la
+ configuration SEQ_STORE (voir plus bas) :</para>
+
+ <programlisting>
+ at Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
+public Integer getId() { ... }
+ </programlisting>
+
+ <para>L'exemple suivant utilise le générateur identity :</para>
+
+ <programlisting>
+ at Id @GeneratedValue(strategy=GenerationType.IDENTITY)
+public Long getId() { ... }
+ </programlisting>
+
+ <para>Le générateur <literal>AUTO</literal> est le type préféré pour les
+ applications portables (vers différentes base de données). La
+ configuration de la génération d'identifiant peut être partagée par
+ différents mappings <literal>@Id</literal> avec l'attribut du générateur.
+ Il y a différentes configurations disponibles avec
+ <literal>@SequenceGenerator</literal> et
+ <literal>@TableGenerator</literal>. La portée d'un générateur peut être
+ l'application ou la classe. Les générateurs définis dans les classes ne
+ sont pas visibles à l'extérieur de la classe et peuvent surcharger les
+ générateurs de niveau applicatif. Les générateurs de niveau applicatif
+ sont définis au niveau XML (voir
+ <xref linkend="xml-overriding" />) :</para>
+
+ <programlisting><table-generator name="EMP_GEN"
+ table="GENERATOR_TABLE"
+ pk-column-name="key"
+ value-column-name="hi"
+ pk-column-value="EMP"
+ allocation-size="20"/>
+
+// et l'annotation équivalente
+
+ at javax.persistence.TableGenerator(
+ name="EMP_GEN",
+ table="GENERATOR_TABLE",
+ pkColumnName = "key",
+ valueColumnName = "hi"
+ pkColumnValue="EMP",
+ allocationSize=20
+)
+
+<sequence-generator name="SEQ_GEN"
+ sequence-name="my_sequence"
+ allocation-size="20"/>
+
+// et l'annotation équivalente
+
+ at javax.persistence.SequenceGenerator(
+ name="SEQ_GEN",
+ sequenceName="my_sequence",
+ allocationSize=20
+)
+ </programlisting>
+
+ <para>Si JPA XML (comme <filename>META-INF/orm.xml</filename>) est utilisé
+ pour définir les générateurs, <literal>EMP_GEN</literal> et
+ <literal>SEQ_GEN</literal> sont des générateurs de niveau applicatif.
+ <literal>EMP_GEN</literal> définit un générateur d'identifiant basé sur
+ une table utilisant l'algorithme hilo avec un <literal>max_lo</literal> de
+ 20. La valeur haute est conservée dans une <literal>table</literal>
+ "<literal>GENERATOR_TABLE</literal>". L'information est gardée dans une
+ ligne où la colonne <literal>pkColumnName</literal> ("clef") est égale à
+ <literal>pkColumnValue</literal> "<literal>EMP</literal>" et une colonne
+ <literal>valueColumnName</literal> "<literal>hi</literal>" contient la
+ prochaine valeur haute utilisée.</para>
+
+ <para><literal>SEQ_GEN</literal> définit un générateur par séquence
+ utilisant une séquence nommée <literal>my_sequence</literal>. La taille
+ d'allocation utilisée pour cet algorithme hilo basé sur une séquence est
+ 20. Notez que cette version d'Hibernate Annotations ne gère pas
+ <literal>initialValue</literal> dans le générateur par séquence.
+ La taille par défaut de l'allocation est 50, donc si vous voulez utiliser
+ une séquence et récupérer la valeur chaque fois, vous devez positionner
+ la taille de l'allocation à 1.</para>
+
+ <note>
+ <para>La définition au niveau package n'est plus prise en charge par la
+ spécification EJB 3.0. Vous pouvez cependant utiliser
+ <literal>@GenericGenerator</literal> au niveau du package (voir <xref
+ linkend="entity-hibspec-identifier" />).</para>
+ </note>
+
+ <para>Le prochain exemple montre la définition d'un générateur par
+ séquence dans la portée d'une classe :</para>
+
+ <programlisting>
+ at Entity
+ at javax.persistence.SequenceGenerator(
+ name="SEQ_STORE",
+ sequenceName="my_sequence"
+)
+public class Store implements Serializable {
+ private Long id;
+
+ @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
+ public Long getId() { return id; }
+}
+ </programlisting>
+
+ <para>Cette classe utilisera une séquence nommée my_sequence et le
+ générateur SEQ_STORE n'est pas visible dans les autres classes. Notez que
+ vous pouvez regarder les tests unitaires d'Hibernate Annotations dans le
+ package org.hibernate.test.metadata.id pour plus d'exemples.</para>
+
+ <para>Vous pouvez définir une clef primaire composée à travers différentes
+ syntaxes :</para>
+
+ <itemizedlist>
+ <listitem>
+ annote la propriété du composant comme @Id et rend la classe du
+ composant @Embeddable
+ </listitem>
+
+ <listitem>
+ annote la propriété du composant comme @EmbeddedId
+ </listitem>
+
+ <listitem>
+ annote la classe comme @IdClass et annote chaque propriété de
+ l'entité impliquée dans la clef primaire avec @Id
+ </listitem>
+ </itemizedlist>
+
+ <para>Bien qu'assez commun pour le développeur EJB2,
+ <literal>@IdClass</literal> est probablement nouveau pour les utilisateurs
+ d'Hibernate. La classe de la clef primaire composée correspond aux
+ multiples champs ou propriétés de l'entité ; de plus, les noms des champs
+ ou propriétés de la clef primaire et ceux de l'entité doivent
+ correspondre ; et enfin, leur type doit être le même. Regardons un
+ exemple :</para>
+
+ <programlisting>@Entity
+<emphasis role="bold">@IdClass(FootballerPk.class)</emphasis>
+public class Footballer {
+ // partie de la clef
+ <emphasis role="bold">@Id</emphasis> public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ // partie de la clef
+ <emphasis role="bold">@Id</emphasis> public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public String getClub() {
+ return club;
+ }
+
+ public void setClub(String club) {
+ this.club = club;
+ }
+
+ // implémentation appropriée de equals() et hashCode()
+}
+
+ at Embeddable
+public class FootballerPk implements Serializable {
+ // même nom et même type que dans Footballer
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ // même nom et même type que dans Footballer
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ // implémentation appropriée de equals() et hashCode()
+}
+</programlisting>
+
+ <para>Comme vous pouvez le voir, <literal>@IdClass</literal> pointe vers
+ la classe de la clef primaire correspondante.</para>
+
+ <para>Bien que ce ne soit pas pris en charge par la spécification EJB3,
+ Hibernate vous permet de définir des associations à l'intérieur d'un
+ identifiant composé. Pour cela, utilisez simplement les annotations
+ habituelles.</para>
+
+ <programlisting>@Entity
+ at AssociationOverride( name="id.channel", joinColumns = @JoinColumn(name="chan_id") )
+public class TvMagazin {
+ @EmbeddedId public TvMagazinPk id;
+ @Temporal(TemporalType.TIME) Date time;
+}
+
+ at Embeddable
+public class TvMagazinPk implements Serializable {
+ @ManyToOne
+ public Channel channel;
+ public String name;
+ @ManyToOne
+ public Presenter presenter;
+}
+</programlisting>
+ </sect2>
+
+ <sect2>
+ <title>Mapper l'héritage</title>
+
+ <para>EJB3 prend en charge les trois types d'héritage :</para>
+
+ <itemizedlist>
+ <listitem>
+ Stratégie d'une table par classe concrète : l'élément
+ <union-class> dans Hibernate
+ </listitem>
+
+ <listitem>
+ Stratégie d'une seule table par hiérarchie de classe : l'élément
+ <subclass> dans Hibernate
+ </listitem>
+
+ <listitem>
+ Stratégie d'une table par classe fille : l'élément
+ <joined-subclass> dans Hibernate
+ </listitem>
+ </itemizedlist>
+
+ <para>La stratégie choisie est déclarée au niveau de la classe de l'entité
+ la plus haute dans la hiérarhie en utilisant l'annotation
+ <literal>@Inheritance</literal>.</para>
+
+ <note>
+ <para>Annoter des interfaces n'est pour le moment pas pris en
+ charge.</para>
+ </note>
+
+ <sect3>
+ <title>Une table par classe concrète</title>
+
+ <para>Cette stratégie a beaucoup d'inconvénients (surtout avec les
+ requêtes polymorphiques et les associations) expliqués dans la
+ spécification EJB3, la documentation de référence d'Hibernate, Hibernate
+ in Action, et plusieurs autres endroits. Hibernate en contourne la
+ plupart en implémentant cette stratégie en utilisant des requêtes
+ <literal>SQL UNION</literal>. Elle est habituellement utilisée pour le
+ niveau le plus haut d'une hiérarchie d'héritage :</para>
+
+ <programlisting>
+ at Entity
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Flight implements Serializable {
+ </programlisting>
+
+ <para>Cette stratégie prend en charge les associations de un vers
+ plusieurs bidirectionnelles. Cette stratégie ne prend pas en charge
+ la stratégie de générateur <literal>IDENTITY</literal> : l'identifiant
+ doit être partagé par plusieurs tables. Par conséquent, lors de
+ l'utilisation de cette stratégie, vous ne devriez pas utilisez
+ <literal>AUTO</literal> ni <literal>IDENTITY</literal>.</para>
+ </sect3>
+
+ <sect3>
+ <title>Une seule table par hiérarchie de classe</title>
+
+ <para>Toutes les propriétés de toutes les classes parentes et classes
+ filles sont mappées dans la même table, les instances sont différenciées
+ par une colonne spéciale discriminante :</para>
+
+ <programlisting>
+ at Entity
+ at Inheritance(strategy=InheritanceType.SINGLE_TABLE)
+ at DiscriminatorColumn(
+ name="planetype",
+ discriminatorType=DiscriminatorType.STRING
+)
+ at DiscriminatorValue("Plane")
+public class Plane { ... }
+
+ at Entity
+ at DiscriminatorValue("A320")
+public class A320 extends Plane { ... }
+ </programlisting>
+
+ <para><classname>Plane</classname> est la classe parente, elle définit
+ la stratégie d'héritage <literal>InheritanceType.SINGLE_TABLE</literal>.
+ Elle définit aussi la colonne discriminante avec l'annotation
+ <literal>@DiscriminatorColumn</literal>, une colonne discriminante peut
+ aussi définir le type du discriminant. Finalement, l'annotation
+ <literal>@DiscriminatorValue</literal> définit la valeur utilisée pour
+ différencier une classe dans la hiérarchie. Tous ces attributs ont des
+ valeurs par défaut sensées. Le nom par défaut de la colonne
+ discriminante est <literal>DTYPE</literal>. La valeur discriminante par
+ défaut est le nom de l'entité (comme défini dans
+ <literal>@Entity.name</literal>) avec le type
+ <literal>DiscriminatorType.STRING</literal>. <classname>A320</classname>
+ est une classe fille ; vous devez seulement définir la valeur
+ discriminante si vous ne voulez pas utiliser la valeur par défaut. La
+ stratégie et le type du discriminant sont implicites.</para>
+
+ <para><literal>@Inheritance</literal> et
+ <literal>@DiscriminatorColumn</literal> devraient seulement être
+ définies sur l'entité la plus haute de la hiérarchie.</para>
+ </sect3>
+
+ <sect3>
+ <title>Une table par classe fille</title>
+
+ <para>Les annotations <literal> @PrimaryKeyJoinColumn</literal> et
+ <literal>@PrimaryKeyJoinColumns</literal> définissent la (les) clef(s)
+ primaire(s) de la table de la classe fille jointe :</para>
+
+ <programlisting>
+ at Entity
+ at Inheritance(strategy=InheritanceType.JOINED)
+public class Boat implements Serializable { ... }
+
+ at Entity
+public class Ferry extends Boat { ... }
+
+ at Entity
+ at PrimaryKeyJoinColumn(name="BOAT_ID")
+public class AmericaCupClass extends Boat { ... }
+ </programlisting>
+
+ <para>Toutes les entités ci-dessus utilisent la stratégie
+ <literal>JOINED</literal>, la table <literal>Ferry</literal> est jointe
+ avec la table <literal>Boat</literal> en utilisant les mêmes noms de
+ clef primaire. La table <literal>AmericaCupClass</literal> est jointe
+ avec <literal>Boat</literal> en utilisant la condition de jointure
+ <code>Boat.id = AmericaCupClass.BOAT_ID</code>.</para>
+ </sect3>
+
+ <sect3>
+ <title>Héritage de propriétés des classes parentes</title>
+
+ <para>Il est parfois utile de partager des propriétés communes à travers
+ une classe technique ou métier sans l'inclure comme une entité
+ habituelle (c'est-à-dire aucune table spécifique pour cette entité).
+ Pour cela, vous pouvez les mapper comme
+ <literal>@MappedSuperclass</literal>.</para>
+
+ <programlisting>@MappedSuperclass
+public class BaseEntity {
+ @Basic
+ @Temporal(TemporalType.TIMESTAMP)
+ public Date getLastUpdate() { ... }
+ public String getLastUpdater() { ... }
+ ...
+}
+
+ at Entity class Order extends BaseEntity {
+ @Id public Integer getId() { ... }
+ ...
+}</programlisting>
+
+ <para>En base de données, cette hiérarchie sera représentée comme une
+ table <literal>Order</literal> ayant les colonnes <literal>id</literal>,
+ <literal>lastUpdate</literal> et <literal>lastUpdater</literal>.
+ Les mappings de propriété de la classe parente embarquée sont copiés
+ dans les classes filles de l'entité. Souvenez-vous que la classe parente
+ embarquable n'est cependant pas la racine de la hiérarchie.</para>
+
+ <note>
+ <para>Les propriétés des classes parentes non mappées comme
+ <literal>@MappedSuperclass</literal> sont ignorées.</para>
+ </note>
+
+ <note>
+ <para>Le type d'accès (champ ou méthode) est hérité de l'entité
+ racine, à moins que vous utilisiez l'annotation Hibernate
+ <literal>@AccessType</literal>.</para>
+ </note>
+
+ <note>
+ <para>La même notion peut être appliquée aux objets
+ <literal>@Embeddable</literal> pour persister des propriétés de leurs
+ classes parentes. Vous avez aussi besoin d'utiliser
+ <literal>@MappedSuperclass</literal> pour faire ça (cependant cela ne
+ devrait pas être considéré comme une fonctionnalité EJB3
+ standard).</para>
+ </note>
+
+ <note>
+ <para>Il est permis de marquer une classe comme
+ <literal>@MappedSuperclass</literal> dans le milieu d'une hiérarchie
+ d'héritage mappée.</para>
+ </note>
+
+ <note>
+ <para>Toute classe de la hiérarchie non annotée avec
+ <literal>@MappedSuperclass</literal> ou <literal>@Entity</literal>
+ sera ignorée.</para>
+ </note>
+
+ <para>Vous pouvez surcharger des colonnes définies dans des entités
+ parentes au niveau de l'entité racine en utilisant l'annotation
+ <literal>@AttributeOverride</literal>.</para>
+
+ <programlisting>@MappedSuperclass
+public class FlyingObject implements Serializable {
+
+ public int getAltitude() {
+ return altitude;
+ }
+
+ @Transient
+ public int getMetricAltitude() {
+ return metricAltitude;
+ }
+
+ @ManyToOne
+ public PropulsionType getPropulsion() {
+ return metricAltitude;
+ }
+ ...
+}
+
+ at Entity
+ at AttributeOverride( name="altitude", column = @Column(name="fld_altitude") )
+ at AssociationOverride( name="propulsion", joinColumns = @JoinColumn(name="fld_propulsion_fk") )
+public class Plane extends FlyingObject {
+ ...
+}</programlisting>
+
+ <para>La propriété <literal>altitude</literal> sera persistée dans la
+ colonne <literal>fld_altitude</literal> de la table
+ <literal>Plane</literal> et l'association <literal>propulsion</literal>
+ sera matérialisée dans la colonne de clef étrangère
+ <literal>fld_propulsion_fk</literal>.</para>
+
+ <para>Vous pouvez définir <literal>@AttributeOverride</literal>(s) et
+ <literal>@AssociationOverride</literal>(s) sur des classes
+ <literal>@Entity</literal>, des classes
+ <literal>@MappedSuperclass</literal> et des propriétés pointant vers un
+ objet <literal>@Embeddable</literal>.</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="entity-mapping-association">
+ <title>Mapper des associations/relations d'entity beans</title>
+
+ <sect3>
+ <title>One-to-one</title>
+
+ <para>Vous pouvez associer des entity beans avec une relation one-to-one
+ en utilisant <literal>@OneToOne</literal>. Il y a trois cas pour les
+ associations one-to-one : soit les entités associées partagent les mêmes
+ valeurs de clef primaire, soit une clef étrangère est détenue par une
+ des entités (notez que cette colonne de clef étrangère dans la base de
+ données devrait être avoir une contrainte d'unicité pour simuler la
+ cardinalité one-to-one), soit une table d'association est utilisée pour
+ stocker le lien entre les 2 entités (une contrainte d'unicité doit être
+ définie sur chaque clef étrangère pour assurer la cardinalité un à
+ un).</para>
+
+ <para>Tout d'abord, nous mappons une véritable association one-to-one en
+ utilisant des clefs primaires partagées :</para>
+
+ <programlisting>
+ at Entity
+public class Body {
+ @Id
+ public Long getId() { return id; }
+
+ @OneToOne(cascade = CascadeType.ALL)
+ @PrimaryKeyJoinColumn
+ public Heart getHeart() {
+ return heart;
+ }
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Entity
+public class Heart {
+ @Id
+ public Long getId() { ...}
+}
+ </programlisting>
+
+ <para>L'association un à un est activée en utilisant l'annotation
+ <literal>@PrimaryKeyJoinColumn</literal>.</para>
+
+ <para>Dans l'exemple suivant, les entités associées sont liées à travers
+ une clef étrangère :</para>
+
+ <programlisting>
+ at Entity
+public class Customer implements Serializable {
+ @OneToOne(cascade = CascadeType.ALL)
+ <emphasis role="bold">@JoinColumn(name="passport_fk")</emphasis>
+ public Passport getPassport() {
+ ...
+ }
+
+ at Entity
+public class Passport implements Serializable {
+ @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
+ public Customer getOwner() {
+ ...
+}
+ </programlisting>
+
+ <para>Un <classname>Customer</classname> est lié à un
+ <classname>Passport</classname>, avec une colonne de clef étrangère
+ nommée <literal>passport_fk</literal> dans la table
+ <literal>Customer</literal>. La colonne de jointure est déclarée avec
+ l'annotation <literal>@JoinColumn</literal> qui ressemble à l'annotation
+ <literal>@Column</literal>. Elle a un paramètre de plus nommé
+ <literal>referencedColumnName</literal>. Ce paramètre déclare la colonne
+ dans l'entité cible qui sera utilisée pour la jointure. Notez que lors
+ de l'utilisation de <literal>referencedColumnName</literal> vers une
+ colonne qui ne fait pas partie de la clef primaire, la classe associée
+ doit être <classname>Serializable</classname>. Notez aussi que
+ <literal>referencedColumnName</literal> doit être mappé sur une
+ propriété ayant une seule colonne lorsqu'elle pointe vers une colonne
+ qui ne fait pas partie de la clef primaire (d'autres cas pourraient ne
+ pas fonctionnner).</para>
+
+ <para>L'association peut être bidirectionnelle. Dans une relation
+ bidirectionnelle, une des extrémités (et seulement une) doit être la
+ propriétaire : la propriétaire est responsable de la mise à jour des
+ colonnes de l'association. Pour déclarer une extrémité comme
+ <emphasis>non</emphasis> responsable de la relation, l'attribut
+ <literal>mappedBy</literal> est utilisé.
+ <literal>mappedBy</literal> référence le nom de la propriété de
+ l'association du côté du propriétaire. Dans notre cas, c'est
+ <literal>passport</literal>. Comme vous pouvez le voir, vous ne devez
+ (absolument) pas déclarer la colonne de jointure puisqu'elle a déjà été
+ déclarée du côté du propriétaire.</para>
+
+ <para>Si aucune <literal>@JoinColumn</literal> n'est déclarée du côté du
+ propriétaire, les valeurs par défaut s'appliquent. Une(des) colonne(s)
+ de jointure sera(ont) créée(s) dans la table propriétaire, et son(leur)
+ nom sera la concaténation du nom de la relation du côté propriétaire,
+ <keycap>_</keycap> (underscore), et le nom de la (des) colonne(s) de la
+ clef primaire du propriétaire. Dans cet exemple
+ <literal>passport_id</literal> parce que le nom de la propriété est
+ <literal>passport</literal> et la colonne identifiante de
+ <literal>Passport</literal> est <literal>id</literal>.</para>
+
+ <para>La troisième possibilité (utilisant une table d'association) est
+ très exotique.</para>
+
+ <programlisting>
+ at Entity
+public class Customer implements Serializable {
+ @OneToOne(cascade = CascadeType.ALL)
+ <emphasis role="bold">@JoinTable(name = "CustomerPassports"
+ joinColumns = @JoinColumn(name="customer_fk"),
+ inverseJoinColumns = @JoinColumns(name="passport_fk")</emphasis>
+ )
+ public Passport getPassport() {
+ ...
+ }
+
+ at Entity
+public class Passport implements Serializable {
+ @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
+ public Customer getOwner() {
+ ...
+}
+ </programlisting>
+
+ <para>Un <classname>Customer</classname> est lié à un
+ <classname>Passport</classname> à travers une table d'association
+ nommée <literal>CustomerPassports</literal> ; cette table d'association
+ a une colonne de clef étrangère nommée <literal>passport_fk</literal>
+ pointant vers la table <literal>Passport</literal> (matérialisée par
+ l'attribut <literal>inverseJoinColumn</literal>), et une colonne de clef
+ étrangère nommée <literal>customer_fk</literal> pointant vers la table
+ <literal>Customer</literal> (matérialisée par l'attribut
+ <literal>joinColumns</literal>).</para>
+
+ <para>Vous devez déclarer le nom de la table de jointure et les colonnes
+ de jointure explicitement dans un tel mapping.</para>
+ </sect3>
+
+ <sect3>
+ <title>Many-to-one</title>
+
+ <para>Les associations Many-to-one sont déclarées au niveau de la
+ propriété avec l'annotation <literal>@ManyToOne</literal> :</para>
+
+ <programlisting>
+ at Entity()
+public class Flight implements Serializable {
+ <emphasis role="bold">@ManyToOne</emphasis>( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
+ @JoinColumn(name="COMP_ID")
+ public Company getCompany() {
+ return company;
+ }
+ ...
+}
+ </programlisting>
+
+ <para>L'attribut <literal>@JoinColumn</literal> est optionnel, la valeur
+ par défaut est comme l'association un à un, la concaténation du nom
+ de la relation du côté propriétaire, <keycap>_</keycap>
+ (underscore), et le nom de la colonne de la clef primaire du côté
+ propriétaire. Dans cet exemple, <literal>company_id</literal> parce que
+ le nom de la propriété est <literal>company</literal> et la colonne
+ identifiante de Company est <literal>id</literal>.</para>
+
+ <para><literal>@ManyToOne</literal> a un paramètre nommé
+ <literal>targetEntity</literal> qui décrit le nom de l'entité cible.
+ Généralement, vous ne devriez pas avoir besoin de ce paramètre puisque
+ la valeur par défaut (le type de la propriété qui stocke l'association)
+ est correcte dans la plupart des cas. Il est cependant utile lorsque
+ vous souhaitez retourner une interface plutôt qu'une entité
+ normale.</para>
+
+ <programlisting>
+ at Entity()
+public class Flight implements Serializable {
+ @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, <emphasis
+ role="bold">targetEntity=CompanyImpl.class</emphasis> )
+ @JoinColumn(name="COMP_ID")
+ public Company getCompany() {
+ return company;
+ }
+ ...
+}
+
+public interface Company {
+ ...
+ </programlisting>
+
+ <para>Vous pouvez sinon mapper une association plusieurs à un avec une
+ table d'association. Cette association décrite par l'annotation
+ <literal>@JoinTable</literal> contiendra une clef étrangère référençant
+ la table de l'entité (avec
+ <literal>@JoinTable.joinColumns</literal>) et une clef étrangère
+ référençant la table de l'entité cible (avec
+ <literal>@JoinTable.inverseJoinColumns</literal>).</para>
+
+ <programlisting>
+ at Entity()
+public class Flight implements Serializable {
+ @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
+ <emphasis role="bold">@JoinTable(name="Flight_Company",
+ joinColumns = @JoinColumn(name="FLIGHT_ID"),
+ inverseJoinColumns = @JoinColumns(name="COMP_ID")
+ )</emphasis>
+ public Company getCompany() {
+ return company;
+ }
+ ...
+}
+ </programlisting>
+ </sect3>
+
+ <sect3 id="entity-mapping-association-collections">
+ <title>Collections</title>
+
+ <sect4 id="entity-mapping-association-collections-overview"
+ revision="1">
+ <title>Vue d'ensemble</title>
+
+ <para>Vous pouvez mapper des <classname>Collection</classname>s, des
+ <literal>List</literal>s (ie des listes ordonnées, pas des listes
+ indexées), des <literal>Map</literal>s et des
+ <classname>Set</classname>s. La spécification EJB3 décrit comment
+ mapper une liste ordonnée (ie une liste ordonnée au chargement) en
+ utilisant l'annotation <literal>@javax.persistence.OrderBy</literal> :
+ pour ordonner la collection, cette annotation prend en paramètre une
+ liste de propriétés (de l'entité cible) séparées par des virgules
+ (p. ex. <code>firstname asc, age desc</code>) ; si la chaîne de
+ caractères est vide, la collection sera ordonnée par les identifiants.
+ Pour le moment <literal>@OrderBy</literal> fonctionne seulement sur
+ des collections n'ayant pas de table d'association. Pour les
+ véritables collections indexées, veuillez vous référer à
+ <xref linkend="entity-hibspec" />. EJB3 vous permet de mapper des
+ <literal>Map</literal>s en utilisant comme clef une des propriétés de
+ l'entité cible avec <literal>@MapKey(name="myProperty")</literal>
+ (myProperty est un nom de propriété de l'entité cible). Lorsque vous
+ utilisez <literal>@MapKey</literal> sans nom de propriété, la clef
+ primaire de l'entité cible est utilisée. La clef de la map utilise la
+ même colonne que celle pointée par la propriété : il n'y a pas de
+ colonne supplémentaire définie pour la clef de la map, et c'est normal
+ puisque la clef de la map représente en fait un propriété de la cible.
+ Faites attention qu'une fois chargée, la clef n'est plus synchronisée
+ avec la propriété, en d'autres mots, si vous modifiez la valeur de la
+ propriété, la clef ne sera pas changée automatiquement dans votre
+ modèle Java (pour une véritable prise en charge des maps veuillez vous
+ référer à <xref linkend="entity-hibspec" />). Beaucoup de gens
+ confondent les capacités de <literal><map></literal> et celles
+ de <literal>@MapKey</literal>. Ce sont deux fonctionnalités
+ différentes. <literal>@MapKey</literal> a encore quelques limitations,
+ veuillez vous référer au forum ou au système de suivi de bogues JIRA
+ pour plus d'informations.</para>
+
+ <para>Hibernate a plusieurs notions de collections.</para>
+
+ <para></para>
+
+ <table>
+ <title>Sémantique des collections</title>
+
+ <tgroup cols="3">
+ <colspec colname="c1" />
+
+ <colspec colname="c2" />
+
+ <colspec colname="c3" colnum="2" />
+
+ <thead>
+ <row>
+ <entry>Sémantique</entry>
+
+ <entry>Représentation Java</entry>
+
+ <entry>Annotations</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>Sémantique de Bag</entry>
+
+ <entry>java.util.List, java.util.Collection</entry>
+
+ <entry>@org.hibernate.annotations.CollectionOfElements ou
+ @OneToMany ou @ManyToMany</entry>
+ </row>
+
+ <row>
+ <entry>Sémantique de Bag avec une clef primaire (sans les
+ limitations de la sémantique de Bag)</entry>
+
+ <entry>java.util.List, java.util.Collection</entry>
+
+ <entry>(@org.hibernate.annotations.CollectionOfElements ou
+ @OneToMany ou @ManyToMany) et @CollectionId</entry>
+ </row>
+
+ <row>
+ <entry>Sémantique de List</entry>
+
+ <entry>java.util.List</entry>
+
+ <entry>(@org.hibernate.annotations.CollectionOfElements ou
+ @OneToMany ou @ManyToMany) et
+ @org.hibernate.annotations.IndexColumn</entry>
+ </row>
+
+ <row>
+ <entry>Sémantique de Set</entry>
+
+ <entry>java.util.Set</entry>
+
+ <entry>@org.hibernate.annotations.CollectionOfElements ou
+ @OneToMany ou @ManyToMany</entry>
+ </row>
+
+ <row>
+ <entry>Sémantique de Map</entry>
+
+ <entry>java.util.Map</entry>
+
+ <entry>(@org.hibernate.annotations.CollectionOfElements ou
+ @OneToMany ou @ManyToMany) et (rien ou
+ @org.hibernate.annotations.MapKey/MapKeyManyToMany pour une
+ véritable prise en charge des maps, ou
+ @javax.persistence.MapKey</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <remark>Donc spécifiquement, les collections java.util.List sans
+ @org.hibernate.annotations.IndexColumn vont être considérées commes
+ des bags.</remark>
+
+ <para>Les collections de types primitifs, de types core ou d'objets
+ embarqués ne sont pas prises en charge par la spécification EJB3.
+ Cependant Hibernate Annotations les autorise
+ (voir <xref linkend="entity-hibspec" />).</para>
+
+ <programlisting>@Entity public class City {
+ @OneToMany(mappedBy="city")
+ <emphasis role="bold">@OrderBy("streetName")</emphasis>
+ public List<Street> getStreets() {
+ return streets;
+ }
+...
+}
+
+ at Entity public class Street {
+ <emphasis role="bold">public String getStreetName()</emphasis> {
+ return streetName;
+ }
+
+ @ManyToOne
+ public City getCity() {
+ return city;
+ }
+ ...
+}
+
+
+ at Entity
+public class Software {
+ @OneToMany(mappedBy="software")
+ <emphasis role="bold">@MapKey(name="codeName")</emphasis>
+ public Map<String, Version> getVersions() {
+ return versions;
+ }
+...
+}
+
+ at Entity
+ at Table(name="tbl_version")
+public class Version {
+ <emphasis role="bold">public String getCodeName()</emphasis> {...}
+
+ @ManyToOne
+ public Software getSoftware() { ... }
+...
+}</programlisting>
+
+ <para>Donc <literal>City</literal> a une collection de
+ <literal>Street</literal>s qui sont ordonnées par
+ <literal>streetName</literal> (de <literal>Street</literal>) lorsque
+ la collection est chargée. <literal>Software</literal> a une map de
+ <literal>Version</literal>s dont la clef est
+ <literal>codeName</literal> de <literal>Version</literal>.</para>
+
+ <para>A moins que la collection soit une "generic", vous devrez
+ définir <literal>targetEntity</literal>. C'est un attribut de
+ l'annotation qui prend comme valeur la classe de l'entité
+ cible.</para>
+ </sect4>
+
+ <sect4 id="entity-mapping-association-collection-onetomany"
+ revision="2">
+ <title>One-to-many</title>
+
+ <para>Les associations one-to-many sont déclarées au niveau propriété
+ avec l'annotation <literal>@OneToMany</literal>. Les associations un
+ à plusieurs peuvent être bidirectionnelles.</para>
+
+ <sect5>
+ <title>Relation bidirectionnelle</title>
+
+ <para>Puisque les associations plusieurs à un sont (presque)
+ toujours l'extrémité propriétaire de la relation bidirectionnelle
+ dans la spécification EJB3, l'association un à plusieurs est
+ annotée par <literal>@OneToMany(mappedBy=...)</literal>.</para>
+
+ <programlisting>@Entity
+public class Troop {
+ @OneToMany(mappedBy="troop")
+ public Set<Soldier> getSoldiers() {
+ ...
+}
+
+ at Entity
+public class Soldier {
+ @ManyToOne
+ @JoinColumn(name="troop_fk")
+ public Troop getTroop() {
+ ...
+} </programlisting>
+
+ <para><classname>Troop</classname> a une relation bidirectionnelle
+ un à plusieurs avec <literal>Soldier</literal> à travers la
+ propriété <literal>troop</literal>. Vous ne devez pas définir
+ de mapping physique à l'extrémité de
+ <literal>mappedBy</literal>.</para>
+
+ <para>Pour mapper une relation bidirectionnelle un à plusieurs, avec
+ l'extrémité one-to-many comme extrémité propriétaire, vous devez
+ enlever l'élément <literal>mappedBy</literal> et marquer
+ l'annotation <literal>@JoinColumn</literal> de l'extrémité plusieurs
+ à un comme ne pouvant pas être insérée et ni mise à jour. Cette
+ solution n'est certainement pas optimisée et produira quelques
+ commandes UPDATE supplémentaires.</para>
+
+ <programlisting>@Entity
+public class Troop {
+ @OneToMany
+ @JoinColumn(name="troop_fk") // nous avons besoin de dupliquer l'information physique
+ public Set<Soldier> getSoldiers() {
+ ...
+}
+
+ at Entity
+public class Soldier {
+ @ManyToOne
+ @JoinColumn(name="troop_fk", insertable=false, updatable=false)
+ public Troop getTroop() {
+ ...
+}</programlisting>
+ </sect5>
+
+ <sect5>
+ <title>Relation unidirectionnelle</title>
+
+ <para>Une relation un à plusieurs unidirectionnelle utilisant une
+ colonne de clef étrangère de l'entité propriétaire n'est pas si
+ commune, réellement recommandée. Nous vous conseillons
+ fortement d'utiliser une table de jointure pour cette sorte
+ d'association (comme expliqué dans la prochaine section). Cette
+ sorte d'association est décrite à travers
+ <literal>@JoinColumn</literal>.</para>
+
+ <programlisting>
+ at Entity
+public class Customer implements Serializable {
+ @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+ @JoinColumn(name="CUST_ID")
+ public Set<Ticket> getTickets() {
+ ...
+}
+
+ at Entity
+public class Ticket implements Serializable {
+ ... // pas de relation bidirectionnelle
+}
+ </programlisting>
+
+ <para><literal>Customer</literal> décrit une relation
+ unidirectionnelle avec <literal>Ticket</literal> en utilisant la
+ colonne de jointure <literal>CUST_ID</literal>.</para>
+ </sect5>
+
+ <sect5>
+ <title>Relation unidirectionnel avec une table de jointure</title>
+
+ <para>Une relation unidirectionnelle un à plusieurs avec une table
+ de jointure est largement préférée. Cette association est décrite
+ à travers l'annotation <literal>@JoinTable</literal>.</para>
+
+ <programlisting>
+ at Entity
+public class Trainer {
+ @OneToMany
+ @JoinTable(
+ name="TrainedMonkeys",
+ joinColumns = { @JoinColumn( name="trainer_id") },
+ inverseJoinColumns = @JoinColumn( name="monkey_id")
+ )
+ public Set<Monkey> getTrainedMonkeys() {
+ ...
+}
+
+ at Entity
+public class Monkey {
+ ... // pas de relation bidirectionnelle
+}
+ </programlisting>
+
+ <para><literal>Trainer</literal> décrit une relation
+ unidirectionelle avec <classname>Monkey</classname> en utilisant la
+ table de jointure <classname>TrainedMonkeys</classname>, avec une
+ clef étrangère <literal>trainer_id</literal> vers
+ <literal>Trainer</literal> (<literal>joinColumns</literal>) et une
+ clef étrangère <literal>monkey_id</literal> vers
+ <literal>Monkey</literal>
+ (<literal>inversejoinColumns</literal>).</para>
+ </sect5>
+
+ <sect5 id="entity-mapping-association-collection-manytomany-default"
+ revision="1">
+ <title>Valeurs par défaut</title>
+
+ <para>Si aucun mapping physique n'est déclaré, une relation
+ unidirectionnelle un vers plusieurs utilise une table de jointure.
+ Le nom de la table est la concaténation du nom de la table
+ propriétaire, <keycap>_</keycap>, et le nom de la table de l'autre
+ extrémité. Le nom des colonnes de la clef étrangère référençant la
+ table propriétaire est la concaténation de la table propriétaire,
+ <keycap>_</keycap>, et le nom des colonnes de la clef primaire. Le
+ nom des colonnes de la clef étrangère référençant l'autre extrémité
+ est la concaténation du nom de la propriété du propriétaire,
+ <keycap>_</keycap>, et le nom des colonnes de la clef primaire de
+ l'autre extrémité. Une contrainte d'unicité est ajoutée sur la
+ clef étrangère référençant la table de l'autre extrémité pour
+ réfléter le un à plusieurs.</para>
+
+ <programlisting>
+ at Entity
+public class Trainer {
+ @OneToMany
+ public Set<Tiger> getTrainedTigers() {
+ ...
+}
+
+ at Entity
+public class Tiger {
+ ... // non bidirectionnelle
+}
+ </programlisting>
+
+ <para><classname>Trainer</classname> décrit une relation
+ unidirectionnelle avec <classname>Tiger</classname> utilisant la
+ table de jointure <literal>Trainer_Tiger</literal>, avec une clef
+ étrangère <literal>trainer_id</literal> vers
+ <literal>Trainer</literal> (nom de la table, <keycap>_</keycap>,
+ identifiant de trainer) et une clef étrangère
+ <literal>trainedTigers_id</literal> vers <literal>Monkey</literal>
+ (nom de la propriété, <keycap>_</keycap>, colonne de la clef
+ primaire de Tiger).</para>
+ </sect5>
+ </sect4>
+
+ <sect4 id="eentity-mapping-association-collection-manytomany"
+ revision="">
+ <title>Many-to-many</title>
+
+ <sect5>
+ <title>Définition</title>
+
+ <para>Une association many-to-many est définie logiquement en
+ utilisant l'annotation <literal>@ManyToMany</literal>. Vous devez
+ aussi décrire la table d'association et les conditions de jointure
+ en utilisant l'annotation <literal>@JoinTable</literal>. Si
+ l'association est bidirectionnelle, une extrémité doit être la
+ propriétaire et l'autre doit être marquée comme "inverse" (ie
+ qu'elle sera ignorée lors de la mise à jour des valeurs de la
+ relation dans la table d'association) :</para>
+
+ <programlisting>
+ at Entity
+public class Employer implements Serializable {
+ @ManyToMany(
+ targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,
+ cascade={CascadeType.PERSIST, CascadeType.MERGE}
+ )
+ @JoinTable(
+ name="EMPLOYER_EMPLOYEE",
+ joinColumns={@JoinColumn(name="EMPER_ID")},
+ inverseJoinColumns={@JoinColumn(name="EMPEE_ID")}
+ )
+ public Collection getEmployees() {
+ return employees;
+ }
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Entity
+public class Employee implements Serializable {
+ @ManyToMany(
+ cascade={CascadeType.PERSIST, CascadeType.MERGE},
+ mappedBy="employees"
+ targetEntity=Employer.class
+ )
+ public Collection getEmployers() {
+ return employers;
+ }
+}
+ </programlisting>
+
+ <para>Nous avons déjà montré les déclarations des relations
+ "many" et détaillé les attributs de ces associations. Allons
+ plus en profondeur dans la description de
+ <literal>@JoinTable</literal> ; elle définit un
+ <literal>name</literal>, un tableau de colonnes de jointure (un
+ tableau dans une annotation est défini par {A, B, C}), et un tableau
+ de colonnes de jointure inverse. Ces dernières sont les colonnes
+ de la table d'association qui référencent la clef primaire de
+ <classname>Employee</classname> ("l'autre extrémité").</para>
+
+ <para>Comme vu précédemment, l'autre extrémité ne doit pas décrire
+ le mapping physique : un simple argument
+ <literal>mappedBy</literal> contenant le nom de la propriété de
+ l'extrémité propriétaire suffit à relier les deux.</para>
+ </sect5>
+
+ <sect5>
+ <title>Valeurs par défaut</title>
+
+ <para>Comme d'autres annotations, la plupart des valeurs d'une
+ relation plusieurs à plusieurs sont inférées. Si aucun mapping
+ physique n'est décrit dans une relation plusieurs à plusieurs
+ unidirectionnelle, alors les règles suivantes s'appliquent. Le nom
+ de la table est la concaténation du nom de la table propriétaire,
+ <keycap>_</keycap> et le nom de la table de l'autre extrémité. Le
+ nom des colonnes de la clef étrangère référençant la table
+ propriétaire est la concaténation du nom de la table propriétaire,
+ <keycap>_</keycap> et le nom des colonnes de la clef primaire
+ de cette table. Le nom des colonnes de la clef étrangère référençant
+ l'autre extrémité est la concaténation du nom de la propriété du
+ propriétaire, <keycap>_</keycap> et le nom des colonnes de la
+ clef primaire de l'autre extrémité. Ce sont les mêmes règles que
+ celles utilisées pour une relation un à plusieurs
+ unidirectionnelle.</para>
+
+ <programlisting>
+ at Entity
+public class Store {
+ @ManyToMany(cascade = CascadeType.PERSIST)
+ public Set<City> getImplantedIn() {
+ ...
+ }
+}
+
+ at Entity
+public class City {
+ ... // pas de relation bidirectionnelle
+}
+ </programlisting>
+
+ <para>La table <literal>Store_City</literal> est utilisée comme
+ table de jointure. La colonne <literal>Store_id</literal> est
+ une clef étrangère vers la table <literal>Store</literal>. La
+ colonne <literal>implantedIn_id</literal> est une clef étrangère
+ vers la table <literal>City</literal>.</para>
+
+ <para>Si aucun mapping physique n'est décrit dans une relation
+ plusieurs à plusieurs bidirectionnelle, alors les règles suivantes
+ s'appliquent. Le nom de la table est la concaténation du nom de la
+ table propriétaire, <keycap>_</keycap> et le nom de la table de
+ l'autre extrémité. Le nom des colonnes de la clef étrangère
+ référençant la table propriétaire est la concaténation du nom de la
+ propriété de l'autre extrémité, <keycap>_</keycap> et le nom des
+ colonnes de la clef primaire du propriétaire. Le nom des colonnes de
+ la clef étrangère référençant l'autre extrémité est la concaténation
+ du nom de la propriété du propriétaire, <keycap>_</keycap> et le nom
+ des colonnes de la clef primaire de l'autre extrémité. Ce sont les
+ mêmes règles que celles utilisées pour une relation un à plusieurs
+ unidirectionnelle.</para>
+
+ <programlisting>
+ at Entity
+public class Store {
+ @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+ public Set<Customer> getCustomers() {
+ ...
+ }
+}
+
+ at Entity
+public class Customer {
+ @ManyToMany(mappedBy="customers")
+ public Set<Store> getStores() {
+ ...
+ }
+}
+ </programlisting>
+
+ <para>La table <literal>Store_Customer</literal> est utilisée comme
+ table de jointure. La colonne <literal>stores_id</literal> est une
+ clef étrangère vers la table <literal>Store</literal>. La colonne
+ <literal>customers_id</literal> est une clef étrangère vers la table
+ <literal>Customer</literal>.</para>
+ </sect5>
+ </sect4>
+ </sect3>
+
+ <sect3>
+ <title>Persistance transitive avec les opérations en cascade</title>
+
+ <para>Vous avez probablement remarqué l'attribut
+ <literal>cascade</literal> prenant comme valeur un tableau de
+ <classname>CascadeType</classname>s. Le concept de cascade dans EJB3 est
+ similaire à la persistance transitive et les opérations en cascade dans
+ Hibernate, mais avec une sémantique légèrement différente et les types
+ de cascade suivants :</para>
+
+ <itemizedlist>
+ <listitem>
+ CascadeType.PERSIST : effectue en cascade l'opération de
+ persistance (création) sur les entités associées si persist() est
+ appelée ou si l'entité est supervisée (par le gestionnaire
+ d'entités)
+ </listitem>
+
+ <listitem>
+ CascadeType.MERGE : effectue en cascade l'opération de fusion sur
+ les entités associées si merge() est appélée ou si l'entité est
+ supervisée
+ </listitem>
+
+ <listitem>
+ CascadeType.REMOVE : effectue en cascade l'opération de
+ suppression sur les entités associées si delete() est appelée
+ </listitem>
+
+ <listitem>
+ CascadeType.REFRESH : effectue en cascade l'opération de
+ rafraîchissement sur les entités associées si refresh() est appelée
+ </listitem>
+
+ <listitem>
+ CascadeType.ALL : tous ceux du dessus
+ </listitem>
+ </itemizedlist>
+
+ <para>Veullez vous référer au chapitre 6.3 de la spécification EJB3 pour
+ plus d'informations sur les opérations en cascade et la sémantique des
+ opérations de création/fusion.</para>
+ </sect3>
+
+ <sect3>
+ <title>Récupération d'associations</title>
+
+ <para>Vous avez la possibilité de récupérer les entités associées soit
+ immédiatement ("eager"), soit à la demande ("lazy"). Le paramètre
+ <literal>fetch</literal> peut être positionné à
+ <literal>FetchType.LAZY</literal> ou à
+ <literal>FetchType.EAGER</literal>. <literal>EAGER</literal> essaiera
+ d'utiliser une jointure externe pour rappatrier l'objet associé,
+ alors que <literal>LAZY</literal> est la valeur par défaut et rapportera
+ les données lorsque l'objet associé sera accédé pour la première fois.
+ JPA-QL a aussi un mot clef <literal>fetch</literal> qui vous permet de
+ surcharger le type de récupération pour une requête particulière. C'est
+ très utile pour améliorer les performances et décider au cas par
+ cas.</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>Mapper des clefs primaires et étrangères composées</title>
+
+ <para>Les clefs primaires composées utilisent une classe embarquée comme
+ représentation de la clef primaire, donc vous devriez utiliser les
+ annotations <literal>@Id</literal> et <literal>@Embeddable</literal>.
+ Alternativement, vous pouvez utiliser l'annotation
+ <literal>@EmbeddedId</literal>. Notez que la classe dépendante doit être
+ sérialisable et implementer
+ <methodname>equals()</methodname>/<methodname>hashCode()</methodname>.
+ Vous pouvez aussi utiliser <literal>@IdClass</literal> comme décrit dans
+ <xref linkend="entity-mapping-identifier" />.</para>
+
+ <programlisting>
+ at Entity
+public class RegionalArticle implements Serializable {
+
+ @Id
+ public RegionalArticlePk getPk() { ... }
+}
+
+ at Embeddable
+public class RegionalArticlePk implements Serializable { ... }
+ </programlisting>
+
+ <para>ou alternativement</para>
+
+ <programlisting>
+ at Entity
+public class RegionalArticle implements Serializable {
+
+ @EmbeddedId
+ public RegionalArticlePk getPk() { ... }
+}
+
+public class RegionalArticlePk implements Serializable { ... }
+ </programlisting>
+
+ <para><literal>@Embeddable</literal> hérite le type d'accès de son entité
+ d'appartenance à moins que l'annotation spécifique Hibernate
+ <literal>@AccessType</literal> soit utilisée. Les clefs étrangères
+ composées (si les valeurs par défaut ne sont pas utilisées) sont définies
+ sur les associations en utilisant l'élément
+ <literal>@JoinColumns</literal>, lequel est simplement un tableau de
+ <literal>@JoinColumn</literal>s. Il est considéré comme une bonne pratique
+ d'exprimer <literal>referencedColumnNames</literal> explicitement. Sinon,
+ Hibernate supposera que vous utilisez le même ordre de colonnes que dans
+ la déclaration de la clef primaire.</para>
+
+ <programlisting>
+ at Entity
+public class Parent implements Serializable {
+ @Id
+ public ParentPk id;
+ public int age;
+
+ @OneToMany(cascade=CascadeType.ALL)
+ @JoinColumns ({
+ @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
+ @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
+ @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
+ })
+ public Set<Child> children; //unidirectionnelle
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Entity
+public class Child implements Serializable {
+ @Id @GeneratedValue
+ public Integer id;
+
+ @ManyToOne
+ @JoinColumns ({
+ @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
+ @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
+ @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
+ })
+ public Parent parent; // unidirectionnelle
+}
+ </programlisting>
+
+ <programlisting>
+ at Embeddable
+public class ParentPk implements Serializable {
+ String firstName;
+ String lastName;
+ ...
+}
+ </programlisting>
+
+ <para>Notez l'usage explicite de
+ <literal>referencedColumnName</literal>.</para>
+ </sect2>
+
+ <sect2>
+ <title>Mapper des tables secondaires</title>
+
+ <para>Vous pouvez mapper un simple entity bean vers plusieurs tables en
+ utilisant les annotations de niveau classe
+ <literal>@SecondaryTable</literal> ou
+ <literal>@SecondaryTables</literal>. Pour dire qu'une colonne est dans
+ une table particulière, utlisez le paramètre <literal>table</literal> de
+ <literal>@Column</literal> ou <literal>@JoinColumn</literal>.</para>
+
+ <programlisting>
+ at Entity
+ at Table(name="MainCat")
+<emphasis role="bold">@SecondaryTables({
+ @SecondaryTable(name="Cat1", pkJoinColumns={
+ @PrimaryKeyJoinColumn(name="cat_id", referencedColumnName="id")
+ ),
+ @SecondaryTable(name="Cat2", uniqueConstraints={@UniqueConstraint(columnNames={"storyPart2"})})
+})</emphasis>
+public class Cat implements Serializable {
+
+ private Integer id;
+ private String name;
+ private String storyPart1;
+ private String storyPart2;
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ <emphasis role="bold">@Column(table="Cat1")</emphasis>
+ public String getStoryPart1() {
+ return storyPart1;
+ }
+
+ <emphasis role="bold">@Column(table="Cat2")</emphasis>
+ public String getStoryPart2() {
+ return storyPart2;
+ }
+</programlisting>
+
+ <para>Dans cet exemple, <literal>name</literal> sera dans
+ <literal>MainCat</literal>. <literal>storyPart1</literal> sera dans
+ <literal>Cat1</literal> et <literal>storyPart2</literal> sera dans
+ <literal>Cat2</literal>. <literal>Cat1</literal> sera joint à
+ <literal>MainCat</literal> avec <literal>cat_id</literal> comme clef
+ étrangère, et <literal>Cat2</literal> avec <literal>id</literal> (ie
+ le même nom de colonne que la colonne identifiante de
+ <literal>MainCat</literal>). De plus, une contrainte d'unicité sur
+ <literal>storyPart2</literal> a été renseignée.</para>
+
+ <para>Regardez le tutoriel EJB3 de JBoss ou la suite de tests
+ unitaires d'Hibernate Annotations pour plus d'exemples.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="entity-mapping-query">
+ <title>Mapper des requêtes</title>
+
+ <sect2 id="entity-mapping-query-hql"
+ revision="1">
+ <title>Mapper des requêtes JPAQL/HQL</title>
+
+ <para>Vous pouvez mapper des requêtes JPA-QL/HQL en utilisant les
+ annotations. <literal>@NamedQuery</literal> et
+ <literal>@NamedQueries</literal> peuvent être définies au niveau de la
+ classe ou dans un fichier JPA XML. Cependant, leurs définitions sont
+ globales au scope de la session factory/entity manager factory. Une
+ requête nommée est définie par son nom et la chaîne de caractères de la
+ requête réelle.</para>
+
+ <programlisting><entity-mappings>
+ <named-query name="plane.getAll">
+ <query>select p from Plane p</query>
+ </named-query>
+ ...
+</entity-mappings>
+...
+
+ at Entity
+ at NamedQuery(name="night.moreRecentThan", query="select n from Night n where n.date >= :date")
+public class Night {
+ ...
+}
+
+public class MyDao {
+ doStuff() {
+ Query q = s.getNamedQuery("night.moreRecentThan");
+ q.setDate( "date", aMonthAgo );
+ List results = q.list();
+ ...
+ }
+ ...
+}
+ </programlisting>
+
+ <para>Vous pouvez aussi fournir des indications de fonctionnement à une
+ requête à travers un tableau de <literal>QueryHint</literal>s avec
+ l'attribut <literal>hints</literal>.</para>
+
+ <para>Les indications de fonctionnement Hibernate disponibles
+ sont :</para>
+
+ <para></para>
+
+ <table>
+ <title>Indications de fonctionnement d'une requête</title>
+
+ <tgroup cols="2">
+ <thead>
+ <colspec colname="c1" />
+
+ <colspec colname="c2" colnum="2" />
+
+ <row>
+ <entry>Indication</entry>
+
+ <entry colname="c2">description</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>org.hibernate.cacheable</entry>
+
+ <entry>Indique si la requête devrait interagir avec le cache de
+ second niveau (par défaut à false)</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.cacheRegion</entry>
+
+ <entry>Nom de la région du cache (si indéfinie, la valeur par
+ défaut est utilisée)</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.timeout</entry>
+
+ <entry>Timeout des requêtes</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.fetchSize</entry>
+
+ <entry>Taille des result sets par fetch</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.flushMode</entry>
+
+ <entry>Mode de flush utilisé pour cette requête</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.cacheMode</entry>
+
+ <entry>Mode de cache utilisé pour cette requête</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.readOnly</entry>
+
+ <entry>Indique si les entités chargées par cette requête devraient
+ être en lecture seule ou pas (par défaut à false)</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.comment</entry>
+
+ <entry>Commentaire de la requête, ajouté au SQL généré</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+
+ <sect2 id="entity-mapping-query-native" revision="2">
+ <title>Mapper des requêtes natives</title>
+
+ <para>Vous pouvez aussi mapper une requête native (ie une requête SQL).
+ Pour ce faire, vous devez décrire la structure de l'ensemble de résultat
+ SQL en utilisant <literal>@SqlResultSetMapping</literal> (ou
+ <literal>@SqlResultSetMappings</literal> si vous prévoyez de définir
+ plusieurs mappings de résultats). Comme <literal>@NamedQuery</literal>, un
+ <literal>@SqlResultSetMapping</literal> peut être défini au niveau de la
+ classe ou dans un fichier XML JPA. Cependant sa portée est globale à
+ l'application.</para>
+
+ <para>Comme vous le verrez, un paramètre de
+ <literal>resultSetMapping</literal> est défini dans
+ <literal>@NamedNativeQuery</literal>, il représente le nom du
+ <literal>@SqlResultSetMapping</literal> défini. Le mapping de l'ensemble
+ des résultats déclare les entités récupérées par cette requête native.
+ Chaque champ de l'entité est lié à un alias SQL (nom de colonne). Tous les
+ champs de l'entité (dont ceux des classes filles) et les colonnes des
+ clefs étrangères relatives aux entités doivent être présents dans la
+ requête SQL. Les définitions des champs sont optionnelles, si elles ne
+ sont pas fournies, elles mappent le même nom de colonne que celui déclaré
+ sur la propriété de la classe.</para>
+
+ <para><programlisting>@NamedNativeQuery(name="night&area", query="select night.id nid, night.night_duration, "
+ + " night.night_date, area.id aid, night.area_id, area.name "
+ + "from Night night, Area area where night.area_id = area.id", <emphasis
+ role="bold">resultSetMapping="joinMapping"</emphasis>)
+ at SqlResultSetMapping(name="joinMapping", entities={
+ @EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class, fields = {
+ @FieldResult(name="id", column="nid"),
+ @FieldResult(name="duration", column="night_duration"),
+ @FieldResult(name="date", column="night_date"),
+ @FieldResult(name="area", column="area_id"),
+ discriminatorColumn="disc"
+ }),
+ @EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class, fields = {
+ @FieldResult(name="id", column="aid"),
+ @FieldResult(name="name", column="name")
+ })
+ }
+)</programlisting></para>
+
+ <para>Dans l'exemple ci-dessus, la requête nommée
+ <literal>night&area</literal> utilise le mapping de résultats
+ <literal>joinMapping</literal>. Ce mapping retourne 2 entités,
+ <literal>Night</literal> et <literal>Area</literal>, chaque propriété est
+ déclarée et associée à un nom de colonne, en fait le nom de colonne
+ récupéré par la requête. Voyons maintenant une déclaration implicite de
+ mapping propriété/colonne.</para>
+
+ <programlisting>@Entity
+<emphasis role="bold">@SqlResultSetMapping(name="implicit", entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class))
+ at NamedNativeQuery(name="implicitSample", query="select * from SpaceShip", resultSetMapping="implicit")</emphasis>
+public class SpaceShip {
+ private String name;
+ private String model;
+ private double speed;
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Column(name="model_txt")
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public double getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(double speed) {
+ this.speed = speed;
+ }
+}</programlisting>
+
+ <para>Dans cet exemple, nous décrivons seulement le membre de l'entité du
+ mapping de résultats. Le mapping de propriété/colonne est fait en
+ utilisant les valeurs de mapping de l'entité. Dans ce cas, la propriété
+ <literal>model</literal> est liée à la colonne
+ <literal>model_txt</literal>. Si l'association à une entité concernée
+ implique une clef primaire composée, un élément
+ <literal>@FieldResult</literal> devrait être utilisé pour chaque colonne
+ de la clef étrangère. Le nom de <literal>@FieldResult</literal> est
+ composé du nom de la propriété pour la relation, suivi par un point ("."),
+ suivi par le nom ou le champ ou la propriété de la clef primaire.</para>
+
+ <programlisting>@Entity
+ at SqlResultSetMapping(name="compositekey",
+ entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class,
+ fields = {
+ @FieldResult(name="name", column = "name"),
+ @FieldResult(name="model", column = "model"),
+ @FieldResult(name="speed", column = "speed"),
+<emphasis role="bold"> @FieldResult(name="captain.firstname", column = "firstn"),
+ @FieldResult(name="captain.lastname", column = "lastn"),</emphasis>
+ @FieldResult(name="dimensions.length", column = "length"),
+ @FieldResult(name="dimensions.width", column = "width")
+ }),
+ columns = { @ColumnResult(name = "surface"),
+ @ColumnResult(name = "volume") } )
+
+ at NamedNativeQuery(name="compositekey",
+ query="select name, model, speed, lname as lastn, fname as firstn, length, width, length * width as surface from SpaceShip",
+ resultSetMapping="compositekey")
+} )
+public class SpaceShip {
+ private String name;
+ private String model;
+ private double speed;
+ private Captain captain;
+ private Dimensions dimensions;
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne(fetch= FetchType.LAZY)
+ @JoinColumns( {
+ @JoinColumn(name="fname", referencedColumnName = "firstname"),
+ @JoinColumn(name="lname", referencedColumnName = "lastname")
+ } )
+ public Captain getCaptain() {
+ return captain;
+ }
+
+ public void setCaptain(Captain captain) {
+ this.captain = captain;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public double getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(double speed) {
+ this.speed = speed;
+ }
+
+ public Dimensions getDimensions() {
+ return dimensions;
+ }
+
+ public void setDimensions(Dimensions dimensions) {
+ this.dimensions = dimensions;
+ }
+}
+
+ at Entity
+ at IdClass(Identity.class)
+public class Captain implements Serializable {
+ private String firstname;
+ private String lastname;
+
+ @Id
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ @Id
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+}
+</programlisting>
+
+ <note>
+ <para>Si vous regardez la propriété dimension, vous verrez qu'Hibernate
+ prend en charge la notation avec les points pour les objets embarqués
+ (vous pouvez même avoir des objets embarqués imbriqués). Les
+ implémentations EJB3 n'ont pas à prendre en charge cette fonctionnalité,
+ mais nous le faisons :-)</para>
+ </note>
+
+ <para>Si vous récupérez une simple entité et si vous utilisez le mapping
+ par défaut, vous pouvez utiliser l'attribut <literal>resultClass</literal>
+ à la place de <literal>resultSetMapping</literal> :</para>
+
+ <programlisting><emphasis role="bold">@NamedNativeQuery(name="implicitSample", query="select * from SpaceShip",
+ resultClass=SpaceShip.class)</emphasis>
+public class SpaceShip {</programlisting>
+
+ <para>Dans certaines de vos requêtes natives, vous devrez retourner des
+ valeurs scalaires, par exemple lors de la construction de requêtes de
+ rapport. Vous pouvez les mapper dans
+ <literal>@SqlResultsetMapping</literal> avec
+ <literal>@ColumnResult</literal>. En fait, vous pouvez même mélanger des
+ retours d'entités et de valeurs scalaires dans la même requête native (ce
+ n'est cependant probablement pas commun).</para>
+
+ <programlisting><emphasis role="bold">@SqlResultSetMapping(name="scalar", columns=@ColumnResult(name="dimension"))
+ at NamedNativeQuery(name="scalar", query="select length*width as dimension from SpaceShip", resultSetMapping="scalar")</emphasis></programlisting>
+
+ <para>Une autre indication de fonctionnement spécifique aux requêtes
+ natives a été présentée : <literal>org.hibernate.callable</literal>
+ laquelle peut être à true ou à false fausse selon que la requête est une
+ procédure stockée ou pas.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="entity-hibspec" xreflabel="Extensions d'Hibernate Annotation">
+ <title>Extensions d'Hibernate Annotation</title>
+
+ <para>Hibernate 3.1 offre une variété d'annotations supplémentaires que vous
+ pouvez mélanger/faire correspondre avec des entités EJB3. Elles ont été
+ conçues comme une extension naturelle aux annotations EJB3.</para>
+
+ <para>Pour aller plus loin que les capacités d'EJB3, Hibernate fournit des
+ annotations spécifiques qui correspondent aux fonctionnalités d'Hibernate.
+ Le package <classname>org.hibernate.annotations</classname> contient toutes
+ ces extensions d'annotations.</para>
+
+ <sect2 id="entity-hibspec-entity" revision="2">
+ <title>Entité</title>
+
+ <para>Vous pouvez finement paramétrer certaines des actions faites par
+ Hibernate sur les entités au-delà de ce qu'offre la spécification
+ EJB3.</para>
+
+ <para><classname>@org.hibernate.annotations.Entity</classname> ajoute des
+ méta-données supplémentaires qui peuvent être nécessaires au-delà de ce
+ qui est défini dans l'annotation <literal>@Entity</literal>
+ standard :<itemizedlist>
+ <listitem>
+ mutable : indique si l'entité est modifiable ou non
+ </listitem>
+
+ <listitem>
+ dynamicInsert : autorise le SQL dynamique pour les insertions
+ </listitem>
+
+ <listitem>
+ dynamicUpdate : autorise le SQL dynamique pour les mise à jour
+ </listitem>
+
+ <listitem>
+ selectBeforeUpdate : spécifie qu'Hibernate ne devrait jamais
+ exécuter un UPDATE SQL à moins qu'il ne soit certain qu'un objet
+ est réellement modifié
+ </listitem>
+
+ <listitem>
+ polymorphism : indique si le polymorphisme d'entité est de type
+ PolymorphismType.IMPLICIT (valeur par défaut) ou
+ PolymorphismType.EXPLICIT
+ </listitem>
+
+ <listitem>
+ persister : autorise la surcharge de l'implémentation de
+ persistance fournie par défaut
+ </listitem>
+
+ <listitem>
+ optimisticLock : stratégie de verrouillage optmiste
+ (OptimisticLockType.VERSION,
+ OptimisticLockType.NONE, OptimisticLockType.DIRTY ou
+ OptimisticLockType.ALL)
+ </listitem>
+ </itemizedlist></para>
+
+ <para><note>
+ <para>@javax.persistence.Entity est encore obligatoire,
+ @org.hibernate.annotations.Entity ne la remplace pas.</para>
+ </note></para>
+
+ <para>Voici quelques extensions d'annotations Hibernate
+ supplémentaires.</para>
+
+ <para><literal>@org.hibernate.annotations.BatchSize</literal> vous permet
+ de définir la taille du batch lors de la récupération d'instances de
+ cette entité (p. ex. <literal>@BatchSize(size=4)</literal>). Lors du
+ chargement d'une entité donnée, Hibernate chargera alors toutes les
+ entités non initialisées du même type dans le contexte de la persistance
+ jusqu'à la taille du batch.</para>
+
+ <para><literal>@org.hibernate.annotations.Proxy</literal> définit les
+ attributs de chargement de l'entité. lazy (valeur par défaut) définit si
+ la classe est chargée à la demande ou non. proxyClassName est l'interface
+ utilisée pour générer le proxy (par défaut, la classe elle-même).</para>
+
+ <para><literal>@org.hibernate.annotations.Where</literal> définit une
+ clause WHERE SQL optionnelle utilisée lorsque des instances de cette
+ classe sont récupérées.</para>
+
+ <para><literal>@org.hibernate.annotations.Check</literal> déclare une
+ contrainte de vérification optionnelle définie dans l'expression
+ DDL.</para>
+
+ <para><literal>@OnDelete(action=OnDeleteAction.CASCADE)</literal> sur des
+ classes filles jointes : utilise une commande SQL DELETE en cascade lors
+ de la suppression plutôt que le mécanisme habituel d'Hibernate.</para>
+
+ <para><literal>@Table(appliesTo="tableName", indexes = {
+ @Index(name="index1", columnNames={"column1", "column2"} ) } )</literal>
+ crée les index définis sur les colonnes de la table
+ <literal>tableName</literal>. Cela peut s'appliquer sur une table primaire
+ ou une table secondaire. L'annotation <literal>@Tables</literal> vous
+ permet d'avoir des index sur des tables différentes. Cette annotation est
+ attendue là où <literal>@javax.persistence.Table</literal> ou
+ <literal>@javax.persistence.SecondaryTable</literal>(s) sont
+ déclarées.</para>
+
+ <note>
+ <para><literal>@org.hibernate.annotations.Table</literal> est un
+ complément, pas un remplacement de
+ <literal>@javax.persistence.Table</literal>. Surtout, si vous souhaitez
+ changer le nom par défaut d'une table, vous devez utiliser
+ <literal>@javax.persistence.Table</literal>, pas
+ <literal>@org.hibernate.annotations.Table</literal>.</para>
+ </note>
+
+ <para><programlisting>@Entity
+ at BatchSize(size=5)
+ at org.hibernate.annotations.Entity(
+ selectBeforeUpdate = true,
+ dynamicInsert = true, dynamicUpdate = true,
+ optimisticLock = OptimisticLockType.ALL,
+ polymorphism = PolymorphismType.EXPLICIT)
+ at Where(clause="1=1")
+ at org.hibernate.annotations.Table(name="Forest", indexes = { @Index(name="idx", columnNames = { "name", "length" } ) } )
+public class Forest { ... }</programlisting><programlisting>@Entity
+ at Inheritance(
+ strategy=InheritanceType.JOINED
+)
+public class Vegetable { ... }
+
+ at Entity
+ at OnDelete(action=OnDeleteAction.CASCADE)
+public class Carrot extends Vegetable { ... }</programlisting></para>
+ </sect2>
+
+ <sect2 id="entity-hibspec-identifier" revision="1">
+ <title>Identifiant</title>
+
+ <para><literal>@org.hibernate.annotations.GenericGenerator</literal> vous
+ permet de définir un générateur d'identifiants Hibernate
+ spécifique.</para>
+
+ <para><programlisting>@Id @GeneratedValue(generator="system-uuid")
+ at GenericGenerator(name="system-uuid", strategy = "uuid")
+public String getId() {
+
+ at Id @GeneratedValue(generator="hibseq")
+ at GenericGenerator(name="hibseq", strategy = "seqhilo",
+ parameters = {
+ @Parameter(name="max_lo", value = "5"),
+ @Parameter(name="sequence", value="heybabyhey")
+ }
+)
+public Integer getId() {</programlisting></para>
+
+ <para><literal>strategy</literal> est le nom court de la stratégie du
+ générateur Hibernate3 ou le nom pleinement qualifié de la classe d'une
+ implémentation de <classname>IdentifierGenerator</classname>. Vous pouvez
+ ajouter des paramètres avec l'attribut
+ <literal>parameters</literal>.</para>
+
+ <para>Contrairement à son pendant standard,
+ <literal>@GenericGenerator</literal> peut ête utilisée dans les
+ annotations au niveau du package, en faisant ainsi un générateur de niveau
+ applicatif (comme s'il était dans un fichier JPA XML).</para>
+
+ <programlisting>@GenericGenerator(name="hibseq", strategy = "seqhilo",
+ parameters = {
+ @Parameter(name="max_lo", value = "5"),
+ @Parameter(name="sequence", value="heybabyhey")
+ }
+)
+package org.hibernate.test.model</programlisting>
+ </sect2>
+
+ <sect2 id="entity-hibspec-property" revision="2">
+ <title>Propriété</title>
+
+ <sect3>
+ <title>Type d'accès</title>
+
+ <para>Le type d'accès est déduit de la position de
+ <literal>@Id</literal> ou de <literal>@EmbeddedId</literal> dans la
+ hiérarchie de l'entité. Les entités filles, les objets embarqués et les
+ entités parentes mappés héritent du type d'accès de l'entité
+ racine.</para>
+
+ <para>Dans Hibernate, vous pouvez surcharger le type d'accès
+ pour :</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>utiliser une stratégie d'accès personnalisée</para>
+ </listitem>
+
+ <listitem>
+ <para>paramétrer finement le type d'accès au niveau de la classe ou
+ au niveau de la propriété</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Une annocation @AccessType a été présentée pour prendre en charge
+ ce comportement. Vous pouvez définir le type d'accès sur :</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>une entité</para>
+ </listitem>
+
+ <listitem>
+ <para>une classe parente</para>
+ </listitem>
+
+ <listitem>
+ <para>un objet embarqué</para>
+ </listitem>
+
+ <listitem>
+ <para>une propriété</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Le type d'accès est surchargé pour l'élément annoté, si surchargé
+ sur une classe, toutes les propriétés de la classe donnée héritent du
+ type d'accès. Pour les entités racines, le type d'accès est considéré
+ par défaut comme celui de la hiérarchie entière (surchargeable au niveau
+ de la classe ou de la propriété).</para>
+
+ <para>Si le type d'accès est marqué comme "propriété", les getters sont
+ parcourus pour examiner les annotations, si le type d'accès est marqué
+ comme "champ", ce sont les champs qui sont parcourus pour les
+ annotations. Sinon les éléments marqués avec @Id ou @embeddedId sont
+ scannés.</para>
+
+ <para>Vous pouvez surcharger une type d'accès pour une propriété, mais
+ l'élément annoté ne sera pas influencé : par exemple, une entité ayant
+ un type d'accès <literal>field</literal>, peut annoter un champ avec
+ <literal>@AccessType("property")</literal>, le type d'accès sera alors
+ "property" pour cet attribut, des annotations devront encore être
+ portées sur les champs.</para>
+
+ <para>Si une classe parente ou un objet embarquable n'est pas annoté, le
+ type d'accès de l'entité racine est utilisé (même si un type d'accès a
+ été défini sur une classe parente ou un objet embarquable
+ intermédiaire). Le principe de la poupée russe ne s'applique pas.</para>
+
+ <programlisting>@Entity
+public class Person implements Serializable {
+ @Id @GeneratedValue // type d'accès "champ"
+ Integer id;
+
+ @Embedded
+ @AttributeOverrides({
+ @AttributeOverride(name = "iso2", column = @Column(name = "bornIso2")),
+ @AttributeOverride(name = "name", column = @Column(name = "bornCountryName"))
+ })
+ Country bornIn;
+}
+
+ at Embeddable
+<emphasis role="bold">@AccessType("property")</emphasis> // surcharge le type d'accès pour toutes les propriétés dans Country
+public class Country implements Serializable {
+ private String iso2;
+ private String name;
+
+ public String getIso2() {
+ return iso2;
+ }
+
+ public void setIso2(String iso2) {
+ this.iso2 = iso2;
+ }
+
+ @Column(name = "countryName")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
+</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>Formule</title>
+
+ <para>Parfois, vous voulez effectuer certains calculs par la base de
+ données plutôt que par la JVM, ou vous pourriez aussi vouloir créer une
+ sorte de colonne virtuelle. Vous pouvez utilisez un fragment SQL (alias
+ une formule) plutôt que de mapper un propriété sur une colonne. Cette
+ sorte de propriété est en lecture seule (sa valeur est calculée par
+ votre formule).</para>
+
+ <programlisting>@Formula("obj_length * obj_height * obj_width")
+public long getObjectVolume()</programlisting>
+
+ <para>Le fragment SQL peut être aussi complexe que vous le souhaitez,
+ même avec des sous-selects inclus.</para>
+ </sect3>
+
+ <sect3>
+ <title>Type</title>
+
+ <para><literal>@org.hibernate.annotations.Type</literal> surcharge le
+ type Hibernate utilisé par défaut : ce n'est généralement pas nécessaire
+ puisque le type est correctement inféré par Hibernate. Veuillez vous
+ référer au guide de référence Hibernate pour plus d'informations sur les
+ types Hibernate.</para>
+
+ <para><literal>@org.hibernate.annotations.TypeDef</literal> et
+ <literal>@org.hibernate.annotations.TypeDefs</literal> vous permettent
+ de déclarer des définitions de type. Ces annotations sont placées au
+ niveau de la classe ou du package. Notez que ces définitions seront
+ globales pour la session factory (même au niveau de la classe) et que la
+ définition du type doit être définie avant n'importe quelle
+ utilisation.</para>
+
+ <programlisting>@TypeDefs(
+ {
+ @TypeDef(
+ name="caster",
+ typeClass = CasterStringType.class,
+ parameters = {
+ @Parameter(name="cast", value="lower")
+ }
+ )
+ }
+)
+package org.hibernate.test.annotations.entity;
+
+...
+public class Forest {
+ @Type(type="caster")
+ public String getSmallText() {
+ ...
+}
+ </programlisting>
+
+ <para>Lors de l'utilisation d'un type utilisateur composé, vous devrez
+ exprimer les définitions des colonnes. L'annotation
+ <literal>@Columns</literal> a été mise en place dans ce but.</para>
+
+ <programlisting>@Type(type="org.hibernate.test.annotations.entity.MonetaryAmountUserType")
+ at Columns(columns = {
+ @Column(name="r_amount"),
+ @Column(name="r_currency")
+})
+public MonetaryAmount getAmount() {
+ return amount;
+}
+
+
+public class MonetaryAmount implements Serializable {
+ private BigDecimal amount;
+ private Currency currency;
+ ...
+}</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>Index</title>
+
+ <para>Vous pouvez définir un index sur une colonne particulière en
+ utilisant l'annotation <literal>@Index</literal> sur une propriété d'une
+ colonne, l'attribut columnNames sera ignoré.</para>
+
+ <programlisting>@Column(secondaryTable="Cat1")
+ at Index(name="story1index")
+public String getStoryPart1() {
+ return storyPart1;
+}</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>@Parent</title>
+
+ <para>A l'intérieur d'un objet embarquable, vous pouvez définir
+ une des propriétés comme un pointeur vers l'élément
+ propriétaire.</para>
+
+ <programlisting>@Entity
+public class Person {
+ @Embeddable public Address address;
+ ...
+}
+
+ at Embeddable
+public class Address {
+ @Parent public Person owner;
+ ...
+}
+
+
+person == person.address.owner</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>Propriétés générées</title>
+
+ <para>Certaines propriétés sont générées au moment de l'insertion ou de
+ la mise à jour par votre base de données. Hibernate peut traiter de
+ telles propriétés et déclencher un select subséquent pour lire ces
+ propriétés.</para>
+
+ <programlisting>@Entity
+public class Antenna {
+ @Id public Integer id;
+ @Generated(GenerationTime.ALWAYS) @Column(insertable = false, updatable = false)
+ public String longitude;
+
+ @Generated(GenerationTime.INSERT) @Column(insertable = false)
+ public String latitude;
+}</programlisting>
+
+ <para>Quand vous annotez votre propriété avec
+ <literal>@Generated</literal>, vous devez vous assurer que l'insertion
+ et la mise à jour n'entreront pas en conflit avec la stratégie de
+ génération que vous avez choisie. Lorsque GenerationTime.INSERT est
+ choisi, la propriété ne doit pas contenir de colonnes insérables ;
+ lorsque GenerationTime.ALWAYS est choisi, la propriété ne doit pas
+ contenir de colonnes qui puissent être insérées ou mises à jour.</para>
+
+ <para>Les propriétés <literal>@Version</literal> ne peuvent pas (par
+ conception) être <literal>@Generated(INSERT)</literal>, elles doivent
+ être <literal>NEVER</literal> ou <literal>ALWAYS</literal>.</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="entity-hibspec-inheritance" revision="1">
+ <title>Héritage</title>
+
+ <para>SINGLE_TABLE est une stratégie très puissante mais parfois, et
+ surtout pour des systèmes pré-existants, vous ne pouvez pas ajouter une
+ colonne discriminante supplémentaire. Pour cela Hibernate a mis en place
+ la notion de formule discriminante :
+ <literal>@DiscriminatorFormula</literal> est une remplaçcant de
+ <literal>@DiscriminatorColumn</literal> et utilise un fragment SQL en tant
+ que formule pour la résolution du discriminant (pas besoin d'avoir une
+ colonne dédiée).</para>
+
+ <programlisting>@Entity
+ at DiscriminatorForumla("case when forest_type is null then 0 else forest_type end")
+public class Forest { ... }</programlisting>
+
+ <para>Par défaut, lors du requêtage sur les entités les plus hautes,
+ Hibernate ne met pas de restriction sur la colonne discriminante. Ceci
+ peut être un inconvénient si cette colonne contient des valeurs qui ne sont
+ pas mappées dans votre hiérarchie (avec
+ <literal>@DiscriminatorValue</literal>). Pour contourner ca, vous pouvez
+ utilser <literal>@ForceDiscriminator</literal> (au niveau de la classe,
+ à côté de <literal>@DiscriminatorColumn</literal>). Hibernate listera
+ alors les valeurs disponibles lors du chargement des entités.</para>
+ </sect2>
+
+ <sect2 id="entity-hibspec-singleassoc">
+ <title>Annotations concernant les simples associations</title>
+
+ <para>Par défaut, lorsqu'Hibernate ne peut pas résoudre l'association
+ parce que l'élément associé attendu n'est pas dans la base de données
+ (mauvais identifiant sur la colonne de l'association), une exception est
+ levée par Hibernate. Cela pourrait être un inconvénient pour des schémas
+ pré-existants et mal maintenus. Vous pouvez demander à Hibernate d'ignorer
+ de tels éléments plutôt que de lever une exception en utilisant
+ l'annotation <literal>@NotFound</literal>. Cette annotation peut être
+ utilisée sur une association <literal>@OneToOne</literal> (avec une clef
+ étrangère), <literal>@ManyToOne</literal>, <literal>@OneToMany</literal>
+ ou <literal>@ManyToMany</literal>.</para>
+
+ <programlisting>@Entity
+public class Child {
+ ...
+ @ManyToOne
+ @NotFound(action=NotFoundAction.IGNORE)
+ public Parent getParent() { ... }
+ ...
+}</programlisting>
+
+ <para>Parfois vous voulez déléguer à votre base de données la suppression
+ en cascade lorsqu'une entité donnée est supprimée.</para>
+
+ <programlisting>@Entity
+public class Child {
+ ...
+ @ManyToOne
+ @OnDelete(action=OnDeleteAction.CASCADE)
+ public Parent getParent() { ... }
+ ...
+}</programlisting>
+
+ <para>Dans ce cas, Hibernate génère une contrainte de suppression en
+ cascade au niveau de la base de données.</para>
+
+ <para>Les contraintes de clef étrangère, bien que générées par Hibernate,
+ ont un nom justement illisible. Vous pouvez surcharger le nom de la
+ contrainte par l'utilisation de <literal>@ForeignKey</literal>.</para>
+
+ <programlisting>@Entity
+public class Child {
+ ...
+ @ManyToOne
+ <emphasis role="bold">@ForeignKey(name="FK_PARENT")</emphasis>
+ public Parent getParent() { ... }
+ ...
+}
+
+alter table Child add constraint FK_PARENT foreign key (parent_id) references Parent</programlisting>
+
+ <sect3>
+ <title>Options de chargement et modes de récupération</title>
+
+ <para>EJB3 arrive avec l'option <literal>fetch</literal> pour définir
+ le chargement à la demande et les modes de récupération, cependant
+ Hibernate a beaucoup plus d'options dans ce domaine. Pour finement
+ paramétrer le chargement à la demande et les stratégies de récupération,
+ quelques annotations supplémentaires ont été mises en place :</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>@LazyToOne</literal> : définit l'option de chargement
+ à la demande sur les associations <literal>@ManyToOne</literal> et
+ <literal>@OneToOne</literal>. <literal>LazyToOneOption</literal>
+ peut être <literal>PROXY</literal> (ie utiliser un chargement à la
+ demande basé sur un proxy), <literal>NO_PROXY</literal> (utilise
+ un chargement à la demande sur l'ajout de bytecode - notez qu'un
+ temps de construction du bytecode est nécessaire) et
+ <literal>FALSE</literal> (association sans chargement à la
+ demande) ;</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>@LazyCollection</literal> : définit l'option de
+ chargement à la demande sur les associations
+ <literal>@ManyToMany</literal> et <literal>@OneToMany</literal>.
+ LazyCollectionOption peut être <literal>TRUE</literal> (la
+ collection est chargée à la demande lorsque son état est accédé),
+ <literal>EXTRA</literal> (la collection est chargée à la demande et
+ toutes les opérations essaieront d'éviter le chargement de la
+ collection, c'est surtout utile pour de grosses collections lorsque
+ le chargement de tous les éléments n'est pas nécessaire) et
+ <literal>FALSE</literal> (association sans chargement à la
+ demande) ;</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>@Fetch</literal> : définit une stratégie de
+ récupération utilisée pour charger l'association.
+ <literal>FetchMode</literal> peut être
+ <literal>SELECT</literal> (un select est déclenché lorsque
+ l'association a besoin d'être chargée), <literal>SUBSELECT</literal>
+ (disponible uniquement pour des collections, utilise une stratégie
+ de sous select - veuillez vous référer à la documentation de
+ référence d'Hibernate pour plus d'informations) ou
+ <literal>JOIN</literal> (utilise un JOIN SQL pour charger
+ l'association lors du chargement de l'entité propriétaire).
+ <literal>JOIN</literal> surcharge n'importe quel attribut de
+ chargement à la demande (une association chargée avec la stratégie
+ <literal>JOIN</literal> ne peut pas être chargée à la
+ demande).</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Les annotations Hibernate surchargent les options de récupération
+ EJB3.</para>
+
+ <table>
+ <title>Chargement à la demande et options de récupération
+ équivalentes</title>
+
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Annotations</entry>
+
+ <entry>Chargement à la demande</entry>
+
+ <entry>Récupération</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>@[One|Many]ToOne](fetch=FetchType.LAZY)</entry>
+
+ <entry>@LazyToOne(PROXY)</entry>
+
+ <entry>@Fetch(SELECT)</entry>
+ </row>
+
+ <row>
+ <entry>@[One|Many]ToOne](fetch=FetchType.EAGER)</entry>
+
+ <entry>@LazyToOne(FALSE)</entry>
+
+ <entry>@Fetch(JOIN)</entry>
+ </row>
+
+ <row>
+ <entry>@ManyTo[One|Many](fetch=FetchType.LAZY)</entry>
+
+ <entry>@LazyCollection(TRUE)</entry>
+
+ <entry>@Fetch(SELECT)</entry>
+ </row>
+
+ <row>
+ <entry>@ManyTo[One|Many](fetch=FetchType.EAGER)</entry>
+
+ <entry>@LazyCollection(FALSE)</entry>
+
+ <entry>@Fetch(JOIN)</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect3>
+ </sect2>
+
+ <sect2 id="entity-hibspec-collection" revision="2">
+ <title>Annotations concernant les collections</title>
+
+ <sect3 id="entity-hibspec-collection-enhance" revision="2">
+ <title>Améliorer les configurations des collections</title>
+
+ <para>Il est possible de configurer :<itemizedlist>
+ <listitem>
+ la taille des batchs pour les collections en utilisant @BatchSize
+ </listitem>
+
+ <listitem>
+ la clause where, en utilisant @Where (appliquée à l'entité cible)
+ ou @WhereJoinTable (appliquée à la table de l'association)
+ </listitem>
+
+ <listitem>
+ la clause de vérification, en utilsant @Check
+ </listitem>
+
+ <listitem>
+ la clause SQL order by, en utilisant @OrderBy
+ </listitem>
+
+ <listitem>
+ la stratégie de suppression en cascade avec
+ @OnDelete(action=OnDeleteAction.CASCADE)
+ </listitem>
+ </itemizedlist></para>
+
+ <para>Vous pouvez aussi déclarer un comparateur de tri, utilisez
+ l'annotation <literal>@Sort</literal>. Exprimez le type de comparateur
+ que vous voulez entre "non trié" (NdT : unsorted), "ordre naturel"
+ (NdT : natural) ou un comparateur personnalisé. Si vous voulez utilisez
+ votre propre implémentation de comparateur, vous devrez indiquer la
+ classe d'implémentation en utilisant l'attribut
+ <literal>comparator</literal>. Notez que vous avez besoin d'utiliser
+ l'interface <classname>SortedSet</classname> ou
+ <classname>SortedMap</classname>.</para>
+
+ <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+ @JoinColumn(name="CUST_ID")
+ @Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
+ @Where(clause="1=1")
+ @OnDelete(action=OnDeleteAction.CASCADE)
+ public SortedSet<Ticket> getTickets() {
+ return tickets;
+ }</programlisting>
+
+ <para>Veuillez vous référer aux descriptions précédentes de ces
+ annotations pour plus d'informations.</para>
+
+ <para>Les contraintes de clef étrangère, bien que générées par
+ Hibernate, ont un nom illisible. Vous pouvez surcharger le nom de la
+ contrainte en utilisant <literal>@ForeignKey</literal>. Notez que cette
+ annotation doit être placée du côté possédant la relation,
+ <literal>inverseName</literal> référençant la contrainte de l'autre
+ côté.</para>
+
+ <programlisting>@Entity
+public class Woman {
+ ...
+ @ManyToMany(cascade = {CascadeType.ALL})
+ <emphasis role="bold">@ForeignKey(name = "TO_WOMAN_FK", inverseName = "TO_MAN_FK")</emphasis>
+ public Set<Man> getMens() {
+ return mens;
+ }
+}
+
+alter table Man_Woman add constraint TO_WOMAN_FK foreign key (woman_id) references Woman
+alter table Man_Woman add constraint TO_MAN_FK foreign key (man_id) references Man</programlisting>
+ </sect3>
+
+ <sect3 id="entity-hibspec-collection-extratype" revision="1">
+ <title>Types de collection extra</title>
+
+ <sect4>
+ <title>List</title>
+
+ <para>Outre EJB3, Hibernate Annotations prend en charge les véritables
+ <classname>List</classname> et <classname>Array</classname>. Mappez
+ votre collection de la même manière que d'habitude et ajoutez
+ l'annotation @<literal>IndexColumn</literal>. Cette annotation vous
+ permet de décrire la colonne qui contiendra l'index. Vous pouvez aussi
+ déclarer la valeur de l'index en base de données qui représente le
+ premier élément (alias index de base). La valeur habituelle est
+ <literal>0</literal> ou <literal>1</literal>.</para>
+
+ <programlisting>@OneToMany(cascade = CascadeType.ALL)
+ at IndexColumn(name = "drawer_position", base=1)
+public List<Drawer> getDrawers() {
+ return drawers;
+}</programlisting>
+
+ <note>
+ <para>Si vous oubliez de positionner
+ <literal>@IndexColumn</literal>, la sémantique du bag est appliquée.
+ Si vous voulez la sémantique du bag sans ses limitations, considérez
+ l'utilisation de <literal>@CollectionId</literal>.</para>
+ </note>
+ </sect4>
+
+ <sect4>
+ <title>Map</title>
+
+ <para>Hibernate Annotations prend aussi en charge le mapping de
+ véritables Maps, si <literal>@javax.persistence.MapKey</literal> n'est
+ pas positionnée, Hibernate mappera l'élément clef ou l'objet
+ embarquable dans ses propres colonnes. Pour surcharger les colonnes
+ par défaut, vous pouvez utiliser
+ <literal>@org.hibernate.annotations.MapKey</literal> si votre clef est
+ un type de base (par défaut à <literal>mapkey</literal>) ou un objet
+ embarquable, ou vous pouvez utiliser
+ <literal>@org.hibernate.annotations.MapKeyManyToMany</literal> si
+ votre clef est une entité.</para>
+ </sect4>
+
+ <sect4 id="entity-hibspec-collection-extratype-indexbidir">
+ <title>Associations bidirectionnelle avec des collections indexées</title>
+
+ <para>Une association bidirectionnelle où une extrémité est
+ représentée comme une <literal>@IndexColumn</literal> ou une
+ <literal>@org.hibernate.annotations.MapKey[ManyToMany]</literal>
+ requiert une considération spéciale. S'il y a une propriété de la
+ classe enfante qui mappe la colonne de l'index, pas de problème, nous
+ pouvons continuer en utilisant <literal>mappedBy</literal> sur le
+ mapping de la collection :</para>
+
+ <programlisting>@Entity
+public class Parent {
+ @OneToMany(mappedBy="parent")
+ @org.hibernate.annotations.MapKey(columns=@Column(name="name"))
+ private Map<String, Child> children;
+ ...
+}
+
+ at Entity
+public class Parent {
+ ...
+ @Basic
+ private String name;
+
+ @ManyToOne
+ @JoinColumn(name="parent_id", nullable=false)
+ private Parent parent;
+ ...
+}</programlisting>
+
+ <para>Mais s'il n'y a pas de telle propriété sur la classe enfante,
+ nous ne pouvons pas penser que l'association est vraiment
+ bidirectionnelle (il y a des informations disponibles à une extrémité
+ qui ne sont pas disponibles à l'autre). Dans ce cas, nous ne pouvons
+ pas mapper la collection avec <literal>mappedBy</literal>. A la place,
+ nous pourrions utiliser le mapping suivant :</para>
+
+ <programlisting>@Entity
+public class Parent {
+ @OneToMany
+ @org.hibernate.annotations.MapKey(columns=@Column(name="name"))
+ @JoinColumn(name="parent_id", nullable=false)
+ private Map<String, Child> children;
+ ...
+}
+
+ at Entity
+public class Parent {
+ ...
+ @ManyToOne
+ @JoinColumn(name="parent_id", insertable=false, updatable=false, nullable=false)
+ private Parent parent;
+ ...
+}</programlisting>
+
+ <para>Notez que dans ce mapping, l'extrémité de l'association dont la
+ valeur est une collection est responsable des mises à jour pour la
+ clef étrangère.</para>
+ </sect4>
+
+ <sect4>
+ <title>Bag avec une clef primaire</title>
+
+ <para>Une autre fonctionnalité intéressante est la possibilité de
+ définir une clef primaire subrogée à une collection bag. Ceci enlève
+ pas mal d'inconvénients des bags : mise à jour et suppression
+ sont efficaces, plus d'un bag <literal>EAGER</literal> par requête ou
+ par entité. Cette clef primaire sera contenue dans une colonne
+ supplémentaire de votre table de collection mais ne sea pas visible
+ par l'application Java. @CollectionId est utilisée pour marquer une
+ collection comme "id bag", ca permet aussi de surcharger les colonnes
+ de la clef primaire, le type de la clef primaire et la stratégie du
+ générateur. La stratégie peut être <literal>identity</literal>, ou
+ n'importe quel nom de générateur défini de votre application.</para>
+
+ <programlisting>@Entity
+ at TableGenerator(name="ids_generator", table="IDS")
+public class Passport {
+ ...
+
+ @ManyToMany(cascade = CascadeType.ALL)
+ @JoinTable(name="PASSPORT_VISASTAMP")
+ <emphasis role="bold">@CollectionId(
+ columns = @Column(name="COLLECTION_ID"),
+ type=@Type(type="long"),
+ generator = "ids_generator"
+ )</emphasis>
+ private Collection<Stamp> visaStamp = new ArrayList();
+ ...
+}</programlisting>
+ </sect4>
+
+ <sect4>
+ <title>Collection d'éléments ou d'éléments composés</title>
+
+ <para>Hibernate Annotations prend aussi en charge les collections de
+ types core (Integer, String, Enums, ...), les collections d'objets
+ embarquables et même les tableaux de types primitifs. Ce sont des
+ collections d'éléments.</para>
+
+ <para>Une collection d'éléments doit être annotée comme
+ <literal>@CollectionOfElements</literal> (en tant que remplaçant de
+ <literal>@OneToMany</literal>). Pour définir la table de la
+ collection, l'annotation <literal>@JoinTable</literal> est utilisée
+ sur la propriété de l'association, <literal>joinColumns</literal>
+ définit les colonnes de jointure entre la table de l'entité primaire
+ et la table de la collection (inverseJoincolumn est inutile et
+ devrait être laissé à vide). Pour une collection de types core ou un
+ tableau de types primitifs, vous pouvez surcharger la définition de la
+ colonne de l'élément en utilisant <literal>@Column</literal> sur la
+ propriété de l'association. Vous pouvez aussi surcharger les colonnes
+ d'une collection d'objets embarquables en utilisant
+ <literal>@AttributeOverride</literal>. Pour atteindre l'élément de la
+ collection, vous avez besoin d'ajouter "element" au nom de l'attribut
+ surchargé (p. ex. "element" pour les types core, ou "element.serial"
+ pour la propriété serial d'un élément embarqué). Pour atteindre
+ l'index/clef d'une collection, ajoutez "key" à la place.</para>
+
+ <programlisting>@Entity
+public class Boy {
+ private Integer id;
+ private Set<String> nickNames = new HashSet<String>();
+ private int[] favoriteNumbers;
+ private Set<Toy> favoriteToys = new HashSet<Toy>();
+ private Set<Character> characters = new HashSet<Character>();
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ public Set<String></emphasis> getNickNames() {
+ return nickNames;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ @JoinTable(
+ table=@Table(name="BoyFavoriteNumbers"),
+ joinColumns = @JoinColumn(name="BoyId")
+ )
+ @Column(name="favoriteNumber", nullable=false)</emphasis>
+ @IndexColumn(name="nbr_index")
+ public int[] getFavoriteNumbers() {
+ return favoriteNumbers;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ @AttributeOverride( name="element.serial", column=@Column(name="serial_nbr") )</emphasis>
+ public Set<Toy> getFavoriteToys() {
+ return favoriteToys;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ public Set<Character></emphasis> getCharacters() {
+ return characters;
+ }
+ ...
+}
+
+public enum Character {
+ GENTLE,
+ NORMAL,
+ AGGRESSIVE,
+ ATTENTIVE,
+ VIOLENT,
+ CRAFTY
+}
+
+ at Embeddable
+public class Toy {
+ public String name;
+ public String serial;
+ public Boy owner;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSerial() {
+ return serial;
+ }
+
+ public void setSerial(String serial) {
+ this.serial = serial;
+ }
+
+ <emphasis role="bold">@Parent</emphasis>
+ public Boy getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Boy owner) {
+ this.owner = owner;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final Toy toy = (Toy) o;
+
+ if ( !name.equals( toy.name ) ) return false;
+ if ( !serial.equals( toy.serial ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = name.hashCode();
+ result = 29 * result + serial.hashCode();
+ return result;
+ }
+}</programlisting>
+
+ <para>Sur une collection d'objets embarquables, l'objet embarquable
+ peut avoir une propriété annotée avec <literal>@Parent</literal>.
+ Cette propriété pointera alors vers l'entité contenant la
+ collection.</para>
+
+ <note>
+ <para>Les versions précédentes d'Hibernate Annotations utilisaient
+ <literal>@OneToMany</literal> pour marquer une collection
+ d'éléments. Suite à des incohérences sémantiques, nous avons mis en
+ place l'annotation <literal>@CollectionOfElements</literal>. Pour
+ marquer des collections d'éléments, l'ancienne façon fonctionne
+ encore mais elle est considérée comme "deprecated" et ne sera plus
+ prise en charge dans les futures versions.</para>
+ </note>
+ </sect4>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>Cache</title>
+
+ <para>Pour optimiser vos accès à la base de données, vous pouvez activer
+ le cache de second niveau d'Hibernate. Ce cache est configurable par
+ entité et par collection.</para>
+
+ <para><literal>@org.hibernate.annotations.Cache</literal> définit la
+ stratégie de cache et la région du cache de second niveau donné. Cette
+ annotation peut être appliquée à une entité racine (pas les entités
+ filles), et sur les collections.</para>
+
+ <programlisting>@Entity
+ at Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
+public class Forest { ... }</programlisting>
+
+ <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+ @JoinColumn(name="CUST_ID")
+ @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
+ public SortedSet<Ticket> getTickets() {
+ return tickets;
+ }</programlisting>
+
+ <para></para>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="2 55" id="hm1" />
+
+ <area coords="3 55" id="hm2" />
+
+ <area coords="4 55" id="hm3" />
+ </areaspec>
+
+ <programlisting>@Cache(
+ CacheConcurrencyStrategy usage();
+ String region() default "";
+ String include() default "all";
+)</programlisting>
+
+ <calloutlist>
+ <callout arearefs="hm1">
+ <para>usage : la stratégie de concurrence du cache donné (NONE,
+ READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL) ;</para>
+ </callout>
+
+ <callout arearefs="hm2">
+ <para>region (optionnel) : la région du cache (par défaut le nom
+ complet de la classe avec le nom du package, ou le nom complet du
+ rôle de la collection) ;</para>
+ </callout>
+
+ <callout arearefs="hm3">
+ <para><literal>include</literal> (optionnel) : "all" pour inclure
+ toutes les propriétés, "non-lazy" pour inclure seulement les
+ propriétés qui ne sont pas chargées à la demande (valeur par
+ défaut : all).</para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+ </sect2>
+
+ <sect2 id="entity-hibspec-filters">
+ <title>Filtres</title>
+
+ <para>Hibernate a la capacité d'appliquer des filtres arbitraires à la
+ partie supérieure de vos données. Ces filtres sont appliqués au moment de
+ l'exécution sur une session donnée. Vous avez tout d'abord besoin de les
+ définir.</para>
+
+ <para><literal>@org.hibernate.annotations.FilterDef</literal> ou
+ <literal>@FilterDefs</literal> déclarent des définitions de filtre
+ utilisées par les filtres ayant le même nom. Une définition de filtre a
+ un name() et un tableau de parameters(). Un paramètre vous permettra
+ d'ajuster le comportement du filtre au moment de l'exécution. Chaque
+ paramètre est défini par une <literal>@ParamDef</literal> qui a un nom et
+ un type. Vous pouvez aussi définir un paramètre defaultCondition() pour
+ une <literal>@ParamDef</literal> donnée pour positionner la condition par
+ défaut à utiliser lorsqu'aucune n'est définie dans chaque
+ <literal>@Filter</literal> individuelle. Une <literal>@FilterDef</literal>
+ peut être définie au niveau de la classe ou du package.</para>
+
+ <para>Nous avons besoin de définir la clause du filtre SQL appliqué au
+ chargement de l'entité ou au chargement de la collection.
+ <literal>@Filter</literal> est utilisée et placée sur l'entité ou
+ l'élément de la collection.</para>
+
+ <para><programlisting>@Entity
+ at FilterDef(name="minLength", parameters={ @ParamDef( name="minLength", type="integer" ) } )
+ at Filters( {
+ @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"),
+ @Filter(name="minLength", condition=":minLength <= length")
+} )
+public class Forest { ... }</programlisting></para>
+
+ <para>Lorsque la collection utilise une table d'association comme
+ représentation relationnelle, vous pourriez vouloir appliquer la condition
+ du filtre à la table de l'association elle-même ou à la table de l'entité
+ cible. Pour appliquer la contrainte sur l'entité cible, utilisez
+ l'annotation habituelle <literal>@Filter</literal>. Cependant, si vous
+ voulez ciblez la table d'association, utilisez l'annotation
+ <literal>@FilterJoinTable</literal>.</para>
+
+ <programlisting> @OneToMany
+ @JoinTable
+ // filtre sur la table de l'entité cible
+ @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length")
+ // filtre sur la table d'association
+ @FilterJoinTable(name="security", condition=":userlevel >= requredLevel")
+ public Set<Forest> getForests() { ... }</programlisting>
+ </sect2>
+
+ <sect2 id="entity-hibspec-query">
+ <title>Requête</title>
+
+ <para>Puisqu'Hibernate a plus de fonctionnalités sur les requêtes nommées
+ que définies dans la spécification EJB3,
+ <literal>@org.hibernate.annotations.NamedQuery</literal>,
+ <literal>@org.hibernate.annotations.NamedQueries</literal>,
+ <literal>@org.hibernate.annotations.NamedNativeQuery</literal> et
+ <literal>@org.hibernate.annotations.NamedNativeQueries</literal> ont été
+ mis en place. Elles ajoutent des attributs à la version standard et
+ peuvent être utilisées comme remplaçant :</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>flushMode : définit le mode de flush de la requête (Always,
+ Auto, Commit ou Never)</para>
+ </listitem>
+
+ <listitem>
+ <para>cacheable : indique si la requête devrait être cachée ou
+ non</para>
+ </listitem>
+
+ <listitem>
+ <para>cacheRegion : région du cache utilisée si la requête est
+ cachée</para>
+ </listitem>
+
+ <listitem>
+ <para>fetchSize : taille de l'expression de récupération JDBC pour
+ cette requête</para>
+ </listitem>
+
+ <listitem>
+ <para>timeout : timeout de la requête</para>
+ </listitem>
+
+ <listitem>
+ <para>callable : pour les requêtes natives seulement, mettre à true
+ pour les procédures stockées</para>
+ </listitem>
+
+ <listitem>
+ <para>comment : si les commentaires sont activés, le commentaire vu
+ lorsque la requête est envoyée vers la base de données</para>
+ </listitem>
+
+ <listitem>
+ <para>cacheMode : mode d'intéraction du cache (get, ignore, normal,
+ put ou refresh)</para>
+ </listitem>
+
+ <listitem>
+ <para>readOnly : indique si les éléments récupérés à partir de la
+ requête sont en lecture seule ou pas</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Ces indications de fonctionnement peuvent être positionnées sur
+ les annotations standards <literal>@javax.persistence.NamedQuery</literal>
+ avec l'annotation <literal>@QueryHint</literal>. Un autre avantage clef
+ est la possibilité de positionner ces annotations au niveau du
+ package.</para>
+ </sect2>
+ </sect1>
+</chapter>
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/modules/lucene.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules/lucene.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/fr/modules/lucene.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,197 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="lucene" revision="1">
- <title>Intégration de Lucene avec Hibernate</title>
-
- <para>Lucene est une bibliothèque de la fondation Apache fournissant un moteur
- de recherche en Java hautement performant. Hibernate Annotations inclut un
- ensemble d'annotations qui vous permettent de marquer n'importe quel objet
- du modèle de données comme indexable et de laisser Hibernate maintenir un
- index Lucene de toutes les instances persistées via Hibernate.</para>
-
- <para>Hibernate Lucene est un projet en cours et de nouvelles fonctionnalités
- sont en préparation. Donc attendez-vous à certains changements avec les
- versions ultérieures.</para>
-
- <section id="lucene-mapping">
- <title>Mapper les entités sur l'index</title>
-
- <para>Tout d'abord, nous devons déclarer une classe persistante comme
- étant indexable. Ceci se fait en annotant la classe avec
- <literal>@Indexed</literal> :</para>
-
- <programlisting>@Entity
- at Indexed(index="indexes/essays")
-public class Essay {
- ...
-}</programlisting>
-
- <para>L'attribut <literal>index</literal> indique à Hibernate quel est le
- nom du répertoire Lucene (en général un répertoire de votre système de
- fichiers). Si vous souhaitez définir un répertoire de départ pour tous vos
- index Lucene, vous pouvez utiliser la propriété
- <literal>hibernate.lucene.default.indexDir</literal> dans votre fichier de
- configuration.</para>
-
- <para>Les index Lucene contiennent quatre types de champs :
- <emphasis>keyword</emphasis>, <emphasis>text</emphasis>,
- <emphasis>unstored</emphasis> et <emphasis>unindexed</emphasis>. Hibernate
- Annotations fournit des annotations pour marquer une propriété d'une entité
- comme étant d'un des trois premiers types.</para>
-
- <programlisting>@Entity
- at Indexed(index="indexes/essays")
-public class Essay {
- ...
-
- @Id
- @Keyword(id=true)
- public Long getId() { return id; }
-
- @Text(name="Abstract")
- public String getSummary() { return summary; }
-
- @Lob
- @Unstored
- public String getText() { return text; }
-
-}</programlisting>
-
- <para>Ces annotations définissent un index avec trois champs :
- <literal>id</literal>, <literal>Abstract</literal> et
- <literal>text</literal>. Notez que par défaut le nom du champ n'a plus de
- majuscules, en suivant la spécification JavaBean.</para>
-
- <para>Note : vous <emphasis>devez</emphasis> spécifier
- <literal>@Keyword(id=true)</literal> sur la propriété identifiante de
- votre entité.</para>
-
- <para>Lucene a la notion of <emphasis>boost factor</emphasis>. C'est un
- moyen de donner plus de poids à un champ ou à un élément indexé durant la
- procédure d'indexation. Vous pouvez utiliser <literal>@Boost</literal> au
- niveau du champ ou de la classe.</para>
-
- <para>La classe analyste utilisée pour indexer les éléments est
- configurable par la propriété
- <literal>hibernate.lucene.analyzer</literal>. Si aucune n'est définie,
- <classname>org.apache.lucene.analysis.standard.StandardAnalyzer</classname>
- est utilisée par défaut.</para>
- </section>
-
- <section id="lucene-configuration">
- <title>Configuration</title>
-
- <section id="lucene-configuration-directory">
- <title>Configuration du directory</title>
-
- <para>Lucene a une notion de Directory où l'index est stocké.
- L'implémentation de Directory peut être personnalisée mais Lucene arrive,
- avec deux implémentations prêtes à l'emploi complètes, une sur un système
- de fichiers et une en mémoire. Hibernate Lucene a la notion de
- <literal>DirectoryProvider</literal> qui gère la configuration et
- l'initialisation du Directory Lucene.</para>
-
- <table>
- <title>Liste des Directory Providers intégrés</title>
-
- <tgroup cols="3">
- <thead>
- <row>
- <entry align="center">Classe</entry>
-
- <entry align="center">Description</entry>
-
- <entry align="center">Propriétés</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>org.hibernate.lucene.store.FSDirectoryProvider</entry>
-
- <entry>Directory base sur le système de fichiers. Le répertoire
- utilisé sera
- <indexBase>/<<literal>@Index.name</literal>></entry>
-
- <entry><literal>indexBase</literal> : répertoire de départ</entry>
- </row>
-
- <row>
- <entry>org.hibernate.lucene.store.RAMDirectoryProvider</entry>
-
- <entry>Directory utilisant la mémoire, le directory sera
- uniquement identifié par l'élément
- <literal>@Index.name</literal></entry>
-
- <entry>aucune</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>Si les directory providers intégrés ne répondent pas à vos besoins,
- vous pouvez écrire votre propre directory provider en implémentant
- l'interface
- <classname>org.hibernate.store.DirectoryProvider</classname>.</para>
-
- <para>Chaque entité indexée est associée à un index Lucene (un index peut
- être partagé par différentes entités mais ce n'est pas le cas en général).
- Vous pouvez configurer l'index à travers des propriétés préfixées par
- <literal><literal>hibernate.lucene.<indexname></literal></literal>.
- Les propriétés par défaut héritées par tous les index peuvent être
- définies en utilisant le préfixe hibernate.lucene.default.</para>
-
- <para>Pour définir le directory provider d'un index donné, utilisez
- <literal>hibernate.lucene.<indexname>.directory_provider</literal>.</para>
-
- <programlisting>hibernate.lucene.default.directory_provider org.hibernate.lucene.store.FSDirectoryProvider
-hibernate.lucene.default.indexDir=/usr/lucene/indexes
-
-hibernate.lucene.Rules.directory_provider org.hibernate.lucene.store.RAMDirectoryProvider
-</programlisting>
-
- <para>appliqué à</para>
-
- <programlisting>@Indexed(name="Status")
-public class Status { ... }
-
- at Indexed(name="Rules")
-public class Rule { ... }</programlisting>
-
- <para>Ceci créera un directory système de fichiers dans
- <filename>/usr/lucene/indexes/Status</filename> où les entités Status
- seront indexées, et utilisera un directory mémoire nommé
- <literal>Rules</literal> où les entités Rule seront indexées.</para>
-
- <para>Donc vous pouvez facilement définir des règles générales comme le
- directory provider et le répertoire de départ, et surcharger ces valeurs
- par défaut plus tard pour chaque index.</para>
-
- <para>En écrivant votre propre DirectoryProvider, vous pouvez aussi
- bénéficier de ce mécanisme de configuration.</para>
- </section>
-
- <section id="lucene-configuration-event">
- <title>Activer l'indexation automatique</title>
-
- <para>Finalement, nous activons le <literal>LuceneEventListener</literal>
- pour les trois événements Hibernate qui ont lieu après que les changements
- sont validés dans la base de données.</para>
-
- <programlisting><hibernate-configuration>
- ...
- <event type="post-commit-update"
- <listener
- class="org.hibernate.lucene.event.LuceneEventListener"/>
- </event>
- <event type="post-commit-insert"
- <listener
- class="org.hibernate.lucene.event.LuceneEventListener"/>
- </event>
- <event type="post-commit-delete"
- <listener
- class="org.hibernate.lucene.event.LuceneEventListener"/>
- </event>
-</hibernate-configuration></programlisting>
- </section>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/fr/modules/lucene.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules/lucene.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/fr/modules/lucene.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/fr/modules/lucene.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,197 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="lucene" revision="1">
+ <title>Intégration de Lucene avec Hibernate</title>
+
+ <para>Lucene est une bibliothèque de la fondation Apache fournissant un moteur
+ de recherche en Java hautement performant. Hibernate Annotations inclut un
+ ensemble d'annotations qui vous permettent de marquer n'importe quel objet
+ du modèle de données comme indexable et de laisser Hibernate maintenir un
+ index Lucene de toutes les instances persistées via Hibernate.</para>
+
+ <para>Hibernate Lucene est un projet en cours et de nouvelles fonctionnalités
+ sont en préparation. Donc attendez-vous à certains changements avec les
+ versions ultérieures.</para>
+
+ <section id="lucene-mapping">
+ <title>Mapper les entités sur l'index</title>
+
+ <para>Tout d'abord, nous devons déclarer une classe persistante comme
+ étant indexable. Ceci se fait en annotant la classe avec
+ <literal>@Indexed</literal> :</para>
+
+ <programlisting>@Entity
+ at Indexed(index="indexes/essays")
+public class Essay {
+ ...
+}</programlisting>
+
+ <para>L'attribut <literal>index</literal> indique à Hibernate quel est le
+ nom du répertoire Lucene (en général un répertoire de votre système de
+ fichiers). Si vous souhaitez définir un répertoire de départ pour tous vos
+ index Lucene, vous pouvez utiliser la propriété
+ <literal>hibernate.lucene.default.indexDir</literal> dans votre fichier de
+ configuration.</para>
+
+ <para>Les index Lucene contiennent quatre types de champs :
+ <emphasis>keyword</emphasis>, <emphasis>text</emphasis>,
+ <emphasis>unstored</emphasis> et <emphasis>unindexed</emphasis>. Hibernate
+ Annotations fournit des annotations pour marquer une propriété d'une entité
+ comme étant d'un des trois premiers types.</para>
+
+ <programlisting>@Entity
+ at Indexed(index="indexes/essays")
+public class Essay {
+ ...
+
+ @Id
+ @Keyword(id=true)
+ public Long getId() { return id; }
+
+ @Text(name="Abstract")
+ public String getSummary() { return summary; }
+
+ @Lob
+ @Unstored
+ public String getText() { return text; }
+
+}</programlisting>
+
+ <para>Ces annotations définissent un index avec trois champs :
+ <literal>id</literal>, <literal>Abstract</literal> et
+ <literal>text</literal>. Notez que par défaut le nom du champ n'a plus de
+ majuscules, en suivant la spécification JavaBean.</para>
+
+ <para>Note : vous <emphasis>devez</emphasis> spécifier
+ <literal>@Keyword(id=true)</literal> sur la propriété identifiante de
+ votre entité.</para>
+
+ <para>Lucene a la notion of <emphasis>boost factor</emphasis>. C'est un
+ moyen de donner plus de poids à un champ ou à un élément indexé durant la
+ procédure d'indexation. Vous pouvez utiliser <literal>@Boost</literal> au
+ niveau du champ ou de la classe.</para>
+
+ <para>La classe analyste utilisée pour indexer les éléments est
+ configurable par la propriété
+ <literal>hibernate.lucene.analyzer</literal>. Si aucune n'est définie,
+ <classname>org.apache.lucene.analysis.standard.StandardAnalyzer</classname>
+ est utilisée par défaut.</para>
+ </section>
+
+ <section id="lucene-configuration">
+ <title>Configuration</title>
+
+ <section id="lucene-configuration-directory">
+ <title>Configuration du directory</title>
+
+ <para>Lucene a une notion de Directory où l'index est stocké.
+ L'implémentation de Directory peut être personnalisée mais Lucene arrive,
+ avec deux implémentations prêtes à l'emploi complètes, une sur un système
+ de fichiers et une en mémoire. Hibernate Lucene a la notion de
+ <literal>DirectoryProvider</literal> qui gère la configuration et
+ l'initialisation du Directory Lucene.</para>
+
+ <table>
+ <title>Liste des Directory Providers intégrés</title>
+
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry align="center">Classe</entry>
+
+ <entry align="center">Description</entry>
+
+ <entry align="center">Propriétés</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>org.hibernate.lucene.store.FSDirectoryProvider</entry>
+
+ <entry>Directory base sur le système de fichiers. Le répertoire
+ utilisé sera
+ <indexBase>/<<literal>@Index.name</literal>></entry>
+
+ <entry><literal>indexBase</literal> : répertoire de départ</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.lucene.store.RAMDirectoryProvider</entry>
+
+ <entry>Directory utilisant la mémoire, le directory sera
+ uniquement identifié par l'élément
+ <literal>@Index.name</literal></entry>
+
+ <entry>aucune</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>Si les directory providers intégrés ne répondent pas à vos besoins,
+ vous pouvez écrire votre propre directory provider en implémentant
+ l'interface
+ <classname>org.hibernate.store.DirectoryProvider</classname>.</para>
+
+ <para>Chaque entité indexée est associée à un index Lucene (un index peut
+ être partagé par différentes entités mais ce n'est pas le cas en général).
+ Vous pouvez configurer l'index à travers des propriétés préfixées par
+ <literal><literal>hibernate.lucene.<indexname></literal></literal>.
+ Les propriétés par défaut héritées par tous les index peuvent être
+ définies en utilisant le préfixe hibernate.lucene.default.</para>
+
+ <para>Pour définir le directory provider d'un index donné, utilisez
+ <literal>hibernate.lucene.<indexname>.directory_provider</literal>.</para>
+
+ <programlisting>hibernate.lucene.default.directory_provider org.hibernate.lucene.store.FSDirectoryProvider
+hibernate.lucene.default.indexDir=/usr/lucene/indexes
+
+hibernate.lucene.Rules.directory_provider org.hibernate.lucene.store.RAMDirectoryProvider
+</programlisting>
+
+ <para>appliqué à</para>
+
+ <programlisting>@Indexed(name="Status")
+public class Status { ... }
+
+ at Indexed(name="Rules")
+public class Rule { ... }</programlisting>
+
+ <para>Ceci créera un directory système de fichiers dans
+ <filename>/usr/lucene/indexes/Status</filename> où les entités Status
+ seront indexées, et utilisera un directory mémoire nommé
+ <literal>Rules</literal> où les entités Rule seront indexées.</para>
+
+ <para>Donc vous pouvez facilement définir des règles générales comme le
+ directory provider et le répertoire de départ, et surcharger ces valeurs
+ par défaut plus tard pour chaque index.</para>
+
+ <para>En écrivant votre propre DirectoryProvider, vous pouvez aussi
+ bénéficier de ce mécanisme de configuration.</para>
+ </section>
+
+ <section id="lucene-configuration-event">
+ <title>Activer l'indexation automatique</title>
+
+ <para>Finalement, nous activons le <literal>LuceneEventListener</literal>
+ pour les trois événements Hibernate qui ont lieu après que les changements
+ sont validés dans la base de données.</para>
+
+ <programlisting><hibernate-configuration>
+ ...
+ <event type="post-commit-update"
+ <listener
+ class="org.hibernate.lucene.event.LuceneEventListener"/>
+ </event>
+ <event type="post-commit-insert"
+ <listener
+ class="org.hibernate.lucene.event.LuceneEventListener"/>
+ </event>
+ <event type="post-commit-delete"
+ <listener
+ class="org.hibernate.lucene.event.LuceneEventListener"/>
+ </event>
+</hibernate-configuration></programlisting>
+ </section>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/modules/setup.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules/setup.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/fr/modules/setup.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,158 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter>
- <title id="setup" revision="1">Configurer un projet avec des annotations</title>
-
- <section id="setup-requirements">
- <title>Prérequis</title>
-
- <itemizedlist>
- <listitem>
- <para>Téléchargez et installez la distribution Hibernate Annotations à
- partir du site web d'Hibernate.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>Cette version requiert Hibernate 3.2.0.GA ou
- supérieur. N'utilisez pas cette version d'Hibernate Annotations avec
- une version plus ancienne d'Hibernate 3.x !</emphasis></para>
- </listitem>
-
- <listitem>
- <para>Cette version est connue pour fonctionner avec le noyau 3.2.0.CR5
- et 3.2.0.GA d'Hibernate.</para>
- </listitem>
-
- <listitem>
- <para>Assurez-vous que vous avez le JDK 5.0 d'installé. Vous pouvez
- bien sûr continuer à utiliser XDoclet et avoir certains des avantages
- des méta-données basées sur les annotations avec des versions plus
- anciennes du JDK. Notez que ce document décrit seulement les annotations
- du JDK 5.0 et que vous devez vous référer à la documentation de XDoclet
- pour plus d'informations.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="setup-configuration">
- <title>Configuration</title>
-
- <para>Tout d'abord, paramétrez votre classpath (après avoir créer un nouveau
- projet dans votre IDE favori) :<itemizedlist>
- <listitem>
- <para>Copiez toutes les bibliothèques du noyau Hibernate3 et toutes
- les bibliothèques tierces requises (voir lib/README.txt dans
- Hibernate).</para>
- </listitem>
-
- <listitem>
- <para>Copiez aussi <filename>hibernate-annotations.jar</filename> et
- <filename>lib/ejb3-persistence.jar</filename> de la distribution
- Hibernate Annotations dans votre classpath.</para>
- </listitem>
-
- <listitem>
- <para>Pour utiliser <xref linkend="lucene" />, ajouter le fichier jar
- de lucene.</para>
- </listitem>
- </itemizedlist></para>
-
- <para>Nous recommandons aussi un petit wrapper pour démarrer Hibernate dans
- un bloc statique d'initialisation, connu en tant que
- <classname>HibernateUtil</classname>. Vous pourriez avoir vu cette classe
- sous diverses formes dans d'autres parties de la documentation Hibernate.
- Pour prendre en charge Annotation vous devez modifier cette classe d'aide
- de la manière suivante :<programlisting>package hello;
-
-import org.hibernate.*;
-import org.hibernate.cfg.*;
-import test.*;
-import test.animals.Dog;
-
-public class HibernateUtil {
-
-private static final SessionFactory sessionFactory;
-
- static {
- try {
-
- sessionFactory = new <emphasis role="bold">AnnotationConfiguration()</emphasis>.buildSessionFactory();
- } catch (Throwable ex) {
- // Log exception!
- throw new ExceptionInInitializerError(ex);
- }
- }
-
- public static Session getSession()
- throws HibernateException {
- return sessionFactory.openSession();
- }
-}
- </programlisting></para>
-
- <para>La partie intéressante ici est l'utilisation de
- <classname>AnnotationConfiguration</classname>. Les packages et les classes
- annotées sont déclarés dans votre fichier de configuration XML habituel
- (généralement <filename>hibernate.cfg.xml</filename>). Voici un équivalent
- de la déclaration ci-dessus :</para>
-
- <programlisting><!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
-
- <hibernate-configuration>
- <session-factory>
- <emphasis role="bold"><mapping package="test.animals"/>
- <mapping class="test.Flight"/>
- <mapping class="test.Sky"/>
- <mapping class="test.Person"/>
- <mapping class="test.animals.Dog"/></emphasis>
-<emphasis role="bold"> <mapping resource="test/animals/orm.xml"/></emphasis>
- </session-factory>
- </hibernate-configuration>
- </programlisting>
-
- <para>Notez que vous pouvez mélanger l'utilisation du fichier hbm.xml et
- celle des annotations. L'élément de ressource peut être un fichier hbm ou
- un descripteur de déploiement XML EJB3. Cette distinction est transparente
- pour votre procédure de configuration.</para>
-
- <para>Alternativement, vous pouvez définir les classes annotées et des
- packages en utilisant l'API :</para>
-
- <programlisting> sessionFactory = new <emphasis role="bold">AnnotationConfiguration()
- .addPackage("test.animals") // le nom complet du package
- .addAnnotatedClass(Flight.class)
- .addAnnotatedClass(Sky.class)
- .addAnnotatedClass(Person.class)
- .addAnnotatedClass(Dog.class)</emphasis>
-<emphasis role="bold"> .addResource("test/animals/orm.xml")</emphasis>
- .buildSessionFactory();</programlisting>
-
- <para>Vous pouvez aussi utiliser Hibernate EntityManager qui a son propre
- mécanisme de configuration. Veullez vous référer à la documentation de ce
- projet pour plus de détails.</para>
-
- <para>Il n'y a pas d'autres différences dans la façon d'utiliser les APIs
- d'Hibernate, excepté ce changement de routine de démarrage ou le fichier
- de configuration. Vous pouvez utiliser votre méthode de configuration
- favorite pour d'autres propriétés (<filename>hibernate.properties</filename>,
- <filename>hibernate.cfg.xml</filename>, utilisation des APIs, etc). Vous
- pouvez même mélanger les classes persistantes annotées et des déclarations
- <filename>hbm.cfg.xml</filename> classiques avec la même
- <classname>SessionFactory</classname>. Vous ne pouvez cependant pas déclarer
- une classe plusieurs fois (soit avec les annotations, soit avec un fichier
- hbm.xml). Vous ne pouvez pas non plus mélanger des stratégies de
- configuration (hbm vs annotations) dans une hiérarchie d'entités
- mappées.</para>
-
- <para>Pour faciliter la procédure de migration de fichiers hbm vers les
- annotations, le mécanisme de configuration détecte la duplication de mappings
- entre les annotations et les fichiers hbm. Les classes décrites dans les
- fichiers hbm se voient alors affecter une priorité plus grande que les
- classes annotées. Vous pouvez changer cette priorité avec la propriété
- <literal>hibernate.mapping.precedence</literal>. La valeur par défaut est :
- <literal>hbm, class</literal> ; la changer en : <literal>class, hbm</literal>
- donne alors la priorité aux classes annotées lorsqu'un conflit
- survient.</para>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/fr/modules/setup.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules/setup.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/fr/modules/setup.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/fr/modules/setup.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter>
+ <title id="setup" revision="1">Configurer un projet avec des annotations</title>
+
+ <section id="setup-requirements">
+ <title>Prérequis</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>Téléchargez et installez la distribution Hibernate Annotations à
+ partir du site web d'Hibernate.</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>Cette version requiert Hibernate 3.2.0.GA ou
+ supérieur. N'utilisez pas cette version d'Hibernate Annotations avec
+ une version plus ancienne d'Hibernate 3.x !</emphasis></para>
+ </listitem>
+
+ <listitem>
+ <para>Cette version est connue pour fonctionner avec le noyau 3.2.0.CR5
+ et 3.2.0.GA d'Hibernate.</para>
+ </listitem>
+
+ <listitem>
+ <para>Assurez-vous que vous avez le JDK 5.0 d'installé. Vous pouvez
+ bien sûr continuer à utiliser XDoclet et avoir certains des avantages
+ des méta-données basées sur les annotations avec des versions plus
+ anciennes du JDK. Notez que ce document décrit seulement les annotations
+ du JDK 5.0 et que vous devez vous référer à la documentation de XDoclet
+ pour plus d'informations.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="setup-configuration">
+ <title>Configuration</title>
+
+ <para>Tout d'abord, paramétrez votre classpath (après avoir créer un nouveau
+ projet dans votre IDE favori) :<itemizedlist>
+ <listitem>
+ <para>Copiez toutes les bibliothèques du noyau Hibernate3 et toutes
+ les bibliothèques tierces requises (voir lib/README.txt dans
+ Hibernate).</para>
+ </listitem>
+
+ <listitem>
+ <para>Copiez aussi <filename>hibernate-annotations.jar</filename> et
+ <filename>lib/ejb3-persistence.jar</filename> de la distribution
+ Hibernate Annotations dans votre classpath.</para>
+ </listitem>
+
+ <listitem>
+ <para>Pour utiliser <xref linkend="lucene" />, ajouter le fichier jar
+ de lucene.</para>
+ </listitem>
+ </itemizedlist></para>
+
+ <para>Nous recommandons aussi un petit wrapper pour démarrer Hibernate dans
+ un bloc statique d'initialisation, connu en tant que
+ <classname>HibernateUtil</classname>. Vous pourriez avoir vu cette classe
+ sous diverses formes dans d'autres parties de la documentation Hibernate.
+ Pour prendre en charge Annotation vous devez modifier cette classe d'aide
+ de la manière suivante :<programlisting>package hello;
+
+import org.hibernate.*;
+import org.hibernate.cfg.*;
+import test.*;
+import test.animals.Dog;
+
+public class HibernateUtil {
+
+private static final SessionFactory sessionFactory;
+
+ static {
+ try {
+
+ sessionFactory = new <emphasis role="bold">AnnotationConfiguration()</emphasis>.buildSessionFactory();
+ } catch (Throwable ex) {
+ // Log exception!
+ throw new ExceptionInInitializerError(ex);
+ }
+ }
+
+ public static Session getSession()
+ throws HibernateException {
+ return sessionFactory.openSession();
+ }
+}
+ </programlisting></para>
+
+ <para>La partie intéressante ici est l'utilisation de
+ <classname>AnnotationConfiguration</classname>. Les packages et les classes
+ annotées sont déclarés dans votre fichier de configuration XML habituel
+ (généralement <filename>hibernate.cfg.xml</filename>). Voici un équivalent
+ de la déclaration ci-dessus :</para>
+
+ <programlisting><!DOCTYPE hibernate-configuration PUBLIC
+ "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+ <hibernate-configuration>
+ <session-factory>
+ <emphasis role="bold"><mapping package="test.animals"/>
+ <mapping class="test.Flight"/>
+ <mapping class="test.Sky"/>
+ <mapping class="test.Person"/>
+ <mapping class="test.animals.Dog"/></emphasis>
+<emphasis role="bold"> <mapping resource="test/animals/orm.xml"/></emphasis>
+ </session-factory>
+ </hibernate-configuration>
+ </programlisting>
+
+ <para>Notez que vous pouvez mélanger l'utilisation du fichier hbm.xml et
+ celle des annotations. L'élément de ressource peut être un fichier hbm ou
+ un descripteur de déploiement XML EJB3. Cette distinction est transparente
+ pour votre procédure de configuration.</para>
+
+ <para>Alternativement, vous pouvez définir les classes annotées et des
+ packages en utilisant l'API :</para>
+
+ <programlisting> sessionFactory = new <emphasis role="bold">AnnotationConfiguration()
+ .addPackage("test.animals") // le nom complet du package
+ .addAnnotatedClass(Flight.class)
+ .addAnnotatedClass(Sky.class)
+ .addAnnotatedClass(Person.class)
+ .addAnnotatedClass(Dog.class)</emphasis>
+<emphasis role="bold"> .addResource("test/animals/orm.xml")</emphasis>
+ .buildSessionFactory();</programlisting>
+
+ <para>Vous pouvez aussi utiliser Hibernate EntityManager qui a son propre
+ mécanisme de configuration. Veullez vous référer à la documentation de ce
+ projet pour plus de détails.</para>
+
+ <para>Il n'y a pas d'autres différences dans la façon d'utiliser les APIs
+ d'Hibernate, excepté ce changement de routine de démarrage ou le fichier
+ de configuration. Vous pouvez utiliser votre méthode de configuration
+ favorite pour d'autres propriétés (<filename>hibernate.properties</filename>,
+ <filename>hibernate.cfg.xml</filename>, utilisation des APIs, etc). Vous
+ pouvez même mélanger les classes persistantes annotées et des déclarations
+ <filename>hbm.cfg.xml</filename> classiques avec la même
+ <classname>SessionFactory</classname>. Vous ne pouvez cependant pas déclarer
+ une classe plusieurs fois (soit avec les annotations, soit avec un fichier
+ hbm.xml). Vous ne pouvez pas non plus mélanger des stratégies de
+ configuration (hbm vs annotations) dans une hiérarchie d'entités
+ mappées.</para>
+
+ <para>Pour faciliter la procédure de migration de fichiers hbm vers les
+ annotations, le mécanisme de configuration détecte la duplication de mappings
+ entre les annotations et les fichiers hbm. Les classes décrites dans les
+ fichiers hbm se voient alors affecter une priorité plus grande que les
+ classes annotées. Vous pouvez changer cette priorité avec la propriété
+ <literal>hibernate.mapping.precedence</literal>. La valeur par défaut est :
+ <literal>hbm, class</literal> ; la changer en : <literal>class, hbm</literal>
+ donne alors la priorité aux classes annotées lorsqu'un conflit
+ survient.</para>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/modules/validator.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules/validator.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/fr/modules/validator.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,569 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="validator">
- <title>Hibernate Validator</title>
-
- <para>Les annotations sont une manière très commode et élégante pour spécifier
- des contraintes invariantes sur un modèle de données. Vous pouvez, par
- exemple, indiquer qu'une propriété ne devrait pas être nulle, que le solde
- d'un compte devrait être strictement positif, etc. Ces contraintes de modèle
- de données sont déclarées dans le bean lui-même en annotant ses propriétés.
- Un validateur peut alors les lire et vérifier les violations de contraintes.
- Le mécanisme de validation peut être exécuté dans différentes couches de
- votre application (présentation, accès aux données) sans devoir dupliquer
- ces règles. Hibernate Validator a été conçu dans ce but.</para>
-
- <para>Hibernate Validator fonctionne sur deux niveaux. D'abord, il est capable
- de vérifier des violations de contraintes sur les instances d'une classe en
- mémoire. Ensuite, il peut appliquer les contraintes au méta-modèle d'Hibernate
- et les incorporer au schéma de base de données généré.</para>
-
- <para>Chaque annotation de contrainte est associée à l'implémentation du
- validateur responsable de vérifier la contrainte sur l'instance de l'entité.
- Un validateur peut aussi (optionnellement) appliquer la contrainte au
- méta-modèle d'Hibernate, permettant à Hibernate de générer le DDL qui
- exprime la contrainte. Avec le listener d'événements approprié, vous pouvez
- exécuter l'opération de vérification lors des insertions et des mises à jour
- effectuées par Hibernate. Hibernate Validator n'est pas limité à Hibernate.
- Vous pouvez facilement l'utiliser n'importe où dans votre application.</para>
-
- <para>Lors de la vérification des instances à l'exécution, Hibernate Validator
- retourne des informations à propos des violations de contraintes dans un
- tableau de <classname>InvalidValue</classname>s. Parmi d'autres informations,
- <classname>InvalidValue</classname> contient un message de description
- d'erreur qui peut inclure les valeurs des paramètres associés à l'annotation
- (p. ex. la limite de taille), et des chaînes de caractères qui peuvent être
- externalisées avec un <classname>ResourceBundle</classname>.</para>
-
- <sect1 id="validator-constraints">
- <title>Contraintes</title>
-
- <sect2>
- <title>Qu'est-ce qu'une contrainte ?</title>
-
- <para>Une contrainte est représentée par une annotation. Une contrainte a
- généralement des attributs utilisés pour paramétrer les limites des
- contraintes. La contrainte s'applique à l'élément annoté.</para>
- </sect2>
-
- <sect2>
- <title>Contraintes intégrées</title>
-
- <para>Hibernate Validator arrive avec des contraintes intégrées,
- lesquelles couvrent la plupart des vérifications de données de base. Comme
- nous le verrons plus tard, vous n'êtes pas limité à celles-ci, vous pouvez
- écrire vos propres contraintes en une minute.</para>
-
- <table>
- <title>Contraintes intégrées</title>
-
- <tgroup cols="4">
- <colspec align="center" />
-
- <thead>
- <row>
- <entry>Annotation</entry>
-
- <entry>S'applique à</entry>
-
- <entry>Vérification à l'exécution</entry>
-
- <entry>Impact sur les méta-données d'Hibernate</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>@Length(min=, max=)</entry>
-
- <entry>propriété (String)</entry>
-
- <entry>vérifie si la longueur de la chaîne de caractères est
- comprise dans l'intervalle</entry>
-
- <entry>la longueur de la colonne sera positionnée à max</entry>
- </row>
-
- <row>
- <entry>@Max(value=)</entry>
-
- <entry>propriété (nombre ou chaîne de caractères représentant un
- nombre)</entry>
-
- <entry>vérifie si la valeur est inférieure ou égale à max</entry>
-
- <entry>ajoute une contrainte de vérification sur la
- colonne</entry>
- </row>
-
- <row>
- <entry>@Min(value=)</entry>
-
- <entry>propriété (nombre ou chaîne de caractères représentant un
- nombre)</entry>
-
- <entry>vérifie si la valeur est supérieure ou égale à max</entry>
-
- <entry>ajoute une contrainte de vérification sur la
- colonne</entry>
- </row>
-
- <row>
- <entry>@NotNull</entry>
-
- <entry>propriété</entry>
-
- <entry>vérifie si la valeur n'est pas nulle</entry>
-
- <entry>les colonnes sont marquées "not null"</entry>
- </row>
-
- <row>
- <entry>@Past</entry>
-
- <entry>propriété (Date ou Calendar)</entry>
-
- <entry>vérifie si la date est dans le passé</entry>
-
- <entry>ajoute une contrainte de vérification sur la
- colonne</entry>
- </row>
-
- <row>
- <entry>@Future</entry>
-
- <entry>propriété (Date ou Calendar)</entry>
-
- <entry>vérifie si la date est dans le futur</entry>
-
- <entry>aucun</entry>
- </row>
-
- <row>
- <entry>@Pattern(regex="regexp", flag=)</entry>
-
- <entry>propriété (String)</entry>
-
- <entry>vérifie si la propriété correspond à l'expression
- rationnelle donnée (pour "flag", voir
- <classname> java.util.regex.Pattern</classname>)</entry>
-
- <entry>aucun</entry>
- </row>
-
- <row>
- <entry>@Range(min=, max=)</entry>
-
- <entry>propriété (nombre ou chaîne de caractères représentant un
- nombre)</entry>
-
- <entry>vérifie si la valeur est comprise entre min et max
- (inclus)</entry>
-
- <entry>ajoute une contrainte de vérification sur la
- colonne</entry>
- </row>
-
- <row>
- <entry>@Size(min=, max=)</entry>
-
- <entry>propriété (tableau, collection, map)</entry>
-
- <entry>vérifie si la taille de l'élément est comprise entre min et
- max (inclus)</entry>
-
- <entry>aucun</entry>
- </row>
-
- <row>
- <entry>@AssertFalse</entry>
-
- <entry>propriété</entry>
-
- <entry>vérifie que la méthode est évaluée à faux (utile pour les
- contraintes exprimées dans le code plutôt que dans les
- annotations)</entry>
-
- <entry>aucun</entry>
- </row>
-
- <row>
- <entry>@AssertTrue</entry>
-
- <entry>propriété</entry>
-
- <entry>vérifie que la méthode est évaluée à vrai (utile pour les
- contraintes exprimées dans le code plutôt que dans les
- annotations)</entry>
-
- <entry>aucun</entry>
- </row>
-
- <row>
- <entry>@Valid</entry>
-
- <entry>propriété (objet)</entry>
-
- <entry>exécute la validation récursivement sur l'objet associé.
- Si l'objet est une Collection ou un tableau, les éléments sont
- validés récursivement. Si l'objet est une Map, les éléments
- valeur sont validés récursivement.</entry>
-
- <entry>aucun</entry>
- </row>
-
- <row>
- <entry>@Email</entry>
-
- <entry>propriété (String)</entry>
-
- <entry>vérifie si la chaîne de caractères est conforme à la
- spécification d'une adresse e-mail</entry>
-
- <entry>aucun</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect2>
-
- <sect2 id="validator-constraints-error" xreflabel="Messages d'erreur">
- <title>Messages d'erreur</title>
-
- <para>Hibernate Validator arrive avec un ensemble de messages d'erreur par
- défaut traduits dans environ dix langues (si la vôtre n'en fait pas
- partie, veuillez nous envoyer un patch). Vous pouvez surcharger ces
- messages en créant un <filename>ValidatorMessages.properties</filename>
- (ou <filename>ValidatorMessages_loc.properties</filename>) et en
- surchargeant les clefs dont vous avez besoin. Vous pouvez même ajouter
- votre propre ensemble de messages supplémentaire lorsque vous écrivez
- vos annotations de validation. Si Hibernate Validator ne peut pas trouver
- une clef à partir de votre resourceBundle ou de votre ValidatorMessage,
- il se repliera sur les valeurs intégrées par défaut.</para>
-
- <para>Alternativement vous pouvez fournir un
- <classname>ResourceBundle</classname> pendant la vérification par
- programmation des règles de validation sur un bean, ou si vous voulez un
- mécanisme d'interpolation complètement différent, vous pouvez fournir une
- implémentation de
- <literal>org.hibernate.validator.MessageInterpolator</literal> (lisez la
- JavaDoc pour plus d'informations).</para>
- </sect2>
-
- <sect2>
- <title>Ecrire vos propres contraintes</title>
-
- <para>Etendre l'ensemble de contraintes intégrées est extrêment facile.
- N'importe quelle contrainte est constituée deux morceaux : le
- <emphasis>descripteur</emphasis> de contrainte (l'annotation) et le
- <emphasis>validateur</emphasis> de contrainte (la classe
- d'implémentation). Voici un simple descripteur personnalisé :</para>
-
- <programlisting>@ValidatorClass(CapitalizedValidator.class)
- at Target(METHOD)
- at Retention(RUNTIME)
- at Documented
-public @interface Capitalized {
- CapitalizeType type() default Capitalize.FIRST;
- String message() default "has incorrect capitalization";
-}</programlisting>
-
- <para><literal>type</literal> est un paramètre décrivant comment la
- propriété devrait être mise en majuscule. Ceci est un paramètre
- utilisateur complètement dépendant du fonctionnement de
- l'annotation.</para>
-
- <para><literal>message</literal> est la chaîne de caractères par défaut
- utilisée pour décrire la violation de contrainte et est obligatoire. Vous
- pouvez mettre la chaîne de caractères dans le code ou bien l'externaliser
- en partie ou complètement avec le mécanisme ResourceBundle Java. Les
- valeurs des paramètres sont injectées à l'intérieur du message quand
- la chaîne de caractères <literal>{parameter}</literal> est trouvée (dans
- notre exemple <literal>Capitalization is not {type}</literal> générerait
- <literal>Capitalization is not FIRST</literal>), externaliser toute la
- chaîne dans <filename>ValidatorMessages.properties</filename> est
- considéré comme une bonne pratique. Voir <xref
- linkend="validator-constraints-error" />.</para>
-
- <programlisting>@ValidatorClass(CapitalizedValidator.class)
- at Target(METHOD)
- at Retention(RUNTIME)
- at Documented
-public @interface Capitalized {
- CapitalizeType type() default Capitalize.FIRST;
- String message() default "{validator.capitalized}";
-}
-
-...
-#in ValidatorMessages.properties
-validator.capitalized=<literal>Capitalization is not {type}</literal></programlisting>
-
- <para>Comme vous pouvez le voir la notation {} est récursive.</para>
-
- <para>Pour lier un descripteur à l'implémentation de son validateur, nous
- utilisons la méta-annotation <literal>@ValidatorClass</literal>. Le
- paramètre de la classe du validateur doit nommer une classe qui implémente
- <literal>Validator<ConstraintAnnotation></literal>.</para>
-
- <para>Nous devons maintenant implémenter le validateur (ie
- l'implémentation vérifiant la règle). Une implémentation de validation
- peut vérifier la valeur d'une propriété (en implémentant
- <literal>PropertyConstraint</literal>) et/ou peut modifier les
- méta-données de mapping d'Hibernate pour exprimer la contrainte au niveau
- de la base de données (en implémentant
- <literal>PersistentClassConstraint</literal>).</para>
-
- <programlisting>public class CapitalizedValidator
- implements Validator<Capitalized>, PropertyConstraint {
- private CapitalizeType type;
-
- // partie du contrat de Validator<Annotation>,
- // permet d'obtenir et d'utiliser les valeurs de l'annotation
- public void initialize(Capitalized parameters) {
- type = parameters.type();
- }
-
- // partie du contrat de la contrainte de la propriété
- public boolean isValid(Object value) {
- if (value==null) return true;
- if ( !(value instanceof String) ) return false;
- String string = (String) value;
- if (type == CapitalizeType.ALL) {
- return string.equals( string.toUpperCase() );
- }
- else {
- String first = string.substring(0,1);
- return first.equals( first.toUpperCase();
- }
- }
-}</programlisting>
-
- <para>La méthode <literal>isValid()</literal> devrait retourner false si
- la contrainte a été violée. Pour plus d'exemples, référez-vous aux
- implémentations intégrées du validateur.</para>
-
- <para>Nous avons seulement vu la validation au niveau propriété, mais vous
- pouvez écrire une annotation de validation au niveau d'un bean. Plutôt
- que de recevoir l'instance de retour d'une propriété, le bean lui-même
- sera passé au validateur. Pour activer la vérification de validation,
- annotez juste le bean lui-même. Un petit exemple peut être trouvé dans la
- suite de tests unitaires.</para>
- </sect2>
-
- <sect2>
- <title>Annoter votre modèle de données</title>
-
- <para>Maintenant que vous vous êtes familiarisés avec les annotations, la
- syntaxe devrait être connue.</para>
-
- <programlisting>public class Address {
- private String line1;
- private String line2;
- private String zip;
- private String state;
- private String country;
- private long id;
-
- // une chaîne non nulle de 20 caractères maximum
- @Length(max=20)
- @NotNull
- public String getCountry() {
- return country;
- }
-
- // une chaîne de caractères non nulle
- @NotNull
- public String getLine1() {
- return line1;
- }
-
- // pas de contrainte
- public String getLine2() {
- return line2;
- }
-
- // une chaîne non nulle de 3 caractères maximum
- @Length(max=3) @NotNull
- public String getState() {
- return state;
- }
-
- // une chaîne non nulle de 5 caractères maximum représentant un nombre
- // si la chaîne de caractères est plus longue, le message sera recherché
- // dans le resource bundle avec la clef 'long'
- @Length(max=5, message="{long}")
- @Pattern(regex="[0-9]+")
- @NotNull
- public String getZip() {
- return zip;
- }
-
- // devrait toujours être vrai
- @AssertTrue
- public boolean isValid() {
- return true;
- }
-
- // un nombre entre 1 et 2000
- @Id @Min(1)
- @Range(max=2000)
- public long getId() {
- return id;
- }
-}</programlisting>
-
- <para>Bien que l'exemple montre seulement la validation de propriétés
- publiques, vous pouvez aussi annoter des champs avec n'importe quelle
- visibilité.</para>
-
- <programlisting>@MyBeanConstraint(max=45)
-public class Dog {
- @AssertTrue private boolean isMale;
- @NotNull protected String getName() { ... };
- ...
-}</programlisting>
-
- <para>Vous pouvez aussi annoter des inferfaces. Hibernate Validator
- vérifiera toutes les classes parentes et les interfaces héritées ou
- implémentées par un bean donné pour lire les annotations appropriées du
- validateur.</para>
-
- <programlisting>public interface Named {
- @NotNull String getName();
- ...
-}
-
-public class Dog implements Named {
-
- @AssertTrue private boolean isMale;
-
- public String getName() { ... };
-
-}</programlisting>
-
- <para>La propriété "name" sera vérifiée pour la nullité lorsque le bean
- Dog sera validé.</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>Utiliser le framework Validator</title>
-
- <para>Hibernate Validator est destiné à être utilisé pour implémenter une
- validation de données à plusieurs couches, où nous exprimons des contraintes
- à un seul endroit (le modèle de données annoté) et les appliquons aux
- différents niveaux de l'application.</para>
-
- <sect2>
- <title>Validation au niveau du schéma de la base de données</title>
-
- <para>Par défaut, Hibernate Annotations traduira les contraintes que vous
- avez définies sur vos entités en méta-données de mapping. Par exemple, si
- une propriété de votre entité est annotée avec
- <literal>@NotNull</literal>, ses colonnes seront déclarées comme
- <literal>not null</literal> dans le schéma DDL généré par
- Hibernate.</para>
- </sect2>
-
- <sect2>
- <title>La validation basée sur les événements Hibernate</title>
-
- <para>Hibernate Validator a deux listeners d'événements Hibernate
- intégrés. Quand un <literal>PreInsertEvent</literal> ou un
- <literal>PreUpdateEvent</literal> survient, les listeners vérifieront
- toutes les contraintes de l'instance de l'entité et lèveront une exception
- si une contrainte est violée. Fondamentalement, les objets seront vérifiés
- avant les insertions et avant les mises à jour effectuées par Hibernate.
- C'est le plus commode et la manière la plus simple d'activer le processus
- de validation. Sur une violation de contrainte, l'événement lèvera une
- exception d'exécution <classname>InvalidStateException</classname> (NdT :
- c'est une RuntimeException) laquelle contient un tableau
- d'<literal>InvalidValue</literal>s décrivant chaque échec.</para>
-
- <programlisting><hibernate-configuration>
- ...
- <event type="pre-update">
- <listener
- class="org.hibernate.validator.event.ValidatePreUpdateEventListener"/>
- </event>
- <event type="pre-insert">
- <listener
- class="org.hibernate.validator.event.ValidatePreInsertEventListener"/>
- </event>
-</hibernate-configuration></programlisting>
-
- <note>
- <para>Lors de l'utilisation d'Hibernate Entity Manager, le framework
- Validation est activé par défaut. Si les beans ne sont pas annotés avec
- des annotations de validation, il n'y a pas de coût en terme de
- performance.</para>
- </note>
- </sect2>
-
- <sect2>
- <title>La validation au niveau applicatif</title>
-
- <para>Hibernate Validator peut être utilisé n'importe où dans le code de
- votre application.</para>
-
- <programlisting>ClassValidator personValidator = new ClassValidator( Person.class );
-ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
-
-InvalidValue[] validationMessages = addressValidator.getInvalidValues(address);</programlisting>
-
- <para>Les deux premières lignes préparent Hibernate Validator pour la
- vérification de classes. La première s'appuie sur les messages d'erreur
- intégrés à Hibernate Validator (voir
- <xref linkend="validator-constraints-error" />), la seconde utilise un
- resource bundle pour ses messages. Il est considéré comme une bonne
- pratique d'exécuter ces lignes une fois et de cacher les instances de
- validateur.</para>
-
- <para>La troisième ligne valide en fait l'instance
- <literal>Address</literal> et retourne un tableau
- d'<literal>InvalidValue</literal>s. Votre logique applicative sera alors
- capable de réagir aux échecs.</para>
-
- <para>Vous pouvez aussi vérifier une propriété particulière plutôt que
- tout le bean. Ceci pourrait être utile lors d'interactions avec
- l'utilisateur propriété par propriété.</para>
-
- <programlisting>ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
-
-// récupère seulement les valeurs invalides de la propriété "city"
-InvalidValue[] validationMessages = addressValidator.getInvalidValues(address, "city");
-
-// récupère seulement les valeurs potentielles invalides de la propriété "city"
-InvalidValue[] validationMessages = addressValidator.getPotentialInvalidValues("city", "Paris")</programlisting>
- </sect2>
-
- <sect2>
- <title>Informations de validation</title>
-
- <para>Comme un transporteur d'informations de validation, Hibernate
- fournit un tableau d'<classname>InvalidValue</classname>s. Chaque
- <literal>InvalidValue</literal> a un groupe de méthodes décrivant les
- problèmes individuels.</para>
-
- <para><methodname>getBeanClass()</methodname> récupère le type du bean
- ayant échoué.</para>
-
- <para><methodname>getBean()</methodname> récupère l'instance du bean ayant
- échoué (s'il y en a, c'est-à-dire pas lors de l'utilisation de
- <methodname>getPotentianInvalidValues()</methodname>).</para>
-
- <para><methodname>getValue()</methodname> récupère la valeur ayant
- échouée.</para>
-
- <para><methodname>getMessage()</methodname> récupère le message d'erreur
- internationalisé.</para>
-
- <para><methodname>getRootBean()</methodname> récupère l'instance du bean
- racine ayant généré le problème (utile en conjonction avec
- <literal>@Valid</literal>), est nulle si getPotentianInvalidValues() est
- utilisée.</para>
-
- <para><literal>getPropertyPath()</literal> récupère le chemin (séparé par
- des points) de la propriété ayant échouée à partir du bean racine.</para>
- </sect2>
- </sect1>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/fr/modules/validator.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules/validator.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/fr/modules/validator.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/fr/modules/validator.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,569 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="validator">
+ <title>Hibernate Validator</title>
+
+ <para>Les annotations sont une manière très commode et élégante pour spécifier
+ des contraintes invariantes sur un modèle de données. Vous pouvez, par
+ exemple, indiquer qu'une propriété ne devrait pas être nulle, que le solde
+ d'un compte devrait être strictement positif, etc. Ces contraintes de modèle
+ de données sont déclarées dans le bean lui-même en annotant ses propriétés.
+ Un validateur peut alors les lire et vérifier les violations de contraintes.
+ Le mécanisme de validation peut être exécuté dans différentes couches de
+ votre application (présentation, accès aux données) sans devoir dupliquer
+ ces règles. Hibernate Validator a été conçu dans ce but.</para>
+
+ <para>Hibernate Validator fonctionne sur deux niveaux. D'abord, il est capable
+ de vérifier des violations de contraintes sur les instances d'une classe en
+ mémoire. Ensuite, il peut appliquer les contraintes au méta-modèle d'Hibernate
+ et les incorporer au schéma de base de données généré.</para>
+
+ <para>Chaque annotation de contrainte est associée à l'implémentation du
+ validateur responsable de vérifier la contrainte sur l'instance de l'entité.
+ Un validateur peut aussi (optionnellement) appliquer la contrainte au
+ méta-modèle d'Hibernate, permettant à Hibernate de générer le DDL qui
+ exprime la contrainte. Avec le listener d'événements approprié, vous pouvez
+ exécuter l'opération de vérification lors des insertions et des mises à jour
+ effectuées par Hibernate. Hibernate Validator n'est pas limité à Hibernate.
+ Vous pouvez facilement l'utiliser n'importe où dans votre application.</para>
+
+ <para>Lors de la vérification des instances à l'exécution, Hibernate Validator
+ retourne des informations à propos des violations de contraintes dans un
+ tableau de <classname>InvalidValue</classname>s. Parmi d'autres informations,
+ <classname>InvalidValue</classname> contient un message de description
+ d'erreur qui peut inclure les valeurs des paramètres associés à l'annotation
+ (p. ex. la limite de taille), et des chaînes de caractères qui peuvent être
+ externalisées avec un <classname>ResourceBundle</classname>.</para>
+
+ <sect1 id="validator-constraints">
+ <title>Contraintes</title>
+
+ <sect2>
+ <title>Qu'est-ce qu'une contrainte ?</title>
+
+ <para>Une contrainte est représentée par une annotation. Une contrainte a
+ généralement des attributs utilisés pour paramétrer les limites des
+ contraintes. La contrainte s'applique à l'élément annoté.</para>
+ </sect2>
+
+ <sect2>
+ <title>Contraintes intégrées</title>
+
+ <para>Hibernate Validator arrive avec des contraintes intégrées,
+ lesquelles couvrent la plupart des vérifications de données de base. Comme
+ nous le verrons plus tard, vous n'êtes pas limité à celles-ci, vous pouvez
+ écrire vos propres contraintes en une minute.</para>
+
+ <table>
+ <title>Contraintes intégrées</title>
+
+ <tgroup cols="4">
+ <colspec align="center" />
+
+ <thead>
+ <row>
+ <entry>Annotation</entry>
+
+ <entry>S'applique à</entry>
+
+ <entry>Vérification à l'exécution</entry>
+
+ <entry>Impact sur les méta-données d'Hibernate</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>@Length(min=, max=)</entry>
+
+ <entry>propriété (String)</entry>
+
+ <entry>vérifie si la longueur de la chaîne de caractères est
+ comprise dans l'intervalle</entry>
+
+ <entry>la longueur de la colonne sera positionnée à max</entry>
+ </row>
+
+ <row>
+ <entry>@Max(value=)</entry>
+
+ <entry>propriété (nombre ou chaîne de caractères représentant un
+ nombre)</entry>
+
+ <entry>vérifie si la valeur est inférieure ou égale à max</entry>
+
+ <entry>ajoute une contrainte de vérification sur la
+ colonne</entry>
+ </row>
+
+ <row>
+ <entry>@Min(value=)</entry>
+
+ <entry>propriété (nombre ou chaîne de caractères représentant un
+ nombre)</entry>
+
+ <entry>vérifie si la valeur est supérieure ou égale à max</entry>
+
+ <entry>ajoute une contrainte de vérification sur la
+ colonne</entry>
+ </row>
+
+ <row>
+ <entry>@NotNull</entry>
+
+ <entry>propriété</entry>
+
+ <entry>vérifie si la valeur n'est pas nulle</entry>
+
+ <entry>les colonnes sont marquées "not null"</entry>
+ </row>
+
+ <row>
+ <entry>@Past</entry>
+
+ <entry>propriété (Date ou Calendar)</entry>
+
+ <entry>vérifie si la date est dans le passé</entry>
+
+ <entry>ajoute une contrainte de vérification sur la
+ colonne</entry>
+ </row>
+
+ <row>
+ <entry>@Future</entry>
+
+ <entry>propriété (Date ou Calendar)</entry>
+
+ <entry>vérifie si la date est dans le futur</entry>
+
+ <entry>aucun</entry>
+ </row>
+
+ <row>
+ <entry>@Pattern(regex="regexp", flag=)</entry>
+
+ <entry>propriété (String)</entry>
+
+ <entry>vérifie si la propriété correspond à l'expression
+ rationnelle donnée (pour "flag", voir
+ <classname> java.util.regex.Pattern</classname>)</entry>
+
+ <entry>aucun</entry>
+ </row>
+
+ <row>
+ <entry>@Range(min=, max=)</entry>
+
+ <entry>propriété (nombre ou chaîne de caractères représentant un
+ nombre)</entry>
+
+ <entry>vérifie si la valeur est comprise entre min et max
+ (inclus)</entry>
+
+ <entry>ajoute une contrainte de vérification sur la
+ colonne</entry>
+ </row>
+
+ <row>
+ <entry>@Size(min=, max=)</entry>
+
+ <entry>propriété (tableau, collection, map)</entry>
+
+ <entry>vérifie si la taille de l'élément est comprise entre min et
+ max (inclus)</entry>
+
+ <entry>aucun</entry>
+ </row>
+
+ <row>
+ <entry>@AssertFalse</entry>
+
+ <entry>propriété</entry>
+
+ <entry>vérifie que la méthode est évaluée à faux (utile pour les
+ contraintes exprimées dans le code plutôt que dans les
+ annotations)</entry>
+
+ <entry>aucun</entry>
+ </row>
+
+ <row>
+ <entry>@AssertTrue</entry>
+
+ <entry>propriété</entry>
+
+ <entry>vérifie que la méthode est évaluée à vrai (utile pour les
+ contraintes exprimées dans le code plutôt que dans les
+ annotations)</entry>
+
+ <entry>aucun</entry>
+ </row>
+
+ <row>
+ <entry>@Valid</entry>
+
+ <entry>propriété (objet)</entry>
+
+ <entry>exécute la validation récursivement sur l'objet associé.
+ Si l'objet est une Collection ou un tableau, les éléments sont
+ validés récursivement. Si l'objet est une Map, les éléments
+ valeur sont validés récursivement.</entry>
+
+ <entry>aucun</entry>
+ </row>
+
+ <row>
+ <entry>@Email</entry>
+
+ <entry>propriété (String)</entry>
+
+ <entry>vérifie si la chaîne de caractères est conforme à la
+ spécification d'une adresse e-mail</entry>
+
+ <entry>aucun</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+
+ <sect2 id="validator-constraints-error" xreflabel="Messages d'erreur">
+ <title>Messages d'erreur</title>
+
+ <para>Hibernate Validator arrive avec un ensemble de messages d'erreur par
+ défaut traduits dans environ dix langues (si la vôtre n'en fait pas
+ partie, veuillez nous envoyer un patch). Vous pouvez surcharger ces
+ messages en créant un <filename>ValidatorMessages.properties</filename>
+ (ou <filename>ValidatorMessages_loc.properties</filename>) et en
+ surchargeant les clefs dont vous avez besoin. Vous pouvez même ajouter
+ votre propre ensemble de messages supplémentaire lorsque vous écrivez
+ vos annotations de validation. Si Hibernate Validator ne peut pas trouver
+ une clef à partir de votre resourceBundle ou de votre ValidatorMessage,
+ il se repliera sur les valeurs intégrées par défaut.</para>
+
+ <para>Alternativement vous pouvez fournir un
+ <classname>ResourceBundle</classname> pendant la vérification par
+ programmation des règles de validation sur un bean, ou si vous voulez un
+ mécanisme d'interpolation complètement différent, vous pouvez fournir une
+ implémentation de
+ <literal>org.hibernate.validator.MessageInterpolator</literal> (lisez la
+ JavaDoc pour plus d'informations).</para>
+ </sect2>
+
+ <sect2>
+ <title>Ecrire vos propres contraintes</title>
+
+ <para>Etendre l'ensemble de contraintes intégrées est extrêment facile.
+ N'importe quelle contrainte est constituée deux morceaux : le
+ <emphasis>descripteur</emphasis> de contrainte (l'annotation) et le
+ <emphasis>validateur</emphasis> de contrainte (la classe
+ d'implémentation). Voici un simple descripteur personnalisé :</para>
+
+ <programlisting>@ValidatorClass(CapitalizedValidator.class)
+ at Target(METHOD)
+ at Retention(RUNTIME)
+ at Documented
+public @interface Capitalized {
+ CapitalizeType type() default Capitalize.FIRST;
+ String message() default "has incorrect capitalization";
+}</programlisting>
+
+ <para><literal>type</literal> est un paramètre décrivant comment la
+ propriété devrait être mise en majuscule. Ceci est un paramètre
+ utilisateur complètement dépendant du fonctionnement de
+ l'annotation.</para>
+
+ <para><literal>message</literal> est la chaîne de caractères par défaut
+ utilisée pour décrire la violation de contrainte et est obligatoire. Vous
+ pouvez mettre la chaîne de caractères dans le code ou bien l'externaliser
+ en partie ou complètement avec le mécanisme ResourceBundle Java. Les
+ valeurs des paramètres sont injectées à l'intérieur du message quand
+ la chaîne de caractères <literal>{parameter}</literal> est trouvée (dans
+ notre exemple <literal>Capitalization is not {type}</literal> générerait
+ <literal>Capitalization is not FIRST</literal>), externaliser toute la
+ chaîne dans <filename>ValidatorMessages.properties</filename> est
+ considéré comme une bonne pratique. Voir <xref
+ linkend="validator-constraints-error" />.</para>
+
+ <programlisting>@ValidatorClass(CapitalizedValidator.class)
+ at Target(METHOD)
+ at Retention(RUNTIME)
+ at Documented
+public @interface Capitalized {
+ CapitalizeType type() default Capitalize.FIRST;
+ String message() default "{validator.capitalized}";
+}
+
+...
+#in ValidatorMessages.properties
+validator.capitalized=<literal>Capitalization is not {type}</literal></programlisting>
+
+ <para>Comme vous pouvez le voir la notation {} est récursive.</para>
+
+ <para>Pour lier un descripteur à l'implémentation de son validateur, nous
+ utilisons la méta-annotation <literal>@ValidatorClass</literal>. Le
+ paramètre de la classe du validateur doit nommer une classe qui implémente
+ <literal>Validator<ConstraintAnnotation></literal>.</para>
+
+ <para>Nous devons maintenant implémenter le validateur (ie
+ l'implémentation vérifiant la règle). Une implémentation de validation
+ peut vérifier la valeur d'une propriété (en implémentant
+ <literal>PropertyConstraint</literal>) et/ou peut modifier les
+ méta-données de mapping d'Hibernate pour exprimer la contrainte au niveau
+ de la base de données (en implémentant
+ <literal>PersistentClassConstraint</literal>).</para>
+
+ <programlisting>public class CapitalizedValidator
+ implements Validator<Capitalized>, PropertyConstraint {
+ private CapitalizeType type;
+
+ // partie du contrat de Validator<Annotation>,
+ // permet d'obtenir et d'utiliser les valeurs de l'annotation
+ public void initialize(Capitalized parameters) {
+ type = parameters.type();
+ }
+
+ // partie du contrat de la contrainte de la propriété
+ public boolean isValid(Object value) {
+ if (value==null) return true;
+ if ( !(value instanceof String) ) return false;
+ String string = (String) value;
+ if (type == CapitalizeType.ALL) {
+ return string.equals( string.toUpperCase() );
+ }
+ else {
+ String first = string.substring(0,1);
+ return first.equals( first.toUpperCase();
+ }
+ }
+}</programlisting>
+
+ <para>La méthode <literal>isValid()</literal> devrait retourner false si
+ la contrainte a été violée. Pour plus d'exemples, référez-vous aux
+ implémentations intégrées du validateur.</para>
+
+ <para>Nous avons seulement vu la validation au niveau propriété, mais vous
+ pouvez écrire une annotation de validation au niveau d'un bean. Plutôt
+ que de recevoir l'instance de retour d'une propriété, le bean lui-même
+ sera passé au validateur. Pour activer la vérification de validation,
+ annotez juste le bean lui-même. Un petit exemple peut être trouvé dans la
+ suite de tests unitaires.</para>
+ </sect2>
+
+ <sect2>
+ <title>Annoter votre modèle de données</title>
+
+ <para>Maintenant que vous vous êtes familiarisés avec les annotations, la
+ syntaxe devrait être connue.</para>
+
+ <programlisting>public class Address {
+ private String line1;
+ private String line2;
+ private String zip;
+ private String state;
+ private String country;
+ private long id;
+
+ // une chaîne non nulle de 20 caractères maximum
+ @Length(max=20)
+ @NotNull
+ public String getCountry() {
+ return country;
+ }
+
+ // une chaîne de caractères non nulle
+ @NotNull
+ public String getLine1() {
+ return line1;
+ }
+
+ // pas de contrainte
+ public String getLine2() {
+ return line2;
+ }
+
+ // une chaîne non nulle de 3 caractères maximum
+ @Length(max=3) @NotNull
+ public String getState() {
+ return state;
+ }
+
+ // une chaîne non nulle de 5 caractères maximum représentant un nombre
+ // si la chaîne de caractères est plus longue, le message sera recherché
+ // dans le resource bundle avec la clef 'long'
+ @Length(max=5, message="{long}")
+ @Pattern(regex="[0-9]+")
+ @NotNull
+ public String getZip() {
+ return zip;
+ }
+
+ // devrait toujours être vrai
+ @AssertTrue
+ public boolean isValid() {
+ return true;
+ }
+
+ // un nombre entre 1 et 2000
+ @Id @Min(1)
+ @Range(max=2000)
+ public long getId() {
+ return id;
+ }
+}</programlisting>
+
+ <para>Bien que l'exemple montre seulement la validation de propriétés
+ publiques, vous pouvez aussi annoter des champs avec n'importe quelle
+ visibilité.</para>
+
+ <programlisting>@MyBeanConstraint(max=45)
+public class Dog {
+ @AssertTrue private boolean isMale;
+ @NotNull protected String getName() { ... };
+ ...
+}</programlisting>
+
+ <para>Vous pouvez aussi annoter des inferfaces. Hibernate Validator
+ vérifiera toutes les classes parentes et les interfaces héritées ou
+ implémentées par un bean donné pour lire les annotations appropriées du
+ validateur.</para>
+
+ <programlisting>public interface Named {
+ @NotNull String getName();
+ ...
+}
+
+public class Dog implements Named {
+
+ @AssertTrue private boolean isMale;
+
+ public String getName() { ... };
+
+}</programlisting>
+
+ <para>La propriété "name" sera vérifiée pour la nullité lorsque le bean
+ Dog sera validé.</para>
+ </sect2>
+ </sect1>
+
+ <sect1>
+ <title>Utiliser le framework Validator</title>
+
+ <para>Hibernate Validator est destiné à être utilisé pour implémenter une
+ validation de données à plusieurs couches, où nous exprimons des contraintes
+ à un seul endroit (le modèle de données annoté) et les appliquons aux
+ différents niveaux de l'application.</para>
+
+ <sect2>
+ <title>Validation au niveau du schéma de la base de données</title>
+
+ <para>Par défaut, Hibernate Annotations traduira les contraintes que vous
+ avez définies sur vos entités en méta-données de mapping. Par exemple, si
+ une propriété de votre entité est annotée avec
+ <literal>@NotNull</literal>, ses colonnes seront déclarées comme
+ <literal>not null</literal> dans le schéma DDL généré par
+ Hibernate.</para>
+ </sect2>
+
+ <sect2>
+ <title>La validation basée sur les événements Hibernate</title>
+
+ <para>Hibernate Validator a deux listeners d'événements Hibernate
+ intégrés. Quand un <literal>PreInsertEvent</literal> ou un
+ <literal>PreUpdateEvent</literal> survient, les listeners vérifieront
+ toutes les contraintes de l'instance de l'entité et lèveront une exception
+ si une contrainte est violée. Fondamentalement, les objets seront vérifiés
+ avant les insertions et avant les mises à jour effectuées par Hibernate.
+ C'est le plus commode et la manière la plus simple d'activer le processus
+ de validation. Sur une violation de contrainte, l'événement lèvera une
+ exception d'exécution <classname>InvalidStateException</classname> (NdT :
+ c'est une RuntimeException) laquelle contient un tableau
+ d'<literal>InvalidValue</literal>s décrivant chaque échec.</para>
+
+ <programlisting><hibernate-configuration>
+ ...
+ <event type="pre-update">
+ <listener
+ class="org.hibernate.validator.event.ValidatePreUpdateEventListener"/>
+ </event>
+ <event type="pre-insert">
+ <listener
+ class="org.hibernate.validator.event.ValidatePreInsertEventListener"/>
+ </event>
+</hibernate-configuration></programlisting>
+
+ <note>
+ <para>Lors de l'utilisation d'Hibernate Entity Manager, le framework
+ Validation est activé par défaut. Si les beans ne sont pas annotés avec
+ des annotations de validation, il n'y a pas de coût en terme de
+ performance.</para>
+ </note>
+ </sect2>
+
+ <sect2>
+ <title>La validation au niveau applicatif</title>
+
+ <para>Hibernate Validator peut être utilisé n'importe où dans le code de
+ votre application.</para>
+
+ <programlisting>ClassValidator personValidator = new ClassValidator( Person.class );
+ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
+
+InvalidValue[] validationMessages = addressValidator.getInvalidValues(address);</programlisting>
+
+ <para>Les deux premières lignes préparent Hibernate Validator pour la
+ vérification de classes. La première s'appuie sur les messages d'erreur
+ intégrés à Hibernate Validator (voir
+ <xref linkend="validator-constraints-error" />), la seconde utilise un
+ resource bundle pour ses messages. Il est considéré comme une bonne
+ pratique d'exécuter ces lignes une fois et de cacher les instances de
+ validateur.</para>
+
+ <para>La troisième ligne valide en fait l'instance
+ <literal>Address</literal> et retourne un tableau
+ d'<literal>InvalidValue</literal>s. Votre logique applicative sera alors
+ capable de réagir aux échecs.</para>
+
+ <para>Vous pouvez aussi vérifier une propriété particulière plutôt que
+ tout le bean. Ceci pourrait être utile lors d'interactions avec
+ l'utilisateur propriété par propriété.</para>
+
+ <programlisting>ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
+
+// récupère seulement les valeurs invalides de la propriété "city"
+InvalidValue[] validationMessages = addressValidator.getInvalidValues(address, "city");
+
+// récupère seulement les valeurs potentielles invalides de la propriété "city"
+InvalidValue[] validationMessages = addressValidator.getPotentialInvalidValues("city", "Paris")</programlisting>
+ </sect2>
+
+ <sect2>
+ <title>Informations de validation</title>
+
+ <para>Comme un transporteur d'informations de validation, Hibernate
+ fournit un tableau d'<classname>InvalidValue</classname>s. Chaque
+ <literal>InvalidValue</literal> a un groupe de méthodes décrivant les
+ problèmes individuels.</para>
+
+ <para><methodname>getBeanClass()</methodname> récupère le type du bean
+ ayant échoué.</para>
+
+ <para><methodname>getBean()</methodname> récupère l'instance du bean ayant
+ échoué (s'il y en a, c'est-à-dire pas lors de l'utilisation de
+ <methodname>getPotentianInvalidValues()</methodname>).</para>
+
+ <para><methodname>getValue()</methodname> récupère la valeur ayant
+ échouée.</para>
+
+ <para><methodname>getMessage()</methodname> récupère le message d'erreur
+ internationalisé.</para>
+
+ <para><methodname>getRootBean()</methodname> récupère l'instance du bean
+ racine ayant généré le problème (utile en conjonction avec
+ <literal>@Valid</literal>), est nulle si getPotentianInvalidValues() est
+ utilisée.</para>
+
+ <para><literal>getPropertyPath()</literal> récupère le chemin (séparé par
+ des points) de la propriété ayant échouée à partir du bean racine.</para>
+ </sect2>
+ </sect1>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/modules/xml-overriding.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules/xml-overriding.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/fr/modules/xml-overriding.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,413 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="xml-overriding">
- <title>Surcharger des méta-données à travers du XML</title>
-
- <para>La cible primaire pour les méta-données dans EJB3 sont les annotations,
- mais la spécification EJB3 fournit un moyen de surcharger ou remplacer les
- méta-données définies par des annotations à travers un descripteur de
- déploiement XML. Dans la version courante, seule la surcharge des annotations
- pure EJB3 est prise en charge. Si vous souhaitez utiliser des caractéristiques
- spécifiques à Hibernate dans des entités, vous devrez utiliser les annotations
- ou vous replier sur les fichiers hbm. Vous pouvez bien sûr mélanger et faire
- correspondre des entités annotées et des entités décrites dans des fichiers
- hbm.</para>
-
- <para>La suite de test unitaires montre des exemples supplémentaires de
- fichier XML.</para>
-
- <section id="xml-overriding-principles">
- <title>Principes</title>
-
- <para>La structure du descripteur de déploiement XML a été conçue pour
- refléter celle des annotations. Donc si vous connaissez la structure des
- annotations, utiliser le schéma XML sera facile pour vous.</para>
-
- <para>Vous pouvez définir un ou plusieurs fichiers XML décrivant vos
- méta-données, ces fichiers seront fusionnés par le moteur de surcharge.</para>
-
- <section>
- <title>Méta-données de niveau global</title>
-
- <para>Vous pouvez définir des méta-données de niveau global disponibles
- pour tous les fichiers XML. Vous ne devez pas définir ces méta-données
- plus d'une fois par déploiement.</para>
-
- <programlisting><?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">
-
- <persistence-unit-metadata>
- <xml-mapping-metadata-complete/>
- <persistence-unit-defaults>
- <schema>myschema</schema>
- <catalog>mycatalog</catalog>
- <cascade-persist/>
- </persistence-unit-defaults>
- </persistence-unit-metadata></programlisting>
-
- <para><literal>xml-mapping-metadata-complete</literal> signifie que toutes
- les entités, classes mères mappées et méta-données devraient être
- récupérées à partir du XML (c'est-à-dire ignorer les annotations).</para>
-
- <para><literal>schema / catalog</literal> surchargera toutes les
- définitions par défaut de schéma et de catalogue dans les méta-données
- (XML et annotations).</para>
-
- <para><literal>cascade-persist</literal> signifie que toutes les
- associations ont PERSIST comme type de cascade. Nous vous recommandons de
- ne pas utiliser cette fonctionnalité.</para>
- </section>
-
- <section id="xml-overriding-principles-entity" revision="1">
- <title>Méta-données de niveau entité</title>
-
- <para>Vous pouvez définir ou surcharger des informations de méta-données
- sur une entité donnée.</para>
-
- <programlistingco>
- <areaspec>
- <area coords="3 85" id="aa1" />
-
- <area coords="9 85" id="aa2" />
-
- <area coords="10 85" id="aa3" />
-
- <area coords="11 85" id="aa4" />
-
- <area coords="17 85" id="aa5" />
-
- <area coords="23 85" id="aa6" />
-
- <area coords="24 85" id="aa7" />
-
- <area coords="25 85" id="aa8" />
-
- <area coords="26 85" id="aa9" />
-
- <area coords="31 85" id="aa10" />
- </areaspec>
-
- <programlisting><?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>org.hibernate.test.annotations.reflection</package>
- <entity class="Administration" access="PROPERTY" metadata-complete="true">
- <table name="tbl_admin">
- <unique-constraint>
- <column-name>firstname</column-name>
- <column-name>lastname</column-name>
- </unique-constraint>
- </table>
- <secondary-table name="admin2">
- <primary-key-join-column name="admin_id" referenced-column-name="id"/>
- <unique-constraint>
- <column-name>address</column-name>
- </unique-constraint>
- </secondary-table>
- <id-class class="SocialSecurityNumber"/>
- <inheritance strategy="JOINED"/>
- <sequence-generator name="seqhilo" sequence-name="seqhilo"/>
- <table-generator name="table" table="tablehilo"/>
- ...
- </entity>
-
- <entity class="PostalAdministration">
- <primary-key-join-column name="id"/>
- ...
- </entity>
-</entity-mappings></programlisting>
-
- <calloutlist>
- <callout arearefs="aa1">
- <para><literal>entity-mappings</literal> : entity-mappings est
- l'élément racine pour tous les fichiers XML. Vous devez déclarer le
- schéma xml, le fichier du schéma est inclus dans le fichier
- hibernate-annotations.jar, aucun accès à internet ne sera effectué
- par Hibernate Annotations.</para>
- </callout>
-
- <callout arearefs="aa2">
- <para><literal>package</literal> (optionnel) : package par défaut
- utilisé pour tous les noms de classes sans package dans le fichier
- de descripteur de déploiement donné.</para>
- </callout>
-
- <callout arearefs="aa3">
- <para><literal>entity</literal> : décrit une entité.</para>
-
- <para><literal>metadata-complete</literal> définit si la description
- des méta-données pour cet élément est complète ou pas (en d'autres
- mots, si les annotations présentes au niveau de la classe devraient
- être prises en compte ou pas).</para>
-
- <para>Une entité doit avoir un attribut <literal>class</literal>
- référençant une classe java à laquelle s'applique les
- méta-données.</para>
-
- <para>Vous pouvez surcharger un nom d'entité avec l'attribut
- <literal>name</literal>, si aucun n'est défini et si une annotation
- <literal>@Entity.name</literal> est présente, alors elle est
- utilisée (et établit que les méta-données ne sont pas
- complètes).</para>
-
- <para>Pour un élément avec des méta-données complètes (voir
- ci-dessous), vous pouvez définir un attribut
- <literal>access</literal> (soit <literal>FIELD</literal>, soit
- <literal>PROPERTY</literal> (valeur par défaut)). Pour un élément
- avec des méta-données incomplètes, si <literal>access</literal>
- n'est pas défini, la position de @Id permettra de le déterminer, si
- <literal>access</literal> est défini, sa valeur est utilisée.</para>
- </callout>
-
- <callout arearefs="aa4">
- <para><literal>table</literal> : vous pouvez déclarer des propriétés
- de table (nom, schéma, catalogue), si aucune n'est définie,
- l'annotation java est utilisée.</para>
-
- <para>Vous pouvez définir une ou plusieurs contraintes d'unicité
- comme dans l'exemple.</para>
- </callout>
-
- <callout arearefs="aa5">
- <para><literal>secondary-table</literal> : définit une table
- secondaire très semblable à une table habituelle excepté que vous
- pouvez définir les colonnes de clef primaire / clef étrangère avec
- l'élément <literal>primary-key-join-column</literal>. Sur des
- méta-données incomplètes, les annotations de table secondaire sont
- utilisées seulement s'il n'y a pas de <literal>secondary-table</literal>
- de défini, sinon les annotations sont ignorées.</para>
- </callout>
-
- <callout arearefs="aa6">
- <para><literal>id-class</literal> : définit la classe identifiante
- comme le fait <literal>@IdClass</literal>.</para>
- </callout>
-
- <callout arearefs="aa7">
- <para><literal>inheritance</literal> : définit la stratégie
- d'héritage (<literal>JOINED</literal>,
- <literal>TABLE_PER_CLASS</literal>,
- <literal>SINGLE_TABLE</literal>) ; disponible seulement au niveau de
- l'élément racine.</para>
- </callout>
-
- <callout arearefs="aa8">
- <para><literal>sequence-generator</literal> : définit un générateur
- de séquence.</para>
- </callout>
-
- <callout arearefs="aa9">
- <para><literal>table-generator</literal> : définit un générateur de
- table.</para>
- </callout>
-
- <callout arearefs="aa10">
- <para><literal><literal>primary-key-join-column</literal></literal> :
- définit la colonne de jointure sur la clef primaire pour les
- entités filles lorsque la stratégie d'héritage utilisée est
- JOINED.</para>
- </callout>
- </calloutlist>
- </programlistingco>
-
- <programlistingco>
- <areaspec>
- <area coords="11 85" id="ab1" />
-
- <area coords="18 85" id="ab2" />
-
- <area coords="22 85" id="ab3" />
-
- <area coords="28 85" id="ab4" />
-
- <area coords="34 85" id="ab5" />
- </areaspec>
-
- <programlisting><?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>org.hibernate.test.annotations.reflection</package>
- <entity class="Music" access="PROPERTY" metadata-complete="true">
- <discriminator-value>Generic</discriminator-value>
- <discriminator-column length="34"/>
- ...
- </entity>
-
- <entity class="PostalAdministration">
- <primary-key-join-column name="id"/>
- <named-query name="adminById">
- <query>select m from Administration m where m.id = :id</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-query>
- <named-native-query name="allAdmin" result-set-mapping="adminrs">
- <query>select *, count(taxpayer_id) as taxPayerNumber
- from Administration, TaxPayer
- where taxpayer_admin_id = admin_id group by ...</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-native-query>
- <sql-result-set-mapping name="adminrs">
- <entity-result entity-class="Administration">
- <field-result name="name" column="fld_name"/>
- </entity-result>
- <column-result name="taxPayerNumber"/>
- </sql-result-set-mapping>
- <attribute-override name="ground">
- <column name="fld_ground" unique="true" scale="2"/>
- </attribute-override>
- <association-override name="referer">
- <join-column name="referer_id" referenced-column-name="id"/>
- </association-override>
- ...
- </entity>
-</entity-mappings></programlisting>
-
- <calloutlist>
- <callout arearefs="ab1">
- <para><literal>discriminator-value /
- discriminator-column</literal> : définissent la colonne et la valeur
- discriminantes lorsque la stratégie d'héritage choisie est
- SINGLE_TABLE.</para>
- </callout>
-
- <callout arearefs="ab2">
- <para><literal>named-query</literal> : définit les requêtes nommées
- et potentiellement les indices qui leur sont associés. Ces
- définitions sont ajoutées à celles définies dans les annotations,
- si deux définitions ont le même nom, la version XML a la
- priorité.</para>
- </callout>
-
- <callout arearefs="ab3">
- <para><literal>named-native-query</literal> : définit une requête
- SQL nommée et le mapping de son résultat. Alternativement, vous
- pouvez définir <literal>result-class</literal>. Ces définitions
- sont ajoutées à celles definies dans les annotations, si deux
- définitions ont le même nom, la version XML a la priorité.</para>
- </callout>
-
- <callout arearefs="ab4">
- <para><literal>sql-result-set-mapping</literal> : décrit la
- structure du mapping des résultats. Vous pouvez définir des mappings
- de colonnes et d'entité. Ces définitions sont ajoutées à celles
- définies dans les annotations, si deux définitions ont le même nom,
- la version XML a la priorité.</para>
- </callout>
-
- <callout arearefs="ab5">
- <para><literal>attribute-override /
- association-override</literal> : surcharge la définition d'une
- colonne ou d'une colonne de jointure. Cette surcharge est ajoutée à
- celle définie dans les annotations.</para>
- </callout>
- </calloutlist>
- </programlistingco>
-
- <para>La même chose s'applique à <literal><embeddable></literal> et
- <literal><mapped-superclass></literal>.</para>
- </section>
-
- <section>
- <title>Méta-données de niveau propriété</title>
-
- <para>Vous pouvez bien sûr définir des surcharges XML pour des propriétés.
- Si les méta-données sont définies comme incomplètes, alors les propriétés
- supplémentaires (c'est-à-dire au niveau Java) seront ignorées. Toutes les
- méta-données de niveau propriété sont définies par
- <literal>entity/attributes</literal>,
- <literal>mapped-superclass/attributes</literal> ou
- <literal>embeddable/attributes</literal>.</para>
-
- <programlisting> <attributes>
- <id name="id">
- <column name="fld_id"/>
- <generated-value generator="generator" strategy="SEQUENCE"/>
- <temporal>DATE</temporal>
- <sequence-generator name="generator" sequence-name="seq"/>
- </id>
- <version name="version"/>
- <embedded name="embeddedObject">
- <attribute-override name"subproperty">
- <column name="my_column"/>
- </attribute-override>
- </embedded>
- <basic name="status" optional="false">
- <enumerated>STRING</enumerated>
- </basic>
- <basic name="serial" optional="true">
- <column name="serialbytes"/>
- <lob/>
- </basic>
- <basic name="terminusTime" fetch="LAZY">
- <temporal>TIMESTAMP</temporal>
- </basic>
- </attributes></programlisting>
-
- <para>Vous pouvez surcharger une propriété avec <literal>id</literal>,
- <literal>embedded-id</literal>, <literal>version</literal>,
- <literal>embedded</literal> et <literal>basic</literal>. Chacun de ces
- éléments peuvent avoir des sous-éléments : <literal>lob</literal>,
- <literal>temporal</literal>, <literal>enumerated</literal>,
- <literal>column</literal>.</para>
- </section>
-
- <section>
- <title>Méta-données au niveau association</title>
-
- <para>Vous pouvez définir des surcharges XML pour les associations. Toutes
- les méta-données de niveau association sont définies par
- <literal>entity/attributes</literal>,
- <literal>mapped-superclass/attributes</literal> ou
- <literal>embeddable/attributes</literal>.</para>
-
- <programlisting> <attributes>
- <one-to-many name="players" fetch="EAGER">
- <map-key name="name"/>
- <join-column name="driver"/>
- <join-column name="number"/>
- </one-to-many>
- <many-to-many name="roads" target-entity="Administration">
- <order-by>maxSpeed</order-by>
- <join-table name="bus_road">
- <join-column name="driver"/>
- <join-column name="number"/>
- <inverse-join-column name="road_id"/>
- <unique-constraint>
- <column-name>driver</column-name>
- <column-name>number</column-name>
- </unique-constraint>
- </join-table>
- </many-to-many>
- <many-to-many name="allTimeDrivers" mapped-by="drivenBuses">
- </attributes></programlisting>
-
- <para>Vous pouvez surcharger une association avec
- <literal>one-to-many</literal>, <literal>one-to-one</literal>,
- <literal>many-to-one</literal>, et <literal>many-to-many</literal>.
- Chacun de ces éléments peut avoir des sous-éléments :
- <literal>join-table</literal> (qui peut avoir des
- <literal>join-column</literal>s et des
- <literal>inverse-join-column</literal>s),
- <literal><literal>join-column</literal>s</literal>,
- <literal>map-key</literal>, et <literal>order-by</literal>.
- <literal>mapped-by</literal> et <literal>target-entity</literal> peuvent
- être définis en tant qu'attributs lorsque cela a du sens. Une fois de plus
- la structure est le reflet de la structure des annotations. Vous pouvez
- trouver toutes les informations de sémantique dans le chapitre décrivant
- les annotations.</para>
- </section>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/fr/modules/xml-overriding.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/modules/xml-overriding.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/fr/modules/xml-overriding.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/fr/modules/xml-overriding.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,413 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="xml-overriding">
+ <title>Surcharger des méta-données à travers du XML</title>
+
+ <para>La cible primaire pour les méta-données dans EJB3 sont les annotations,
+ mais la spécification EJB3 fournit un moyen de surcharger ou remplacer les
+ méta-données définies par des annotations à travers un descripteur de
+ déploiement XML. Dans la version courante, seule la surcharge des annotations
+ pure EJB3 est prise en charge. Si vous souhaitez utiliser des caractéristiques
+ spécifiques à Hibernate dans des entités, vous devrez utiliser les annotations
+ ou vous replier sur les fichiers hbm. Vous pouvez bien sûr mélanger et faire
+ correspondre des entités annotées et des entités décrites dans des fichiers
+ hbm.</para>
+
+ <para>La suite de test unitaires montre des exemples supplémentaires de
+ fichier XML.</para>
+
+ <section id="xml-overriding-principles">
+ <title>Principes</title>
+
+ <para>La structure du descripteur de déploiement XML a été conçue pour
+ refléter celle des annotations. Donc si vous connaissez la structure des
+ annotations, utiliser le schéma XML sera facile pour vous.</para>
+
+ <para>Vous pouvez définir un ou plusieurs fichiers XML décrivant vos
+ méta-données, ces fichiers seront fusionnés par le moteur de surcharge.</para>
+
+ <section>
+ <title>Méta-données de niveau global</title>
+
+ <para>Vous pouvez définir des méta-données de niveau global disponibles
+ pour tous les fichiers XML. Vous ne devez pas définir ces méta-données
+ plus d'une fois par déploiement.</para>
+
+ <programlisting><?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">
+
+ <persistence-unit-metadata>
+ <xml-mapping-metadata-complete/>
+ <persistence-unit-defaults>
+ <schema>myschema</schema>
+ <catalog>mycatalog</catalog>
+ <cascade-persist/>
+ </persistence-unit-defaults>
+ </persistence-unit-metadata></programlisting>
+
+ <para><literal>xml-mapping-metadata-complete</literal> signifie que toutes
+ les entités, classes mères mappées et méta-données devraient être
+ récupérées à partir du XML (c'est-à-dire ignorer les annotations).</para>
+
+ <para><literal>schema / catalog</literal> surchargera toutes les
+ définitions par défaut de schéma et de catalogue dans les méta-données
+ (XML et annotations).</para>
+
+ <para><literal>cascade-persist</literal> signifie que toutes les
+ associations ont PERSIST comme type de cascade. Nous vous recommandons de
+ ne pas utiliser cette fonctionnalité.</para>
+ </section>
+
+ <section id="xml-overriding-principles-entity" revision="1">
+ <title>Méta-données de niveau entité</title>
+
+ <para>Vous pouvez définir ou surcharger des informations de méta-données
+ sur une entité donnée.</para>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="3 85" id="aa1" />
+
+ <area coords="9 85" id="aa2" />
+
+ <area coords="10 85" id="aa3" />
+
+ <area coords="11 85" id="aa4" />
+
+ <area coords="17 85" id="aa5" />
+
+ <area coords="23 85" id="aa6" />
+
+ <area coords="24 85" id="aa7" />
+
+ <area coords="25 85" id="aa8" />
+
+ <area coords="26 85" id="aa9" />
+
+ <area coords="31 85" id="aa10" />
+ </areaspec>
+
+ <programlisting><?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>org.hibernate.test.annotations.reflection</package>
+ <entity class="Administration" access="PROPERTY" metadata-complete="true">
+ <table name="tbl_admin">
+ <unique-constraint>
+ <column-name>firstname</column-name>
+ <column-name>lastname</column-name>
+ </unique-constraint>
+ </table>
+ <secondary-table name="admin2">
+ <primary-key-join-column name="admin_id" referenced-column-name="id"/>
+ <unique-constraint>
+ <column-name>address</column-name>
+ </unique-constraint>
+ </secondary-table>
+ <id-class class="SocialSecurityNumber"/>
+ <inheritance strategy="JOINED"/>
+ <sequence-generator name="seqhilo" sequence-name="seqhilo"/>
+ <table-generator name="table" table="tablehilo"/>
+ ...
+ </entity>
+
+ <entity class="PostalAdministration">
+ <primary-key-join-column name="id"/>
+ ...
+ </entity>
+</entity-mappings></programlisting>
+
+ <calloutlist>
+ <callout arearefs="aa1">
+ <para><literal>entity-mappings</literal> : entity-mappings est
+ l'élément racine pour tous les fichiers XML. Vous devez déclarer le
+ schéma xml, le fichier du schéma est inclus dans le fichier
+ hibernate-annotations.jar, aucun accès à internet ne sera effectué
+ par Hibernate Annotations.</para>
+ </callout>
+
+ <callout arearefs="aa2">
+ <para><literal>package</literal> (optionnel) : package par défaut
+ utilisé pour tous les noms de classes sans package dans le fichier
+ de descripteur de déploiement donné.</para>
+ </callout>
+
+ <callout arearefs="aa3">
+ <para><literal>entity</literal> : décrit une entité.</para>
+
+ <para><literal>metadata-complete</literal> définit si la description
+ des méta-données pour cet élément est complète ou pas (en d'autres
+ mots, si les annotations présentes au niveau de la classe devraient
+ être prises en compte ou pas).</para>
+
+ <para>Une entité doit avoir un attribut <literal>class</literal>
+ référençant une classe java à laquelle s'applique les
+ méta-données.</para>
+
+ <para>Vous pouvez surcharger un nom d'entité avec l'attribut
+ <literal>name</literal>, si aucun n'est défini et si une annotation
+ <literal>@Entity.name</literal> est présente, alors elle est
+ utilisée (et établit que les méta-données ne sont pas
+ complètes).</para>
+
+ <para>Pour un élément avec des méta-données complètes (voir
+ ci-dessous), vous pouvez définir un attribut
+ <literal>access</literal> (soit <literal>FIELD</literal>, soit
+ <literal>PROPERTY</literal> (valeur par défaut)). Pour un élément
+ avec des méta-données incomplètes, si <literal>access</literal>
+ n'est pas défini, la position de @Id permettra de le déterminer, si
+ <literal>access</literal> est défini, sa valeur est utilisée.</para>
+ </callout>
+
+ <callout arearefs="aa4">
+ <para><literal>table</literal> : vous pouvez déclarer des propriétés
+ de table (nom, schéma, catalogue), si aucune n'est définie,
+ l'annotation java est utilisée.</para>
+
+ <para>Vous pouvez définir une ou plusieurs contraintes d'unicité
+ comme dans l'exemple.</para>
+ </callout>
+
+ <callout arearefs="aa5">
+ <para><literal>secondary-table</literal> : définit une table
+ secondaire très semblable à une table habituelle excepté que vous
+ pouvez définir les colonnes de clef primaire / clef étrangère avec
+ l'élément <literal>primary-key-join-column</literal>. Sur des
+ méta-données incomplètes, les annotations de table secondaire sont
+ utilisées seulement s'il n'y a pas de <literal>secondary-table</literal>
+ de défini, sinon les annotations sont ignorées.</para>
+ </callout>
+
+ <callout arearefs="aa6">
+ <para><literal>id-class</literal> : définit la classe identifiante
+ comme le fait <literal>@IdClass</literal>.</para>
+ </callout>
+
+ <callout arearefs="aa7">
+ <para><literal>inheritance</literal> : définit la stratégie
+ d'héritage (<literal>JOINED</literal>,
+ <literal>TABLE_PER_CLASS</literal>,
+ <literal>SINGLE_TABLE</literal>) ; disponible seulement au niveau de
+ l'élément racine.</para>
+ </callout>
+
+ <callout arearefs="aa8">
+ <para><literal>sequence-generator</literal> : définit un générateur
+ de séquence.</para>
+ </callout>
+
+ <callout arearefs="aa9">
+ <para><literal>table-generator</literal> : définit un générateur de
+ table.</para>
+ </callout>
+
+ <callout arearefs="aa10">
+ <para><literal><literal>primary-key-join-column</literal></literal> :
+ définit la colonne de jointure sur la clef primaire pour les
+ entités filles lorsque la stratégie d'héritage utilisée est
+ JOINED.</para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="11 85" id="ab1" />
+
+ <area coords="18 85" id="ab2" />
+
+ <area coords="22 85" id="ab3" />
+
+ <area coords="28 85" id="ab4" />
+
+ <area coords="34 85" id="ab5" />
+ </areaspec>
+
+ <programlisting><?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>org.hibernate.test.annotations.reflection</package>
+ <entity class="Music" access="PROPERTY" metadata-complete="true">
+ <discriminator-value>Generic</discriminator-value>
+ <discriminator-column length="34"/>
+ ...
+ </entity>
+
+ <entity class="PostalAdministration">
+ <primary-key-join-column name="id"/>
+ <named-query name="adminById">
+ <query>select m from Administration m where m.id = :id</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-query>
+ <named-native-query name="allAdmin" result-set-mapping="adminrs">
+ <query>select *, count(taxpayer_id) as taxPayerNumber
+ from Administration, TaxPayer
+ where taxpayer_admin_id = admin_id group by ...</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-native-query>
+ <sql-result-set-mapping name="adminrs">
+ <entity-result entity-class="Administration">
+ <field-result name="name" column="fld_name"/>
+ </entity-result>
+ <column-result name="taxPayerNumber"/>
+ </sql-result-set-mapping>
+ <attribute-override name="ground">
+ <column name="fld_ground" unique="true" scale="2"/>
+ </attribute-override>
+ <association-override name="referer">
+ <join-column name="referer_id" referenced-column-name="id"/>
+ </association-override>
+ ...
+ </entity>
+</entity-mappings></programlisting>
+
+ <calloutlist>
+ <callout arearefs="ab1">
+ <para><literal>discriminator-value /
+ discriminator-column</literal> : définissent la colonne et la valeur
+ discriminantes lorsque la stratégie d'héritage choisie est
+ SINGLE_TABLE.</para>
+ </callout>
+
+ <callout arearefs="ab2">
+ <para><literal>named-query</literal> : définit les requêtes nommées
+ et potentiellement les indices qui leur sont associés. Ces
+ définitions sont ajoutées à celles définies dans les annotations,
+ si deux définitions ont le même nom, la version XML a la
+ priorité.</para>
+ </callout>
+
+ <callout arearefs="ab3">
+ <para><literal>named-native-query</literal> : définit une requête
+ SQL nommée et le mapping de son résultat. Alternativement, vous
+ pouvez définir <literal>result-class</literal>. Ces définitions
+ sont ajoutées à celles definies dans les annotations, si deux
+ définitions ont le même nom, la version XML a la priorité.</para>
+ </callout>
+
+ <callout arearefs="ab4">
+ <para><literal>sql-result-set-mapping</literal> : décrit la
+ structure du mapping des résultats. Vous pouvez définir des mappings
+ de colonnes et d'entité. Ces définitions sont ajoutées à celles
+ définies dans les annotations, si deux définitions ont le même nom,
+ la version XML a la priorité.</para>
+ </callout>
+
+ <callout arearefs="ab5">
+ <para><literal>attribute-override /
+ association-override</literal> : surcharge la définition d'une
+ colonne ou d'une colonne de jointure. Cette surcharge est ajoutée à
+ celle définie dans les annotations.</para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>La même chose s'applique à <literal><embeddable></literal> et
+ <literal><mapped-superclass></literal>.</para>
+ </section>
+
+ <section>
+ <title>Méta-données de niveau propriété</title>
+
+ <para>Vous pouvez bien sûr définir des surcharges XML pour des propriétés.
+ Si les méta-données sont définies comme incomplètes, alors les propriétés
+ supplémentaires (c'est-à-dire au niveau Java) seront ignorées. Toutes les
+ méta-données de niveau propriété sont définies par
+ <literal>entity/attributes</literal>,
+ <literal>mapped-superclass/attributes</literal> ou
+ <literal>embeddable/attributes</literal>.</para>
+
+ <programlisting> <attributes>
+ <id name="id">
+ <column name="fld_id"/>
+ <generated-value generator="generator" strategy="SEQUENCE"/>
+ <temporal>DATE</temporal>
+ <sequence-generator name="generator" sequence-name="seq"/>
+ </id>
+ <version name="version"/>
+ <embedded name="embeddedObject">
+ <attribute-override name"subproperty">
+ <column name="my_column"/>
+ </attribute-override>
+ </embedded>
+ <basic name="status" optional="false">
+ <enumerated>STRING</enumerated>
+ </basic>
+ <basic name="serial" optional="true">
+ <column name="serialbytes"/>
+ <lob/>
+ </basic>
+ <basic name="terminusTime" fetch="LAZY">
+ <temporal>TIMESTAMP</temporal>
+ </basic>
+ </attributes></programlisting>
+
+ <para>Vous pouvez surcharger une propriété avec <literal>id</literal>,
+ <literal>embedded-id</literal>, <literal>version</literal>,
+ <literal>embedded</literal> et <literal>basic</literal>. Chacun de ces
+ éléments peuvent avoir des sous-éléments : <literal>lob</literal>,
+ <literal>temporal</literal>, <literal>enumerated</literal>,
+ <literal>column</literal>.</para>
+ </section>
+
+ <section>
+ <title>Méta-données au niveau association</title>
+
+ <para>Vous pouvez définir des surcharges XML pour les associations. Toutes
+ les méta-données de niveau association sont définies par
+ <literal>entity/attributes</literal>,
+ <literal>mapped-superclass/attributes</literal> ou
+ <literal>embeddable/attributes</literal>.</para>
+
+ <programlisting> <attributes>
+ <one-to-many name="players" fetch="EAGER">
+ <map-key name="name"/>
+ <join-column name="driver"/>
+ <join-column name="number"/>
+ </one-to-many>
+ <many-to-many name="roads" target-entity="Administration">
+ <order-by>maxSpeed</order-by>
+ <join-table name="bus_road">
+ <join-column name="driver"/>
+ <join-column name="number"/>
+ <inverse-join-column name="road_id"/>
+ <unique-constraint>
+ <column-name>driver</column-name>
+ <column-name>number</column-name>
+ </unique-constraint>
+ </join-table>
+ </many-to-many>
+ <many-to-many name="allTimeDrivers" mapped-by="drivenBuses">
+ </attributes></programlisting>
+
+ <para>Vous pouvez surcharger une association avec
+ <literal>one-to-many</literal>, <literal>one-to-one</literal>,
+ <literal>many-to-one</literal>, et <literal>many-to-many</literal>.
+ Chacun de ces éléments peut avoir des sous-éléments :
+ <literal>join-table</literal> (qui peut avoir des
+ <literal>join-column</literal>s et des
+ <literal>inverse-join-column</literal>s),
+ <literal><literal>join-column</literal>s</literal>,
+ <literal>map-key</literal>, et <literal>order-by</literal>.
+ <literal>mapped-by</literal> et <literal>target-entity</literal> peuvent
+ être définis en tant qu'attributs lorsque cela a du sens. Une fois de plus
+ la structure est le reflet de la structure des annotations. Vous pouvez
+ trouver toutes les informations de sémantique dans le chapitre décrivant
+ les annotations.</para>
+ </section>
+ </section>
+</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/fr/styles (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/styles)
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/styles/fopdf.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/styles/fopdf.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/fr/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,519 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL FO configuration file for the Hibernate
- Reference Documentation. It defines a custom titlepage and
- the parameters for the A4 sized PDF printable output.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
-
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- exclude-result-prefixes="#default">
-
- <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
-
- <!--###################################################
- Custom Title Page
- ################################################### -->
-
- <xsl:template name="book.titlepage.recto">
- <fo:block>
- <fo:table table-layout="fixed" width="175mm">
- <fo:table-column column-width="175mm"/>
- <fo:table-body>
- <fo:table-row>
- <fo:table-cell text-align="center">
- <fo:block>
- <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/title"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="18pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/subtitle"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
- Version:
- <xsl:value-of select="bookinfo/releaseinfo"/>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </fo:block>
- </xsl:template>
-
- <!-- Prevent blank pages in output -->
- <xsl:template name="book.titlepage.before.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.separator">
- </xsl:template>
-
- <!--###################################################
- Header
- ################################################### -->
-
- <!-- More space in the center header for long text -->
- <xsl:attribute-set name="header.content.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$body.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="margin-left">-5em</xsl:attribute>
- <xsl:attribute name="margin-right">-5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Custom Footer
- ################################################### -->
-
- <!-- This footer prints the Hibernate version number on the left side -->
- <xsl:template name="footer.content">
- <xsl:param name="pageclass" select="''"/>
- <xsl:param name="sequence" select="''"/>
- <xsl:param name="position" select="''"/>
- <xsl:param name="gentext-key" select="''"/>
-
- <xsl:variable name="Version">
- <xsl:choose>
- <xsl:when test="//releaseinfo">
- <xsl:text>Hibernate </xsl:text>
- <xsl:value-of select="//releaseinfo"/>
- </xsl:when>
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
-
- <xsl:choose>
- <xsl:when test="$sequence='blank'">
- <xsl:choose>
- <xsl:when test="$double.sided != 0 and $position = 'left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position = 'center'">
- <!-- nop -->
- </xsl:when>
-
- <xsl:otherwise>
- <fo:page-number/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
-
- <xsl:when test="$pageclass='titlepage'">
- <!-- nop: other titlepage sequences have no footer -->
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <!--###################################################
- Custom Toc Line
- ################################################### -->
-
- <!-- Improve the TOC. -->
- <xsl:template name="toc.line">
- <xsl:variable name="id">
- <xsl:call-template name="object.id"/>
- </xsl:variable>
-
- <xsl:variable name="label">
- <xsl:apply-templates select="." mode="label.markup"/>
- </xsl:variable>
-
- <fo:block text-align-last="justify"
- end-indent="{$toc.indent.width}pt"
- last-line-end-indent="-{$toc.indent.width}pt">
- <fo:inline keep-with-next.within-line="always">
- <fo:basic-link internal-destination="{$id}">
-
- <!-- Chapter titles should be bold. -->
- <xsl:choose>
- <xsl:when test="local-name(.) = 'chapter'">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="$label != ''">
- <xsl:copy-of select="$label"/>
- <xsl:value-of select="$autotoc.label.separator"/>
- </xsl:if>
- <xsl:apply-templates select="." mode="titleabbrev.markup"/>
- </fo:basic-link>
- </fo:inline>
- <fo:inline keep-together.within-line="always">
- <xsl:text> </xsl:text>
- <fo:leader leader-pattern="dots"
- leader-pattern-width="3pt"
- leader-alignment="reference-area"
- keep-with-next.within-line="always"/>
- <xsl:text> </xsl:text>
- <fo:basic-link internal-destination="{$id}">
- <fo:page-number-citation ref-id="{$id}"/>
- </fo:basic-link>
- </fo:inline>
- </fo:block>
- </xsl:template>
-
- <!--###################################################
- Extensions
- ################################################### -->
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <!-- FOP provide only PDF Bookmarks at the moment -->
- <xsl:param name="fop.extensions">1</xsl:param>
-
- <!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
- <!-- Dot and Whitespace as separator in TOC between Label and Title-->
- <xsl:param name="autotoc.label.separator" select="'. '"/>
-
-
- <!--###################################################
- Paper & Page Size
- ################################################### -->
-
- <!-- Paper type, no headers on blank pages, no double sided printing -->
- <xsl:param name="paper.type" select="'A4'"/>
- <xsl:param name="double.sided">0</xsl:param>
- <xsl:param name="headers.on.blank.pages">0</xsl:param>
- <xsl:param name="footers.on.blank.pages">0</xsl:param>
-
- <!-- Space between paper border and content (chaotic stuff, don't touch) -->
- <xsl:param name="page.margin.top">5mm</xsl:param>
- <xsl:param name="region.before.extent">10mm</xsl:param>
- <xsl:param name="body.margin.top">10mm</xsl:param>
-
- <xsl:param name="body.margin.bottom">15mm</xsl:param>
- <xsl:param name="region.after.extent">10mm</xsl:param>
- <xsl:param name="page.margin.bottom">0mm</xsl:param>
-
- <xsl:param name="page.margin.outer">18mm</xsl:param>
- <xsl:param name="page.margin.inner">18mm</xsl:param>
-
- <!-- No intendation of Titles -->
- <xsl:param name="title.margin.left">0pc</xsl:param>
-
- <!--###################################################
- Fonts & Styles
- ################################################### -->
-
- <!-- Default Font size -->
- <xsl:param name="body.font.master">11</xsl:param>
-
- <!-- Line height in body text -->
- <xsl:param name="line-height">1.4</xsl:param>
-
- <!-- Monospaced fonts are smaller than regular text -->
- <xsl:attribute-set name="monospace.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$monospace.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="font-size">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Tables
- ################################################### -->
-
- <!-- The table width should be adapted to the paper size -->
- <xsl:param name="default.table.width">17.4cm</xsl:param>
-
- <!-- Some padding inside tables -->
- <xsl:attribute-set name="table.cell.padding">
- <xsl:attribute name="padding-left">4pt</xsl:attribute>
- <xsl:attribute name="padding-right">4pt</xsl:attribute>
- <xsl:attribute name="padding-top">4pt</xsl:attribute>
- <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Only hairlines as frame and cell borders in tables -->
- <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
- <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
-
- <!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
- <!-- Label only Sections up to level 2 -->
- <xsl:param name="local.l10n.xml" select="document('')"/>
- <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
- <l:l10n language="en">
- <l:context name="title-numbered">
- <l:template name="sect3" text="%t"/>
- <l:template name="sect4" text="%t"/>
- <l:template name="sect5" text="%t"/>
- </l:context>
- <l:context name="section-xref-numbered">
- <l:template name="sect3" text="the section called %t"/>
- <l:template name="sect4" text="the section called %t"/>
- <l:template name="sect5" text="the section called %t"/>
- </l:context>
- </l:l10n>
- </l:i18n>
-
- <!--###################################################
- Titles
- ################################################### -->
-
- <!-- Chapter title size -->
- <xsl:attribute-set name="chapter.titlepage.recto.style">
- <xsl:attribute name="text-align">left</xsl:attribute>
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.8"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
- Let's remove it, so this sucker can use our attribute-set only... -->
- <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
- <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xsl:use-attribute-sets="chapter.titlepage.recto.style">
- <xsl:call-template name="component.title">
- <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
- </xsl:call-template>
- </fo:block>
- </xsl:template>
-
- <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
- <xsl:attribute-set name="section.title.level1.properties">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.5"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level2.properties">
- <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.25"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level3.properties">
- <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.0"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Titles of formal objects (tables, examples, ...) -->
- <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="hyphenate">false</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Programlistings
- ################################################### -->
-
- <!-- Verbatim text formatting (programlistings) -->
- <xsl:attribute-set name="verbatim.properties">
- <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- <xsl:attribute name="border-color">#444444</xsl:attribute>
- <xsl:attribute name="border-style">solid</xsl:attribute>
- <xsl:attribute name="border-width">0.1pt</xsl:attribute>
- <xsl:attribute name="padding-top">0.5em</xsl:attribute>
- <xsl:attribute name="padding-left">0.5em</xsl:attribute>
- <xsl:attribute name="padding-right">0.5em</xsl:attribute>
- <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
- <xsl:attribute name="margin-left">0.5em</xsl:attribute>
- <xsl:attribute name="margin-right">0.5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Shade (background) programlistings -->
- <xsl:param name="shade.verbatim">1</xsl:param>
- <xsl:attribute-set name="shade.verbatim.style">
- <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Callouts
- ################################################### -->
-
- <!-- We want to use callouts... -->
- <xsl:param name="callout.extensions">1</xsl:param>
-
- <!-- Place callout bullets at this column in programmlisting.-->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
- <!--
- No, don't use crappy graphics for the callout bullets. This setting
- enables some weird Unicode rendering for some fancy bullet points
- in callouts. By default, this can only count to 10 and produces
- strange results if you ever have more than 10 callouts for one
- programlisting. We will fix that next.
- -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!--
- Again, fun with DocBook XSL: The callout bullets are rendered in
- two places: In the programlisting itself and in the list below
- the listing, with the actual callout text. The rendering in the
- programlisting is some XSL transformer extension (e.g. a Saxon
- extension), so we can't change that without messing with the
- extensions. We only can turn it off by setting this limit to
- zero, then, a simple bracket style like "(3)" and "(4)" will
- be used in the programlisting.
- -->
- <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
-
- <!--
- The callout bullets in the actual callout list will be rendered
- with an XSL FO template. The default template is broken: limited to 10
- nice looking Unicode bullet points and then it doesn't print anything,
- the fallback doesn't work. We implement our own template, which is not
- as complicated, more ugly, but works. As always, function is more
- important than form.
- -->
- <xsl:template name="callout-bug">
- <xsl:param name="conum" select='1'/>
- <fo:inline
- color="black"
- padding-top="0.1em"
- padding-bottom="0.1em"
- padding-start="0.2em"
- padding-end="0.2em"
- baseline-shift="0.1em"
- font-family="{$monospace.font.family}"
- font-weight="bold"
- font-size="75%">
- <xsl:text>(</xsl:text>
- <xsl:value-of select="$conum"/>
- <xsl:text>)</xsl:text>
- </fo:inline>
-
- </xsl:template>
-
- <!--###################################################
- Misc
- ################################################### -->
-
- <!-- Correct placement of titles for figures and examples. -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
- <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
- <xsl:param name="variablelist.as.blocks">1</xsl:param>
-
- <!-- The horrible list spacing problems, this is much better. -->
- <xsl:attribute-set name="list.block.spacing">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Newer DocBook XSL apparently thinks that some sections are by
- default "draft" status, and this idiotic thing is by default
- also set to "maybe", so it spits out a lot of errors with the
- latest FOP as the XSL/FO styles have references to some draft
- watermarks, which you actually don't want in the first place.
- Turn this crap off. If you have to work with the "status"
- attribute, don't.
- -->
- <xsl:param name="draft.mode" select="'no'"/>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/fr/styles/fopdf.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/styles/fopdf.xsl)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/fr/styles/fopdf.xsl (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/fr/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,519 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL FO configuration file for the Hibernate
+ Reference Documentation. It defines a custom titlepage and
+ the parameters for the A4 sized PDF printable output.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ exclude-result-prefixes="#default">
+
+ <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
+
+ <!--###################################################
+ Custom Title Page
+ ################################################### -->
+
+ <xsl:template name="book.titlepage.recto">
+ <fo:block>
+ <fo:table table-layout="fixed" width="175mm">
+ <fo:table-column column-width="175mm"/>
+ <fo:table-body>
+ <fo:table-row>
+ <fo:table-cell text-align="center">
+ <fo:block>
+ <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/title"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="18pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/subtitle"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
+ Version:
+ <xsl:value-of select="bookinfo/releaseinfo"/>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Prevent blank pages in output -->
+ <xsl:template name="book.titlepage.before.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.separator">
+ </xsl:template>
+
+ <!--###################################################
+ Header
+ ################################################### -->
+
+ <!-- More space in the center header for long text -->
+ <xsl:attribute-set name="header.content.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-left">-5em</xsl:attribute>
+ <xsl:attribute name="margin-right">-5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Custom Footer
+ ################################################### -->
+
+ <!-- This footer prints the Hibernate version number on the left side -->
+ <xsl:template name="footer.content">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="position" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+ <xsl:variable name="Version">
+ <xsl:choose>
+ <xsl:when test="//releaseinfo">
+ <xsl:text>Hibernate </xsl:text>
+ <xsl:value-of select="//releaseinfo"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$sequence='blank'">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0 and $position = 'left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position = 'center'">
+ <!-- nop -->
+ </xsl:when>
+
+ <xsl:otherwise>
+ <fo:page-number/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$pageclass='titlepage'">
+ <!-- nop: other titlepage sequences have no footer -->
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!--###################################################
+ Custom Toc Line
+ ################################################### -->
+
+ <!-- Improve the TOC. -->
+ <xsl:template name="toc.line">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+
+ <fo:block text-align-last="justify"
+ end-indent="{$toc.indent.width}pt"
+ last-line-end-indent="-{$toc.indent.width}pt">
+ <fo:inline keep-with-next.within-line="always">
+ <fo:basic-link internal-destination="{$id}">
+
+ <!-- Chapter titles should be bold. -->
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'chapter'">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$label != ''">
+ <xsl:copy-of select="$label"/>
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </fo:basic-link>
+ </fo:inline>
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="dots"
+ leader-pattern-width="3pt"
+ leader-alignment="reference-area"
+ keep-with-next.within-line="always"/>
+ <xsl:text> </xsl:text>
+ <fo:basic-link internal-destination="{$id}">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ </fo:inline>
+ </fo:block>
+ </xsl:template>
+
+ <!--###################################################
+ Extensions
+ ################################################### -->
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <!-- FOP provide only PDF Bookmarks at the moment -->
+ <xsl:param name="fop.extensions">1</xsl:param>
+
+ <!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+ <!-- Dot and Whitespace as separator in TOC between Label and Title-->
+ <xsl:param name="autotoc.label.separator" select="'. '"/>
+
+
+ <!--###################################################
+ Paper & Page Size
+ ################################################### -->
+
+ <!-- Paper type, no headers on blank pages, no double sided printing -->
+ <xsl:param name="paper.type" select="'A4'"/>
+ <xsl:param name="double.sided">0</xsl:param>
+ <xsl:param name="headers.on.blank.pages">0</xsl:param>
+ <xsl:param name="footers.on.blank.pages">0</xsl:param>
+
+ <!-- Space between paper border and content (chaotic stuff, don't touch) -->
+ <xsl:param name="page.margin.top">5mm</xsl:param>
+ <xsl:param name="region.before.extent">10mm</xsl:param>
+ <xsl:param name="body.margin.top">10mm</xsl:param>
+
+ <xsl:param name="body.margin.bottom">15mm</xsl:param>
+ <xsl:param name="region.after.extent">10mm</xsl:param>
+ <xsl:param name="page.margin.bottom">0mm</xsl:param>
+
+ <xsl:param name="page.margin.outer">18mm</xsl:param>
+ <xsl:param name="page.margin.inner">18mm</xsl:param>
+
+ <!-- No intendation of Titles -->
+ <xsl:param name="title.margin.left">0pc</xsl:param>
+
+ <!--###################################################
+ Fonts & Styles
+ ################################################### -->
+
+ <!-- Default Font size -->
+ <xsl:param name="body.font.master">11</xsl:param>
+
+ <!-- Line height in body text -->
+ <xsl:param name="line-height">1.4</xsl:param>
+
+ <!-- Monospaced fonts are smaller than regular text -->
+ <xsl:attribute-set name="monospace.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$monospace.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Tables
+ ################################################### -->
+
+ <!-- The table width should be adapted to the paper size -->
+ <xsl:param name="default.table.width">17.4cm</xsl:param>
+
+ <!-- Some padding inside tables -->
+ <xsl:attribute-set name="table.cell.padding">
+ <xsl:attribute name="padding-left">4pt</xsl:attribute>
+ <xsl:attribute name="padding-right">4pt</xsl:attribute>
+ <xsl:attribute name="padding-top">4pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Only hairlines as frame and cell borders in tables -->
+ <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
+ <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
+
+ <!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+ <!-- Label only Sections up to level 2 -->
+ <xsl:param name="local.l10n.xml" select="document('')"/>
+ <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+ <l:l10n language="en">
+ <l:context name="title-numbered">
+ <l:template name="sect3" text="%t"/>
+ <l:template name="sect4" text="%t"/>
+ <l:template name="sect5" text="%t"/>
+ </l:context>
+ <l:context name="section-xref-numbered">
+ <l:template name="sect3" text="the section called %t"/>
+ <l:template name="sect4" text="the section called %t"/>
+ <l:template name="sect5" text="the section called %t"/>
+ </l:context>
+ </l:l10n>
+ </l:i18n>
+
+ <!--###################################################
+ Titles
+ ################################################### -->
+
+ <!-- Chapter title size -->
+ <xsl:attribute-set name="chapter.titlepage.recto.style">
+ <xsl:attribute name="text-align">left</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.8"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
+ Let's remove it, so this sucker can use our attribute-set only... -->
+ <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xsl:use-attribute-sets="chapter.titlepage.recto.style">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
+ <xsl:attribute-set name="section.title.level1.properties">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.5"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level2.properties">
+ <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.25"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level3.properties">
+ <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.0"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Titles of formal objects (tables, examples, ...) -->
+ <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Programlistings
+ ################################################### -->
+
+ <!-- Verbatim text formatting (programlistings) -->
+ <xsl:attribute-set name="verbatim.properties">
+ <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ <xsl:attribute name="border-color">#444444</xsl:attribute>
+ <xsl:attribute name="border-style">solid</xsl:attribute>
+ <xsl:attribute name="border-width">0.1pt</xsl:attribute>
+ <xsl:attribute name="padding-top">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-left">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-right">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-left">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-right">0.5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Shade (background) programlistings -->
+ <xsl:param name="shade.verbatim">1</xsl:param>
+ <xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- We want to use callouts... -->
+ <xsl:param name="callout.extensions">1</xsl:param>
+
+ <!-- Place callout bullets at this column in programmlisting.-->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+ <!--
+ No, don't use crappy graphics for the callout bullets. This setting
+ enables some weird Unicode rendering for some fancy bullet points
+ in callouts. By default, this can only count to 10 and produces
+ strange results if you ever have more than 10 callouts for one
+ programlisting. We will fix that next.
+ -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!--
+ Again, fun with DocBook XSL: The callout bullets are rendered in
+ two places: In the programlisting itself and in the list below
+ the listing, with the actual callout text. The rendering in the
+ programlisting is some XSL transformer extension (e.g. a Saxon
+ extension), so we can't change that without messing with the
+ extensions. We only can turn it off by setting this limit to
+ zero, then, a simple bracket style like "(3)" and "(4)" will
+ be used in the programlisting.
+ -->
+ <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
+
+ <!--
+ The callout bullets in the actual callout list will be rendered
+ with an XSL FO template. The default template is broken: limited to 10
+ nice looking Unicode bullet points and then it doesn't print anything,
+ the fallback doesn't work. We implement our own template, which is not
+ as complicated, more ugly, but works. As always, function is more
+ important than form.
+ -->
+ <xsl:template name="callout-bug">
+ <xsl:param name="conum" select='1'/>
+ <fo:inline
+ color="black"
+ padding-top="0.1em"
+ padding-bottom="0.1em"
+ padding-start="0.2em"
+ padding-end="0.2em"
+ baseline-shift="0.1em"
+ font-family="{$monospace.font.family}"
+ font-weight="bold"
+ font-size="75%">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </fo:inline>
+
+ </xsl:template>
+
+ <!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Correct placement of titles for figures and examples. -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+ <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
+ <xsl:param name="variablelist.as.blocks">1</xsl:param>
+
+ <!-- The horrible list spacing problems, this is much better. -->
+ <xsl:attribute-set name="list.block.spacing">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Newer DocBook XSL apparently thinks that some sections are by
+ default "draft" status, and this idiotic thing is by default
+ also set to "maybe", so it spits out a lot of errors with the
+ latest FOP as the XSL/FO styles have references to some draft
+ watermarks, which you actually don't want in the first place.
+ Turn this crap off. If you have to work with the "status"
+ attribute, don't.
+ -->
+ <xsl:param name="draft.mode" select="'no'"/>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/styles/html.css
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/styles/html.css 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/fr/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,97 +0,0 @@
-A {
- color: #003399;
-}
-
-A:active {
- color: #003399;
-}
-
-A:visited {
- color: #888888;
-}
-
-P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
- color: #000000;
-}
-
-TD, TH, SPAN {
- color: #000000;
-}
-
-BLOCKQUOTE {
- margin-right: 0px;
-}
-
-
-H1, H2, H3, H4, H5, H6 {
- color: #000000;
- font-weight:500;
- margin-top:10px;
- padding-top:15px;
-}
-
-TABLE {
- border-collapse: collapse;
- border-spacing:0;
- border: 1px thin black;
- empty-cells: hide;
-}
-
-TD {
- padding: 4pt;
-}
-
-H1 { font-size: 150%; }
-H2 { font-size: 140%; }
-H3 { font-size: 110%; font-weight: bold; }
-H4 { font-size: 110%; font-weight: bold;}
-H5 { font-size: 100%; font-style: italic; }
-H6 { font-size: 100%; font-style: italic; }
-
-TT {
-font-size: 90%;
- font-family: "Courier New", Courier, monospace;
- color: #000000;
-}
-
-PRE {
-font-size: 100%;
- padding: 5px;
- border-style: solid;
- border-width: 1px;
- border-color: #CCCCCC;
- background-color: #F4F4F4;
-}
-
-UL, OL, LI {
- list-style: disc;
-}
-
-HR {
- width: 100%;
- height: 1px;
- background-color: #CCCCCC;
- border-width: 0px;
- padding: 0px;
- color: #CCCCCC;
-}
-
-.variablelist {
- padding-top: 10;
- padding-bottom:10;
- margin:0;
-}
-
-.itemizedlist, UL {
- padding-top: 0;
- padding-bottom:0;
- margin:0;
-}
-
-.term {
- font-weight:bold;
-}
-
-
-
-
Copied: trunk/HibernateExt/annotations/doc/reference/fr/styles/html.css (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/styles/html.css)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/fr/styles/html.css (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/fr/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,97 @@
+A {
+ color: #003399;
+}
+
+A:active {
+ color: #003399;
+}
+
+A:visited {
+ color: #888888;
+}
+
+P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
+ color: #000000;
+}
+
+TD, TH, SPAN {
+ color: #000000;
+}
+
+BLOCKQUOTE {
+ margin-right: 0px;
+}
+
+
+H1, H2, H3, H4, H5, H6 {
+ color: #000000;
+ font-weight:500;
+ margin-top:10px;
+ padding-top:15px;
+}
+
+TABLE {
+ border-collapse: collapse;
+ border-spacing:0;
+ border: 1px thin black;
+ empty-cells: hide;
+}
+
+TD {
+ padding: 4pt;
+}
+
+H1 { font-size: 150%; }
+H2 { font-size: 140%; }
+H3 { font-size: 110%; font-weight: bold; }
+H4 { font-size: 110%; font-weight: bold;}
+H5 { font-size: 100%; font-style: italic; }
+H6 { font-size: 100%; font-style: italic; }
+
+TT {
+font-size: 90%;
+ font-family: "Courier New", Courier, monospace;
+ color: #000000;
+}
+
+PRE {
+font-size: 100%;
+ padding: 5px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #CCCCCC;
+ background-color: #F4F4F4;
+}
+
+UL, OL, LI {
+ list-style: disc;
+}
+
+HR {
+ width: 100%;
+ height: 1px;
+ background-color: #CCCCCC;
+ border-width: 0px;
+ padding: 0px;
+ color: #CCCCCC;
+}
+
+.variablelist {
+ padding-top: 10;
+ padding-bottom:10;
+ margin:0;
+}
+
+.itemizedlist, UL {
+ padding-top: 0;
+ padding-bottom:0;
+ margin:0;
+}
+
+.term {
+ font-weight:bold;
+}
+
+
+
+
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/styles/html.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/styles/html.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/fr/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,84 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/fr/styles/html.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/styles/html.xsl)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/fr/styles/html.xsl (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/fr/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/annotations/doc/reference/fr/styles/html_chunk.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/styles/html_chunk.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/fr/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="chunk.section.depth">'5'</xsl:param>
- <xsl:param name="use.id.as.filename">'1'</xsl:param>
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/fr/styles/html_chunk.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/fr/styles/html_chunk.xsl)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/fr/styles/html_chunk.xsl (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/fr/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="chunk.section.depth">'5'</xsl:param>
+ <xsl:param name="use.id.as.filename">'1'</xsl:param>
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn)
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/fop)
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.ttf
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.ttf (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.ttf)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<font-metrics type="TYPE0"><font-name>SimHei</font-name><embed/><cap-height>0</cap-height><x-height>0</x-height><ascender>859</ascender><descender>-140</descender><bbox><left>0</left><bottom>-140</bottom><right>996</right><top>855</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf us="32" ue="126" gi="3"/><bf us="127" ue="127" gi="2"/><bf us="164" ue="164" gi="98"/><bf us="167" ue="168" gi="99"/><bf us="176" ue="177" gi="101"/><bf us="183" ue="183" gi="103"/><bf us="215" ue="215" gi="104"/><bf us="224" ue="225" gi="105"/><bf us="232" ue="234" gi="107"/><bf us="236" ue="237" gi="110"/><bf us="242" ue="243" gi="112"/><bf us="247" ue="247" gi="114"/><bf us="249" ue="250" gi="115"/><bf us="252" ue="252" gi="117"/><bf us="257" ue="257" gi="118"/><bf us="275" ue="275" gi="119"/><bf us="283" ue="283" gi="120"/><bf us="299" ue="299" gi="121"!
/><bf us="324" ue="324" gi="122"/><bf us="328" ue="328" gi="123"/><bf us="333" ue="333" gi="124"/><bf us="363" ue="363" gi="125"/><bf us="462" ue="462" gi="126"/><bf us="464" ue="464" gi="127"/><bf us="466" ue="466" gi="128"/><bf us="468" ue="468" gi="129"/><bf us="470" ue="470" gi="130"/><bf us="472" ue="472" gi="131"/><bf us="474" ue="474" gi="132"/><bf us="476" ue="476" gi="133"/><bf us="505" ue="505" gi="687"/><bf us="593" ue="593" gi="134"/><bf us="609" ue="609" gi="135"/><bf us="711" ue="711" gi="136"/><bf us="713" ue="713" gi="137"/><bf us="714" ue="715" gi="799"/><bf us="729" ue="729" gi="801"/><bf us="913" ue="929" gi="138"/><bf us="931" ue="937" gi="155"/><bf us="945" ue="961" gi="162"/><bf us="963" ue="969" gi="179"/><bf us="1025" ue="1025" gi="186"/><bf us="1040" ue="1103" gi="187"/><bf us="1105" ue="1105" gi="251"/><bf us="8208" ue="8208" gi="971"/><bf us="8211" ue="8211" gi="802"/><bf us="8212" ue="8212" gi="252"/><bf us="8213" ue="8213" gi="803"/><bf us="8214!
" ue="8214" gi="253"/><bf us="8216" ue="8217" gi="254"/><bf us="8220"
ue="8221" gi="256"/><bf us="8229" ue="8229" gi="804"/><bf us="8230" ue="8230" gi="258"/><bf us="8240" ue="8240" gi="259"/><bf us="8242" ue="8243" gi="260"/><bf us="8245" ue="8245" gi="805"/><bf us="8251" ue="8251" gi="262"/><bf us="8451" ue="8451" gi="263"/><bf us="8453" ue="8453" gi="806"/><bf us="8457" ue="8457" gi="807"/><bf us="8470" ue="8470" gi="264"/><bf us="8481" ue="8481" gi="969"/><bf us="8544" ue="8555" gi="265"/><bf us="8560" ue="8569" gi="957"/><bf us="8592" ue="8595" gi="277"/><bf us="8598" ue="8601" gi="808"/><bf us="8712" ue="8712" gi="281"/><bf us="8719" ue="8719" gi="282"/><bf us="8721" ue="8721" gi="283"/><bf us="8725" ue="8725" gi="812"/><bf us="8730" ue="8730" gi="284"/><bf us="8733" ue="8734" gi="285"/><bf us="8735" ue="8735" gi="813"/><bf us="8736" ue="8736" gi="287"/><bf us="8739" ue="8739" gi="814"/><bf us="8741" ue="8741" gi="288"/><bf us="8743" ue="8747" gi="289"/><bf us="8750" ue="8750" gi="294"/><bf us="8756" ue="8759" gi="295"/><bf us="8765" ue=!
"8765" gi="299"/><bf us="8776" ue="8776" gi="300"/><bf us="8780" ue="8780" gi="301"/><bf us="8786" ue="8786" gi="815"/><bf us="8800" ue="8801" gi="302"/><bf us="8804" ue="8805" gi="304"/><bf us="8806" ue="8807" gi="816"/><bf us="8814" ue="8815" gi="306"/><bf us="8853" ue="8853" gi="880"/><bf us="8857" ue="8857" gi="308"/><bf us="8869" ue="8869" gi="309"/><bf us="8895" ue="8895" gi="818"/><bf us="8978" ue="8978" gi="310"/><bf us="9312" ue="9321" gi="311"/><bf us="9332" ue="9371" gi="321"/><bf us="9472" ue="9547" gi="361"/><bf us="9552" ue="9587" gi="819"/><bf us="9601" ue="9615" gi="855"/><bf us="9619" ue="9621" gi="870"/><bf us="9632" ue="9633" gi="437"/><bf us="9650" ue="9651" gi="439"/><bf us="9660" ue="9661" gi="873"/><bf us="9670" ue="9671" gi="441"/><bf us="9675" ue="9675" gi="443"/><bf us="9678" ue="9679" gi="444"/><bf us="9698" ue="9701" gi="875"/><bf us="9733" ue="9734" gi="446"/><bf us="9737" ue="9737" gi="879"/><bf us="9792" ue="9792" gi="448"/><bf us="9794" ue="9!
794" gi="449"/><bf us="11905" ue="11905" gi="21903"/><bf us="11908" ue
="11908" gi="21907"/><bf us="11912" ue="11912" gi="21910"/><bf us="11915" ue="11915" gi="21911"/><bf us="11916" ue="11916" gi="21916"/><bf us="11943" ue="11943" gi="21930"/><bf us="11946" ue="11946" gi="21933"/><bf us="11950" ue="11950" gi="21936"/><bf us="11955" ue="11955" gi="21938"/><bf us="11958" ue="11959" gi="21939"/><bf us="11963" ue="11963" gi="21944"/><bf us="11978" ue="11978" gi="21954"/><bf us="12272" ue="12283" gi="689"/><bf us="12288" ue="12291" gi="450"/><bf us="12293" ue="12293" gi="454"/><bf us="12294" ue="12294" gi="977"/><bf us="12295" ue="12295" gi="21983"/><bf us="12296" ue="12305" gi="455"/><bf us="12306" ue="12306" gi="881"/><bf us="12307" ue="12311" gi="465"/><bf us="12317" ue="12318" gi="882"/><bf us="12321" ue="12329" gi="884"/><bf us="12353" ue="12435" gi="470"/><bf us="12443" ue="12444" gi="973"/><bf us="12445" ue="12446" gi="978"/><bf us="12449" ue="12534" gi="553"/><bf us="12540" ue="12540" gi="972"/><bf us="12541" ue="12542" gi="975"/><bf us="12!
549" ue="12585" gi="639"/><bf us="12832" ue="12841" gi="676"/><bf us="12849" ue="12849" gi="970"/><bf us="12963" ue="12963" gi="893"/><bf us="13198" ue="13199" gi="894"/><bf us="13212" ue="13214" gi="896"/><bf us="13217" ue="13217" gi="899"/><bf us="13252" ue="13252" gi="900"/><bf us="13262" ue="13262" gi="901"/><bf us="13265" ue="13266" gi="902"/><bf us="13269" ue="13269" gi="904"/><bf us="13383" ue="13383" gi="21909"/><bf us="13427" ue="13427" gi="21908"/><bf us="13726" ue="13726" gi="21913"/><bf us="13838" ue="13838" gi="21915"/><bf us="13850" ue="13850" gi="21914"/><bf us="14616" ue="14616" gi="21919"/><bf us="14702" ue="14702" gi="21918"/><bf us="14799" ue="14799" gi="21921"/><bf us="14800" ue="14800" gi="21924"/><bf us="14815" ue="14815" gi="21922"/><bf us="14963" ue="14963" gi="21923"/><bf us="15182" ue="15182" gi="21927"/><bf us="15470" ue="15470" gi="21928"/><bf us="15584" ue="15584" gi="21929"/><bf us="16470" ue="16470" gi="21934"/><bf us="16735" ue="16735" gi="21!
935"/><bf us="17207" ue="17207" gi="21937"/><bf us="17324" ue="17324"
gi="21943"/><bf us="17329" ue="17329" gi="21942"/><bf us="17373" ue="17373" gi="21945"/><bf us="17622" ue="17622" gi="21946"/><bf us="17996" ue="17996" gi="21948"/><bf us="18017" ue="18017" gi="21947"/><bf us="18211" ue="18211" gi="21950"/><bf us="18217" ue="18217" gi="21951"/><bf us="18300" ue="18300" gi="21952"/><bf us="18317" ue="18317" gi="21953"/><bf us="18759" ue="18759" gi="21955"/><bf us="18810" ue="18810" gi="21956"/><bf us="18813" ue="18813" gi="21957"/><bf us="18818" ue="18819" gi="21958"/><bf us="18821" ue="18822" gi="21960"/><bf us="18843" ue="18843" gi="21963"/><bf us="18847" ue="18847" gi="21962"/><bf us="18870" ue="18870" gi="21965"/><bf us="18871" ue="18871" gi="21964"/><bf us="19575" ue="19575" gi="21972"/><bf us="19615" ue="19615" gi="21969"/><bf us="19617" ue="19617" gi="21971"/><bf us="19618" ue="19618" gi="21973"/><bf us="19619" ue="19619" gi="21968"/><bf us="19629" ue="19629" gi="21970"/><bf us="19731" ue="19737" gi="21974"/><bf us="19886" ue="19886" g!
i="21981"/><bf us="19968" ue="40869" gi="980"/><bf us="59335" ue="59336" gi="686"/><bf us="59367" ue="59379" gi="688"/><bf us="59413" ue="59492" gi="21903"/><bf us="63788" ue="63788" gi="21882"/><bf us="63865" ue="63865" gi="21883"/><bf us="63893" ue="63893" gi="21884"/><bf us="63975" ue="63975" gi="21885"/><bf us="63985" ue="63985" gi="21886"/><bf us="64012" ue="64015" gi="21887"/><bf us="64017" ue="64017" gi="21891"/><bf us="64019" ue="64020" gi="21892"/><bf us="64024" ue="64024" gi="21894"/><bf us="64031" ue="64033" gi="21895"/><bf us="64035" ue="64036" gi="21898"/><bf us="64039" ue="64041" gi="21900"/><bf us="65072" ue="65073" gi="905"/><bf us="65075" ue="65092" gi="907"/><bf us="65097" ue="65106" gi="925"/><bf us="65108" ue="65111" gi="935"/><bf us="65113" ue="65126" gi="939"/><bf us="65128" ue="65131" gi="953"/><bf us="65281" ue="65374" gi="701"/><bf us="65504" ue="65505" gi="795"/><bf us="65506" ue="65506" gi="967"/><bf us="65507" ue="65507" gi="797"/><bf us="65508" !
ue="65508" gi="968"/><bf us="65509" ue="65509" gi="798"/><bf us="65535
" ue="65535" gi="0"/></bfranges><cid-widths start-index="0"><wx w="1000"/><wx w="0"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="!
500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/></cid-widths></multibyte-extras></font-metrics>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simhei.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<font-metrics type="TYPE0"><font-name>SimHei</font-name><embed/><cap-height>0</cap-height><x-height>0</x-height><ascender>859</ascender><descender>-140</descender><bbox><left>0</left><bottom>-140</bottom><right>996</right><top>855</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf us="32" ue="126" gi="3"/><bf us="127" ue="127" gi="2"/><bf us="164" ue="164" gi="98"/><bf us="167" ue="168" gi="99"/><bf us="176" ue="177" gi="101"/><bf us="183" ue="183" gi="103"/><bf us="215" ue="215" gi="104"/><bf us="224" ue="225" gi="105"/><bf us="232" ue="234" gi="107"/><bf us="236" ue="237" gi="110"/><bf us="242" ue="243" gi="112"/><bf us="247" ue="247" gi="114"/><bf us="249" ue="250" gi="115"/><bf us="252" ue="252" gi="117"/><bf us="257" ue="257" gi="118"/><bf us="275" ue="275" gi="119"/><bf us="283" ue="283" gi="120"/><bf us="299" ue="299" gi="121"!
/><bf us="324" ue="324" gi="122"/><bf us="328" ue="328" gi="123"/><bf us="333" ue="333" gi="124"/><bf us="363" ue="363" gi="125"/><bf us="462" ue="462" gi="126"/><bf us="464" ue="464" gi="127"/><bf us="466" ue="466" gi="128"/><bf us="468" ue="468" gi="129"/><bf us="470" ue="470" gi="130"/><bf us="472" ue="472" gi="131"/><bf us="474" ue="474" gi="132"/><bf us="476" ue="476" gi="133"/><bf us="505" ue="505" gi="687"/><bf us="593" ue="593" gi="134"/><bf us="609" ue="609" gi="135"/><bf us="711" ue="711" gi="136"/><bf us="713" ue="713" gi="137"/><bf us="714" ue="715" gi="799"/><bf us="729" ue="729" gi="801"/><bf us="913" ue="929" gi="138"/><bf us="931" ue="937" gi="155"/><bf us="945" ue="961" gi="162"/><bf us="963" ue="969" gi="179"/><bf us="1025" ue="1025" gi="186"/><bf us="1040" ue="1103" gi="187"/><bf us="1105" ue="1105" gi="251"/><bf us="8208" ue="8208" gi="971"/><bf us="8211" ue="8211" gi="802"/><bf us="8212" ue="8212" gi="252"/><bf us="8213" ue="8213" gi="803"/><bf us="8214!
" ue="8214" gi="253"/><bf us="8216" ue="8217" gi="254"/><bf us="8220"
ue="8221" gi="256"/><bf us="8229" ue="8229" gi="804"/><bf us="8230" ue="8230" gi="258"/><bf us="8240" ue="8240" gi="259"/><bf us="8242" ue="8243" gi="260"/><bf us="8245" ue="8245" gi="805"/><bf us="8251" ue="8251" gi="262"/><bf us="8451" ue="8451" gi="263"/><bf us="8453" ue="8453" gi="806"/><bf us="8457" ue="8457" gi="807"/><bf us="8470" ue="8470" gi="264"/><bf us="8481" ue="8481" gi="969"/><bf us="8544" ue="8555" gi="265"/><bf us="8560" ue="8569" gi="957"/><bf us="8592" ue="8595" gi="277"/><bf us="8598" ue="8601" gi="808"/><bf us="8712" ue="8712" gi="281"/><bf us="8719" ue="8719" gi="282"/><bf us="8721" ue="8721" gi="283"/><bf us="8725" ue="8725" gi="812"/><bf us="8730" ue="8730" gi="284"/><bf us="8733" ue="8734" gi="285"/><bf us="8735" ue="8735" gi="813"/><bf us="8736" ue="8736" gi="287"/><bf us="8739" ue="8739" gi="814"/><bf us="8741" ue="8741" gi="288"/><bf us="8743" ue="8747" gi="289"/><bf us="8750" ue="8750" gi="294"/><bf us="8756" ue="8759" gi="295"/><bf us="8765" ue=!
"8765" gi="299"/><bf us="8776" ue="8776" gi="300"/><bf us="8780" ue="8780" gi="301"/><bf us="8786" ue="8786" gi="815"/><bf us="8800" ue="8801" gi="302"/><bf us="8804" ue="8805" gi="304"/><bf us="8806" ue="8807" gi="816"/><bf us="8814" ue="8815" gi="306"/><bf us="8853" ue="8853" gi="880"/><bf us="8857" ue="8857" gi="308"/><bf us="8869" ue="8869" gi="309"/><bf us="8895" ue="8895" gi="818"/><bf us="8978" ue="8978" gi="310"/><bf us="9312" ue="9321" gi="311"/><bf us="9332" ue="9371" gi="321"/><bf us="9472" ue="9547" gi="361"/><bf us="9552" ue="9587" gi="819"/><bf us="9601" ue="9615" gi="855"/><bf us="9619" ue="9621" gi="870"/><bf us="9632" ue="9633" gi="437"/><bf us="9650" ue="9651" gi="439"/><bf us="9660" ue="9661" gi="873"/><bf us="9670" ue="9671" gi="441"/><bf us="9675" ue="9675" gi="443"/><bf us="9678" ue="9679" gi="444"/><bf us="9698" ue="9701" gi="875"/><bf us="9733" ue="9734" gi="446"/><bf us="9737" ue="9737" gi="879"/><bf us="9792" ue="9792" gi="448"/><bf us="9794" ue="9!
794" gi="449"/><bf us="11905" ue="11905" gi="21903"/><bf us="11908" ue
="11908" gi="21907"/><bf us="11912" ue="11912" gi="21910"/><bf us="11915" ue="11915" gi="21911"/><bf us="11916" ue="11916" gi="21916"/><bf us="11943" ue="11943" gi="21930"/><bf us="11946" ue="11946" gi="21933"/><bf us="11950" ue="11950" gi="21936"/><bf us="11955" ue="11955" gi="21938"/><bf us="11958" ue="11959" gi="21939"/><bf us="11963" ue="11963" gi="21944"/><bf us="11978" ue="11978" gi="21954"/><bf us="12272" ue="12283" gi="689"/><bf us="12288" ue="12291" gi="450"/><bf us="12293" ue="12293" gi="454"/><bf us="12294" ue="12294" gi="977"/><bf us="12295" ue="12295" gi="21983"/><bf us="12296" ue="12305" gi="455"/><bf us="12306" ue="12306" gi="881"/><bf us="12307" ue="12311" gi="465"/><bf us="12317" ue="12318" gi="882"/><bf us="12321" ue="12329" gi="884"/><bf us="12353" ue="12435" gi="470"/><bf us="12443" ue="12444" gi="973"/><bf us="12445" ue="12446" gi="978"/><bf us="12449" ue="12534" gi="553"/><bf us="12540" ue="12540" gi="972"/><bf us="12541" ue="12542" gi="975"/><bf us="12!
549" ue="12585" gi="639"/><bf us="12832" ue="12841" gi="676"/><bf us="12849" ue="12849" gi="970"/><bf us="12963" ue="12963" gi="893"/><bf us="13198" ue="13199" gi="894"/><bf us="13212" ue="13214" gi="896"/><bf us="13217" ue="13217" gi="899"/><bf us="13252" ue="13252" gi="900"/><bf us="13262" ue="13262" gi="901"/><bf us="13265" ue="13266" gi="902"/><bf us="13269" ue="13269" gi="904"/><bf us="13383" ue="13383" gi="21909"/><bf us="13427" ue="13427" gi="21908"/><bf us="13726" ue="13726" gi="21913"/><bf us="13838" ue="13838" gi="21915"/><bf us="13850" ue="13850" gi="21914"/><bf us="14616" ue="14616" gi="21919"/><bf us="14702" ue="14702" gi="21918"/><bf us="14799" ue="14799" gi="21921"/><bf us="14800" ue="14800" gi="21924"/><bf us="14815" ue="14815" gi="21922"/><bf us="14963" ue="14963" gi="21923"/><bf us="15182" ue="15182" gi="21927"/><bf us="15470" ue="15470" gi="21928"/><bf us="15584" ue="15584" gi="21929"/><bf us="16470" ue="16470" gi="21934"/><bf us="16735" ue="16735" gi="21!
935"/><bf us="17207" ue="17207" gi="21937"/><bf us="17324" ue="17324"
gi="21943"/><bf us="17329" ue="17329" gi="21942"/><bf us="17373" ue="17373" gi="21945"/><bf us="17622" ue="17622" gi="21946"/><bf us="17996" ue="17996" gi="21948"/><bf us="18017" ue="18017" gi="21947"/><bf us="18211" ue="18211" gi="21950"/><bf us="18217" ue="18217" gi="21951"/><bf us="18300" ue="18300" gi="21952"/><bf us="18317" ue="18317" gi="21953"/><bf us="18759" ue="18759" gi="21955"/><bf us="18810" ue="18810" gi="21956"/><bf us="18813" ue="18813" gi="21957"/><bf us="18818" ue="18819" gi="21958"/><bf us="18821" ue="18822" gi="21960"/><bf us="18843" ue="18843" gi="21963"/><bf us="18847" ue="18847" gi="21962"/><bf us="18870" ue="18870" gi="21965"/><bf us="18871" ue="18871" gi="21964"/><bf us="19575" ue="19575" gi="21972"/><bf us="19615" ue="19615" gi="21969"/><bf us="19617" ue="19617" gi="21971"/><bf us="19618" ue="19618" gi="21973"/><bf us="19619" ue="19619" gi="21968"/><bf us="19629" ue="19629" gi="21970"/><bf us="19731" ue="19737" gi="21974"/><bf us="19886" ue="19886" g!
i="21981"/><bf us="19968" ue="40869" gi="980"/><bf us="59335" ue="59336" gi="686"/><bf us="59367" ue="59379" gi="688"/><bf us="59413" ue="59492" gi="21903"/><bf us="63788" ue="63788" gi="21882"/><bf us="63865" ue="63865" gi="21883"/><bf us="63893" ue="63893" gi="21884"/><bf us="63975" ue="63975" gi="21885"/><bf us="63985" ue="63985" gi="21886"/><bf us="64012" ue="64015" gi="21887"/><bf us="64017" ue="64017" gi="21891"/><bf us="64019" ue="64020" gi="21892"/><bf us="64024" ue="64024" gi="21894"/><bf us="64031" ue="64033" gi="21895"/><bf us="64035" ue="64036" gi="21898"/><bf us="64039" ue="64041" gi="21900"/><bf us="65072" ue="65073" gi="905"/><bf us="65075" ue="65092" gi="907"/><bf us="65097" ue="65106" gi="925"/><bf us="65108" ue="65111" gi="935"/><bf us="65113" ue="65126" gi="939"/><bf us="65128" ue="65131" gi="953"/><bf us="65281" ue="65374" gi="701"/><bf us="65504" ue="65505" gi="795"/><bf us="65506" ue="65506" gi="967"/><bf us="65507" ue="65507" gi="797"/><bf us="65508" !
ue="65508" gi="968"/><bf us="65509" ue="65509" gi="798"/><bf us="65535
" ue="65535" gi="0"/></bfranges><cid-widths start-index="0"><wx w="1000"/><wx w="0"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="!
500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/></cid-widths></multibyte-extras></font-metrics>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.ttc
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.ttc (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.ttc)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,2 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<font-metrics type="TYPE0"><font-name>SimSun</font-name><embed/><cap-height>0</cap-height><x-height>0</x-height><ascender>859</ascender><descender>-140</descender><bbox><left>0</left><bottom>-140</bottom><right>996</right><top>855</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><ttc-name>SimSun</ttc-name><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf us="32" ue="126" gi="3"/><bf us="127" ue="127" gi="2"/><bf us="160" ue="163" gi="22021"/><bf us="164" ue="164" gi="98"/><bf us="165" ue="166" gi="22025"/><bf us="167" ue="168" gi="99"/><bf us="169" ue="175" gi="22027"/><bf us="176" ue="177" gi="101"/><bf us="178" ue="182" gi="22034"/><bf us="183" ue="183" gi="103"/><bf us="184" ue="214" gi="22039"/><bf us="215" ue="215" gi="104"/><bf us="216" ue="223" gi="22070"/><bf us="224" ue="225" gi="105"/><bf us="226" ue="231" gi="22078"/><bf us="232" ue="234" gi="107"/><bf us="235" ue="235"!
gi="22084"/><bf us="236" ue="237" gi="110"/><bf us="238" ue="241" gi="22085"/><bf us="242" ue="243" gi="112"/><bf us="244" ue="246" gi="22089"/><bf us="247" ue="247" gi="114"/><bf us="248" ue="248" gi="22092"/><bf us="249" ue="250" gi="115"/><bf us="251" ue="251" gi="22093"/><bf us="252" ue="252" gi="117"/><bf us="253" ue="255" gi="22094"/><bf us="257" ue="257" gi="118"/><bf us="275" ue="275" gi="119"/><bf us="283" ue="283" gi="120"/><bf us="299" ue="299" gi="121"/><bf us="324" ue="324" gi="122"/><bf us="328" ue="328" gi="123"/><bf us="333" ue="333" gi="124"/><bf us="338" ue="339" gi="22097"/><bf us="352" ue="353" gi="22099"/><bf us="363" ue="363" gi="125"/><bf us="376" ue="376" gi="22101"/><bf us="402" ue="402" gi="22102"/><bf us="462" ue="462" gi="126"/><bf us="464" ue="464" gi="127"/><bf us="466" ue="466" gi="128"/><bf us="468" ue="468" gi="129"/><bf us="470" ue="470" gi="130"/><bf us="472" ue="472" gi="131"/><bf us="474" ue="474" gi="132"/><bf us="476" ue="476" gi="133!
"/><bf us="505" ue="505" gi="687"/><bf us="593" ue="593" gi="134"/><bf
us="609" ue="609" gi="135"/><bf us="710" ue="710" gi="22103"/><bf us="711" ue="711" gi="136"/><bf us="713" ue="713" gi="137"/><bf us="714" ue="715" gi="799"/><bf us="729" ue="729" gi="801"/><bf us="732" ue="732" gi="22104"/><bf us="913" ue="929" gi="138"/><bf us="931" ue="937" gi="155"/><bf us="945" ue="961" gi="162"/><bf us="963" ue="969" gi="179"/><bf us="1025" ue="1025" gi="186"/><bf us="1040" ue="1103" gi="187"/><bf us="1105" ue="1105" gi="251"/><bf us="8208" ue="8208" gi="971"/><bf us="8211" ue="8211" gi="802"/><bf us="8212" ue="8212" gi="252"/><bf us="8213" ue="8213" gi="803"/><bf us="8214" ue="8214" gi="253"/><bf us="8216" ue="8217" gi="254"/><bf us="8218" ue="8218" gi="22105"/><bf us="8220" ue="8221" gi="256"/><bf us="8222" ue="8222" gi="22106"/><bf us="8224" ue="8226" gi="22107"/><bf us="8229" ue="8229" gi="804"/><bf us="8230" ue="8230" gi="258"/><bf us="8240" ue="8240" gi="259"/><bf us="8242" ue="8243" gi="260"/><bf us="8245" ue="8245" gi="805"/><bf us="8249" ue="!
8250" gi="22110"/><bf us="8251" ue="8251" gi="262"/><bf us="8364" ue="8364" gi="22112"/><bf us="8451" ue="8451" gi="263"/><bf us="8453" ue="8453" gi="806"/><bf us="8457" ue="8457" gi="807"/><bf us="8470" ue="8470" gi="264"/><bf us="8481" ue="8481" gi="969"/><bf us="8482" ue="8482" gi="22113"/><bf us="8544" ue="8555" gi="265"/><bf us="8560" ue="8569" gi="957"/><bf us="8592" ue="8595" gi="277"/><bf us="8598" ue="8601" gi="808"/><bf us="8712" ue="8712" gi="281"/><bf us="8719" ue="8719" gi="282"/><bf us="8721" ue="8721" gi="283"/><bf us="8725" ue="8725" gi="812"/><bf us="8730" ue="8730" gi="284"/><bf us="8733" ue="8734" gi="285"/><bf us="8735" ue="8735" gi="813"/><bf us="8736" ue="8736" gi="287"/><bf us="8739" ue="8739" gi="814"/><bf us="8741" ue="8741" gi="288"/><bf us="8743" ue="8747" gi="289"/><bf us="8750" ue="8750" gi="294"/><bf us="8756" ue="8759" gi="295"/><bf us="8765" ue="8765" gi="299"/><bf us="8776" ue="8776" gi="300"/><bf us="8780" ue="8780" gi="301"/><bf us="8786" !
ue="8786" gi="815"/><bf us="8800" ue="8801" gi="302"/><bf us="8804" ue
="8805" gi="304"/><bf us="8806" ue="8807" gi="816"/><bf us="8814" ue="8815" gi="306"/><bf us="8853" ue="8853" gi="880"/><bf us="8857" ue="8857" gi="308"/><bf us="8869" ue="8869" gi="309"/><bf us="8895" ue="8895" gi="818"/><bf us="8978" ue="8978" gi="310"/><bf us="9312" ue="9321" gi="311"/><bf us="9332" ue="9371" gi="321"/><bf us="9472" ue="9547" gi="361"/><bf us="9552" ue="9587" gi="819"/><bf us="9601" ue="9615" gi="855"/><bf us="9619" ue="9621" gi="870"/><bf us="9632" ue="9633" gi="437"/><bf us="9650" ue="9651" gi="439"/><bf us="9660" ue="9661" gi="873"/><bf us="9670" ue="9671" gi="441"/><bf us="9675" ue="9675" gi="443"/><bf us="9678" ue="9679" gi="444"/><bf us="9698" ue="9701" gi="875"/><bf us="9733" ue="9734" gi="446"/><bf us="9737" ue="9737" gi="879"/><bf us="9792" ue="9792" gi="448"/><bf us="9794" ue="9794" gi="449"/><bf us="11905" ue="11905" gi="21903"/><bf us="11908" ue="11908" gi="21907"/><bf us="11912" ue="11912" gi="21910"/><bf us="11915" ue="11915" gi="21911"/><bf!
us="11916" ue="11916" gi="21916"/><bf us="11943" ue="11943" gi="21930"/><bf us="11946" ue="11946" gi="21933"/><bf us="11950" ue="11950" gi="21936"/><bf us="11955" ue="11955" gi="21938"/><bf us="11958" ue="11959" gi="21939"/><bf us="11963" ue="11963" gi="21944"/><bf us="11978" ue="11978" gi="21954"/><bf us="12272" ue="12283" gi="689"/><bf us="12288" ue="12291" gi="450"/><bf us="12293" ue="12293" gi="454"/><bf us="12294" ue="12294" gi="977"/><bf us="12295" ue="12295" gi="21983"/><bf us="12296" ue="12305" gi="455"/><bf us="12306" ue="12306" gi="881"/><bf us="12307" ue="12311" gi="465"/><bf us="12317" ue="12318" gi="882"/><bf us="12321" ue="12329" gi="884"/><bf us="12353" ue="12435" gi="470"/><bf us="12443" ue="12444" gi="973"/><bf us="12445" ue="12446" gi="978"/><bf us="12449" ue="12534" gi="553"/><bf us="12540" ue="12540" gi="972"/><bf us="12541" ue="12542" gi="975"/><bf us="12549" ue="12585" gi="639"/><bf us="12832" ue="12841" gi="676"/><bf us="12849" ue="12849" gi="970"/><!
bf us="12963" ue="12963" gi="893"/><bf us="13198" ue="13199" gi="894"/
><bf us="13212" ue="13214" gi="896"/><bf us="13217" ue="13217" gi="899"/><bf us="13252" ue="13252" gi="900"/><bf us="13262" ue="13262" gi="901"/><bf us="13265" ue="13266" gi="902"/><bf us="13269" ue="13269" gi="904"/><bf us="13383" ue="13383" gi="21909"/><bf us="13427" ue="13427" gi="21908"/><bf us="13726" ue="13726" gi="21913"/><bf us="13838" ue="13838" gi="21915"/><bf us="13850" ue="13850" gi="21914"/><bf us="14616" ue="14616" gi="21919"/><bf us="14702" ue="14702" gi="21918"/><bf us="14799" ue="14799" gi="21921"/><bf us="14800" ue="14800" gi="21924"/><bf us="14815" ue="14815" gi="21922"/><bf us="14963" ue="14963" gi="21923"/><bf us="15182" ue="15182" gi="21927"/><bf us="15470" ue="15470" gi="21928"/><bf us="15584" ue="15584" gi="21929"/><bf us="16470" ue="16470" gi="21934"/><bf us="16735" ue="16735" gi="21935"/><bf us="17207" ue="17207" gi="21937"/><bf us="17324" ue="17324" gi="21943"/><bf us="17329" ue="17329" gi="21942"/><bf us="17373" ue="17373" gi="21945"/><bf us="1762!
2" ue="17622" gi="21946"/><bf us="17996" ue="17996" gi="21948"/><bf us="18017" ue="18017" gi="21947"/><bf us="18211" ue="18211" gi="21950"/><bf us="18217" ue="18217" gi="21951"/><bf us="18300" ue="18300" gi="21952"/><bf us="18317" ue="18317" gi="21953"/><bf us="18759" ue="18759" gi="21955"/><bf us="18810" ue="18810" gi="21956"/><bf us="18813" ue="18813" gi="21957"/><bf us="18818" ue="18819" gi="21958"/><bf us="18821" ue="18822" gi="21960"/><bf us="18843" ue="18843" gi="21963"/><bf us="18847" ue="18847" gi="21962"/><bf us="18870" ue="18870" gi="21965"/><bf us="18871" ue="18871" gi="21964"/><bf us="19575" ue="19575" gi="21972"/><bf us="19615" ue="19615" gi="21969"/><bf us="19617" ue="19617" gi="21971"/><bf us="19618" ue="19618" gi="21973"/><bf us="19619" ue="19619" gi="21968"/><bf us="19629" ue="19629" gi="21970"/><bf us="19731" ue="19737" gi="21974"/><bf us="19886" ue="19886" gi="21981"/><bf us="19968" ue="40869" gi="980"/><bf us="59335" ue="59336" gi="686"/><bf us="59367" u!
e="59379" gi="688"/><bf us="59413" ue="59492" gi="21903"/><bf us="6378
8" ue="63788" gi="21882"/><bf us="63865" ue="63865" gi="21883"/><bf us="63893" ue="63893" gi="21884"/><bf us="63975" ue="63975" gi="21885"/><bf us="63985" ue="63985" gi="21886"/><bf us="64012" ue="64015" gi="21887"/><bf us="64017" ue="64017" gi="21891"/><bf us="64019" ue="64020" gi="21892"/><bf us="64024" ue="64024" gi="21894"/><bf us="64031" ue="64033" gi="21895"/><bf us="64035" ue="64036" gi="21898"/><bf us="64039" ue="64041" gi="21900"/><bf us="65072" ue="65073" gi="905"/><bf us="65075" ue="65092" gi="907"/><bf us="65097" ue="65106" gi="925"/><bf us="65108" ue="65111" gi="935"/><bf us="65113" ue="65126" gi="939"/><bf us="65128" ue="65131" gi="953"/><bf us="65281" ue="65374" gi="701"/><bf us="65504" ue="65505" gi="795"/><bf us="65506" ue="65506" gi="967"/><bf us="65507" ue="65507" gi="797"/><bf us="65508" ue="65508" gi="968"/><bf us="65509" ue="65509" gi="798"/><bf us="65535" ue="65535" gi="0"/></bfranges><cid-widths start-index="0"><wx w="1000"/><wx w="0"/><wx w="500"/><w!
x w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><w!
x w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="
500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/!
><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/></cid-widths></multibyte-extras></font-metrics>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/simsun.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<font-metrics type="TYPE0"><font-name>SimSun</font-name><embed/><cap-height>0</cap-height><x-height>0</x-height><ascender>859</ascender><descender>-140</descender><bbox><left>0</left><bottom>-140</bottom><right>996</right><top>855</top></bbox><flags>33</flags><stemv>0</stemv><italicangle>0</italicangle><ttc-name>SimSun</ttc-name><subtype>TYPE0</subtype><multibyte-extras><cid-type>CIDFontType2</cid-type><default-width>0</default-width><bfranges><bf us="32" ue="126" gi="3"/><bf us="127" ue="127" gi="2"/><bf us="160" ue="163" gi="22021"/><bf us="164" ue="164" gi="98"/><bf us="165" ue="166" gi="22025"/><bf us="167" ue="168" gi="99"/><bf us="169" ue="175" gi="22027"/><bf us="176" ue="177" gi="101"/><bf us="178" ue="182" gi="22034"/><bf us="183" ue="183" gi="103"/><bf us="184" ue="214" gi="22039"/><bf us="215" ue="215" gi="104"/><bf us="216" ue="223" gi="22070"/><bf us="224" ue="225" gi="105"/><bf us="226" ue="231" gi="22078"/><bf us="232" ue="234" gi="107"/><bf us="235" ue="235"!
gi="22084"/><bf us="236" ue="237" gi="110"/><bf us="238" ue="241" gi="22085"/><bf us="242" ue="243" gi="112"/><bf us="244" ue="246" gi="22089"/><bf us="247" ue="247" gi="114"/><bf us="248" ue="248" gi="22092"/><bf us="249" ue="250" gi="115"/><bf us="251" ue="251" gi="22093"/><bf us="252" ue="252" gi="117"/><bf us="253" ue="255" gi="22094"/><bf us="257" ue="257" gi="118"/><bf us="275" ue="275" gi="119"/><bf us="283" ue="283" gi="120"/><bf us="299" ue="299" gi="121"/><bf us="324" ue="324" gi="122"/><bf us="328" ue="328" gi="123"/><bf us="333" ue="333" gi="124"/><bf us="338" ue="339" gi="22097"/><bf us="352" ue="353" gi="22099"/><bf us="363" ue="363" gi="125"/><bf us="376" ue="376" gi="22101"/><bf us="402" ue="402" gi="22102"/><bf us="462" ue="462" gi="126"/><bf us="464" ue="464" gi="127"/><bf us="466" ue="466" gi="128"/><bf us="468" ue="468" gi="129"/><bf us="470" ue="470" gi="130"/><bf us="472" ue="472" gi="131"/><bf us="474" ue="474" gi="132"/><bf us="476" ue="476" gi="133!
"/><bf us="505" ue="505" gi="687"/><bf us="593" ue="593" gi="134"/><bf
us="609" ue="609" gi="135"/><bf us="710" ue="710" gi="22103"/><bf us="711" ue="711" gi="136"/><bf us="713" ue="713" gi="137"/><bf us="714" ue="715" gi="799"/><bf us="729" ue="729" gi="801"/><bf us="732" ue="732" gi="22104"/><bf us="913" ue="929" gi="138"/><bf us="931" ue="937" gi="155"/><bf us="945" ue="961" gi="162"/><bf us="963" ue="969" gi="179"/><bf us="1025" ue="1025" gi="186"/><bf us="1040" ue="1103" gi="187"/><bf us="1105" ue="1105" gi="251"/><bf us="8208" ue="8208" gi="971"/><bf us="8211" ue="8211" gi="802"/><bf us="8212" ue="8212" gi="252"/><bf us="8213" ue="8213" gi="803"/><bf us="8214" ue="8214" gi="253"/><bf us="8216" ue="8217" gi="254"/><bf us="8218" ue="8218" gi="22105"/><bf us="8220" ue="8221" gi="256"/><bf us="8222" ue="8222" gi="22106"/><bf us="8224" ue="8226" gi="22107"/><bf us="8229" ue="8229" gi="804"/><bf us="8230" ue="8230" gi="258"/><bf us="8240" ue="8240" gi="259"/><bf us="8242" ue="8243" gi="260"/><bf us="8245" ue="8245" gi="805"/><bf us="8249" ue="!
8250" gi="22110"/><bf us="8251" ue="8251" gi="262"/><bf us="8364" ue="8364" gi="22112"/><bf us="8451" ue="8451" gi="263"/><bf us="8453" ue="8453" gi="806"/><bf us="8457" ue="8457" gi="807"/><bf us="8470" ue="8470" gi="264"/><bf us="8481" ue="8481" gi="969"/><bf us="8482" ue="8482" gi="22113"/><bf us="8544" ue="8555" gi="265"/><bf us="8560" ue="8569" gi="957"/><bf us="8592" ue="8595" gi="277"/><bf us="8598" ue="8601" gi="808"/><bf us="8712" ue="8712" gi="281"/><bf us="8719" ue="8719" gi="282"/><bf us="8721" ue="8721" gi="283"/><bf us="8725" ue="8725" gi="812"/><bf us="8730" ue="8730" gi="284"/><bf us="8733" ue="8734" gi="285"/><bf us="8735" ue="8735" gi="813"/><bf us="8736" ue="8736" gi="287"/><bf us="8739" ue="8739" gi="814"/><bf us="8741" ue="8741" gi="288"/><bf us="8743" ue="8747" gi="289"/><bf us="8750" ue="8750" gi="294"/><bf us="8756" ue="8759" gi="295"/><bf us="8765" ue="8765" gi="299"/><bf us="8776" ue="8776" gi="300"/><bf us="8780" ue="8780" gi="301"/><bf us="8786" !
ue="8786" gi="815"/><bf us="8800" ue="8801" gi="302"/><bf us="8804" ue
="8805" gi="304"/><bf us="8806" ue="8807" gi="816"/><bf us="8814" ue="8815" gi="306"/><bf us="8853" ue="8853" gi="880"/><bf us="8857" ue="8857" gi="308"/><bf us="8869" ue="8869" gi="309"/><bf us="8895" ue="8895" gi="818"/><bf us="8978" ue="8978" gi="310"/><bf us="9312" ue="9321" gi="311"/><bf us="9332" ue="9371" gi="321"/><bf us="9472" ue="9547" gi="361"/><bf us="9552" ue="9587" gi="819"/><bf us="9601" ue="9615" gi="855"/><bf us="9619" ue="9621" gi="870"/><bf us="9632" ue="9633" gi="437"/><bf us="9650" ue="9651" gi="439"/><bf us="9660" ue="9661" gi="873"/><bf us="9670" ue="9671" gi="441"/><bf us="9675" ue="9675" gi="443"/><bf us="9678" ue="9679" gi="444"/><bf us="9698" ue="9701" gi="875"/><bf us="9733" ue="9734" gi="446"/><bf us="9737" ue="9737" gi="879"/><bf us="9792" ue="9792" gi="448"/><bf us="9794" ue="9794" gi="449"/><bf us="11905" ue="11905" gi="21903"/><bf us="11908" ue="11908" gi="21907"/><bf us="11912" ue="11912" gi="21910"/><bf us="11915" ue="11915" gi="21911"/><bf!
us="11916" ue="11916" gi="21916"/><bf us="11943" ue="11943" gi="21930"/><bf us="11946" ue="11946" gi="21933"/><bf us="11950" ue="11950" gi="21936"/><bf us="11955" ue="11955" gi="21938"/><bf us="11958" ue="11959" gi="21939"/><bf us="11963" ue="11963" gi="21944"/><bf us="11978" ue="11978" gi="21954"/><bf us="12272" ue="12283" gi="689"/><bf us="12288" ue="12291" gi="450"/><bf us="12293" ue="12293" gi="454"/><bf us="12294" ue="12294" gi="977"/><bf us="12295" ue="12295" gi="21983"/><bf us="12296" ue="12305" gi="455"/><bf us="12306" ue="12306" gi="881"/><bf us="12307" ue="12311" gi="465"/><bf us="12317" ue="12318" gi="882"/><bf us="12321" ue="12329" gi="884"/><bf us="12353" ue="12435" gi="470"/><bf us="12443" ue="12444" gi="973"/><bf us="12445" ue="12446" gi="978"/><bf us="12449" ue="12534" gi="553"/><bf us="12540" ue="12540" gi="972"/><bf us="12541" ue="12542" gi="975"/><bf us="12549" ue="12585" gi="639"/><bf us="12832" ue="12841" gi="676"/><bf us="12849" ue="12849" gi="970"/><!
bf us="12963" ue="12963" gi="893"/><bf us="13198" ue="13199" gi="894"/
><bf us="13212" ue="13214" gi="896"/><bf us="13217" ue="13217" gi="899"/><bf us="13252" ue="13252" gi="900"/><bf us="13262" ue="13262" gi="901"/><bf us="13265" ue="13266" gi="902"/><bf us="13269" ue="13269" gi="904"/><bf us="13383" ue="13383" gi="21909"/><bf us="13427" ue="13427" gi="21908"/><bf us="13726" ue="13726" gi="21913"/><bf us="13838" ue="13838" gi="21915"/><bf us="13850" ue="13850" gi="21914"/><bf us="14616" ue="14616" gi="21919"/><bf us="14702" ue="14702" gi="21918"/><bf us="14799" ue="14799" gi="21921"/><bf us="14800" ue="14800" gi="21924"/><bf us="14815" ue="14815" gi="21922"/><bf us="14963" ue="14963" gi="21923"/><bf us="15182" ue="15182" gi="21927"/><bf us="15470" ue="15470" gi="21928"/><bf us="15584" ue="15584" gi="21929"/><bf us="16470" ue="16470" gi="21934"/><bf us="16735" ue="16735" gi="21935"/><bf us="17207" ue="17207" gi="21937"/><bf us="17324" ue="17324" gi="21943"/><bf us="17329" ue="17329" gi="21942"/><bf us="17373" ue="17373" gi="21945"/><bf us="1762!
2" ue="17622" gi="21946"/><bf us="17996" ue="17996" gi="21948"/><bf us="18017" ue="18017" gi="21947"/><bf us="18211" ue="18211" gi="21950"/><bf us="18217" ue="18217" gi="21951"/><bf us="18300" ue="18300" gi="21952"/><bf us="18317" ue="18317" gi="21953"/><bf us="18759" ue="18759" gi="21955"/><bf us="18810" ue="18810" gi="21956"/><bf us="18813" ue="18813" gi="21957"/><bf us="18818" ue="18819" gi="21958"/><bf us="18821" ue="18822" gi="21960"/><bf us="18843" ue="18843" gi="21963"/><bf us="18847" ue="18847" gi="21962"/><bf us="18870" ue="18870" gi="21965"/><bf us="18871" ue="18871" gi="21964"/><bf us="19575" ue="19575" gi="21972"/><bf us="19615" ue="19615" gi="21969"/><bf us="19617" ue="19617" gi="21971"/><bf us="19618" ue="19618" gi="21973"/><bf us="19619" ue="19619" gi="21968"/><bf us="19629" ue="19629" gi="21970"/><bf us="19731" ue="19737" gi="21974"/><bf us="19886" ue="19886" gi="21981"/><bf us="19968" ue="40869" gi="980"/><bf us="59335" ue="59336" gi="686"/><bf us="59367" u!
e="59379" gi="688"/><bf us="59413" ue="59492" gi="21903"/><bf us="6378
8" ue="63788" gi="21882"/><bf us="63865" ue="63865" gi="21883"/><bf us="63893" ue="63893" gi="21884"/><bf us="63975" ue="63975" gi="21885"/><bf us="63985" ue="63985" gi="21886"/><bf us="64012" ue="64015" gi="21887"/><bf us="64017" ue="64017" gi="21891"/><bf us="64019" ue="64020" gi="21892"/><bf us="64024" ue="64024" gi="21894"/><bf us="64031" ue="64033" gi="21895"/><bf us="64035" ue="64036" gi="21898"/><bf us="64039" ue="64041" gi="21900"/><bf us="65072" ue="65073" gi="905"/><bf us="65075" ue="65092" gi="907"/><bf us="65097" ue="65106" gi="925"/><bf us="65108" ue="65111" gi="935"/><bf us="65113" ue="65126" gi="939"/><bf us="65128" ue="65131" gi="953"/><bf us="65281" ue="65374" gi="701"/><bf us="65504" ue="65505" gi="795"/><bf us="65506" ue="65506" gi="967"/><bf us="65507" ue="65507" gi="797"/><bf us="65508" ue="65508" gi="968"/><bf us="65509" ue="65509" gi="798"/><bf us="65535" ue="65535" gi="0"/></bfranges><cid-widths start-index="0"><wx w="1000"/><wx w="0"/><wx w="500"/><w!
x w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><w!
x w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="
500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1!
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1
000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000!
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000
"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>!
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/>
<wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx!
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=!
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w=
"1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10!
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="10
00"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"!
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"
/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><!
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><
wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx !
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx
w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="!
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="
1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><w!
x w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100!
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="100
0"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w!
="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/!
><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/
><wx w="1000"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/!
><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="500"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/><wx w="1000"/></cid-widths></multibyte-extras></font-metrics>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/userconfig.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/fop/userconfig.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/userconfig.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,114 +0,0 @@
-<!--<!DOCTYPE configuration SYSTEM "config.dtd">-->
-<!--
- this file contains templates which allow an user easy
- configuration of Fop. Actually normally you don't need this configuration
- file, but if you need to change configuration, you should
- always use this file and *not* config.xml.
- Usage: java org.apache.fop.apps.Fop -c userconfig.xml -fo fo-file -pdf pdf-file
--->
-
-
-<configuration>
-
-<!--
-baseDir: normally the base directory is the directory where the fo file is
- located. if you want to specify your own, uncomment this entry.
- This value can also be a URL. Actually, the value is converted to
- a URL.
--->
-<!--
- <entry>
- <key>baseDir</key>
- <value></value>
- </entry>
--->
-
-<!--
-fontBaseDir: Similar to baseDir, except that this value is used for fonts. If
- it isn't specified, the value from baseDir is used.
--->
-<!--
- <entry>
- <key>fontBaseDir</key>
- <value></value>
- </entry>
--->
-
-<!--
-************************************************************************
- HYPHENATION
-************************************************************************
--->
-
-<!--
- hyphenation directory
- if you want to specify your own directory with hyphenation pattern
- then uncomment the next entry and add the directory name
--->
-
-<!--
- <entry>
- <key>hyphenation-dir</key>
- <value>/java/xml-fop/hyph</value>
- </entry>
--->
-
-<!--
-************************************************************************
- Add fonts here
-************************************************************************
--->
-
-<fonts>
- <!-- example -->
- <!--
- <font metrics-file="arial.xml" kerning="yes" embed-file="arial.ttf">
- <font-triplet name="Arial" style="normal" weight="normal"/>
- <font-triplet name="ArialMT" style="normal" weight="normal"/>
- </font>
- <font metrics-file="arialb.xml" kerning="yes" embed-file="arialb.ttf">
- <font-triplet name="Arial" style="normal" weight="bold"/>
- <font-triplet name="ArialMT" style="normal" weight="bold"/>
- </font>
- <font metrics-file="ariali.xml" kerning="yes" embed-file="ariali.ttf">
- <font-triplet name="Arial" style="italic" weight="normal"/>
- <font-triplet name="ArialMT" style="italic" weight="normal"/>
- </font>
- <font metrics-file="arialbi.xml" kerning="yes" embed-file="arialbi.ttf">
- <font-triplet name="Arial" style="italic" weight="bold"/>
- <font-triplet name="ArialMT" style="italic" weight="bold"/>
- </font>
- -->
- <!-- Example Japanese fonts
- <font metrics-file="msgothic.xml" embed-file="D:\winnt\font\msgothic.ttc" kerning="yes">
- <font-triplet name="Gothic" style="normal" weight="normal"/>
- <font-triplet name="Gothic" style="normal" weight="bold"/>
- <font-triplet name="Gothic" style="italic" weight="normal"/>
- <font-triplet name="Gothic" style="italic" weight="bold"/>
- </font>
- <font metrics-file="msmincho.xml" embed-file="Cyberbit.ttf" kerning="yes">
- <font-triplet name="Mincho" style="normal" weight="normal"/>
- <font-triplet name="Mincho" style="normal" weight="bold"/>
- <font-triplet name="Mincho" style="italic" weight="normal"/>
- <font-triplet name="Mincho" style="italic" weight="bold"/>
- </font>
- -->
- <font metrics-file="simhei.xml" embed-file="simhei.ttf" kerning="yes">
- <font-triplet name="simhei" style="normal" weight="normal"/>
- <font-triplet name="simhei" style="normal" weight="bold"/>
- <font-triplet name="simhei" style="italic" weight="normal"/>
- <font-triplet name="simhei" style="italic" weight="bold"/>
- </font>
- <font metrics-file="simsun.xml" embed-file="simsun.ttc" kerning="yes">
- <font-triplet name="simsun" style="normal" weight="normal"/>
- <font-triplet name="simsun" style="normal" weight="bold"/>
- <font-triplet name="simsun" style="italic" weight="normal"/>
- <font-triplet name="simsun" style="italic" weight="bold"/>
- </font>
-</fonts>
-
-
-</configuration>
-
-
-
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/userconfig.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/fop/userconfig.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/userconfig.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/fop/userconfig.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,114 @@
+<!--<!DOCTYPE configuration SYSTEM "config.dtd">-->
+<!--
+ this file contains templates which allow an user easy
+ configuration of Fop. Actually normally you don't need this configuration
+ file, but if you need to change configuration, you should
+ always use this file and *not* config.xml.
+ Usage: java org.apache.fop.apps.Fop -c userconfig.xml -fo fo-file -pdf pdf-file
+-->
+
+
+<configuration>
+
+<!--
+baseDir: normally the base directory is the directory where the fo file is
+ located. if you want to specify your own, uncomment this entry.
+ This value can also be a URL. Actually, the value is converted to
+ a URL.
+-->
+<!--
+ <entry>
+ <key>baseDir</key>
+ <value></value>
+ </entry>
+-->
+
+<!--
+fontBaseDir: Similar to baseDir, except that this value is used for fonts. If
+ it isn't specified, the value from baseDir is used.
+-->
+<!--
+ <entry>
+ <key>fontBaseDir</key>
+ <value></value>
+ </entry>
+-->
+
+<!--
+************************************************************************
+ HYPHENATION
+************************************************************************
+-->
+
+<!--
+ hyphenation directory
+ if you want to specify your own directory with hyphenation pattern
+ then uncomment the next entry and add the directory name
+-->
+
+<!--
+ <entry>
+ <key>hyphenation-dir</key>
+ <value>/java/xml-fop/hyph</value>
+ </entry>
+-->
+
+<!--
+************************************************************************
+ Add fonts here
+************************************************************************
+-->
+
+<fonts>
+ <!-- example -->
+ <!--
+ <font metrics-file="arial.xml" kerning="yes" embed-file="arial.ttf">
+ <font-triplet name="Arial" style="normal" weight="normal"/>
+ <font-triplet name="ArialMT" style="normal" weight="normal"/>
+ </font>
+ <font metrics-file="arialb.xml" kerning="yes" embed-file="arialb.ttf">
+ <font-triplet name="Arial" style="normal" weight="bold"/>
+ <font-triplet name="ArialMT" style="normal" weight="bold"/>
+ </font>
+ <font metrics-file="ariali.xml" kerning="yes" embed-file="ariali.ttf">
+ <font-triplet name="Arial" style="italic" weight="normal"/>
+ <font-triplet name="ArialMT" style="italic" weight="normal"/>
+ </font>
+ <font metrics-file="arialbi.xml" kerning="yes" embed-file="arialbi.ttf">
+ <font-triplet name="Arial" style="italic" weight="bold"/>
+ <font-triplet name="ArialMT" style="italic" weight="bold"/>
+ </font>
+ -->
+ <!-- Example Japanese fonts
+ <font metrics-file="msgothic.xml" embed-file="D:\winnt\font\msgothic.ttc" kerning="yes">
+ <font-triplet name="Gothic" style="normal" weight="normal"/>
+ <font-triplet name="Gothic" style="normal" weight="bold"/>
+ <font-triplet name="Gothic" style="italic" weight="normal"/>
+ <font-triplet name="Gothic" style="italic" weight="bold"/>
+ </font>
+ <font metrics-file="msmincho.xml" embed-file="Cyberbit.ttf" kerning="yes">
+ <font-triplet name="Mincho" style="normal" weight="normal"/>
+ <font-triplet name="Mincho" style="normal" weight="bold"/>
+ <font-triplet name="Mincho" style="italic" weight="normal"/>
+ <font-triplet name="Mincho" style="italic" weight="bold"/>
+ </font>
+ -->
+ <font metrics-file="simhei.xml" embed-file="simhei.ttf" kerning="yes">
+ <font-triplet name="simhei" style="normal" weight="normal"/>
+ <font-triplet name="simhei" style="normal" weight="bold"/>
+ <font-triplet name="simhei" style="italic" weight="normal"/>
+ <font-triplet name="simhei" style="italic" weight="bold"/>
+ </font>
+ <font metrics-file="simsun.xml" embed-file="simsun.ttc" kerning="yes">
+ <font-triplet name="simsun" style="normal" weight="normal"/>
+ <font-triplet name="simsun" style="normal" weight="bold"/>
+ <font-triplet name="simsun" style="italic" weight="normal"/>
+ <font-triplet name="simsun" style="italic" weight="bold"/>
+ </font>
+</fonts>
+
+
+</configuration>
+
+
+
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/images (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/images)
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/images/hibernate_logo_a.png
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/images/hibernate_logo_a.png (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/images/hibernate_logo_a.png)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/master.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/master.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,294 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
-"../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
-<!ENTITY setup SYSTEM "modules/setup.xml">
-<!ENTITY entity SYSTEM "modules/entity.xml">
-<!ENTITY xml-overriding SYSTEM "modules/xml-overriding.xml">
-<!ENTITY validator SYSTEM "modules/validator.xml">
-<!ENTITY lucene SYSTEM "modules/lucene.xml">
-]>
-<book lang="zh_cn">
- <bookinfo>
- <title>Hibernate Annotations</title>
-
- <subtitle>åèææ¡£</subtitle>
-
- <releaseinfo>3.2.0 CR1</releaseinfo>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="images/hibernate_logo_a.png" format="png" />
- </imageobject>
- </mediaobject>
- </bookinfo>
-
- <toc></toc>
-
- <preface id="preface" revision="2">
- <title>åè¨</title>
-
- <para>WARNING! This is a translated version of the English Hibernate
- reference documentation. The translated version might not be up to date!
- However, the differences should only be very minor. Consult the English
- reference documentation if you are missing information or encounter a
- translation error. If you like to contribute to a particular translation,
- contact us on the Hibernate developer mailing list.</para>
-
- <para>Translator(s): RedSaga Translate Team 满æ±çº¢ç¿»è¯å¢é
- <caoxg at yahoo.com></para>
-
- <sect1 id="preface-translate-comments-zh-cn">
- <title>ç¿»è¯è¯´æ</title>
-
- <para>æ¬ææ¡£çç¿»è¯æ¯å¨ç½ç»ä¸åä½è¿è¡çï¼ä¹ä¼ä¸ææ ¹æ®Hibernateçå级è¿è¡æ´æ°ãæä¾æ¤ææ¡£çç®çæ¯ä¸ºäºåç¼å¦ä¹ Hibernateçå¡åº¦ï¼èé代æ¿åææ¡£ãæ们建议æææè½åç读è
é½ç´æ¥é
读è±æåæãè¥æ¨å¯¹ç¿»è¯æå¼è®®ï¼æåç°ç¿»è¯é误ï¼æ¬è¯·ä¸åèµæï¼æ¥åå°å¦ä¸å°åï¼http://wiki.redsaga.com/confluence/display/HART/Home</para>
-
- <table frame="topbot" id="redsaga-translate-team">
- <title>Hibernate Annotation v3ç¿»è¯å¢é</title>
-
- <tgroup cols="6" colsep="1" rowsep="1">
- <colspec colname="c1" colwidth="1*" />
-
- <colspec colname="c2" colwidth="2*" />
-
- <colspec colname="c3" colwidth="2*" />
-
- <colspec colname="c4" colwidth="2*" />
-
- <colspec colname="c5" colwidth="2*" />
-
- <thead>
- <row>
- <entry align="center">åºå·</entry>
-
- <entry align="center">æ é¢</entry>
-
- <entry align="center">ä¸ææ é¢</entry>
-
- <entry align="center">ç¿»è¯</entry>
-
- <entry align="center">1审</entry>
-
- <entry align="center"> 2审</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>--</entry>
-
- <entry>Contents</entry>
-
- <entry>ç®å½</entry>
-
- <entry>Liu Chang</entry>
-
- <entry></entry>
-
- <entry></entry>
- </row>
-
- <row>
- <entry>#1</entry>
-
- <entry>Setting up an annotations projec</entry>
-
- <entry>å建ä¸ä¸ªæ³¨è§£é¡¹ç®</entry>
-
- <entry>melthaw</entry>
-
- <entry>Zheng Shuai</entry>
-
- <entry>superq</entry>
- </row>
-
- <row>
- <entry>#2</entry>
-
- <entry>Entity Beans-Introduction</entry>
-
- <entry>å®ä½Bean-ç®ä»</entry>
-
- <entry>melthaw</entry>
-
- <entry>Zheng Shuai</entry>
-
- <entry>superq</entry>
- </row>
-
- <row>
- <entry>#3</entry>
-
- <entry>Entity Beans-Mapping with EJB3 Annotations</entry>
-
- <entry>å®ä½Bean-ç¨EJB3注解è¿è¡æ å°</entry>
-
- <entry>melthaw</entry>
-
- <entry>Zheng Shuai</entry>
-
- <entry>superq, Liu Chang, Sean Chan</entry>
- </row>
-
- <row>
- <entry>#4</entry>
-
- <entry>Entity Beans-Mapping Queries</entry>
-
- <entry>å®ä½Bean-æ å°æ¥è¯¢</entry>
-
- <entry>melthaw</entry>
-
- <entry>Zheng Shuai</entry>
-
- <entry>superq, Liu Chang, Sean Chan</entry>
- </row>
-
- <row>
- <entry>#5</entry>
-
- <entry>Entity Beans-Hibernate Annotation Extensions</entry>
-
- <entry>å®ä½Bean-Hibernateç¬æç注解æ©å±</entry>
-
- <entry>Sean Chan</entry>
-
- <entry>morning</entry>
-
- <entry>melthaw</entry>
- </row>
-
- <row>
- <entry>#6</entry>
-
- <entry>Overriding metadata through XML</entry>
-
- <entry>éè¿XMLè¦åå
æ°æ®</entry>
-
- <entry>icess</entry>
-
- <entry>melthaw</entry>
-
- <entry>Sean Chan</entry>
- </row>
-
- <row>
- <entry>#7</entry>
-
- <entry>Hibernate Validator</entry>
-
- <entry>Hibernateéªè¯å¨</entry>
-
- <entry>DigitalSonic</entry>
-
- <entry>morning</entry>
-
- <entry>melthaw</entry>
- </row>
-
- <row>
- <entry>#8</entry>
-
- <entry>Hibernate Lucene Integration</entry>
-
- <entry>Hibernateä¸Luceneéæ</entry>
-
- <entry>mochow</entry>
-
- <entry>morning</entry>
-
- <entry>melthaw</entry>
- </row>
-
- <row>
- <entry>#9</entry>
-
- <entry>Appendix:Glossary</entry>
-
- <entry>éå½:æ¯è¯è¡¨</entry>
-
- <entry>mochow</entry>
-
- <entry>Liu Chang</entry>
-
- <entry>æ¹æé¢</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>å
³äºæ们</para>
-
- <variablelist spacing="compact">
- <varlistentry>
- <term>满æ±çº¢.å¼æº, http://www.redsaga.com</term>
-
- <listitem>
- <para>ä»æç«ä¹åå°±è´åäºJavaå¼æ¾æºä»£ç å¨ä¸å½çä¼ æä¸åå±,ä¸å½å
å¤ä¸ªJavaå¢ä½ååºç社ææ·±å
¥äº¤æµãåæå°è¯´å¤åçååï¼ç®åæ两个å¢éï¼âOpenDocå¢éâä¸âç¿»è¯å¢éâï¼æ¬ç¿»è¯ææ¡£å³ä¸ºç¿»è¯å¢éä½åãOpenDocå¢éå·²ç»æ¨åºå
æ¬HibernateãiBatisãSpringãWebWorkçå¤ä»½å¼æ¾ææ¡£ï¼å¹¶äº2005å¹´5æå¨Hibernateå¼æ¾ææ¡£åºç¡ä¸æ©å
æ书ï¼åºçäºåå书ç±ï¼ãæ·±å
¥æµ
åºHibernateãï¼æ¬ä¹¦400ä½é¡µï¼éåå个å±æ¬¡çHibernateç¨æ·ã(http://www.redsaga.com/hibernate_book.html)æ¬è¯·æ¯æã</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>è´è°¢</term>
-
- <listitem>
- <para>å¨æ们翻è¯Hibernate
- Annotationåèææ¡£çåæ¶ï¼è¿æä¸ä½çå¿çæåä¹å¨è¿è¡çåæ ·çå·¥ä½ï¼è¿ä½æåå°±æ¯icess(å°é¨)ï¼ç±icessç¿»è¯çä¸æççå°åï¼
- http://icess.my.china.com/hibernate/a/ref/index.htm</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </sect1>
-
- <sect1 id="preface-translate-licence-zh-cn">
- <title>çæ声æ</title>
-
- <para>Hibernateè±æææ¡£å±äºHibernateåè¡å
çä¸é¨åï¼éµå¾ªLGPLåè®®ãæ¬ç¿»è¯çæ¬åæ ·éµå¾ªLGPLåè®®ãåä¸ç¿»è¯çè¯è
ä¸è´åææ¾å¼é¤ç½²åæå¤å¯¹æ¬ç¿»è¯çæ¬çå
¶å®æå©è¦æ±ã</para>
-
- <para>æ¨å¯ä»¥èªç±é¾æ¥ãä¸è½½ãä¼ ææ¤ææ¡£ï¼æè
æ¾ç½®å¨æ¨çç½ç«ä¸ï¼çè³ä½ä¸ºäº§åçä¸é¨ååè¡ãä½åææ¯å¿
é¡»ä¿è¯å
¨æå®æ´è½¬è½½ï¼å
æ¬å®æ´ççæä¿¡æ¯åä½è¯è
声æï¼å¹¶ä¸è½è¿åLGPLåè®®ãè¿éâå®æ´âçå«ä¹æ¯ï¼ä¸è½è¿è¡ä»»ä½å é¤/å¢æ·»/注解ãè¥æå é¤/å¢æ·»/注解ï¼å¿
é¡»é段æ确声æé£äºé¨å并éæ¬ææ¡£çä¸é¨åã</para>
- </sect1>
- </preface>
-
- <preface>
- <title>åè¨</title>
-
- <para>æ£å¦å
¶ä»çORMå·¥å
·,Hibernateåæ ·éè¦å
æ°æ®æ¥æ§å¶å¨ä¸åæ°æ®è¡¨è¾¾å½¢å¼ä¹é´ç转å. å¨Hibernate
- 2.xé,å¤æ°æ
åµä¸è¡¨ç¤ºæ å°å
³ç³»çå
æ°æ®ä¿åå¨XMLææ¬æ件ä¸.
- è¿æä¸ç§æ¹å¼å°±æ¯Xdoclet,å®å¯ä»¥å¨ç¼è¯æ¶å©ç¨Javadocä¸çæºç 注éä¿¡æ¯æ¥è¿è¡é¢å¤ç.
- ç°å¨æ°çJDKæ åï¼JDK1.5以ä¸ï¼ä¹æ¯æ类似ç注解åè½,ä½ç¸æ¯ä¹ä¸å¾å¤å·¥å
·å¯¹æ¤æä¾äºæ´å¼ºå¤§æ´å¥½ç¨çæ¯æ. 以IntelliJ
- IDEAåEclipse为ä¾,è¿äºIDEå·¥å
·ä¸ºJDK 5.0注解åè½æä¾äºèªå¨å®æåè¯æ³é«äº®åè½. 注解被ç´æ¥ç¼è¯å°åèç é,并
- å¨è¿è¡æ¶ï¼å¯¹äºHibernateæ¥è®²å°±æ¯å¯å¨çæ¶åï¼éè¿åå°è¯»åè¿äºæ³¨è§£, å æ¤å¤é¨XMLæ件就ä¸åéè¦äº.</para>
-
- <para>EJB3è§èæç»è®¤å¯äºéæåORMçæåèä¾ä»¥åå¸åºå¯¹äºè¿ç§ææ¯çå
´è¶£.
- EJB3è§èæ ååäºORMçåºç¡APIèä¸å¨ä»»ä½ORMæä¹
åæºå¶ä¸ä½¿ç¨å
æ°æ®. <emphasis>Hibernate
- EntityManager</emphasis>å®ç°äºEJB3æä¹
åè§èä¸å®ä¹çç¼ç¨æ¥å£åçå½å¨æè§å. å¨<emphasis>Hibernate
- Core</emphasis>çåºç¡ä¸åç»å <emphasis>Hibernate
- Annotations</emphasis>å°±å®ç°äºä¸å¥å®æ´(并ä¸ç¬ç«)çEJB3æä¹
å解å³æ¹æ¡.
- ä½ å¯ä»¥ç»åä¸è
æ¥ä½¿ç¨,ä¹å¯ä»¥æå¼EJB3ç¼ç¨æ¥å£åçå½å¨æè§åèç¬ç«ä½¿ç¨æ³¨è§£, çè³åªåç¬ä½¿ç¨<emphasis>Hibernate
- Core</emphasis>. è¿äºé½åå³äºé¡¹ç®çåä¸åææ¯ä¸çå®é
éæ±. Hibernateå
è®¸ä½ ç´æ¥ä½¿ç¨native APIs,å¦ææéè¦,
- çè³å¯ä»¥ç´æ¥æä½JDBCåSQL.</para>
-
- <para>注ææ¬ææ¡£åºäºHibernate Annotationsçé¢è§ç(éµä»EJB 3.0/JSR-220æç»èæ¡).
- è¿ä¸ªçæ¬åæ°è§èä¸å®ä¹çæç»æ¦å¿µå·²ç»é常æ¥è¿äº.æ们çç®æ æ¯æä¾ä¸å¥å®æ´çORM注解,
- å
æ¬EJB3çæ å注解以åHibernate3çæ©å±ï¼åè
æ¯EJB3è§èä¸æ²¡ææ¶åå°çï¼. æç»éè¿æ³¨è§£ä½ å¯ä»¥å®æä»»ä½å¯è½çæ å°.详æ
åè<xref
- linkend="compliance" />.</para>
-
- <para>EJB3æç»èæ¡ä¿®æ¹äºé¨å注解,
- http://www.hibernate.org/371.htmlæä¾äºä»ä¸ä¸ä¸ªçæ¬å°ææ°çæ¬çè¿ç§»æå.</para>
- </preface>
-
- &setup;
-
- &entity;
-
- &xml-overriding;
-
- &validator;
-
- &lucene;
-
- <appendix>
- <title id="glossary">æ¯è¯è¡¨</title>
-
- <para>Redsagaçwikiä¸ç»´æ¤äºæ¬æç¿»è¯è¿ç¨ä¸æåç
§çä¸è±æ对ç
§çæ¯è¯è¡¨,å°å:http://wiki.redsaga.com/confluence/display/HART/glossary.</para>
- </appendix>
-</book>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/master.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/master.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/master.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,294 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
+"../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
+<!ENTITY setup SYSTEM "modules/setup.xml">
+<!ENTITY entity SYSTEM "modules/entity.xml">
+<!ENTITY xml-overriding SYSTEM "modules/xml-overriding.xml">
+<!ENTITY validator SYSTEM "modules/validator.xml">
+<!ENTITY lucene SYSTEM "modules/lucene.xml">
+]>
+<book lang="zh_cn">
+ <bookinfo>
+ <title>Hibernate Annotations</title>
+
+ <subtitle>åèææ¡£</subtitle>
+
+ <releaseinfo>3.2.0 CR1</releaseinfo>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/hibernate_logo_a.png" format="png" />
+ </imageobject>
+ </mediaobject>
+ </bookinfo>
+
+ <toc></toc>
+
+ <preface id="preface" revision="2">
+ <title>åè¨</title>
+
+ <para>WARNING! This is a translated version of the English Hibernate
+ reference documentation. The translated version might not be up to date!
+ However, the differences should only be very minor. Consult the English
+ reference documentation if you are missing information or encounter a
+ translation error. If you like to contribute to a particular translation,
+ contact us on the Hibernate developer mailing list.</para>
+
+ <para>Translator(s): RedSaga Translate Team 满æ±çº¢ç¿»è¯å¢é
+ <caoxg at yahoo.com></para>
+
+ <sect1 id="preface-translate-comments-zh-cn">
+ <title>ç¿»è¯è¯´æ</title>
+
+ <para>æ¬ææ¡£çç¿»è¯æ¯å¨ç½ç»ä¸åä½è¿è¡çï¼ä¹ä¼ä¸ææ ¹æ®Hibernateçå级è¿è¡æ´æ°ãæä¾æ¤ææ¡£çç®çæ¯ä¸ºäºåç¼å¦ä¹ Hibernateçå¡åº¦ï¼èé代æ¿åææ¡£ãæ们建议æææè½åç读è
é½ç´æ¥é
读è±æåæãè¥æ¨å¯¹ç¿»è¯æå¼è®®ï¼æåç°ç¿»è¯é误ï¼æ¬è¯·ä¸åèµæï¼æ¥åå°å¦ä¸å°åï¼http://wiki.redsaga.com/confluence/display/HART/Home</para>
+
+ <table frame="topbot" id="redsaga-translate-team">
+ <title>Hibernate Annotation v3ç¿»è¯å¢é</title>
+
+ <tgroup cols="6" colsep="1" rowsep="1">
+ <colspec colname="c1" colwidth="1*" />
+
+ <colspec colname="c2" colwidth="2*" />
+
+ <colspec colname="c3" colwidth="2*" />
+
+ <colspec colname="c4" colwidth="2*" />
+
+ <colspec colname="c5" colwidth="2*" />
+
+ <thead>
+ <row>
+ <entry align="center">åºå·</entry>
+
+ <entry align="center">æ é¢</entry>
+
+ <entry align="center">ä¸ææ é¢</entry>
+
+ <entry align="center">ç¿»è¯</entry>
+
+ <entry align="center">1审</entry>
+
+ <entry align="center"> 2审</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>--</entry>
+
+ <entry>Contents</entry>
+
+ <entry>ç®å½</entry>
+
+ <entry>Liu Chang</entry>
+
+ <entry></entry>
+
+ <entry></entry>
+ </row>
+
+ <row>
+ <entry>#1</entry>
+
+ <entry>Setting up an annotations projec</entry>
+
+ <entry>å建ä¸ä¸ªæ³¨è§£é¡¹ç®</entry>
+
+ <entry>melthaw</entry>
+
+ <entry>Zheng Shuai</entry>
+
+ <entry>superq</entry>
+ </row>
+
+ <row>
+ <entry>#2</entry>
+
+ <entry>Entity Beans-Introduction</entry>
+
+ <entry>å®ä½Bean-ç®ä»</entry>
+
+ <entry>melthaw</entry>
+
+ <entry>Zheng Shuai</entry>
+
+ <entry>superq</entry>
+ </row>
+
+ <row>
+ <entry>#3</entry>
+
+ <entry>Entity Beans-Mapping with EJB3 Annotations</entry>
+
+ <entry>å®ä½Bean-ç¨EJB3注解è¿è¡æ å°</entry>
+
+ <entry>melthaw</entry>
+
+ <entry>Zheng Shuai</entry>
+
+ <entry>superq, Liu Chang, Sean Chan</entry>
+ </row>
+
+ <row>
+ <entry>#4</entry>
+
+ <entry>Entity Beans-Mapping Queries</entry>
+
+ <entry>å®ä½Bean-æ å°æ¥è¯¢</entry>
+
+ <entry>melthaw</entry>
+
+ <entry>Zheng Shuai</entry>
+
+ <entry>superq, Liu Chang, Sean Chan</entry>
+ </row>
+
+ <row>
+ <entry>#5</entry>
+
+ <entry>Entity Beans-Hibernate Annotation Extensions</entry>
+
+ <entry>å®ä½Bean-Hibernateç¬æç注解æ©å±</entry>
+
+ <entry>Sean Chan</entry>
+
+ <entry>morning</entry>
+
+ <entry>melthaw</entry>
+ </row>
+
+ <row>
+ <entry>#6</entry>
+
+ <entry>Overriding metadata through XML</entry>
+
+ <entry>éè¿XMLè¦åå
æ°æ®</entry>
+
+ <entry>icess</entry>
+
+ <entry>melthaw</entry>
+
+ <entry>Sean Chan</entry>
+ </row>
+
+ <row>
+ <entry>#7</entry>
+
+ <entry>Hibernate Validator</entry>
+
+ <entry>Hibernateéªè¯å¨</entry>
+
+ <entry>DigitalSonic</entry>
+
+ <entry>morning</entry>
+
+ <entry>melthaw</entry>
+ </row>
+
+ <row>
+ <entry>#8</entry>
+
+ <entry>Hibernate Lucene Integration</entry>
+
+ <entry>Hibernateä¸Luceneéæ</entry>
+
+ <entry>mochow</entry>
+
+ <entry>morning</entry>
+
+ <entry>melthaw</entry>
+ </row>
+
+ <row>
+ <entry>#9</entry>
+
+ <entry>Appendix:Glossary</entry>
+
+ <entry>éå½:æ¯è¯è¡¨</entry>
+
+ <entry>mochow</entry>
+
+ <entry>Liu Chang</entry>
+
+ <entry>æ¹æé¢</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>å
³äºæ们</para>
+
+ <variablelist spacing="compact">
+ <varlistentry>
+ <term>满æ±çº¢.å¼æº, http://www.redsaga.com</term>
+
+ <listitem>
+ <para>ä»æç«ä¹åå°±è´åäºJavaå¼æ¾æºä»£ç å¨ä¸å½çä¼ æä¸åå±,ä¸å½å
å¤ä¸ªJavaå¢ä½ååºç社ææ·±å
¥äº¤æµãåæå°è¯´å¤åçååï¼ç®åæ两个å¢éï¼âOpenDocå¢éâä¸âç¿»è¯å¢éâï¼æ¬ç¿»è¯ææ¡£å³ä¸ºç¿»è¯å¢éä½åãOpenDocå¢éå·²ç»æ¨åºå
æ¬HibernateãiBatisãSpringãWebWorkçå¤ä»½å¼æ¾ææ¡£ï¼å¹¶äº2005å¹´5æå¨Hibernateå¼æ¾ææ¡£åºç¡ä¸æ©å
æ书ï¼åºçäºåå书ç±ï¼ãæ·±å
¥æµ
åºHibernateãï¼æ¬ä¹¦400ä½é¡µï¼éåå个å±æ¬¡çHibernateç¨æ·ã(http://www.redsaga.com/hibernate_book.html)æ¬è¯·æ¯æã</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>è´è°¢</term>
+
+ <listitem>
+ <para>å¨æ们翻è¯Hibernate
+ Annotationåèææ¡£çåæ¶ï¼è¿æä¸ä½çå¿çæåä¹å¨è¿è¡çåæ ·çå·¥ä½ï¼è¿ä½æåå°±æ¯icess(å°é¨)ï¼ç±icessç¿»è¯çä¸æççå°åï¼
+ http://icess.my.china.com/hibernate/a/ref/index.htm</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </sect1>
+
+ <sect1 id="preface-translate-licence-zh-cn">
+ <title>çæ声æ</title>
+
+ <para>Hibernateè±æææ¡£å±äºHibernateåè¡å
çä¸é¨åï¼éµå¾ªLGPLåè®®ãæ¬ç¿»è¯çæ¬åæ ·éµå¾ªLGPLåè®®ãåä¸ç¿»è¯çè¯è
ä¸è´åææ¾å¼é¤ç½²åæå¤å¯¹æ¬ç¿»è¯çæ¬çå
¶å®æå©è¦æ±ã</para>
+
+ <para>æ¨å¯ä»¥èªç±é¾æ¥ãä¸è½½ãä¼ ææ¤ææ¡£ï¼æè
æ¾ç½®å¨æ¨çç½ç«ä¸ï¼çè³ä½ä¸ºäº§åçä¸é¨ååè¡ãä½åææ¯å¿
é¡»ä¿è¯å
¨æå®æ´è½¬è½½ï¼å
æ¬å®æ´ççæä¿¡æ¯åä½è¯è
声æï¼å¹¶ä¸è½è¿åLGPLåè®®ãè¿éâå®æ´âçå«ä¹æ¯ï¼ä¸è½è¿è¡ä»»ä½å é¤/å¢æ·»/注解ãè¥æå é¤/å¢æ·»/注解ï¼å¿
é¡»é段æ确声æé£äºé¨å并éæ¬ææ¡£çä¸é¨åã</para>
+ </sect1>
+ </preface>
+
+ <preface>
+ <title>åè¨</title>
+
+ <para>æ£å¦å
¶ä»çORMå·¥å
·,Hibernateåæ ·éè¦å
æ°æ®æ¥æ§å¶å¨ä¸åæ°æ®è¡¨è¾¾å½¢å¼ä¹é´ç转å. å¨Hibernate
+ 2.xé,å¤æ°æ
åµä¸è¡¨ç¤ºæ å°å
³ç³»çå
æ°æ®ä¿åå¨XMLææ¬æ件ä¸.
+ è¿æä¸ç§æ¹å¼å°±æ¯Xdoclet,å®å¯ä»¥å¨ç¼è¯æ¶å©ç¨Javadocä¸çæºç 注éä¿¡æ¯æ¥è¿è¡é¢å¤ç.
+ ç°å¨æ°çJDKæ åï¼JDK1.5以ä¸ï¼ä¹æ¯æ类似ç注解åè½,ä½ç¸æ¯ä¹ä¸å¾å¤å·¥å
·å¯¹æ¤æä¾äºæ´å¼ºå¤§æ´å¥½ç¨çæ¯æ. 以IntelliJ
+ IDEAåEclipse为ä¾,è¿äºIDEå·¥å
·ä¸ºJDK 5.0注解åè½æä¾äºèªå¨å®æåè¯æ³é«äº®åè½. 注解被ç´æ¥ç¼è¯å°åèç é,并
+ å¨è¿è¡æ¶ï¼å¯¹äºHibernateæ¥è®²å°±æ¯å¯å¨çæ¶åï¼éè¿åå°è¯»åè¿äºæ³¨è§£, å æ¤å¤é¨XMLæ件就ä¸åéè¦äº.</para>
+
+ <para>EJB3è§èæç»è®¤å¯äºéæåORMçæåèä¾ä»¥åå¸åºå¯¹äºè¿ç§ææ¯çå
´è¶£.
+ EJB3è§èæ ååäºORMçåºç¡APIèä¸å¨ä»»ä½ORMæä¹
åæºå¶ä¸ä½¿ç¨å
æ°æ®. <emphasis>Hibernate
+ EntityManager</emphasis>å®ç°äºEJB3æä¹
åè§èä¸å®ä¹çç¼ç¨æ¥å£åçå½å¨æè§å. å¨<emphasis>Hibernate
+ Core</emphasis>çåºç¡ä¸åç»å <emphasis>Hibernate
+ Annotations</emphasis>å°±å®ç°äºä¸å¥å®æ´(并ä¸ç¬ç«)çEJB3æä¹
å解å³æ¹æ¡.
+ ä½ å¯ä»¥ç»åä¸è
æ¥ä½¿ç¨,ä¹å¯ä»¥æå¼EJB3ç¼ç¨æ¥å£åçå½å¨æè§åèç¬ç«ä½¿ç¨æ³¨è§£, çè³åªåç¬ä½¿ç¨<emphasis>Hibernate
+ Core</emphasis>. è¿äºé½åå³äºé¡¹ç®çåä¸åææ¯ä¸çå®é
éæ±. Hibernateå
è®¸ä½ ç´æ¥ä½¿ç¨native APIs,å¦ææéè¦,
+ çè³å¯ä»¥ç´æ¥æä½JDBCåSQL.</para>
+
+ <para>注ææ¬ææ¡£åºäºHibernate Annotationsçé¢è§ç(éµä»EJB 3.0/JSR-220æç»èæ¡).
+ è¿ä¸ªçæ¬åæ°è§èä¸å®ä¹çæç»æ¦å¿µå·²ç»é常æ¥è¿äº.æ们çç®æ æ¯æä¾ä¸å¥å®æ´çORM注解,
+ å
æ¬EJB3çæ å注解以åHibernate3çæ©å±ï¼åè
æ¯EJB3è§èä¸æ²¡ææ¶åå°çï¼. æç»éè¿æ³¨è§£ä½ å¯ä»¥å®æä»»ä½å¯è½çæ å°.详æ
åè<xref
+ linkend="compliance" />.</para>
+
+ <para>EJB3æç»èæ¡ä¿®æ¹äºé¨å注解,
+ http://www.hibernate.org/371.htmlæä¾äºä»ä¸ä¸ä¸ªçæ¬å°ææ°çæ¬çè¿ç§»æå.</para>
+ </preface>
+
+ &setup;
+
+ &entity;
+
+ &xml-overriding;
+
+ &validator;
+
+ &lucene;
+
+ <appendix>
+ <title id="glossary">æ¯è¯è¡¨</title>
+
+ <para>Redsagaçwikiä¸ç»´æ¤äºæ¬æç¿»è¯è¿ç¨ä¸æåç
§çä¸è±æ对ç
§çæ¯è¯è¡¨,å°å:http://wiki.redsaga.com/confluence/display/HART/glossary.</para>
+ </appendix>
+</book>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules)
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/entity.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules/entity.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/entity.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,2857 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="entity">
- <title>å®ä½Bean</title>
-
- <sect1 id="entity-overview" revision="1">
- <title>ç®ä»</title>
-
- <para>æ¬ç« å
容è¦çäºEJB3.0å®ä½beanç注解è§è以åHibernateç¹æçæ©å±.</para>
- </sect1>
-
- <sect1 id="mapping" revision="1">
- <title>ç¨EJB3注解è¿è¡æ å°</title>
-
- <para>ç°å¨EJB3å®ä½Beanæ¯çº¯ç²¹çPOJO.å®é
ä¸è¿è¡¨è¾¾äºåHibernateæä¹
åå®ä½å¯¹è±¡åæ ·çæ¦å¿µ.
- å®ä»¬çæ å°é½éè¿JDK5.0注解æ¥å®ä¹(EJB3è§èä¸çXMLæè¿°è¯æ³è³ä»è¿æ²¡ææç»å®ä¸æ¥).
- 注解å为两个é¨å,åå«æ¯é»è¾æ å°æ³¨è§£åç©çæ å°æ³¨è§£,
- éè¿é»è¾æ å°æ³¨è§£å¯ä»¥æ述对象模å,ç±»ä¹é´çå
³ç³»çç,
- èç©çæ å°æ³¨è§£åæè¿°äºç©ççschema,表,å,ç´¢å¼çç.
- ä¸é¢æ们å¨ä»£ç ä¸å°æ··å使ç¨è¿ä¸¤ç§ç±»åç注解.</para>
-
- <para>EJB3注解çAPIå®ä¹å¨<literal>javax.persistence.*</literal>å
éé¢.
- 大é¨ååJDK5å
¼å®¹çIDE(象Eclipse, IntelliJ IDEA åNetbeansçç)é½æä¾äºæ³¨è§£æ¥å£åå±æ§çèªå¨å®æåè½.
- (è¿äºä¸éè¦IDEæä¾ç¹å«çEJB3æ¯æ模å,å 为EJB3注解æ¯æ åçJDK5注解)</para>
-
- <para>请é
读JBoss EJB 3.0æåæè
ç´æ¥é
读Hibernate Annotationsæµè¯ä»£ç 以è·åæ´å¤çå¯è¿è¡å®ä¾.Hibernate Annotationsæä¾ç大é¨ååå
æµè¯ä»£ç é½æ¼ç¤ºäºå®é
çä¾å,æ¯ä¸ä¸ªè·åçµæç好å°æ¹.</para>
-
- <sect2>
- <title>声æå®ä½bean</title>
-
- <para>æ¯ä¸ä¸ªæä¹
åPOJOç±»é½æ¯ä¸ä¸ªå®ä½bean,è¿å¯ä»¥éè¿å¨ç±»çå®ä¹ä¸ä½¿ç¨<literal>@Entity</literal>注解æ¥è¿è¡å£°æ:</para>
-
- <programlisting>
- at Entity
-public class Flight implements Serializable {
- Long id;
-
- @Id
- public Long getId() { return id; }
-
- public void setId(Long id) { this.id = id; }
-}
- </programlisting>
-
- <para>éè¿<literal>@Entity</literal>注解å°ä¸ä¸ªç±»å£°æ为ä¸ä¸ªå®ä½bean(å³ä¸ä¸ªæä¹
åPOJOç±»),
- <literal>@Id</literal>注解å声æäºè¯¥å®ä½beançæ è¯å±æ§.
- å
¶ä»çæ å°å®ä¹æ¯éå¼ç.è¿ç§ä»¥éå¼æ å°ä¸ºä¸»ä½,以æ¾å¼æ å°ä¸ºä¾å¤çé
ç½®æ¹å¼å¨æ°çEJ3è§èä¸å¤äºé常éè¦çä½ç½®,
- å以åççæ¬ç¸æ¯æäºè´¨çé£è·.
- å¨ä¸é¢è¿æ®µä»£ç ä¸ï¼Flightç±»æ å°å°Flight表,并使ç¨idåä½ä¸ºä¸»é®å.
- </para>
-
- <para>å¨å¯¹ä¸ä¸ªç±»è¿è¡æ³¨è§£æ¶,ä½ å¯ä»¥éæ©å¯¹å®ççå±æ§æè
æ¹æ³è¿è¡æ³¨è§£,æ ¹æ®ä½ çéæ©,Hibernateç访é®ç±»ååå«ä¸º
- <literal>field</literal>æ<literal>property</literal>.
- EJ3è§èè¦æ±å¨éè¦è®¿é®çå
ç´ ä¸è¿è¡æ³¨è§£å£°æ,ä¾å¦,å¦æ访é®ç±»å为
- <literal>property</literal>å°±è¦å¨getteræ¹æ³ä¸è¿è¡æ³¨è§£å£°æ,
- å¦æ访é®ç±»å为 <literal>field</literal>å°±è¦å¨å段ä¸è¿è¡æ³¨è§£å£°æ.åºè¯¥å°½éé¿å
æ··å使ç¨è¿ä¸¤ç§è®¿é®ç±»å.
- Hibernateæ ¹æ®<literal>@Id</literal> æ <literal>@EmbeddedId</literal>çä½ç½®æ¥å¤æ访é®ç±»å.</para>
-
- <sect3>
- <title>å®ä¹è¡¨(Table)</title>
-
- <para><literal>@Table</literal>æ¯ç±»ä¸çº§ç注解,
- éè¿<literal>@Table</literal>注解å¯ä»¥ä¸ºå®ä½beanæ å°æå®è¡¨(table),ç®å½(catalog)åschemaçåå.
- å¦æ没æå®ä¹<literal>@Table</literal>,é£ä¹ç³»ç»èªå¨ä½¿ç¨é»è®¤å¼ï¼å®ä½ççç±»å(ä¸é带å
å).</para>
-
- <programlisting>
- at Entity
- at Table(name="tbl_sky")
-public class Sky implements Serializable {
-...
- </programlisting>
-
- <para><literal>@Table</literal>å
ç´ å
æ¬äºä¸ä¸ª<literal>schema</literal>
- åä¸ä¸ª <literal>catalog</literal>å±æ§,å¦æéè¦å¯ä»¥æå®ç¸åºçå¼.
- ç»å使ç¨<literal>@UniqueConstraint</literal>注解å¯ä»¥å®ä¹è¡¨çå¯ä¸çº¦æ(unique constraint)
- (对äºç»å®å°ååçå¯ä¸çº¦æ,请åè<literal>@Column</literal>注解)
- </para>
-
- <programlisting>@Table(name="tbl_sky",
- <emphasis role="bold">uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})}</emphasis>
- )</programlisting>
-
- <para>ä¸é¢è¿ä¸ªä¾åä¸,å¨monthådayè¿ä¸¤ä¸ªå段ä¸å®ä¹å¯ä¸çº¦æ.
- 注æ<literal>columnNames</literal>æ°ç»ä¸çå¼æçæ¯é»è¾åå.</para>
-
- <remark>Hibernateå¨NamingStrategyçå®ç°ä¸å®ä¹äºé»è¾åå.
- é»è®¤çEJB3å½åçç¥å°ç©çå段åå½ä½é»è¾å段åæ¥ä½¿ç¨.
- 注æ该å段ååå®å¯¹åºçå±æ§åå¯è½ä¸å(å¦æå段åæ¯æ¾å¼æå®çè¯).
- é¤éä½ éåäºNamingStrategy,å¦åä¸ç¨æ
å¿è¿äºåºå«..</remark>
- </sect3>
-
- <sect3>
- <title>ä¹è§éå®çæ¬æ§å¶</title>
-
- <para>ä½ å¯ä»¥å¨å®ä½beanä¸ä½¿ç¨<literal>@Version</literal>注解,éè¿è¿ç§æ¹å¼å¯æ·»å 对ä¹è§éå®çæ¯æ:</para>
-
- <programlisting>
- at Entity
-public class Flight implements Serializable {
-...
- @Version
- @Column(name="OPTLOCK")
- public Integer getVersion() { ... }
-} </programlisting>
-
- <para>ä¸é¢è¿ä¸ªä¾åä¸,versionå±æ§å°æ å°å° <literal>OPTLOCK</literal>å,
- entity manager使ç¨è¯¥å段æ¥æ£æµæ´æ°å²çª(é²æ¢æ´æ°ä¸¢å¤±,请åèlast-commit-winsçç¥).</para>
-
- <para>æ ¹æ®EJB3è§è,versionåå¯ä»¥æ¯numericç±»å(æ¨èæ¹å¼)ä¹å¯ä»¥æ¯timestampç±»å.
- Hibernateæ¯æä»»ä½èªå®ä¹ç±»å,åªè¦è¯¥ç±»åå®ç°äº<classname>UserVersionType</classname>.</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>æ å°ç®åå±æ§</title>
-
- <sect3>
- <title>声æåºæ¬çå±æ§æ å°</title>
-
- <para>Every non static non transient property (field or method) of an
- entity bean is considered persistent, unless you annotate it as
- <literal>@Transient</literal>. Not having an annotation for your
- property is equivalent to the appropriate <literal>@Basic</literal>
- annotation. The <literal>@Basic</literal> annotation allows you to
- declare the fetching strategy for a property:</para>
-
- <para>å®ä½beanä¸ææçéstaticétransientçå±æ§é½å¯ä»¥è¢«æä¹
å,
- é¤éä½ å°å
¶æ³¨è§£ä¸º<literal>@Transient</literal>.ææ没æå®ä¹æ³¨è§£çå±æ§çä»·äºå¨å
¶ä¸é¢æ·»å äº@Basic注解.
- éè¿ <literal>@Basic</literal>注解å¯ä»¥å£°æå±æ§çè·åçç¥(fetch strategy)ï¼</para>
-
- <programlisting>public transient int counter; //transient property
-
-private String firstname; //persistent property
-
- at Transient
-String getLengthInMeter() { ... } //transient property
-
-String getName() {... } // persistent property
-
- at Basic
-int getLength() { ... } // persistent property
-
- at Basic(fetch = FetchType.LAZY)
-String getDetailedComment() { ... } // persistent property
-
- at Temporal(TemporalType.TIME)
-java.util.Date getDepartureTime() { ... } // persistent property
-
- at Enumerated(STRING)
-Starred getNote() { ... } //enum persisted as String in database</programlisting>
-
- <para>ä¸é¢è¿ä¸ªä¾åä¸,<literal>counter</literal>æ¯ä¸ä¸ªtransientçå段,
- <literal>lengthInMeter</literal>çgetteræ¹æ³è¢«æ³¨è§£ä¸º<literal>@Transient</literal>,
- entity managerå°å¿½ç¥è¿äºå段åå±æ§.
- è<literal>name</literal>,<literal>length</literal>,<literal>firstname</literal>
- è¿å 个å±æ§åæ¯è¢«å®ä¹ä¸ºå¯æä¹
ååå¯è·åç.对äºç®åå±æ§æ¥è¯´,é»è®¤çè·åæ¹å¼æ¯å³æ¶è·å(early fetch).
- å½ä¸ä¸ªå®ä½Beançå®ä¾è¢«å建æ¶,Hibernateä¼å°è¿äºå±æ§çå¼ä»æ°æ®åºä¸æååºæ¥,ä¿åå°Beançå±æ§é.
- ä¸å³æ¶è·åç¸å¯¹åºçæ¯å»¶è¿è·å(lazy fetch).å¦æä¸ä¸ªå±æ§çè·åæ¹å¼æ¯å»¶è¿è·å
- (æ¯å¦ä¸é¢ä¾åä¸ç<literal>detailedComment</literal>å±æ§),
- Hibernateå¨å建ä¸ä¸ªå®ä½Beançå®ä¾æ¶,ä¸ä¼å³æ¶å°è¿ä¸ªå±æ§çå¼ä»æ°æ®åºä¸è¯»åº.
- åªæå¨è¯¥å®ä½Beançè¿ä¸ªå±æ§ç¬¬ä¸æ¬¡è¢«è°ç¨æ¶,Hibernateæä¼å»è·å对åºçå¼.
- éå¸¸ä½ ä¸éè¦å¯¹ç®åå±æ§è®¾ç½®å»¶è¿è·å(lazy simple property),åä¸ä¸è¦å延è¿å
³èè·å(lazy association fetch)æ··æ·äº
- (è¯æ³¨:è¿éæä¸è¦ælazy simple propertyålazy association fetchæ··æ·äº).
- </para>
-
- <note>
- <para>为äºå¯ç¨å±æ§çº§ç延è¿è·å,ä½ çç±»å¿
é¡»ç»è¿ç¹æ®å¤ç(instrumented)ï¼
- åèç å°è¢«ç»å
¥åå§ç±»ä¸æ¥å®ç°å»¶è¿è·ååè½,
- 详æ
åèHibernateåèææ¡£.å¦æä¸å¯¹ç±»æ件è¿è¡åèç ç¹æ®å¤ç,
- é£ä¹å±æ§çº§ç延è¿è·åå°è¢«å¿½ç¥.</para>
- </note>
-
- <para>æ¨èçæ¿ä»£æ¹æ¡æ¯ä½¿ç¨EJB-QLæè
Criteriaæ¥è¯¢çæå½±(projection)åè½.</para>
-
- <para>HibernateåEJB3é½æ¯æææåºæ¬ç±»åçå±æ§æ å°.
- è¿äºåºæ¬ç±»åå
æ¬ææçJavaåºæ¬ç±»å,åå
¶åèªçwrapperç±»åserializableç±».
- Hibernate Annotationsè¿æ¯æå°å
ç½®çæ举类åæ å°å°ä¸ä¸ªé¡ºåºå(ä¿åäºç¸åºçåºåå¼)
- æä¸ä¸ªå符串类åçå(ä¿åç¸åºçå符串).é»è®¤æ¯ä¿åæ举çåºåå¼,
- ä½æ¯ä½ å¯ä»¥éè¿<literal>@Enumerated</literal>注解æ¥è¿è¡è°æ´(è§ä¸é¢ä¾åä¸çnoteå±æ§).</para>
-
- <para>å¨æ ¸å¿çJava APIä¸å¹¶æ²¡æå®ä¹æ¶é´ç²¾åº¦(temporal precision).
- å æ¤å¤çæ¶é´ç±»åæ°æ®æ¶,ä½ è¿éè¦å®ä¹å°å
¶åå¨å¨æ°æ®åºä¸æé¢æç精度.
- å¨æ°æ®åºä¸,表示æ¶é´ç±»åçæ°æ®æ<literal>DATE</literal>, <literal>TIME</literal>,
- å <literal>TIMESTAMP</literal>ä¸ç§ç²¾åº¦(å³å纯çæ¥æ,æ¶é´,æè
两è
å
¼å¤).
- å¯ä½¿ç¨<literal>@Temporal</literal>注解æ¥è°æ´ç²¾åº¦.</para>
-
- <para><literal>@Lob</literal>注解表示å±æ§å°è¢«æä¹
å为Blobæè
Clobç±»å,
- å
·ä½åå³äºå±æ§çç±»å,
- <classname>java.sql.Clob</classname>,
- <classname>Character[]</classname>,
- <classname>char[]</classname> å
- <classname>java.lang.String</classname>è¿äºç±»åçå±æ§é½è¢«æä¹
å为Clobç±»å,
- è<classname>java.sql.Blob</classname>,
- <classname>Byte[]</classname>,
- <classname>byte[]</classname> å
- serializableç±»åå被æä¹
å为Blobç±»å.</para>
-
- <programlisting>
- at Lob
-public String getFullText() {
- return fullText;
-}
-
- at Lob
-public byte[] getFullCode() {
- return fullCode;
-}
- </programlisting>
-
- <para>å¦ææ个å±æ§å®ç°äº<classname>java.io.Serializable</classname>åæ¶ä¹ä¸æ¯åºæ¬ç±»å,
- 并ä¸æ²¡æå¨è¯¥å±æ§ä¸ä½¿ç¨<literal>@Lob</literal>注解,
- é£ä¹Hibernateå°ä½¿ç¨èªå¸¦ç<literal>serializable</literal>ç±»å.
- </para>
- </sect3>
-
- <sect3>
- <title>声æåå±æ§</title>
-
- <para>ä½¿ç¨ <literal>@Column </literal>注解å¯å°å±æ§æ å°å°å.
- 使ç¨è¯¥æ³¨è§£æ¥è¦çé»è®¤å¼(å
³äºé»è®¤å¼è¯·åèEJB3è§è).
- å¨å±æ§çº§ä½¿ç¨è¯¥æ³¨è§£çæ¹å¼å¦ä¸ï¼</para>
-
- <itemizedlist>
- <listitem>
- <para>ä¸è¿è¡æ³¨è§£</para>
- </listitem>
-
- <listitem>
- <para>å <literal>@Basic</literal>ä¸èµ·ä½¿ç¨</para>
- </listitem>
-
- <listitem>
- <para>å <literal>@Version</literal>ä¸èµ·ä½¿ç¨</para>
- </listitem>
-
- <listitem>
- <para>å <literal>@Lob</literal>ä¸èµ·ä½¿ç¨</para>
- </listitem>
-
- <listitem>
- <para>å <literal>@Temporal</literal>ä¸èµ·ä½¿ç¨</para>
- </listitem>
-
- <listitem>
- <para>å
- <literal>@org.hibernate.annotations.CollectionOfElements</literal>ä¸èµ·ä½¿ç¨
- (åªé对Hibernate )</para>
- </listitem>
- </itemizedlist>
-
-
- <programlisting>
- at Entity
-public class Flight implements Serializable {
-...
- at Column(updatable = false, name = "flight_name", nullable = false, length=50)
-public String getName() { ... }
- </programlisting>
-
- <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>name</literal>å±æ§æ å°å°<literal>flight_name</literal>å.
- 该å段ä¸å
许为空,é¿åº¦ä¸º50,并ä¸æ¯ä¸å¯æ´æ°ç(ä¹å°±æ¯å±æ§å¼æ¯ä¸åç).</para>
-
- <para>ä¸é¢è¿äºæ³¨è§£å¯ä»¥è¢«åºç¨å°æ£è§å±æ§ä¸ä¾å¦<literal>@Id</literal> æ<literal>@Version</literal>å±æ§.</para>
-
- <programlistingco>
- <areaspec>
- <area coords="2 55" id="hm1" />
-
- <area coords="3 55" id="hm2" />
-
- <area coords="4 55" id="hm3" />
-
- <area coords="5 55" id="hm4" />
-
- <area coords="6 55" id="hm5" />
-
- <area coords="7 55" id="hm6" />
-
- <area coords="8 55" id="hm7" />
-
- <area coords="9 55" id="hm8" />
-
- <area coords="10 55" id="hm9" />
-
- <area coords="11 55" id="hm10" />
- </areaspec>
-
- <programlisting>@Column(
- name="columnName";
- boolean unique() default false;
- boolean nullable() default true;
- boolean insertable() default true;
- boolean updatable() default true;
- String columnDefinition() default "";
- String table() default "";
- int length() default 255;
- int precision() default 0; // decimal precision
- int scale() default 0; // decimal scale</programlisting>
-
- <calloutlist>
- <callout arearefs="hm1">
- <para><literal>name</literal> å¯é,åå(é»è®¤å¼æ¯å±æ§å)</para>
- </callout>
-
- <callout arearefs="hm2">
- <para><literal>unique</literal> å¯é,æ¯å¦å¨è¯¥åä¸è®¾ç½®å¯ä¸çº¦æ(é»è®¤å¼false)</para>
- </callout>
-
- <callout arearefs="hm3">
- <para><literal>nullable</literal> å¯é,æ¯å¦è®¾ç½®è¯¥åçå¼å¯ä»¥ä¸ºç©º(é»è®¤å¼false)</para>
- </callout>
-
- <callout arearefs="hm4">
- <para><literal>insertable</literal> å¯é,该åæ¯å¦ä½ä¸ºçæçinsertè¯å¥ä¸çä¸ä¸ªå(é»è®¤å¼true)</para>
- </callout>
-
- <callout arearefs="hm5">
- <para><literal>updatable</literal> å¯é,该åæ¯å¦ä½ä¸ºçæçupdateè¯å¥ä¸çä¸ä¸ªå(é»è®¤å¼true)</para>
- </callout>
-
- <callout arearefs="hm6">
- <para><literal>columnDefinition</literal> å¯é: 为è¿ä¸ªç¹å®åè¦çSQL DDLç段 (è¿å¯è½å¯¼è´æ æ³å¨ä¸åæ°æ®åºé´ç§»æ¤)</para>
- </callout>
-
- <callout arearefs="hm7">
- <para><literal>table</literal> å¯é,å®ä¹å¯¹åºç表(é»è®¤ä¸ºä¸»è¡¨)</para>
- </callout>
-
- <callout arearefs="hm8">
- <para><literal><literal>length</literal></literal> å¯é,åé¿åº¦(é»è®¤å¼255)</para>
- </callout>
-
- <callout arearefs="hm8">
- <para><literal><literal>precision</literal></literal>
- å¯é,ååè¿å¶ç²¾åº¦(decimal precision)(é»è®¤å¼0)</para>
- </callout>
-
- <callout arearefs="hm10">
- <para><literal><literal>scale</literal></literal>
- å¯é,å¦æååè¿å¶æ°å¼èå´(decimal scale)å¯ç¨,å¨æ¤è®¾ç½®(é»è®¤å¼0)</para>
- </callout>
- </calloutlist>
- </programlistingco>
- </sect3>
-
- <sect3>
- <title>åµå
¥å¼å¯¹è±¡(ååç»ä»¶)</title>
-
- <para>å¨å®ä½ä¸å¯ä»¥å®ä¹ä¸ä¸ªåµå
¥å¼ç»ä»¶(embedded component),
- çè³è¦ç该å®ä½ä¸åæçåæ å°.
- ç»ä»¶ç±»å¿
é¡»å¨ç±»ä¸çº§å®ä¹<literal>@Embeddable</literal>注解.
- å¨ç¹å®çå®ä½çå
³èå±æ§ä¸ä½¿ç¨<literal>@Embedded</literal>å
- <literal>@AttributeOverride</literal>注解å¯ä»¥è¦ç该å±æ§å¯¹åºçåµå
¥å¼å¯¹è±¡çåæ å°ï¼</para>
-
- <programlisting>
- at Entity
-public class Person implements Serializable {
-
- // Persistent component using defaults
- Address homeAddress;
-
- @Embedded
- @AttributeOverrides( {
- @AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),
- @AttributeOverride(name="name", column = @Column(name="bornCountryName") )
- } )
- Country bornIn;
- ...
-}
- </programlisting>
-
- <programlisting>
- at Embeddable
-public class Address implements Serializable {
- String city;
- Country nationality; //no overriding here
-}
- </programlisting>
-
- <programlisting>
- at Embeddable
-public class Country implements Serializable {
- private String iso2;
- @Column(name="countryName") private String name;
-
- public String getIso2() { return iso2; }
- public void setIso2(String iso2) { this.iso2 = iso2; }
-
-
- public String getName() { return name; }
- public void setName(String name) { this.name = name; }
- ...
-}
- </programlisting>
-
- <para>åµå
¥å¼å¯¹è±¡ç»§æ¿å
¶æå±å®ä½ä¸å®ä¹ç访é®ç±»å
- (注æ:è¿å¯ä»¥éè¿ä½¿ç¨Hibernateæä¾ç<literal>@AccessType</literal>注解æ¥è¦çåæå¼)(请åè <xref
- linkend="entity-hibspec" />).</para>
-
- <para>å¨ä¸é¢çä¾åä¸,å®ä½bean <literal>Person</literal> æ两个ç»ä»¶å±æ§,
- åå«æ¯<literal>homeAddress</literal>å<literal>bornIn</literal>.
- æ们å¯ä»¥çå°<literal>homeAddress</literal> å±æ§å¹¶æ²¡æ注解.
- ä½æ¯Hibernateèªå¨æ£æµå
¶å¯¹åºçAddressç±»ä¸ç<literal>@Embeddable</literal>注解,
- 并å°å
¶çä½ä¸ä¸ªæä¹
åç»ä»¶.对äºCountryä¸å·²æ å°çå±æ§,
- å使ç¨<literal>@Embedded</literal>å<literal>@AttributeOverride
- </literal>注解æ¥è¦çåæ¥æ å°çåå.
- æ£å¦ä½ æçå°ç, <literal>Address</literal>对象ä¸è¿å
åµäº<literal>Country</literal>对象,
- è¿éå<literal>homeAddress</literal>ä¸æ ·ä½¿ç¨äºHibernateåEJB3èªå¨æ£æµæºå¶.
- ç®åEJB3è§èè¿ä¸æ¯æè¦çå¤å±åµå¥(å³åµå
¥å¼å¯¹è±¡ä¸è¿å
æ¬å
¶ä»åµå
¥å¼å¯¹è±¡)çåæ å°.
- ä¸è¿Hibernateéè¿å¨è¡¨è¾¾å¼ä¸ä½¿ç¨"."符å·è¡¨è¾¾å¼æä¾äºå¯¹æ¤ç¹å¾çæ¯æ.</para>
-
- <para><programlisting> @Embedded
- @AttributeOverrides( {
- @AttributeOverride(name="city", column = @Column(name="fld_city") )
- @AttributeOverride(name="<emphasis role="bold">nationality.iso2</emphasis>", column = @Column(name="nat_Iso2") ),
- @AttributeOverride(name="<emphasis role="bold">nationality.name</emphasis>", column = @Column(name="nat_CountryName") )
- //nationality columns in homeAddress are overridden
- } )
- Address homeAddress;</programlisting>
- Hibernate注解æ¯æå¾å¤EJB3è§èä¸æ²¡ææç¡®å®ä¹çç¹æ§.
- ä¾å¦,å¯ä»¥å¨åµå
¥å¼å¯¹è±¡ä¸æ·»å <literal>@MappedSuperclass</literal>注解,
- è¿æ ·å¯ä»¥å°å
¶ç¶ç±»çå±æ§æä¹
(详æ
请æ¥é
<literal>@MappedSuperclass</literal>).</para>
-
- <para>Hibernateç°å¨æ¯æå¨åµå
¥å¼å¯¹è±¡ä¸ä½¿ç¨å
³è注解(å¦<literal>@*ToOne</literal>å<literal>@*ToMany</literal>).
- èEJB3è§èå°ä¸æ¯æè¿æ ·çç¨æ³ãä½ å¯ä»¥ä½¿ç¨ <literal>@AssociationOverride</literal>注解æ¥è¦åå
³èå.</para>
-
-
- <para>å¨åä¸ä¸ªå®ä½ä¸ä½¿ç¨ä¸¤ä¸ªåç±»åçåµå
¥å¯¹è±¡,
- å
¶é»è®¤ååæ¯æ æç:è³å°è¦å¯¹å
¶ä¸ä¸ä¸ªè¿è¡æ确声æ.
- Hibernateå¨è¿æ¹é¢èµ°å¨äºEJB3è§èçåé¢,
- Hibernateæä¾äº<classname>NamingStrategy</classname>, å¨ä½¿ç¨Hibernateæ¶,
- éè¿<classname>NamingStrategy</classname>ä½ å¯ä»¥å¯¹é»è®¤çæºå¶è¿è¡æ©å±.
- <classname>DefaultComponentSafeNamingStrategy</classname>
- å¨é»è®¤çEJB3NamingStrategyä¸è¿è¡äºå°å°çæå,
- å
许å¨åä¸å®ä½ä¸ä½¿ç¨ä¸¤ä¸ªåç±»åçåµå
¥å¯¹è±¡èæ é¡»é¢å¤ç声æ.</para>
-
- </sect3>
-
- <sect3>
- <title>æ 注解ä¹å±æ§çé»è®¤å¼</title>
-
- <para>å¦ææå±æ§æ²¡æ注解,该å±æ§å°éµå®ä¸é¢çè§å:</para>
-
- <itemizedlist>
- <listitem>
- å¦æå±æ§ä¸ºåä¸ç±»å,åæ å°ä¸º@Basic
- </listitem>
-
- <listitem>
- å¦å,å¦æå±æ§å¯¹åºçç±»åå®ä¹äº@Embeddable注解,åæ å°ä¸º@Embedded
- </listitem>
-
- <listitem>
- å¦å,å¦æå±æ§å¯¹åºçç±»åå®ç°äºSerializable,
- åå±æ§è¢«æ å°ä¸º@Basic并å¨ä¸ä¸ªåä¸ä¿å该对象çserializedçæ¬
- </listitem>
-
- <listitem>
- å¦å,å¦æ该å±æ§çç±»å为java.sql.Clob æ java.sql.Blob,åä½ä¸º@Lob并æ å°å°éå½çLobType.
- </listitem>
- </itemizedlist>
-
- </sect3>
- </sect2>
-
- <sect2 id="mapping-identifier" label=""
- xreflabel="Mapping identifier properties">
- <title>æ å°ä¸»é®å±æ§</title>
-
- <para>使ç¨<literal>@Id</literal>注解å¯ä»¥å°å®ä½beanä¸çæ个å±æ§å®ä¹ä¸ºæ è¯ç¬¦(identifier).
- 该å±æ§çå¼å¯ä»¥éè¿åºç¨èªèº«è¿è¡è®¾ç½®,
- ä¹å¯ä»¥éè¿Hiberanteçæ(æ¨è).
- ä½¿ç¨ <literal>@GeneratedValue</literal>注解å¯ä»¥å®ä¹è¯¥æ è¯ç¬¦ççæçç¥:
- </para>
-
- <itemizedlist>
- <listitem>
- AUTO - å¯ä»¥æ¯identity columnç±»å,æè
sequenceç±»åæè
tableç±»å,åå³äºä¸åçåºå±æ°æ®åº.
- </listitem>
-
- <listitem>
- TABLE - 使ç¨è¡¨ä¿åidå¼
- </listitem>
-
- <listitem>
- IDENTITY - identity column
- </listitem>
-
- <listitem>
- SEQUENCE - sequence
- </listitem>
- </itemizedlist>
-
- <para>åEJB3è§èç¸æ¯,Hibernateæä¾äºæ´å¤çidçæå¨.详æ
请æ¥é
<xref linkend="entity-hibspec" /> .</para>
-
-
- <para>ä¸é¢çä¾åå±ç¤ºäºä½¿ç¨SEQ_STOREé
ç½®çsequenceçæå¨</para>
-
- <programlisting>
- at Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
-public Integer getId() { ... }
- </programlisting>
-
- <para>ä¸é¢è¿ä¸ªä¾å使ç¨çæ¯identityçæå¨</para>
-
- <programlisting>
- at Id @GeneratedValue(strategy=GenerationType.IDENTITY)
-public Long getId() { ... }
- </programlisting>
-
- <para><literal>AUTO</literal>çæå¨éç¨äºå¯ç§»æ¤çåºç¨(å¨å¤ä¸ªDBé´åæ¢).
- å¤ä¸ª<literal>@Id</literal>å¯ä»¥å
±äº«åä¸ä¸ªidentifierçæå¨,åªè¦ægeneratorå±æ§è®¾æç¸åçå¼å°±å¯ä»¥äº.
- éè¿<literal>@SequenceGenerator</literal> å<literal>@TableGenerator</literal>,ä½ å¯ä»¥é
ç½®ä¸åçidentifierçæå¨.
- æ¯ä¸ä¸ªidentifierçæå¨é½æèªå·±çéç¨èå´,å¯ä»¥æ¯åºç¨çº§(application level)åç±»ä¸çº§(class level).
- ç±»ä¸çº§ççæå¨å¨å¤é¨æ¯ä¸å¯è§ç,
- èä¸ç±»ä¸çº§ççæå¨å¯ä»¥è¦çåºç¨çº§ççæå¨.
- åºç¨çº§ççæå¨åå®ä¹å¨å
ä¸çº§(package level)(å¦<classname>package-info.java</classname>):</para>
-
- <programlisting>
- at javax.persistence.TableGenerator(
- name="EMP_GEN",
- table="GENERATOR_TABLE",
- pkColumnName = "key",
- valueColumnName = "hi"
- pkColumnValue="EMP",
- allocationSize=20
-)
- at javax.persistence.SequenceGenerator(
- name="SEQ_GEN",
- sequenceName="my_sequence"
-)
-package org.hibernate.test.metadata;
- </programlisting>
-
- <para>
- å¦æå¨<classname>org.hibernate.test.metadata</classname>å
ä¸é¢ç
- <classname>package-info.java</classname>æ件ç¨äºåå§åEJBé
ç½®,
- é£ä¹è¯¥æ件ä¸å®ä¹ç <literal>EMP_GEN</literal>
- å<literal>SEQ_GEN</literal>é½æ¯åºç¨çº§ççæå¨.
- <literal>EMP_GEN</literal>å®ä¹äºä¸ä¸ªä½¿ç¨hiloç®æ³
- (max_lo为20)çidçæå¨(该çæå¨å°idçä¿¡æ¯åå¨æ°æ®åºçæ个表ä¸.).
- idçhiå¼ä¿åå¨<literal>GENERATOR_TABLE</literal>ä¸.
- å¨è¯¥è¡¨ä¸ <literal>pkColumnName</literal>"key"çä»·äº
- <literal>pkColumnValue</literal> "<literal>EMP</literal>",
- è<literal>valueColumnName</literal> "<literal>hi</literal>"ä¸åå¨çæ¯ä¸ä¸ä¸ªè¦ä½¿ç¨çæ大å¼.
- </para>
-
- <para><literal>SEQ_GEN</literal>åå®ä¹äºä¸ä¸ªsequence çæå¨,
- å
¶å¯¹åºçsequenceå为 <literal>my_sequence</literal>.
- 注æç®åHibernate Annotationsè¿ä¸æ¯æsequence çæå¨ä¸ç
- <literal>initialValue</literal>å <literal>allocationSize</literal>åæ°.</para>
-
- <para>ä¸é¢è¿ä¸ªä¾åå±ç¤ºäºå®ä¹å¨ç±»èå´(class scope)çsequenceçæå¨:</para>
-
- <programlisting>
- at Entity
- at javax.persistence.SequenceGenerator(
- name="SEQ_STORE",
- sequenceName="my_sequence"
-)
-public class Store implements Serializable {
- private Long id;
-
- @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
- public Long getId() { return id; }
-}
- </programlisting>
-
- <para>å¨è¿ä¸ªä¾åä¸,Store类使ç¨å为my_sequenceçsequence,并ä¸SEQ_STORE çæå¨å¯¹äºå
¶ä»ç±»æ¯ä¸å¯è§ç.
- 注æå¨org.hibernate.test.metadata.idå
ä¸çæµè¯ä»£ç ææ´å¤æ¼ç¤ºHibernate Annotationsç¨æ³çä¾å..</para>
-
- <para>ä¸é¢æ¯å®ä¹ç»å主é®çå ç§è¯æ³:</para>
-
- <itemizedlist>
- <listitem>
- å°ç»ä»¶ç±»æ³¨è§£ä¸º@Embeddable,并å°ç»ä»¶çå±æ§æ³¨è§£ä¸º@Id
- </listitem>
-
- <listitem>
- å°ç»ä»¶çå±æ§æ³¨è§£ä¸º@EmbeddedId
- </listitem>
-
- <listitem>
- å°ç±»æ³¨è§£ä¸º@IdClass,并å°è¯¥å®ä½ä¸ææå±äºä¸»é®çå±æ§é½æ³¨è§£ä¸º@Id
- </listitem>
- </itemizedlist>
-
- <para>对äºEJB2çå¼å人åæ¥è¯´ <literal>@IdClass</literal>æ¯å¾å¸¸è§ç,
- ä½æ¯å¯¹äºHibernateçç¨æ·æ¥è¯´å°±æ¯ä¸ä¸ªå´æ°çç¨æ³.
- ç»å主é®ç±»å¯¹åºäºä¸ä¸ªå®ä½ç±»ä¸çå¤ä¸ªå段æå±æ§,
- èä¸ä¸»é®ç±»ä¸ç¨äºå®ä¹ä¸»é®çå段æå±æ§å
- å®ä½ç±»ä¸å¯¹åºçå段æå±æ§å¨ç±»åä¸å¿
é¡»ä¸è´.ä¸é¢æ们çä¸ä¸ªä¾å:</para>
-
- <programlisting>@Entity
-<emphasis role="bold">@IdClass(FootballerPk.class)</emphasis>
-public class Footballer {
- //part of the id key
- <emphasis role="bold">@Id</emphasis> public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- //part of the id key
- <emphasis role="bold">@Id</emphasis> public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- public String getClub() {
- return club;
- }
-
- public void setClub(String club) {
- this.club = club;
- }
-
- //appropriate equals() and hashCode() implementation
-}
-
- at Embeddable
-public class FootballerPk implements Serializable {
- //same name and type as in Footballer
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- //same name and type as in Footballer
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- //appropriate equals() and hashCode() implementation
-}
-</programlisting>
-
-
- <para>å¦ä¸, <literal>@IdClass</literal>æå对åºç主é®ç±».</para>
-
- <para>Hibernateæ¯æå¨ç»åæ è¯ç¬¦ä¸å®ä¹å
³è(å°±å使ç¨æ®éç注解ä¸æ ·),èEJB3è§è并ä¸æ¯ææ¤ç±»ç¨æ³.
- </para>
-
- <programlisting>@Entity
- at AssociationOverride( name="id.channel", joinColumns = @JoinColumn(name="chan_id") )
-public class TvMagazin {
- @EmbeddedId public TvMagazinPk id;
- @Temporal(TemporalType.TIME) Date time;
-}
-
- at Embeddable
-public class TvMagazinPk implements Serializable {
- @ManyToOne
- public Channel channel;
- public String name;
- @ManyToOne
- public Presenter presenter;
-}
-</programlisting>
-
- </sect2>
-
- <sect2>
- <title>æ å°ç»§æ¿å
³ç³»</title>
-
- <para>EJB3æ¯æä¸ç§ç±»åç继æ¿æ å°:</para>
-
- <itemizedlist>
- <listitem>
- æ¯ä¸ªç±»ä¸å¼ 表(Table per class)çç¥: å¨Hibernateä¸å¯¹åº<union-class>å
ç´ :
- </listitem>
-
- <listitem>
- æ¯ä¸ªç±»å±æ¬¡ç»æä¸å¼ 表(Single table per class hierarchy)çç¥:å¨Hibernateä¸å¯¹åº<subclass>å
ç´
- </listitem>
-
- <listitem>
- è¿æ¥çåç±»(Joined subclasses)çç¥:å¨Hibernateä¸å¯¹åº <joined-subclass>å
ç´
- </listitem>
- </itemizedlist>
-
- <para>
- ä½ å¯ä»¥ç¨ <literal>@Inheritance</literal>注解æ¥å®ä¹æéæ©ççç¥.
- è¿ä¸ªæ³¨è§£éè¦å¨æ¯ä¸ªç±»å±æ¬¡ç»æ(class hierarchy) æ顶端çå®ä½ç±»ä¸ä½¿ç¨.
- </para>
-
- <note>
- <para>ç®åè¿ä¸æ¯æå¨æ¥å£ä¸è¿è¡æ³¨è§£.</para>
- </note>
-
- <sect3>
- <title>æ¯ä¸ªç±»ä¸å¼ 表</title>
-
- <para>
- è¿ç§çç¥æå¾å¤ç¼ºç¹(ä¾å¦:å¤ææ¥è¯¢åå
³è),EJB3è§è, Hibernateåèæå,
- Hibernate in Action,以åå
¶ä»è®¸å¤å°æ¹é½å¯¹æ¤è¿è¡äºæè¿°å解é.
- Hibernate使ç¨<literal>SQL UNION</literal>æ¥è¯¢æ¥å®ç°è¿ç§çç¥.
- é常使ç¨åºåæ¯å¨ä¸ä¸ªç»§æ¿å±æ¬¡ç»æç顶端:</para>
-
- <programlisting>
- at Entity
- at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public class Flight implements Serializable {
- </programlisting>
-
- <para>
- è¿ç§çç¥æ¯æååçä¸å¯¹å¤å
³è.
- è¿éä¸æ¯æ<literal>IDENTITY</literal>çæå¨çç¥,å 为idå¿
é¡»å¨å¤ä¸ªè¡¨é´å
񄧮.
- å½ç¶,ä¸æ¦ä½¿ç¨è¿ç§çç¥å°±æå³çä½ ä¸è½ä½¿ç¨
- <literal>AUTO </literal>çæå¨å<literal>IDENTITY</literal>çæå¨.
- </para>
- </sect3>
-
- <sect3>
- <title>æ¯ä¸ªç±»å±æ¬¡ç»æä¸å¼ 表</title>
-
- <para>æ´ä¸ªç»§æ¿å±æ¬¡ç»æä¸çç¶ç±»ååç±»çææå±æ§é½æ å°å°åä¸ä¸ªè¡¨ä¸,
- ä»ä»¬çå®ä¾éè¿ä¸ä¸ªè¾¨å«ç¬¦(discriminator)åæ¥åºå.:</para>
-
- <programlisting>
- at Entity
- at Inheritance(strategy=InheritanceType.SINGLE_TABLE)
- at DiscriminatorColumn(
- name="planetype",
- discriminatorType=DiscriminatorType.STRING
-)
- at DiscriminatorValue("Plane")
-public class Plane { ... }
-
- at Entity
- at DiscriminatorValue("A320")
-public class A320 extends Plane { ... }
- </programlisting>
-
- <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,<classname>Plane</classname>æ¯ç¶ç±»,å¨è¿ä¸ªç±»éé¢å°ç»§æ¿çç¥å®ä¹ä¸º
- <literal>InheritanceType.SINGLE_TABLE</literal>,并éè¿
- <literal>@DiscriminatorColumn</literal>注解å®ä¹äºè¾¨å«ç¬¦å(è¿å¯ä»¥å®ä¹è¾¨å«ç¬¦çç±»å).
- æå,对äºç»§æ¿å±æ¬¡ç»æä¸çæ¯ä¸ªç±»,<literal>@DiscriminatorValue</literal>注解æå®äºç¨æ¥è¾¨å«è¯¥ç±»çå¼.
- 辨å«ç¬¦åçååé»è®¤ä¸º <literal>DTYPE</literal>,å
¶é»è®¤å¼ä¸ºå®ä½å(å¨<literal>@Entity.name</literal>ä¸å®ä¹)ï¼å
¶ç±»å
- 为DiscriminatorType.STRING.
- <classname>A320</classname>æ¯åç±»,å¦æä¸æ³ä½¿ç¨é»è®¤ç辨å«ç¬¦,åªéè¦æå®ç¸åºçå¼å³å¯.
- å
¶ä»çå¦ç»§æ¿çç¥,辨å«æ å¿å段çç±»åé½æ¯èªå¨è®¾å®ç.</para>
-
- <para><literal>@Inheritance</literal> å
- <literal>@DiscriminatorColumn</literal> 注解åªè½ç¨äºå®ä½å±æ¬¡ç»æç顶端.</para>
-
- </sect3>
-
- <sect3>
- <title>è¿æ¥çåç±»</title>
-
- <para>å½æ¯ä¸ªåç±»æ å°å°ä¸ä¸ªè¡¨æ¶, <literal> @PrimaryKeyJoinColumn</literal>
- å<literal>@PrimaryKeyJoinColumns</literal>
- 注解å®ä¹äºæ¯ä¸ªå类表å
³èå°ç¶ç±»è¡¨ç主é®:</para>
-
- <programlisting>
- at Entity
- at Inheritance(strategy=InheritanceType.JOINED)
-public class Boat implements Serializable { ... }
-
- at Entity
-public class Ferry extends Boat { ... }
-
- at Entity
- at PrimaryKeyJoinColumn(name="BOAT_ID")
-public class AmericaCupClass extends Boat { ... }
- </programlisting>
-
- <para>以ä¸ææå®ä½é½ä½¿ç¨äº<literal>JOINED</literal>çç¥,
- <literal>Ferry</literal>表å<literal>Boat</literal>表使ç¨ååç主é®.
- è<literal>AmericaCupClass</literal>表å<literal>Boat</literal>表使ç¨äºæ¡ä»¶
- <code>Boat.id = AmericaCupClass.BOAT_ID</code>è¿è¡å
³è.
- </para>
- </sect3>
-
- <sect3>
- <title>ä»ç¶ç±»ç»§æ¿çå±æ§</title>
-
- <para>ææ¶åéè¿ä¸ä¸ª(ææ¯ä¸æä¸å¡ä¸)ç¶ç±»å
±äº«ä¸äºå
Œ
±å±æ§æ¯å¾æç¨ç,
- åæ¶è¿ä¸ç¨å°è¯¥ç¶ç±»ä½ä¸ºæ å°çå®ä½(ä¹å°±æ¯è¯¥å®ä½æ²¡æ对åºç表).
- è¿ä¸ªæ¶åä½ éè¦ä½¿ç¨<literal>@MappedSuperclass</literal>注解æ¥è¿è¡æ å°.</para>
-
- <programlisting>@MappedSuperclass
-public class BaseEntity {
- @Basic
- @Temporal(TemporalType.TIMESTAMP)
- public Date getLastUpdate() { ... }
- public String getLastUpdater() { ... }
- ...
-}
-
- at Entity class Order extends BaseEntity {
- @Id public Integer getId() { ... }
- ...
-}</programlisting>
-
- <para>å¨æ°æ®åºä¸,ä¸é¢è¿ä¸ªä¾åä¸ç继æ¿çå±æ¬¡ç»ææç»ä»¥<literal>Order</literal>表çå½¢å¼åºç°,
- 该表æ¥æ<literal>id</literal>, <literal>lastUpdate</literal> å
- <literal>lastUpdater</literal>ä¸ä¸ªå.ç¶ç±»ä¸çå±æ§æ å°å°å¤å¶å°å
¶åç±»å®ä½.
- 注æè¿ç§æ
åµä¸çç¶ç±»ä¸åå¤å¨ç»§æ¿å±æ¬¡ç»æç顶端.</para>
-
- <note>
-
- <para>注æ,没æ注解为<literal>@MappedSuperclass</literal>çç¶ç±»ä¸çå±æ§å°è¢«å¿½ç¥.</para>
- </note>
-
- <note>
-
- <para>é¤éæ¾å¼ä½¿ç¨Hibernate annotationä¸ç<literal>@AccessType</literal>注解,
- å¦åå°ä»ç»§æ¿å±æ¬¡ç»æçæ ¹å®ä½ä¸ç»§æ¿è®¿é®ç±»å(å
æ¬å段ææ¹æ³)</para>
- </note>
-
- <note>
-
- <para>è¿å¯¹äº<literal>@Embeddable</literal>对象çç¶ç±»ä¸çå±æ§æä¹
ååæ ·ææ.
- åªéè¦ä½¿ç¨<literal>@MappedSuperclass</literal>注解å³å¯
- (è½ç¶è¿ç§æ¹å¼ä¸ä¼çº³å
¥EJB3æ å)</para>
-
- </note>
-
- <note>
-
- <para>å¯ä»¥å°å¤å¨å¨æ å°ç»§æ¿å±æ¬¡ç»æçä¸é´ä½ç½®ç类注解为<literal>@MappedSuperclass</literal>.</para>
- </note>
-
- <note>
-
- <para>å¨ç»§æ¿å±æ¬¡ç»æä¸ä»»ä½æ²¡æ被注解为<literal>@MappedSuperclass</literal>
- æ<literal>@Entity</literal>çç±»é½å°è¢«å¿½ç¥.</para>
- </note>
-
- <para>
- ä½ å¯ä»¥éè¿ <literal>@AttributeOverride</literal>注解è¦çå®ä½ç¶ç±»ä¸çå®ä¹çå.
- è¿ä¸ªæ³¨è§£åªè½å¨ç»§æ¿å±æ¬¡ç»æç顶端使ç¨.</para>
-
- <programlisting>@MappedSuperclass
-public class FlyingObject implements Serializable {
-
- public int getAltitude() {
- return altitude;
- }
-
- @Transient
- public int getMetricAltitude() {
- return metricAltitude;
- }
-
- @ManyToOne
- public PropulsionType getPropulsion() {
- return metricAltitude;
- }
- ...
-}
-
- at Entity
- at AttributeOverride( name="altitude", column = @Column(name="fld_altitude") )
- at AssociationOverride( name="propulsion", joinColumns = @JoinColumn(name="fld_propulsion_fk") )
-public class Plane extends FlyingObject {
- ...
-}</programlisting>
-
- <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>altitude</literal>å±æ§çå¼æç»å°æä¹
åå°<literal>Plane</literal>
- 表ç<literal>fld_altitude</literal>å.èå为propulsionçå
³èåä¿åå¨<literal>fld_propulsion_fk</literal>å¤é´å.</para>
-
- <para>ä½ å¯ä»¥ä¸º<literal>@Entity</literal>å<literal>@MappedSuperclass</literal>注解çç±»
- 以åé£äºå¯¹è±¡ä¸º<literal>@Embeddable</literal>çå±æ§å®ä¹
- <literal>@AttributeOverride</literal>å<literal>@AssociationOverride</literal>.</para>
-
- </sect3>
- </sect2>
-
- <sect2 id="entity-mapping-association">
- <title>æ å°å®ä½Beançå
³èå
³ç³»</title>
-
- <sect3>
- <title>ä¸å¯¹ä¸(One-to-one)</title>
-
- <para>使ç¨<literal>@OneToOne</literal>注解å¯ä»¥å»ºç«å®ä½beanä¹é´çä¸å¯¹ä¸çå
³è.
- ä¸å¯¹ä¸å
³èæä¸ç§æ
åµï¼
- ä¸æ¯å
³èçå®ä½é½å
±äº«åæ ·ç主é®,
- äºæ¯å
¶ä¸ä¸ä¸ªå®ä½éè¿å¤é®å
³èå°å¦ä¸ä¸ªå®ä½ç主é®
- (注æè¦æ¨¡æä¸å¯¹ä¸å
³èå¿
é¡»å¨å¤é®åä¸æ·»å å¯ä¸çº¦æ).
- ä¸æ¯éè¿å
³è表æ¥ä¿å两个å®ä½ä¹é´çè¿æ¥å
³ç³»
- (注æè¦æ¨¡æä¸å¯¹ä¸å
³èå¿
é¡»å¨æ¯ä¸ä¸ªå¤é®ä¸æ·»å å¯ä¸çº¦æ).</para>
-
- <para>é¦å
,æ们éè¿å
±äº«ä¸»é®æ¥è¿è¡ä¸å¯¹ä¸å
³èæ å°:</para>
-
- <programlisting>
- at Entity
-public class Body {
- @Id
- public Long getId() { return id; }
-
- @OneToOne(cascade = CascadeType.ALL)
- @PrimaryKeyJoinColumn
- public Heart getHeart() {
- return heart;
- }
- ...
-}
- </programlisting>
-
- <programlisting>
- at Entity
-public class Heart {
- @Id
- public Long getId() { ...}
-}
- </programlisting>
-
- <para>ä¸é¢çä¾åéè¿ä½¿ç¨æ³¨è§£<literal>@PrimaryKeyJoinColumn</literal>å®ä¹äºä¸å¯¹ä¸å
³è.</para>
-
- <para>ä¸é¢è¿ä¸ªä¾å使ç¨å¤é®åè¿è¡å®ä½çå
³è.</para>
-
- <programlisting>
- at Entity
-public class Customer implements Serializable {
- @OneToOne(cascade = CascadeType.ALL)
- <emphasis role="bold">@JoinColumn(name="passport_fk")</emphasis>
- public Passport getPassport() {
- ...
- }
-
- at Entity
-public class Passport implements Serializable {
- @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
- public Customer getOwner() {
- ...
-}
- </programlisting>
-
- <para>ä¸é¢è¿ä¸ªä¾åä¸,<classname>Customer</classname> éè¿<literal>Customer</literal>
- 表ä¸å为ç<literal>passport_fk</literal> å¤é®åå <classname>Passport</classname>å
³è.
- <literal>@JoinColumn</literal>注解å®ä¹äºèæ¥å(join column).
- 该注解å<literal>@Column</literal>注解æç¹ç±»ä¼¼,
- ä½æ¯å¤äºä¸ä¸ªå为<literal>referencedColumnName</literal>çåæ°.
- 该åæ°å®ä¹äºæå
³èç®æ å®ä½ä¸çèæ¥å.
- 注æ,å½<literal><literal>referencedColumnName</literal></literal>å
³èå°é主é®åçæ¶å,
- å
³èçç®æ ç±»å¿
é¡»å®ç°<classname>Serializable</classname>,
- è¿è¦æ³¨æçæ¯ææ å°çå±æ§å¯¹åºå个å(å¦åæ å°æ æ).
- </para>
-
- <para>ä¸å¯¹ä¸å
³èå¯è½æ¯ååç.å¨ååå
³èä¸,
- æä¸ä»
æä¸ç«¯æ¯ä½ä¸ºä¸»ä½(owner)端åå¨çï¼ä¸»ä½ç«¯è´è´£ç»´æ¤èæ¥å(å³æ´æ°).
- 对äºä¸éè¦ç»´æ¤è¿ç§å
³ç³»çä»è¡¨åéè¿mappedByå±æ§è¿è¡å£°æ.
- <literal>mappedBy</literal>çå¼æå主ä½çå
³èå±æ§.
- å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>mappedBy</literal>çå¼ä¸º <literal>passport</literal>.
- æå,ä¸å¿
ä¹ä¸è½åå¨è¢«å
³è端(owned side)å®ä¹èæ¥åäº,å 为已ç»å¨ä¸»ä½ç«¯è¿è¡äºå£°æ.</para>
-
- <para>å¦æå¨ä¸»ä½æ²¡æ声æ<literal>@JoinColumn</literal>,ç³»ç»èªå¨è¿è¡å¤çï¼
- å¨ä¸»è¡¨(owner table)ä¸å°å建èæ¥å,
- åå为ï¼ä¸»ä½çå
³èå±æ§åï¼ä¸å线ï¼è¢«å
³è端ç主é®åå.
- å¨ä¸é¢è¿ä¸ªä¾åä¸æ¯<literal>passport_id</literal>,
- å 为<literal>Customer</literal>ä¸å
³èå±æ§å为<literal>passport</literal>,
- <literal>Passport</literal>ç主é®æ¯<literal>id</literal>.</para>
-
- <para>The third possibility (using an association table) is very
- exotic.</para>
-
- <para>第ä¸ç§æ¹å¼ä¹è®¸æ¯æå¦ç±»ç(éè¿å
³è表).</para>
-
- <programlisting>
- at Entity
-public class Customer implements Serializable {
- @OneToOne(cascade = CascadeType.ALL)
- <emphasis role="bold">@JoinTable(name = "CustomerPassports"
- joinColumns = @JoinColumn(name="customer_fk"),
- inverseJoinColumns = @JoinColumns(name="passport_fk")</emphasis>
- )
- public Passport getPassport() {
- ...
- }
-
- at Entity
-public class Passport implements Serializable {
- @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
- public Customer getOwner() {
- ...
-}
- </programlisting>
-
- <para><classname>Customer</classname>éè¿å为 <literal>CustomerPassports</literal>çå
³è表å
- <classname>Passport</classname>å
³è; 该å
³è表æ¥æå为<literal>passport_fk</literal>çå¤é®å,该
- å¤é®æå<literal>Passport</literal>表,该信æ¯å®ä¹ä¸º<literal>inverseJoinColumn</literal>çå±æ§å¼,
- è<literal>customer_fk</literal>å¤é®åæå<literal>Customer</literal>表,
- 该信æ¯å®ä¹ä¸º <literal>joinColumns</literal>çå±æ§å¼.</para>
-
- <para>è¿ç§å
³èå¯è½æ¯ååç.å¨ååå
³èä¸,
- æä¸ä»
æä¸ç«¯æ¯ä½ä¸ºä¸»ä½ç«¯åå¨çï¼ä¸»ä½ç«¯è´è´£ç»´æ¤èæ¥å(å³æ´æ°).
- 对äºä¸éè¦ç»´æ¤è¿ç§å
³ç³»çä»è¡¨åéè¿mappedByå±æ§è¿è¡å£°æ.
- <literal>mappedBy</literal>çå¼æå主ä½çå
³èå±æ§.
- å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>mappedBy</literal>çå¼ä¸º <literal>passport</literal>.
- æå,ä¸å¿
ä¹ä¸è½åå¨è¢«å
³è端(owned side)å®ä¹èæ¥åäº,å 为已ç»å¨ä¸»ä½ç«¯è¿è¡äºå£°æ.</para>
-
- <para>ä½ å¿
é¡»æç¡®å®ä¹å
³è表ååå
³èåå.</para>
-
- </sect3>
-
- <sect3>
- <title>å¤å¯¹ä¸(Many-to-one)</title>
-
- <para>å¨å®ä½å±æ§ä¸çº§ä½¿ç¨<literal>@ManyToOne</literal>注解æ¥å®ä¹å¤å¯¹ä¸å
³è:</para>
-
- <programlisting>
- at Entity()
-public class Flight implements Serializable {
- <emphasis role="bold">@ManyToOne</emphasis>( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
- @JoinColumn(name="COMP_ID")
- public Company getCompany() {
- return company;
- }
- ...
-}
- </programlisting>
-
- <para>å
¶ä¸<literal>@JoinColumn</literal>æ¯å¯éç,å
³èå段é»è®¤å¼åä¸å¯¹ä¸
- (one to one)å
³èçæ
åµç¸ä¼¼,
- åå为ï¼ä¸»ä½çå
³èå±æ§åï¼ä¸å线ï¼è¢«å
³è端ç主é®åå.
- å¨è¿ä¸ªä¾åä¸æ¯<literal>company_id</literal>,
- å 为å
³èçå±æ§æ¯<literal>company</literal>,
- <literal>Company</literal>ç主é®æ¯<literal>id</literal>.</para>
-
- <para><literal>@ManyToOne</literal>注解æä¸ä¸ªå为<literal>targetEntity</literal>çåæ°,
- 该åæ°å®ä¹äºç®æ å®ä½å.é常ä¸éè¦å®ä¹è¯¥åæ°,
- å 为å¨å¤§é¨åæ
åµä¸é»è®¤å¼(表示å
³èå
³ç³»çå±æ§ç±»å)å°±å¯ä»¥å¾å¥½ç满足è¦æ±äº.
- ä¸è¿ä¸é¢è¿ç§æ
åµä¸è¿ä¸ªåæ°å°±æ¾å¾ææä¹äºï¼ä½¿ç¨æ¥å£ä½ä¸ºè¿åå¼èä¸æ¯å¸¸è§çå®ä½.</para>
-
- <programlisting>
- at Entity()
-public class Flight implements Serializable {
- @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, <emphasis
- role="bold">targetEntity=CompanyImpl.class</emphasis> )
- @JoinColumn(name="COMP_ID")
- public Company getCompany() {
- return company;
- }
- ...
-}
-
-public interface Company {
- ...
- </programlisting>
-
- <para>对äºå¤å¯¹ä¸ä¹å¯ä»¥éè¿å
³è表çæ¹å¼æ¥æ å°ã
- éè¿<literal>@JoinTable</literal>注解å¯å®ä¹å
³è表ï¼
- 该å
³è表å
å«äºæåå®ä½è¡¨çå¤é®(éè¿<literal>@JoinTable.joinColumns</literal>)
- 以åæåç®æ å®ä½è¡¨çå¤é®(éè¿<literal>@JoinTable.inverseJoinColumns</literal>).</para>
-
- <programlisting>
- at Entity()
-public class Flight implements Serializable {
- @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
- <emphasis role="bold">@JoinTable(name="Flight_Company",
- joinColumns = @JoinColumn(name="FLIGHT_ID"),
- inverseJoinColumns = @JoinColumns(name="COMP_ID")
- )</emphasis>
- public Company getCompany() {
- return company;
- }
- ...
-}
- </programlisting>
- </sect3>
-
- <sect3 id="entity-mapping-association-collections">
- <title>éåç±»å</title>
-
- <sect4>
- <title>æ¦åµ</title>
-
- <para>ä½ å¯ä»¥å¯¹ <classname>Collection </classname>,<literal>List</literal>
- (ææåºå表, èä¸æ¯ç´¢å¼å表),
- <literal>Map</literal>å<classname>Set</classname>è¿å ç§ç±»åè¿è¡æ å°.
- EJB3è§èå®ä¹äºæä¹æ ·ä½¿ç¨<literal>@javax.persistence.OrderBy</literal>
- 注解æ¥å¯¹æåºå表è¿è¡æ å°ï¼
- 该注解æ¥åçåæ°æ ¼å¼ï¼ç¨éå·éå¼ç(ç®æ å®ä½)å±æ§ååæåºæ令,
- å¦<code>firstname asc, age desc</code>,å¦æ该åæ°ä¸ºç©º,åé»è®¤ä»¥id对该éåè¿è¡æåº.
- å¦ææ个éåå¨æ°æ®åºä¸å¯¹åºä¸ä¸ªå
³è表(association table)çè¯,ä½ ä¸è½å¨è¿ä¸ªéåå±æ§ä¸é¢ä½¿ç¨@OrderBy注解.
- 对äºè¿ç§æ
åµçå¤çæ¹æ³,请åè<xref linkend="entity-hibspec" />.
- EJB3 å
è®¸ä½ å©ç¨ç®æ å®ä½çä¸ä¸ªå±æ§ä½ä¸ºMapçkey,
- è¿ä¸ªå±æ§å¯ä»¥ç¨<literal>@MapKey(name="myProperty")</literal>æ¥å£°æ.
- å¦æ使ç¨<literal>@MapKey</literal>注解çæ¶åä¸æä¾å±æ§å,
- ç³»ç»é»è®¤ä½¿ç¨ç®æ å®ä½ç主é®.
- mapçkey使ç¨åå±æ§ç¸åçåï¼ä¸éè¦ä¸ºmap keyå®ä¹ä¸ç¨çåï¼å 为map keyå®é
ä¸å°±è¡¨è¾¾äºä¸ä¸ªç®æ å±æ§ã
- 注æä¸æ¦å è½½,keyä¸ååå±æ§ä¿æåæ¥,
- ä¹å°±æ¯è¯´,å¦æä½ æ¹åäºè¯¥å±æ§çå¼,å¨ä½ çJava模åä¸çkeyä¸ä¼èªå¨æ´æ°
- (请åè<xref linkend="entity-hibspec" />).
- å¾å¤äººè¢«<literal><map></literal>å<literal>@MapKey</literal>å¼ç³æ¶äºã
- å
¶ä»å®ä»¬æ两ç¹åºå«.<literal>@MapKey</literal>ç®åè¿æä¸äºéå¶,详æ
请æ¥ç论åæè
- æ们çJIRA缺é·ç³»ç»ã
-
-
- 注æä¸æ¦å è½½,keyä¸ååå±æ§ä¿æåæ¥,
- ä¹å°±æ¯è¯´,å¦æä½ æ¹åäºè¯¥å±æ§çå¼,å¨ä½ çJava模åä¸çkeyä¸ä¼èªå¨æ´æ°.
- (Hibernate 3ä¸Mapæ¯æçæ¹å¼å¨å½åçåå¸çä¸è¿æªå¾å°æ¯æ).</para>
-
- <para>Hibernateå°éåå以ä¸å ç±».</para>
-
- <para></para>
-
- <table>
- <title>éåè¯ä¹</title>
-
- <tgroup cols="3">
- <colspec colname="c1" />
-
- <colspec colname="c2" />
-
- <colspec colname="c3" colnum="2" />
-
- <thead>
- <row>
- <entry>è¯ä¹</entry>
-
- <entry>Javaå®ç°ç±»</entry>
-
- <entry> 注解</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>Bag è¯ä¹</entry>
-
- <entry>java.util.List, java.util.Collection</entry>
-
- <entry>@org.hibernate.annotations.CollectionOfElements æ
- @OneToMany æ @ManyToMany</entry>
- </row>
-
- <row>
- <entry>List è¯ä¹</entry>
-
- <entry>java.util.List</entry>
-
- <entry>(@org.hibernate.annotations.CollectionOfElements æ
- @OneToMany æ @ManyToMany)
- 以å
- @org.hibernate.annotations.IndexColumn</entry>
- </row>
-
- <row>
- <entry>Set è¯ä¹</entry>
-
- <entry>java.util.Set</entry>
-
- <entry>@org.hibernate.annotations.CollectionOfElements æ
- @OneToMany æ @ManyToMany</entry>
- </row>
-
- <row>
- <entry>Map è¯ä¹</entry>
-
- <entry>java.util.Map</entry>
-
- <entry>(@org.hibernate.annotations.CollectionOfElements æ
- @OneToMany æ @ManyToMany)
- 以å
- (空
- æ
- @org.hibernate.annotations.MapKey/MapKeyManyToMany(æ¯æçæ£çmap),
- æ
- @javax.persistence.MapKey</entry>
-
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <remark>
- ä»ä¸é¢å¯ä»¥æç¡®å°çå°,没æ@org.hibernate.annotations.IndexColumn
- 注解çjava.util.Listéåå°è¢«çä½bagç±».
- </remark>
-
- <para>EJB3è§èä¸æ¯æåå§ç±»å,æ ¸å¿ç±»å,åµå
¥å¼å¯¹è±¡çéå.ä½æ¯Hibernate对æ¤æä¾äºæ¯æ
- (详æ
åè <xref linkend="entity-hibspec" />).</para>
-
- <programlisting>@Entity public class City {
- @OneToMany(mappedBy="city")
- <emphasis role="bold">@OrderBy("streetName")</emphasis>
- public List<Street> getStreets() {
- return streets;
- }
-...
-}
-
- at Entity public class Street {
- <emphasis role="bold">public String getStreetName()</emphasis> {
- return streetName;
- }
-
- @ManyToOne
- public City getCity() {
- return city;
- }
- ...
-}
-
-
- at Entity
-public class Software {
- @OneToMany(mappedBy="software")
- <emphasis role="bold">@MapKey(name="codeName")</emphasis>
- public Map<String, Version> getVersions() {
- return versions;
- }
-...
-}
-
- at Entity
- at Table(name="tbl_version")
-public class Version {
- <emphasis role="bold">public String getCodeName()</emphasis> {...}
-
- @ManyToOne
- public Software getSoftware() { ... }
-...
-}</programlisting>
-
- <para>ä¸é¢è¿ä¸ªä¾åä¸,<literal>City</literal>
- ä¸å
æ¬äºä»¥<literal>streetName</literal>æåºç<literal>Street</literal>çéå.
- è<literal>Software</literal>ä¸å
æ¬äºä»¥<literal>codeName</literal>ä½ä¸º
- keyå以<literal>Version</literal>ä½ä¸ºå¼çMap.</para>
-
- <para>é¤ééå为genericç±»å,å¦åä½ éè¦æå®<literal>targetEntity</literal>.
- è¿ä¸ªæ³¨è§£å±æ§æ¥åçåæ°ä¸ºç®æ å®ä½çclass.</para>
- </sect4>
-
- <sect4 id="entity-mapping-association-collection-onetomany"
- revision="2">
- <title>ä¸å¯¹å¤(One-to-many)</title>
-
- <para>å¨å±æ§çº§ä½¿ç¨ <literal>@OneToMany</literal>注解å¯å®ä¹ä¸å¯¹å¤å
³è.ä¸å¯¹å¤å
³èå¯ä»¥æ¯ååå
³è.</para>
-
- <sect5>
- <title>åå(Bidirectional)</title>
-
- <para>å¨EJB3è§èä¸å¤å¯¹ä¸è¿ç«¯å ä¹æ»æ¯ååå
³èä¸ç主ä½(owner)端,
- èä¸å¯¹å¤è¿ç«¯çå
³è注解为<literal>@OneToMany( mappedBy=...
- )</literal></para>
-
- <programlisting>@Entity
-public class Troop {
- @OneToMany(mappedBy="troop")
- public Set<Soldier> getSoldiers() {
- ...
-}
-
- at Entity
-public class Soldier {
- @ManyToOne
- @JoinColumn(name="troop_fk")
- public Troop getTroop() {
- ...
-} </programlisting>
-
- <para><classname>Troop</classname> éè¿<literal>troop</literal>
- å±æ§å<literal>Soldier</literal>建ç«äºä¸å¯¹å¤çååå
³è.
- å¨<literal>mappedBy</literal>端ä¸å¿
ä¹ä¸è½åå®ä¹ä»»ä½ç©çæ å°</para>
-
- <para>对äºä¸å¯¹å¤çååæ å°,å¦æè¦ä¸å¯¹å¤è¿ä¸ç«¯ç»´æ¤å
³èå
³ç³»,
- ä½ éè¦å é¤<literal>mappedBy</literal>å
ç´ å¹¶å°å¤å¯¹ä¸è¿ç«¯ç
- <literal>@JoinColumn</literal>çinsertableåupdatable设置为false.
- å¾ææ¾,è¿ç§æ¹æ¡ä¸ä¼å¾å°ä»ä¹ææ¾çä¼å,èä¸è¿ä¼å¢å ä¸äºéå çUPDATEè¯å¥.</para>
-
- <programlisting>@Entity
-public class Troop {
- @OneToMany
- @JoinColumn(name="troop_fk") //we need to duplicate the physical information
- public Set<Soldier> getSoldiers() {
- ...
-}
-
- at Entity
-public class Soldier {
- @ManyToOne
- @JoinColumn(name="troop_fk", insertable=false, updatable=false)
- public Troop getTroop() {
- ...
-}</programlisting>
- </sect5>
-
- <sect5>
- <title>åå(Unidirectional)</title>
-
- <para>éè¿å¨è¢«æ¥æçå®ä½ç«¯(owned entity)å¢å ä¸ä¸ªå¤é®åæ¥å®ç°ä¸å¯¹å¤ååå
³èæ¯å¾å°è§ç,ä¹æ¯ä¸æ¨èç.
- æ们强ç建议éè¿ä¸ä¸ªèæ¥è¡¨(join table)æ¥å®ç°è¿ç§å
³è(ä¸ä¸èä¼å¯¹æ¤è¿è¡è§£é).
- å¯ä»¥éè¿<literal>@JoinColumn</literal>注解æ¥æè¿°è¿ç§ååå
³èå
³ç³».</para>
-
- <programlisting>
- at Entity
-public class Customer implements Serializable {
- @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
- @JoinColumn(name="CUST_ID")
- public Set<Ticket> getTickets() {
- ...
-}
-
- at Entity
-public class Ticket implements Serializable {
- ... //no bidir
-}
- </programlisting>
-
- <para><literal>Customer</literal> éè¿
- <literal>CUST_ID</literal>åå<literal>Ticket</literal> 建ç«äºååå
³èå
³ç³».</para>
-
- </sect5>
-
- <sect5>
- <title>éè¿å
³è表å¤çååå
³è</title>
-
- <para>éè¿èæ¥è¡¨å¤çååä¸å¯¹å¤å
³èæ¯é¦éæ¹å¼.è¿ç§å
³èéè¿<literal>@JoinTable</literal>注解æ¥è¿è¡æè¿°.</para>
-
- <programlisting>
- at Entity
-public class Trainer {
- @OneToMany
- @JoinTable(
- name="TrainedMonkeys",
- joinColumns = { @JoinColumn( name="trainer_id") },
- inverseJoinColumns = @JoinColumn( name="monkey_id")
- )
- public Set<Monkey> getTrainedMonkeys() {
- ...
-}
-
- at Entity
-public class Monkey {
- ... //no bidir
-}
- </programlisting>
-
- <para>ä¸é¢è¿ä¸ªä¾åä¸,<literal>Trainer</literal>éè¿
- <classname>TrainedMonkeys</classname>表å
- <classname>Monkey</classname> 建ç«äºååå
³è.
- å
¶ä¸å¤é®<literal>trainer_id</literal>å
³èå°<literal>Trainer</literal>
- (<literal>joinColumns</literal>),
- èå¤é®<literal>monkey_id</literal>å
³èå° <literal>Monkey</literal>
- (<literal>inversejoinColumns</literal>).</para>
- </sect5>
-
- <sect5>
- <title>é»è®¤å¤çæºå¶</title>
-
- <para>éè¿èæ¥è¡¨æ¥å»ºç«ååä¸å¯¹å¤å
³èä¸éè¦æè¿°ä»»ä½ç©çæ å°.
- 表åç±ä»¥ä¸ä¸ä¸ªé¨åç»æ:主表(owner table)表å+ä¸å线+ä»è¡¨(the other side table)表å.
- æå主表çå¤é®åï¼ä¸»è¡¨è¡¨å+ä¸å线+主表主é®åå
- æåä»è¡¨çå¤é®åï¼ä¸»è¡¨æ对åºå®ä½çå±æ§å+ä¸å线+ä»è¡¨ä¸»é®åå
- æåä»è¡¨çå¤é®å®ä¹ä¸ºå¯ä¸çº¦æ,ç¨æ¥è¡¨ç¤ºä¸å¯¹å¤çå
³èå
³ç³».</para>
-
- <programlisting>
- at Entity
-public class Trainer {
- @OneToMany
- public Set<Tiger> getTrainedTigers() {
- ...
-}
-
- at Entity
-public class Tiger {
- ... //no bidir
-}
- </programlisting>
-
- <para>ä¸é¢è¿ä¸ªä¾åä¸,<classname>Trainer</classname>å<classname>Tiger</classname>
- éè¿èæ¥è¡¨ <literal>Trainer_Tiger</literal>建ç«ååå
³èå
³ç³»,
- å
¶ä¸å¤é®<literal>trainer_id</literal>å
³èå°<literal>Trainer</literal>
- (主表表å, <keycap>_</keycap>(ä¸å线), trainer id),
- èå¤é®<literal>trainedTigers_id</literal>å
³èå°<literal>Tiger</literal>
- (å±æ§å称, <keycap>_</keycap>(ä¸å线), Tiger表ç主é®åå).</para>
-
- </sect5>
- </sect4>
-
- <sect4>
- <title>å¤å¯¹å¤(Many-to-many)</title>
-
- <sect5>
- <title>å®ä¹</title>
-
- <para>ä½ å¯ä»¥éè¿<literal>@ManyToMany</literal>注解å¯å®ä¹çå¤å¯¹å¤å
³è.
- åæ¶,ä½ ä¹éè¦éè¿æ³¨è§£<literal>@JoinTable</literal>æè¿°å
³è表åå
³èæ¡ä»¶.
- å¦ææ¯ååå
³è,å
¶ä¸ä¸æ®µå¿
é¡»å®ä¹ä¸ºowner,å¦ä¸ç«¯å¿
é¡»å®ä¹ä¸ºinverse(å¨å¯¹å
³è表è¿è¡æ´æ°æä½æ¶è¿ä¸ç«¯å°è¢«å¿½ç¥):</para>
-
- <programlisting>
- at Entity
-public class Employer implements Serializable {
- @ManyToMany(
- targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,
- cascade={CascadeType.PERSIST, CascadeType.MERGE}
- )
- @JoinTable(
- name="EMPLOYER_EMPLOYEE",
- joinColumns={@JoinColumn(name="EMPER_ID")},
- inverseJoinColumns={@JoinColumn(name="EMPEE_ID")}
- )
- public Collection getEmployees() {
- return employees;
- }
- ...
-}
- </programlisting>
-
- <programlisting>
- at Entity
-public class Employee implements Serializable {
- @ManyToMany(
- cascade={CascadeType.PERSIST, CascadeType.MERGE},
- mappedBy="employees"
- targetEntity=Employer.class
- )
- public Collection getEmployers() {
- return employers;
- }
-}
- </programlisting>
-
- <para>è³æ¤,æ们已ç»å±ç¤ºäºå¾å¤è·å
³èæå
³ç声æå®ä¹ä»¥åå±æ§ç»è.
- ä¸é¢æ们å°æ·±å
¥ä»ç»<literal>@JoinTable</literal>注解,该注解å®ä¹äºèæ¥è¡¨ç表å,
- èæ¥åæ°ç»(注解ä¸å®ä¹æ°ç»çæ ¼å¼ä¸º{ A, B, C }),
- 以åinverseèæ¥åæ°ç».
- åè
æ¯å
³è表ä¸å
³èå°<classname>Employee</classname>主é®çå(the "other side").</para>
-
- <para>æ£å¦åé¢æ示,被å
³è端ä¸å¿
ä¹ä¸è½æè¿°ç©çæ å°:
- åªéè¦ä¸ä¸ªç®åç<literal>mappedBy</literal>åæ°,该åæ°å
å«äºä¸»ä½ç«¯çå±æ§å,è¿æ ·å°±ç»å®åæ¹çå
³ç³».</para>
- </sect5>
-
- <sect5>
- <title>é»è®¤å¼</title>
-
- <para>åå
¶ä»è®¸å¤æ³¨è§£ä¸æ ·,å¨å¤å¯¹å¤å
³èä¸å¾å¤å¼æ¯èªå¨çæ.
- å½ååå¤å¯¹å¤å
³èä¸æ²¡æå®ä¹ä»»ä½ç©çæ å°æ¶,Hibernateæ ¹æ®ä»¥ä¸è§åçæç¸åºçå¼.
- å
³è表å:主表表å+<keycap>_</keycap>ä¸å线+ä»è¡¨è¡¨å,
- å
³èå°ä¸»è¡¨çå¤é®å:主表å+<keycap>_</keycap>ä¸å线+主表ä¸ç主é®åå.
- å
³èå°ä»è¡¨çå¤é®å:主表ä¸ç¨äºå
³èçå±æ§å+<keycap>_</keycap>ä¸å线+ä»è¡¨ç主é®åå.
- 以ä¸è§å对äºååä¸å¯¹å¤å
³èåæ ·ææ.</para>
-
- <programlisting>
- at Entity
-public class Store {
- @ManyToMany(cascade = CascadeType.PERSIST)
- public Set<City> getImplantedIn() {
- ...
- }
-}
-
- at Entity
-public class City {
- ... //no bidirectional relationship
-}
- </programlisting>
-
- <para>ä¸é¢è¿ä¸ªä¾åä¸,<literal>Store_Table</literal>ä½ä¸ºèæ¥è¡¨.
- <literal>Store_id</literal>åæ¯èæ¥å°<literal>Store</literal>表çå¤é®.
- è<literal>implantedIn_id</literal>ååèæ¥å°<literal>City</literal>表.</para>
-
- <para>å½ååå¤å¯¹å¤å
³èä¸æ²¡æå®ä¹ä»»ä½ç©çæ å°æ¶, Hibernateæ ¹æ®ä»¥ä¸è§åçæç¸åºçå¼
- å
³è表å: :主表表å+<keycap>_</keycap>ä¸å线+ä»è¡¨è¡¨å,
- å
³èå°ä¸»è¡¨çå¤é®å:ä»è¡¨ç¨äºå
³èçå±æ§å+<keycap>_</keycap>ä¸å线+主表ä¸ç主é®åå.
- å
³èå°ä»è¡¨çå¤é®å:主表ç¨äºå
³èçå±æ§å+<keycap>_</keycap>ä¸å线+ä»è¡¨ç主é®åå.
- 以ä¸è§å对äºååä¸å¯¹å¤å
³èåæ ·ææ.</para>
-
- <programlisting>
- at Entity
-public class Store {
- @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
- public Set<Customer> getCustomers() {
- ...
- }
-}
-
- at Entity
-public class Customer {
- @ManyToMany(mappedBy="customers")
- public Set<Store> getStores() {
- ...
- }
-}
- </programlisting>
-
- <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>Store_Customer</literal>ä½ä¸ºèæ¥è¡¨.
- <literal>stores_id</literal>åæ¯èæ¥å°<literal>Store</literal>表çå¤é®,
- è<literal>customers_id</literal>åèæ¥å°<literal>City</literal>表.</para>
-
- </sect5>
- </sect4>
- </sect3>
-
-
- <sect3>
- <title>ç¨cascadingå®ç°ä¼ ææ§æä¹
å(Transitive persistence)</title>
-
- <para>ä¹è®¸ä½ å·²ç»æ³¨æå°äº<literal>cascade</literal>å±æ§æ¥åçå¼ä¸º<classname>CascadeType</classname>æ°ç».
- å¨EJB3ä¸çcascadeçæ¦å¿µåHibernateä¸çä¼ ææ§æä¹
å以åcascadeæä½é常类似,
- ä½æ¯å¨è¯ä¹ä¸æç»å¾®çåºå«,æ¯æçcascadeç±»åä¹æç¹åºå«:</para>
-
- <itemizedlist>
- <listitem>
- CascadeType.PERSIST: å¦æä¸ä¸ªå®ä½æ¯å管ç¶æ, æè
å½persist()å½æ°è¢«è°ç¨æ¶, 触å级èå建(create)æä½
- </listitem>
-
- <listitem>
- CascadeType.MERGE: å¦æä¸ä¸ªå®ä½æ¯å管ç¶æ, æè
å½merge()å½æ°è¢«è°ç¨æ¶, 触å级èå并(merge)æä½
- </listitem>
-
- <listitem>
- CascadeType.REMOVE: å½delete()å½æ°è¢«è°ç¨æ¶, 触å级èå é¤(remove)æä½
- </listitem>
-
- <listitem>
- CascadeType.REFRESH: å½refresh()å½æ°è¢«è°ç¨æ¶, 触å级èæ´æ°(refresh)æä½
- </listitem>
-
- <listitem>
- CascadeType.ALL: 以ä¸å
¨é¨
- </listitem>
- </itemizedlist>
-
- <para>å
³äºcascading, create/mergeçè¯ä¹è¯·åèEJB3è§èç6.3ç« è.</para>
- </sect3>
-
- <sect3>
- <title>å
³èå
³ç³»è·å</title>
-
- <para>éè¿Hibernateä½ å¯ä»¥è·å¾ç´æ¥æè
延è¿è·åå
³èå®ä½çåè½.
- <literal>fetch</literal>åæ°å¯ä»¥è®¾ç½®ä¸º<literal>FetchType.LAZY</literal>
- æè
<literal>FetchType.EAGER</literal>.
- <literal>EAGER</literal>éè¿<literal>outer join select</literal>ç´æ¥è·åå
³èç对象,
- è<literal>LAZY</literal>(é»è®¤å¼)å¨ç¬¬ä¸æ¬¡è®¿é®å
³è对象çæ¶åæä¼è§¦åç¸åºçselectæä½.
- EJBQLæä¾äº<literal>fetch</literal>å
³é®å,该å
³é®åå¯ä»¥å¨è¿è¡ç¹æ®æ¥è¯¢çæ¶åè¦çé»è®¤å¼.
- è¿å¯¹äºæé«æ§è½æ¥è¯´é常ææ,åºè¯¥æ ¹æ®å®é
çç¨ä¾æ¥å¤ææ¯å¦éæ©fetchå
³é®å.</para>
- </sect3>
- </sect2>
-
- <sect2>
- <title>æ å°å¤å主é®ä¸å¤é®</title>
-
- <para>ç»å主é®ä½¿ç¨ä¸ä¸ªå¯åµå
¥çç±»ä½ä¸ºä¸»é®è¡¨ç¤º,å æ¤ä½ éè¦ä½¿ç¨<literal>@Id</literal>
- å<literal>@Embeddable</literal>两个注解.
- è¿æä¸ç§æ¹å¼æ¯ä½¿ç¨<literal>@EmbeddedId</literal>注解.注ææä¾èµçç±»å¿
é¡»å®ç°
- serializable以åå®ç°<methodname>equals()</methodname>/<methodname>hashCode()</methodname>æ¹æ³.
- ä½ ä¹å¯ä»¥å¦<xref linkend="mapping-identifier" />ä¸ç« ä¸æè¿°çåæ³ä½¿ç¨<literal>@IdClass</literal>注解.</para>
-
- <programlisting>
- at Entity
-public class RegionalArticle implements Serializable {
-
- @Id
- public RegionalArticlePk getPk() { ... }
-}
-
- at Embeddable
-public class RegionalArticlePk implements Serializable { ... }
- </programlisting>
-
- <para>æè
</para>
-
- <programlisting>
- at Entity
-public class RegionalArticle implements Serializable {
-
- @EmbeddedId
- public RegionalArticlePk getPk() { ... }
-}
-
-public class RegionalArticlePk implements Serializable { ... }
- </programlisting>
-
- <para><literal>@Embeddable</literal> 注解é»è®¤ç»§æ¿äºå
¶æå±å®ä½ç访é®ç±»å,
- é¤éæ¾å¼ä½¿ç¨äºHibernateç<literal>@AccessType</literal>注解(è¿ä¸ªæ³¨è§£ä¸æ¯EJB3æ åçä¸é¨å).
- è<literal>@JoinColumns</literal>,å³<literal>@JoinColumn</literal>æ°ç»,
- å®ä¹äºå
³èçç»åå¤é®(å¦æä¸ä½¿ç¨ç¼ºçå¼çè¯).
- æ¾å¼ææ<literal>referencedColumnNames</literal>æ¯ä¸ä¸ªå¥½çå®è·µæ¹å¼,
- å¦å,Hibernateè®¤ä¸ºä½ ä½¿ç¨çå顺åºå主é®å£°æç顺åºä¸è´.</para>
-
- <programlisting>
- at Entity
-public class Parent implements Serializable {
- @Id
- public ParentPk id;
- public int age;
-
- @OneToMany(cascade=CascadeType.ALL)
- @JoinColumns ({
- @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
- @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
- @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
- })
- public Set<Child> children; //unidirectional
- ...
-}
- </programlisting>
-
- <programlisting>
- at Entity
-public class Child implements Serializable {
- @Id @GeneratedValue
- public Integer id;
-
- @ManyToOne
- @JoinColumns ({
- @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
- @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
- @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
- })
- public Parent parent; //unidirectional
-}
- </programlisting>
-
- <programlisting>
- at Embeddable
-public class ParentPk implements Serializable {
- String firstName;
- String lastName;
- ...
-}
- </programlisting>
-
- <para>注æä¸é¢ç <literal>referencedColumnName</literal>æ¾å¼ä½¿ç¨æ¹å¼.</para>
- </sect2>
-
- <sect2>
- <title>æ å°äºçº§è¡¨(secondary tables)</title>
-
- <para>使ç¨ç±»ä¸çº§ç <literal>@SecondaryTable </literal> æ
- <literal>@SecondaryTables </literal>注解å¯ä»¥å®ç°å个å®ä½å°å¤ä¸ªè¡¨çæ å°.
- ä½¿ç¨ <literal>@Column </literal>æè
<literal>@JoinColumn </literal>
- 注解ä¸ç <literal>table </literal>åæ°å¯æå®æ个åæå±çç¹å®è¡¨.</para>
-
- <programlisting>
- at Entity
- at Table(name="MainCat")
-<emphasis role="bold">@SecondaryTables({
- @SecondaryTable(name="Cat1", pkJoinColumns={
- @PrimaryKeyJoinColumn(name="cat_id", referencedColumnName="id")
- ),
- @SecondaryTable(name="Cat2", uniqueConstraints={@UniqueConstraint(columnNames={"storyPart2"})})
-})</emphasis>
-public class Cat implements Serializable {
-
- private Integer id;
- private String name;
- private String storyPart1;
- private String storyPart2;
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- <emphasis role="bold">@Column(table="Cat1")</emphasis>
- public String getStoryPart1() {
- return storyPart1;
- }
-
- <emphasis role="bold">@Column(table="Cat2")</emphasis>
- public String getStoryPart2() {
- return storyPart2;
- }
-</programlisting>
-
- <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>name</literal>ä¿åå¨<literal>MainCat</literal>表ä¸,
- <literal>storyPart1</literal>ä¿åå¨<literal>Cat1</literal>表ä¸,
- <literal>storyPart2</literal>ä¿åå¨<literal>Cat2</literal>表ä¸.
- <literal>Cat1</literal>表éè¿å¤é®<literal>cat_id</literal>å<literal>MainCat</literal>表å
³è,
- <literal>Cat2</literal>表éè¿<literal>id</literal>åå<literal>MainCat</literal>表å
³è
- (å<literal>MainCat</literal>ç<literal>id</literal>ååå).
- 对<literal>storyPart2</literal>åè¿å®ä¹äºå¯ä¸çº¦æ.</para>
-
- <para>å¨JBoss EJB 3æååHibernate Annotationsåå
æµè¯ä»£ç ä¸è¿ææ´å¤çä¾å.</para>
- </sect2>
- </sect1>
-
- <sect1 id="entity-mapping-query">
- <title>æ å°æ¥è¯¢</title>
-
- <sect2>
- <title>æ å°EJBQL/HQLæ¥è¯¢</title>
-
- <para>使ç¨æ³¨è§£è¿å¯ä»¥æ å°EJBQL/HQLæ¥è¯¢.
- <literal>@NamedQuery</literal> å<literal>@NamedQueries</literal>æ¯å¯ä½¿ç¨å¨ç±»åå
ä¸ç注解.
- ä½æ¯å®ä»¬çå®ä¹å¨session factory/entity manager factoryèå´ä¸æ¯é½å¯è§ç.
- å½åå¼æ¥è¯¢éè¿å®çåååå®é
çæ¥è¯¢å符串æ¥å®ä¹.</para>
-
- <programlisting>
-javax.persistence.NamedQueries(
- @javax.persistence.NamedQuery(name="plane.getAll", query="select p from Plane p")
-)
-package org.hibernate.test.annotations.query;
-
-...
-
- at Entity
- at NamedQuery(name="night.moreRecentThan", query="select n from Night n where n.date >= :date")
-public class Night {
- ...
-}
-
-public class MyDao {
- doStuff() {
- Query q = s.getNamedQuery("night.moreRecentThan");
- q.setDate( "date", aMonthAgo );
- List results = q.list();
- ...
- }
- ...
-}
- </programlisting>
-
- <para>è¿å¯ä»¥éè¿å®ä¹ <literal>QueryHint</literal> æ°ç»ç<literal>hints</literal>
- å±æ§ä¸ºæ¥è¯¢æä¾ä¸äºhintä¿¡æ¯.</para>
-
- <para>ä¸é¢æ¯ç®åå¯ä»¥ä½¿ç¨çä¸äºHibernate hintï¼</para>
-
- <para></para>
-
- <table>
- <title>Query hints</title>
-
- <tgroup cols="2">
- <thead>
- <colspec colname="c1" />
-
- <colspec colname="c2" colnum="2" />
-
- <row>
- <entry>hint</entry>
-
- <entry colname="c2">description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>org.hibernate.cacheable</entry>
-
- <entry>æ¥è¯¢æ¯å¦ä¸äºçº§ç¼å交äº(é»è®¤å¼ä¸ºfalse)
- </entry>
- </row>
-
- <row>
- <entry>org.hibernate.cacheRegion</entry>
-
- <entry>设置ç¼ååºå称 (é»è®¤ä¸ºotherwise)</entry>
- </row>
-
- <row>
- <entry>org.hibernate.timeout</entry>
-
- <entry>æ¥è¯¢è¶
æ¶è®¾å®</entry>
- </row>
-
- <row>
- <entry>org.hibernate.fetchSize</entry>
-
- <entry>æè·åçç»æé(resultset)大å°</entry>
- </row>
-
- <row>
- <entry>org.hibernate.flushMode</entry>
-
- <entry>æ¬æ¬¡æ¥è¯¢æç¨çå·æ°æ¨¡å¼</entry>
- </row>
-
- <row>
- <entry>org.hibernate.cacheMode</entry>
-
- <entry>æ¬æ¬¡æ¥è¯¢æç¨çç¼å模å¼</entry>
- </row>
-
- <row>
- <entry>org.hibernate.readOnly</entry>
-
- <entry>æ¯å¦å°æ¬æ¬¡æ¥è¯¢æå è½½çå®ä½è®¾ä¸ºåªè¯»(é»è®¤ä¸ºfalse)
- </entry>
- </row>
-
- <row>
- <entry>org.hibernate.comment</entry>
-
- <entry>å°æ¥è¯¢æ³¨éæ·»å å
¥æçæçSQL</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect2>
-
- <sect2 id="entity-mapping-query-native" revision="2">
- <title>æ å°æ¬å°åæ¥è¯¢</title>
-
- <para>ä½ è¿å¯ä»¥æ å°æ¬å°åæ¥è¯¢(ä¹å°±æ¯æ®éSQLæ¥è¯¢).
- ä¸è¿è¿éè¦ä½ 使ç¨<literal>@SqlResultSetMapping</literal>注解æ¥æè¿°SQLçresultsetçç»æ
- (å¦æä½ æç®å®ä¹å¤ä¸ªç»æéæ å°ï¼å¯æ¯ä½¿ç¨<literal>@SqlResultSetMappings</literal>).
- <literal>@SqlResultSetMapping</literal>å<literal>@NamedQuery</literal>,
- <literal>@SqlResultSetMapping</literal>ä¸æ ·,å¯ä»¥å®ä¹å¨ç±»åå
ä¸çº§.
- ä½æ¯<literal>@SqlResultSetMapping</literal>çä½ç¨å为åºç¨çº§.
- ä¸é¢æ们ä¼çå°,<literal>@NamedNativeQuery</literal> 注解ä¸
- <literal>resultSetMapping</literal>åæ°å¼ä¸º<literal>@SqlResultSetMapping</literal>çåå.
- ç»æéæ å°å®ä¹äºéè¿æ¬å°åæ¥è¯¢è¿åå¼åå®ä½çæ å°.
- 该å®ä½ä¸çæ¯ä¸ä¸ªå段é½ç»å®å°SQLç»æéä¸çæ个åä¸.
- 该å®ä½çææå段å
æ¬åç±»çææå段以å
- å
³èå®ä½çå¤é®åé½å¿
é¡»å¨SQLæ¥è¯¢ä¸æ对åºçå®ä¹.
- å¦æå®ä½ä¸çå±æ§åSQLæ¥è¯¢ä¸çååç¸å,è¿ç§æ
åµä¸å¯ä»¥ä¸è¿è¡å®ä¹å段æ å°.</para>
-
- <para><programlisting>@NamedNativeQuery(name="night&area", query="select night.id nid, night.night_duration, "
- + " night.night_date, area.id aid, night.area_id, area.name "
- + "from Night night, Area area where night.area_id = area.id", <emphasis
- role="bold">resultSetMapping="joinMapping"</emphasis>)
- at SqlResultSetMapping(name="joinMapping", entities={
- @EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class, fields = {
- @FieldResult(name="id", column="nid"),
- @FieldResult(name="duration", column="night_duration"),
- @FieldResult(name="date", column="night_date"),
- @FieldResult(name="area", column="area_id"),
- discriminatorColumn="disc"
- }),
- @EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class, fields = {
- @FieldResult(name="id", column="aid"),
- @FieldResult(name="name", column="name")
- })
- }
-)</programlisting></para>
-
- <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,å为<literal>night&area</literal>çæ¥è¯¢
- å<literal>joinMapping</literal>ç»æéæ å°å¯¹åº.
- 该æ å°è¿å两个å®ä½,åå«ä¸º<literal>Night</literal>
- å<literal>Area</literal>,å
¶ä¸æ¯ä¸ªå±æ§é½åä¸ä¸ªåå
³è,
- ååéè¿æ¥è¯¢è·å.ä¸é¢æ们çä¸ä¸ªéå¼å£°æå±æ§ååæ å°å
³ç³»çä¾å.</para>
-
- <programlisting>@Entity
-<emphasis role="bold">@SqlResultSetMapping(name="implicit", entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class))
- at NamedNativeQuery(name="implicitSample", query="select * from SpaceShip", resultSetMapping="implicit")</emphasis>
-public class SpaceShip {
- private String name;
- private String model;
- private double speed;
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Column(name="model_txt")
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- public double getSpeed() {
- return speed;
- }
-
- public void setSpeed(double speed) {
- this.speed = speed;
- }
-}</programlisting>
-
- <para>å¨è¿ä¸ªä¾åä¸,æ们åªéè¦å®ä¹ç»æéæ å°ä¸çå®ä½æå.
- å±æ§åååä¹é´çæ å°åå©å®ä½ä¸å
å«æ å°ä¿¡æ¯æ¥å®æ.
- å¨è¿ä¸ªä¾åä¸,<literal>model</literal>å±æ§ç»å®å°<literal>model_txt</literal>å.
- å¦æåç¸å
³å®ä½çå
³è设计å°ç»å主é®,
- é£ä¹åºè¯¥ä½¿ç¨<literal>@FieldResult</literal>注解æ¥å®ä¹æ¯ä¸ªå¤é®å.
- <literal>@FieldResult</literal>çååç±ä»¥ä¸å é¨åç»æï¼
- å®ä¹è¿ç§å
³ç³»çå±æ§åå+"."ï¼ä¸»é®åæ主é®åæ主é®å±æ§.</para>
-
- <programlisting>@Entity
- at SqlResultSetMapping(name="compositekey",
- entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class,
- fields = {
- @FieldResult(name="name", column = "name"),
- @FieldResult(name="model", column = "model"),
- @FieldResult(name="speed", column = "speed"),
-<emphasis role="bold"> @FieldResult(name="captain.firstname", column = "firstn"),
- @FieldResult(name="captain.lastname", column = "lastn"),</emphasis>
- @FieldResult(name="dimensions.length", column = "length"),
- @FieldResult(name="dimensions.width", column = "width")
- }),
- columns = { @ColumnResult(name = "surface"),
- @ColumnResult(name = "volume") } )
-
- at NamedNativeQuery(name="compositekey",
- query="select name, model, speed, lname as lastn, fname as firstn, length, width, length * width as surface from SpaceShip",
- resultSetMapping="compositekey")
-} )
-public class SpaceShip {
- private String name;
- private String model;
- private double speed;
- private Captain captain;
- private Dimensions dimensions;
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne(fetch= FetchType.LAZY)
- @JoinColumns( {
- @JoinColumn(name="fname", referencedColumnName = "firstname"),
- @JoinColumn(name="lname", referencedColumnName = "lastname")
- } )
- public Captain getCaptain() {
- return captain;
- }
-
- public void setCaptain(Captain captain) {
- this.captain = captain;
- }
-
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- public double getSpeed() {
- return speed;
- }
-
- public void setSpeed(double speed) {
- this.speed = speed;
- }
-
- public Dimensions getDimensions() {
- return dimensions;
- }
-
- public void setDimensions(Dimensions dimensions) {
- this.dimensions = dimensions;
- }
-}
-
- at Entity
- at IdClass(Identity.class)
-public class Captain implements Serializable {
- private String firstname;
- private String lastname;
-
- @Id
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- @Id
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-}
-</programlisting>
-
- <note>
-
- <para>è§å¯dimensionå±æ§ä½ ä¼åç°Hibernateæ¯æç¨"."符å·æ¥è¡¨ç¤ºåµå
¥å¼å¯¹è±¡.
- EJB3å®ç°ä¸å¿
æ¯æè¿ä¸ªç¹å¾,ä½æ¯æ们åå°äº:-)</para>
- </note>
-
- <para>å¦ææ¥è¯¢è¿åçæ¯å个å®ä½,æè
ä½ æç®ä½¿ç¨ç³»ç»é»è®¤çæ å°,
- è¿ç§æ
åµä¸å¯ä»¥ä¸ä½¿ç¨<literal>resultSetMapping</literal>
- èæ¯ä½¿ç¨<literal>resultClass</literal>å±æ§:</para>
-
- <programlisting><emphasis role="bold">@NamedNativeQuery(name="implicitSample", query="select * from SpaceShip",
- resultClass=SpaceShip.class)</emphasis>
-public class SpaceShip {</programlisting>
-
- <para>æäºæ¬å°æ¥è¯¢è¿åçæ¯scalarå¼,ä¾å¦æ¥è¡¨æ¥è¯¢.
- ä½ å¯ä»¥éè¿<literal>@ColumnResult</literal>å°å
¶æ å°å°
- <literal>@SqlResultsetMapping</literal>ä¸.
- çè³è¿å¯ä»¥å¨åä¸ä¸ªæ¬å°æ¥è¯¢çç»æä¸æ··åå®ä½åscalarç±»å(ä¸è¿è¿ç§æ
åµæ¯è¾å°è§).</para>
-
- <programlisting><emphasis role="bold">@SqlResultSetMapping(name="scalar", columns=@ColumnResult(name="dimension"))
- at NamedNativeQuery(name="scalar", query="select length*width as dimension from SpaceShip", resultSetMapping="scalar")</emphasis></programlisting>
-
- <para>æ¬å°æ¥è¯¢ä¸è¿æå¦å¤ä¸ä¸ªhintå±æ§ï¼
- <literal>org.hibernate.callable</literal>.
- è¿ä¸ªå±æ§çå¸å°åéå¼è¡¨æè¿ä¸ªæ¥è¯¢æ¯å¦æ¯ä¸ä¸ªåå¨è¿ç¨.</para>
- </sect2>
- </sect1>
-
- <sect1 id="entity-hibspec" xreflabel="Hibernate Annotation Extensions">
- <title>Hibernateç¬æç注解æ©å±</title>
-
- <para>Hibernate 3.1 æä¾äºå¤ç§éå ç注解,è¿äºæ³¨è§£å¯ä»¥ä¸EJB3çå®ä½æ··å/å¹é
使ç¨.
- ä»ä»¬è¢«è®¾è®¡æEJB3注解çèªç¶æ©å±.</para>
-
- <para>为äºå¼ºåEJB3çè½å,Hibernateæä¾äºä¸å
¶èªèº«ç¹æ§ç¸å»åçç¹æ®æ³¨è§£.
- <classname>org.hibernate.annotations</classname>å
å·²å
å«äºææçè¿äºæ³¨è§£æ©å±.</para>
-
- <sect2 id="entity-hibspec-entity" revision="2">
- <title>å®ä½</title>
-
- <para>ä½ å¯ä»¥å¨EJB3è§èæè½æä¾çè½åä¹å¤,å°±Hibernate对å®ä½æåçä¸äºæä½è¿è¡ä¼å.</para>
-
- <para><classname>@org.hibernate.annotations.Entity</classname>
- 追å äºå¯è½éè¦çé¢å¤çå
æ°æ®,
- èè¿äºå
æ°æ®è¶
åºäºæ å<literal>@Entity</literal> ä¸æå®ä¹çå
æ°æ®.
- <itemizedlist>
- <listitem>
- mutable: æ¤å®ä½æ¯å¦ä¸ºå¯åç
- </listitem>
-
- <listitem>
- dynamicInsert: ç¨å¨æSQLæ°å¢
- </listitem>
-
- <listitem>
- dynamicUpdate: ç¨å¨æSQLæ´æ°
- </listitem>
-
- <listitem>
- selectBeforeUpdate: ææHibernateä»ä¸è¿è¡SQL UPDATEé¤éè½ç¡®å®å¯¹è±¡ç确已被修æ¹
- </listitem>
-
- <listitem>
- polymorphism: (æåº)å®ä½å¤ææ¯PolymorphismType.IMPLICIT(é»è®¤)è¿æ¯PolymorphismType.EXPLICIT
- </listitem>
-
- <listitem>
- persister:å
许对é»è®¤æä¹
å®ç°(persister implementation)çè¦ç
- </listitem>
-
- <listitem>
- optimisticLock: ä¹è§éçç¥(OptimisticLockType.VERSION, OptimisticLockType.NONE, OptimisticLockType.DIRTYæOptimisticLockType.ALL)
- </listitem>
- </itemizedlist>
- </para>
-
- <para>
- <note>
- <para>
- @javax.persistence.Entityä»æ¯å¿
éç(mandatory),
- @org.hibernate.annotations.Entityä¸æ¯å代å.
- </para>
- </note>
- </para>
-
- <para>以ä¸æ¯ä¸äºéå çHibernate注解æ©å±ï¼</para>
-
- <para><literal>@org.hibernate.annotations.BatchSize</literal>
- å
è®¸ä½ å®ä¹æ¹éè·å该å®ä½çå®ä¾æ°é(å¦ï¼<literal>@BatchSize(size=4)</literal>).
- å½å è½½ä¸ç¹å®çå®ä½æ¶,Hibernateå°å è½½å¨æä¹
ä¸ä¸æä¸æªç»åå§åçåç±»åå®ä½,ç´è³æ¹éæ°é(ä¸é).</para>
-
- <para><literal>@org.hibernate.annotations.Proxy</literal>
- å®ä¹äºå®ä½ç延è¿å±æ§.Lazy(é»è®¤ä¸ºtrue)å®ä¹äºç±»æ¯å¦ä¸ºå»¶è¿(å è½½).
- proxyClassNameæ¯ç¨æ¥çæ代ççæ¥å£(é»è®¤ä¸ºè¯¥ç±»æ¬èº«).</para>
-
- <para><literal>@org.hibernate.annotations.Where</literal>
- å®ä¹äºå½è·åç±»å®ä¾æ¶æç¨çSQL WHEREåå¥(该SQL WHEREåå¥ä¸ºå¯é).</para>
-
- <para><literal>@org.hibernate.annotations.Check</literal>
- å®ä¹äºå¨DDLè¯å¥ä¸å®ä¹çåæ³æ§æ£æ¥çº¦æ(该约æ为å¯é).</para>
-
- <para><literal>@OnDelete(action=OnDeleteAction.CASCADE)</literal>
- å®ä¹äºè¢«è¿æ¥çåç±»(joined subclass)ï¼å¨å é¤æ¶ä½¿ç¨SQL级è¿å é¤,èéé常çHibernateå é¤æºå¶.</para>
-
- <para><literal>@Table(name="tableName", indexes = {
- @Index(name="index1", columnNames={"column1", "column2"} ) } )</literal>
- å¨<literal>tableName</literal>表çåä¸å建å®ä¹å¥½çç´¢å¼.
- 该注解å¯ä»¥è¢«åºç¨äºå
³é®è¡¨æè
æ¯å
¶ä»æ¬¡è¦ç表.
- <literal>@Tables</literal> 注解å
è®¸ä½ å¨ä¸åç表ä¸åºç¨ç´¢å¼.
- æ¤æ³¨è§£é¢æå¨ä½¿ç¨
- <literal>@javax.persistence.Table</literal>æ
- <literal>@javax.persistence.SecondaryTable</literal>çå°æ¹ä¸åºç°.</para>
-
- <note>
- <para>
- <literal>@org.hibernate.annotations.Table</literal> æ¯å¯¹
- <literal>@javax.persistence.Table</literal>çè¡¥å
èä¸æ¯å®çæ¿ä»£å.
- ç¹å«æ¯å½ä½ æç®æ¹å表åçé»è®¤å¼çæ¶åï¼ä½ å¿
须使ç¨<literal>@javax.persistence.Table</literal>,
- èä¸æ¯<literal>@org.hibernate.annotations.Table</literal>.</para>
- </note>
-
- <para><programlisting>@Entity
- at BatchSize(size=5)
- at org.hibernate.annotations.Entity(
- selectBeforeUpdate = true,
- dynamicInsert = true, dynamicUpdate = true,
- optimisticLock = OptimisticLockType.ALL,
- polymorphism = PolymorphismType.EXPLICIT)
- at Where(clause="1=1")
- at org.hibernate.annotations.Table(name="Forest", indexes = { @Index(name="idx", columnNames = { "name", "length" } ) } )
-public class Forest { ... }</programlisting><programlisting>@Entity
- at Inheritance(
- strategy=InheritanceType.JOINED
-)
-public class Vegetable { ... }
-
- at Entity
- at OnDelete(action=OnDeleteAction.CASCADE)
-public class Carrot extends Vegetable { ... }</programlisting></para>
- </sect2>
-
- <sect2>
- <title>æ è¯ç¬¦</title>
-
- <para><literal><literal>@org.hibernate.annotations.GenericGenerator</literal>
- å
è®¸ä½ å®ä¹ä¸ä¸ªHibernateç¹å®çidçæå¨.</literal></para>
-
- <para><programlisting>@Id @GeneratedValue(generator="system-uuid")
- at GenericGenerator(name="system-uuid", strategy = "uuid")
-public String getId() {
-
- at Id @GeneratedValue(generator="hibseq")
- at GenericGenerator(name="hibseq", strategy = "seqhilo",
- parameters = {
- @Parameter(name="max_lo", value = "5"),
- @Parameter(name="sequence", value="heybabyhey")
- }
-)
-public Integer getId() {</programlisting></para>
-
- <para><literal>strategy</literal>å¯ä»¥æ¯Hibernate3çæå¨çç¥çç®ç§°,
- æè
æ¯ä¸ä¸ª<classname>IdentifierGenerator</classname>å®ç°ç(带å
è·¯å¾ç)å
¨éå®ç±»å.
- ä½ å¯ä»¥éè¿<literal>parameters</literal>å±æ§å¢å ä¸äºåæ°.</para>
-</sect2>
-
-<sect2 id="entity-hibspec-property" revision="2">
- <title>å±æ§</title>
-
- <sect3>
- <title>访é®ç±»å</title>
-
- <para>访é®ç±»åæ¯æ ¹æ®<literal>@Id</literal>æ<literal>@EmbeddedId</literal>
- å¨å®ä½ç»§æ¿å±æ¬¡ä¸æå¤çä½ç½®æ¨æ¼èå¾ç.åå®ä½(Sub-entities),
- å
åµå¯¹è±¡å被æ å°çç¶ç±»å继æ¿äºæ ¹å®ä½(root entity)ç访é®ç±»å.</para>
-
- <para>å¨Hibernateä¸,ä½ å¯ä»¥æ访é®ç±»åè¦çæï¼</para>
-
- <itemizedlist>
- <listitem>
- <para>使ç¨å®å¶ç访é®ç±»åçç¥</para>
- </listitem>
-
- <listitem>
- <para>ä¼å类级æå±æ§çº§ç访é®ç±»å</para>
- </listitem>
- </itemizedlist>
-
- <para>为æ¯æè¿ç§è¡ä¸º,Hibernateå¼å
¥äº@AccessType注解.ä½ å¯ä»¥å¯¹ä»¥ä¸å
ç´ å®ä¹è®¿é®ç±»åï¼</para>
-
- <itemizedlist>
- <listitem>
- <para>å®ä½</para>
- </listitem>
-
- <listitem>
- <para>ç¶ç±»</para>
- </listitem>
-
- <listitem>
- <para>å¯å
åµç对象</para>
- </listitem>
-
- <listitem>
- <para>å±æ§</para>
- </listitem>
- </itemizedlist>
-
- <para>被注解å
ç´ ç访é®ç±»åä¼è¢«è¦ç,è¥è¦çæ¯å¨ç±»ä¸çº§ä¸,åææçå±æ§ç»§æ¿è®¿é®ç±»å.
- 对äºæ ¹å®ä½,å
¶è®¿é®ç±»åä¼è¢«è®¤ä¸ºæ¯æ´ä¸ªç»§æ¿å±æ¬¡ä¸ç缺ç设置(å¯å¨ç±»æå±æ§ä¸çº§è¦ç).</para>
-
- <para>è¥è®¿é®ç±»å被æ 以"property",åHibernateä¼æ«ægetteræ¹æ³ç注解,è¥è®¿é®ç±»å被æ 以"field",
- åæ«æå段ç注解.å¦å,æ«ææ 为@Idæ@embeddedIdçå
ç´ .</para>
-
- <para>ä½ å¯ä»¥è¦çæ个å±æ§(property)ç访é®ç±»å,ä½æ¯å注解çå
ç´ å°ä¸åå½±åï¼
- ä¾å¦ä¸ä¸ªå
·æfield访é®ç±»åçå®ä½,(æ们)å¯ä»¥å°æ个å段æ 注为 @AccessType("property"),
- å该å段ç访é®ç±»åéä¹å°æ为property,ä½æ¯å
¶ä»å段ä¸ä¾ç¶éè¦æºå¸¦æ³¨è§£.</para>
-
- <para>è¥ç¶ç±»æå¯å
åµç对象没æ被注解,å使ç¨æ ¹å®ä½ç访é®ç±»å(å³ä½¿å·²ç»å¨éç´ç³»ç¶ç±»æå¯å
åµå¯¹è±¡ä¸å®ä¹äºè®¿é®ç±»å).
- æ¤æ¶ä¿ç½æ¯å¥å¨(Russian doll)åçå°±ä¸åéç¨.(è¯æ³¨ï¼ä¿ç½æ¯å¥å¨(маÑÑÑÑкаæ маÑÑеÑка)æ¯ä¿ç½æ¯ç¹äº§æ¨å¶ç©å
·,
- ä¸è¬ç±å¤ä¸ªä¸æ ·å¾æ¡ç空å¿æ¨å¨å¨ä¸ä¸ªå¥ä¸ä¸ªç»æ,æå¤å¯è¾¾åå¤ä¸ª,é常为åæ±å½¢,åºé¨å¹³å¦å¯ä»¥ç´ç«.)</para>
-
-<programlisting>@Entity
-public class Person implements Serializable {
- @Id @GeneratedValue //access type field
- Integer id;
-
- @Embedded
- @AttributeOverrides({
- @AttributeOverride(name = "iso2", column = @Column(name = "bornIso2")),
- @AttributeOverride(name = "name", column = @Column(name = "bornCountryName"))
- })
- Country bornIn;
-}
-
- at Embeddable
-<emphasis role="bold">@AccessType("property")</emphasis> //override access type for all properties in Country
-public class Country implements Serializable {
- private String iso2;
- private String name;
-
- public String getIso2() {
- return iso2;
- }
-
- public void setIso2(String iso2) {
- this.iso2 = iso2;
- }
-
- @Column(name = "countryName")
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
-</programlisting>
- </sect3>
-
- <sect3>
- <title>å
¬å¼</title>
-
- <para>ææ¶å,ä½ æ³è®©æ°æ®åº,èéJVM,æ¥æ¿ä½ å®æä¸äºè®¡ç®,ä¹å¯è½æ³å建æç§èæå.
- ä½ å¯ä»¥ä½¿ç¨SQLç段(亦称为å
¬å¼),èä¸æ¯å°å±æ§æ å°å°(ç©ç)å. è¿ç§å±æ§æ¯åªè¯»ç(å±æ§å¼ç±å
¬æ±å¾).</para>
-
- <programlisting>@Formula("obj_length * obj_height * obj_width")
- public long getObjectVolume()</programlisting>
-
-
- <para>SQLç段å¯ä»¥æ¯ä»»æå¤æç,çè³å¯å
å«åæ¥è¯¢.</para>
- </sect3>
-
- <sect3>
- <title>ç±»å</title>
-
- <para><literal>@org.hibernate.annotations.Type</literal>
- è¦çäºHibernateæç¨çé»è®¤ç±»åï¼è¿é常ä¸æ¯å¿
é¡»ç,å 为类åå¯ä»¥ç±Hibernateæ£ç¡®æ¨å¾.
- å
³äºHibernateç±»åç详ç»ä¿¡æ¯,请åèHibernate使ç¨æå.</para>
-
- <para><literal>@org.hibernate.annotations.TypeDef</literal> å
- <literal>@org.hibernate.annotations.TypeDefs</literal>å
è®¸ä½ æ¥å£°æç±»åå®ä¹.
- è¿äºæ³¨è§£è¢«ç½®äºç±»æå
ä¸çº§.注æ,对session factoryæ¥è¯´,
- è¿äºå®ä¹å°æ¯å
¨å±ç(å³ä½¿å®ä¹äºç±»ä¸çº§),并ä¸ç±»åå®ä¹å¿
é¡»å
äºä»»ä½ä½¿ç¨.</para>
-
- <programlisting>@TypeDefs(
- {
- @TypeDef(
- name="caster",
- typeClass = CasterStringType.class,
- parameters = {
- @Parameter(name="cast", value="lower")
- }
- )
- }
-)
-package org.hibernate.test.annotations.entity;
-
-...
-public class Forest {
- @Type(type="caster")
- public String getSmallText() {
- ...
-}
- </programlisting>
-
- <para>å½ä½¿ç¨ç»åçç¨æ·èªå®ä¹ç±»åæ¶,ä½ å¿
é¡»èªå·±è¡¨ç¤ºåçå®ä¹.
-<literal>@Columns</literal>å°±æ¯ä¸ºäºæ¤ç®çèå¼å
¥ç.</para>
-<programlisting>@Type(type="org.hibernate.test.annotations.entity.MonetaryAmountUserType")
- at Columns(columns = {
- @Column(name="r_amount"),
- @Column(name="r_currency")
-})
-public MonetaryAmount getAmount() {
- return amount;
-}
-
-
-public class MonetaryAmount implements Serializable {
- private BigDecimal amount;
- private Currency currency;
- ...
-}</programlisting>
- </sect3>
-
- <sect3>
- <title>ç´¢å¼</title>
-
- <para>éè¿å¨åå±æ§(property)ä¸ä½¿ç¨<literal>@Index</literal>注解,
- å¯ä»¥å¨ç¹å®åä¸å®ä¹ç´¢å¼,columnNameså±æ§(attribute)å°éä¹è¢«å¿½ç¥.</para>
-
- <programlisting>@Column(secondaryTable="Cat1")
- at Index(name="story1index")
-public String getStoryPart1() {
- return storyPart1;
-}</programlisting>
- </sect3>
-
- <sect3>
- <title>@Parent</title>
-
- <para>å¨åµå
¥å¼å¯¹è±¡å
é¨,ä½ å¯ä»¥å¨é£äºæå该åµå
¥å¼å¯¹è±¡æå±å
ç´ çå±æ§ä¸å®ä¹è¯¥æ³¨è§£.</para>
-
- <programlisting>@Entity
-public class Person {
- @Embeddable public Address address;
- ...
-}
-
- at Embeddable
-public class Address {
- @Parent public Person owner;
- ...
-}
-
-
-person == person.address.owner</programlisting>
- </sect3>
-
- <sect3>
- <title>çæçå±æ§</title>
-
- <para>
- æäºå±æ§å¯ä»¥å¨å¯¹æ°æ®åºåæå
¥ææ´æ°æä½çæ¶åçæ.
- Hibernateè½å¤å¤çè¿æ ·çå±æ§,并触åä¸ä¸ªåç»çæ¥è¯¢æ¥è¯»åè¿äºå±æ§.
- </para>
-
- <programlisting>@Entity
-public class Antenna {
- @Id public Integer id;
- @Generated(GenerationTime.ALWAYS) @Column(insertable = false, updatable = false)
- public String longitude;
-
- @Generated(GenerationTime.INSERT) @Column(insertable = false)
- public String latitude;
-}</programlisting>
-
- <para>
- ä½ å¯ä»¥å°å±æ§æ³¨è§£ä¸º<literal>@Generated</literal>.
- ä½æ¯ä½ è¦æ³¨æinsertabilityåupdatabilityä¸è¦åä½ éæ©ççæçç¥å²çª.
- å¦æéæ©äºGenerationTime.INSERT,该å±æ§ä¸è½å
å«insertableå,
- å¦æéæ©äºGenerationTime.ALWAYS,该å±æ§ä¸è½å
å«insertableåupdatableå.</para>
-
- <para><literal>@Version</literal>å±æ§ä¸å¯ä»¥ä¸º
- <literal>@Generated(INSERT)</literal>(设计æ¶), åªè½æ¯
- <literal>NEVER</literal>æ<literal>ALWAYS</literal>.</para>
- </sect3>
-
- </sect2>
-
- <sect2>
- <title>继æ¿</title>
-
- <para>SINGLE_TABLE æ¯ä¸ªåè½å¼ºå¤§ççç¥,ä½ææ¶,ç¹å«å¯¹éçç³»ç»èè¨,
- æ¯æ æ³å å
¥ä¸ä¸ªé¢å¤ç辨å«ç¬¦å.
- ç±æ¤,Hibernateå¼å
¥äºè¾¨å«ç¬¦å
¬å¼(discriminator formula)çæ¦å¿µï¼
- <literal>@DiscriminatorFormula</literal>æ¯<literal>@DiscriminatorColumn</literal>çæ¿ä»£å,
- å®ä½¿ç¨SQLç段ä½ä¸ºè¾¨å«ç¬¦è§£å³æ¹æ¡çå
¬å¼( ä¸éè¦æä¸ä¸ªä¸é¨çå段).</para>
-
- <programlisting>@Entity
- at DiscriminatorForumla("case when forest_type is null then 0 else forest_type end")
-public class Forest { ... }</programlisting>
- </sect2>
-
- <sect2>
- <title>å
³äºå个å
³èå
³ç³»ç注解</title>
-
- <para>é»è®¤æ
åµä¸,å½é¢æç被å
³èå
ç´ ä¸å¨æ°æ®åºä¸(å
³ä¹å
³èåçé误id),è´ä½¿Hiberanteæ æ³è§£å³å
³èæ§é®é¢æ¶,Hibernateå°±ä¼æåºå¼å¸¸.
- è¿å¯¹éçschemaååç»æå£ç»´æ¤çschemaèè¨,è¿ææ许å¤ä¸ä¾¿.
- æ¤æ¶,ä½ å¯ç¨ <literal>@NotFound </literal>注解让Hibernateç¥è¿è¿æ ·çå
ç´ èä¸æ¯æåºå¼å¸¸.
- 该注解å¯ç¨äº <literal>@OneToOne </literal> (æå¤é®)ã <literal>@ManyToOne </literal>ã
- <literal>@OneToMany </literal> æ <literal>@ManyToMany </literal>å
³è.</para>
-
- <programlisting>@Entity
-public class Child {
- ...
- @ManyToOne
- @NotFound(action=NotFoundAction.IGNORE)
- public Parent getParent() { ... }
- ...
-}</programlisting>
-
- <para>
- ææ¶åå é¤æå®ä½çæ¶åéè¦è§¦åæ°æ®åºç级èå é¤.</para>
-
- <programlisting>@Entity
-public class Child {
- ...
- @ManyToOne
- @OnDelete(action=OnDeleteAction.CASCADE)
- public Parent getParent() { ... }
- ...
-}</programlisting>
-
- <para>ä¸é¢è¿ä¸ªä¾åä¸,Hibernateå°çæä¸ä¸ªæ°æ®åºçº§ç级èå é¤çº¦æ.</para>
-
- <sect3>
- <title>延è¿é项åè·å模å¼</title>
-
- <para>
- EJB3为延è¿å è½½åè·å模å¼æä¾äº<literal>fetch</literal>é项,èHibernate
- è¿æ¹é¢æä¾äºæ´ä¸°å¯çé项é.为äºæ´å¥½çè°æ´å»¶è¿å è½½åè·åçç¥,Hibernateå¼å
¥äº
- ä¸äºéå ç注解:</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>@LazyToOne</literal>: å®ä¹äº
- <literal>@ManyToOne</literal> å <literal>@OneToOne</literal>
- å
³èç延è¿é项. <literal>LazyToOneOption</literal> å¯ä»¥æ¯
- <literal>PROXY</literal> (ä¾å¦:åºäºä»£çç延è¿å è½½),
- <literal>NO_PROXY</literal> (ä¾å¦:åºäºåèç å¢å¼ºç延è¿å è½½ - 注æéè¦å¨æ建æå¤çåèç )
- å <literal>FALSE</literal> (é延è¿å è½½çå
³è)</para>
- </listitem>
-
- <listitem>
- <para><literal>@LazyCollection</literal>: å®ä¹äº
- <literal>@ManyToMany</literal>å
- <literal>@OneToMany</literal> å
³èç延è¿é项. LazyCollectionOption
- å¯ä»¥æ¯<literal>TRUE</literal> (éåå
·æ延è¿æ§,åªæå¨è®¿é®çæ¶åæå è½½),
- <literal>EXTRA</literal> (éåå
·æ延è¿æ§,并ä¸ææçæä½é½ä¼å°½éé¿å
å è½½éå,
- 对äºä¸ä¸ªå·¨å¤§çéåç¹å«æç¨,å 为è¿æ ·çéåä¸çå
ç´ æ²¡æå¿
è¦å
¨é¨å è½½)å FALSE
- (é延è¿å è½½çå
³è)</para>
- </listitem>
-
- <listitem>
- <para><literal>@Fetch</literal>:
- å®ä¹äºå è½½å
³èå
³ç³»çè·åçç¥. <literal>FetchMode</literal> å¯ä»¥æ¯
- <literal>SELECT</literal> (å¨éè¦å è½½å
³èçæ¶å触åselectæä½),
- <literal>SUBSELECT</literal>
- (åªå¯¹éåææ,使ç¨äºåæ¥è¯¢çç¥,详æ
åèHibernateåèææ¡£) or
- <literal>JOIN</literal> (å¨å 载主å®ä½(owner entity)çæ¶å使ç¨SQL JOINæ¥å è½½å
³èå
³ç³»).
- <literal>JOIN</literal> å°è¦åä»»ä½å»¶è¿å±æ§
- (éè¿<literal>JOIN</literal>çç¥å è½½çå
³èå°ä¸åå
·æ延è¿æ§).</para>
- </listitem>
- </itemizedlist>
-
- <para>The Hibernate annotations overrides the EJB3 fetching
- options.</para>
-
- <para>Hibernate注解è¦åäºEJB3æä¾çè·å(fetch)é项.</para>
-
- <table>
- <title>延è¿åè·åé项ççæ注解</title>
-
- <tgroup cols="3">
- <thead>
- <row>
- <entry>Annotations</entry>
-
- <entry>Lazy</entry>
-
- <entry>Fetch</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>@[One|Many]ToOne](fetch=FetchType.LAZY)</entry>
-
- <entry>@LazyToOne(PROXY)</entry>
-
- <entry>@Fetch(SELECT)</entry>
- </row>
-
- <row>
- <entry>@[One|Many]ToOne](fetch=FetchType.EAGER)</entry>
-
- <entry>@LazyToOne(FALSE)</entry>
-
- <entry>@Fetch(JOIN)</entry>
- </row>
-
- <row>
- <entry>@ManyTo[One|Many](fetch=FetchType.LAZY)</entry>
-
- <entry>@LazyCollection(TRUE)</entry>
-
- <entry>@Fetch(SELECT)</entry>
- </row>
-
- <row>
- <entry>@ManyTo[One|Many](fetch=FetchType.EAGER)</entry>
-
- <entry>@LazyCollection(FALSE)</entry>
-
- <entry>@Fetch(JOIN)</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </sect3>
-
-
- </sect2>
-
- <sect2 id="entity-hibspec-collection" revision="2">
- <title>å
³äºéåç±»åç注解</title>
-
- <sect3>
- <title>åæ°æ³¨è§£</title>
-
- <para>以ä¸æ¯å¯è½ç设置æ¹å¼<itemizedlist>
- <listitem>
- ç¨@BatchSizebatch设置éåçbatch大å°
- </listitem>
-
- <listitem>
- ç¨@Where注解设置Whereåå¥
- </listitem>
-
- <listitem>
- ç¨æ³¨è§£@Checkæ¥è®¾ç½®checkåå¥
- </listitem>
-
- <listitem>
- ç¨æ³¨è§£@OrderByæ¥è®¾ç½®SQLçorder byåå¥
- </listitem>
-
- <listitem>
- å©ç¨@OnDelete(action=OnDeleteAction.CASCADE) 注解设置级è¿å é¤çç¥
- </listitem>
- </itemizedlist></para>
-
- <para>ä½ ä¹å¯ä»¥å©ç¨<literal>@Sort</literal>注解å®ä¹ä¸ä¸ªæåºæ¯è¾å¨(sort comparator),
- 表æå¸æçæ¯è¾å¨ç±»å,æ åºãèªç¶é¡ºåºæèªå®ä¹æåº,ä¸è
æ©ä¸.è¥ä½ æ³ç¨ä½ èªå·±å®ç°çcomparator,
- ä½ è¿éè¦å©ç¨<literal>comparator</literal>å±æ§(attribute)ææå®ç°ç±».</para>
-
- <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
- @JoinColumn(name="CUST_ID")
- @Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
- @Where(clause="1=1")
- @OnDelete(action=OnDeleteAction.CASCADE)
- public SortedSet<Ticket> getTickets() {
- return tickets;
- }</programlisting>
-
- <para>å
³äºè¿äºæ³¨è§£æ´è¯¦ç»çä¿¡æ¯,请åé
æ¤åçæè¿°.</para>
-
- </sect3>
-
- <sect3>
- <title>æ´å¤çéåç±»å</title>
-
- <para>æ¯EJB3æ´èä¸ç¹çæ¯,Hibernate Annotationsæ¯æçæ£ç
- <classname>List</classname>å<classname>Array</classname>.
- æ å°éåçæ¹å¼å以åå®å
¨ä¸æ ·,åªä¸è¿è¦æ°å¢<literal>@IndexColumn</literal>注解.
- 该注解å
è®¸ä½ ææåæ¾ç´¢å¼å¼çå段.ä½ è¿å¯ä»¥å®ä¹ä»£è¡¨æ°æ®åºä¸é¦ä¸ªå
ç´ çç´¢å¼å¼(亦称为索å¼åºæ°).
- 常è§åå¼ä¸º<literal>0</literal>æ<literal>1</literal>.</para>
-
- <programlisting>@OneToMany(cascade = CascadeType.ALL)
- at IndexColumn(name = "drawer_position", base=1)
-public List<Drawer> getDrawers() {
- return drawers;
-}</programlisting>
-
- <note>
- <para>åå¦ä½ å¿äºè®¾ç½®<literal>@IndexColumn</literal>,
- Hibernateä¼éç¨å
(bag)è¯ä¹(è¯æ³¨ï¼å³å
许éå¤å
ç´ çæ åºéå).</para>
- </note>
-
- <para>Hibernate注解æ¯ætrue Mapæ å°,
- å¦æ没æ设置<literal>@javax.persistence.MapKey</literal>,
- hibernateå°keyå
ç´ æåµå
¥å¼å¯¹è±¡ç´æ¥æ å°å°ä»ä»¬æå±çå.
- è¦è¦åé»è®¤çå,å¯ä»¥ä½¿ç¨ä»¥ä¸æ³¨è§£:
- <literal>@org.hibernate.annotations.MapKey</literal>éç¨çkey为åºæ¬ç±»åæè
åµå
¥å¼å¯¹è±¡,
- <literal>@org.hibernate.annotations.MapKey</literal>éç¨çkey为å®ä½.
- </para>
-
- <para>Hibernate Annotationsè¿æ¯ææ ¸å¿ç±»åéå(Integer, String, Enums, ......)ã
- å¯å
åµå¯¹è±¡çéå,çè³åºæ¬ç±»åæ°ç».è¿å°±æ¯æè°çå
ç´ éå.</para>
-
- <para>å
ç´ éåå¯ç¨@CollectionOfElementsæ¥æ³¨è§£(ä½ä¸º@OneToManyçæ¿ä»£).
- 为äºå®ä¹éå表(è¯æ³¨ï¼å³åæ¾éåå
ç´ ç表,ä¸ä¸é¢æå°ç主表对åº),è¦å¨å
³èå±æ§ä¸ä½¿ç¨@JoinTable注解,
- joinColumnså®ä¹äºä»ä¹å®ä½ä¸»è¡¨ä¸éå表ä¹é´çè¿æ¥å段(inverseJoincolumnæ¯æ æçä¸å
¶å¼åºä¸ºç©º).
- 对äºæ ¸å¿ç±»åçéåæåºæ¬ç±»åæ°ç»,ä½ å¯ä»¥å¨å
³èå±æ§ä¸ç¨<literal>@Column</literal>æ¥è¦çåæ¾å
ç´ å¼çå段çå®ä¹.
- ä½ è¿å¯ä»¥ç¨<literal>@AttributeOverride</literal>æ¥è¦çåæ¾å¯å
åµå¯¹è±¡çå段çå®ä¹.
- è¦è®¿é®éåå
ç´ ,éè¦å°è¯¥æ³¨è§£çnameå±æ§å¼è®¾ç½®ä¸º"element"("element"ç¨äºæ ¸å¿ç±»å,è"element.serial"
- ç¨äºåµå
¥å¼å¯¹è±¡çserialå±æ§).è¦è®¿é®éåçindex/key,åå°è¯¥æ³¨è§£çnameå±æ§å¼è®¾ç½®ä¸º"key".
- </para>
-
- <programlisting>@Entity
-public class Boy {
- private Integer id;
- private Set<String> nickNames = new HashSet<String>();
- private int[] favoriteNumbers;
- private Set<Toy> favoriteToys = new HashSet<Toy>();
- private Set<Character> characters = new HashSet<Character>();
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- <emphasis role="bold">@CollectionOfElements
- public Set<String></emphasis> getNickNames() {
- return nickNames;
- }
-
- <emphasis role="bold">@CollectionOfElements
- @JoinTable(
- table=@Table(name="BoyFavoriteNumbers"),
- joinColumns = @JoinColumn(name="BoyId")
- )
- @Column(name="favoriteNumber", nullable=false)</emphasis>
- @IndexColumn(name="nbr_index")
- public int[] getFavoriteNumbers() {
- return favoriteNumbers;
- }
-
- <emphasis role="bold">@CollectionOfElements
- @AttributeOverride( name="element.serial", column=@Column(name="serial_nbr") )</emphasis>
- public Set<Toy> getFavoriteToys() {
- return favoriteToys;
- }
-
- <emphasis role="bold">@CollectionOfElements
- public Set<Character></emphasis> getCharacters() {
- return characters;
- }
- ...
-}
-
-public enum Character {
- GENTLE,
- NORMAL,
- AGGRESSIVE,
- ATTENTIVE,
- VIOLENT,
- CRAFTY
-}
-
- at Embeddable
-public class Toy {
- public String name;
- public String serial;
- public Boy owner;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getSerial() {
- return serial;
- }
-
- public void setSerial(String serial) {
- this.serial = serial;
- }
-
- <emphasis role="bold">@Parent</emphasis>
- public Boy getOwner() {
- return owner;
- }
-
- public void setOwner(Boy owner) {
- this.owner = owner;
- }
-
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final Toy toy = (Toy) o;
-
- if ( !name.equals( toy.name ) ) return false;
- if ( !serial.equals( toy.serial ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = name.hashCode();
- result = 29 * result + serial.hashCode();
- return result;
- }
-}</programlisting>
-
- <para>
- å¨åµå
¥å¼å¯¹è±¡çéåä¸,å¯ä»¥ä½¿ç¨ <literal>@Parent</literal>注解åµå
¥å¼å¯¹è±¡çæå±æ§.
- 该å±æ§æå该åµå
¥å¼å¯¹è±¡æå±çéåå®ä½.</para>
-
- <note>
- <para>æ§ççHibernate Annotationsç¨<literal>@OneToMany</literal>æ¥æ è¯éåå
ç´ .
- ç±äºè¯ä¹çç¾,æ们å¼å
¥äº<literal>@CollectionOfElements</literal>注解.
- ç¨<literal>@OneToMany</literal>æ¥æ è¯éåå
ç´ çè¿ç§æ§ææ¹å¼ç®åå°ææ,
- ä½æ¯ä¸æ¨è使ç¨,èä¸å¨ä»¥åçåå¸çæ¬ä¸ä¸åæ¯æè¿ç§æ¹å¼.</para>
- </note>
- </sect3>
- </sect2>
-
- <sect2>
- <title>ç¼å</title>
-
- <para>为äºä¼åæ°æ®åºè®¿é®,ä½ å¯ä»¥æ¿æ´»æè°çHibernateäºçº§ç¼å.该ç¼åæ¯å¯ä»¥ææ¯ä¸ªå®ä½åéåè¿è¡é
ç½®ç.</para>
-
- <para><literal>@org.hibernate.annotations.Cache</literal>å®ä¹äºç¼åçç¥åç»å®çäºçº§ç¼åçèå´.
- æ¤æ³¨è§£éç¨äºæ ¹å®ä½(éåå®ä½),è¿æéå.</para>
-
- <programlisting>@Entity
- at Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
-public class Forest { ... }</programlisting>
-
- <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
- @JoinColumn(name="CUST_ID")
- @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
- public SortedSet<Ticket> getTickets() {
- return tickets;
- }</programlisting>
-
- <para></para>
-
- <programlistingco>
- <areaspec>
- <area coords="2 55" id="hm1" />
-
- <area coords="3 55" id="hm2" />
-
- <area coords="4 55" id="hm3" />
- </areaspec>
-
- <programlisting>@Cache(
- CacheConcurrencyStrategy usage();
- String region() default "";
- String include() default "all";
-)</programlisting>
-
- <calloutlist>
- <callout arearefs="hm1">
- <para>usage: ç»å®ç¼åç并åçç¥(NONE,
- READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL)</para>
- </callout>
-
- <callout arearefs="hm2">
- <para>region (å¯éç)ï¼ç¼åèå´(é»è®¤ä¸ºç±»çå
¨éå®ç±»åææ¯éåçå
¨éå®è§è²å)</para>
- </callout>
-
- <callout arearefs="hm3">
- <para><literal>include</literal> (å¯éç)ï¼å¼ä¸ºallæ¶å
æ¬äºææçå±æ§(proterty),
- 为non-lazyæ¶ä»
å«é延è¿å±æ§(é»è®¤å¼ä¸ºall)</para>
- </callout>
- </calloutlist>
-
- </programlistingco>
- </sect2>
-
- <sect2>
- <title>è¿æ»¤å¨</title>
-
- <para>Hibernateå
·ææ°æ®è¿æ»¤å¨çæ¦å¿µ,å¯å¨è¿è¡æåºç¨äºä¸ä¸ªç»å®çsession.è¿æ»¤å¨éè¦äºå
å®ä¹å¥½.</para>
-
- <para><literal>@org.hibernate.annotations.FilterDef</literal> æ
- <literal>@FilterDefs</literal> å®ä¹è¿æ»¤å¨å£°æ,为ååè¿æ»¤å¨æç¨.
- è¿æ»¤å¨å£°æ带æä¸ä¸ªname()åä¸ä¸ªparameters()æ°ç»,<literal>@ParamDef</literal>å
å«nameåtype,
- ä½ è¿å¯ä»¥ä¸ºç»å®ç<literal>@filterDef</literal>å®ä¹ä¸ä¸ªdefaultCondition()åæ°,
- å½<literal>@Filter</literal>ä¸æ²¡æä»»ä½å®ä¹æ¶,å¯ä½¿ç¨è¯¥åæ°å®ä¹ç¼ºçæ¡ä»¶.
- <literal>@FilterDef</literal> (s)å¯ä»¥å¨ç±»æå
ä¸çº§è¿è¡å®ä¹.</para>
-
- <para>ç°å¨æ们æ¥å®ä¹åºç¨äºå®ä½æéåå è½½æ¶çSQLè¿æ»¤å¨åå¥.æ们使ç¨<literal>@Filter</literal>,并å°å
¶ç½®äºå®ä½æéåå
ç´ ä¸.</para>
-
- <para><programlisting>@Entity
- at FilterDef(name="minLength", parameters={ @ParamDef( name="minLength", type="integer" ) } )
- at Filters( {
- @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"),
- @Filter(name="minLength", condition=":minLength <= length")
-} )
-public class Forest { ... }</programlisting></para>
- </sect2>
-
-
- <sect2>
- <title>æ¥è¯¢</title>
-
- <para>ç±äºHibernateå¼å
¥äº
- <literal>@org.hibernate.annotations.NamedQuery</literal>,
- <literal>@org.hibernate.annotations.NamedQueries</literal>,
- <literal>@org.hibernate.annotations.NamedNativeQuery</literal> å
- <literal>@org.hibernate.annotations.NamedNativeQueries</literal> å½åå¼æ¥è¯¢,
- å æ¤Hibernateå¨å½åå¼æ¥è¯¢ä¸æ¯EBJ3è§èä¸æå®ä¹çå½åå¼æ¥è¯¢æä¾äºæ´å¤çç¹æ§.
- ä»ä»¬å¨æ åçä¸æ·»å äºå¯ä½ä¸ºæ¿ä»£åçä¸äºå±æ§(attributes):</para>
-
- <itemizedlist>
- <listitem>
- <para>flushMode: å®ä¹æ¥è¯¢çå·æ°æ¨¡å¼(Always, Auto, CommitæNever)</para>
- </listitem>
-
- <listitem>
- <para>cacheable: æ¥è¯¢è¯¥ä¸è¯¥è¢«ç¼å</para>
- </listitem>
-
- <listitem>
- <para>cacheRegion: è¥æ¥è¯¢å·²è¢«ç¼åæ¶æç¨ç¼åçèå´</para>
- </listitem>
-
- <listitem>
- <para>fetchSize: é对该æ¥è¯¢çJDBC statementå次è·åè®°å½çæ°ç®</para>
- </listitem>
-
- <listitem>
- <para>timeout: æ¥è¯¢è¶
æ¶</para>
- </listitem>
-
- <listitem>
- <para>callable: ä»
ç¨äºæ¬å°åæ¥è¯¢(native query),对äºåå¨è¿ç¨è®¾ä¸ºtrue</para>
- </listitem>
-
- <listitem>
- <para>comment: ä¸æ¦æ¿æ´»æ³¨éåè½,æ们ä¼å¨åæ°æ®åºäº¤éæ¥è¯¢è¯·æ±æ¶çå°æ³¨é</para>
- </listitem>
-
- <listitem>
- <para>cacheMode: ç¼å交æ¤æ¨¡å¼(get, ignore,normal,ærefresh)</para>
- </listitem>
-
- <listitem>
- <para>readOnly: ä¸ç®¡æ¯å¦ä»æ¥è¯¢è·åå
ç´ é½æ¯å¨åªè¯»æ¨¡å¼ä¸</para>
- </listitem>
- </itemizedlist>
-
- <para>注æ,EJB3å·²å
¬å¼çæç»èæ¡ä¸å¼å
¥äº<literal>@QueryHint</literal>çæ¦å¿µ,
- è¿å¯è½æ¯å®ä¹hintsæ´å¥½çæ¹æ³.</para>
- </sect2>
- </sect1>
-
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/entity.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules/entity.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/entity.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/entity.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,2857 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="entity">
+ <title>å®ä½Bean</title>
+
+ <sect1 id="entity-overview" revision="1">
+ <title>ç®ä»</title>
+
+ <para>æ¬ç« å
容è¦çäºEJB3.0å®ä½beanç注解è§è以åHibernateç¹æçæ©å±.</para>
+ </sect1>
+
+ <sect1 id="mapping" revision="1">
+ <title>ç¨EJB3注解è¿è¡æ å°</title>
+
+ <para>ç°å¨EJB3å®ä½Beanæ¯çº¯ç²¹çPOJO.å®é
ä¸è¿è¡¨è¾¾äºåHibernateæä¹
åå®ä½å¯¹è±¡åæ ·çæ¦å¿µ.
+ å®ä»¬çæ å°é½éè¿JDK5.0注解æ¥å®ä¹(EJB3è§èä¸çXMLæè¿°è¯æ³è³ä»è¿æ²¡ææç»å®ä¸æ¥).
+ 注解å为两个é¨å,åå«æ¯é»è¾æ å°æ³¨è§£åç©çæ å°æ³¨è§£,
+ éè¿é»è¾æ å°æ³¨è§£å¯ä»¥æ述对象模å,ç±»ä¹é´çå
³ç³»çç,
+ èç©çæ å°æ³¨è§£åæè¿°äºç©ççschema,表,å,ç´¢å¼çç.
+ ä¸é¢æ们å¨ä»£ç ä¸å°æ··å使ç¨è¿ä¸¤ç§ç±»åç注解.</para>
+
+ <para>EJB3注解çAPIå®ä¹å¨<literal>javax.persistence.*</literal>å
éé¢.
+ 大é¨ååJDK5å
¼å®¹çIDE(象Eclipse, IntelliJ IDEA åNetbeansçç)é½æä¾äºæ³¨è§£æ¥å£åå±æ§çèªå¨å®æåè½.
+ (è¿äºä¸éè¦IDEæä¾ç¹å«çEJB3æ¯æ模å,å 为EJB3注解æ¯æ åçJDK5注解)</para>
+
+ <para>请é
读JBoss EJB 3.0æåæè
ç´æ¥é
读Hibernate Annotationsæµè¯ä»£ç 以è·åæ´å¤çå¯è¿è¡å®ä¾.Hibernate Annotationsæä¾ç大é¨ååå
æµè¯ä»£ç é½æ¼ç¤ºäºå®é
çä¾å,æ¯ä¸ä¸ªè·åçµæç好å°æ¹.</para>
+
+ <sect2>
+ <title>声æå®ä½bean</title>
+
+ <para>æ¯ä¸ä¸ªæä¹
åPOJOç±»é½æ¯ä¸ä¸ªå®ä½bean,è¿å¯ä»¥éè¿å¨ç±»çå®ä¹ä¸ä½¿ç¨<literal>@Entity</literal>注解æ¥è¿è¡å£°æ:</para>
+
+ <programlisting>
+ at Entity
+public class Flight implements Serializable {
+ Long id;
+
+ @Id
+ public Long getId() { return id; }
+
+ public void setId(Long id) { this.id = id; }
+}
+ </programlisting>
+
+ <para>éè¿<literal>@Entity</literal>注解å°ä¸ä¸ªç±»å£°æ为ä¸ä¸ªå®ä½bean(å³ä¸ä¸ªæä¹
åPOJOç±»),
+ <literal>@Id</literal>注解å声æäºè¯¥å®ä½beançæ è¯å±æ§.
+ å
¶ä»çæ å°å®ä¹æ¯éå¼ç.è¿ç§ä»¥éå¼æ å°ä¸ºä¸»ä½,以æ¾å¼æ å°ä¸ºä¾å¤çé
ç½®æ¹å¼å¨æ°çEJ3è§èä¸å¤äºé常éè¦çä½ç½®,
+ å以åççæ¬ç¸æ¯æäºè´¨çé£è·.
+ å¨ä¸é¢è¿æ®µä»£ç ä¸ï¼Flightç±»æ å°å°Flight表,并使ç¨idåä½ä¸ºä¸»é®å.
+ </para>
+
+ <para>å¨å¯¹ä¸ä¸ªç±»è¿è¡æ³¨è§£æ¶,ä½ å¯ä»¥éæ©å¯¹å®ççå±æ§æè
æ¹æ³è¿è¡æ³¨è§£,æ ¹æ®ä½ çéæ©,Hibernateç访é®ç±»ååå«ä¸º
+ <literal>field</literal>æ<literal>property</literal>.
+ EJ3è§èè¦æ±å¨éè¦è®¿é®çå
ç´ ä¸è¿è¡æ³¨è§£å£°æ,ä¾å¦,å¦æ访é®ç±»å为
+ <literal>property</literal>å°±è¦å¨getteræ¹æ³ä¸è¿è¡æ³¨è§£å£°æ,
+ å¦æ访é®ç±»å为 <literal>field</literal>å°±è¦å¨å段ä¸è¿è¡æ³¨è§£å£°æ.åºè¯¥å°½éé¿å
æ··å使ç¨è¿ä¸¤ç§è®¿é®ç±»å.
+ Hibernateæ ¹æ®<literal>@Id</literal> æ <literal>@EmbeddedId</literal>çä½ç½®æ¥å¤æ访é®ç±»å.</para>
+
+ <sect3>
+ <title>å®ä¹è¡¨(Table)</title>
+
+ <para><literal>@Table</literal>æ¯ç±»ä¸çº§ç注解,
+ éè¿<literal>@Table</literal>注解å¯ä»¥ä¸ºå®ä½beanæ å°æå®è¡¨(table),ç®å½(catalog)åschemaçåå.
+ å¦æ没æå®ä¹<literal>@Table</literal>,é£ä¹ç³»ç»èªå¨ä½¿ç¨é»è®¤å¼ï¼å®ä½ççç±»å(ä¸é带å
å).</para>
+
+ <programlisting>
+ at Entity
+ at Table(name="tbl_sky")
+public class Sky implements Serializable {
+...
+ </programlisting>
+
+ <para><literal>@Table</literal>å
ç´ å
æ¬äºä¸ä¸ª<literal>schema</literal>
+ åä¸ä¸ª <literal>catalog</literal>å±æ§,å¦æéè¦å¯ä»¥æå®ç¸åºçå¼.
+ ç»å使ç¨<literal>@UniqueConstraint</literal>注解å¯ä»¥å®ä¹è¡¨çå¯ä¸çº¦æ(unique constraint)
+ (对äºç»å®å°ååçå¯ä¸çº¦æ,请åè<literal>@Column</literal>注解)
+ </para>
+
+ <programlisting>@Table(name="tbl_sky",
+ <emphasis role="bold">uniqueConstraints = {@UniqueConstraint(columnNames={"month", "day"})}</emphasis>
+ )</programlisting>
+
+ <para>ä¸é¢è¿ä¸ªä¾åä¸,å¨monthådayè¿ä¸¤ä¸ªå段ä¸å®ä¹å¯ä¸çº¦æ.
+ 注æ<literal>columnNames</literal>æ°ç»ä¸çå¼æçæ¯é»è¾åå.</para>
+
+ <remark>Hibernateå¨NamingStrategyçå®ç°ä¸å®ä¹äºé»è¾åå.
+ é»è®¤çEJB3å½åçç¥å°ç©çå段åå½ä½é»è¾å段åæ¥ä½¿ç¨.
+ 注æ该å段ååå®å¯¹åºçå±æ§åå¯è½ä¸å(å¦æå段åæ¯æ¾å¼æå®çè¯).
+ é¤éä½ éåäºNamingStrategy,å¦åä¸ç¨æ
å¿è¿äºåºå«..</remark>
+ </sect3>
+
+ <sect3>
+ <title>ä¹è§éå®çæ¬æ§å¶</title>
+
+ <para>ä½ å¯ä»¥å¨å®ä½beanä¸ä½¿ç¨<literal>@Version</literal>注解,éè¿è¿ç§æ¹å¼å¯æ·»å 对ä¹è§éå®çæ¯æ:</para>
+
+ <programlisting>
+ at Entity
+public class Flight implements Serializable {
+...
+ @Version
+ @Column(name="OPTLOCK")
+ public Integer getVersion() { ... }
+} </programlisting>
+
+ <para>ä¸é¢è¿ä¸ªä¾åä¸,versionå±æ§å°æ å°å° <literal>OPTLOCK</literal>å,
+ entity manager使ç¨è¯¥å段æ¥æ£æµæ´æ°å²çª(é²æ¢æ´æ°ä¸¢å¤±,请åèlast-commit-winsçç¥).</para>
+
+ <para>æ ¹æ®EJB3è§è,versionåå¯ä»¥æ¯numericç±»å(æ¨èæ¹å¼)ä¹å¯ä»¥æ¯timestampç±»å.
+ Hibernateæ¯æä»»ä½èªå®ä¹ç±»å,åªè¦è¯¥ç±»åå®ç°äº<classname>UserVersionType</classname>.</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>æ å°ç®åå±æ§</title>
+
+ <sect3>
+ <title>声æåºæ¬çå±æ§æ å°</title>
+
+ <para>Every non static non transient property (field or method) of an
+ entity bean is considered persistent, unless you annotate it as
+ <literal>@Transient</literal>. Not having an annotation for your
+ property is equivalent to the appropriate <literal>@Basic</literal>
+ annotation. The <literal>@Basic</literal> annotation allows you to
+ declare the fetching strategy for a property:</para>
+
+ <para>å®ä½beanä¸ææçéstaticétransientçå±æ§é½å¯ä»¥è¢«æä¹
å,
+ é¤éä½ å°å
¶æ³¨è§£ä¸º<literal>@Transient</literal>.ææ没æå®ä¹æ³¨è§£çå±æ§çä»·äºå¨å
¶ä¸é¢æ·»å äº@Basic注解.
+ éè¿ <literal>@Basic</literal>注解å¯ä»¥å£°æå±æ§çè·åçç¥(fetch strategy)ï¼</para>
+
+ <programlisting>public transient int counter; //transient property
+
+private String firstname; //persistent property
+
+ at Transient
+String getLengthInMeter() { ... } //transient property
+
+String getName() {... } // persistent property
+
+ at Basic
+int getLength() { ... } // persistent property
+
+ at Basic(fetch = FetchType.LAZY)
+String getDetailedComment() { ... } // persistent property
+
+ at Temporal(TemporalType.TIME)
+java.util.Date getDepartureTime() { ... } // persistent property
+
+ at Enumerated(STRING)
+Starred getNote() { ... } //enum persisted as String in database</programlisting>
+
+ <para>ä¸é¢è¿ä¸ªä¾åä¸,<literal>counter</literal>æ¯ä¸ä¸ªtransientçå段,
+ <literal>lengthInMeter</literal>çgetteræ¹æ³è¢«æ³¨è§£ä¸º<literal>@Transient</literal>,
+ entity managerå°å¿½ç¥è¿äºå段åå±æ§.
+ è<literal>name</literal>,<literal>length</literal>,<literal>firstname</literal>
+ è¿å 个å±æ§åæ¯è¢«å®ä¹ä¸ºå¯æä¹
ååå¯è·åç.对äºç®åå±æ§æ¥è¯´,é»è®¤çè·åæ¹å¼æ¯å³æ¶è·å(early fetch).
+ å½ä¸ä¸ªå®ä½Beançå®ä¾è¢«å建æ¶,Hibernateä¼å°è¿äºå±æ§çå¼ä»æ°æ®åºä¸æååºæ¥,ä¿åå°Beançå±æ§é.
+ ä¸å³æ¶è·åç¸å¯¹åºçæ¯å»¶è¿è·å(lazy fetch).å¦æä¸ä¸ªå±æ§çè·åæ¹å¼æ¯å»¶è¿è·å
+ (æ¯å¦ä¸é¢ä¾åä¸ç<literal>detailedComment</literal>å±æ§),
+ Hibernateå¨å建ä¸ä¸ªå®ä½Beançå®ä¾æ¶,ä¸ä¼å³æ¶å°è¿ä¸ªå±æ§çå¼ä»æ°æ®åºä¸è¯»åº.
+ åªæå¨è¯¥å®ä½Beançè¿ä¸ªå±æ§ç¬¬ä¸æ¬¡è¢«è°ç¨æ¶,Hibernateæä¼å»è·å对åºçå¼.
+ éå¸¸ä½ ä¸éè¦å¯¹ç®åå±æ§è®¾ç½®å»¶è¿è·å(lazy simple property),åä¸ä¸è¦å延è¿å
³èè·å(lazy association fetch)æ··æ·äº
+ (è¯æ³¨:è¿éæä¸è¦ælazy simple propertyålazy association fetchæ··æ·äº).
+ </para>
+
+ <note>
+ <para>为äºå¯ç¨å±æ§çº§ç延è¿è·å,ä½ çç±»å¿
é¡»ç»è¿ç¹æ®å¤ç(instrumented)ï¼
+ åèç å°è¢«ç»å
¥åå§ç±»ä¸æ¥å®ç°å»¶è¿è·ååè½,
+ 详æ
åèHibernateåèææ¡£.å¦æä¸å¯¹ç±»æ件è¿è¡åèç ç¹æ®å¤ç,
+ é£ä¹å±æ§çº§ç延è¿è·åå°è¢«å¿½ç¥.</para>
+ </note>
+
+ <para>æ¨èçæ¿ä»£æ¹æ¡æ¯ä½¿ç¨EJB-QLæè
Criteriaæ¥è¯¢çæå½±(projection)åè½.</para>
+
+ <para>HibernateåEJB3é½æ¯æææåºæ¬ç±»åçå±æ§æ å°.
+ è¿äºåºæ¬ç±»åå
æ¬ææçJavaåºæ¬ç±»å,åå
¶åèªçwrapperç±»åserializableç±».
+ Hibernate Annotationsè¿æ¯æå°å
ç½®çæ举类åæ å°å°ä¸ä¸ªé¡ºåºå(ä¿åäºç¸åºçåºåå¼)
+ æä¸ä¸ªå符串类åçå(ä¿åç¸åºçå符串).é»è®¤æ¯ä¿åæ举çåºåå¼,
+ ä½æ¯ä½ å¯ä»¥éè¿<literal>@Enumerated</literal>注解æ¥è¿è¡è°æ´(è§ä¸é¢ä¾åä¸çnoteå±æ§).</para>
+
+ <para>å¨æ ¸å¿çJava APIä¸å¹¶æ²¡æå®ä¹æ¶é´ç²¾åº¦(temporal precision).
+ å æ¤å¤çæ¶é´ç±»åæ°æ®æ¶,ä½ è¿éè¦å®ä¹å°å
¶åå¨å¨æ°æ®åºä¸æé¢æç精度.
+ å¨æ°æ®åºä¸,表示æ¶é´ç±»åçæ°æ®æ<literal>DATE</literal>, <literal>TIME</literal>,
+ å <literal>TIMESTAMP</literal>ä¸ç§ç²¾åº¦(å³å纯çæ¥æ,æ¶é´,æè
两è
å
¼å¤).
+ å¯ä½¿ç¨<literal>@Temporal</literal>注解æ¥è°æ´ç²¾åº¦.</para>
+
+ <para><literal>@Lob</literal>注解表示å±æ§å°è¢«æä¹
å为Blobæè
Clobç±»å,
+ å
·ä½åå³äºå±æ§çç±»å,
+ <classname>java.sql.Clob</classname>,
+ <classname>Character[]</classname>,
+ <classname>char[]</classname> å
+ <classname>java.lang.String</classname>è¿äºç±»åçå±æ§é½è¢«æä¹
å为Clobç±»å,
+ è<classname>java.sql.Blob</classname>,
+ <classname>Byte[]</classname>,
+ <classname>byte[]</classname> å
+ serializableç±»åå被æä¹
å为Blobç±»å.</para>
+
+ <programlisting>
+ at Lob
+public String getFullText() {
+ return fullText;
+}
+
+ at Lob
+public byte[] getFullCode() {
+ return fullCode;
+}
+ </programlisting>
+
+ <para>å¦ææ个å±æ§å®ç°äº<classname>java.io.Serializable</classname>åæ¶ä¹ä¸æ¯åºæ¬ç±»å,
+ 并ä¸æ²¡æå¨è¯¥å±æ§ä¸ä½¿ç¨<literal>@Lob</literal>注解,
+ é£ä¹Hibernateå°ä½¿ç¨èªå¸¦ç<literal>serializable</literal>ç±»å.
+ </para>
+ </sect3>
+
+ <sect3>
+ <title>声æåå±æ§</title>
+
+ <para>ä½¿ç¨ <literal>@Column </literal>注解å¯å°å±æ§æ å°å°å.
+ 使ç¨è¯¥æ³¨è§£æ¥è¦çé»è®¤å¼(å
³äºé»è®¤å¼è¯·åèEJB3è§è).
+ å¨å±æ§çº§ä½¿ç¨è¯¥æ³¨è§£çæ¹å¼å¦ä¸ï¼</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>ä¸è¿è¡æ³¨è§£</para>
+ </listitem>
+
+ <listitem>
+ <para>å <literal>@Basic</literal>ä¸èµ·ä½¿ç¨</para>
+ </listitem>
+
+ <listitem>
+ <para>å <literal>@Version</literal>ä¸èµ·ä½¿ç¨</para>
+ </listitem>
+
+ <listitem>
+ <para>å <literal>@Lob</literal>ä¸èµ·ä½¿ç¨</para>
+ </listitem>
+
+ <listitem>
+ <para>å <literal>@Temporal</literal>ä¸èµ·ä½¿ç¨</para>
+ </listitem>
+
+ <listitem>
+ <para>å
+ <literal>@org.hibernate.annotations.CollectionOfElements</literal>ä¸èµ·ä½¿ç¨
+ (åªé对Hibernate )</para>
+ </listitem>
+ </itemizedlist>
+
+
+ <programlisting>
+ at Entity
+public class Flight implements Serializable {
+...
+ at Column(updatable = false, name = "flight_name", nullable = false, length=50)
+public String getName() { ... }
+ </programlisting>
+
+ <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>name</literal>å±æ§æ å°å°<literal>flight_name</literal>å.
+ 该å段ä¸å
许为空,é¿åº¦ä¸º50,并ä¸æ¯ä¸å¯æ´æ°ç(ä¹å°±æ¯å±æ§å¼æ¯ä¸åç).</para>
+
+ <para>ä¸é¢è¿äºæ³¨è§£å¯ä»¥è¢«åºç¨å°æ£è§å±æ§ä¸ä¾å¦<literal>@Id</literal> æ<literal>@Version</literal>å±æ§.</para>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="2 55" id="hm1" />
+
+ <area coords="3 55" id="hm2" />
+
+ <area coords="4 55" id="hm3" />
+
+ <area coords="5 55" id="hm4" />
+
+ <area coords="6 55" id="hm5" />
+
+ <area coords="7 55" id="hm6" />
+
+ <area coords="8 55" id="hm7" />
+
+ <area coords="9 55" id="hm8" />
+
+ <area coords="10 55" id="hm9" />
+
+ <area coords="11 55" id="hm10" />
+ </areaspec>
+
+ <programlisting>@Column(
+ name="columnName";
+ boolean unique() default false;
+ boolean nullable() default true;
+ boolean insertable() default true;
+ boolean updatable() default true;
+ String columnDefinition() default "";
+ String table() default "";
+ int length() default 255;
+ int precision() default 0; // decimal precision
+ int scale() default 0; // decimal scale</programlisting>
+
+ <calloutlist>
+ <callout arearefs="hm1">
+ <para><literal>name</literal> å¯é,åå(é»è®¤å¼æ¯å±æ§å)</para>
+ </callout>
+
+ <callout arearefs="hm2">
+ <para><literal>unique</literal> å¯é,æ¯å¦å¨è¯¥åä¸è®¾ç½®å¯ä¸çº¦æ(é»è®¤å¼false)</para>
+ </callout>
+
+ <callout arearefs="hm3">
+ <para><literal>nullable</literal> å¯é,æ¯å¦è®¾ç½®è¯¥åçå¼å¯ä»¥ä¸ºç©º(é»è®¤å¼false)</para>
+ </callout>
+
+ <callout arearefs="hm4">
+ <para><literal>insertable</literal> å¯é,该åæ¯å¦ä½ä¸ºçæçinsertè¯å¥ä¸çä¸ä¸ªå(é»è®¤å¼true)</para>
+ </callout>
+
+ <callout arearefs="hm5">
+ <para><literal>updatable</literal> å¯é,该åæ¯å¦ä½ä¸ºçæçupdateè¯å¥ä¸çä¸ä¸ªå(é»è®¤å¼true)</para>
+ </callout>
+
+ <callout arearefs="hm6">
+ <para><literal>columnDefinition</literal> å¯é: 为è¿ä¸ªç¹å®åè¦çSQL DDLç段 (è¿å¯è½å¯¼è´æ æ³å¨ä¸åæ°æ®åºé´ç§»æ¤)</para>
+ </callout>
+
+ <callout arearefs="hm7">
+ <para><literal>table</literal> å¯é,å®ä¹å¯¹åºç表(é»è®¤ä¸ºä¸»è¡¨)</para>
+ </callout>
+
+ <callout arearefs="hm8">
+ <para><literal><literal>length</literal></literal> å¯é,åé¿åº¦(é»è®¤å¼255)</para>
+ </callout>
+
+ <callout arearefs="hm8">
+ <para><literal><literal>precision</literal></literal>
+ å¯é,ååè¿å¶ç²¾åº¦(decimal precision)(é»è®¤å¼0)</para>
+ </callout>
+
+ <callout arearefs="hm10">
+ <para><literal><literal>scale</literal></literal>
+ å¯é,å¦æååè¿å¶æ°å¼èå´(decimal scale)å¯ç¨,å¨æ¤è®¾ç½®(é»è®¤å¼0)</para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+ </sect3>
+
+ <sect3>
+ <title>åµå
¥å¼å¯¹è±¡(ååç»ä»¶)</title>
+
+ <para>å¨å®ä½ä¸å¯ä»¥å®ä¹ä¸ä¸ªåµå
¥å¼ç»ä»¶(embedded component),
+ çè³è¦ç该å®ä½ä¸åæçåæ å°.
+ ç»ä»¶ç±»å¿
é¡»å¨ç±»ä¸çº§å®ä¹<literal>@Embeddable</literal>注解.
+ å¨ç¹å®çå®ä½çå
³èå±æ§ä¸ä½¿ç¨<literal>@Embedded</literal>å
+ <literal>@AttributeOverride</literal>注解å¯ä»¥è¦ç该å±æ§å¯¹åºçåµå
¥å¼å¯¹è±¡çåæ å°ï¼</para>
+
+ <programlisting>
+ at Entity
+public class Person implements Serializable {
+
+ // Persistent component using defaults
+ Address homeAddress;
+
+ @Embedded
+ @AttributeOverrides( {
+ @AttributeOverride(name="iso2", column = @Column(name="bornIso2") ),
+ @AttributeOverride(name="name", column = @Column(name="bornCountryName") )
+ } )
+ Country bornIn;
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Embeddable
+public class Address implements Serializable {
+ String city;
+ Country nationality; //no overriding here
+}
+ </programlisting>
+
+ <programlisting>
+ at Embeddable
+public class Country implements Serializable {
+ private String iso2;
+ @Column(name="countryName") private String name;
+
+ public String getIso2() { return iso2; }
+ public void setIso2(String iso2) { this.iso2 = iso2; }
+
+
+ public String getName() { return name; }
+ public void setName(String name) { this.name = name; }
+ ...
+}
+ </programlisting>
+
+ <para>åµå
¥å¼å¯¹è±¡ç»§æ¿å
¶æå±å®ä½ä¸å®ä¹ç访é®ç±»å
+ (注æ:è¿å¯ä»¥éè¿ä½¿ç¨Hibernateæä¾ç<literal>@AccessType</literal>注解æ¥è¦çåæå¼)(请åè <xref
+ linkend="entity-hibspec" />).</para>
+
+ <para>å¨ä¸é¢çä¾åä¸,å®ä½bean <literal>Person</literal> æ两个ç»ä»¶å±æ§,
+ åå«æ¯<literal>homeAddress</literal>å<literal>bornIn</literal>.
+ æ们å¯ä»¥çå°<literal>homeAddress</literal> å±æ§å¹¶æ²¡æ注解.
+ ä½æ¯Hibernateèªå¨æ£æµå
¶å¯¹åºçAddressç±»ä¸ç<literal>@Embeddable</literal>注解,
+ 并å°å
¶çä½ä¸ä¸ªæä¹
åç»ä»¶.对äºCountryä¸å·²æ å°çå±æ§,
+ å使ç¨<literal>@Embedded</literal>å<literal>@AttributeOverride
+ </literal>注解æ¥è¦çåæ¥æ å°çåå.
+ æ£å¦ä½ æçå°ç, <literal>Address</literal>对象ä¸è¿å
åµäº<literal>Country</literal>对象,
+ è¿éå<literal>homeAddress</literal>ä¸æ ·ä½¿ç¨äºHibernateåEJB3èªå¨æ£æµæºå¶.
+ ç®åEJB3è§èè¿ä¸æ¯æè¦çå¤å±åµå¥(å³åµå
¥å¼å¯¹è±¡ä¸è¿å
æ¬å
¶ä»åµå
¥å¼å¯¹è±¡)çåæ å°.
+ ä¸è¿Hibernateéè¿å¨è¡¨è¾¾å¼ä¸ä½¿ç¨"."符å·è¡¨è¾¾å¼æä¾äºå¯¹æ¤ç¹å¾çæ¯æ.</para>
+
+ <para><programlisting> @Embedded
+ @AttributeOverrides( {
+ @AttributeOverride(name="city", column = @Column(name="fld_city") )
+ @AttributeOverride(name="<emphasis role="bold">nationality.iso2</emphasis>", column = @Column(name="nat_Iso2") ),
+ @AttributeOverride(name="<emphasis role="bold">nationality.name</emphasis>", column = @Column(name="nat_CountryName") )
+ //nationality columns in homeAddress are overridden
+ } )
+ Address homeAddress;</programlisting>
+ Hibernate注解æ¯æå¾å¤EJB3è§èä¸æ²¡ææç¡®å®ä¹çç¹æ§.
+ ä¾å¦,å¯ä»¥å¨åµå
¥å¼å¯¹è±¡ä¸æ·»å <literal>@MappedSuperclass</literal>注解,
+ è¿æ ·å¯ä»¥å°å
¶ç¶ç±»çå±æ§æä¹
(详æ
请æ¥é
<literal>@MappedSuperclass</literal>).</para>
+
+ <para>Hibernateç°å¨æ¯æå¨åµå
¥å¼å¯¹è±¡ä¸ä½¿ç¨å
³è注解(å¦<literal>@*ToOne</literal>å<literal>@*ToMany</literal>).
+ èEJB3è§èå°ä¸æ¯æè¿æ ·çç¨æ³ãä½ å¯ä»¥ä½¿ç¨ <literal>@AssociationOverride</literal>注解æ¥è¦åå
³èå.</para>
+
+
+ <para>å¨åä¸ä¸ªå®ä½ä¸ä½¿ç¨ä¸¤ä¸ªåç±»åçåµå
¥å¯¹è±¡,
+ å
¶é»è®¤ååæ¯æ æç:è³å°è¦å¯¹å
¶ä¸ä¸ä¸ªè¿è¡æ确声æ.
+ Hibernateå¨è¿æ¹é¢èµ°å¨äºEJB3è§èçåé¢,
+ Hibernateæä¾äº<classname>NamingStrategy</classname>, å¨ä½¿ç¨Hibernateæ¶,
+ éè¿<classname>NamingStrategy</classname>ä½ å¯ä»¥å¯¹é»è®¤çæºå¶è¿è¡æ©å±.
+ <classname>DefaultComponentSafeNamingStrategy</classname>
+ å¨é»è®¤çEJB3NamingStrategyä¸è¿è¡äºå°å°çæå,
+ å
许å¨åä¸å®ä½ä¸ä½¿ç¨ä¸¤ä¸ªåç±»åçåµå
¥å¯¹è±¡èæ é¡»é¢å¤ç声æ.</para>
+
+ </sect3>
+
+ <sect3>
+ <title>æ 注解ä¹å±æ§çé»è®¤å¼</title>
+
+ <para>å¦ææå±æ§æ²¡æ注解,该å±æ§å°éµå®ä¸é¢çè§å:</para>
+
+ <itemizedlist>
+ <listitem>
+ å¦æå±æ§ä¸ºåä¸ç±»å,åæ å°ä¸º@Basic
+ </listitem>
+
+ <listitem>
+ å¦å,å¦æå±æ§å¯¹åºçç±»åå®ä¹äº@Embeddable注解,åæ å°ä¸º@Embedded
+ </listitem>
+
+ <listitem>
+ å¦å,å¦æå±æ§å¯¹åºçç±»åå®ç°äºSerializable,
+ åå±æ§è¢«æ å°ä¸º@Basic并å¨ä¸ä¸ªåä¸ä¿å该对象çserializedçæ¬
+ </listitem>
+
+ <listitem>
+ å¦å,å¦æ该å±æ§çç±»å为java.sql.Clob æ java.sql.Blob,åä½ä¸º@Lob并æ å°å°éå½çLobType.
+ </listitem>
+ </itemizedlist>
+
+ </sect3>
+ </sect2>
+
+ <sect2 id="mapping-identifier" label=""
+ xreflabel="Mapping identifier properties">
+ <title>æ å°ä¸»é®å±æ§</title>
+
+ <para>使ç¨<literal>@Id</literal>注解å¯ä»¥å°å®ä½beanä¸çæ个å±æ§å®ä¹ä¸ºæ è¯ç¬¦(identifier).
+ 该å±æ§çå¼å¯ä»¥éè¿åºç¨èªèº«è¿è¡è®¾ç½®,
+ ä¹å¯ä»¥éè¿Hiberanteçæ(æ¨è).
+ ä½¿ç¨ <literal>@GeneratedValue</literal>注解å¯ä»¥å®ä¹è¯¥æ è¯ç¬¦ççæçç¥:
+ </para>
+
+ <itemizedlist>
+ <listitem>
+ AUTO - å¯ä»¥æ¯identity columnç±»å,æè
sequenceç±»åæè
tableç±»å,åå³äºä¸åçåºå±æ°æ®åº.
+ </listitem>
+
+ <listitem>
+ TABLE - 使ç¨è¡¨ä¿åidå¼
+ </listitem>
+
+ <listitem>
+ IDENTITY - identity column
+ </listitem>
+
+ <listitem>
+ SEQUENCE - sequence
+ </listitem>
+ </itemizedlist>
+
+ <para>åEJB3è§èç¸æ¯,Hibernateæä¾äºæ´å¤çidçæå¨.详æ
请æ¥é
<xref linkend="entity-hibspec" /> .</para>
+
+
+ <para>ä¸é¢çä¾åå±ç¤ºäºä½¿ç¨SEQ_STOREé
ç½®çsequenceçæå¨</para>
+
+ <programlisting>
+ at Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
+public Integer getId() { ... }
+ </programlisting>
+
+ <para>ä¸é¢è¿ä¸ªä¾å使ç¨çæ¯identityçæå¨</para>
+
+ <programlisting>
+ at Id @GeneratedValue(strategy=GenerationType.IDENTITY)
+public Long getId() { ... }
+ </programlisting>
+
+ <para><literal>AUTO</literal>çæå¨éç¨äºå¯ç§»æ¤çåºç¨(å¨å¤ä¸ªDBé´åæ¢).
+ å¤ä¸ª<literal>@Id</literal>å¯ä»¥å
±äº«åä¸ä¸ªidentifierçæå¨,åªè¦ægeneratorå±æ§è®¾æç¸åçå¼å°±å¯ä»¥äº.
+ éè¿<literal>@SequenceGenerator</literal> å<literal>@TableGenerator</literal>,ä½ å¯ä»¥é
ç½®ä¸åçidentifierçæå¨.
+ æ¯ä¸ä¸ªidentifierçæå¨é½æèªå·±çéç¨èå´,å¯ä»¥æ¯åºç¨çº§(application level)åç±»ä¸çº§(class level).
+ ç±»ä¸çº§ççæå¨å¨å¤é¨æ¯ä¸å¯è§ç,
+ èä¸ç±»ä¸çº§ççæå¨å¯ä»¥è¦çåºç¨çº§ççæå¨.
+ åºç¨çº§ççæå¨åå®ä¹å¨å
ä¸çº§(package level)(å¦<classname>package-info.java</classname>):</para>
+
+ <programlisting>
+ at javax.persistence.TableGenerator(
+ name="EMP_GEN",
+ table="GENERATOR_TABLE",
+ pkColumnName = "key",
+ valueColumnName = "hi"
+ pkColumnValue="EMP",
+ allocationSize=20
+)
+ at javax.persistence.SequenceGenerator(
+ name="SEQ_GEN",
+ sequenceName="my_sequence"
+)
+package org.hibernate.test.metadata;
+ </programlisting>
+
+ <para>
+ å¦æå¨<classname>org.hibernate.test.metadata</classname>å
ä¸é¢ç
+ <classname>package-info.java</classname>æ件ç¨äºåå§åEJBé
ç½®,
+ é£ä¹è¯¥æ件ä¸å®ä¹ç <literal>EMP_GEN</literal>
+ å<literal>SEQ_GEN</literal>é½æ¯åºç¨çº§ççæå¨.
+ <literal>EMP_GEN</literal>å®ä¹äºä¸ä¸ªä½¿ç¨hiloç®æ³
+ (max_lo为20)çidçæå¨(该çæå¨å°idçä¿¡æ¯åå¨æ°æ®åºçæ个表ä¸.).
+ idçhiå¼ä¿åå¨<literal>GENERATOR_TABLE</literal>ä¸.
+ å¨è¯¥è¡¨ä¸ <literal>pkColumnName</literal>"key"çä»·äº
+ <literal>pkColumnValue</literal> "<literal>EMP</literal>",
+ è<literal>valueColumnName</literal> "<literal>hi</literal>"ä¸åå¨çæ¯ä¸ä¸ä¸ªè¦ä½¿ç¨çæ大å¼.
+ </para>
+
+ <para><literal>SEQ_GEN</literal>åå®ä¹äºä¸ä¸ªsequence çæå¨,
+ å
¶å¯¹åºçsequenceå为 <literal>my_sequence</literal>.
+ 注æç®åHibernate Annotationsè¿ä¸æ¯æsequence çæå¨ä¸ç
+ <literal>initialValue</literal>å <literal>allocationSize</literal>åæ°.</para>
+
+ <para>ä¸é¢è¿ä¸ªä¾åå±ç¤ºäºå®ä¹å¨ç±»èå´(class scope)çsequenceçæå¨:</para>
+
+ <programlisting>
+ at Entity
+ at javax.persistence.SequenceGenerator(
+ name="SEQ_STORE",
+ sequenceName="my_sequence"
+)
+public class Store implements Serializable {
+ private Long id;
+
+ @Id @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQ_STORE")
+ public Long getId() { return id; }
+}
+ </programlisting>
+
+ <para>å¨è¿ä¸ªä¾åä¸,Store类使ç¨å为my_sequenceçsequence,并ä¸SEQ_STORE çæå¨å¯¹äºå
¶ä»ç±»æ¯ä¸å¯è§ç.
+ 注æå¨org.hibernate.test.metadata.idå
ä¸çæµè¯ä»£ç ææ´å¤æ¼ç¤ºHibernate Annotationsç¨æ³çä¾å..</para>
+
+ <para>ä¸é¢æ¯å®ä¹ç»å主é®çå ç§è¯æ³:</para>
+
+ <itemizedlist>
+ <listitem>
+ å°ç»ä»¶ç±»æ³¨è§£ä¸º@Embeddable,并å°ç»ä»¶çå±æ§æ³¨è§£ä¸º@Id
+ </listitem>
+
+ <listitem>
+ å°ç»ä»¶çå±æ§æ³¨è§£ä¸º@EmbeddedId
+ </listitem>
+
+ <listitem>
+ å°ç±»æ³¨è§£ä¸º@IdClass,并å°è¯¥å®ä½ä¸ææå±äºä¸»é®çå±æ§é½æ³¨è§£ä¸º@Id
+ </listitem>
+ </itemizedlist>
+
+ <para>对äºEJB2çå¼å人åæ¥è¯´ <literal>@IdClass</literal>æ¯å¾å¸¸è§ç,
+ ä½æ¯å¯¹äºHibernateçç¨æ·æ¥è¯´å°±æ¯ä¸ä¸ªå´æ°çç¨æ³.
+ ç»å主é®ç±»å¯¹åºäºä¸ä¸ªå®ä½ç±»ä¸çå¤ä¸ªå段æå±æ§,
+ èä¸ä¸»é®ç±»ä¸ç¨äºå®ä¹ä¸»é®çå段æå±æ§å
+ å®ä½ç±»ä¸å¯¹åºçå段æå±æ§å¨ç±»åä¸å¿
é¡»ä¸è´.ä¸é¢æ们çä¸ä¸ªä¾å:</para>
+
+ <programlisting>@Entity
+<emphasis role="bold">@IdClass(FootballerPk.class)</emphasis>
+public class Footballer {
+ //part of the id key
+ <emphasis role="bold">@Id</emphasis> public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ //part of the id key
+ <emphasis role="bold">@Id</emphasis> public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public String getClub() {
+ return club;
+ }
+
+ public void setClub(String club) {
+ this.club = club;
+ }
+
+ //appropriate equals() and hashCode() implementation
+}
+
+ at Embeddable
+public class FootballerPk implements Serializable {
+ //same name and type as in Footballer
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ //same name and type as in Footballer
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ //appropriate equals() and hashCode() implementation
+}
+</programlisting>
+
+
+ <para>å¦ä¸, <literal>@IdClass</literal>æå对åºç主é®ç±».</para>
+
+ <para>Hibernateæ¯æå¨ç»åæ è¯ç¬¦ä¸å®ä¹å
³è(å°±å使ç¨æ®éç注解ä¸æ ·),èEJB3è§è并ä¸æ¯ææ¤ç±»ç¨æ³.
+ </para>
+
+ <programlisting>@Entity
+ at AssociationOverride( name="id.channel", joinColumns = @JoinColumn(name="chan_id") )
+public class TvMagazin {
+ @EmbeddedId public TvMagazinPk id;
+ @Temporal(TemporalType.TIME) Date time;
+}
+
+ at Embeddable
+public class TvMagazinPk implements Serializable {
+ @ManyToOne
+ public Channel channel;
+ public String name;
+ @ManyToOne
+ public Presenter presenter;
+}
+</programlisting>
+
+ </sect2>
+
+ <sect2>
+ <title>æ å°ç»§æ¿å
³ç³»</title>
+
+ <para>EJB3æ¯æä¸ç§ç±»åç继æ¿æ å°:</para>
+
+ <itemizedlist>
+ <listitem>
+ æ¯ä¸ªç±»ä¸å¼ 表(Table per class)çç¥: å¨Hibernateä¸å¯¹åº<union-class>å
ç´ :
+ </listitem>
+
+ <listitem>
+ æ¯ä¸ªç±»å±æ¬¡ç»æä¸å¼ 表(Single table per class hierarchy)çç¥:å¨Hibernateä¸å¯¹åº<subclass>å
ç´
+ </listitem>
+
+ <listitem>
+ è¿æ¥çåç±»(Joined subclasses)çç¥:å¨Hibernateä¸å¯¹åº <joined-subclass>å
ç´
+ </listitem>
+ </itemizedlist>
+
+ <para>
+ ä½ å¯ä»¥ç¨ <literal>@Inheritance</literal>注解æ¥å®ä¹æéæ©ççç¥.
+ è¿ä¸ªæ³¨è§£éè¦å¨æ¯ä¸ªç±»å±æ¬¡ç»æ(class hierarchy) æ顶端çå®ä½ç±»ä¸ä½¿ç¨.
+ </para>
+
+ <note>
+ <para>ç®åè¿ä¸æ¯æå¨æ¥å£ä¸è¿è¡æ³¨è§£.</para>
+ </note>
+
+ <sect3>
+ <title>æ¯ä¸ªç±»ä¸å¼ 表</title>
+
+ <para>
+ è¿ç§çç¥æå¾å¤ç¼ºç¹(ä¾å¦:å¤ææ¥è¯¢åå
³è),EJB3è§è, Hibernateåèæå,
+ Hibernate in Action,以åå
¶ä»è®¸å¤å°æ¹é½å¯¹æ¤è¿è¡äºæè¿°å解é.
+ Hibernate使ç¨<literal>SQL UNION</literal>æ¥è¯¢æ¥å®ç°è¿ç§çç¥.
+ é常使ç¨åºåæ¯å¨ä¸ä¸ªç»§æ¿å±æ¬¡ç»æç顶端:</para>
+
+ <programlisting>
+ at Entity
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Flight implements Serializable {
+ </programlisting>
+
+ <para>
+ è¿ç§çç¥æ¯æååçä¸å¯¹å¤å
³è.
+ è¿éä¸æ¯æ<literal>IDENTITY</literal>çæå¨çç¥,å 为idå¿
é¡»å¨å¤ä¸ªè¡¨é´å
񄧮.
+ å½ç¶,ä¸æ¦ä½¿ç¨è¿ç§çç¥å°±æå³çä½ ä¸è½ä½¿ç¨
+ <literal>AUTO </literal>çæå¨å<literal>IDENTITY</literal>çæå¨.
+ </para>
+ </sect3>
+
+ <sect3>
+ <title>æ¯ä¸ªç±»å±æ¬¡ç»æä¸å¼ 表</title>
+
+ <para>æ´ä¸ªç»§æ¿å±æ¬¡ç»æä¸çç¶ç±»ååç±»çææå±æ§é½æ å°å°åä¸ä¸ªè¡¨ä¸,
+ ä»ä»¬çå®ä¾éè¿ä¸ä¸ªè¾¨å«ç¬¦(discriminator)åæ¥åºå.:</para>
+
+ <programlisting>
+ at Entity
+ at Inheritance(strategy=InheritanceType.SINGLE_TABLE)
+ at DiscriminatorColumn(
+ name="planetype",
+ discriminatorType=DiscriminatorType.STRING
+)
+ at DiscriminatorValue("Plane")
+public class Plane { ... }
+
+ at Entity
+ at DiscriminatorValue("A320")
+public class A320 extends Plane { ... }
+ </programlisting>
+
+ <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,<classname>Plane</classname>æ¯ç¶ç±»,å¨è¿ä¸ªç±»éé¢å°ç»§æ¿çç¥å®ä¹ä¸º
+ <literal>InheritanceType.SINGLE_TABLE</literal>,并éè¿
+ <literal>@DiscriminatorColumn</literal>注解å®ä¹äºè¾¨å«ç¬¦å(è¿å¯ä»¥å®ä¹è¾¨å«ç¬¦çç±»å).
+ æå,对äºç»§æ¿å±æ¬¡ç»æä¸çæ¯ä¸ªç±»,<literal>@DiscriminatorValue</literal>注解æå®äºç¨æ¥è¾¨å«è¯¥ç±»çå¼.
+ 辨å«ç¬¦åçååé»è®¤ä¸º <literal>DTYPE</literal>,å
¶é»è®¤å¼ä¸ºå®ä½å(å¨<literal>@Entity.name</literal>ä¸å®ä¹)ï¼å
¶ç±»å
+ 为DiscriminatorType.STRING.
+ <classname>A320</classname>æ¯åç±»,å¦æä¸æ³ä½¿ç¨é»è®¤ç辨å«ç¬¦,åªéè¦æå®ç¸åºçå¼å³å¯.
+ å
¶ä»çå¦ç»§æ¿çç¥,辨å«æ å¿å段çç±»åé½æ¯èªå¨è®¾å®ç.</para>
+
+ <para><literal>@Inheritance</literal> å
+ <literal>@DiscriminatorColumn</literal> 注解åªè½ç¨äºå®ä½å±æ¬¡ç»æç顶端.</para>
+
+ </sect3>
+
+ <sect3>
+ <title>è¿æ¥çåç±»</title>
+
+ <para>å½æ¯ä¸ªåç±»æ å°å°ä¸ä¸ªè¡¨æ¶, <literal> @PrimaryKeyJoinColumn</literal>
+ å<literal>@PrimaryKeyJoinColumns</literal>
+ 注解å®ä¹äºæ¯ä¸ªå类表å
³èå°ç¶ç±»è¡¨ç主é®:</para>
+
+ <programlisting>
+ at Entity
+ at Inheritance(strategy=InheritanceType.JOINED)
+public class Boat implements Serializable { ... }
+
+ at Entity
+public class Ferry extends Boat { ... }
+
+ at Entity
+ at PrimaryKeyJoinColumn(name="BOAT_ID")
+public class AmericaCupClass extends Boat { ... }
+ </programlisting>
+
+ <para>以ä¸ææå®ä½é½ä½¿ç¨äº<literal>JOINED</literal>çç¥,
+ <literal>Ferry</literal>表å<literal>Boat</literal>表使ç¨ååç主é®.
+ è<literal>AmericaCupClass</literal>表å<literal>Boat</literal>表使ç¨äºæ¡ä»¶
+ <code>Boat.id = AmericaCupClass.BOAT_ID</code>è¿è¡å
³è.
+ </para>
+ </sect3>
+
+ <sect3>
+ <title>ä»ç¶ç±»ç»§æ¿çå±æ§</title>
+
+ <para>ææ¶åéè¿ä¸ä¸ª(ææ¯ä¸æä¸å¡ä¸)ç¶ç±»å
±äº«ä¸äºå
Œ
±å±æ§æ¯å¾æç¨ç,
+ åæ¶è¿ä¸ç¨å°è¯¥ç¶ç±»ä½ä¸ºæ å°çå®ä½(ä¹å°±æ¯è¯¥å®ä½æ²¡æ对åºç表).
+ è¿ä¸ªæ¶åä½ éè¦ä½¿ç¨<literal>@MappedSuperclass</literal>注解æ¥è¿è¡æ å°.</para>
+
+ <programlisting>@MappedSuperclass
+public class BaseEntity {
+ @Basic
+ @Temporal(TemporalType.TIMESTAMP)
+ public Date getLastUpdate() { ... }
+ public String getLastUpdater() { ... }
+ ...
+}
+
+ at Entity class Order extends BaseEntity {
+ @Id public Integer getId() { ... }
+ ...
+}</programlisting>
+
+ <para>å¨æ°æ®åºä¸,ä¸é¢è¿ä¸ªä¾åä¸ç继æ¿çå±æ¬¡ç»ææç»ä»¥<literal>Order</literal>表çå½¢å¼åºç°,
+ 该表æ¥æ<literal>id</literal>, <literal>lastUpdate</literal> å
+ <literal>lastUpdater</literal>ä¸ä¸ªå.ç¶ç±»ä¸çå±æ§æ å°å°å¤å¶å°å
¶åç±»å®ä½.
+ 注æè¿ç§æ
åµä¸çç¶ç±»ä¸åå¤å¨ç»§æ¿å±æ¬¡ç»æç顶端.</para>
+
+ <note>
+
+ <para>注æ,没æ注解为<literal>@MappedSuperclass</literal>çç¶ç±»ä¸çå±æ§å°è¢«å¿½ç¥.</para>
+ </note>
+
+ <note>
+
+ <para>é¤éæ¾å¼ä½¿ç¨Hibernate annotationä¸ç<literal>@AccessType</literal>注解,
+ å¦åå°ä»ç»§æ¿å±æ¬¡ç»æçæ ¹å®ä½ä¸ç»§æ¿è®¿é®ç±»å(å
æ¬å段ææ¹æ³)</para>
+ </note>
+
+ <note>
+
+ <para>è¿å¯¹äº<literal>@Embeddable</literal>对象çç¶ç±»ä¸çå±æ§æä¹
ååæ ·ææ.
+ åªéè¦ä½¿ç¨<literal>@MappedSuperclass</literal>注解å³å¯
+ (è½ç¶è¿ç§æ¹å¼ä¸ä¼çº³å
¥EJB3æ å)</para>
+
+ </note>
+
+ <note>
+
+ <para>å¯ä»¥å°å¤å¨å¨æ å°ç»§æ¿å±æ¬¡ç»æçä¸é´ä½ç½®ç类注解为<literal>@MappedSuperclass</literal>.</para>
+ </note>
+
+ <note>
+
+ <para>å¨ç»§æ¿å±æ¬¡ç»æä¸ä»»ä½æ²¡æ被注解为<literal>@MappedSuperclass</literal>
+ æ<literal>@Entity</literal>çç±»é½å°è¢«å¿½ç¥.</para>
+ </note>
+
+ <para>
+ ä½ å¯ä»¥éè¿ <literal>@AttributeOverride</literal>注解è¦çå®ä½ç¶ç±»ä¸çå®ä¹çå.
+ è¿ä¸ªæ³¨è§£åªè½å¨ç»§æ¿å±æ¬¡ç»æç顶端使ç¨.</para>
+
+ <programlisting>@MappedSuperclass
+public class FlyingObject implements Serializable {
+
+ public int getAltitude() {
+ return altitude;
+ }
+
+ @Transient
+ public int getMetricAltitude() {
+ return metricAltitude;
+ }
+
+ @ManyToOne
+ public PropulsionType getPropulsion() {
+ return metricAltitude;
+ }
+ ...
+}
+
+ at Entity
+ at AttributeOverride( name="altitude", column = @Column(name="fld_altitude") )
+ at AssociationOverride( name="propulsion", joinColumns = @JoinColumn(name="fld_propulsion_fk") )
+public class Plane extends FlyingObject {
+ ...
+}</programlisting>
+
+ <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>altitude</literal>å±æ§çå¼æç»å°æä¹
åå°<literal>Plane</literal>
+ 表ç<literal>fld_altitude</literal>å.èå为propulsionçå
³èåä¿åå¨<literal>fld_propulsion_fk</literal>å¤é´å.</para>
+
+ <para>ä½ å¯ä»¥ä¸º<literal>@Entity</literal>å<literal>@MappedSuperclass</literal>注解çç±»
+ 以åé£äºå¯¹è±¡ä¸º<literal>@Embeddable</literal>çå±æ§å®ä¹
+ <literal>@AttributeOverride</literal>å<literal>@AssociationOverride</literal>.</para>
+
+ </sect3>
+ </sect2>
+
+ <sect2 id="entity-mapping-association">
+ <title>æ å°å®ä½Beançå
³èå
³ç³»</title>
+
+ <sect3>
+ <title>ä¸å¯¹ä¸(One-to-one)</title>
+
+ <para>使ç¨<literal>@OneToOne</literal>注解å¯ä»¥å»ºç«å®ä½beanä¹é´çä¸å¯¹ä¸çå
³è.
+ ä¸å¯¹ä¸å
³èæä¸ç§æ
åµï¼
+ ä¸æ¯å
³èçå®ä½é½å
±äº«åæ ·ç主é®,
+ äºæ¯å
¶ä¸ä¸ä¸ªå®ä½éè¿å¤é®å
³èå°å¦ä¸ä¸ªå®ä½ç主é®
+ (注æè¦æ¨¡æä¸å¯¹ä¸å
³èå¿
é¡»å¨å¤é®åä¸æ·»å å¯ä¸çº¦æ).
+ ä¸æ¯éè¿å
³è表æ¥ä¿å两个å®ä½ä¹é´çè¿æ¥å
³ç³»
+ (注æè¦æ¨¡æä¸å¯¹ä¸å
³èå¿
é¡»å¨æ¯ä¸ä¸ªå¤é®ä¸æ·»å å¯ä¸çº¦æ).</para>
+
+ <para>é¦å
,æ们éè¿å
±äº«ä¸»é®æ¥è¿è¡ä¸å¯¹ä¸å
³èæ å°:</para>
+
+ <programlisting>
+ at Entity
+public class Body {
+ @Id
+ public Long getId() { return id; }
+
+ @OneToOne(cascade = CascadeType.ALL)
+ @PrimaryKeyJoinColumn
+ public Heart getHeart() {
+ return heart;
+ }
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Entity
+public class Heart {
+ @Id
+ public Long getId() { ...}
+}
+ </programlisting>
+
+ <para>ä¸é¢çä¾åéè¿ä½¿ç¨æ³¨è§£<literal>@PrimaryKeyJoinColumn</literal>å®ä¹äºä¸å¯¹ä¸å
³è.</para>
+
+ <para>ä¸é¢è¿ä¸ªä¾å使ç¨å¤é®åè¿è¡å®ä½çå
³è.</para>
+
+ <programlisting>
+ at Entity
+public class Customer implements Serializable {
+ @OneToOne(cascade = CascadeType.ALL)
+ <emphasis role="bold">@JoinColumn(name="passport_fk")</emphasis>
+ public Passport getPassport() {
+ ...
+ }
+
+ at Entity
+public class Passport implements Serializable {
+ @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
+ public Customer getOwner() {
+ ...
+}
+ </programlisting>
+
+ <para>ä¸é¢è¿ä¸ªä¾åä¸,<classname>Customer</classname> éè¿<literal>Customer</literal>
+ 表ä¸å为ç<literal>passport_fk</literal> å¤é®åå <classname>Passport</classname>å
³è.
+ <literal>@JoinColumn</literal>注解å®ä¹äºèæ¥å(join column).
+ 该注解å<literal>@Column</literal>注解æç¹ç±»ä¼¼,
+ ä½æ¯å¤äºä¸ä¸ªå为<literal>referencedColumnName</literal>çåæ°.
+ 该åæ°å®ä¹äºæå
³èç®æ å®ä½ä¸çèæ¥å.
+ 注æ,å½<literal><literal>referencedColumnName</literal></literal>å
³èå°é主é®åçæ¶å,
+ å
³èçç®æ ç±»å¿
é¡»å®ç°<classname>Serializable</classname>,
+ è¿è¦æ³¨æçæ¯ææ å°çå±æ§å¯¹åºå个å(å¦åæ å°æ æ).
+ </para>
+
+ <para>ä¸å¯¹ä¸å
³èå¯è½æ¯ååç.å¨ååå
³èä¸,
+ æä¸ä»
æä¸ç«¯æ¯ä½ä¸ºä¸»ä½(owner)端åå¨çï¼ä¸»ä½ç«¯è´è´£ç»´æ¤èæ¥å(å³æ´æ°).
+ 对äºä¸éè¦ç»´æ¤è¿ç§å
³ç³»çä»è¡¨åéè¿mappedByå±æ§è¿è¡å£°æ.
+ <literal>mappedBy</literal>çå¼æå主ä½çå
³èå±æ§.
+ å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>mappedBy</literal>çå¼ä¸º <literal>passport</literal>.
+ æå,ä¸å¿
ä¹ä¸è½åå¨è¢«å
³è端(owned side)å®ä¹èæ¥åäº,å 为已ç»å¨ä¸»ä½ç«¯è¿è¡äºå£°æ.</para>
+
+ <para>å¦æå¨ä¸»ä½æ²¡æ声æ<literal>@JoinColumn</literal>,ç³»ç»èªå¨è¿è¡å¤çï¼
+ å¨ä¸»è¡¨(owner table)ä¸å°å建èæ¥å,
+ åå为ï¼ä¸»ä½çå
³èå±æ§åï¼ä¸å线ï¼è¢«å
³è端ç主é®åå.
+ å¨ä¸é¢è¿ä¸ªä¾åä¸æ¯<literal>passport_id</literal>,
+ å 为<literal>Customer</literal>ä¸å
³èå±æ§å为<literal>passport</literal>,
+ <literal>Passport</literal>ç主é®æ¯<literal>id</literal>.</para>
+
+ <para>The third possibility (using an association table) is very
+ exotic.</para>
+
+ <para>第ä¸ç§æ¹å¼ä¹è®¸æ¯æå¦ç±»ç(éè¿å
³è表).</para>
+
+ <programlisting>
+ at Entity
+public class Customer implements Serializable {
+ @OneToOne(cascade = CascadeType.ALL)
+ <emphasis role="bold">@JoinTable(name = "CustomerPassports"
+ joinColumns = @JoinColumn(name="customer_fk"),
+ inverseJoinColumns = @JoinColumns(name="passport_fk")</emphasis>
+ )
+ public Passport getPassport() {
+ ...
+ }
+
+ at Entity
+public class Passport implements Serializable {
+ @OneToOne(<emphasis role="bold">mappedBy = "passport"</emphasis>)
+ public Customer getOwner() {
+ ...
+}
+ </programlisting>
+
+ <para><classname>Customer</classname>éè¿å为 <literal>CustomerPassports</literal>çå
³è表å
+ <classname>Passport</classname>å
³è; 该å
³è表æ¥æå为<literal>passport_fk</literal>çå¤é®å,该
+ å¤é®æå<literal>Passport</literal>表,该信æ¯å®ä¹ä¸º<literal>inverseJoinColumn</literal>çå±æ§å¼,
+ è<literal>customer_fk</literal>å¤é®åæå<literal>Customer</literal>表,
+ 该信æ¯å®ä¹ä¸º <literal>joinColumns</literal>çå±æ§å¼.</para>
+
+ <para>è¿ç§å
³èå¯è½æ¯ååç.å¨ååå
³èä¸,
+ æä¸ä»
æä¸ç«¯æ¯ä½ä¸ºä¸»ä½ç«¯åå¨çï¼ä¸»ä½ç«¯è´è´£ç»´æ¤èæ¥å(å³æ´æ°).
+ 对äºä¸éè¦ç»´æ¤è¿ç§å
³ç³»çä»è¡¨åéè¿mappedByå±æ§è¿è¡å£°æ.
+ <literal>mappedBy</literal>çå¼æå主ä½çå
³èå±æ§.
+ å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>mappedBy</literal>çå¼ä¸º <literal>passport</literal>.
+ æå,ä¸å¿
ä¹ä¸è½åå¨è¢«å
³è端(owned side)å®ä¹èæ¥åäº,å 为已ç»å¨ä¸»ä½ç«¯è¿è¡äºå£°æ.</para>
+
+ <para>ä½ å¿
é¡»æç¡®å®ä¹å
³è表ååå
³èåå.</para>
+
+ </sect3>
+
+ <sect3>
+ <title>å¤å¯¹ä¸(Many-to-one)</title>
+
+ <para>å¨å®ä½å±æ§ä¸çº§ä½¿ç¨<literal>@ManyToOne</literal>注解æ¥å®ä¹å¤å¯¹ä¸å
³è:</para>
+
+ <programlisting>
+ at Entity()
+public class Flight implements Serializable {
+ <emphasis role="bold">@ManyToOne</emphasis>( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
+ @JoinColumn(name="COMP_ID")
+ public Company getCompany() {
+ return company;
+ }
+ ...
+}
+ </programlisting>
+
+ <para>å
¶ä¸<literal>@JoinColumn</literal>æ¯å¯éç,å
³èå段é»è®¤å¼åä¸å¯¹ä¸
+ (one to one)å
³èçæ
åµç¸ä¼¼,
+ åå为ï¼ä¸»ä½çå
³èå±æ§åï¼ä¸å线ï¼è¢«å
³è端ç主é®åå.
+ å¨è¿ä¸ªä¾åä¸æ¯<literal>company_id</literal>,
+ å 为å
³èçå±æ§æ¯<literal>company</literal>,
+ <literal>Company</literal>ç主é®æ¯<literal>id</literal>.</para>
+
+ <para><literal>@ManyToOne</literal>注解æä¸ä¸ªå为<literal>targetEntity</literal>çåæ°,
+ 该åæ°å®ä¹äºç®æ å®ä½å.é常ä¸éè¦å®ä¹è¯¥åæ°,
+ å 为å¨å¤§é¨åæ
åµä¸é»è®¤å¼(表示å
³èå
³ç³»çå±æ§ç±»å)å°±å¯ä»¥å¾å¥½ç满足è¦æ±äº.
+ ä¸è¿ä¸é¢è¿ç§æ
åµä¸è¿ä¸ªåæ°å°±æ¾å¾ææä¹äºï¼ä½¿ç¨æ¥å£ä½ä¸ºè¿åå¼èä¸æ¯å¸¸è§çå®ä½.</para>
+
+ <programlisting>
+ at Entity()
+public class Flight implements Serializable {
+ @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE}, <emphasis
+ role="bold">targetEntity=CompanyImpl.class</emphasis> )
+ @JoinColumn(name="COMP_ID")
+ public Company getCompany() {
+ return company;
+ }
+ ...
+}
+
+public interface Company {
+ ...
+ </programlisting>
+
+ <para>对äºå¤å¯¹ä¸ä¹å¯ä»¥éè¿å
³è表çæ¹å¼æ¥æ å°ã
+ éè¿<literal>@JoinTable</literal>注解å¯å®ä¹å
³è表ï¼
+ 该å
³è表å
å«äºæåå®ä½è¡¨çå¤é®(éè¿<literal>@JoinTable.joinColumns</literal>)
+ 以åæåç®æ å®ä½è¡¨çå¤é®(éè¿<literal>@JoinTable.inverseJoinColumns</literal>).</para>
+
+ <programlisting>
+ at Entity()
+public class Flight implements Serializable {
+ @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
+ <emphasis role="bold">@JoinTable(name="Flight_Company",
+ joinColumns = @JoinColumn(name="FLIGHT_ID"),
+ inverseJoinColumns = @JoinColumns(name="COMP_ID")
+ )</emphasis>
+ public Company getCompany() {
+ return company;
+ }
+ ...
+}
+ </programlisting>
+ </sect3>
+
+ <sect3 id="entity-mapping-association-collections">
+ <title>éåç±»å</title>
+
+ <sect4>
+ <title>æ¦åµ</title>
+
+ <para>ä½ å¯ä»¥å¯¹ <classname>Collection </classname>,<literal>List</literal>
+ (ææåºå表, èä¸æ¯ç´¢å¼å表),
+ <literal>Map</literal>å<classname>Set</classname>è¿å ç§ç±»åè¿è¡æ å°.
+ EJB3è§èå®ä¹äºæä¹æ ·ä½¿ç¨<literal>@javax.persistence.OrderBy</literal>
+ 注解æ¥å¯¹æåºå表è¿è¡æ å°ï¼
+ 该注解æ¥åçåæ°æ ¼å¼ï¼ç¨éå·éå¼ç(ç®æ å®ä½)å±æ§ååæåºæ令,
+ å¦<code>firstname asc, age desc</code>,å¦æ该åæ°ä¸ºç©º,åé»è®¤ä»¥id对该éåè¿è¡æåº.
+ å¦ææ个éåå¨æ°æ®åºä¸å¯¹åºä¸ä¸ªå
³è表(association table)çè¯,ä½ ä¸è½å¨è¿ä¸ªéåå±æ§ä¸é¢ä½¿ç¨@OrderBy注解.
+ 对äºè¿ç§æ
åµçå¤çæ¹æ³,请åè<xref linkend="entity-hibspec" />.
+ EJB3 å
è®¸ä½ å©ç¨ç®æ å®ä½çä¸ä¸ªå±æ§ä½ä¸ºMapçkey,
+ è¿ä¸ªå±æ§å¯ä»¥ç¨<literal>@MapKey(name="myProperty")</literal>æ¥å£°æ.
+ å¦æ使ç¨<literal>@MapKey</literal>注解çæ¶åä¸æä¾å±æ§å,
+ ç³»ç»é»è®¤ä½¿ç¨ç®æ å®ä½ç主é®.
+ mapçkey使ç¨åå±æ§ç¸åçåï¼ä¸éè¦ä¸ºmap keyå®ä¹ä¸ç¨çåï¼å 为map keyå®é
ä¸å°±è¡¨è¾¾äºä¸ä¸ªç®æ å±æ§ã
+ 注æä¸æ¦å è½½,keyä¸ååå±æ§ä¿æåæ¥,
+ ä¹å°±æ¯è¯´,å¦æä½ æ¹åäºè¯¥å±æ§çå¼,å¨ä½ çJava模åä¸çkeyä¸ä¼èªå¨æ´æ°
+ (请åè<xref linkend="entity-hibspec" />).
+ å¾å¤äººè¢«<literal><map></literal>å<literal>@MapKey</literal>å¼ç³æ¶äºã
+ å
¶ä»å®ä»¬æ两ç¹åºå«.<literal>@MapKey</literal>ç®åè¿æä¸äºéå¶,详æ
请æ¥ç论åæè
+ æ们çJIRA缺é·ç³»ç»ã
+
+
+ 注æä¸æ¦å è½½,keyä¸ååå±æ§ä¿æåæ¥,
+ ä¹å°±æ¯è¯´,å¦æä½ æ¹åäºè¯¥å±æ§çå¼,å¨ä½ çJava模åä¸çkeyä¸ä¼èªå¨æ´æ°.
+ (Hibernate 3ä¸Mapæ¯æçæ¹å¼å¨å½åçåå¸çä¸è¿æªå¾å°æ¯æ).</para>
+
+ <para>Hibernateå°éåå以ä¸å ç±».</para>
+
+ <para></para>
+
+ <table>
+ <title>éåè¯ä¹</title>
+
+ <tgroup cols="3">
+ <colspec colname="c1" />
+
+ <colspec colname="c2" />
+
+ <colspec colname="c3" colnum="2" />
+
+ <thead>
+ <row>
+ <entry>è¯ä¹</entry>
+
+ <entry>Javaå®ç°ç±»</entry>
+
+ <entry> 注解</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>Bag è¯ä¹</entry>
+
+ <entry>java.util.List, java.util.Collection</entry>
+
+ <entry>@org.hibernate.annotations.CollectionOfElements æ
+ @OneToMany æ @ManyToMany</entry>
+ </row>
+
+ <row>
+ <entry>List è¯ä¹</entry>
+
+ <entry>java.util.List</entry>
+
+ <entry>(@org.hibernate.annotations.CollectionOfElements æ
+ @OneToMany æ @ManyToMany)
+ 以å
+ @org.hibernate.annotations.IndexColumn</entry>
+ </row>
+
+ <row>
+ <entry>Set è¯ä¹</entry>
+
+ <entry>java.util.Set</entry>
+
+ <entry>@org.hibernate.annotations.CollectionOfElements æ
+ @OneToMany æ @ManyToMany</entry>
+ </row>
+
+ <row>
+ <entry>Map è¯ä¹</entry>
+
+ <entry>java.util.Map</entry>
+
+ <entry>(@org.hibernate.annotations.CollectionOfElements æ
+ @OneToMany æ @ManyToMany)
+ 以å
+ (空
+ æ
+ @org.hibernate.annotations.MapKey/MapKeyManyToMany(æ¯æçæ£çmap),
+ æ
+ @javax.persistence.MapKey</entry>
+
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <remark>
+ ä»ä¸é¢å¯ä»¥æç¡®å°çå°,没æ@org.hibernate.annotations.IndexColumn
+ 注解çjava.util.Listéåå°è¢«çä½bagç±».
+ </remark>
+
+ <para>EJB3è§èä¸æ¯æåå§ç±»å,æ ¸å¿ç±»å,åµå
¥å¼å¯¹è±¡çéå.ä½æ¯Hibernate对æ¤æä¾äºæ¯æ
+ (详æ
åè <xref linkend="entity-hibspec" />).</para>
+
+ <programlisting>@Entity public class City {
+ @OneToMany(mappedBy="city")
+ <emphasis role="bold">@OrderBy("streetName")</emphasis>
+ public List<Street> getStreets() {
+ return streets;
+ }
+...
+}
+
+ at Entity public class Street {
+ <emphasis role="bold">public String getStreetName()</emphasis> {
+ return streetName;
+ }
+
+ @ManyToOne
+ public City getCity() {
+ return city;
+ }
+ ...
+}
+
+
+ at Entity
+public class Software {
+ @OneToMany(mappedBy="software")
+ <emphasis role="bold">@MapKey(name="codeName")</emphasis>
+ public Map<String, Version> getVersions() {
+ return versions;
+ }
+...
+}
+
+ at Entity
+ at Table(name="tbl_version")
+public class Version {
+ <emphasis role="bold">public String getCodeName()</emphasis> {...}
+
+ @ManyToOne
+ public Software getSoftware() { ... }
+...
+}</programlisting>
+
+ <para>ä¸é¢è¿ä¸ªä¾åä¸,<literal>City</literal>
+ ä¸å
æ¬äºä»¥<literal>streetName</literal>æåºç<literal>Street</literal>çéå.
+ è<literal>Software</literal>ä¸å
æ¬äºä»¥<literal>codeName</literal>ä½ä¸º
+ keyå以<literal>Version</literal>ä½ä¸ºå¼çMap.</para>
+
+ <para>é¤ééå为genericç±»å,å¦åä½ éè¦æå®<literal>targetEntity</literal>.
+ è¿ä¸ªæ³¨è§£å±æ§æ¥åçåæ°ä¸ºç®æ å®ä½çclass.</para>
+ </sect4>
+
+ <sect4 id="entity-mapping-association-collection-onetomany"
+ revision="2">
+ <title>ä¸å¯¹å¤(One-to-many)</title>
+
+ <para>å¨å±æ§çº§ä½¿ç¨ <literal>@OneToMany</literal>注解å¯å®ä¹ä¸å¯¹å¤å
³è.ä¸å¯¹å¤å
³èå¯ä»¥æ¯ååå
³è.</para>
+
+ <sect5>
+ <title>åå(Bidirectional)</title>
+
+ <para>å¨EJB3è§èä¸å¤å¯¹ä¸è¿ç«¯å ä¹æ»æ¯ååå
³èä¸ç主ä½(owner)端,
+ èä¸å¯¹å¤è¿ç«¯çå
³è注解为<literal>@OneToMany( mappedBy=...
+ )</literal></para>
+
+ <programlisting>@Entity
+public class Troop {
+ @OneToMany(mappedBy="troop")
+ public Set<Soldier> getSoldiers() {
+ ...
+}
+
+ at Entity
+public class Soldier {
+ @ManyToOne
+ @JoinColumn(name="troop_fk")
+ public Troop getTroop() {
+ ...
+} </programlisting>
+
+ <para><classname>Troop</classname> éè¿<literal>troop</literal>
+ å±æ§å<literal>Soldier</literal>建ç«äºä¸å¯¹å¤çååå
³è.
+ å¨<literal>mappedBy</literal>端ä¸å¿
ä¹ä¸è½åå®ä¹ä»»ä½ç©çæ å°</para>
+
+ <para>对äºä¸å¯¹å¤çååæ å°,å¦æè¦ä¸å¯¹å¤è¿ä¸ç«¯ç»´æ¤å
³èå
³ç³»,
+ ä½ éè¦å é¤<literal>mappedBy</literal>å
ç´ å¹¶å°å¤å¯¹ä¸è¿ç«¯ç
+ <literal>@JoinColumn</literal>çinsertableåupdatable设置为false.
+ å¾ææ¾,è¿ç§æ¹æ¡ä¸ä¼å¾å°ä»ä¹ææ¾çä¼å,èä¸è¿ä¼å¢å ä¸äºéå çUPDATEè¯å¥.</para>
+
+ <programlisting>@Entity
+public class Troop {
+ @OneToMany
+ @JoinColumn(name="troop_fk") //we need to duplicate the physical information
+ public Set<Soldier> getSoldiers() {
+ ...
+}
+
+ at Entity
+public class Soldier {
+ @ManyToOne
+ @JoinColumn(name="troop_fk", insertable=false, updatable=false)
+ public Troop getTroop() {
+ ...
+}</programlisting>
+ </sect5>
+
+ <sect5>
+ <title>åå(Unidirectional)</title>
+
+ <para>éè¿å¨è¢«æ¥æçå®ä½ç«¯(owned entity)å¢å ä¸ä¸ªå¤é®åæ¥å®ç°ä¸å¯¹å¤ååå
³èæ¯å¾å°è§ç,ä¹æ¯ä¸æ¨èç.
+ æ们强ç建议éè¿ä¸ä¸ªèæ¥è¡¨(join table)æ¥å®ç°è¿ç§å
³è(ä¸ä¸èä¼å¯¹æ¤è¿è¡è§£é).
+ å¯ä»¥éè¿<literal>@JoinColumn</literal>注解æ¥æè¿°è¿ç§ååå
³èå
³ç³».</para>
+
+ <programlisting>
+ at Entity
+public class Customer implements Serializable {
+ @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+ @JoinColumn(name="CUST_ID")
+ public Set<Ticket> getTickets() {
+ ...
+}
+
+ at Entity
+public class Ticket implements Serializable {
+ ... //no bidir
+}
+ </programlisting>
+
+ <para><literal>Customer</literal> éè¿
+ <literal>CUST_ID</literal>åå<literal>Ticket</literal> 建ç«äºååå
³èå
³ç³».</para>
+
+ </sect5>
+
+ <sect5>
+ <title>éè¿å
³è表å¤çååå
³è</title>
+
+ <para>éè¿èæ¥è¡¨å¤çååä¸å¯¹å¤å
³èæ¯é¦éæ¹å¼.è¿ç§å
³èéè¿<literal>@JoinTable</literal>注解æ¥è¿è¡æè¿°.</para>
+
+ <programlisting>
+ at Entity
+public class Trainer {
+ @OneToMany
+ @JoinTable(
+ name="TrainedMonkeys",
+ joinColumns = { @JoinColumn( name="trainer_id") },
+ inverseJoinColumns = @JoinColumn( name="monkey_id")
+ )
+ public Set<Monkey> getTrainedMonkeys() {
+ ...
+}
+
+ at Entity
+public class Monkey {
+ ... //no bidir
+}
+ </programlisting>
+
+ <para>ä¸é¢è¿ä¸ªä¾åä¸,<literal>Trainer</literal>éè¿
+ <classname>TrainedMonkeys</classname>表å
+ <classname>Monkey</classname> 建ç«äºååå
³è.
+ å
¶ä¸å¤é®<literal>trainer_id</literal>å
³èå°<literal>Trainer</literal>
+ (<literal>joinColumns</literal>),
+ èå¤é®<literal>monkey_id</literal>å
³èå° <literal>Monkey</literal>
+ (<literal>inversejoinColumns</literal>).</para>
+ </sect5>
+
+ <sect5>
+ <title>é»è®¤å¤çæºå¶</title>
+
+ <para>éè¿èæ¥è¡¨æ¥å»ºç«ååä¸å¯¹å¤å
³èä¸éè¦æè¿°ä»»ä½ç©çæ å°.
+ 表åç±ä»¥ä¸ä¸ä¸ªé¨åç»æ:主表(owner table)表å+ä¸å线+ä»è¡¨(the other side table)表å.
+ æå主表çå¤é®åï¼ä¸»è¡¨è¡¨å+ä¸å线+主表主é®åå
+ æåä»è¡¨çå¤é®åï¼ä¸»è¡¨æ对åºå®ä½çå±æ§å+ä¸å线+ä»è¡¨ä¸»é®åå
+ æåä»è¡¨çå¤é®å®ä¹ä¸ºå¯ä¸çº¦æ,ç¨æ¥è¡¨ç¤ºä¸å¯¹å¤çå
³èå
³ç³».</para>
+
+ <programlisting>
+ at Entity
+public class Trainer {
+ @OneToMany
+ public Set<Tiger> getTrainedTigers() {
+ ...
+}
+
+ at Entity
+public class Tiger {
+ ... //no bidir
+}
+ </programlisting>
+
+ <para>ä¸é¢è¿ä¸ªä¾åä¸,<classname>Trainer</classname>å<classname>Tiger</classname>
+ éè¿èæ¥è¡¨ <literal>Trainer_Tiger</literal>建ç«ååå
³èå
³ç³»,
+ å
¶ä¸å¤é®<literal>trainer_id</literal>å
³èå°<literal>Trainer</literal>
+ (主表表å, <keycap>_</keycap>(ä¸å线), trainer id),
+ èå¤é®<literal>trainedTigers_id</literal>å
³èå°<literal>Tiger</literal>
+ (å±æ§å称, <keycap>_</keycap>(ä¸å线), Tiger表ç主é®åå).</para>
+
+ </sect5>
+ </sect4>
+
+ <sect4>
+ <title>å¤å¯¹å¤(Many-to-many)</title>
+
+ <sect5>
+ <title>å®ä¹</title>
+
+ <para>ä½ å¯ä»¥éè¿<literal>@ManyToMany</literal>注解å¯å®ä¹çå¤å¯¹å¤å
³è.
+ åæ¶,ä½ ä¹éè¦éè¿æ³¨è§£<literal>@JoinTable</literal>æè¿°å
³è表åå
³èæ¡ä»¶.
+ å¦ææ¯ååå
³è,å
¶ä¸ä¸æ®µå¿
é¡»å®ä¹ä¸ºowner,å¦ä¸ç«¯å¿
é¡»å®ä¹ä¸ºinverse(å¨å¯¹å
³è表è¿è¡æ´æ°æä½æ¶è¿ä¸ç«¯å°è¢«å¿½ç¥):</para>
+
+ <programlisting>
+ at Entity
+public class Employer implements Serializable {
+ @ManyToMany(
+ targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,
+ cascade={CascadeType.PERSIST, CascadeType.MERGE}
+ )
+ @JoinTable(
+ name="EMPLOYER_EMPLOYEE",
+ joinColumns={@JoinColumn(name="EMPER_ID")},
+ inverseJoinColumns={@JoinColumn(name="EMPEE_ID")}
+ )
+ public Collection getEmployees() {
+ return employees;
+ }
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Entity
+public class Employee implements Serializable {
+ @ManyToMany(
+ cascade={CascadeType.PERSIST, CascadeType.MERGE},
+ mappedBy="employees"
+ targetEntity=Employer.class
+ )
+ public Collection getEmployers() {
+ return employers;
+ }
+}
+ </programlisting>
+
+ <para>è³æ¤,æ们已ç»å±ç¤ºäºå¾å¤è·å
³èæå
³ç声æå®ä¹ä»¥åå±æ§ç»è.
+ ä¸é¢æ们å°æ·±å
¥ä»ç»<literal>@JoinTable</literal>注解,该注解å®ä¹äºèæ¥è¡¨ç表å,
+ èæ¥åæ°ç»(注解ä¸å®ä¹æ°ç»çæ ¼å¼ä¸º{ A, B, C }),
+ 以åinverseèæ¥åæ°ç».
+ åè
æ¯å
³è表ä¸å
³èå°<classname>Employee</classname>主é®çå(the "other side").</para>
+
+ <para>æ£å¦åé¢æ示,被å
³è端ä¸å¿
ä¹ä¸è½æè¿°ç©çæ å°:
+ åªéè¦ä¸ä¸ªç®åç<literal>mappedBy</literal>åæ°,该åæ°å
å«äºä¸»ä½ç«¯çå±æ§å,è¿æ ·å°±ç»å®åæ¹çå
³ç³».</para>
+ </sect5>
+
+ <sect5>
+ <title>é»è®¤å¼</title>
+
+ <para>åå
¶ä»è®¸å¤æ³¨è§£ä¸æ ·,å¨å¤å¯¹å¤å
³èä¸å¾å¤å¼æ¯èªå¨çæ.
+ å½ååå¤å¯¹å¤å
³èä¸æ²¡æå®ä¹ä»»ä½ç©çæ å°æ¶,Hibernateæ ¹æ®ä»¥ä¸è§åçæç¸åºçå¼.
+ å
³è表å:主表表å+<keycap>_</keycap>ä¸å线+ä»è¡¨è¡¨å,
+ å
³èå°ä¸»è¡¨çå¤é®å:主表å+<keycap>_</keycap>ä¸å线+主表ä¸ç主é®åå.
+ å
³èå°ä»è¡¨çå¤é®å:主表ä¸ç¨äºå
³èçå±æ§å+<keycap>_</keycap>ä¸å线+ä»è¡¨ç主é®åå.
+ 以ä¸è§å对äºååä¸å¯¹å¤å
³èåæ ·ææ.</para>
+
+ <programlisting>
+ at Entity
+public class Store {
+ @ManyToMany(cascade = CascadeType.PERSIST)
+ public Set<City> getImplantedIn() {
+ ...
+ }
+}
+
+ at Entity
+public class City {
+ ... //no bidirectional relationship
+}
+ </programlisting>
+
+ <para>ä¸é¢è¿ä¸ªä¾åä¸,<literal>Store_Table</literal>ä½ä¸ºèæ¥è¡¨.
+ <literal>Store_id</literal>åæ¯èæ¥å°<literal>Store</literal>表çå¤é®.
+ è<literal>implantedIn_id</literal>ååèæ¥å°<literal>City</literal>表.</para>
+
+ <para>å½ååå¤å¯¹å¤å
³èä¸æ²¡æå®ä¹ä»»ä½ç©çæ å°æ¶, Hibernateæ ¹æ®ä»¥ä¸è§åçæç¸åºçå¼
+ å
³è表å: :主表表å+<keycap>_</keycap>ä¸å线+ä»è¡¨è¡¨å,
+ å
³èå°ä¸»è¡¨çå¤é®å:ä»è¡¨ç¨äºå
³èçå±æ§å+<keycap>_</keycap>ä¸å线+主表ä¸ç主é®åå.
+ å
³èå°ä»è¡¨çå¤é®å:主表ç¨äºå
³èçå±æ§å+<keycap>_</keycap>ä¸å线+ä»è¡¨ç主é®åå.
+ 以ä¸è§å对äºååä¸å¯¹å¤å
³èåæ ·ææ.</para>
+
+ <programlisting>
+ at Entity
+public class Store {
+ @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+ public Set<Customer> getCustomers() {
+ ...
+ }
+}
+
+ at Entity
+public class Customer {
+ @ManyToMany(mappedBy="customers")
+ public Set<Store> getStores() {
+ ...
+ }
+}
+ </programlisting>
+
+ <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>Store_Customer</literal>ä½ä¸ºèæ¥è¡¨.
+ <literal>stores_id</literal>åæ¯èæ¥å°<literal>Store</literal>表çå¤é®,
+ è<literal>customers_id</literal>åèæ¥å°<literal>City</literal>表.</para>
+
+ </sect5>
+ </sect4>
+ </sect3>
+
+
+ <sect3>
+ <title>ç¨cascadingå®ç°ä¼ ææ§æä¹
å(Transitive persistence)</title>
+
+ <para>ä¹è®¸ä½ å·²ç»æ³¨æå°äº<literal>cascade</literal>å±æ§æ¥åçå¼ä¸º<classname>CascadeType</classname>æ°ç».
+ å¨EJB3ä¸çcascadeçæ¦å¿µåHibernateä¸çä¼ ææ§æä¹
å以åcascadeæä½é常类似,
+ ä½æ¯å¨è¯ä¹ä¸æç»å¾®çåºå«,æ¯æçcascadeç±»åä¹æç¹åºå«:</para>
+
+ <itemizedlist>
+ <listitem>
+ CascadeType.PERSIST: å¦æä¸ä¸ªå®ä½æ¯å管ç¶æ, æè
å½persist()å½æ°è¢«è°ç¨æ¶, 触å级èå建(create)æä½
+ </listitem>
+
+ <listitem>
+ CascadeType.MERGE: å¦æä¸ä¸ªå®ä½æ¯å管ç¶æ, æè
å½merge()å½æ°è¢«è°ç¨æ¶, 触å级èå并(merge)æä½
+ </listitem>
+
+ <listitem>
+ CascadeType.REMOVE: å½delete()å½æ°è¢«è°ç¨æ¶, 触å级èå é¤(remove)æä½
+ </listitem>
+
+ <listitem>
+ CascadeType.REFRESH: å½refresh()å½æ°è¢«è°ç¨æ¶, 触å级èæ´æ°(refresh)æä½
+ </listitem>
+
+ <listitem>
+ CascadeType.ALL: 以ä¸å
¨é¨
+ </listitem>
+ </itemizedlist>
+
+ <para>å
³äºcascading, create/mergeçè¯ä¹è¯·åèEJB3è§èç6.3ç« è.</para>
+ </sect3>
+
+ <sect3>
+ <title>å
³èå
³ç³»è·å</title>
+
+ <para>éè¿Hibernateä½ å¯ä»¥è·å¾ç´æ¥æè
延è¿è·åå
³èå®ä½çåè½.
+ <literal>fetch</literal>åæ°å¯ä»¥è®¾ç½®ä¸º<literal>FetchType.LAZY</literal>
+ æè
<literal>FetchType.EAGER</literal>.
+ <literal>EAGER</literal>éè¿<literal>outer join select</literal>ç´æ¥è·åå
³èç对象,
+ è<literal>LAZY</literal>(é»è®¤å¼)å¨ç¬¬ä¸æ¬¡è®¿é®å
³è对象çæ¶åæä¼è§¦åç¸åºçselectæä½.
+ EJBQLæä¾äº<literal>fetch</literal>å
³é®å,该å
³é®åå¯ä»¥å¨è¿è¡ç¹æ®æ¥è¯¢çæ¶åè¦çé»è®¤å¼.
+ è¿å¯¹äºæé«æ§è½æ¥è¯´é常ææ,åºè¯¥æ ¹æ®å®é
çç¨ä¾æ¥å¤ææ¯å¦éæ©fetchå
³é®å.</para>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>æ å°å¤å主é®ä¸å¤é®</title>
+
+ <para>ç»å主é®ä½¿ç¨ä¸ä¸ªå¯åµå
¥çç±»ä½ä¸ºä¸»é®è¡¨ç¤º,å æ¤ä½ éè¦ä½¿ç¨<literal>@Id</literal>
+ å<literal>@Embeddable</literal>两个注解.
+ è¿æä¸ç§æ¹å¼æ¯ä½¿ç¨<literal>@EmbeddedId</literal>注解.注ææä¾èµçç±»å¿
é¡»å®ç°
+ serializable以åå®ç°<methodname>equals()</methodname>/<methodname>hashCode()</methodname>æ¹æ³.
+ ä½ ä¹å¯ä»¥å¦<xref linkend="mapping-identifier" />ä¸ç« ä¸æè¿°çåæ³ä½¿ç¨<literal>@IdClass</literal>注解.</para>
+
+ <programlisting>
+ at Entity
+public class RegionalArticle implements Serializable {
+
+ @Id
+ public RegionalArticlePk getPk() { ... }
+}
+
+ at Embeddable
+public class RegionalArticlePk implements Serializable { ... }
+ </programlisting>
+
+ <para>æè
</para>
+
+ <programlisting>
+ at Entity
+public class RegionalArticle implements Serializable {
+
+ @EmbeddedId
+ public RegionalArticlePk getPk() { ... }
+}
+
+public class RegionalArticlePk implements Serializable { ... }
+ </programlisting>
+
+ <para><literal>@Embeddable</literal> 注解é»è®¤ç»§æ¿äºå
¶æå±å®ä½ç访é®ç±»å,
+ é¤éæ¾å¼ä½¿ç¨äºHibernateç<literal>@AccessType</literal>注解(è¿ä¸ªæ³¨è§£ä¸æ¯EJB3æ åçä¸é¨å).
+ è<literal>@JoinColumns</literal>,å³<literal>@JoinColumn</literal>æ°ç»,
+ å®ä¹äºå
³èçç»åå¤é®(å¦æä¸ä½¿ç¨ç¼ºçå¼çè¯).
+ æ¾å¼ææ<literal>referencedColumnNames</literal>æ¯ä¸ä¸ªå¥½çå®è·µæ¹å¼,
+ å¦å,Hibernateè®¤ä¸ºä½ ä½¿ç¨çå顺åºå主é®å£°æç顺åºä¸è´.</para>
+
+ <programlisting>
+ at Entity
+public class Parent implements Serializable {
+ @Id
+ public ParentPk id;
+ public int age;
+
+ @OneToMany(cascade=CascadeType.ALL)
+ @JoinColumns ({
+ @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
+ @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
+ @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
+ })
+ public Set<Child> children; //unidirectional
+ ...
+}
+ </programlisting>
+
+ <programlisting>
+ at Entity
+public class Child implements Serializable {
+ @Id @GeneratedValue
+ public Integer id;
+
+ @ManyToOne
+ @JoinColumns ({
+ @JoinColumn(name="parentCivility", referencedColumnName = "isMale"),
+ @JoinColumn(name="parentLastName", referencedColumnName = "lastName"),
+ @JoinColumn(name="parentFirstName", referencedColumnName = "firstName")
+ })
+ public Parent parent; //unidirectional
+}
+ </programlisting>
+
+ <programlisting>
+ at Embeddable
+public class ParentPk implements Serializable {
+ String firstName;
+ String lastName;
+ ...
+}
+ </programlisting>
+
+ <para>注æä¸é¢ç <literal>referencedColumnName</literal>æ¾å¼ä½¿ç¨æ¹å¼.</para>
+ </sect2>
+
+ <sect2>
+ <title>æ å°äºçº§è¡¨(secondary tables)</title>
+
+ <para>使ç¨ç±»ä¸çº§ç <literal>@SecondaryTable </literal> æ
+ <literal>@SecondaryTables </literal>注解å¯ä»¥å®ç°å个å®ä½å°å¤ä¸ªè¡¨çæ å°.
+ ä½¿ç¨ <literal>@Column </literal>æè
<literal>@JoinColumn </literal>
+ 注解ä¸ç <literal>table </literal>åæ°å¯æå®æ个åæå±çç¹å®è¡¨.</para>
+
+ <programlisting>
+ at Entity
+ at Table(name="MainCat")
+<emphasis role="bold">@SecondaryTables({
+ @SecondaryTable(name="Cat1", pkJoinColumns={
+ @PrimaryKeyJoinColumn(name="cat_id", referencedColumnName="id")
+ ),
+ @SecondaryTable(name="Cat2", uniqueConstraints={@UniqueConstraint(columnNames={"storyPart2"})})
+})</emphasis>
+public class Cat implements Serializable {
+
+ private Integer id;
+ private String name;
+ private String storyPart1;
+ private String storyPart2;
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ <emphasis role="bold">@Column(table="Cat1")</emphasis>
+ public String getStoryPart1() {
+ return storyPart1;
+ }
+
+ <emphasis role="bold">@Column(table="Cat2")</emphasis>
+ public String getStoryPart2() {
+ return storyPart2;
+ }
+</programlisting>
+
+ <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,<literal>name</literal>ä¿åå¨<literal>MainCat</literal>表ä¸,
+ <literal>storyPart1</literal>ä¿åå¨<literal>Cat1</literal>表ä¸,
+ <literal>storyPart2</literal>ä¿åå¨<literal>Cat2</literal>表ä¸.
+ <literal>Cat1</literal>表éè¿å¤é®<literal>cat_id</literal>å<literal>MainCat</literal>表å
³è,
+ <literal>Cat2</literal>表éè¿<literal>id</literal>åå<literal>MainCat</literal>表å
³è
+ (å<literal>MainCat</literal>ç<literal>id</literal>ååå).
+ 对<literal>storyPart2</literal>åè¿å®ä¹äºå¯ä¸çº¦æ.</para>
+
+ <para>å¨JBoss EJB 3æååHibernate Annotationsåå
æµè¯ä»£ç ä¸è¿ææ´å¤çä¾å.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="entity-mapping-query">
+ <title>æ å°æ¥è¯¢</title>
+
+ <sect2>
+ <title>æ å°EJBQL/HQLæ¥è¯¢</title>
+
+ <para>使ç¨æ³¨è§£è¿å¯ä»¥æ å°EJBQL/HQLæ¥è¯¢.
+ <literal>@NamedQuery</literal> å<literal>@NamedQueries</literal>æ¯å¯ä½¿ç¨å¨ç±»åå
ä¸ç注解.
+ ä½æ¯å®ä»¬çå®ä¹å¨session factory/entity manager factoryèå´ä¸æ¯é½å¯è§ç.
+ å½åå¼æ¥è¯¢éè¿å®çåååå®é
çæ¥è¯¢å符串æ¥å®ä¹.</para>
+
+ <programlisting>
+javax.persistence.NamedQueries(
+ @javax.persistence.NamedQuery(name="plane.getAll", query="select p from Plane p")
+)
+package org.hibernate.test.annotations.query;
+
+...
+
+ at Entity
+ at NamedQuery(name="night.moreRecentThan", query="select n from Night n where n.date >= :date")
+public class Night {
+ ...
+}
+
+public class MyDao {
+ doStuff() {
+ Query q = s.getNamedQuery("night.moreRecentThan");
+ q.setDate( "date", aMonthAgo );
+ List results = q.list();
+ ...
+ }
+ ...
+}
+ </programlisting>
+
+ <para>è¿å¯ä»¥éè¿å®ä¹ <literal>QueryHint</literal> æ°ç»ç<literal>hints</literal>
+ å±æ§ä¸ºæ¥è¯¢æä¾ä¸äºhintä¿¡æ¯.</para>
+
+ <para>ä¸é¢æ¯ç®åå¯ä»¥ä½¿ç¨çä¸äºHibernate hintï¼</para>
+
+ <para></para>
+
+ <table>
+ <title>Query hints</title>
+
+ <tgroup cols="2">
+ <thead>
+ <colspec colname="c1" />
+
+ <colspec colname="c2" colnum="2" />
+
+ <row>
+ <entry>hint</entry>
+
+ <entry colname="c2">description</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>org.hibernate.cacheable</entry>
+
+ <entry>æ¥è¯¢æ¯å¦ä¸äºçº§ç¼å交äº(é»è®¤å¼ä¸ºfalse)
+ </entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.cacheRegion</entry>
+
+ <entry>设置ç¼ååºå称 (é»è®¤ä¸ºotherwise)</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.timeout</entry>
+
+ <entry>æ¥è¯¢è¶
æ¶è®¾å®</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.fetchSize</entry>
+
+ <entry>æè·åçç»æé(resultset)大å°</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.flushMode</entry>
+
+ <entry>æ¬æ¬¡æ¥è¯¢æç¨çå·æ°æ¨¡å¼</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.cacheMode</entry>
+
+ <entry>æ¬æ¬¡æ¥è¯¢æç¨çç¼å模å¼</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.readOnly</entry>
+
+ <entry>æ¯å¦å°æ¬æ¬¡æ¥è¯¢æå è½½çå®ä½è®¾ä¸ºåªè¯»(é»è®¤ä¸ºfalse)
+ </entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.comment</entry>
+
+ <entry>å°æ¥è¯¢æ³¨éæ·»å å
¥æçæçSQL</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+
+ <sect2 id="entity-mapping-query-native" revision="2">
+ <title>æ å°æ¬å°åæ¥è¯¢</title>
+
+ <para>ä½ è¿å¯ä»¥æ å°æ¬å°åæ¥è¯¢(ä¹å°±æ¯æ®éSQLæ¥è¯¢).
+ ä¸è¿è¿éè¦ä½ 使ç¨<literal>@SqlResultSetMapping</literal>注解æ¥æè¿°SQLçresultsetçç»æ
+ (å¦æä½ æç®å®ä¹å¤ä¸ªç»æéæ å°ï¼å¯æ¯ä½¿ç¨<literal>@SqlResultSetMappings</literal>).
+ <literal>@SqlResultSetMapping</literal>å<literal>@NamedQuery</literal>,
+ <literal>@SqlResultSetMapping</literal>ä¸æ ·,å¯ä»¥å®ä¹å¨ç±»åå
ä¸çº§.
+ ä½æ¯<literal>@SqlResultSetMapping</literal>çä½ç¨å为åºç¨çº§.
+ ä¸é¢æ们ä¼çå°,<literal>@NamedNativeQuery</literal> 注解ä¸
+ <literal>resultSetMapping</literal>åæ°å¼ä¸º<literal>@SqlResultSetMapping</literal>çåå.
+ ç»æéæ å°å®ä¹äºéè¿æ¬å°åæ¥è¯¢è¿åå¼åå®ä½çæ å°.
+ 该å®ä½ä¸çæ¯ä¸ä¸ªå段é½ç»å®å°SQLç»æéä¸çæ个åä¸.
+ 该å®ä½çææå段å
æ¬åç±»çææå段以å
+ å
³èå®ä½çå¤é®åé½å¿
é¡»å¨SQLæ¥è¯¢ä¸æ对åºçå®ä¹.
+ å¦æå®ä½ä¸çå±æ§åSQLæ¥è¯¢ä¸çååç¸å,è¿ç§æ
åµä¸å¯ä»¥ä¸è¿è¡å®ä¹å段æ å°.</para>
+
+ <para><programlisting>@NamedNativeQuery(name="night&area", query="select night.id nid, night.night_duration, "
+ + " night.night_date, area.id aid, night.area_id, area.name "
+ + "from Night night, Area area where night.area_id = area.id", <emphasis
+ role="bold">resultSetMapping="joinMapping"</emphasis>)
+ at SqlResultSetMapping(name="joinMapping", entities={
+ @EntityResult(entityClass=org.hibernate.test.annotations.query.Night.class, fields = {
+ @FieldResult(name="id", column="nid"),
+ @FieldResult(name="duration", column="night_duration"),
+ @FieldResult(name="date", column="night_date"),
+ @FieldResult(name="area", column="area_id"),
+ discriminatorColumn="disc"
+ }),
+ @EntityResult(entityClass=org.hibernate.test.annotations.query.Area.class, fields = {
+ @FieldResult(name="id", column="aid"),
+ @FieldResult(name="name", column="name")
+ })
+ }
+)</programlisting></para>
+
+ <para>å¨ä¸é¢è¿ä¸ªä¾åä¸,å为<literal>night&area</literal>çæ¥è¯¢
+ å<literal>joinMapping</literal>ç»æéæ å°å¯¹åº.
+ 该æ å°è¿å两个å®ä½,åå«ä¸º<literal>Night</literal>
+ å<literal>Area</literal>,å
¶ä¸æ¯ä¸ªå±æ§é½åä¸ä¸ªåå
³è,
+ ååéè¿æ¥è¯¢è·å.ä¸é¢æ们çä¸ä¸ªéå¼å£°æå±æ§ååæ å°å
³ç³»çä¾å.</para>
+
+ <programlisting>@Entity
+<emphasis role="bold">@SqlResultSetMapping(name="implicit", entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class))
+ at NamedNativeQuery(name="implicitSample", query="select * from SpaceShip", resultSetMapping="implicit")</emphasis>
+public class SpaceShip {
+ private String name;
+ private String model;
+ private double speed;
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Column(name="model_txt")
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public double getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(double speed) {
+ this.speed = speed;
+ }
+}</programlisting>
+
+ <para>å¨è¿ä¸ªä¾åä¸,æ们åªéè¦å®ä¹ç»æéæ å°ä¸çå®ä½æå.
+ å±æ§åååä¹é´çæ å°åå©å®ä½ä¸å
å«æ å°ä¿¡æ¯æ¥å®æ.
+ å¨è¿ä¸ªä¾åä¸,<literal>model</literal>å±æ§ç»å®å°<literal>model_txt</literal>å.
+ å¦æåç¸å
³å®ä½çå
³è设计å°ç»å主é®,
+ é£ä¹åºè¯¥ä½¿ç¨<literal>@FieldResult</literal>注解æ¥å®ä¹æ¯ä¸ªå¤é®å.
+ <literal>@FieldResult</literal>çååç±ä»¥ä¸å é¨åç»æï¼
+ å®ä¹è¿ç§å
³ç³»çå±æ§åå+"."ï¼ä¸»é®åæ主é®åæ主é®å±æ§.</para>
+
+ <programlisting>@Entity
+ at SqlResultSetMapping(name="compositekey",
+ entities=@EntityResult(entityClass=org.hibernate.test.annotations.query.SpaceShip.class,
+ fields = {
+ @FieldResult(name="name", column = "name"),
+ @FieldResult(name="model", column = "model"),
+ @FieldResult(name="speed", column = "speed"),
+<emphasis role="bold"> @FieldResult(name="captain.firstname", column = "firstn"),
+ @FieldResult(name="captain.lastname", column = "lastn"),</emphasis>
+ @FieldResult(name="dimensions.length", column = "length"),
+ @FieldResult(name="dimensions.width", column = "width")
+ }),
+ columns = { @ColumnResult(name = "surface"),
+ @ColumnResult(name = "volume") } )
+
+ at NamedNativeQuery(name="compositekey",
+ query="select name, model, speed, lname as lastn, fname as firstn, length, width, length * width as surface from SpaceShip",
+ resultSetMapping="compositekey")
+} )
+public class SpaceShip {
+ private String name;
+ private String model;
+ private double speed;
+ private Captain captain;
+ private Dimensions dimensions;
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne(fetch= FetchType.LAZY)
+ @JoinColumns( {
+ @JoinColumn(name="fname", referencedColumnName = "firstname"),
+ @JoinColumn(name="lname", referencedColumnName = "lastname")
+ } )
+ public Captain getCaptain() {
+ return captain;
+ }
+
+ public void setCaptain(Captain captain) {
+ this.captain = captain;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public double getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(double speed) {
+ this.speed = speed;
+ }
+
+ public Dimensions getDimensions() {
+ return dimensions;
+ }
+
+ public void setDimensions(Dimensions dimensions) {
+ this.dimensions = dimensions;
+ }
+}
+
+ at Entity
+ at IdClass(Identity.class)
+public class Captain implements Serializable {
+ private String firstname;
+ private String lastname;
+
+ @Id
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ @Id
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+}
+</programlisting>
+
+ <note>
+
+ <para>è§å¯dimensionå±æ§ä½ ä¼åç°Hibernateæ¯æç¨"."符å·æ¥è¡¨ç¤ºåµå
¥å¼å¯¹è±¡.
+ EJB3å®ç°ä¸å¿
æ¯æè¿ä¸ªç¹å¾,ä½æ¯æ们åå°äº:-)</para>
+ </note>
+
+ <para>å¦ææ¥è¯¢è¿åçæ¯å个å®ä½,æè
ä½ æç®ä½¿ç¨ç³»ç»é»è®¤çæ å°,
+ è¿ç§æ
åµä¸å¯ä»¥ä¸ä½¿ç¨<literal>resultSetMapping</literal>
+ èæ¯ä½¿ç¨<literal>resultClass</literal>å±æ§:</para>
+
+ <programlisting><emphasis role="bold">@NamedNativeQuery(name="implicitSample", query="select * from SpaceShip",
+ resultClass=SpaceShip.class)</emphasis>
+public class SpaceShip {</programlisting>
+
+ <para>æäºæ¬å°æ¥è¯¢è¿åçæ¯scalarå¼,ä¾å¦æ¥è¡¨æ¥è¯¢.
+ ä½ å¯ä»¥éè¿<literal>@ColumnResult</literal>å°å
¶æ å°å°
+ <literal>@SqlResultsetMapping</literal>ä¸.
+ çè³è¿å¯ä»¥å¨åä¸ä¸ªæ¬å°æ¥è¯¢çç»æä¸æ··åå®ä½åscalarç±»å(ä¸è¿è¿ç§æ
åµæ¯è¾å°è§).</para>
+
+ <programlisting><emphasis role="bold">@SqlResultSetMapping(name="scalar", columns=@ColumnResult(name="dimension"))
+ at NamedNativeQuery(name="scalar", query="select length*width as dimension from SpaceShip", resultSetMapping="scalar")</emphasis></programlisting>
+
+ <para>æ¬å°æ¥è¯¢ä¸è¿æå¦å¤ä¸ä¸ªhintå±æ§ï¼
+ <literal>org.hibernate.callable</literal>.
+ è¿ä¸ªå±æ§çå¸å°åéå¼è¡¨æè¿ä¸ªæ¥è¯¢æ¯å¦æ¯ä¸ä¸ªåå¨è¿ç¨.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="entity-hibspec" xreflabel="Hibernate Annotation Extensions">
+ <title>Hibernateç¬æç注解æ©å±</title>
+
+ <para>Hibernate 3.1 æä¾äºå¤ç§éå ç注解,è¿äºæ³¨è§£å¯ä»¥ä¸EJB3çå®ä½æ··å/å¹é
使ç¨.
+ ä»ä»¬è¢«è®¾è®¡æEJB3注解çèªç¶æ©å±.</para>
+
+ <para>为äºå¼ºåEJB3çè½å,Hibernateæä¾äºä¸å
¶èªèº«ç¹æ§ç¸å»åçç¹æ®æ³¨è§£.
+ <classname>org.hibernate.annotations</classname>å
å·²å
å«äºææçè¿äºæ³¨è§£æ©å±.</para>
+
+ <sect2 id="entity-hibspec-entity" revision="2">
+ <title>å®ä½</title>
+
+ <para>ä½ å¯ä»¥å¨EJB3è§èæè½æä¾çè½åä¹å¤,å°±Hibernate对å®ä½æåçä¸äºæä½è¿è¡ä¼å.</para>
+
+ <para><classname>@org.hibernate.annotations.Entity</classname>
+ 追å äºå¯è½éè¦çé¢å¤çå
æ°æ®,
+ èè¿äºå
æ°æ®è¶
åºäºæ å<literal>@Entity</literal> ä¸æå®ä¹çå
æ°æ®.
+ <itemizedlist>
+ <listitem>
+ mutable: æ¤å®ä½æ¯å¦ä¸ºå¯åç
+ </listitem>
+
+ <listitem>
+ dynamicInsert: ç¨å¨æSQLæ°å¢
+ </listitem>
+
+ <listitem>
+ dynamicUpdate: ç¨å¨æSQLæ´æ°
+ </listitem>
+
+ <listitem>
+ selectBeforeUpdate: ææHibernateä»ä¸è¿è¡SQL UPDATEé¤éè½ç¡®å®å¯¹è±¡ç确已被修æ¹
+ </listitem>
+
+ <listitem>
+ polymorphism: (æåº)å®ä½å¤ææ¯PolymorphismType.IMPLICIT(é»è®¤)è¿æ¯PolymorphismType.EXPLICIT
+ </listitem>
+
+ <listitem>
+ persister:å
许对é»è®¤æä¹
å®ç°(persister implementation)çè¦ç
+ </listitem>
+
+ <listitem>
+ optimisticLock: ä¹è§éçç¥(OptimisticLockType.VERSION, OptimisticLockType.NONE, OptimisticLockType.DIRTYæOptimisticLockType.ALL)
+ </listitem>
+ </itemizedlist>
+ </para>
+
+ <para>
+ <note>
+ <para>
+ @javax.persistence.Entityä»æ¯å¿
éç(mandatory),
+ @org.hibernate.annotations.Entityä¸æ¯å代å.
+ </para>
+ </note>
+ </para>
+
+ <para>以ä¸æ¯ä¸äºéå çHibernate注解æ©å±ï¼</para>
+
+ <para><literal>@org.hibernate.annotations.BatchSize</literal>
+ å
è®¸ä½ å®ä¹æ¹éè·å该å®ä½çå®ä¾æ°é(å¦ï¼<literal>@BatchSize(size=4)</literal>).
+ å½å è½½ä¸ç¹å®çå®ä½æ¶,Hibernateå°å è½½å¨æä¹
ä¸ä¸æä¸æªç»åå§åçåç±»åå®ä½,ç´è³æ¹éæ°é(ä¸é).</para>
+
+ <para><literal>@org.hibernate.annotations.Proxy</literal>
+ å®ä¹äºå®ä½ç延è¿å±æ§.Lazy(é»è®¤ä¸ºtrue)å®ä¹äºç±»æ¯å¦ä¸ºå»¶è¿(å è½½).
+ proxyClassNameæ¯ç¨æ¥çæ代ççæ¥å£(é»è®¤ä¸ºè¯¥ç±»æ¬èº«).</para>
+
+ <para><literal>@org.hibernate.annotations.Where</literal>
+ å®ä¹äºå½è·åç±»å®ä¾æ¶æç¨çSQL WHEREåå¥(该SQL WHEREåå¥ä¸ºå¯é).</para>
+
+ <para><literal>@org.hibernate.annotations.Check</literal>
+ å®ä¹äºå¨DDLè¯å¥ä¸å®ä¹çåæ³æ§æ£æ¥çº¦æ(该约æ为å¯é).</para>
+
+ <para><literal>@OnDelete(action=OnDeleteAction.CASCADE)</literal>
+ å®ä¹äºè¢«è¿æ¥çåç±»(joined subclass)ï¼å¨å é¤æ¶ä½¿ç¨SQL级è¿å é¤,èéé常çHibernateå é¤æºå¶.</para>
+
+ <para><literal>@Table(name="tableName", indexes = {
+ @Index(name="index1", columnNames={"column1", "column2"} ) } )</literal>
+ å¨<literal>tableName</literal>表çåä¸å建å®ä¹å¥½çç´¢å¼.
+ 该注解å¯ä»¥è¢«åºç¨äºå
³é®è¡¨æè
æ¯å
¶ä»æ¬¡è¦ç表.
+ <literal>@Tables</literal> 注解å
è®¸ä½ å¨ä¸åç表ä¸åºç¨ç´¢å¼.
+ æ¤æ³¨è§£é¢æå¨ä½¿ç¨
+ <literal>@javax.persistence.Table</literal>æ
+ <literal>@javax.persistence.SecondaryTable</literal>çå°æ¹ä¸åºç°.</para>
+
+ <note>
+ <para>
+ <literal>@org.hibernate.annotations.Table</literal> æ¯å¯¹
+ <literal>@javax.persistence.Table</literal>çè¡¥å
èä¸æ¯å®çæ¿ä»£å.
+ ç¹å«æ¯å½ä½ æç®æ¹å表åçé»è®¤å¼çæ¶åï¼ä½ å¿
须使ç¨<literal>@javax.persistence.Table</literal>,
+ èä¸æ¯<literal>@org.hibernate.annotations.Table</literal>.</para>
+ </note>
+
+ <para><programlisting>@Entity
+ at BatchSize(size=5)
+ at org.hibernate.annotations.Entity(
+ selectBeforeUpdate = true,
+ dynamicInsert = true, dynamicUpdate = true,
+ optimisticLock = OptimisticLockType.ALL,
+ polymorphism = PolymorphismType.EXPLICIT)
+ at Where(clause="1=1")
+ at org.hibernate.annotations.Table(name="Forest", indexes = { @Index(name="idx", columnNames = { "name", "length" } ) } )
+public class Forest { ... }</programlisting><programlisting>@Entity
+ at Inheritance(
+ strategy=InheritanceType.JOINED
+)
+public class Vegetable { ... }
+
+ at Entity
+ at OnDelete(action=OnDeleteAction.CASCADE)
+public class Carrot extends Vegetable { ... }</programlisting></para>
+ </sect2>
+
+ <sect2>
+ <title>æ è¯ç¬¦</title>
+
+ <para><literal><literal>@org.hibernate.annotations.GenericGenerator</literal>
+ å
è®¸ä½ å®ä¹ä¸ä¸ªHibernateç¹å®çidçæå¨.</literal></para>
+
+ <para><programlisting>@Id @GeneratedValue(generator="system-uuid")
+ at GenericGenerator(name="system-uuid", strategy = "uuid")
+public String getId() {
+
+ at Id @GeneratedValue(generator="hibseq")
+ at GenericGenerator(name="hibseq", strategy = "seqhilo",
+ parameters = {
+ @Parameter(name="max_lo", value = "5"),
+ @Parameter(name="sequence", value="heybabyhey")
+ }
+)
+public Integer getId() {</programlisting></para>
+
+ <para><literal>strategy</literal>å¯ä»¥æ¯Hibernate3çæå¨çç¥çç®ç§°,
+ æè
æ¯ä¸ä¸ª<classname>IdentifierGenerator</classname>å®ç°ç(带å
è·¯å¾ç)å
¨éå®ç±»å.
+ ä½ å¯ä»¥éè¿<literal>parameters</literal>å±æ§å¢å ä¸äºåæ°.</para>
+</sect2>
+
+<sect2 id="entity-hibspec-property" revision="2">
+ <title>å±æ§</title>
+
+ <sect3>
+ <title>访é®ç±»å</title>
+
+ <para>访é®ç±»åæ¯æ ¹æ®<literal>@Id</literal>æ<literal>@EmbeddedId</literal>
+ å¨å®ä½ç»§æ¿å±æ¬¡ä¸æå¤çä½ç½®æ¨æ¼èå¾ç.åå®ä½(Sub-entities),
+ å
åµå¯¹è±¡å被æ å°çç¶ç±»å继æ¿äºæ ¹å®ä½(root entity)ç访é®ç±»å.</para>
+
+ <para>å¨Hibernateä¸,ä½ å¯ä»¥æ访é®ç±»åè¦çæï¼</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>使ç¨å®å¶ç访é®ç±»åçç¥</para>
+ </listitem>
+
+ <listitem>
+ <para>ä¼å类级æå±æ§çº§ç访é®ç±»å</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>为æ¯æè¿ç§è¡ä¸º,Hibernateå¼å
¥äº@AccessType注解.ä½ å¯ä»¥å¯¹ä»¥ä¸å
ç´ å®ä¹è®¿é®ç±»åï¼</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>å®ä½</para>
+ </listitem>
+
+ <listitem>
+ <para>ç¶ç±»</para>
+ </listitem>
+
+ <listitem>
+ <para>å¯å
åµç对象</para>
+ </listitem>
+
+ <listitem>
+ <para>å±æ§</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>被注解å
ç´ ç访é®ç±»åä¼è¢«è¦ç,è¥è¦çæ¯å¨ç±»ä¸çº§ä¸,åææçå±æ§ç»§æ¿è®¿é®ç±»å.
+ 对äºæ ¹å®ä½,å
¶è®¿é®ç±»åä¼è¢«è®¤ä¸ºæ¯æ´ä¸ªç»§æ¿å±æ¬¡ä¸ç缺ç设置(å¯å¨ç±»æå±æ§ä¸çº§è¦ç).</para>
+
+ <para>è¥è®¿é®ç±»å被æ 以"property",åHibernateä¼æ«ægetteræ¹æ³ç注解,è¥è®¿é®ç±»å被æ 以"field",
+ åæ«æå段ç注解.å¦å,æ«ææ 为@Idæ@embeddedIdçå
ç´ .</para>
+
+ <para>ä½ å¯ä»¥è¦çæ个å±æ§(property)ç访é®ç±»å,ä½æ¯å注解çå
ç´ å°ä¸åå½±åï¼
+ ä¾å¦ä¸ä¸ªå
·æfield访é®ç±»åçå®ä½,(æ们)å¯ä»¥å°æ个å段æ 注为 @AccessType("property"),
+ å该å段ç访é®ç±»åéä¹å°æ为property,ä½æ¯å
¶ä»å段ä¸ä¾ç¶éè¦æºå¸¦æ³¨è§£.</para>
+
+ <para>è¥ç¶ç±»æå¯å
åµç对象没æ被注解,å使ç¨æ ¹å®ä½ç访é®ç±»å(å³ä½¿å·²ç»å¨éç´ç³»ç¶ç±»æå¯å
åµå¯¹è±¡ä¸å®ä¹äºè®¿é®ç±»å).
+ æ¤æ¶ä¿ç½æ¯å¥å¨(Russian doll)åçå°±ä¸åéç¨.(è¯æ³¨ï¼ä¿ç½æ¯å¥å¨(маÑÑÑÑкаæ маÑÑеÑка)æ¯ä¿ç½æ¯ç¹äº§æ¨å¶ç©å
·,
+ ä¸è¬ç±å¤ä¸ªä¸æ ·å¾æ¡ç空å¿æ¨å¨å¨ä¸ä¸ªå¥ä¸ä¸ªç»æ,æå¤å¯è¾¾åå¤ä¸ª,é常为åæ±å½¢,åºé¨å¹³å¦å¯ä»¥ç´ç«.)</para>
+
+<programlisting>@Entity
+public class Person implements Serializable {
+ @Id @GeneratedValue //access type field
+ Integer id;
+
+ @Embedded
+ @AttributeOverrides({
+ @AttributeOverride(name = "iso2", column = @Column(name = "bornIso2")),
+ @AttributeOverride(name = "name", column = @Column(name = "bornCountryName"))
+ })
+ Country bornIn;
+}
+
+ at Embeddable
+<emphasis role="bold">@AccessType("property")</emphasis> //override access type for all properties in Country
+public class Country implements Serializable {
+ private String iso2;
+ private String name;
+
+ public String getIso2() {
+ return iso2;
+ }
+
+ public void setIso2(String iso2) {
+ this.iso2 = iso2;
+ }
+
+ @Column(name = "countryName")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
+</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>å
¬å¼</title>
+
+ <para>ææ¶å,ä½ æ³è®©æ°æ®åº,èéJVM,æ¥æ¿ä½ å®æä¸äºè®¡ç®,ä¹å¯è½æ³å建æç§èæå.
+ ä½ å¯ä»¥ä½¿ç¨SQLç段(亦称为å
¬å¼),èä¸æ¯å°å±æ§æ å°å°(ç©ç)å. è¿ç§å±æ§æ¯åªè¯»ç(å±æ§å¼ç±å
¬æ±å¾).</para>
+
+ <programlisting>@Formula("obj_length * obj_height * obj_width")
+ public long getObjectVolume()</programlisting>
+
+
+ <para>SQLç段å¯ä»¥æ¯ä»»æå¤æç,çè³å¯å
å«åæ¥è¯¢.</para>
+ </sect3>
+
+ <sect3>
+ <title>ç±»å</title>
+
+ <para><literal>@org.hibernate.annotations.Type</literal>
+ è¦çäºHibernateæç¨çé»è®¤ç±»åï¼è¿é常ä¸æ¯å¿
é¡»ç,å 为类åå¯ä»¥ç±Hibernateæ£ç¡®æ¨å¾.
+ å
³äºHibernateç±»åç详ç»ä¿¡æ¯,请åèHibernate使ç¨æå.</para>
+
+ <para><literal>@org.hibernate.annotations.TypeDef</literal> å
+ <literal>@org.hibernate.annotations.TypeDefs</literal>å
è®¸ä½ æ¥å£°æç±»åå®ä¹.
+ è¿äºæ³¨è§£è¢«ç½®äºç±»æå
ä¸çº§.注æ,对session factoryæ¥è¯´,
+ è¿äºå®ä¹å°æ¯å
¨å±ç(å³ä½¿å®ä¹äºç±»ä¸çº§),并ä¸ç±»åå®ä¹å¿
é¡»å
äºä»»ä½ä½¿ç¨.</para>
+
+ <programlisting>@TypeDefs(
+ {
+ @TypeDef(
+ name="caster",
+ typeClass = CasterStringType.class,
+ parameters = {
+ @Parameter(name="cast", value="lower")
+ }
+ )
+ }
+)
+package org.hibernate.test.annotations.entity;
+
+...
+public class Forest {
+ @Type(type="caster")
+ public String getSmallText() {
+ ...
+}
+ </programlisting>
+
+ <para>å½ä½¿ç¨ç»åçç¨æ·èªå®ä¹ç±»åæ¶,ä½ å¿
é¡»èªå·±è¡¨ç¤ºåçå®ä¹.
+<literal>@Columns</literal>å°±æ¯ä¸ºäºæ¤ç®çèå¼å
¥ç.</para>
+<programlisting>@Type(type="org.hibernate.test.annotations.entity.MonetaryAmountUserType")
+ at Columns(columns = {
+ @Column(name="r_amount"),
+ @Column(name="r_currency")
+})
+public MonetaryAmount getAmount() {
+ return amount;
+}
+
+
+public class MonetaryAmount implements Serializable {
+ private BigDecimal amount;
+ private Currency currency;
+ ...
+}</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>ç´¢å¼</title>
+
+ <para>éè¿å¨åå±æ§(property)ä¸ä½¿ç¨<literal>@Index</literal>注解,
+ å¯ä»¥å¨ç¹å®åä¸å®ä¹ç´¢å¼,columnNameså±æ§(attribute)å°éä¹è¢«å¿½ç¥.</para>
+
+ <programlisting>@Column(secondaryTable="Cat1")
+ at Index(name="story1index")
+public String getStoryPart1() {
+ return storyPart1;
+}</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>@Parent</title>
+
+ <para>å¨åµå
¥å¼å¯¹è±¡å
é¨,ä½ å¯ä»¥å¨é£äºæå该åµå
¥å¼å¯¹è±¡æå±å
ç´ çå±æ§ä¸å®ä¹è¯¥æ³¨è§£.</para>
+
+ <programlisting>@Entity
+public class Person {
+ @Embeddable public Address address;
+ ...
+}
+
+ at Embeddable
+public class Address {
+ @Parent public Person owner;
+ ...
+}
+
+
+person == person.address.owner</programlisting>
+ </sect3>
+
+ <sect3>
+ <title>çæçå±æ§</title>
+
+ <para>
+ æäºå±æ§å¯ä»¥å¨å¯¹æ°æ®åºåæå
¥ææ´æ°æä½çæ¶åçæ.
+ Hibernateè½å¤å¤çè¿æ ·çå±æ§,并触åä¸ä¸ªåç»çæ¥è¯¢æ¥è¯»åè¿äºå±æ§.
+ </para>
+
+ <programlisting>@Entity
+public class Antenna {
+ @Id public Integer id;
+ @Generated(GenerationTime.ALWAYS) @Column(insertable = false, updatable = false)
+ public String longitude;
+
+ @Generated(GenerationTime.INSERT) @Column(insertable = false)
+ public String latitude;
+}</programlisting>
+
+ <para>
+ ä½ å¯ä»¥å°å±æ§æ³¨è§£ä¸º<literal>@Generated</literal>.
+ ä½æ¯ä½ è¦æ³¨æinsertabilityåupdatabilityä¸è¦åä½ éæ©ççæçç¥å²çª.
+ å¦æéæ©äºGenerationTime.INSERT,该å±æ§ä¸è½å
å«insertableå,
+ å¦æéæ©äºGenerationTime.ALWAYS,该å±æ§ä¸è½å
å«insertableåupdatableå.</para>
+
+ <para><literal>@Version</literal>å±æ§ä¸å¯ä»¥ä¸º
+ <literal>@Generated(INSERT)</literal>(设计æ¶), åªè½æ¯
+ <literal>NEVER</literal>æ<literal>ALWAYS</literal>.</para>
+ </sect3>
+
+ </sect2>
+
+ <sect2>
+ <title>继æ¿</title>
+
+ <para>SINGLE_TABLE æ¯ä¸ªåè½å¼ºå¤§ççç¥,ä½ææ¶,ç¹å«å¯¹éçç³»ç»èè¨,
+ æ¯æ æ³å å
¥ä¸ä¸ªé¢å¤ç辨å«ç¬¦å.
+ ç±æ¤,Hibernateå¼å
¥äºè¾¨å«ç¬¦å
¬å¼(discriminator formula)çæ¦å¿µï¼
+ <literal>@DiscriminatorFormula</literal>æ¯<literal>@DiscriminatorColumn</literal>çæ¿ä»£å,
+ å®ä½¿ç¨SQLç段ä½ä¸ºè¾¨å«ç¬¦è§£å³æ¹æ¡çå
¬å¼( ä¸éè¦æä¸ä¸ªä¸é¨çå段).</para>
+
+ <programlisting>@Entity
+ at DiscriminatorForumla("case when forest_type is null then 0 else forest_type end")
+public class Forest { ... }</programlisting>
+ </sect2>
+
+ <sect2>
+ <title>å
³äºå个å
³èå
³ç³»ç注解</title>
+
+ <para>é»è®¤æ
åµä¸,å½é¢æç被å
³èå
ç´ ä¸å¨æ°æ®åºä¸(å
³ä¹å
³èåçé误id),è´ä½¿Hiberanteæ æ³è§£å³å
³èæ§é®é¢æ¶,Hibernateå°±ä¼æåºå¼å¸¸.
+ è¿å¯¹éçschemaååç»æå£ç»´æ¤çschemaèè¨,è¿ææ许å¤ä¸ä¾¿.
+ æ¤æ¶,ä½ å¯ç¨ <literal>@NotFound </literal>注解让Hibernateç¥è¿è¿æ ·çå
ç´ èä¸æ¯æåºå¼å¸¸.
+ 该注解å¯ç¨äº <literal>@OneToOne </literal> (æå¤é®)ã <literal>@ManyToOne </literal>ã
+ <literal>@OneToMany </literal> æ <literal>@ManyToMany </literal>å
³è.</para>
+
+ <programlisting>@Entity
+public class Child {
+ ...
+ @ManyToOne
+ @NotFound(action=NotFoundAction.IGNORE)
+ public Parent getParent() { ... }
+ ...
+}</programlisting>
+
+ <para>
+ ææ¶åå é¤æå®ä½çæ¶åéè¦è§¦åæ°æ®åºç级èå é¤.</para>
+
+ <programlisting>@Entity
+public class Child {
+ ...
+ @ManyToOne
+ @OnDelete(action=OnDeleteAction.CASCADE)
+ public Parent getParent() { ... }
+ ...
+}</programlisting>
+
+ <para>ä¸é¢è¿ä¸ªä¾åä¸,Hibernateå°çæä¸ä¸ªæ°æ®åºçº§ç级èå é¤çº¦æ.</para>
+
+ <sect3>
+ <title>延è¿é项åè·å模å¼</title>
+
+ <para>
+ EJB3为延è¿å è½½åè·å模å¼æä¾äº<literal>fetch</literal>é项,èHibernate
+ è¿æ¹é¢æä¾äºæ´ä¸°å¯çé项é.为äºæ´å¥½çè°æ´å»¶è¿å è½½åè·åçç¥,Hibernateå¼å
¥äº
+ ä¸äºéå ç注解:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>@LazyToOne</literal>: å®ä¹äº
+ <literal>@ManyToOne</literal> å <literal>@OneToOne</literal>
+ å
³èç延è¿é项. <literal>LazyToOneOption</literal> å¯ä»¥æ¯
+ <literal>PROXY</literal> (ä¾å¦:åºäºä»£çç延è¿å è½½),
+ <literal>NO_PROXY</literal> (ä¾å¦:åºäºåèç å¢å¼ºç延è¿å è½½ - 注æéè¦å¨æ建æå¤çåèç )
+ å <literal>FALSE</literal> (é延è¿å è½½çå
³è)</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>@LazyCollection</literal>: å®ä¹äº
+ <literal>@ManyToMany</literal>å
+ <literal>@OneToMany</literal> å
³èç延è¿é项. LazyCollectionOption
+ å¯ä»¥æ¯<literal>TRUE</literal> (éåå
·æ延è¿æ§,åªæå¨è®¿é®çæ¶åæå è½½),
+ <literal>EXTRA</literal> (éåå
·æ延è¿æ§,并ä¸ææçæä½é½ä¼å°½éé¿å
å è½½éå,
+ 对äºä¸ä¸ªå·¨å¤§çéåç¹å«æç¨,å 为è¿æ ·çéåä¸çå
ç´ æ²¡æå¿
è¦å
¨é¨å è½½)å FALSE
+ (é延è¿å è½½çå
³è)</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>@Fetch</literal>:
+ å®ä¹äºå è½½å
³èå
³ç³»çè·åçç¥. <literal>FetchMode</literal> å¯ä»¥æ¯
+ <literal>SELECT</literal> (å¨éè¦å è½½å
³èçæ¶å触åselectæä½),
+ <literal>SUBSELECT</literal>
+ (åªå¯¹éåææ,使ç¨äºåæ¥è¯¢çç¥,详æ
åèHibernateåèææ¡£) or
+ <literal>JOIN</literal> (å¨å 载主å®ä½(owner entity)çæ¶å使ç¨SQL JOINæ¥å è½½å
³èå
³ç³»).
+ <literal>JOIN</literal> å°è¦åä»»ä½å»¶è¿å±æ§
+ (éè¿<literal>JOIN</literal>çç¥å è½½çå
³èå°ä¸åå
·æ延è¿æ§).</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The Hibernate annotations overrides the EJB3 fetching
+ options.</para>
+
+ <para>Hibernate注解è¦åäºEJB3æä¾çè·å(fetch)é项.</para>
+
+ <table>
+ <title>延è¿åè·åé项ççæ注解</title>
+
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry>Annotations</entry>
+
+ <entry>Lazy</entry>
+
+ <entry>Fetch</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>@[One|Many]ToOne](fetch=FetchType.LAZY)</entry>
+
+ <entry>@LazyToOne(PROXY)</entry>
+
+ <entry>@Fetch(SELECT)</entry>
+ </row>
+
+ <row>
+ <entry>@[One|Many]ToOne](fetch=FetchType.EAGER)</entry>
+
+ <entry>@LazyToOne(FALSE)</entry>
+
+ <entry>@Fetch(JOIN)</entry>
+ </row>
+
+ <row>
+ <entry>@ManyTo[One|Many](fetch=FetchType.LAZY)</entry>
+
+ <entry>@LazyCollection(TRUE)</entry>
+
+ <entry>@Fetch(SELECT)</entry>
+ </row>
+
+ <row>
+ <entry>@ManyTo[One|Many](fetch=FetchType.EAGER)</entry>
+
+ <entry>@LazyCollection(FALSE)</entry>
+
+ <entry>@Fetch(JOIN)</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </sect3>
+
+
+ </sect2>
+
+ <sect2 id="entity-hibspec-collection" revision="2">
+ <title>å
³äºéåç±»åç注解</title>
+
+ <sect3>
+ <title>åæ°æ³¨è§£</title>
+
+ <para>以ä¸æ¯å¯è½ç设置æ¹å¼<itemizedlist>
+ <listitem>
+ ç¨@BatchSizebatch设置éåçbatch大å°
+ </listitem>
+
+ <listitem>
+ ç¨@Where注解设置Whereåå¥
+ </listitem>
+
+ <listitem>
+ ç¨æ³¨è§£@Checkæ¥è®¾ç½®checkåå¥
+ </listitem>
+
+ <listitem>
+ ç¨æ³¨è§£@OrderByæ¥è®¾ç½®SQLçorder byåå¥
+ </listitem>
+
+ <listitem>
+ å©ç¨@OnDelete(action=OnDeleteAction.CASCADE) 注解设置级è¿å é¤çç¥
+ </listitem>
+ </itemizedlist></para>
+
+ <para>ä½ ä¹å¯ä»¥å©ç¨<literal>@Sort</literal>注解å®ä¹ä¸ä¸ªæåºæ¯è¾å¨(sort comparator),
+ 表æå¸æçæ¯è¾å¨ç±»å,æ åºãèªç¶é¡ºåºæèªå®ä¹æåº,ä¸è
æ©ä¸.è¥ä½ æ³ç¨ä½ èªå·±å®ç°çcomparator,
+ ä½ è¿éè¦å©ç¨<literal>comparator</literal>å±æ§(attribute)ææå®ç°ç±».</para>
+
+ <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+ @JoinColumn(name="CUST_ID")
+ @Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
+ @Where(clause="1=1")
+ @OnDelete(action=OnDeleteAction.CASCADE)
+ public SortedSet<Ticket> getTickets() {
+ return tickets;
+ }</programlisting>
+
+ <para>å
³äºè¿äºæ³¨è§£æ´è¯¦ç»çä¿¡æ¯,请åé
æ¤åçæè¿°.</para>
+
+ </sect3>
+
+ <sect3>
+ <title>æ´å¤çéåç±»å</title>
+
+ <para>æ¯EJB3æ´èä¸ç¹çæ¯,Hibernate Annotationsæ¯æçæ£ç
+ <classname>List</classname>å<classname>Array</classname>.
+ æ å°éåçæ¹å¼å以åå®å
¨ä¸æ ·,åªä¸è¿è¦æ°å¢<literal>@IndexColumn</literal>注解.
+ 该注解å
è®¸ä½ ææåæ¾ç´¢å¼å¼çå段.ä½ è¿å¯ä»¥å®ä¹ä»£è¡¨æ°æ®åºä¸é¦ä¸ªå
ç´ çç´¢å¼å¼(亦称为索å¼åºæ°).
+ 常è§åå¼ä¸º<literal>0</literal>æ<literal>1</literal>.</para>
+
+ <programlisting>@OneToMany(cascade = CascadeType.ALL)
+ at IndexColumn(name = "drawer_position", base=1)
+public List<Drawer> getDrawers() {
+ return drawers;
+}</programlisting>
+
+ <note>
+ <para>åå¦ä½ å¿äºè®¾ç½®<literal>@IndexColumn</literal>,
+ Hibernateä¼éç¨å
(bag)è¯ä¹(è¯æ³¨ï¼å³å
许éå¤å
ç´ çæ åºéå).</para>
+ </note>
+
+ <para>Hibernate注解æ¯ætrue Mapæ å°,
+ å¦æ没æ设置<literal>@javax.persistence.MapKey</literal>,
+ hibernateå°keyå
ç´ æåµå
¥å¼å¯¹è±¡ç´æ¥æ å°å°ä»ä»¬æå±çå.
+ è¦è¦åé»è®¤çå,å¯ä»¥ä½¿ç¨ä»¥ä¸æ³¨è§£:
+ <literal>@org.hibernate.annotations.MapKey</literal>éç¨çkey为åºæ¬ç±»åæè
åµå
¥å¼å¯¹è±¡,
+ <literal>@org.hibernate.annotations.MapKey</literal>éç¨çkey为å®ä½.
+ </para>
+
+ <para>Hibernate Annotationsè¿æ¯ææ ¸å¿ç±»åéå(Integer, String, Enums, ......)ã
+ å¯å
åµå¯¹è±¡çéå,çè³åºæ¬ç±»åæ°ç».è¿å°±æ¯æè°çå
ç´ éå.</para>
+
+ <para>å
ç´ éåå¯ç¨@CollectionOfElementsæ¥æ³¨è§£(ä½ä¸º@OneToManyçæ¿ä»£).
+ 为äºå®ä¹éå表(è¯æ³¨ï¼å³åæ¾éåå
ç´ ç表,ä¸ä¸é¢æå°ç主表对åº),è¦å¨å
³èå±æ§ä¸ä½¿ç¨@JoinTable注解,
+ joinColumnså®ä¹äºä»ä¹å®ä½ä¸»è¡¨ä¸éå表ä¹é´çè¿æ¥å段(inverseJoincolumnæ¯æ æçä¸å
¶å¼åºä¸ºç©º).
+ 对äºæ ¸å¿ç±»åçéåæåºæ¬ç±»åæ°ç»,ä½ å¯ä»¥å¨å
³èå±æ§ä¸ç¨<literal>@Column</literal>æ¥è¦çåæ¾å
ç´ å¼çå段çå®ä¹.
+ ä½ è¿å¯ä»¥ç¨<literal>@AttributeOverride</literal>æ¥è¦çåæ¾å¯å
åµå¯¹è±¡çå段çå®ä¹.
+ è¦è®¿é®éåå
ç´ ,éè¦å°è¯¥æ³¨è§£çnameå±æ§å¼è®¾ç½®ä¸º"element"("element"ç¨äºæ ¸å¿ç±»å,è"element.serial"
+ ç¨äºåµå
¥å¼å¯¹è±¡çserialå±æ§).è¦è®¿é®éåçindex/key,åå°è¯¥æ³¨è§£çnameå±æ§å¼è®¾ç½®ä¸º"key".
+ </para>
+
+ <programlisting>@Entity
+public class Boy {
+ private Integer id;
+ private Set<String> nickNames = new HashSet<String>();
+ private int[] favoriteNumbers;
+ private Set<Toy> favoriteToys = new HashSet<Toy>();
+ private Set<Character> characters = new HashSet<Character>();
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ public Set<String></emphasis> getNickNames() {
+ return nickNames;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ @JoinTable(
+ table=@Table(name="BoyFavoriteNumbers"),
+ joinColumns = @JoinColumn(name="BoyId")
+ )
+ @Column(name="favoriteNumber", nullable=false)</emphasis>
+ @IndexColumn(name="nbr_index")
+ public int[] getFavoriteNumbers() {
+ return favoriteNumbers;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ @AttributeOverride( name="element.serial", column=@Column(name="serial_nbr") )</emphasis>
+ public Set<Toy> getFavoriteToys() {
+ return favoriteToys;
+ }
+
+ <emphasis role="bold">@CollectionOfElements
+ public Set<Character></emphasis> getCharacters() {
+ return characters;
+ }
+ ...
+}
+
+public enum Character {
+ GENTLE,
+ NORMAL,
+ AGGRESSIVE,
+ ATTENTIVE,
+ VIOLENT,
+ CRAFTY
+}
+
+ at Embeddable
+public class Toy {
+ public String name;
+ public String serial;
+ public Boy owner;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSerial() {
+ return serial;
+ }
+
+ public void setSerial(String serial) {
+ this.serial = serial;
+ }
+
+ <emphasis role="bold">@Parent</emphasis>
+ public Boy getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Boy owner) {
+ this.owner = owner;
+ }
+
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final Toy toy = (Toy) o;
+
+ if ( !name.equals( toy.name ) ) return false;
+ if ( !serial.equals( toy.serial ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = name.hashCode();
+ result = 29 * result + serial.hashCode();
+ return result;
+ }
+}</programlisting>
+
+ <para>
+ å¨åµå
¥å¼å¯¹è±¡çéåä¸,å¯ä»¥ä½¿ç¨ <literal>@Parent</literal>注解åµå
¥å¼å¯¹è±¡çæå±æ§.
+ 该å±æ§æå该åµå
¥å¼å¯¹è±¡æå±çéåå®ä½.</para>
+
+ <note>
+ <para>æ§ççHibernate Annotationsç¨<literal>@OneToMany</literal>æ¥æ è¯éåå
ç´ .
+ ç±äºè¯ä¹çç¾,æ们å¼å
¥äº<literal>@CollectionOfElements</literal>注解.
+ ç¨<literal>@OneToMany</literal>æ¥æ è¯éåå
ç´ çè¿ç§æ§ææ¹å¼ç®åå°ææ,
+ ä½æ¯ä¸æ¨è使ç¨,èä¸å¨ä»¥åçåå¸çæ¬ä¸ä¸åæ¯æè¿ç§æ¹å¼.</para>
+ </note>
+ </sect3>
+ </sect2>
+
+ <sect2>
+ <title>ç¼å</title>
+
+ <para>为äºä¼åæ°æ®åºè®¿é®,ä½ å¯ä»¥æ¿æ´»æè°çHibernateäºçº§ç¼å.该ç¼åæ¯å¯ä»¥ææ¯ä¸ªå®ä½åéåè¿è¡é
ç½®ç.</para>
+
+ <para><literal>@org.hibernate.annotations.Cache</literal>å®ä¹äºç¼åçç¥åç»å®çäºçº§ç¼åçèå´.
+ æ¤æ³¨è§£éç¨äºæ ¹å®ä½(éåå®ä½),è¿æéå.</para>
+
+ <programlisting>@Entity
+ at Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
+public class Forest { ... }</programlisting>
+
+ <programlisting> @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+ @JoinColumn(name="CUST_ID")
+ @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
+ public SortedSet<Ticket> getTickets() {
+ return tickets;
+ }</programlisting>
+
+ <para></para>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="2 55" id="hm1" />
+
+ <area coords="3 55" id="hm2" />
+
+ <area coords="4 55" id="hm3" />
+ </areaspec>
+
+ <programlisting>@Cache(
+ CacheConcurrencyStrategy usage();
+ String region() default "";
+ String include() default "all";
+)</programlisting>
+
+ <calloutlist>
+ <callout arearefs="hm1">
+ <para>usage: ç»å®ç¼åç并åçç¥(NONE,
+ READ_ONLY, NONSTRICT_READ_WRITE, READ_WRITE, TRANSACTIONAL)</para>
+ </callout>
+
+ <callout arearefs="hm2">
+ <para>region (å¯éç)ï¼ç¼åèå´(é»è®¤ä¸ºç±»çå
¨éå®ç±»åææ¯éåçå
¨éå®è§è²å)</para>
+ </callout>
+
+ <callout arearefs="hm3">
+ <para><literal>include</literal> (å¯éç)ï¼å¼ä¸ºallæ¶å
æ¬äºææçå±æ§(proterty),
+ 为non-lazyæ¶ä»
å«é延è¿å±æ§(é»è®¤å¼ä¸ºall)</para>
+ </callout>
+ </calloutlist>
+
+ </programlistingco>
+ </sect2>
+
+ <sect2>
+ <title>è¿æ»¤å¨</title>
+
+ <para>Hibernateå
·ææ°æ®è¿æ»¤å¨çæ¦å¿µ,å¯å¨è¿è¡æåºç¨äºä¸ä¸ªç»å®çsession.è¿æ»¤å¨éè¦äºå
å®ä¹å¥½.</para>
+
+ <para><literal>@org.hibernate.annotations.FilterDef</literal> æ
+ <literal>@FilterDefs</literal> å®ä¹è¿æ»¤å¨å£°æ,为ååè¿æ»¤å¨æç¨.
+ è¿æ»¤å¨å£°æ带æä¸ä¸ªname()åä¸ä¸ªparameters()æ°ç»,<literal>@ParamDef</literal>å
å«nameåtype,
+ ä½ è¿å¯ä»¥ä¸ºç»å®ç<literal>@filterDef</literal>å®ä¹ä¸ä¸ªdefaultCondition()åæ°,
+ å½<literal>@Filter</literal>ä¸æ²¡æä»»ä½å®ä¹æ¶,å¯ä½¿ç¨è¯¥åæ°å®ä¹ç¼ºçæ¡ä»¶.
+ <literal>@FilterDef</literal> (s)å¯ä»¥å¨ç±»æå
ä¸çº§è¿è¡å®ä¹.</para>
+
+ <para>ç°å¨æ们æ¥å®ä¹åºç¨äºå®ä½æéåå è½½æ¶çSQLè¿æ»¤å¨åå¥.æ们使ç¨<literal>@Filter</literal>,并å°å
¶ç½®äºå®ä½æéåå
ç´ ä¸.</para>
+
+ <para><programlisting>@Entity
+ at FilterDef(name="minLength", parameters={ @ParamDef( name="minLength", type="integer" ) } )
+ at Filters( {
+ @Filter(name="betweenLength", condition=":minLength <= length and :maxLength >= length"),
+ @Filter(name="minLength", condition=":minLength <= length")
+} )
+public class Forest { ... }</programlisting></para>
+ </sect2>
+
+
+ <sect2>
+ <title>æ¥è¯¢</title>
+
+ <para>ç±äºHibernateå¼å
¥äº
+ <literal>@org.hibernate.annotations.NamedQuery</literal>,
+ <literal>@org.hibernate.annotations.NamedQueries</literal>,
+ <literal>@org.hibernate.annotations.NamedNativeQuery</literal> å
+ <literal>@org.hibernate.annotations.NamedNativeQueries</literal> å½åå¼æ¥è¯¢,
+ å æ¤Hibernateå¨å½åå¼æ¥è¯¢ä¸æ¯EBJ3è§èä¸æå®ä¹çå½åå¼æ¥è¯¢æä¾äºæ´å¤çç¹æ§.
+ ä»ä»¬å¨æ åçä¸æ·»å äºå¯ä½ä¸ºæ¿ä»£åçä¸äºå±æ§(attributes):</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>flushMode: å®ä¹æ¥è¯¢çå·æ°æ¨¡å¼(Always, Auto, CommitæNever)</para>
+ </listitem>
+
+ <listitem>
+ <para>cacheable: æ¥è¯¢è¯¥ä¸è¯¥è¢«ç¼å</para>
+ </listitem>
+
+ <listitem>
+ <para>cacheRegion: è¥æ¥è¯¢å·²è¢«ç¼åæ¶æç¨ç¼åçèå´</para>
+ </listitem>
+
+ <listitem>
+ <para>fetchSize: é对该æ¥è¯¢çJDBC statementå次è·åè®°å½çæ°ç®</para>
+ </listitem>
+
+ <listitem>
+ <para>timeout: æ¥è¯¢è¶
æ¶</para>
+ </listitem>
+
+ <listitem>
+ <para>callable: ä»
ç¨äºæ¬å°åæ¥è¯¢(native query),对äºåå¨è¿ç¨è®¾ä¸ºtrue</para>
+ </listitem>
+
+ <listitem>
+ <para>comment: ä¸æ¦æ¿æ´»æ³¨éåè½,æ们ä¼å¨åæ°æ®åºäº¤éæ¥è¯¢è¯·æ±æ¶çå°æ³¨é</para>
+ </listitem>
+
+ <listitem>
+ <para>cacheMode: ç¼å交æ¤æ¨¡å¼(get, ignore,normal,ærefresh)</para>
+ </listitem>
+
+ <listitem>
+ <para>readOnly: ä¸ç®¡æ¯å¦ä»æ¥è¯¢è·åå
ç´ é½æ¯å¨åªè¯»æ¨¡å¼ä¸</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>注æ,EJB3å·²å
¬å¼çæç»èæ¡ä¸å¼å
¥äº<literal>@QueryHint</literal>çæ¦å¿µ,
+ è¿å¯è½æ¯å®ä¹hintsæ´å¥½çæ¹æ³.</para>
+ </sect2>
+ </sect1>
+
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/lucene.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules/lucene.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/lucene.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="lucene">
- <title id="lucene">Hibernateä¸Luceneéæ</title>
-
- <para>Luceneæ¯ä¸ä¸ªé«æ§è½çjavaæç´¢å¼æåºï¼å¯ä»¥ä» Apache软件åºéç»ç»è·åã
- Hibernate Annotationså
æ¬ä¸ä¸ªæ³¨è§£å
ï¼å®å
许æä»»ä½å模å对象æ 记为å¯ç´¢å¼çï¼
- 并ä¸å¯¹ä»»ä½ç»ç±Hibernateè¿è¡æç»åçå®ä¾ï¼Hibernate é½ä¼ä¸ºä¹ç»´æ¤ä¸ä¸ªå¯¹åºçLuceneç´¢å¼ã</para>
-
- <sect1 id="lucene-intro">
- <title>使ç¨Lucene为å®ä½å»ºç«ç´¢å¼</title>
-
- <sect2>
- <title>注解é¢å模å</title>
-
- <para>é¦å
ï¼å¿
é¡»å°ä¸ä¸ªæä¹
类声æ为
- <literal>@Indexed</literal>:</para>
-
- <programlisting>@Entity
- at Indexed(index="indexes/essays")
-public class Essay {
- ...
-}</programlisting>
-
- <para>å±æ§<literal>index</literal>æ¯åè¯Hibernateï¼ Luceneç´¢å¼ä¿¡æ¯æå¨çä½ç½®ï¼ä½ æ件系ç»çæ个ç®å½ï¼ã
- å¦æä½ æ³ä¸ºææçLuceneç´¢å¼å®ä¹ä¸ä¸ªæ ¹ç®å½ï¼ä½ å¯ä»¥å¨é
ç½®æ件ä¸ç¨å±æ§<literal>hibernate.lucene.index_dir</literal>è¿è¡é
ç½®ã
- </para>
-
- <para>Luceneç´¢å¼å
æ¬åç§å段ï¼<emphasis>keyword</emphasis> å段ï¼<emphasis>text</emphasis>
- å段ï¼<emphasis>unstored</emphasis>å段å<emphasis>unindexed</emphasis>å段ã
- Hibernate注解æä¾äºå°å®ä½å±æ§æ 记为åä¸ç§è¢«ç´¢å¼å段ç注解ã</para>
-
- <programlisting>@Entity
- at Indexed(index="indexes/essays")
-public class Essay {
- ...
-
- @Id
- @Keyword(id=true)
- public Long getId() { return id; }
-
- @Text(name="Abstract")
- public String getSummary() { return summary; }
-
- @Lob
- @Unstored
- public String getText() { return text; }
-
-}</programlisting>
-
- <para>è¿äºæ³¨è§£å®ä¹äºä¸ä¸ªå¸¦æä¸ä¸ªå段çç´¢å¼:
- <literal>Id</literal>, <literal>Abstract</literal> å
- <literal>Text</literal>.</para>
-
- <para>注æ:ä½ å¿
é¡»å¨ä½ çå®ä½ç±»çæ å¿å±æ§ä¸æå®
- <literal>@Keyword(id=true)</literal> .</para>
-
- <para>ç¨äºå¯¹å
ç´ å»ºç«ç´¢å¼çåæå¨ç±»æ¯å¯ä»¥éè¿<literal>hibernate.lucene.analyzer</literal>å±æ§è¿è¡é
ç½®çã
- å¦æ没æå®ä¹ï¼åæ <classname>org.apache.lucene.analysis.standard.StandardAnalyzer</classname>ä½ä¸ºç¼ºçã</para>
-
- </sect2>
-
- <sect2>
- <title>å¯ç¨èªå¨ç´¢å¼</title>
-
- <para>æ们æ¿æ´»ç¨äºå¸§å¬ä¸ç±»Hibernateäºä»¶ç <literal>LuceneEventListener</literal>ï¼
- è¿äºäºä»¶ä¼å¨åæ´è¢«æ交è³æ°æ®åºå产çã</para>
-
- <programlisting><hibernate-configuration>
- ...
- <event type="post-commit-update"
- <listener
- class="org.hibernate.lucene.event.LuceneEventListener"/>
- </event>
- <event type="post-commit-insert"
- <listener
- class="org.hibernate.lucene.event.LuceneEventListener"/>
- </event>
- <event type="post-commit-delete"
- <listener
- class="org.hibernate.lucene.event.LuceneEventListener"/>
- </event>
-</hibernate-configuration></programlisting>
- </sect2>
- </sect1>
-</chapter>
-
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/lucene.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules/lucene.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/lucene.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/lucene.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="lucene">
+ <title id="lucene">Hibernateä¸Luceneéæ</title>
+
+ <para>Luceneæ¯ä¸ä¸ªé«æ§è½çjavaæç´¢å¼æåºï¼å¯ä»¥ä» Apache软件åºéç»ç»è·åã
+ Hibernate Annotationså
æ¬ä¸ä¸ªæ³¨è§£å
ï¼å®å
许æä»»ä½å模å对象æ 记为å¯ç´¢å¼çï¼
+ 并ä¸å¯¹ä»»ä½ç»ç±Hibernateè¿è¡æç»åçå®ä¾ï¼Hibernate é½ä¼ä¸ºä¹ç»´æ¤ä¸ä¸ªå¯¹åºçLuceneç´¢å¼ã</para>
+
+ <sect1 id="lucene-intro">
+ <title>使ç¨Lucene为å®ä½å»ºç«ç´¢å¼</title>
+
+ <sect2>
+ <title>注解é¢å模å</title>
+
+ <para>é¦å
ï¼å¿
é¡»å°ä¸ä¸ªæä¹
类声æ为
+ <literal>@Indexed</literal>:</para>
+
+ <programlisting>@Entity
+ at Indexed(index="indexes/essays")
+public class Essay {
+ ...
+}</programlisting>
+
+ <para>å±æ§<literal>index</literal>æ¯åè¯Hibernateï¼ Luceneç´¢å¼ä¿¡æ¯æå¨çä½ç½®ï¼ä½ æ件系ç»çæ个ç®å½ï¼ã
+ å¦æä½ æ³ä¸ºææçLuceneç´¢å¼å®ä¹ä¸ä¸ªæ ¹ç®å½ï¼ä½ å¯ä»¥å¨é
ç½®æ件ä¸ç¨å±æ§<literal>hibernate.lucene.index_dir</literal>è¿è¡é
ç½®ã
+ </para>
+
+ <para>Luceneç´¢å¼å
æ¬åç§å段ï¼<emphasis>keyword</emphasis> å段ï¼<emphasis>text</emphasis>
+ å段ï¼<emphasis>unstored</emphasis>å段å<emphasis>unindexed</emphasis>å段ã
+ Hibernate注解æä¾äºå°å®ä½å±æ§æ 记为åä¸ç§è¢«ç´¢å¼å段ç注解ã</para>
+
+ <programlisting>@Entity
+ at Indexed(index="indexes/essays")
+public class Essay {
+ ...
+
+ @Id
+ @Keyword(id=true)
+ public Long getId() { return id; }
+
+ @Text(name="Abstract")
+ public String getSummary() { return summary; }
+
+ @Lob
+ @Unstored
+ public String getText() { return text; }
+
+}</programlisting>
+
+ <para>è¿äºæ³¨è§£å®ä¹äºä¸ä¸ªå¸¦æä¸ä¸ªå段çç´¢å¼:
+ <literal>Id</literal>, <literal>Abstract</literal> å
+ <literal>Text</literal>.</para>
+
+ <para>注æ:ä½ å¿
é¡»å¨ä½ çå®ä½ç±»çæ å¿å±æ§ä¸æå®
+ <literal>@Keyword(id=true)</literal> .</para>
+
+ <para>ç¨äºå¯¹å
ç´ å»ºç«ç´¢å¼çåæå¨ç±»æ¯å¯ä»¥éè¿<literal>hibernate.lucene.analyzer</literal>å±æ§è¿è¡é
ç½®çã
+ å¦æ没æå®ä¹ï¼åæ <classname>org.apache.lucene.analysis.standard.StandardAnalyzer</classname>ä½ä¸ºç¼ºçã</para>
+
+ </sect2>
+
+ <sect2>
+ <title>å¯ç¨èªå¨ç´¢å¼</title>
+
+ <para>æ们æ¿æ´»ç¨äºå¸§å¬ä¸ç±»Hibernateäºä»¶ç <literal>LuceneEventListener</literal>ï¼
+ è¿äºäºä»¶ä¼å¨åæ´è¢«æ交è³æ°æ®åºå产çã</para>
+
+ <programlisting><hibernate-configuration>
+ ...
+ <event type="post-commit-update"
+ <listener
+ class="org.hibernate.lucene.event.LuceneEventListener"/>
+ </event>
+ <event type="post-commit-insert"
+ <listener
+ class="org.hibernate.lucene.event.LuceneEventListener"/>
+ </event>
+ <event type="post-commit-delete"
+ <listener
+ class="org.hibernate.lucene.event.LuceneEventListener"/>
+ </event>
+</hibernate-configuration></programlisting>
+ </sect2>
+ </sect1>
+</chapter>
+
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/setup.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules/setup.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/setup.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,129 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter>
- <title id="setup" revision="1">å建ä¸ä¸ªæ³¨è§£é¡¹ç®</title>
-
- <section id="setup-requirements">
- <title>ç³»ç»éæ±</title>
-
- <itemizedlist>
- <listitem>
- <para>é¦å
ä»Hibernateå®æ¹ç½ç«ä¸è½½å¹¶è§£åHibernate Annotationsçåå¸å
ã</para>
- </listitem>
-
- <listitem>
- <para><emphasis>è¿ä¸ªçæ¬(é¢è§ç)è¦æ±ä½¿ç¨Hibernate 3.2.0.CR2ææ´é«çæ¬ã请ä¸è¦åèçæ¬çHibernate 3.xæ··åèµ·æ¥ä½¿ç¨ã</emphasis></para>
- </listitem>
-
- <listitem>
- <para>è¿ä¸ªçæ¬å¨Hibernate core 3.2.0.CR2çåºç¡ä¸å·¥ä½è¯å¥½ã</para>
- </listitem>
-
- <listitem>
- <para>é¦å
ç¡®å®ä½ å·²ç»å®è£
äºJDK 5.0ãå½ç¶å°±ç®ä½¿ç¨ä½çæ¬çJDKï¼
- Xdocletä¹å¯ä»¥æä¾ï¼åºäºæ³¨è§£çï¼å
æ°æ®æ带æ¥çé¨ååè½ã
- ä¸è¿è¯·æ³¨ææ¬ææ¡£åªæè¿°è·JDK5.0注解æå
³çå
容ï¼å
³äºXdoclet请åèç¸å
³ææ¡£ã</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section id="setup-configuration">
- <title>ç³»ç»é
ç½®</title>
-
- <para>é¦å
å°±æ¯è®¾ç½®classpath(å½ç¶æ¯å¨IDEä¸å建äºä¸ä¸ªæ°é¡¹ç®ä¹å)ã <itemizedlist>
- <listitem>
- <para>å°Hibernate3æ ¸å¿æ件以åå
¶ä¾èµç第ä¸æ¹åºæ件(请åèlib/README.txtæ件)å å
¥å°ä½ çclasspathéé¢ã</para>
- </listitem>
-
- <listitem>
- <para>å°<filename>hibernate-annotations.jar</filename>
- å<filename>lib/ejb3-persistence.jar</filename>å å
¥å°ä½ çclasspathéé¢ã</para>
- </listitem>
-
- <listitem>
- <para>å¦æè¦ä½¿ç¨ <xref linkend="lucene" />ï¼è¿éè¦å°luceneçjaræ件å å
¥ä½ çclasspathã</para>
- </listitem>
- </itemizedlist></para>
-
- <para>æ们æ¨èå¨ä¸ä¸ªå
è£
å¨(wrapper)ç±»<classname>HibernateUtil</classname>
- çéæåå§å代ç åä¸å¯å¨Hibernateãæè®¸ä½ å¨Hibernateææ¡£çå
¶ä»å¾å¤å°æ¹çå°è¿è¿ä¸ªç±»ï¼
- ä½æ¯è¦å¨ä½ ç项ç®ä¸ä½¿ç¨æ³¨è§£ï¼è¿éè¦å¯¹è¿ä¸ªè¾
å©(helper)ç±»è¿è¡æ©å±ãæ©å±å¦ä¸:
- <programlisting>package hello;
-
-import org.hibernate.*;
-import org.hibernate.cfg.*;
-import test.*;
-import test.animals.Dog;
-
-public class HibernateUtil {
-
-private static final SessionFactory sessionFactory;
-
- static {
- try {
-
- sessionFactory = new <emphasis role="bold">AnnotationConfiguration()</emphasis>.buildSessionFactory();
- } catch (Throwable ex) {
- // Log exception!
- throw new ExceptionInInitializerError(ex);
- }
- }
-
- public static Session getSession()
- throws HibernateException {
- return sessionFactory.openSession();
- }
-}
- </programlisting></para>
-
- <para>è¿éæ¯è¾æææçæ¯ä½¿ç¨å°äº<classname>AnnotationConfiguration</classname>ç±»ã
- å¨XMLé
ç½®æ件(é常æ¯<filename>hibernate.cfg.xml</filename>)ä¸åå®ä¹äºå
åç»è¿æ³¨è§£çç±»ãä¸é¢çxmlååé¢ç声æçä»·:
- </para>
-
- <programlisting><!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
-
- <hibernate-configuration>
- <session-factory>
- <emphasis role="bold"><mapping package="test.animals"/>
- <mapping class="test.Flight"/>
- <mapping class="test.Sky"/>
- <mapping class="test.Person"/>
- <mapping class="test.animals.Dog"/></emphasis>
-<emphasis role="bold"> <mapping resource="test/animals/orm.xml"/></emphasis>
- </session-factory>
- </hibernate-configuration>
- </programlisting>
-
- <para>注æç°å¨ä½ å¯ä»¥æ··å使ç¨hbm.xmlå注解ãèµæºå
ç´ (resource element)å¯ä»¥æ¯hbmæ件ä¹å¯ä»¥æ¯EJB3 XMLåå¸æ述符ï¼æ¤å·®å«å¯¹äºé
ç½®è¿ç¨æ¯éæçã</para>
-
- <para>é¤äºä¸é¢çæ¹å¼,ä½ è¿å¯ä»¥éè¿ç¼ç¨çæ¹å¼å®ä¹å
æ¬æ³¨è§£çç±»åå
</para>
-
- <programlisting> sessionFactory = new <emphasis role="bold">AnnotationConfiguration()
- .addPackage("test.animals") //the fully qualified package name
- .addAnnotatedClass(Flight.class)
- .addAnnotatedClass(Sky.class)
- .addAnnotatedClass(Person.class)
- .addAnnotatedClass(Dog.class)</emphasis>
- .buildSessionFactory();</programlisting>
-
- <para>ä½ ä¹å¯ä»¥ä½¿ç¨Hibernate Entity Manageræ¥å®æ以ä¸åè½ãHibernate Entity Manageræèªå·±çä¸å¥é
ç½®æºå¶ï¼è¯¦æ
请åèç¸å
³ææ¡£ã</para>
-
- <para>é¤äºå¯å¨æ¹å¼åé
ç½®æ件æææ¹åä¹å¤ï¼ç»å注解æ¥ä½¿ç¨Hibernate APIå以å没æä»ä¹åºå«ï¼
- å¨å
¶ä»æ¹é¢ä½ è¿æ¯å¯ä»¥ç»§ç»ä¿æ以åçä¹ æ¯åå好(<filename>hibernate.properties</filename>ï¼
- <filename>hibernate.cfg.xml</filename>ï¼ programmatic APIsçç)ã
- çè³å¯¹äºåä¸ä¸ª<classname>SessionFactory</classname>ï¼ä½ é½å¯ä»¥æ··å带注解çæä¹
类以åä¼ ç»çbm.cfg.xml声ææ¹å¼ã
- ç¶èä½ ä¸è½å¤æ¬¡å£°æåä¸ä¸ªç±»(è¦ä¹éè¿æ³¨è§£è¦ä¹éè¿hbm.xmlé
ç½®æ件)ï¼
- èä¸å¨ä¸ä¸ªæ å°å®ä½ç类继æ¿å±æ¬¡ä¸ï¼è¿ä¸¤ä¸ªé
ç½®çç¥ä¸è½åæ¶ä½¿ç¨.
- </para>
-
- <para>为äºç®åä»hbmæ件å°æ³¨è§£çè¿ç§»è¿ç¨ï¼
- é
ç½®æºå¶å°èªå¨æ£æµå¨æ³¨è§£åhbmæ件ä¸éå¤çæ å°ã
- é»è®¤æ
åµä¸hbmæ件ä¸ç声ææ¯ç±»ä¸ç注解å
æ°æ®å
·ææ´é«çä¼å
级ã
- è¿ç§ä¼å
级ç设å®æ¯ä»¥ç±»ä¸ºåä½çã
- ä½ ä¹å¯ä»¥éè¿<literal>hibernate.mapping.precedence</literal>ä¿®æ¹è¿ç§ä¼å
级ã
- é»è®¤çå¼æ¯<literal>hbm, class</literal>ï¼
- å¦ææ¹ä¸º<literal>class,hbm</literal>ï¼å½åçå²çªçæ¶åï¼ç±»ä¸ç注解å°æ¯hbmæ件å
·ææ´é«çä¼å
级ã
- </para>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/setup.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules/setup.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/setup.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/setup.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,129 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter>
+ <title id="setup" revision="1">å建ä¸ä¸ªæ³¨è§£é¡¹ç®</title>
+
+ <section id="setup-requirements">
+ <title>ç³»ç»éæ±</title>
+
+ <itemizedlist>
+ <listitem>
+ <para>é¦å
ä»Hibernateå®æ¹ç½ç«ä¸è½½å¹¶è§£åHibernate Annotationsçåå¸å
ã</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>è¿ä¸ªçæ¬(é¢è§ç)è¦æ±ä½¿ç¨Hibernate 3.2.0.CR2ææ´é«çæ¬ã请ä¸è¦åèçæ¬çHibernate 3.xæ··åèµ·æ¥ä½¿ç¨ã</emphasis></para>
+ </listitem>
+
+ <listitem>
+ <para>è¿ä¸ªçæ¬å¨Hibernate core 3.2.0.CR2çåºç¡ä¸å·¥ä½è¯å¥½ã</para>
+ </listitem>
+
+ <listitem>
+ <para>é¦å
ç¡®å®ä½ å·²ç»å®è£
äºJDK 5.0ãå½ç¶å°±ç®ä½¿ç¨ä½çæ¬çJDKï¼
+ Xdocletä¹å¯ä»¥æä¾ï¼åºäºæ³¨è§£çï¼å
æ°æ®æ带æ¥çé¨ååè½ã
+ ä¸è¿è¯·æ³¨ææ¬ææ¡£åªæè¿°è·JDK5.0注解æå
³çå
容ï¼å
³äºXdoclet请åèç¸å
³ææ¡£ã</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section id="setup-configuration">
+ <title>ç³»ç»é
ç½®</title>
+
+ <para>é¦å
å°±æ¯è®¾ç½®classpath(å½ç¶æ¯å¨IDEä¸å建äºä¸ä¸ªæ°é¡¹ç®ä¹å)ã <itemizedlist>
+ <listitem>
+ <para>å°Hibernate3æ ¸å¿æ件以åå
¶ä¾èµç第ä¸æ¹åºæ件(请åèlib/README.txtæ件)å å
¥å°ä½ çclasspathéé¢ã</para>
+ </listitem>
+
+ <listitem>
+ <para>å°<filename>hibernate-annotations.jar</filename>
+ å<filename>lib/ejb3-persistence.jar</filename>å å
¥å°ä½ çclasspathéé¢ã</para>
+ </listitem>
+
+ <listitem>
+ <para>å¦æè¦ä½¿ç¨ <xref linkend="lucene" />ï¼è¿éè¦å°luceneçjaræ件å å
¥ä½ çclasspathã</para>
+ </listitem>
+ </itemizedlist></para>
+
+ <para>æ们æ¨èå¨ä¸ä¸ªå
è£
å¨(wrapper)ç±»<classname>HibernateUtil</classname>
+ çéæåå§å代ç åä¸å¯å¨Hibernateãæè®¸ä½ å¨Hibernateææ¡£çå
¶ä»å¾å¤å°æ¹çå°è¿è¿ä¸ªç±»ï¼
+ ä½æ¯è¦å¨ä½ ç项ç®ä¸ä½¿ç¨æ³¨è§£ï¼è¿éè¦å¯¹è¿ä¸ªè¾
å©(helper)ç±»è¿è¡æ©å±ãæ©å±å¦ä¸:
+ <programlisting>package hello;
+
+import org.hibernate.*;
+import org.hibernate.cfg.*;
+import test.*;
+import test.animals.Dog;
+
+public class HibernateUtil {
+
+private static final SessionFactory sessionFactory;
+
+ static {
+ try {
+
+ sessionFactory = new <emphasis role="bold">AnnotationConfiguration()</emphasis>.buildSessionFactory();
+ } catch (Throwable ex) {
+ // Log exception!
+ throw new ExceptionInInitializerError(ex);
+ }
+ }
+
+ public static Session getSession()
+ throws HibernateException {
+ return sessionFactory.openSession();
+ }
+}
+ </programlisting></para>
+
+ <para>è¿éæ¯è¾æææçæ¯ä½¿ç¨å°äº<classname>AnnotationConfiguration</classname>ç±»ã
+ å¨XMLé
ç½®æ件(é常æ¯<filename>hibernate.cfg.xml</filename>)ä¸åå®ä¹äºå
åç»è¿æ³¨è§£çç±»ãä¸é¢çxmlååé¢ç声æçä»·:
+ </para>
+
+ <programlisting><!DOCTYPE hibernate-configuration PUBLIC
+ "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+ <hibernate-configuration>
+ <session-factory>
+ <emphasis role="bold"><mapping package="test.animals"/>
+ <mapping class="test.Flight"/>
+ <mapping class="test.Sky"/>
+ <mapping class="test.Person"/>
+ <mapping class="test.animals.Dog"/></emphasis>
+<emphasis role="bold"> <mapping resource="test/animals/orm.xml"/></emphasis>
+ </session-factory>
+ </hibernate-configuration>
+ </programlisting>
+
+ <para>注æç°å¨ä½ å¯ä»¥æ··å使ç¨hbm.xmlå注解ãèµæºå
ç´ (resource element)å¯ä»¥æ¯hbmæ件ä¹å¯ä»¥æ¯EJB3 XMLåå¸æ述符ï¼æ¤å·®å«å¯¹äºé
ç½®è¿ç¨æ¯éæçã</para>
+
+ <para>é¤äºä¸é¢çæ¹å¼,ä½ è¿å¯ä»¥éè¿ç¼ç¨çæ¹å¼å®ä¹å
æ¬æ³¨è§£çç±»åå
</para>
+
+ <programlisting> sessionFactory = new <emphasis role="bold">AnnotationConfiguration()
+ .addPackage("test.animals") //the fully qualified package name
+ .addAnnotatedClass(Flight.class)
+ .addAnnotatedClass(Sky.class)
+ .addAnnotatedClass(Person.class)
+ .addAnnotatedClass(Dog.class)</emphasis>
+ .buildSessionFactory();</programlisting>
+
+ <para>ä½ ä¹å¯ä»¥ä½¿ç¨Hibernate Entity Manageræ¥å®æ以ä¸åè½ãHibernate Entity Manageræèªå·±çä¸å¥é
ç½®æºå¶ï¼è¯¦æ
请åèç¸å
³ææ¡£ã</para>
+
+ <para>é¤äºå¯å¨æ¹å¼åé
ç½®æ件æææ¹åä¹å¤ï¼ç»å注解æ¥ä½¿ç¨Hibernate APIå以å没æä»ä¹åºå«ï¼
+ å¨å
¶ä»æ¹é¢ä½ è¿æ¯å¯ä»¥ç»§ç»ä¿æ以åçä¹ æ¯åå好(<filename>hibernate.properties</filename>ï¼
+ <filename>hibernate.cfg.xml</filename>ï¼ programmatic APIsçç)ã
+ çè³å¯¹äºåä¸ä¸ª<classname>SessionFactory</classname>ï¼ä½ é½å¯ä»¥æ··å带注解çæä¹
类以åä¼ ç»çbm.cfg.xml声ææ¹å¼ã
+ ç¶èä½ ä¸è½å¤æ¬¡å£°æåä¸ä¸ªç±»(è¦ä¹éè¿æ³¨è§£è¦ä¹éè¿hbm.xmlé
ç½®æ件)ï¼
+ èä¸å¨ä¸ä¸ªæ å°å®ä½ç类继æ¿å±æ¬¡ä¸ï¼è¿ä¸¤ä¸ªé
ç½®çç¥ä¸è½åæ¶ä½¿ç¨.
+ </para>
+
+ <para>为äºç®åä»hbmæ件å°æ³¨è§£çè¿ç§»è¿ç¨ï¼
+ é
ç½®æºå¶å°èªå¨æ£æµå¨æ³¨è§£åhbmæ件ä¸éå¤çæ å°ã
+ é»è®¤æ
åµä¸hbmæ件ä¸ç声ææ¯ç±»ä¸ç注解å
æ°æ®å
·ææ´é«çä¼å
级ã
+ è¿ç§ä¼å
级ç设å®æ¯ä»¥ç±»ä¸ºåä½çã
+ ä½ ä¹å¯ä»¥éè¿<literal>hibernate.mapping.precedence</literal>ä¿®æ¹è¿ç§ä¼å
级ã
+ é»è®¤çå¼æ¯<literal>hbm, class</literal>ï¼
+ å¦ææ¹ä¸º<literal>class,hbm</literal>ï¼å½åçå²çªçæ¶åï¼ç±»ä¸ç注解å°æ¯hbmæ件å
·ææ´é«çä¼å
级ã
+ </para>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/validator.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules/validator.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/validator.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,464 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="validator">
- <title>Hibernateéªè¯å¨</title>
-
- <para>注解æ¯ä¸ç§ä¸ºé¢å模å(domain model)æå®ä¸å约æçç®æ´èå¹½é
çæ¹æ³ãä¾å¦ï¼ä½ è½
- 表示ä¸ä¸ªå±æ§æ°¸è¿ä¸ä¸ºnullï¼ä¸ä¸ªå¸æ·ä½é¢ä¸å®æ¯æ£å¼ï¼ççãè¿äºå模å约æéè¿ä¸ºbeanä¸çå±æ§æ·»å
- 注解æ¥å 以声æãéåä¸ä¸ªéªè¯å¨(validator)ä¼è¯»å并æ£æ¥è¿äºçº¦æãéªè¯æºå¶å¯ä»¥æ§è¡äºåºç¨ç¨åºä¸ç
- ä¸åå±ï¼è¡¨ç°å±ãæ°æ®è®¿é®å±ï¼ï¼èä¸å¿
å¤è¿°ä»»ä½ï¼åè¿°ï¼è¿äºè§åãHibernateéªè¯å¨æ£ä¸ºè¿ä¸ç®çè设计çã</para>
-
- <para>Hibernateéªè¯å¨å·¥ä½å¨ä¸¤ä¸ªå±æ¬¡ä¸ã第ä¸å±ï¼å®è½æ£æ¥å
åä¸ä¸ä¸ªç±»çå®ä¾æ¯å¦è¿å约æã
- 第äºå±ï¼å®è½å°çº¦æåºç¨äºHibernateå
模åä¸ï¼å¹¶å°å®ä»¬èå
¥çæçæ°æ®åºschemaä¸ã</para>
-
- <para>æ¯ä¸ªçº¦æ注解ï¼constraint annotationï¼åä¸ä¸ªéªè¯å¨å®ç°å
³èï¼è¯¥éªè¯å¨è´è´£æ£æ¥ä½äºå®ä½å®ä¾ä¸ç约æã
- ä¸ä¸ªéªè¯å¨ä¹è½(å¯éå°)å°çº¦æåºç¨äºHibernateå
模åä¸ï¼è®©Hibernateçæ表示è¿ä¸çº¦æçDDLã使ç¨åéçäºä»¶çå¬å¨ï¼ä½ è½
- 让Hibernateå¨æå
¥åæ´æ°æ¶æ§è¡æ£æ¥æä½ãHibernateéªè¯å¨å¹¶ä¸å±éäºåHibernateä¸èµ·ä½¿ç¨ã
- ä½ è½å¨ä½ åºç¨ç¨åºçä»»ä½å°æ¹æ¹ä¾¿å°ä½¿ç¨å®ã</para>
-
- <para>å¨è¿è¡æ¶æ£æ¥å®ä¾æ¶ï¼Hibernateéªè¯å¨è¿åè¿å约æçä¿¡æ¯ï¼
- è¿äºä¿¡æ¯ä»¥ä¸ä¸ª<classname>InvalidValue</classname>æ°ç»çå½¢å¼è¿åã
- é¤äºä¼å¤å
¶ä»ä¿¡æ¯å¤ï¼<classname>InvalidValue</classname>å
å«äºä¸ä¸ªé误æè¿°æ¶
- æ¯ï¼è¯¥ä¿¡æ¯å¯ä»¥å
åµä¸æ³¨è§£ç¸æç»çåæ°å¼ï¼ä¾å¦é¿åº¦éå¶ï¼ï¼ä»¥åè½è¢«æåè³ResourceBundleçæ¶æ¯å串ã</para>
-
- <sect1 id="validator-constraints">
- <title>约æ</title>
-
- <sect2>
- <title>ä»ä¹æ¯çº¦æï¼</title>
-
- <para>约æéè¿æ³¨è§£è¡¨ç¤ºãä¸ä¸ªçº¦æé常æä¸äºç¨æ¥åæ°å约æéå¶çå±æ§ã约æåºç¨äºå¸¦æ³¨è§£çå
ç´ ã</para>
- </sect2>
-
- <sect2>
- <title>å
建约æ</title>
-
- <para>Hibernateéªè¯å¨æäºå
建约æï¼è¿äºçº¦æè¦çäºå¤§å¤æ°çåºæ¬æ°æ®æ£æ¥ãéåæ们ä¼çå°ï¼
- ä½ ä¸å¿
åå¶äºè¿äºå
置约æï¼å 为ä¸åéå
å°±å¯ä»¥ååºä½ èªå·±ç约æã</para>
-
- <table>
- <title>å
建约æ</title>
-
- <tgroup cols="4">
- <colspec align="center" />
-
- <thead>
- <row>
- <entry>注解</entry>
-
- <entry>åºç¨ç®æ </entry>
-
- <entry>è¿è¡æ¶æ£æ¥</entry>
-
- <entry>Hibernateå
æ°æ®å½±å</entry>
- </row>
- </thead>
-
- <tbody>
-
- <row>
- <entry>@Length(min=, max=)</entry>
-
- <entry>å±æ§(String)</entry>
-
- <entry>æ£æ¥å符串é¿åº¦æ¯å¦ç¬¦åèå´</entry>
-
- <entry>åé¿åº¦ä¼è¢«è®¾å°æ大å¼</entry>
- </row>
-
- <row>
- <entry>@Max(value=)</entry>
-
- <entry>å±æ§ (以numericæè
stringç±»åæ¥è¡¨ç¤ºä¸ä¸ªæ°å)</entry>
-
- <entry>æ£æ¥å¼æ¯å¦å°äºæçäºæ大å¼</entry>
-
- <entry>对åå¢å ä¸ä¸ªæ£æ¥çº¦æ</entry>
- </row>
-
- <row>
- <entry>@Min(value=)</entry>
-
- <entry>å±æ§(以numericæè
stringç±»åæ¥è¡¨ç¤ºä¸ä¸ªæ°å)</entry>
-
- <entry>æ£æ¥å¼æ¯å¦å¤§äºæçäºæå°å¼</entry>
-
- <entry>对åå¢å ä¸ä¸ªæ£æ¥çº¦æ</entry>
- </row>
-
- <row>
- <entry>@NotNull</entry>
-
- <entry>å±æ§</entry>
-
- <entry>æ£æ¥å¼æ¯å¦é空(not null)</entry>
-
- <entry>åä¸ä¸ºç©º</entry>
- </row>
-
- <row>
- <entry>@Past</entry>
-
- <entry>å±æ§(dateæcalendar)</entry>
-
- <entry>æ£æ¥æ¥ææ¯å¦æ¯è¿å»æ¶</entry>
-
- <entry>对åå¢å ä¸ä¸ªæ£æ¥çº¦æ</entry>
- </row>
-
- <row>
- <entry>@Future</entry>
-
- <entry>å±æ§ (date æ calendar)</entry>
-
- <entry>æ£æ¥æ¥ææ¯å¦æ¯å°æ¥æ¶</entry>
-
- <entry>æ </entry>
- </row>
-
- <row>
- <entry>@Pattern(regex="regexp", flag=)</entry>
-
- <entry>å±æ§ (string)</entry>
-
- <entry>æ£æ¥å±æ§æ¯å¦ä¸ç»å®å¹é
æ å¿çæ£å表达å¼ç¸å¹é
(è§<classname>
- java.util.regex.Pattern </classname>)</entry>
-
- <entry>æ </entry>
- </row>
-
- <row>
- <entry>@Range(min=, max=)</entry>
-
- <entry>å±æ§(以numericæè
stringç±»åæ¥è¡¨ç¤ºä¸ä¸ªæ°å)</entry>
-
- <entry>æ£æ¥å¼æ¯å¦å¨æå°åæ大å¼ä¹é´(å
æ¬ä¸´çå¼)</entry>
-
- <entry>对åå¢å ä¸ä¸ªæ£æ¥çº¦æ</entry>
- </row>
-
- <row>
- <entry>@Size(min=, max=)</entry>
-
- <entry>å±æ§ (array, collection, map)</entry>
-
- <entry>æ£æ¥å
ç´ å¤§å°æ¯å¦å¨æå°åæ大å¼ä¹é´(å
æ¬ä¸´çå¼)</entry>
-
- <entry>æ </entry>
- </row>
-
- <row>
- <entry>@AssertFalse</entry>
-
- <entry>å±æ§</entry>
-
- <entry>æ£æ¥æ¹æ³çæ¼ç®ç»ææ¯å¦ä¸ºfalse(对以代ç æ¹å¼èä¸æ¯æ³¨è§£è¡¨ç¤ºç约æå¾æç¨)</entry>
-
- <entry>æ </entry>
- </row>
-
- <row>
- <entry>@AssertTrue</entry>
-
- <entry>å±æ§</entry>
-
- <entry>æ£æ¥æ¹æ³çæ¼ç®ç»ææ¯å¦ä¸ºtrue(对以代ç æ¹å¼èä¸æ¯æ³¨è§£è¡¨ç¤ºç约æå¾æç¨)</entry>
-
- <entry>æ </entry>
- </row>
-
- <row>
- <entry>@Valid</entry>
-
- <entry>å±æ§ (object)</entry>
-
- <entry>对å
³è对象éå½çè¿è¡éªè¯ãå¦æ对象æ¯éåææ°ç»ï¼å°±éå½å°éªè¯å
¶å
ç´ ãå¦æ对象æ¯Mapï¼åéå½éªè¯å
¶å¼å
ç´ ã</entry>
-
- <entry>æ </entry>
- </row>
-
- <row>
- <entry>@Email</entry>
-
- <entry>å±æ§ï¼Stringï¼</entry>
-
- <entry>æ£æ¥å符串æ¯å¦ç¬¦åææçemailå°åè§èã</entry>
-
- <entry>æ </entry>
- </row>
-
- </tbody>
- </tgroup>
- </table>
- </sect2>
-
- <sect2 id="validator-constraints-error" xreflabel="Error messages">
- <title id="validator-constraints-error">é误信æ¯</title>
-
- <para>Hibernateéªè¯å¨æä¾äºä¸ç»é»è®¤çé误æ示信æ¯ï¼å®ä»¬è¢«ç¿»è¯æå¤ç§è¯è¨(å¦æä½ çè¯è¨ä¸å¨å
¶ä¸ï¼è¯·ç»
- æ们å¯ä¸ä¸ªè¡¥ä¸)ãä½ å¯ä»¥å¨<filename>org.hibernate.validator.resources.DefaultValidatorMessages.properties</filename>
- ä¹å¤å建<filename>ValidatorMessages.properties</filename>æ<filename>ValidatorMessages_loc.properties</filename>
- æ件并æ¹åç¸åºçé®å¼ï¼ç±æ¤è¦çé£äºï¼é»è®¤ï¼ä¿¡æ¯ãä½ çè³å¯ä»¥å¨åèªå·±çéªè¯å¨
- 注解æ¶æ·»å ä½ èªå·±çéå æ¶æ¯éã</para>
-
- <para>æè
ä½ å¯ä»¥ä»¥ç¼ç¨æ¹å¼æ£æ¥beançéªè¯è§å并æä¾ç¸åºç<classname>ResourceBundle</classname>ã</para>
- </sect2>
-
- <sect2>
- <title>ç¼åä½ èªå·±ç约æ</title>
-
- <para>æ©å±å
建约æéæ¯æå
¶æ¹ä¾¿çãä»»ä½çº¦æé½å
æ¬ä¸¤é¨åï¼çº¦æ<emphasis>æ述符</emphasis>(注解)
- å约æ<emphasis>éªè¯å¨</emphasis>(å®ç°ç±»)ãä¸é¢æ¯ä¸ä¸ªç®åçç¨æ·å®ä¹æ述符ï¼</para>
-
- <programlisting>@ValidatorClass(CapitalizedValidator.class)
- at Target(METHOD)
- at Retention(RUNTIME)
- at Documented
-public @interface Capitalized {
- CapitalizeType type() default Capitalize.FIRST;
- String message() default "has incorrect capitalization";
-}</programlisting>
-
- <para><literal>type</literal>åæ°æè¿°å±æ§åºè¯¥å¦ä½è¢«å¤§åãè¿æ¯ä¸ä¸ªå®å
¨ä¾èµäºæ³¨è§£ä¸å¡(é»è¾)çç¨æ·
- åæ°ã</para>
-
- <para><literal>message</literal>æ¯ç¨äºæ述约æè¿è§çé»è®¤å符串ï¼å®æ¯å¼ºå¶è¦æ±çãä½ å¯ä»¥éå硬ç¼ç çæ¹å¼ï¼
- æè
éè¿Java ResourceBundleæºå¶å°messageçé¨å/å
¨é¨å
容æåè³å¤é¨æ件ãä¸æ¦åç°messageä¸{parameter}å符串ï¼
- å°±ä¼å¨{parameter}è¿ä¸ªä½ç½®æ³¨å
¥ç¸åºçåæ°å¼(å¨æ们çä¾åéCapitalization is not {type}ä¼çæ Capitalization is not FIRST)ï¼
- å¯ä»¥å°message对åºçæ´ä¸ªå符串æåè³å¤é¨æ件ValidatorMessages.propertiesï¼è¿ä¹æ¯ä¸ç§è¯å¥½å®è·µã
- è§<xref linkend="validator-constraints-error" />ã</para>
-
- <programlisting>@ValidatorClass(CapitalizedValidator.class)
- at Target(METHOD)
- at Retention(RUNTIME)
- at Documented
-public @interface Capitalized {
- CapitalizeType type() default Capitalize.FIRST;
- String message() default "{validator.capitalized}";
-}
-
-...
-#in ValidatorMessages.properties
-validator.capitalized=<literal>Capitalization is not {type}</literal></programlisting>
-
- <para>å¦ä½ æè§{}符å·æ¯éå½çã</para>
-
- <para>为äºå°ä¸ä¸ªæ述符è¿æ¥å°å®çéªè¯å¨å®ç°ï¼æ们使ç¨<literal>@ValidatorClass</literal>
- å
注解ãéªè¯å¨ç±»åæ°å¿
é¡»æå®ä¸ä¸ªå®ç°äº<literal>Validator<ConstraintAnnotation></literal>
- çç±»ã</para>
-
- <para>æ们ç°å¨è¦å®ç°éªè¯å¨(ä¹å°±æ¯å®ç°è§åæ£æ¥)ãä¸ä¸ªéªè¯å¨å®ç°è½æ£æ¥ä¸ä¸ªå±æ§çå¼
- (å®ç°<literal>PropertyConstraint</literal>)ï¼å¹¶ä¸/æè
å¯ä»¥ä¿®æ¹hibernateæ å°å
æ°æ®
- (å®ç°<literal>PersistentClassConstraint</literal>)ï¼ç±æ¤è¡¨ç¤ºæ°æ®åºçº§ç约æã</para>
-
- <programlisting>public class CapitalizedValidator
- implements Validator<Capitalized>, PropertyConstraint {
- private CapitalizeType type;
-
- //part of the Validator<Annotation> contract,
- //allows to get and use the annotation values
- public void initialize(Capitalized parameters) {
- type = parameters.type();
- }
-
- //part of the property constraint contract
- public boolean isValid(Object value) {
- if (value==null) return true;
- if ( !(value instanceof String) ) return false;
- String string = (String) value;
- if (type == CapitalizeType.ALL) {
- return string.equals( string.toUpperCase() );
- }
- else {
- String first = string.substring(0,1);
- return first.equals( first.toUpperCase();
- }
- }
-}</programlisting>
-
- <para>å¦æè¿å约æï¼<literal>isValid()</literal>æ¹æ³å°è¿åfalseãæ´å¤ä¾å请åèå
建éªè¯å¨å®ç°ã</para>
-
- <para>è³æ¤æ们åªçå°å±æ§çº§çéªè¯ï¼ä½ è¿å¯ä»¥åä¸ä¸ªBean级å«çéªè¯æ³¨è§£ãBeanèªèº«ä¼è¢«ä¼ éç»éªè¯å¨ï¼
- èä¸æ¯beançå±æ§å®ä¾ãåªè¦å¯¹beanèªèº«è¿è¡æ³¨è§£å³å¯æ¿æ´»éªè¯æ£æ¥ãå¨åå
æµè¯å¥ä»¶ä¸è¿å¯ä»¥æ¾å°ä¸ä¸ªå°ä¾åã</para>
- </sect2>
-
- <sect2>
- <title>æ³¨è§£ä½ çé¢å模å</title>
-
- <para>æ¢ç¶ä½ ç°å¨å·²ç»çæ注解äºï¼é£ä¹å¯¹è¯æ³ä¹åºè¯¥å¾æ¸
æ¥äºã</para>
-
- <programlisting>public class Address {
- private String line1;
- private String line2;
- private String zip;
- private String state;
- private String country;
- private long id;
-
- // a not null string of 20 characters maximum
- @Length(max=20)
- @NotNull
- public String getCountry() {
- return country;
- }
-
- // a non null string
- @NotNull
- public String getLine1() {
- return line1;
- }
-
- //no constraint
- public String getLine2() {
- return line2;
- }
-
- // a not null string of 3 characters maximum
- @Length(max=3) @NotNull
- public String getState() {
- return state;
- }
-
- // a not null numeric string of 5 characters maximum
- // if the string is longer, the message will
- //be searched in the resource bundle at key 'long'
- @Length(max=5, message="{long}")
- @Pattern(regex="[0-9]+")
- @NotNull
- public String getZip() {
- return zip;
- }
-
- // should always be true
- @AssertTrue
- public boolean isValid() {
- return true;
- }
-
- // a numeric between 1 and 2000
- @Id @Min(1)
- @Range(max=2000)
- public long getId() {
- return id;
- }
-}</programlisting>
-
- <para>ä¸é¢çä¾ååªå±ç¤ºäºå
Œ
±å±æ§éªè¯ï¼ä½ è¿å¯ä»¥å¯¹ä»»ä½å¯è§åº¦çå段(field)è¿è¡æ³¨è§£ã</para>
-
- <programlisting>@MyBeanConstraint(max=45)
-public class Dog {
- @AssertTrue private boolean isMale;
- @NotNull protected String getName() { ... };
- ...
-}</programlisting>
-
- <para>ä½ å¯ä»¥å¯¹æ¥å£è¿è¡æ³¨è§£ãHibernateéªè¯å¨ä¼æ£æ¥ç»å®beanææ©å±æå®ç°çææç¶ç±»åæ¥å£ï¼
- ç±ä»¥è¯»åç¸åºçéªè¯å¨æ³¨è§£(ä¿¡æ¯)ã</para>
-
- <programlisting>public interface Named {
- @NotNull String getName();
- ...
-}
-
-public class Dog implements Named {
-
- @AssertTrue private boolean isMale;
-
- public String getName() { ... };
-
-}</programlisting>
-
- <para>å¨éªè¯Dog beanæ¶ä¼æ£æ¥nameå±æ§çæææ§(ä¸ä¸ºnull)ã</para>
- </sect2>
- </sect1>
-
- <sect1>
- <title>使ç¨éªè¯å¨æ¡æ¶</title>
-
- <para>Hibernateéªè¯å¨æ¨å¨å®ç°å¤å±æ°æ®éªè¯ï¼æ们å¨ä¸å¤è¡¨ç¤ºçº¦æ(带注解çå模å)ï¼ç¶åå°å
¶è¿ç¨äº
- åºç¨ç¨åºçä¸åå±ã</para>
-
- <sect2>
- <title>æ°æ®åºschemaå±æ¬¡éªè¯</title>
-
- <para>æ é¡»é¢å¤æç»ï¼Hibernate Annotationsä¼èªå¨å°ä½ 为å®ä½å®ä¹ç约æç¿»è¯ä¸ºæ å°å
æ°æ®ãä¾å¦ï¼å¦æä½ çå®ä½
- çä¸ä¸ªå±æ§æ³¨è§£ä¸º<literal>@NotNull</literal>ï¼å¨HibernateçæçDDL schemaä¸è¿åä¼è¢«å®ä¹ä¸º
- <literal>not null</literal>ã</para>
- </sect2>
-
- <sect2>
- <title>Hibernateåºäºäºä»¶çéªè¯</title>
-
- <para>Hibernateéªè¯å¨æ两个å
建Hibernateäºä»¶çå¬å¨ãå½ä¸ä¸ª<literal>PreInsertEvent</literal>
- æ<literal>PreUpdateEvent</literal>åçæ¶ï¼çå¬å¨ä¼éªè¯è¯¥å®ä½å®ä¾çææ约æï¼å¦æè¿åä¼æåºä¸ä¸ªå¼å¸¸ã
- åºæ¬ä¸ï¼å¨Hibernateæ§è¡ä»»ä½æå
¥åæ´æ°å对象ä¼è¢«æ£æ¥ãè¿æ¯æ¿æ´»éªè¯è¿ç¨çæ便æ·æç®åçæ¹æ³ãå½éå°çº¦æ
- è¿è§æ¶ï¼äºä»¶ä¼å¼åä¸ä¸ªè¿è¡æ¶<classname>InvalidStateException</classname>ï¼è¯¥å¼å¸¸å
å«ä¸ä¸ªæè¿°æ¯ä¸ªé误ç
- <literal>InvalidValue</literal>æ°ç»ã</para>
-
- <programlisting><hibernate-configuration>
- ...
- <event type="pre-update">
- <listener
- class="org.hibernate.validator.event.ValidatePreUpdateEventListener"/>
- </event>
- <event type="pre-insert">
- <listener
- class="org.hibernate.validator.event.ValidatePreInsertEventListener"/>
- </event>
-</hibernate-configuration></programlisting>
-
- <para><note>
- <para>å¨ä½¿ç¨Hibernate Entity Manageræ¶ï¼Validationæ¡æ¶ä¼è¢«èªå¨æ¿æ´»ãå¦æbeanä¸å¸¦éªè¯æ³¨è§£ï¼
- å°±ä¸ä¼ææ§è½æ失ã</para>
- </note></para>
- </sect2>
-
- <sect2>
- <title>ç¨åºçº§éªè¯</title>
-
- <para>Hibernateéªè¯å¨è½åºç¨äºä½ åºç¨ç¨åºä»£ç ä¸çä»»ä½å°æ¹ã</para>
-
- <programlisting>ClassValidator personValidator = new ClassValidator( Person.class );
-ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
-
-InvalidValue[] validationMessages = addressValidator.getInvalidValues(address);</programlisting>
-
- <para>头两è¡ä¸ºæ§è¡ç±»æ£æ¥èåå¤Hibernateéªè¯å¨ã第ä¸è¡ä¾èµäºåµå
¥å¨Hibernateéªè¯å¨å
çé误
- æ¶æ¯(è§<xref linkend="validator-constraints-error" />)ï¼ç¬¬äºè¡ä¸ºè¿äºæ¶æ¯åå¤èµæºå
ãè¿äºä»£ç åªæ§è¡ä¸æ¬¡ï¼
- 并å°éªè¯å¨è¿è¡ç¼åå¤çï¼è¿ç§æ¹å¼æ¯ä¸ç§è¯å¥½å®è·µã</para>
-
- <para>第ä¸è¡çæ£éªè¯äº<literal>Address</literal>å®ä¾å¹¶è¿åä¸ä¸ª<literal>InvalidValue</literal>æ°ç»ã
- ä½ çåºç¨ç¨åºé»è¾éåå¯ä»¥å¯¹é误ååºååºã</para>
-
- <para>é¤äºé对æ´ä¸ªbeanä½ è¿å¯ä»¥å¯¹æ个ç¹å®å±æ§è¿è¡æ£æ¥ãè¿å¯¹äºä¸ä¸ªå±æ§ä¸ä¸ªå±æ§çç¨æ·äº¤äºæ
å½¢æ许æ¯æç¨çã</para>
-
- <programlisting>ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
-
-//only get city property invalid values
-InvalidValue[] validationMessages = addressValidator.getInvalidValues(address, "city");
-
-//only get potential city property invalid values
-InvalidValue[] validationMessages = addressValidator.getPotentialInvalidValues("city", "Paris")</programlisting>
- </sect2>
-
- <sect2>
- <title>éªè¯ä¿¡æ¯</title>
-
- <para>ä½ä¸ºä¸ä¸ªéªè¯ä¿¡æ¯çè½½ä½ï¼hibernateæä¾äºä¸ä¸ª<classname>InvalidValue</classname>æ°ç»ã
- æ¯ä¸ª<literal>InvalidValue</literal>æä¸ç»ï¼è¿äºæ¹æ³åå«æè¿°ç¸åºç个ä½é®é¢ã</para>
-
- <para><methodname>getBeanClass()</methodname>è·å失败çbeanç±»åã</para>
-
- <para><methodname>getBean()</methodname>è·åéªè¯å¤±è´¥çå®ä¾(å¦ææçè¯ï¼å½ä½¿ç¨
- <methodname>getPotentianInvalidValues()</methodname>æ¶åä¸ä¼åå°) </para>
-
- <para><methodname>getValue()</methodname>è·åéªè¯å¤±è´¥çå¼</para>
-
- <para><methodname>getMessage()</methodname>è·ååéçå½é
åé误æ¶æ¯</para>
-
- <para><methodname>getRootBean()</methodname>è·å产çé®é¢çæ ¹beanå®ä¾(å¨ä¸<literal>@Valid</literal>è¿ç¨
- æ¶å¾æç¨)ï¼å¦ç¨getPotentianInvalidValues()åè¿ånullã</para>
-
- <para><literal>getPropertyPath()</literal>è·åâé®é¢âå±æ§ä»æ ¹beanå¼å§ç带ç¹çè·¯å¾</para>
- </sect2>
- </sect1>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/validator.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules/validator.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/validator.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/validator.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,464 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="validator">
+ <title>Hibernateéªè¯å¨</title>
+
+ <para>注解æ¯ä¸ç§ä¸ºé¢å模å(domain model)æå®ä¸å约æçç®æ´èå¹½é
çæ¹æ³ãä¾å¦ï¼ä½ è½
+ 表示ä¸ä¸ªå±æ§æ°¸è¿ä¸ä¸ºnullï¼ä¸ä¸ªå¸æ·ä½é¢ä¸å®æ¯æ£å¼ï¼ççãè¿äºå模å约æéè¿ä¸ºbeanä¸çå±æ§æ·»å
+ 注解æ¥å 以声æãéåä¸ä¸ªéªè¯å¨(validator)ä¼è¯»å并æ£æ¥è¿äºçº¦æãéªè¯æºå¶å¯ä»¥æ§è¡äºåºç¨ç¨åºä¸ç
+ ä¸åå±ï¼è¡¨ç°å±ãæ°æ®è®¿é®å±ï¼ï¼èä¸å¿
å¤è¿°ä»»ä½ï¼åè¿°ï¼è¿äºè§åãHibernateéªè¯å¨æ£ä¸ºè¿ä¸ç®çè设计çã</para>
+
+ <para>Hibernateéªè¯å¨å·¥ä½å¨ä¸¤ä¸ªå±æ¬¡ä¸ã第ä¸å±ï¼å®è½æ£æ¥å
åä¸ä¸ä¸ªç±»çå®ä¾æ¯å¦è¿å约æã
+ 第äºå±ï¼å®è½å°çº¦æåºç¨äºHibernateå
模åä¸ï¼å¹¶å°å®ä»¬èå
¥çæçæ°æ®åºschemaä¸ã</para>
+
+ <para>æ¯ä¸ªçº¦æ注解ï¼constraint annotationï¼åä¸ä¸ªéªè¯å¨å®ç°å
³èï¼è¯¥éªè¯å¨è´è´£æ£æ¥ä½äºå®ä½å®ä¾ä¸ç约æã
+ ä¸ä¸ªéªè¯å¨ä¹è½(å¯éå°)å°çº¦æåºç¨äºHibernateå
模åä¸ï¼è®©Hibernateçæ表示è¿ä¸çº¦æçDDLã使ç¨åéçäºä»¶çå¬å¨ï¼ä½ è½
+ 让Hibernateå¨æå
¥åæ´æ°æ¶æ§è¡æ£æ¥æä½ãHibernateéªè¯å¨å¹¶ä¸å±éäºåHibernateä¸èµ·ä½¿ç¨ã
+ ä½ è½å¨ä½ åºç¨ç¨åºçä»»ä½å°æ¹æ¹ä¾¿å°ä½¿ç¨å®ã</para>
+
+ <para>å¨è¿è¡æ¶æ£æ¥å®ä¾æ¶ï¼Hibernateéªè¯å¨è¿åè¿å约æçä¿¡æ¯ï¼
+ è¿äºä¿¡æ¯ä»¥ä¸ä¸ª<classname>InvalidValue</classname>æ°ç»çå½¢å¼è¿åã
+ é¤äºä¼å¤å
¶ä»ä¿¡æ¯å¤ï¼<classname>InvalidValue</classname>å
å«äºä¸ä¸ªé误æè¿°æ¶
+ æ¯ï¼è¯¥ä¿¡æ¯å¯ä»¥å
åµä¸æ³¨è§£ç¸æç»çåæ°å¼ï¼ä¾å¦é¿åº¦éå¶ï¼ï¼ä»¥åè½è¢«æåè³ResourceBundleçæ¶æ¯å串ã</para>
+
+ <sect1 id="validator-constraints">
+ <title>约æ</title>
+
+ <sect2>
+ <title>ä»ä¹æ¯çº¦æï¼</title>
+
+ <para>约æéè¿æ³¨è§£è¡¨ç¤ºãä¸ä¸ªçº¦æé常æä¸äºç¨æ¥åæ°å约æéå¶çå±æ§ã约æåºç¨äºå¸¦æ³¨è§£çå
ç´ ã</para>
+ </sect2>
+
+ <sect2>
+ <title>å
建约æ</title>
+
+ <para>Hibernateéªè¯å¨æäºå
建约æï¼è¿äºçº¦æè¦çäºå¤§å¤æ°çåºæ¬æ°æ®æ£æ¥ãéåæ们ä¼çå°ï¼
+ ä½ ä¸å¿
åå¶äºè¿äºå
置约æï¼å 为ä¸åéå
å°±å¯ä»¥ååºä½ èªå·±ç约æã</para>
+
+ <table>
+ <title>å
建约æ</title>
+
+ <tgroup cols="4">
+ <colspec align="center" />
+
+ <thead>
+ <row>
+ <entry>注解</entry>
+
+ <entry>åºç¨ç®æ </entry>
+
+ <entry>è¿è¡æ¶æ£æ¥</entry>
+
+ <entry>Hibernateå
æ°æ®å½±å</entry>
+ </row>
+ </thead>
+
+ <tbody>
+
+ <row>
+ <entry>@Length(min=, max=)</entry>
+
+ <entry>å±æ§(String)</entry>
+
+ <entry>æ£æ¥å符串é¿åº¦æ¯å¦ç¬¦åèå´</entry>
+
+ <entry>åé¿åº¦ä¼è¢«è®¾å°æ大å¼</entry>
+ </row>
+
+ <row>
+ <entry>@Max(value=)</entry>
+
+ <entry>å±æ§ (以numericæè
stringç±»åæ¥è¡¨ç¤ºä¸ä¸ªæ°å)</entry>
+
+ <entry>æ£æ¥å¼æ¯å¦å°äºæçäºæ大å¼</entry>
+
+ <entry>对åå¢å ä¸ä¸ªæ£æ¥çº¦æ</entry>
+ </row>
+
+ <row>
+ <entry>@Min(value=)</entry>
+
+ <entry>å±æ§(以numericæè
stringç±»åæ¥è¡¨ç¤ºä¸ä¸ªæ°å)</entry>
+
+ <entry>æ£æ¥å¼æ¯å¦å¤§äºæçäºæå°å¼</entry>
+
+ <entry>对åå¢å ä¸ä¸ªæ£æ¥çº¦æ</entry>
+ </row>
+
+ <row>
+ <entry>@NotNull</entry>
+
+ <entry>å±æ§</entry>
+
+ <entry>æ£æ¥å¼æ¯å¦é空(not null)</entry>
+
+ <entry>åä¸ä¸ºç©º</entry>
+ </row>
+
+ <row>
+ <entry>@Past</entry>
+
+ <entry>å±æ§(dateæcalendar)</entry>
+
+ <entry>æ£æ¥æ¥ææ¯å¦æ¯è¿å»æ¶</entry>
+
+ <entry>对åå¢å ä¸ä¸ªæ£æ¥çº¦æ</entry>
+ </row>
+
+ <row>
+ <entry>@Future</entry>
+
+ <entry>å±æ§ (date æ calendar)</entry>
+
+ <entry>æ£æ¥æ¥ææ¯å¦æ¯å°æ¥æ¶</entry>
+
+ <entry>æ </entry>
+ </row>
+
+ <row>
+ <entry>@Pattern(regex="regexp", flag=)</entry>
+
+ <entry>å±æ§ (string)</entry>
+
+ <entry>æ£æ¥å±æ§æ¯å¦ä¸ç»å®å¹é
æ å¿çæ£å表达å¼ç¸å¹é
(è§<classname>
+ java.util.regex.Pattern </classname>)</entry>
+
+ <entry>æ </entry>
+ </row>
+
+ <row>
+ <entry>@Range(min=, max=)</entry>
+
+ <entry>å±æ§(以numericæè
stringç±»åæ¥è¡¨ç¤ºä¸ä¸ªæ°å)</entry>
+
+ <entry>æ£æ¥å¼æ¯å¦å¨æå°åæ大å¼ä¹é´(å
æ¬ä¸´çå¼)</entry>
+
+ <entry>对åå¢å ä¸ä¸ªæ£æ¥çº¦æ</entry>
+ </row>
+
+ <row>
+ <entry>@Size(min=, max=)</entry>
+
+ <entry>å±æ§ (array, collection, map)</entry>
+
+ <entry>æ£æ¥å
ç´ å¤§å°æ¯å¦å¨æå°åæ大å¼ä¹é´(å
æ¬ä¸´çå¼)</entry>
+
+ <entry>æ </entry>
+ </row>
+
+ <row>
+ <entry>@AssertFalse</entry>
+
+ <entry>å±æ§</entry>
+
+ <entry>æ£æ¥æ¹æ³çæ¼ç®ç»ææ¯å¦ä¸ºfalse(对以代ç æ¹å¼èä¸æ¯æ³¨è§£è¡¨ç¤ºç约æå¾æç¨)</entry>
+
+ <entry>æ </entry>
+ </row>
+
+ <row>
+ <entry>@AssertTrue</entry>
+
+ <entry>å±æ§</entry>
+
+ <entry>æ£æ¥æ¹æ³çæ¼ç®ç»ææ¯å¦ä¸ºtrue(对以代ç æ¹å¼èä¸æ¯æ³¨è§£è¡¨ç¤ºç约æå¾æç¨)</entry>
+
+ <entry>æ </entry>
+ </row>
+
+ <row>
+ <entry>@Valid</entry>
+
+ <entry>å±æ§ (object)</entry>
+
+ <entry>对å
³è对象éå½çè¿è¡éªè¯ãå¦æ对象æ¯éåææ°ç»ï¼å°±éå½å°éªè¯å
¶å
ç´ ãå¦æ对象æ¯Mapï¼åéå½éªè¯å
¶å¼å
ç´ ã</entry>
+
+ <entry>æ </entry>
+ </row>
+
+ <row>
+ <entry>@Email</entry>
+
+ <entry>å±æ§ï¼Stringï¼</entry>
+
+ <entry>æ£æ¥å符串æ¯å¦ç¬¦åææçemailå°åè§èã</entry>
+
+ <entry>æ </entry>
+ </row>
+
+ </tbody>
+ </tgroup>
+ </table>
+ </sect2>
+
+ <sect2 id="validator-constraints-error" xreflabel="Error messages">
+ <title id="validator-constraints-error">é误信æ¯</title>
+
+ <para>Hibernateéªè¯å¨æä¾äºä¸ç»é»è®¤çé误æ示信æ¯ï¼å®ä»¬è¢«ç¿»è¯æå¤ç§è¯è¨(å¦æä½ çè¯è¨ä¸å¨å
¶ä¸ï¼è¯·ç»
+ æ们å¯ä¸ä¸ªè¡¥ä¸)ãä½ å¯ä»¥å¨<filename>org.hibernate.validator.resources.DefaultValidatorMessages.properties</filename>
+ ä¹å¤å建<filename>ValidatorMessages.properties</filename>æ<filename>ValidatorMessages_loc.properties</filename>
+ æ件并æ¹åç¸åºçé®å¼ï¼ç±æ¤è¦çé£äºï¼é»è®¤ï¼ä¿¡æ¯ãä½ çè³å¯ä»¥å¨åèªå·±çéªè¯å¨
+ 注解æ¶æ·»å ä½ èªå·±çéå æ¶æ¯éã</para>
+
+ <para>æè
ä½ å¯ä»¥ä»¥ç¼ç¨æ¹å¼æ£æ¥beançéªè¯è§å并æä¾ç¸åºç<classname>ResourceBundle</classname>ã</para>
+ </sect2>
+
+ <sect2>
+ <title>ç¼åä½ èªå·±ç约æ</title>
+
+ <para>æ©å±å
建约æéæ¯æå
¶æ¹ä¾¿çãä»»ä½çº¦æé½å
æ¬ä¸¤é¨åï¼çº¦æ<emphasis>æ述符</emphasis>(注解)
+ å约æ<emphasis>éªè¯å¨</emphasis>(å®ç°ç±»)ãä¸é¢æ¯ä¸ä¸ªç®åçç¨æ·å®ä¹æ述符ï¼</para>
+
+ <programlisting>@ValidatorClass(CapitalizedValidator.class)
+ at Target(METHOD)
+ at Retention(RUNTIME)
+ at Documented
+public @interface Capitalized {
+ CapitalizeType type() default Capitalize.FIRST;
+ String message() default "has incorrect capitalization";
+}</programlisting>
+
+ <para><literal>type</literal>åæ°æè¿°å±æ§åºè¯¥å¦ä½è¢«å¤§åãè¿æ¯ä¸ä¸ªå®å
¨ä¾èµäºæ³¨è§£ä¸å¡(é»è¾)çç¨æ·
+ åæ°ã</para>
+
+ <para><literal>message</literal>æ¯ç¨äºæ述约æè¿è§çé»è®¤å符串ï¼å®æ¯å¼ºå¶è¦æ±çãä½ å¯ä»¥éå硬ç¼ç çæ¹å¼ï¼
+ æè
éè¿Java ResourceBundleæºå¶å°messageçé¨å/å
¨é¨å
容æåè³å¤é¨æ件ãä¸æ¦åç°messageä¸{parameter}å符串ï¼
+ å°±ä¼å¨{parameter}è¿ä¸ªä½ç½®æ³¨å
¥ç¸åºçåæ°å¼(å¨æ们çä¾åéCapitalization is not {type}ä¼çæ Capitalization is not FIRST)ï¼
+ å¯ä»¥å°message对åºçæ´ä¸ªå符串æåè³å¤é¨æ件ValidatorMessages.propertiesï¼è¿ä¹æ¯ä¸ç§è¯å¥½å®è·µã
+ è§<xref linkend="validator-constraints-error" />ã</para>
+
+ <programlisting>@ValidatorClass(CapitalizedValidator.class)
+ at Target(METHOD)
+ at Retention(RUNTIME)
+ at Documented
+public @interface Capitalized {
+ CapitalizeType type() default Capitalize.FIRST;
+ String message() default "{validator.capitalized}";
+}
+
+...
+#in ValidatorMessages.properties
+validator.capitalized=<literal>Capitalization is not {type}</literal></programlisting>
+
+ <para>å¦ä½ æè§{}符å·æ¯éå½çã</para>
+
+ <para>为äºå°ä¸ä¸ªæ述符è¿æ¥å°å®çéªè¯å¨å®ç°ï¼æ们使ç¨<literal>@ValidatorClass</literal>
+ å
注解ãéªè¯å¨ç±»åæ°å¿
é¡»æå®ä¸ä¸ªå®ç°äº<literal>Validator<ConstraintAnnotation></literal>
+ çç±»ã</para>
+
+ <para>æ们ç°å¨è¦å®ç°éªè¯å¨(ä¹å°±æ¯å®ç°è§åæ£æ¥)ãä¸ä¸ªéªè¯å¨å®ç°è½æ£æ¥ä¸ä¸ªå±æ§çå¼
+ (å®ç°<literal>PropertyConstraint</literal>)ï¼å¹¶ä¸/æè
å¯ä»¥ä¿®æ¹hibernateæ å°å
æ°æ®
+ (å®ç°<literal>PersistentClassConstraint</literal>)ï¼ç±æ¤è¡¨ç¤ºæ°æ®åºçº§ç约æã</para>
+
+ <programlisting>public class CapitalizedValidator
+ implements Validator<Capitalized>, PropertyConstraint {
+ private CapitalizeType type;
+
+ //part of the Validator<Annotation> contract,
+ //allows to get and use the annotation values
+ public void initialize(Capitalized parameters) {
+ type = parameters.type();
+ }
+
+ //part of the property constraint contract
+ public boolean isValid(Object value) {
+ if (value==null) return true;
+ if ( !(value instanceof String) ) return false;
+ String string = (String) value;
+ if (type == CapitalizeType.ALL) {
+ return string.equals( string.toUpperCase() );
+ }
+ else {
+ String first = string.substring(0,1);
+ return first.equals( first.toUpperCase();
+ }
+ }
+}</programlisting>
+
+ <para>å¦æè¿å约æï¼<literal>isValid()</literal>æ¹æ³å°è¿åfalseãæ´å¤ä¾å请åèå
建éªè¯å¨å®ç°ã</para>
+
+ <para>è³æ¤æ们åªçå°å±æ§çº§çéªè¯ï¼ä½ è¿å¯ä»¥åä¸ä¸ªBean级å«çéªè¯æ³¨è§£ãBeanèªèº«ä¼è¢«ä¼ éç»éªè¯å¨ï¼
+ èä¸æ¯beançå±æ§å®ä¾ãåªè¦å¯¹beanèªèº«è¿è¡æ³¨è§£å³å¯æ¿æ´»éªè¯æ£æ¥ãå¨åå
æµè¯å¥ä»¶ä¸è¿å¯ä»¥æ¾å°ä¸ä¸ªå°ä¾åã</para>
+ </sect2>
+
+ <sect2>
+ <title>æ³¨è§£ä½ çé¢å模å</title>
+
+ <para>æ¢ç¶ä½ ç°å¨å·²ç»çæ注解äºï¼é£ä¹å¯¹è¯æ³ä¹åºè¯¥å¾æ¸
æ¥äºã</para>
+
+ <programlisting>public class Address {
+ private String line1;
+ private String line2;
+ private String zip;
+ private String state;
+ private String country;
+ private long id;
+
+ // a not null string of 20 characters maximum
+ @Length(max=20)
+ @NotNull
+ public String getCountry() {
+ return country;
+ }
+
+ // a non null string
+ @NotNull
+ public String getLine1() {
+ return line1;
+ }
+
+ //no constraint
+ public String getLine2() {
+ return line2;
+ }
+
+ // a not null string of 3 characters maximum
+ @Length(max=3) @NotNull
+ public String getState() {
+ return state;
+ }
+
+ // a not null numeric string of 5 characters maximum
+ // if the string is longer, the message will
+ //be searched in the resource bundle at key 'long'
+ @Length(max=5, message="{long}")
+ @Pattern(regex="[0-9]+")
+ @NotNull
+ public String getZip() {
+ return zip;
+ }
+
+ // should always be true
+ @AssertTrue
+ public boolean isValid() {
+ return true;
+ }
+
+ // a numeric between 1 and 2000
+ @Id @Min(1)
+ @Range(max=2000)
+ public long getId() {
+ return id;
+ }
+}</programlisting>
+
+ <para>ä¸é¢çä¾ååªå±ç¤ºäºå
Œ
±å±æ§éªè¯ï¼ä½ è¿å¯ä»¥å¯¹ä»»ä½å¯è§åº¦çå段(field)è¿è¡æ³¨è§£ã</para>
+
+ <programlisting>@MyBeanConstraint(max=45)
+public class Dog {
+ @AssertTrue private boolean isMale;
+ @NotNull protected String getName() { ... };
+ ...
+}</programlisting>
+
+ <para>ä½ å¯ä»¥å¯¹æ¥å£è¿è¡æ³¨è§£ãHibernateéªè¯å¨ä¼æ£æ¥ç»å®beanææ©å±æå®ç°çææç¶ç±»åæ¥å£ï¼
+ ç±ä»¥è¯»åç¸åºçéªè¯å¨æ³¨è§£(ä¿¡æ¯)ã</para>
+
+ <programlisting>public interface Named {
+ @NotNull String getName();
+ ...
+}
+
+public class Dog implements Named {
+
+ @AssertTrue private boolean isMale;
+
+ public String getName() { ... };
+
+}</programlisting>
+
+ <para>å¨éªè¯Dog beanæ¶ä¼æ£æ¥nameå±æ§çæææ§(ä¸ä¸ºnull)ã</para>
+ </sect2>
+ </sect1>
+
+ <sect1>
+ <title>使ç¨éªè¯å¨æ¡æ¶</title>
+
+ <para>Hibernateéªè¯å¨æ¨å¨å®ç°å¤å±æ°æ®éªè¯ï¼æ们å¨ä¸å¤è¡¨ç¤ºçº¦æ(带注解çå模å)ï¼ç¶åå°å
¶è¿ç¨äº
+ åºç¨ç¨åºçä¸åå±ã</para>
+
+ <sect2>
+ <title>æ°æ®åºschemaå±æ¬¡éªè¯</title>
+
+ <para>æ é¡»é¢å¤æç»ï¼Hibernate Annotationsä¼èªå¨å°ä½ 为å®ä½å®ä¹ç约æç¿»è¯ä¸ºæ å°å
æ°æ®ãä¾å¦ï¼å¦æä½ çå®ä½
+ çä¸ä¸ªå±æ§æ³¨è§£ä¸º<literal>@NotNull</literal>ï¼å¨HibernateçæçDDL schemaä¸è¿åä¼è¢«å®ä¹ä¸º
+ <literal>not null</literal>ã</para>
+ </sect2>
+
+ <sect2>
+ <title>Hibernateåºäºäºä»¶çéªè¯</title>
+
+ <para>Hibernateéªè¯å¨æ两个å
建Hibernateäºä»¶çå¬å¨ãå½ä¸ä¸ª<literal>PreInsertEvent</literal>
+ æ<literal>PreUpdateEvent</literal>åçæ¶ï¼çå¬å¨ä¼éªè¯è¯¥å®ä½å®ä¾çææ约æï¼å¦æè¿åä¼æåºä¸ä¸ªå¼å¸¸ã
+ åºæ¬ä¸ï¼å¨Hibernateæ§è¡ä»»ä½æå
¥åæ´æ°å对象ä¼è¢«æ£æ¥ãè¿æ¯æ¿æ´»éªè¯è¿ç¨çæ便æ·æç®åçæ¹æ³ãå½éå°çº¦æ
+ è¿è§æ¶ï¼äºä»¶ä¼å¼åä¸ä¸ªè¿è¡æ¶<classname>InvalidStateException</classname>ï¼è¯¥å¼å¸¸å
å«ä¸ä¸ªæè¿°æ¯ä¸ªé误ç
+ <literal>InvalidValue</literal>æ°ç»ã</para>
+
+ <programlisting><hibernate-configuration>
+ ...
+ <event type="pre-update">
+ <listener
+ class="org.hibernate.validator.event.ValidatePreUpdateEventListener"/>
+ </event>
+ <event type="pre-insert">
+ <listener
+ class="org.hibernate.validator.event.ValidatePreInsertEventListener"/>
+ </event>
+</hibernate-configuration></programlisting>
+
+ <para><note>
+ <para>å¨ä½¿ç¨Hibernate Entity Manageræ¶ï¼Validationæ¡æ¶ä¼è¢«èªå¨æ¿æ´»ãå¦æbeanä¸å¸¦éªè¯æ³¨è§£ï¼
+ å°±ä¸ä¼ææ§è½æ失ã</para>
+ </note></para>
+ </sect2>
+
+ <sect2>
+ <title>ç¨åºçº§éªè¯</title>
+
+ <para>Hibernateéªè¯å¨è½åºç¨äºä½ åºç¨ç¨åºä»£ç ä¸çä»»ä½å°æ¹ã</para>
+
+ <programlisting>ClassValidator personValidator = new ClassValidator( Person.class );
+ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
+
+InvalidValue[] validationMessages = addressValidator.getInvalidValues(address);</programlisting>
+
+ <para>头两è¡ä¸ºæ§è¡ç±»æ£æ¥èåå¤Hibernateéªè¯å¨ã第ä¸è¡ä¾èµäºåµå
¥å¨Hibernateéªè¯å¨å
çé误
+ æ¶æ¯(è§<xref linkend="validator-constraints-error" />)ï¼ç¬¬äºè¡ä¸ºè¿äºæ¶æ¯åå¤èµæºå
ãè¿äºä»£ç åªæ§è¡ä¸æ¬¡ï¼
+ 并å°éªè¯å¨è¿è¡ç¼åå¤çï¼è¿ç§æ¹å¼æ¯ä¸ç§è¯å¥½å®è·µã</para>
+
+ <para>第ä¸è¡çæ£éªè¯äº<literal>Address</literal>å®ä¾å¹¶è¿åä¸ä¸ª<literal>InvalidValue</literal>æ°ç»ã
+ ä½ çåºç¨ç¨åºé»è¾éåå¯ä»¥å¯¹é误ååºååºã</para>
+
+ <para>é¤äºé对æ´ä¸ªbeanä½ è¿å¯ä»¥å¯¹æ个ç¹å®å±æ§è¿è¡æ£æ¥ãè¿å¯¹äºä¸ä¸ªå±æ§ä¸ä¸ªå±æ§çç¨æ·äº¤äºæ
å½¢æ许æ¯æç¨çã</para>
+
+ <programlisting>ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
+
+//only get city property invalid values
+InvalidValue[] validationMessages = addressValidator.getInvalidValues(address, "city");
+
+//only get potential city property invalid values
+InvalidValue[] validationMessages = addressValidator.getPotentialInvalidValues("city", "Paris")</programlisting>
+ </sect2>
+
+ <sect2>
+ <title>éªè¯ä¿¡æ¯</title>
+
+ <para>ä½ä¸ºä¸ä¸ªéªè¯ä¿¡æ¯çè½½ä½ï¼hibernateæä¾äºä¸ä¸ª<classname>InvalidValue</classname>æ°ç»ã
+ æ¯ä¸ª<literal>InvalidValue</literal>æä¸ç»ï¼è¿äºæ¹æ³åå«æè¿°ç¸åºç个ä½é®é¢ã</para>
+
+ <para><methodname>getBeanClass()</methodname>è·å失败çbeanç±»åã</para>
+
+ <para><methodname>getBean()</methodname>è·åéªè¯å¤±è´¥çå®ä¾(å¦ææçè¯ï¼å½ä½¿ç¨
+ <methodname>getPotentianInvalidValues()</methodname>æ¶åä¸ä¼åå°) </para>
+
+ <para><methodname>getValue()</methodname>è·åéªè¯å¤±è´¥çå¼</para>
+
+ <para><methodname>getMessage()</methodname>è·ååéçå½é
åé误æ¶æ¯</para>
+
+ <para><methodname>getRootBean()</methodname>è·å产çé®é¢çæ ¹beanå®ä¾(å¨ä¸<literal>@Valid</literal>è¿ç¨
+ æ¶å¾æç¨)ï¼å¦ç¨getPotentianInvalidValues()åè¿ånullã</para>
+
+ <para><literal>getPropertyPath()</literal>è·åâé®é¢âå±æ§ä»æ ¹beanå¼å§ç带ç¹çè·¯å¾</para>
+ </sect2>
+ </sect1>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/xml-overriding.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules/xml-overriding.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/xml-overriding.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,345 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="xml-overriding">
- <title>éè¿XMLè¦åå
æ°æ®</title>
-
- <para>å¨EJB3ä¸å
æ°æ®ç主è¦ç®æ æ¯ä½¿ç¨æ³¨é,ä½æ¯EJB3è§èä¹æä¾éè¿XMLé¨ç½²æ件æ¥è¦åæè
æ¿æ¢å
æ°æ®æ³¨é.
- å¨å½åçåå¸çæ¬ä»
ä»
æ¯æEJB3注éçè¦å,å¦æä½ æ³ä½¿ç¨Hibernateç¹æçä¸äºå®ä½æ³¨é,
- ä½ æ两ç§éæ©:ä¸,åªä½¿ç¨æ³¨é;äº,使ç¨åæ¥çhbm æ å°æ件.ä½ å½ç¶è¿æ¯å¯ä»¥åæ¶ä½¿ç¨æ³¨éå®ä½åhbm XMLæ å°æ件çå®ä½.</para>
-
- <para>å¨æµè¯å¥ä»¶ä¸æä¸äºéå çXMLæ件çæ ·ä¾.</para>
-
- <section>
- <title>åå</title>
-
- <para>XMLé¨ç½²æ件ç»æ被设计为ç´æ¥æ å°æ³¨éç»æ,æ以å¦æä½ ç¥é注éçç»æ,é£ä¹ä½¿ç¨XMLè¯æ³æ¯å¾ç®åç.</para>
-
-
- <para>ä½ å¯ä»¥å®ä¹ä¸ä¸ªæè
å¤ä¸ªXMLæ件æ¥æè¿°ä½ çå
æ°æ®,è¿äºæ件ä¼è¢«è¦åå¼æå并(merged).</para>
-
- <section>
- <title>å
¨å±çº§å«çå
æ°æ®</title>
-
- <para>ä½ å¯ä»¥ä½¿ç¨XMLæ件æ¥å®ä¹å
¨å±å
æ°æ®,对æ¯ä¸ä¸ªé¨ç½²æä»¶ä½ ä¸è½å®ä¹å¤äºä¸ä¸ªçå
æ°æ®.</para>
-
- <programlisting><?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">
-
- <persistence-unit-metadata>
- <xml-mapping-metadata-complete/>
- <persistence-unit-defaults>
- <schema>myschema</schema>
- <catalog>mycatalog</catalog>
- <cascade-persist/>
- </persistence-unit-defaults>
- </persistence-unit-metadata></programlisting>
-
- <para><literal>xml-mapping-metadata-complete</literal> æå³çææçå®ä½,mapped-superclassesååµå¥çå
æ°æ®åºè¯¥ä»XMLæ件ä¸å¯ç¨(忽ç¥æ³¨é).</para>
-
-
- <para><literal>schema / catalog</literal> å°è¦åææå¨å
æ°æ®ä¸é»è®¤å®ä¹çschema å catalog(å
æ¬XMLå注é).</para>
-
- <para><literal>cascade-persist</literal> æå³çææ注éä½ä¸ºä¸ä¸ª cascade type é½æ¯PERSISTç. æ们æ¨èä½ ä¸è¦ä½¿ç¨è¯¥ç¹æ§.</para>
- </section>
-
- <section>
- <title>å®ä½çº§å«çå
æ°æ®</title>
-
- <para>ä½ ä¹å¯ä»¥å¨ä¸ä¸ªç»å®çå®ä½ä¸å®ä¹æè
è¦åå
æ°æ®</para>
-
- <programlistingco>
- <areaspec>
- <area coords="3 85" id="aa1" />
-
- <area coords="9 85" id="aa2" />
-
- <area coords="10 85" id="aa3" />
-
- <area coords="11 85" id="aa4" />
-
- <area coords="17 85" id="aa5" />
-
- <area coords="23 85" id="aa6" />
-
- <area coords="24 85" id="aa7" />
-
- <area coords="25 85" id="aa8" />
-
- <area coords="26 85" id="aa9" />
-
- <area coords="31 85" id="aa10" />
- </areaspec>
-
- <programlisting><?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>org.hibernate.test.annotations.reflection</package>
- <entity class="Administration" access="PROPERTY" metadata-complete="true">
- <table name="tbl_admin">
- <unique-constraint>
- <column-name>firstname</column-name>
- <column-name>lastname</column-name>
- </unique-constraint>
- </table>
- <secondary-table name="admin2">
- <primary-key-join-column name="admin_id" referenced-column-name="id"/>
- <unique-constraint>
- <column-name>address</column-name>
- </unique-constraint>
- </secondary-table>
- <id-class class="SocialSecurityNumber"/>
- <inheritance strategy="JOINED"/>
- <sequence-generator name="seqhilo" sequence-name="seqhilo"/>
- <table-generator name="table" table="tablehilo"/>
- ...
- </entity>
-
- <entity class="PostalAdministration">
- <primary-key-join-column name="id"/>
- ...
- </entity>
-</entity-mappings></programlisting>
-
- <calloutlist>
- <callout arearefs="aa1">
- <para><literal>entity-mappings</literal>:entity-mappings æ¯ææXMLæ件çæ ¹å
ç´ .ä½ å¿
é¡»å®ä¹XML Schema, 该æ件å
å«å¨hibernate-annotations.jarä¸,使ç¨Hibernate Annotations ä¸éè¦è®¿é®ç½ç».</para>
- </callout>
-
- <callout arearefs="aa2">
- <para><literal>package</literal> (å¯éç): ä½ä¸ºé»è®¤çpackageç¨äºå¨ä¸ä¸ªç»å®çé¨ç½²æè¿°æ件ä¸ææ没æéå®çç±».</para>
- </callout>
-
- <callout arearefs="aa3">
- <para><literal>entity</literal>: æè¿°ä¸ä¸ªå®ä½. </para>
-
- <para><literal>metadata-complete</literal> å®ä¹å¯¹äºè¯¥å
ç´ æ¯å¦å
¨é¨ä½¿ç¨å
æ°æ®(æ¢å¥è¯æ¥è¯´å°±æ¯,å¦æ注éåºç°å¨ç±»çº§å«åºè¯¥èèæè
忽ç¥).</para>
-
- <para>ä¸ä¸ªå®ä½ä¸å¾ä¸æä¸ä¸ª class å±æ§æ¥å¼ç¨ å
æ°æ®æåºç¨çç±». </para>
-
- <para>éè¿<literal>name</literal>å±æ§ä½ å¯ä»¥è¦åå®ä½çåå,
- å¦æ没æå®ä¹å¹¶ä¸<literal>@Entity.name</literal>åºç°äºçè¯,é£ä¹å°±ä½¿ç¨è¯¥æ³¨é(åå¦metadata complete 没æ被设置).</para>
-
- <para>
- 对äºmetadata complete (åèä¸é¢)å
ç´ , ä½ å¯ä»¥å®ä¹ä¸ä¸ª <literal>access</literal>(<literal>FIELD</literal> æè
<literal>PROPERTY</literal>(é»è®¤å¼)),
- 对äºémetadata complete å
ç´ ,使ç¨æ³¨éçaccess type.</para>
- </callout>
-
- <callout arearefs="aa4">
- <para><literal>table</literal>: ä½ å¯ä»¥å£°ætable å±æ§(name, schema, catalog), å¦æ没æå®ä¹, å°ä½¿ç¨Java注é.</para>
-
- <para>就象ä¾åä¸æ示çé£æ ·ä½ å¯ä»¥å®ä¹ä¸ä¸ªæè
å¤ä¸ªunique constraints</para>
- </callout>
-
- <callout arearefs="aa5">
- <para><literal>secondary-table</literal>: å®ä¹ä¸ä¸ªsecondary-table,é¤äºä½ å¯ä»¥éè¿<literal>primary-key-join-column </literal>å
ç´ å®ä¹ primary key / foreign key å以å¤æ¯åä¸è¬çtableä¸æ ·ç. å¨émetadata completeä¸, annotation secondary tables ä»
ä»
å¨æ²¡æ<literal>secondary-table </literal>å®ä¹çæ
åµä¸ä½¿ç¨, å¦å 注éå°è¢«å¿½ç¥.</para>
- </callout>
-
- <callout arearefs="aa6">
- <para><literal>id-class</literal>: å<literal>@IdClass</literal>ä¸æ ·å®ä¹ä¸ä¸ªid class.</para>
- </callout>
-
- <callout arearefs="aa7">
- <para><literal>inheritance</literal>:
- å®ä¹ç»§æ¿çç¥(<literal>JOINED</literal>,
- <literal>TABLE_PER_CLASS</literal>,
- <literal>SINGLE_TABLE</literal>), ä»
ä»
å¨æ ¹å®ä½çº§å«å¯ä»¥ä½¿ç¨.</para>
- </callout>
-
- <callout arearefs="aa8">
- <para><literal>sequence-generator</literal>: å®ä¹ä¸ä¸ªåºå产çå¨.</para>
- </callout>
-
- <callout arearefs="aa9">
- <para><literal>table-generator</literal>: å®ä¹ä¸ä¸ªtable generator</para>
- </callout>
-
- <callout arearefs="aa10">
- <para><literal><literal>primary-key-join-column</literal></literal>:
- å½ JOINED 继æ¿çç¥ä½¿ç¨æ¶,为sub entitieså®ä¹ä¸ä¸ª primary key join column.</para>
- </callout>
- </calloutlist>
-
-
- </programlistingco>
-
- <programlistingco>
- <areaspec>
- <area coords="11 85" id="ab1" />
-
- <area coords="18 85" id="ab2" />
-
- <area coords="22 85" id="ab3" />
-
- <area coords="28 85" id="ab4" />
-
- <area coords="34 85" id="ab5" />
- </areaspec>
-
- <programlisting><?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>org.hibernate.test.annotations.reflection</package>
- <entity class="Music" access="PROPERTY" metadata-complete="true">
- <discriminator-value>Generic</discriminator-value>
- <discriminator-column length="34"/>
- ...
- </entity>
-
- <entity class="PostalAdministration">
- <primary-key-join-column name="id"/>
- <named-query name="adminById">
- <query>select m from Administration m where m.id = :id</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-query>
- <named-native-query name="allAdmin" result-set-mapping="adminrs">
- <query>select *, count(taxpayer_id) as taxPayerNumber
- from Administration, TaxPayer
- where taxpayer_admin_id = admin_id group by ...</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-native-query>
- <sql-result-set-mapping name="adminrs">
- <entity-result entity-class="Administration">
- <field-result name="name" column="fld_name"/>
- </entity-result>
- <column-result name="taxPayerNumber"/>
- </sql-result-set-mapping>
- <attribute-override name="ground">
- <column name="fld_ground" unique="true" scale="2"/>
- </attribute-override>
- <association-override name="referer">
- <join-column name="referer_id" referenced-column-name="id"/>
- </association-override>
- ...
- </entity>
-</entity-mappings></programlisting>
-
- <calloutlist>
- <callout arearefs="ab1">
- <para><literal>discriminator-value /
- discriminator-column</literal>: å½SINGLE_TABLE继æ¿çç¥ä½¿ç¨æ¶,å®ä¹é´å«å¨å¼ å ä¿å该å¼çå.</para>
- </callout>
-
- <callout arearefs="ab2">
- <para><literal>named-query</literal>: å®ä¹å½åæ¥è¯¢åä¸äºç¸å
³çå¯è½ç线索. 该å®ä¹éå å¨æ³¨éçå®ä¹ä¸,å¦æ两个é½å®ä¹äºç¸åçåå,é£ä¹XMLå°ä¼å
èè.</para>
- </callout>
-
- <callout arearefs="ab3">
- <para><literal>named-native-query</literal>: å®ä¹ä¸ä¸ªå½åæ¬å°æ¥è¯¢ åä»ç sql result set æ å°. ä½ä¸ºå¦å¤ä¸ç§éæ©,ä½ å¯ä»¥å®ä¹<literal>result-class</literal>. è¿äºå®ä¹éå å¨æ³¨éçå®ä¹ä¸.å¦æ两个å®ä¹äºåæ ·çåå,XMLæ件ä¼å
èè.</para>
- </callout>
-
- <callout arearefs="ab4">
- <para><literal>sql-result-set-mapping</literal>: æè¿°äº result set mapping çç»æ. ä½ å¯ä»¥å®ä¹ å®ä½ååæ å°. è¿äºå®ä¹éå å¨æ³¨éçå®ä¹ä¸,å¦æå®ä¹äºåæ ·çåå,XMLæ件ä¼å
èè.</para>
- </callout>
-
- <callout arearefs="ab5">
- <para><literal>attribute-override /
- association-override</literal>: å®ä¹ä¸åæè
join column overriding. 该overriding éå å¨æ³¨éçå®ä¹ä¸.</para>
- </callout>
- </calloutlist>
- </programlistingco>
-
- <para>ä¸äºåºç¨äº <literal><embeddable></literal> å
- <literal><mapped-superclass></literal>.</para>
- </section>
-
- <section>
- <title>å±æ§çº§å«çå
æ°æ®</title>
-
- <para>
- ä½ å½ç¶å¯ä»¥å®ä¹XMLæ¥è¦åå±æ§. å¦æmetadata complete ç»å®ä¹äº,é£ä¹éå çå±æ§(å¦: å¨Java 级å«ç)å°è¢«å¿½ç¥.
-å¦å¤,ä¸æ¦ä½ å¼å§è¦åä¸ä¸ªå±æ§,å¨è¯¥å±æ§ä¸çææ注éé½ä¼è¢«å¿½ç¥.ææå±æ§çº§å«çå
æ°æ®åºç¨äº<literal>entity/attributes</literal>,
- <literal>mapped-superclass/attributes</literal> æ
- <literal>embeddable/attributes</literal>.</para>
-
- <programlisting> <attributes>
- <id name="id">
- <column name="fld_id"/>
- <generated-value generator="generator" strategy="SEQUENCE"/>
- <temporal>DATE</temporal>
- <sequence-generator name="generator" sequence-name="seq"/>
- </id>
- <version name="version"/>
- <embedded name="embeddedObject">
- <attribute-override name"subproperty">
- <column name="my_column"/>
- </attribute-override>
- </embedded>
- <basic name="status" optional="false">
- <enumerated>STRING</enumerated>
- </basic>
- <basic name="serial" optional="true">
- <column name="serialbytes"/>
- <lob/>
- </basic>
- <basic name="terminusTime" fetch="LAZY">
- <temporal>TIMESTAMP</temporal>
- </basic>
- </attributes></programlisting>
-
- <para>
- éè¿ <literal>id</literal>,
- <literal>embedded-id</literal>, <literal>version</literal>,
- <literal>embedded</literal> å <literal>basic</literal>ä½ å¯ä»¥è¦åä¸ä¸ªå±æ§,
- è¿äºå
ç´ ä¸çæ¯ä¸ä¸ªå
ç´ é½æç¸åºçsubelementsï¼<literal>lob</literal>,
- <literal>temporal</literal>, <literal>enumerated</literal>,
- <literal>column</literal>.</para>
-
- </section>
-
- <section>
- <title>å
³è级å«çå
æ°æ®</title>
-
- <para>ä½ å¯ä»¥å®ä¹XMLè¦åå
³è注é. ææçå
³è级å«çå
æ°æ®ä½ç¨äº
- <literal>entity/attributes</literal>,
- <literal>mapped-superclass/attributes</literal> æ
- <literal>embeddable/attributes</literal>.</para>
-
- <programlisting> <attributes>
- <one-to-many name="players" fetch="EAGER">
- <map-key name="name"/>
- <join-column name="driver"/>
- <join-column name="number"/>
- </one-to-many>
- <many-to-many name="roads" target-entity="Administration">
- <order-by>maxSpeed</order-by>
- <join-table name="bus_road">
- <join-column name="driver"/>
- <join-column name="number"/>
- <inverse-join-column name="road_id"/>
- <unique-constraint>
- <column-name>driver</column-name>
- <column-name>number</column-name>
- </unique-constraint>
- </join-table>
- </many-to-many>
- <many-to-many name="allTimeDrivers" mapped-by="drivenBuses">
- </attributes></programlisting>
-
- <para>éè¿<literal>one-to-many</literal>, <literal>one-to-one</literal>,
- <literal>many-to-one</literal>, å <literal>many-to-many</literal>.
- ä½ å¯ä»¥éåä¸ä¸ªå
³èå
³ç³».è¿äºå
ç´ ä¸çæ¯ä¸ä¸ªé½æç¸åºçsubelements. <literal>join-table</literal> (å¯ä»¥æ
- <literal>join-column</literal>å
- <literal>inverse-join-column</literal>),
- <literal><literal>join-column</literal></literal>,
- <literal>map-key</literal>, å <literal>order-by</literal>.
- <literal>mapped-by</literal> å <literal>target-entity</literal>
- å½ä»ä»¬ææä¹çæ¶åå¯ä»¥å®ä¹å±æ§. åä¸æ¬¡å¼ºè° 该ç»ææ å°äºæ³¨éçç»æ.å¨æ述注éçä¸ç« ä¸ ä½ å¯ä»¥æ¾å°ææçè¯ä¹ä¿¡æ¯.</para>
-
-
- </section>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/xml-overriding.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/modules/xml-overriding.xml)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/xml-overriding.xml (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/modules/xml-overriding.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,345 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="xml-overriding">
+ <title>éè¿XMLè¦åå
æ°æ®</title>
+
+ <para>å¨EJB3ä¸å
æ°æ®ç主è¦ç®æ æ¯ä½¿ç¨æ³¨é,ä½æ¯EJB3è§èä¹æä¾éè¿XMLé¨ç½²æ件æ¥è¦åæè
æ¿æ¢å
æ°æ®æ³¨é.
+ å¨å½åçåå¸çæ¬ä»
ä»
æ¯æEJB3注éçè¦å,å¦æä½ æ³ä½¿ç¨Hibernateç¹æçä¸äºå®ä½æ³¨é,
+ ä½ æ两ç§éæ©:ä¸,åªä½¿ç¨æ³¨é;äº,使ç¨åæ¥çhbm æ å°æ件.ä½ å½ç¶è¿æ¯å¯ä»¥åæ¶ä½¿ç¨æ³¨éå®ä½åhbm XMLæ å°æ件çå®ä½.</para>
+
+ <para>å¨æµè¯å¥ä»¶ä¸æä¸äºéå çXMLæ件çæ ·ä¾.</para>
+
+ <section>
+ <title>åå</title>
+
+ <para>XMLé¨ç½²æ件ç»æ被设计为ç´æ¥æ å°æ³¨éç»æ,æ以å¦æä½ ç¥é注éçç»æ,é£ä¹ä½¿ç¨XMLè¯æ³æ¯å¾ç®åç.</para>
+
+
+ <para>ä½ å¯ä»¥å®ä¹ä¸ä¸ªæè
å¤ä¸ªXMLæ件æ¥æè¿°ä½ çå
æ°æ®,è¿äºæ件ä¼è¢«è¦åå¼æå并(merged).</para>
+
+ <section>
+ <title>å
¨å±çº§å«çå
æ°æ®</title>
+
+ <para>ä½ å¯ä»¥ä½¿ç¨XMLæ件æ¥å®ä¹å
¨å±å
æ°æ®,对æ¯ä¸ä¸ªé¨ç½²æä»¶ä½ ä¸è½å®ä¹å¤äºä¸ä¸ªçå
æ°æ®.</para>
+
+ <programlisting><?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">
+
+ <persistence-unit-metadata>
+ <xml-mapping-metadata-complete/>
+ <persistence-unit-defaults>
+ <schema>myschema</schema>
+ <catalog>mycatalog</catalog>
+ <cascade-persist/>
+ </persistence-unit-defaults>
+ </persistence-unit-metadata></programlisting>
+
+ <para><literal>xml-mapping-metadata-complete</literal> æå³çææçå®ä½,mapped-superclassesååµå¥çå
æ°æ®åºè¯¥ä»XMLæ件ä¸å¯ç¨(忽ç¥æ³¨é).</para>
+
+
+ <para><literal>schema / catalog</literal> å°è¦åææå¨å
æ°æ®ä¸é»è®¤å®ä¹çschema å catalog(å
æ¬XMLå注é).</para>
+
+ <para><literal>cascade-persist</literal> æå³çææ注éä½ä¸ºä¸ä¸ª cascade type é½æ¯PERSISTç. æ们æ¨èä½ ä¸è¦ä½¿ç¨è¯¥ç¹æ§.</para>
+ </section>
+
+ <section>
+ <title>å®ä½çº§å«çå
æ°æ®</title>
+
+ <para>ä½ ä¹å¯ä»¥å¨ä¸ä¸ªç»å®çå®ä½ä¸å®ä¹æè
è¦åå
æ°æ®</para>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="3 85" id="aa1" />
+
+ <area coords="9 85" id="aa2" />
+
+ <area coords="10 85" id="aa3" />
+
+ <area coords="11 85" id="aa4" />
+
+ <area coords="17 85" id="aa5" />
+
+ <area coords="23 85" id="aa6" />
+
+ <area coords="24 85" id="aa7" />
+
+ <area coords="25 85" id="aa8" />
+
+ <area coords="26 85" id="aa9" />
+
+ <area coords="31 85" id="aa10" />
+ </areaspec>
+
+ <programlisting><?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>org.hibernate.test.annotations.reflection</package>
+ <entity class="Administration" access="PROPERTY" metadata-complete="true">
+ <table name="tbl_admin">
+ <unique-constraint>
+ <column-name>firstname</column-name>
+ <column-name>lastname</column-name>
+ </unique-constraint>
+ </table>
+ <secondary-table name="admin2">
+ <primary-key-join-column name="admin_id" referenced-column-name="id"/>
+ <unique-constraint>
+ <column-name>address</column-name>
+ </unique-constraint>
+ </secondary-table>
+ <id-class class="SocialSecurityNumber"/>
+ <inheritance strategy="JOINED"/>
+ <sequence-generator name="seqhilo" sequence-name="seqhilo"/>
+ <table-generator name="table" table="tablehilo"/>
+ ...
+ </entity>
+
+ <entity class="PostalAdministration">
+ <primary-key-join-column name="id"/>
+ ...
+ </entity>
+</entity-mappings></programlisting>
+
+ <calloutlist>
+ <callout arearefs="aa1">
+ <para><literal>entity-mappings</literal>:entity-mappings æ¯ææXMLæ件çæ ¹å
ç´ .ä½ å¿
é¡»å®ä¹XML Schema, 该æ件å
å«å¨hibernate-annotations.jarä¸,使ç¨Hibernate Annotations ä¸éè¦è®¿é®ç½ç».</para>
+ </callout>
+
+ <callout arearefs="aa2">
+ <para><literal>package</literal> (å¯éç): ä½ä¸ºé»è®¤çpackageç¨äºå¨ä¸ä¸ªç»å®çé¨ç½²æè¿°æ件ä¸ææ没æéå®çç±».</para>
+ </callout>
+
+ <callout arearefs="aa3">
+ <para><literal>entity</literal>: æè¿°ä¸ä¸ªå®ä½. </para>
+
+ <para><literal>metadata-complete</literal> å®ä¹å¯¹äºè¯¥å
ç´ æ¯å¦å
¨é¨ä½¿ç¨å
æ°æ®(æ¢å¥è¯æ¥è¯´å°±æ¯,å¦æ注éåºç°å¨ç±»çº§å«åºè¯¥èèæè
忽ç¥).</para>
+
+ <para>ä¸ä¸ªå®ä½ä¸å¾ä¸æä¸ä¸ª class å±æ§æ¥å¼ç¨ å
æ°æ®æåºç¨çç±». </para>
+
+ <para>éè¿<literal>name</literal>å±æ§ä½ å¯ä»¥è¦åå®ä½çåå,
+ å¦æ没æå®ä¹å¹¶ä¸<literal>@Entity.name</literal>åºç°äºçè¯,é£ä¹å°±ä½¿ç¨è¯¥æ³¨é(åå¦metadata complete 没æ被设置).</para>
+
+ <para>
+ 对äºmetadata complete (åèä¸é¢)å
ç´ , ä½ å¯ä»¥å®ä¹ä¸ä¸ª <literal>access</literal>(<literal>FIELD</literal> æè
<literal>PROPERTY</literal>(é»è®¤å¼)),
+ 对äºémetadata complete å
ç´ ,使ç¨æ³¨éçaccess type.</para>
+ </callout>
+
+ <callout arearefs="aa4">
+ <para><literal>table</literal>: ä½ å¯ä»¥å£°ætable å±æ§(name, schema, catalog), å¦æ没æå®ä¹, å°ä½¿ç¨Java注é.</para>
+
+ <para>就象ä¾åä¸æ示çé£æ ·ä½ å¯ä»¥å®ä¹ä¸ä¸ªæè
å¤ä¸ªunique constraints</para>
+ </callout>
+
+ <callout arearefs="aa5">
+ <para><literal>secondary-table</literal>: å®ä¹ä¸ä¸ªsecondary-table,é¤äºä½ å¯ä»¥éè¿<literal>primary-key-join-column </literal>å
ç´ å®ä¹ primary key / foreign key å以å¤æ¯åä¸è¬çtableä¸æ ·ç. å¨émetadata completeä¸, annotation secondary tables ä»
ä»
å¨æ²¡æ<literal>secondary-table </literal>å®ä¹çæ
åµä¸ä½¿ç¨, å¦å 注éå°è¢«å¿½ç¥.</para>
+ </callout>
+
+ <callout arearefs="aa6">
+ <para><literal>id-class</literal>: å<literal>@IdClass</literal>ä¸æ ·å®ä¹ä¸ä¸ªid class.</para>
+ </callout>
+
+ <callout arearefs="aa7">
+ <para><literal>inheritance</literal>:
+ å®ä¹ç»§æ¿çç¥(<literal>JOINED</literal>,
+ <literal>TABLE_PER_CLASS</literal>,
+ <literal>SINGLE_TABLE</literal>), ä»
ä»
å¨æ ¹å®ä½çº§å«å¯ä»¥ä½¿ç¨.</para>
+ </callout>
+
+ <callout arearefs="aa8">
+ <para><literal>sequence-generator</literal>: å®ä¹ä¸ä¸ªåºå产çå¨.</para>
+ </callout>
+
+ <callout arearefs="aa9">
+ <para><literal>table-generator</literal>: å®ä¹ä¸ä¸ªtable generator</para>
+ </callout>
+
+ <callout arearefs="aa10">
+ <para><literal><literal>primary-key-join-column</literal></literal>:
+ å½ JOINED 继æ¿çç¥ä½¿ç¨æ¶,为sub entitieså®ä¹ä¸ä¸ª primary key join column.</para>
+ </callout>
+ </calloutlist>
+
+
+ </programlistingco>
+
+ <programlistingco>
+ <areaspec>
+ <area coords="11 85" id="ab1" />
+
+ <area coords="18 85" id="ab2" />
+
+ <area coords="22 85" id="ab3" />
+
+ <area coords="28 85" id="ab4" />
+
+ <area coords="34 85" id="ab5" />
+ </areaspec>
+
+ <programlisting><?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>org.hibernate.test.annotations.reflection</package>
+ <entity class="Music" access="PROPERTY" metadata-complete="true">
+ <discriminator-value>Generic</discriminator-value>
+ <discriminator-column length="34"/>
+ ...
+ </entity>
+
+ <entity class="PostalAdministration">
+ <primary-key-join-column name="id"/>
+ <named-query name="adminById">
+ <query>select m from Administration m where m.id = :id</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-query>
+ <named-native-query name="allAdmin" result-set-mapping="adminrs">
+ <query>select *, count(taxpayer_id) as taxPayerNumber
+ from Administration, TaxPayer
+ where taxpayer_admin_id = admin_id group by ...</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-native-query>
+ <sql-result-set-mapping name="adminrs">
+ <entity-result entity-class="Administration">
+ <field-result name="name" column="fld_name"/>
+ </entity-result>
+ <column-result name="taxPayerNumber"/>
+ </sql-result-set-mapping>
+ <attribute-override name="ground">
+ <column name="fld_ground" unique="true" scale="2"/>
+ </attribute-override>
+ <association-override name="referer">
+ <join-column name="referer_id" referenced-column-name="id"/>
+ </association-override>
+ ...
+ </entity>
+</entity-mappings></programlisting>
+
+ <calloutlist>
+ <callout arearefs="ab1">
+ <para><literal>discriminator-value /
+ discriminator-column</literal>: å½SINGLE_TABLE继æ¿çç¥ä½¿ç¨æ¶,å®ä¹é´å«å¨å¼ å ä¿å该å¼çå.</para>
+ </callout>
+
+ <callout arearefs="ab2">
+ <para><literal>named-query</literal>: å®ä¹å½åæ¥è¯¢åä¸äºç¸å
³çå¯è½ç线索. 该å®ä¹éå å¨æ³¨éçå®ä¹ä¸,å¦æ两个é½å®ä¹äºç¸åçåå,é£ä¹XMLå°ä¼å
èè.</para>
+ </callout>
+
+ <callout arearefs="ab3">
+ <para><literal>named-native-query</literal>: å®ä¹ä¸ä¸ªå½åæ¬å°æ¥è¯¢ åä»ç sql result set æ å°. ä½ä¸ºå¦å¤ä¸ç§éæ©,ä½ å¯ä»¥å®ä¹<literal>result-class</literal>. è¿äºå®ä¹éå å¨æ³¨éçå®ä¹ä¸.å¦æ两个å®ä¹äºåæ ·çåå,XMLæ件ä¼å
èè.</para>
+ </callout>
+
+ <callout arearefs="ab4">
+ <para><literal>sql-result-set-mapping</literal>: æè¿°äº result set mapping çç»æ. ä½ å¯ä»¥å®ä¹ å®ä½ååæ å°. è¿äºå®ä¹éå å¨æ³¨éçå®ä¹ä¸,å¦æå®ä¹äºåæ ·çåå,XMLæ件ä¼å
èè.</para>
+ </callout>
+
+ <callout arearefs="ab5">
+ <para><literal>attribute-override /
+ association-override</literal>: å®ä¹ä¸åæè
join column overriding. 该overriding éå å¨æ³¨éçå®ä¹ä¸.</para>
+ </callout>
+ </calloutlist>
+ </programlistingco>
+
+ <para>ä¸äºåºç¨äº <literal><embeddable></literal> å
+ <literal><mapped-superclass></literal>.</para>
+ </section>
+
+ <section>
+ <title>å±æ§çº§å«çå
æ°æ®</title>
+
+ <para>
+ ä½ å½ç¶å¯ä»¥å®ä¹XMLæ¥è¦åå±æ§. å¦æmetadata complete ç»å®ä¹äº,é£ä¹éå çå±æ§(å¦: å¨Java 级å«ç)å°è¢«å¿½ç¥.
+å¦å¤,ä¸æ¦ä½ å¼å§è¦åä¸ä¸ªå±æ§,å¨è¯¥å±æ§ä¸çææ注éé½ä¼è¢«å¿½ç¥.ææå±æ§çº§å«çå
æ°æ®åºç¨äº<literal>entity/attributes</literal>,
+ <literal>mapped-superclass/attributes</literal> æ
+ <literal>embeddable/attributes</literal>.</para>
+
+ <programlisting> <attributes>
+ <id name="id">
+ <column name="fld_id"/>
+ <generated-value generator="generator" strategy="SEQUENCE"/>
+ <temporal>DATE</temporal>
+ <sequence-generator name="generator" sequence-name="seq"/>
+ </id>
+ <version name="version"/>
+ <embedded name="embeddedObject">
+ <attribute-override name"subproperty">
+ <column name="my_column"/>
+ </attribute-override>
+ </embedded>
+ <basic name="status" optional="false">
+ <enumerated>STRING</enumerated>
+ </basic>
+ <basic name="serial" optional="true">
+ <column name="serialbytes"/>
+ <lob/>
+ </basic>
+ <basic name="terminusTime" fetch="LAZY">
+ <temporal>TIMESTAMP</temporal>
+ </basic>
+ </attributes></programlisting>
+
+ <para>
+ éè¿ <literal>id</literal>,
+ <literal>embedded-id</literal>, <literal>version</literal>,
+ <literal>embedded</literal> å <literal>basic</literal>ä½ å¯ä»¥è¦åä¸ä¸ªå±æ§,
+ è¿äºå
ç´ ä¸çæ¯ä¸ä¸ªå
ç´ é½æç¸åºçsubelementsï¼<literal>lob</literal>,
+ <literal>temporal</literal>, <literal>enumerated</literal>,
+ <literal>column</literal>.</para>
+
+ </section>
+
+ <section>
+ <title>å
³è级å«çå
æ°æ®</title>
+
+ <para>ä½ å¯ä»¥å®ä¹XMLè¦åå
³è注é. ææçå
³è级å«çå
æ°æ®ä½ç¨äº
+ <literal>entity/attributes</literal>,
+ <literal>mapped-superclass/attributes</literal> æ
+ <literal>embeddable/attributes</literal>.</para>
+
+ <programlisting> <attributes>
+ <one-to-many name="players" fetch="EAGER">
+ <map-key name="name"/>
+ <join-column name="driver"/>
+ <join-column name="number"/>
+ </one-to-many>
+ <many-to-many name="roads" target-entity="Administration">
+ <order-by>maxSpeed</order-by>
+ <join-table name="bus_road">
+ <join-column name="driver"/>
+ <join-column name="number"/>
+ <inverse-join-column name="road_id"/>
+ <unique-constraint>
+ <column-name>driver</column-name>
+ <column-name>number</column-name>
+ </unique-constraint>
+ </join-table>
+ </many-to-many>
+ <many-to-many name="allTimeDrivers" mapped-by="drivenBuses">
+ </attributes></programlisting>
+
+ <para>éè¿<literal>one-to-many</literal>, <literal>one-to-one</literal>,
+ <literal>many-to-one</literal>, å <literal>many-to-many</literal>.
+ ä½ å¯ä»¥éåä¸ä¸ªå
³èå
³ç³».è¿äºå
ç´ ä¸çæ¯ä¸ä¸ªé½æç¸åºçsubelements. <literal>join-table</literal> (å¯ä»¥æ
+ <literal>join-column</literal>å
+ <literal>inverse-join-column</literal>),
+ <literal><literal>join-column</literal></literal>,
+ <literal>map-key</literal>, å <literal>order-by</literal>.
+ <literal>mapped-by</literal> å <literal>target-entity</literal>
+ å½ä»ä»¬ææä¹çæ¶åå¯ä»¥å®ä¹å±æ§. åä¸æ¬¡å¼ºè° 该ç»ææ å°äºæ³¨éçç»æ.å¨æ述注éçä¸ç« ä¸ ä½ å¯ä»¥æ¾å°ææçè¯ä¹ä¿¡æ¯.</para>
+
+
+ </section>
+ </section>
+</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/styles (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/styles)
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/fopdf.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/styles/fopdf.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,509 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL FO configuration file for the Hibernate
- Reference Documentation. It defines a custom titlepage and
- the parameters for the A4 sized PDF printable output.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
-
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- exclude-result-prefixes="#default">
-
- <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
-
- <!--###################################################
- Custom Title Page
- ################################################### -->
-
- <xsl:template name="book.titlepage.recto">
- <fo:block>
- <fo:table table-layout="fixed" width="175mm">
- <fo:table-column column-width="175mm"/>
- <fo:table-body>
- <fo:table-row>
- <fo:table-cell text-align="center">
- <fo:block>
- <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/subtitle"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
- Version:
- <xsl:value-of select="bookinfo/releaseinfo"/>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </fo:block>
- </xsl:template>
-
- <!-- Prevent blank pages in output -->
- <xsl:template name="book.titlepage.before.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.separator">
- </xsl:template>
-
- <!--###################################################
- Header
- ################################################### -->
-
- <!-- More space in the center header for long text -->
- <xsl:attribute-set name="header.content.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$body.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="margin-left">-5em</xsl:attribute>
- <xsl:attribute name="margin-right">-5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Custom Footer
- ################################################### -->
-
- <!-- This footer prints the Hibernate version number on the left side -->
- <xsl:template name="footer.content">
- <xsl:param name="pageclass" select="''"/>
- <xsl:param name="sequence" select="''"/>
- <xsl:param name="position" select="''"/>
- <xsl:param name="gentext-key" select="''"/>
-
- <xsl:variable name="Version">
- <xsl:choose>
- <xsl:when test="//releaseinfo">
- <xsl:text>Hibernate </xsl:text>
- <xsl:value-of select="//releaseinfo"/>
- </xsl:when>
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
-
- <xsl:choose>
- <xsl:when test="$sequence='blank'">
- <xsl:choose>
- <xsl:when test="$double.sided != 0 and $position = 'left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position = 'center'">
- <!-- nop -->
- </xsl:when>
-
- <xsl:otherwise>
- <fo:page-number/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
-
- <xsl:when test="$pageclass='titlepage'">
- <!-- nop: other titlepage sequences have no footer -->
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <!--###################################################
- Custom Toc Line
- ################################################### -->
-
- <!-- Improve the TOC. -->
- <xsl:template name="toc.line">
- <xsl:variable name="id">
- <xsl:call-template name="object.id"/>
- </xsl:variable>
-
- <xsl:variable name="label">
- <xsl:apply-templates select="." mode="label.markup"/>
- </xsl:variable>
-
- <fo:block text-align-last="justify"
- end-indent="{$toc.indent.width}pt"
- last-line-end-indent="-{$toc.indent.width}pt">
- <fo:inline keep-with-next.within-line="always">
- <fo:basic-link internal-destination="{$id}">
-
- <!-- Chapter titles should be bold. -->
- <xsl:choose>
- <xsl:when test="local-name(.) = 'chapter'">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="$label != ''">
- <xsl:copy-of select="$label"/>
- <xsl:value-of select="$autotoc.label.separator"/>
- </xsl:if>
- <xsl:apply-templates select="." mode="titleabbrev.markup"/>
- </fo:basic-link>
- </fo:inline>
- <fo:inline keep-together.within-line="always">
- <xsl:text> </xsl:text>
- <fo:leader leader-pattern="dots"
- leader-pattern-width="3pt"
- leader-alignment="reference-area"
- keep-with-next.within-line="always"/>
- <xsl:text> </xsl:text>
- <fo:basic-link internal-destination="{$id}">
- <fo:page-number-citation ref-id="{$id}"/>
- </fo:basic-link>
- </fo:inline>
- </fo:block>
- </xsl:template>
-
- <!--###################################################
- Extensions
- ################################################### -->
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <!-- FOP provide only PDF Bookmarks at the moment -->
- <xsl:param name="fop.extensions">1</xsl:param>
-
- <!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
- <!-- Dot and Whitespace as separator in TOC between Label and Title-->
- <xsl:param name="autotoc.label.separator" select="'. '"/>
-
-
- <!--###################################################
- Paper & Page Size
- ################################################### -->
-
- <!-- Paper type, no headers on blank pages, no double sided printing -->
- <xsl:param name="paper.type" select="'A4'"/>
- <xsl:param name="double.sided">0</xsl:param>
- <xsl:param name="headers.on.blank.pages">0</xsl:param>
- <xsl:param name="footers.on.blank.pages">0</xsl:param>
-
- <!-- Space between paper border and content (chaotic stuff, don't touch) -->
- <xsl:param name="page.margin.top">5mm</xsl:param>
- <xsl:param name="region.before.extent">10mm</xsl:param>
- <xsl:param name="body.margin.top">10mm</xsl:param>
-
- <xsl:param name="body.margin.bottom">15mm</xsl:param>
- <xsl:param name="region.after.extent">10mm</xsl:param>
- <xsl:param name="page.margin.bottom">0mm</xsl:param>
-
- <xsl:param name="page.margin.outer">18mm</xsl:param>
- <xsl:param name="page.margin.inner">18mm</xsl:param>
-
- <!-- No intendation of Titles -->
- <xsl:param name="title.margin.left">0pc</xsl:param>
-
- <!--###################################################
- Fonts & Styles
- ################################################### -->
-
- <!-- Default Font size -->
- <xsl:param name="body.font.master">11</xsl:param>
-
- <!-- Line height in body text -->
- <xsl:param name="line-height">1.4</xsl:param>
-
- <!-- Monospaced fonts are smaller than regular text -->
- <xsl:attribute-set name="monospace.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$monospace.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="font-size">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
-
- <!--###################################################
- Tables
- ################################################### -->
-
- <!-- The table width should be adapted to the paper size -->
- <xsl:param name="default.table.width">17.4cm</xsl:param>
-
- <!-- Some padding inside tables -->
- <xsl:attribute-set name="table.cell.padding">
- <xsl:attribute name="padding-left">4pt</xsl:attribute>
- <xsl:attribute name="padding-right">4pt</xsl:attribute>
- <xsl:attribute name="padding-top">4pt</xsl:attribute>
- <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Only hairlines as frame and cell borders in tables -->
- <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
- <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
-
- <!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
- <!--###################################################
- Titles
- ################################################### -->
-
- <!-- Chapter title size -->
- <xsl:attribute-set name="chapter.titlepage.recto.style">
- <xsl:attribute name="text-align">left</xsl:attribute>
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.8"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
- Let's remove it, so this sucker can use our attribute-set only... -->
- <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
- <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xsl:use-attribute-sets="chapter.titlepage.recto.style">
- <xsl:call-template name="component.title">
- <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
- </xsl:call-template>
- </fo:block>
- </xsl:template>
-
- <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
- <xsl:attribute-set name="section.title.level1.properties">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.5"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level2.properties">
- <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.25"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level3.properties">
- <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.0"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Titles of formal objects (tables, examples, ...) -->
- <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="hyphenate">false</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Programlistings
- ################################################### -->
-
- <!-- Verbatim text formatting (programlistings) -->
- <xsl:attribute-set name="verbatim.properties">
- <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- <xsl:attribute name="border-color">#444444</xsl:attribute>
- <xsl:attribute name="border-style">solid</xsl:attribute>
- <xsl:attribute name="border-width">0.1pt</xsl:attribute>
- <xsl:attribute name="padding-top">0.5em</xsl:attribute>
- <xsl:attribute name="padding-left">0.5em</xsl:attribute>
- <xsl:attribute name="padding-right">0.5em</xsl:attribute>
- <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
- <xsl:attribute name="margin-left">0.5em</xsl:attribute>
- <xsl:attribute name="margin-right">0.5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Shade (background) programlistings -->
- <xsl:param name="shade.verbatim">1</xsl:param>
- <xsl:attribute-set name="shade.verbatim.style">
- <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Callouts
- ################################################### -->
-
- <!-- We want to use callouts... -->
- <xsl:param name="callout.extensions">1</xsl:param>
-
- <!-- Place callout bullets at this column in programmlisting.-->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
- <!--
- No, don't use crappy graphics for the callout bullets. This setting
- enables some weird Unicode rendering for some fancy bullet points
- in callouts. By default, this can only count to 10 and produces
- strange results if you ever have more than 10 callouts for one
- programlisting. We will fix that next.
- -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!--
- Again, fun with DocBook XSL: The callout bullets are rendered in
- two places: In the programlisting itself and in the list below
- the listing, with the actual callout text. The rendering in the
- programlisting is some XSL transformer extension (e.g. a Saxon
- extension), so we can't change that without messing with the
- extensions. We only can turn it off by setting this limit to
- zero, then, a simple bracket style like "(3)" and "(4)" will
- be used in the programlisting.
- -->
- <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
-
- <!--
- The callout bullets in the actual callout list will be rendered
- with an XSL FO template. The default template is broken: limited to 10
- nice looking Unicode bullet points and then it doesn't print anything,
- the fallback doesn't work. We implement our own template, which is not
- as complicated, more ugly, but works. As always, function is more
- important than form.
- -->
- <xsl:template name="callout-bug">
- <xsl:param name="conum" select='1'/>
- <fo:inline
- color="black"
- padding-top="0.1em"
- padding-bottom="0.1em"
- padding-start="0.2em"
- padding-end="0.2em"
- baseline-shift="0.1em"
- font-family="{$monospace.font.family}"
- font-weight="bold"
- font-size="75%">
- <xsl:text>(</xsl:text>
- <xsl:value-of select="$conum"/>
- <xsl:text>)</xsl:text>
- </fo:inline>
-
- </xsl:template>
-
- <!--###################################################
- Misc
- ################################################### -->
-
- <!-- Correct placement of titles for figures and examples. -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
- <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
- <xsl:param name="variablelist.as.blocks">1</xsl:param>
-
- <!-- The horrible list spacing problems, this is much better. -->
- <xsl:attribute-set name="list.block.spacing">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Newer DocBook XSL apparently thinks that some sections are by
- default "draft" status, and this idiotic thing is by default
- also set to "maybe", so it spits out a lot of errors with the
- latest FOP as the XSL/FO styles have references to some draft
- watermarks, which you actually don't want in the first place.
- Turn this crap off. If you have to work with the "status"
- attribute, don't.
- -->
- <xsl:param name="draft.mode" select="'no'"/>
-
- <!-- Simplified Chinese related Settings -->
- <xsl:param name="hyphenate">false</xsl:param>
- <xsl:param name="body.font.family">simsun</xsl:param>
- <xsl:param name="monospace.font.family">simsun</xsl:param>
- <xsl:param name="title.font.family">simhei</xsl:param>
- <xsl:param name="saxon.character.representation" select="native"/>
- <xsl:param name="callout.unicode" select="1"/>
- <xsl:param name="callout.unicode.start.character" select="10102"/>
- <xsl:param name="l10n.gentext.default.language" select="zh-cn"/>
-</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/fopdf.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/styles/fopdf.xsl)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/fopdf.xsl (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,509 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL FO configuration file for the Hibernate
+ Reference Documentation. It defines a custom titlepage and
+ the parameters for the A4 sized PDF printable output.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ exclude-result-prefixes="#default">
+
+ <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
+
+ <!--###################################################
+ Custom Title Page
+ ################################################### -->
+
+ <xsl:template name="book.titlepage.recto">
+ <fo:block>
+ <fo:table table-layout="fixed" width="175mm">
+ <fo:table-column column-width="175mm"/>
+ <fo:table-body>
+ <fo:table-row>
+ <fo:table-cell text-align="center">
+ <fo:block>
+ <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/subtitle"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
+ Version:
+ <xsl:value-of select="bookinfo/releaseinfo"/>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Prevent blank pages in output -->
+ <xsl:template name="book.titlepage.before.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.separator">
+ </xsl:template>
+
+ <!--###################################################
+ Header
+ ################################################### -->
+
+ <!-- More space in the center header for long text -->
+ <xsl:attribute-set name="header.content.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-left">-5em</xsl:attribute>
+ <xsl:attribute name="margin-right">-5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Custom Footer
+ ################################################### -->
+
+ <!-- This footer prints the Hibernate version number on the left side -->
+ <xsl:template name="footer.content">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="position" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+ <xsl:variable name="Version">
+ <xsl:choose>
+ <xsl:when test="//releaseinfo">
+ <xsl:text>Hibernate </xsl:text>
+ <xsl:value-of select="//releaseinfo"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$sequence='blank'">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0 and $position = 'left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position = 'center'">
+ <!-- nop -->
+ </xsl:when>
+
+ <xsl:otherwise>
+ <fo:page-number/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$pageclass='titlepage'">
+ <!-- nop: other titlepage sequences have no footer -->
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!--###################################################
+ Custom Toc Line
+ ################################################### -->
+
+ <!-- Improve the TOC. -->
+ <xsl:template name="toc.line">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+
+ <fo:block text-align-last="justify"
+ end-indent="{$toc.indent.width}pt"
+ last-line-end-indent="-{$toc.indent.width}pt">
+ <fo:inline keep-with-next.within-line="always">
+ <fo:basic-link internal-destination="{$id}">
+
+ <!-- Chapter titles should be bold. -->
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'chapter'">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$label != ''">
+ <xsl:copy-of select="$label"/>
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </fo:basic-link>
+ </fo:inline>
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="dots"
+ leader-pattern-width="3pt"
+ leader-alignment="reference-area"
+ keep-with-next.within-line="always"/>
+ <xsl:text> </xsl:text>
+ <fo:basic-link internal-destination="{$id}">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ </fo:inline>
+ </fo:block>
+ </xsl:template>
+
+ <!--###################################################
+ Extensions
+ ################################################### -->
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <!-- FOP provide only PDF Bookmarks at the moment -->
+ <xsl:param name="fop.extensions">1</xsl:param>
+
+ <!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+ <!-- Dot and Whitespace as separator in TOC between Label and Title-->
+ <xsl:param name="autotoc.label.separator" select="'. '"/>
+
+
+ <!--###################################################
+ Paper & Page Size
+ ################################################### -->
+
+ <!-- Paper type, no headers on blank pages, no double sided printing -->
+ <xsl:param name="paper.type" select="'A4'"/>
+ <xsl:param name="double.sided">0</xsl:param>
+ <xsl:param name="headers.on.blank.pages">0</xsl:param>
+ <xsl:param name="footers.on.blank.pages">0</xsl:param>
+
+ <!-- Space between paper border and content (chaotic stuff, don't touch) -->
+ <xsl:param name="page.margin.top">5mm</xsl:param>
+ <xsl:param name="region.before.extent">10mm</xsl:param>
+ <xsl:param name="body.margin.top">10mm</xsl:param>
+
+ <xsl:param name="body.margin.bottom">15mm</xsl:param>
+ <xsl:param name="region.after.extent">10mm</xsl:param>
+ <xsl:param name="page.margin.bottom">0mm</xsl:param>
+
+ <xsl:param name="page.margin.outer">18mm</xsl:param>
+ <xsl:param name="page.margin.inner">18mm</xsl:param>
+
+ <!-- No intendation of Titles -->
+ <xsl:param name="title.margin.left">0pc</xsl:param>
+
+ <!--###################################################
+ Fonts & Styles
+ ################################################### -->
+
+ <!-- Default Font size -->
+ <xsl:param name="body.font.master">11</xsl:param>
+
+ <!-- Line height in body text -->
+ <xsl:param name="line-height">1.4</xsl:param>
+
+ <!-- Monospaced fonts are smaller than regular text -->
+ <xsl:attribute-set name="monospace.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$monospace.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+
+ <!--###################################################
+ Tables
+ ################################################### -->
+
+ <!-- The table width should be adapted to the paper size -->
+ <xsl:param name="default.table.width">17.4cm</xsl:param>
+
+ <!-- Some padding inside tables -->
+ <xsl:attribute-set name="table.cell.padding">
+ <xsl:attribute name="padding-left">4pt</xsl:attribute>
+ <xsl:attribute name="padding-right">4pt</xsl:attribute>
+ <xsl:attribute name="padding-top">4pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Only hairlines as frame and cell borders in tables -->
+ <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
+ <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
+
+ <!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+ <!--###################################################
+ Titles
+ ################################################### -->
+
+ <!-- Chapter title size -->
+ <xsl:attribute-set name="chapter.titlepage.recto.style">
+ <xsl:attribute name="text-align">left</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.8"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
+ Let's remove it, so this sucker can use our attribute-set only... -->
+ <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xsl:use-attribute-sets="chapter.titlepage.recto.style">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
+ <xsl:attribute-set name="section.title.level1.properties">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.5"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level2.properties">
+ <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.25"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level3.properties">
+ <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.0"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Titles of formal objects (tables, examples, ...) -->
+ <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Programlistings
+ ################################################### -->
+
+ <!-- Verbatim text formatting (programlistings) -->
+ <xsl:attribute-set name="verbatim.properties">
+ <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ <xsl:attribute name="border-color">#444444</xsl:attribute>
+ <xsl:attribute name="border-style">solid</xsl:attribute>
+ <xsl:attribute name="border-width">0.1pt</xsl:attribute>
+ <xsl:attribute name="padding-top">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-left">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-right">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-left">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-right">0.5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Shade (background) programlistings -->
+ <xsl:param name="shade.verbatim">1</xsl:param>
+ <xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- We want to use callouts... -->
+ <xsl:param name="callout.extensions">1</xsl:param>
+
+ <!-- Place callout bullets at this column in programmlisting.-->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+ <!--
+ No, don't use crappy graphics for the callout bullets. This setting
+ enables some weird Unicode rendering for some fancy bullet points
+ in callouts. By default, this can only count to 10 and produces
+ strange results if you ever have more than 10 callouts for one
+ programlisting. We will fix that next.
+ -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!--
+ Again, fun with DocBook XSL: The callout bullets are rendered in
+ two places: In the programlisting itself and in the list below
+ the listing, with the actual callout text. The rendering in the
+ programlisting is some XSL transformer extension (e.g. a Saxon
+ extension), so we can't change that without messing with the
+ extensions. We only can turn it off by setting this limit to
+ zero, then, a simple bracket style like "(3)" and "(4)" will
+ be used in the programlisting.
+ -->
+ <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
+
+ <!--
+ The callout bullets in the actual callout list will be rendered
+ with an XSL FO template. The default template is broken: limited to 10
+ nice looking Unicode bullet points and then it doesn't print anything,
+ the fallback doesn't work. We implement our own template, which is not
+ as complicated, more ugly, but works. As always, function is more
+ important than form.
+ -->
+ <xsl:template name="callout-bug">
+ <xsl:param name="conum" select='1'/>
+ <fo:inline
+ color="black"
+ padding-top="0.1em"
+ padding-bottom="0.1em"
+ padding-start="0.2em"
+ padding-end="0.2em"
+ baseline-shift="0.1em"
+ font-family="{$monospace.font.family}"
+ font-weight="bold"
+ font-size="75%">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </fo:inline>
+
+ </xsl:template>
+
+ <!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Correct placement of titles for figures and examples. -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+ <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
+ <xsl:param name="variablelist.as.blocks">1</xsl:param>
+
+ <!-- The horrible list spacing problems, this is much better. -->
+ <xsl:attribute-set name="list.block.spacing">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Newer DocBook XSL apparently thinks that some sections are by
+ default "draft" status, and this idiotic thing is by default
+ also set to "maybe", so it spits out a lot of errors with the
+ latest FOP as the XSL/FO styles have references to some draft
+ watermarks, which you actually don't want in the first place.
+ Turn this crap off. If you have to work with the "status"
+ attribute, don't.
+ -->
+ <xsl:param name="draft.mode" select="'no'"/>
+
+ <!-- Simplified Chinese related Settings -->
+ <xsl:param name="hyphenate">false</xsl:param>
+ <xsl:param name="body.font.family">simsun</xsl:param>
+ <xsl:param name="monospace.font.family">simsun</xsl:param>
+ <xsl:param name="title.font.family">simhei</xsl:param>
+ <xsl:param name="saxon.character.representation" select="native"/>
+ <xsl:param name="callout.unicode" select="1"/>
+ <xsl:param name="callout.unicode.start.character" select="10102"/>
+ <xsl:param name="l10n.gentext.default.language" select="zh-cn"/>
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.css
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/styles/html.css 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,97 +0,0 @@
-A {
- color: #003399;
-}
-
-A:active {
- color: #003399;
-}
-
-A:visited {
- color: #888888;
-}
-
-P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
- color: #000000;
-}
-
-TD, TH, SPAN {
- color: #000000;
-}
-
-BLOCKQUOTE {
- margin-right: 0px;
-}
-
-
-H1, H2, H3, H4, H5, H6 {
- color: #000000;
- font-weight:500;
- margin-top:10px;
- padding-top:15px;
-}
-
-TABLE {
- border-collapse: collapse;
- border-spacing:0;
- border: 1px thin black;
- empty-cells: hide;
-}
-
-TD {
- padding: 4pt;
-}
-
-H1 { font-size: 150%; }
-H2 { font-size: 140%; }
-H3 { font-size: 110%; font-weight: bold; }
-H4 { font-size: 110%; font-weight: bold;}
-H5 { font-size: 100%; font-style: italic; }
-H6 { font-size: 100%; font-style: italic; }
-
-TT {
-font-size: 90%;
- font-family: "Courier New", Courier, monospace;
- color: #000000;
-}
-
-PRE {
-font-size: 100%;
- padding: 5px;
- border-style: solid;
- border-width: 1px;
- border-color: #CCCCCC;
- background-color: #F4F4F4;
-}
-
-UL, OL, LI {
- list-style: disc;
-}
-
-HR {
- width: 100%;
- height: 1px;
- background-color: #CCCCCC;
- border-width: 0px;
- padding: 0px;
- color: #CCCCCC;
-}
-
-.variablelist {
- padding-top: 10;
- padding-bottom:10;
- margin:0;
-}
-
-.itemizedlist, UL {
- padding-top: 0;
- padding-bottom:0;
- margin:0;
-}
-
-.term {
- font-weight:bold;
-}
-
-
-
-
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.css (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/styles/html.css)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.css (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,97 @@
+A {
+ color: #003399;
+}
+
+A:active {
+ color: #003399;
+}
+
+A:visited {
+ color: #888888;
+}
+
+P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
+ color: #000000;
+}
+
+TD, TH, SPAN {
+ color: #000000;
+}
+
+BLOCKQUOTE {
+ margin-right: 0px;
+}
+
+
+H1, H2, H3, H4, H5, H6 {
+ color: #000000;
+ font-weight:500;
+ margin-top:10px;
+ padding-top:15px;
+}
+
+TABLE {
+ border-collapse: collapse;
+ border-spacing:0;
+ border: 1px thin black;
+ empty-cells: hide;
+}
+
+TD {
+ padding: 4pt;
+}
+
+H1 { font-size: 150%; }
+H2 { font-size: 140%; }
+H3 { font-size: 110%; font-weight: bold; }
+H4 { font-size: 110%; font-weight: bold;}
+H5 { font-size: 100%; font-style: italic; }
+H6 { font-size: 100%; font-style: italic; }
+
+TT {
+font-size: 90%;
+ font-family: "Courier New", Courier, monospace;
+ color: #000000;
+}
+
+PRE {
+font-size: 100%;
+ padding: 5px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #CCCCCC;
+ background-color: #F4F4F4;
+}
+
+UL, OL, LI {
+ list-style: disc;
+}
+
+HR {
+ width: 100%;
+ height: 1px;
+ background-color: #CCCCCC;
+ border-width: 0px;
+ padding: 0px;
+ color: #CCCCCC;
+}
+
+.variablelist {
+ padding-top: 10;
+ padding-bottom:10;
+ margin:0;
+}
+
+.itemizedlist, UL {
+ padding-top: 0;
+ padding-bottom:0;
+ margin:0;
+}
+
+.term {
+ font-weight:bold;
+}
+
+
+
+
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/styles/html.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,84 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/styles/html.xsl)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.xsl (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html_chunk.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/styles/html_chunk.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="chunk.section.depth">'5'</xsl:param>
- <xsl:param name="use.id.as.filename">'1'</xsl:param>
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html_chunk.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/doc/reference/zh_cn/styles/html_chunk.xsl)
===================================================================
--- trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html_chunk.xsl (rev 0)
+++ trunk/HibernateExt/annotations/doc/reference/zh_cn/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="chunk.section.depth">'5'</xsl:param>
+ <xsl:param name="use.id.as.filename">'1'</xsl:param>
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Copied: trunk/HibernateExt/annotations/jdbc (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/jdbc)
Deleted: trunk/HibernateExt/annotations/jdbc/hsqldb.jar
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/annotations/jdbc/hsqldb.jar (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/jdbc/hsqldb.jar)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/annotations/lgpl.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/lgpl.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/lgpl.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
Copied: trunk/HibernateExt/annotations/lgpl.txt (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/lgpl.txt)
===================================================================
--- trunk/HibernateExt/annotations/lgpl.txt (rev 0)
+++ trunk/HibernateExt/annotations/lgpl.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Copied: trunk/HibernateExt/annotations/lib (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/lib)
Deleted: trunk/HibernateExt/annotations/lib/README.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/lib/README.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/lib/README.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-Hibernate Annotations dependencies
-==================================
-
-
-Core
-====
-hibernate-commons-annotations.jar: required
-hibernate3.jar: required
-hibernate core dependencies: required (see Hibernate Core for more information)
-hibernate-validator.jar: optional
-ejb3-persistence.jar: required
-
-Test
-====
-(no additinal dependency)
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/lib/README.txt (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/lib/README.txt)
===================================================================
--- trunk/HibernateExt/annotations/lib/README.txt (rev 0)
+++ trunk/HibernateExt/annotations/lib/README.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+Hibernate Annotations dependencies
+==================================
+
+
+Core
+====
+hibernate-commons-annotations.jar: required
+hibernate3.jar: required
+hibernate core dependencies: required (see Hibernate Core for more information)
+hibernate-validator.jar: optional
+ejb3-persistence.jar: required
+
+Test
+====
+(no additinal dependency)
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/readme.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/readme.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/readme.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-Hibernate Annotations
-==================================================
-Version: 3.2.1.GA, 8.12.2006
-
-THIS RELEASE OF HIBERNATE ANNOTATIONS REQUIRES HIBERNATE CORE 3.2.0.GA (and above) AND DOES NOT
-WORK WITH HIBERNATE 3.1.x OR ANY OLDER VERSION OF HIBERNATE.
-
-
-Description
------------
-
-The EJB3 specification recognizes the interest and the success of
-the transparent object/relational mapping paradigm. The EJB3 specification
-standardizes the basic APIs and the metadata needed for any object/relational
-persistence mechanism.
-
-Hibernate EntityManager implements the programming interfaces and lifecycle rules
-as defined by the EJB3 persistence specification. Together with Hibernate Annotations
-this wrapper implements a complete (and standalone) EJB3 persistence solution on
-top of the mature Hibernate core. You may use a combination of all three together,
-annotations without EJB3 programming interfaces and lifecycle, or even pure native
-Hibernate, depending on the business and technical needs of your project. You can
-at all times fall back to Hibernate native APIs, or if required, even to native
-JDBC and SQL.
-
-
-Instructions
-------------
-
-Unzip to installation directory, read doc/reference
-
-
-Contact
-------------
-
-Latest Documentation:
-
- http://hibernate.org
- http://annotations.hibernate.org
-
-Bug Reports:
-
- Hibernate JIRA (preferred)
- hibernate-devel at lists.sourceforge.net
-
-Free Technical Support:
-
- http://forum.hibernate.org
-
-
-Notes
------------
-
-If you want to contribute, go to http://www.hibernate.org/
-
-This software and its documentation are distributed under the terms of the
-FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/readme.txt (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/readme.txt)
===================================================================
--- trunk/HibernateExt/annotations/readme.txt (rev 0)
+++ trunk/HibernateExt/annotations/readme.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+Hibernate Annotations
+==================================================
+Version: 3.2.1.GA, 8.12.2006
+
+THIS RELEASE OF HIBERNATE ANNOTATIONS REQUIRES HIBERNATE CORE 3.2.0.GA (and above) AND DOES NOT
+WORK WITH HIBERNATE 3.1.x OR ANY OLDER VERSION OF HIBERNATE.
+
+
+Description
+-----------
+
+The EJB3 specification recognizes the interest and the success of
+the transparent object/relational mapping paradigm. The EJB3 specification
+standardizes the basic APIs and the metadata needed for any object/relational
+persistence mechanism.
+
+Hibernate EntityManager implements the programming interfaces and lifecycle rules
+as defined by the EJB3 persistence specification. Together with Hibernate Annotations
+this wrapper implements a complete (and standalone) EJB3 persistence solution on
+top of the mature Hibernate core. You may use a combination of all three together,
+annotations without EJB3 programming interfaces and lifecycle, or even pure native
+Hibernate, depending on the business and technical needs of your project. You can
+at all times fall back to Hibernate native APIs, or if required, even to native
+JDBC and SQL.
+
+
+Instructions
+------------
+
+Unzip to installation directory, read doc/reference
+
+
+Contact
+------------
+
+Latest Documentation:
+
+ http://hibernate.org
+ http://annotations.hibernate.org
+
+Bug Reports:
+
+ Hibernate JIRA (preferred)
+ hibernate-devel at lists.sourceforge.net
+
+Free Technical Support:
+
+ http://forum.hibernate.org
+
+
+Notes
+-----------
+
+If you want to contribute, go to http://www.hibernate.org/
+
+This software and its documentation are distributed under the terms of the
+FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src)
Copied: trunk/HibernateExt/annotations/src/java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java)
Copied: trunk/HibernateExt/annotations/src/java/org (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org)
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate)
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/AnnotationException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/AnnotationException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/AnnotationException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id$
-package org.hibernate;
-
-/**
- * Annotation related exception.
- * The EJB3 EG will probably set a generic exception.
- * I'll then use this one.
- *
- * @author Emmanuel Bernard
- */
-public class AnnotationException extends MappingException {
-
- public AnnotationException(String msg, Throwable root) {
- super( msg, root );
- }
-
- public AnnotationException(Throwable root) {
- super( root );
- }
-
- public AnnotationException(String s) {
- super( s );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/AnnotationException.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/AnnotationException.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/AnnotationException.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/AnnotationException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id$
+package org.hibernate;
+
+/**
+ * Annotation related exception.
+ * The EJB3 EG will probably set a generic exception.
+ * I'll then use this one.
+ *
+ * @author Emmanuel Bernard
+ */
+public class AnnotationException extends MappingException {
+
+ public AnnotationException(String msg, Throwable root) {
+ super( msg, root );
+ }
+
+ public AnnotationException(Throwable root) {
+ super( root );
+ }
+
+ public AnnotationException(String s) {
+ super( s );
+ }
+}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations)
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/AccessType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/AccessType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/AccessType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Property Access type
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface AccessType {
- String value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/AccessType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/AccessType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/AccessType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/AccessType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Property Access type
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface AccessType {
+ String value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/BatchSize.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/BatchSize.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/BatchSize.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Batch size for SQL loading
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface BatchSize {
- /** Strictly positive integer */
- int size();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/BatchSize.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/BatchSize.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/BatchSize.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/BatchSize.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Batch size for SQL loading
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface BatchSize {
+ /** Strictly positive integer */
+ int size();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cache.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Cache.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cache.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Add caching strategy to a root entity or a collection
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Cache {
- /** concurrency strategy chosen */
- CacheConcurrencyStrategy usage();
- /** cache region name */
- String region() default "";
- /**
- * whether or not lazy-properties are included in the second level cache
- * default all, other value: non-lazy
- */
- String include() default "all";
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cache.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Cache.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cache.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cache.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Add caching strategy to a root entity or a collection
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Cache {
+ /** concurrency strategy chosen */
+ CacheConcurrencyStrategy usage();
+ /** cache region name */
+ String region() default "";
+ /**
+ * whether or not lazy-properties are included in the second level cache
+ * default all, other value: non-lazy
+ */
+ String include() default "all";
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheConcurrencyStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheConcurrencyStrategy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheConcurrencyStrategy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-/**
- * Cache concurrency strategy
- *
- * @author Emmanuel Bernard
- */
-public enum CacheConcurrencyStrategy {
- NONE,
- READ_ONLY,
- NONSTRICT_READ_WRITE,
- READ_WRITE,
- TRANSACTIONAL
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheConcurrencyStrategy.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheConcurrencyStrategy.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheConcurrencyStrategy.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheConcurrencyStrategy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+//$Id$
+package org.hibernate.annotations;
+
+/**
+ * Cache concurrency strategy
+ *
+ * @author Emmanuel Bernard
+ */
+public enum CacheConcurrencyStrategy {
+ NONE,
+ READ_ONLY,
+ NONSTRICT_READ_WRITE,
+ READ_WRITE,
+ TRANSACTIONAL
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheModeType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheModeType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheModeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-package org.hibernate.annotations;
-
-/**
- * Enumeration for the different interaction modes between the session and
- * the Level 2 Cache.
- *
- * @author Emmanuel Bernard
- * @author Carlos González-Cadenas
- */
-
-public enum CacheModeType {
- GET,
- IGNORE,
- NORMAL,
- PUT,
- REFRESH
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheModeType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheModeType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheModeType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CacheModeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+package org.hibernate.annotations;
+
+/**
+ * Enumeration for the different interaction modes between the session and
+ * the Level 2 Cache.
+ *
+ * @author Emmanuel Bernard
+ * @author Carlos González-Cadenas
+ */
+
+public enum CacheModeType {
+ GET,
+ IGNORE,
+ NORMAL,
+ PUT,
+ REFRESH
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cascade.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Cascade.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cascade.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Apply a cascade strategy on an association
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Cascade {
- CascadeType[] value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cascade.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Cascade.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cascade.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Cascade.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Apply a cascade strategy on an association
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Cascade {
+ CascadeType[] value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CascadeType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/CascadeType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CascadeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-package org.hibernate.annotations;
-
-/**
- * Cascade types (can override default EJB3 cascades
- */
-public enum CascadeType {
- ALL,
- PERSIST,
- MERGE,
- REMOVE,
- REFRESH,
- DELETE,
- SAVE_UPDATE,
- REPLICATE,
- DELETE_ORPHAN,
- LOCK,
- EVICT
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CascadeType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/CascadeType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CascadeType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CascadeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+package org.hibernate.annotations;
+
+/**
+ * Cascade types (can override default EJB3 cascades
+ */
+public enum CascadeType {
+ ALL,
+ PERSIST,
+ MERGE,
+ REMOVE,
+ REFRESH,
+ DELETE,
+ SAVE_UPDATE,
+ REPLICATE,
+ DELETE_ORPHAN,
+ LOCK,
+ EVICT
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Check.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Check.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Check.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Arbitrary SQL check constraints which can be defined at the class,
- * property or collection level
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Check {
- String constraints();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Check.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Check.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Check.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Check.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Arbitrary SQL check constraints which can be defined at the class,
+ * property or collection level
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Check {
+ String constraints();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionId.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionId.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionId.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.FIELD;
-import javax.persistence.Column;
-
-/**
- * Describe an identifier column for a bag (ie an idbag)
- * EXPERIMENTAL: the structure of this annotation might slightly change (generator() mix strategy and generator
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface CollectionId {
- /** Collection id column(s) */
- Column[] columns();
- /** id type, type.type() must be set */
- Type type();
- /** generator name: 'identity' or a defined generator name */
- String generator();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionId.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionId.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionId.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionId.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+import javax.persistence.Column;
+
+/**
+ * Describe an identifier column for a bag (ie an idbag)
+ * EXPERIMENTAL: the structure of this annotation might slightly change (generator() mix strategy and generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface CollectionId {
+ /** Collection id column(s) */
+ Column[] columns();
+ /** id type, type.type() must be set */
+ Type type();
+ /** generator name: 'identity' or a defined generator name */
+ String generator();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionOfElements.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionOfElements.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionOfElements.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-import javax.persistence.FetchType;
-import static javax.persistence.FetchType.LAZY;
-
-/**
- * Annotation used to mark a collection as a collection of elements or
- * a collection of embedded objects
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface CollectionOfElements {
- /**
- * Represent the element class in the collection
- * Only useful if the collection does not use generics
- */
- Class targetElement() default void.class;
-
- FetchType fetch() default LAZY;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionOfElements.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionOfElements.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionOfElements.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/CollectionOfElements.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.persistence.FetchType;
+import static javax.persistence.FetchType.LAZY;
+
+/**
+ * Annotation used to mark a collection as a collection of elements or
+ * a collection of embedded objects
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface CollectionOfElements {
+ /**
+ * Represent the element class in the collection
+ * Only useful if the collection does not use generics
+ */
+ Class targetElement() default void.class;
+
+ FetchType fetch() default LAZY;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Columns.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Columns.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Columns.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-import javax.persistence.Column;
-
-/**
- * Support an array of columns. Useful for component user types mappings
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Columns {
- Column[] columns();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Columns.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Columns.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Columns.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Columns.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import javax.persistence.Column;
+
+/**
+ * Support an array of columns. Useful for component user types mappings
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Columns {
+ Column[] columns();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/DiscriminatorFormula.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/DiscriminatorFormula.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/DiscriminatorFormula.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Discriminator formula
- * To be placed at the root entity.
- *
- * @author Emmanuel Bernard
- * @see Formula
- */
- at Target({TYPE})
- at Retention(RUNTIME)
-public @interface DiscriminatorFormula {
- String value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/DiscriminatorFormula.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/DiscriminatorFormula.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/DiscriminatorFormula.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/DiscriminatorFormula.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Discriminator formula
+ * To be placed at the root entity.
+ *
+ * @author Emmanuel Bernard
+ * @see Formula
+ */
+ at Target({TYPE})
+ at Retention(RUNTIME)
+public @interface DiscriminatorFormula {
+ String value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Entity.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Entity.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Entity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Extends {@link javax.persistence.Entity} with Hibernate features
- *
- * @author Emmanuel Bernard
- */
- at Target(TYPE)
- at Retention(RUNTIME)
-public @interface Entity {
- /** Is this entity mutable (read only) or not */
- boolean mutable() default true;
- /** Needed column only in SQL on insert */
- boolean dynamicInsert() default false;
- /** Needed column only in SQL on update */
- boolean dynamicUpdate() default false;
- /** Do a select to retrieve the entity before any potential update */
- boolean selectBeforeUpdate() default false;
- /** polymorphism strategy for this entity */
- PolymorphismType polymorphism() default PolymorphismType.IMPLICIT;
- /** persister of this entity, default is hibernate internal one */
- String persister() default "";
- /** optimistic locking strategy */
- OptimisticLockType optimisticLock() default OptimisticLockType.VERSION;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Entity.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Entity.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Entity.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Entity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Extends {@link javax.persistence.Entity} with Hibernate features
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target(TYPE)
+ at Retention(RUNTIME)
+public @interface Entity {
+ /** Is this entity mutable (read only) or not */
+ boolean mutable() default true;
+ /** Needed column only in SQL on insert */
+ boolean dynamicInsert() default false;
+ /** Needed column only in SQL on update */
+ boolean dynamicUpdate() default false;
+ /** Do a select to retrieve the entity before any potential update */
+ boolean selectBeforeUpdate() default false;
+ /** polymorphism strategy for this entity */
+ PolymorphismType polymorphism() default PolymorphismType.IMPLICIT;
+ /** persister of this entity, default is hibernate internal one */
+ String persister() default "";
+ /** optimistic locking strategy */
+ OptimisticLockType optimisticLock() default OptimisticLockType.VERSION;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Fetch.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Fetch.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Fetch.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Define the fetching strategy used for the given association
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.METHOD, ElementType.FIELD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface Fetch {
- FetchMode value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Fetch.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Fetch.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Fetch.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Fetch.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Define the fetching strategy used for the given association
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.METHOD, ElementType.FIELD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface Fetch {
+ FetchMode value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FetchMode.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FetchMode.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FetchMode.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-/**
- * Fetch options on associations
- *
- * @author Emmanuel Bernard
- */
-public enum FetchMode {
- /**
- * use a select for each individual entity, collection, or join load
- */
- SELECT,
- /**
- * use an outer join to load the related entities, collections or joins
- */
- JOIN,
- /**
- * use a subselect query to load the additional collections
- */
- SUBSELECT
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FetchMode.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FetchMode.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FetchMode.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FetchMode.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.annotations;
+
+/**
+ * Fetch options on associations
+ *
+ * @author Emmanuel Bernard
+ */
+public enum FetchMode {
+ /**
+ * use a select for each individual entity, collection, or join load
+ */
+ SELECT,
+ /**
+ * use an outer join to load the related entities, collections or joins
+ */
+ JOIN,
+ /**
+ * use a subselect query to load the additional collections
+ */
+ SUBSELECT
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Filter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Add filters to an entity or a target entity of a collection
- *
- * @author Emmanuel Bernard
- * @author Matthew Inger
- * @author Magnus Sandberg
- */
- at Target({TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Filter {
- String name();
-
- String condition() default "";
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filter.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Filter.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filter.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Add filters to an entity or a target entity of a collection
+ *
+ * @author Emmanuel Bernard
+ * @author Matthew Inger
+ * @author Magnus Sandberg
+ */
+ at Target({TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Filter {
+ String name();
+
+ String condition() default "";
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDef.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDef.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDef.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Filter definition
- *
- * @author Matthew Inger
- * @author Emmanuel Bernard
- */
- at Target({TYPE, PACKAGE})
- at Retention(RUNTIME)
-public @interface FilterDef {
- String name();
-
- String defaultCondition() default "";
-
- ParamDef[] parameters() default {};
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDef.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDef.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDef.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDef.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.PACKAGE;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Filter definition
+ *
+ * @author Matthew Inger
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, PACKAGE})
+ at Retention(RUNTIME)
+public @interface FilterDef {
+ String name();
+
+ String defaultCondition() default "";
+
+ ParamDef[] parameters() default {};
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDefs.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDefs.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDefs.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Array of filter definitions
- *
- * @author Matthew Inger
- * @author Emmanuel Bernard
- */
- at Target({PACKAGE, TYPE})
- at Retention(RUNTIME)
-public @interface FilterDefs {
- FilterDef[] value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDefs.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDefs.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDefs.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterDefs.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.PACKAGE;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Array of filter definitions
+ *
+ * @author Matthew Inger
+ * @author Emmanuel Bernard
+ */
+ at Target({PACKAGE, TYPE})
+ at Retention(RUNTIME)
+public @interface FilterDefs {
+ FilterDef[] value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTable.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTable.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Add filters to a join table collection
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface FilterJoinTable {
- String name();
-
- String condition() default "";
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTable.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTable.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTable.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Add filters to a join table collection
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface FilterJoinTable {
+ String name();
+
+ String condition() default "";
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTables.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTables.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTables.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Add multiple @FilterJoinTable to a collection
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface FilterJoinTables {
- FilterJoinTable[] value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTables.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTables.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTables.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FilterJoinTables.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Add multiple @FilterJoinTable to a collection
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface FilterJoinTables {
+ FilterJoinTable[] value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filters.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Filters.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filters.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Add multiple @Filters
- *
- * @author Emmanuel Bernard
- * @author Matthew Inger
- * @author Magnus Sandberg
- */
- at Target({TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Filters {
- Filter[] value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filters.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Filters.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filters.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Filters.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Add multiple @Filters
+ *
+ * @author Emmanuel Bernard
+ * @author Matthew Inger
+ * @author Magnus Sandberg
+ */
+ at Target({TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Filters {
+ Filter[] value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FlushModeType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FlushModeType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FlushModeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-package org.hibernate.annotations;
-
-/**
- * Enumeration extending javax.persistence flush modes.
- *
- * @author Carlos González-Cadenas
- */
-
-public enum FlushModeType {
- /**
- * see {@link org.hibernate.FlushMode.ALWAYS}
- */
- ALWAYS,
- /**
- * see {@link org.hibernate.FlushMode.AUTO}
- */
- AUTO,
- /**
- * see {@link org.hibernate.FlushMode.COMMIT}
- */
- COMMIT,
- /**
- * see {@link org.hibernate.FlushMode.NEVER}
- * @deprecated use MANUAL, will be removed in a subsequent release
- */
- NEVER,
- /**
- * see {@link org.hibernate.FlushMode.MANUAL}
- */
- MANUAL
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FlushModeType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/FlushModeType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FlushModeType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/FlushModeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+package org.hibernate.annotations;
+
+/**
+ * Enumeration extending javax.persistence flush modes.
+ *
+ * @author Carlos González-Cadenas
+ */
+
+public enum FlushModeType {
+ /**
+ * see {@link org.hibernate.FlushMode.ALWAYS}
+ */
+ ALWAYS,
+ /**
+ * see {@link org.hibernate.FlushMode.AUTO}
+ */
+ AUTO,
+ /**
+ * see {@link org.hibernate.FlushMode.COMMIT}
+ */
+ COMMIT,
+ /**
+ * see {@link org.hibernate.FlushMode.NEVER}
+ * @deprecated use MANUAL, will be removed in a subsequent release
+ */
+ NEVER,
+ /**
+ * see {@link org.hibernate.FlushMode.MANUAL}
+ */
+ MANUAL
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForceDiscriminator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/ForceDiscriminator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForceDiscriminator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * ForceDiscriminator flag
- * To be placed at the root entity near @DiscriminatorColumn or @DiscriminatorFormula
- *
- * @author Serg Prasolov
- */
- at Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME)
-public @interface ForceDiscriminator {}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForceDiscriminator.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/ForceDiscriminator.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForceDiscriminator.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForceDiscriminator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * ForceDiscriminator flag
+ * To be placed at the root entity near @DiscriminatorColumn or @DiscriminatorFormula
+ *
+ * @author Serg Prasolov
+ */
+ at Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME)
+public @interface ForceDiscriminator {}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForeignKey.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/ForeignKey.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForeignKey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
- at Target({FIELD, METHOD, TYPE})
- at Retention(RUNTIME)
-
-/**
- * Define the foreign key name
- */
-public @interface ForeignKey {
- /**
- * Name of the foreign key. Used in OneToMany, ManyToOne, and OneToOne
- * relationships. Used for the owning side in ManyToMany relationships
- */
- String name();
-
- /**
- * Used for the non-owning side of a ManyToMany relationship. Ignored
- * in other relationships
- */
- String inverseName() default "";
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForeignKey.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/ForeignKey.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForeignKey.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ForeignKey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+ at Target({FIELD, METHOD, TYPE})
+ at Retention(RUNTIME)
+
+/**
+ * Define the foreign key name
+ */
+public @interface ForeignKey {
+ /**
+ * Name of the foreign key. Used in OneToMany, ManyToOne, and OneToOne
+ * relationships. Used for the owning side in ManyToMany relationships
+ */
+ String name();
+
+ /**
+ * Used for the non-owning side of a ManyToMany relationship. Ignored
+ * in other relationships
+ */
+ String inverseName() default "";
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Formula.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Formula.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Formula.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Formula. To be used as a replacement for @Column in most places
- * The formula has to be a valid SQL fragment
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Formula {
- String value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Formula.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Formula.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Formula.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Formula.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Formula. To be used as a replacement for @Column in most places
+ * The formula has to be a valid SQL fragment
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Formula {
+ String value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Generated.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Generated.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Generated.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * The annotated property is generated by the database
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.FIELD, ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface Generated {
- GenerationTime value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Generated.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Generated.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Generated.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Generated.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * The annotated property is generated by the database
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.FIELD, ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface Generated {
+ GenerationTime value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenerationTime.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/GenerationTime.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenerationTime.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-/**
- * When should the generation occurs
- *
- * @author Emmanuel Bernard
- */
-public enum GenerationTime {
- NEVER,
- INSERT,
- ALWAYS
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenerationTime.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/GenerationTime.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenerationTime.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenerationTime.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id: $
+package org.hibernate.annotations;
+
+/**
+ * When should the generation occurs
+ *
+ * @author Emmanuel Bernard
+ */
+public enum GenerationTime {
+ NEVER,
+ INSERT,
+ ALWAYS
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenericGenerator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/GenericGenerator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenericGenerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Generator annotation describing any kind of Hibernate
- * generator in a detyped manner
- *
- * @author Emmanuel Bernard
- */
- at Target({PACKAGE, TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface GenericGenerator {
- /**
- * unique generator name
- */
- String name();
- /**
- * Generator strategy either a predefined Hibernate
- * strategy or a fully qualified class name.
- */
- String strategy();
- /**
- * Optional generator parameters
- */
- Parameter[] parameters() default {};
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenericGenerator.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/GenericGenerator.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenericGenerator.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/GenericGenerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Generator annotation describing any kind of Hibernate
+ * generator in a detyped manner
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({PACKAGE, TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface GenericGenerator {
+ /**
+ * unique generator name
+ */
+ String name();
+ /**
+ * Generator strategy either a predefined Hibernate
+ * strategy or a fully qualified class name.
+ */
+ String strategy();
+ /**
+ * Optional generator parameters
+ */
+ Parameter[] parameters() default {};
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Immutable.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Immutable.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Immutable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.*;
-
-/**
- * Mark an Entity or a Collection as immutable
- * No annotation means the element is mutable
- *
- * @author Emmanuel Bernard
- */
- at java.lang.annotation.Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
- at Retention( RetentionPolicy.RUNTIME )
-public @interface Immutable {
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Immutable.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Immutable.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Immutable.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Immutable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.*;
+
+/**
+ * Mark an Entity or a Collection as immutable
+ * No annotation means the element is mutable
+ *
+ * @author Emmanuel Bernard
+ */
+ at java.lang.annotation.Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
+ at Retention( RetentionPolicy.RUNTIME )
+public @interface Immutable {
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Index.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Index.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Index.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Define a DB index
- *
- * @author Emmanuel Bernard
- */
- at Target({FIELD, METHOD})
- at Retention(RUNTIME)
-public @interface Index {
- String name();
-
- String[] columnNames() default {};
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Index.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Index.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Index.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Index.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Define a DB index
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({FIELD, METHOD})
+ at Retention(RUNTIME)
+public @interface Index {
+ String name();
+
+ String[] columnNames() default {};
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/IndexColumn.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/IndexColumn.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/IndexColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Describe an index column of a List
- *
- * @author Matthew Inger
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface IndexColumn {
- /** column name */
- String name();
- /** index in DB start from base */
- int base() default 0;
- /** is the index nullable */
- boolean nullable() default true;
- /** column definition, default to an appropriate integer */
- String columnDefinition() default "";
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/IndexColumn.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/IndexColumn.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/IndexColumn.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/IndexColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Describe an index column of a List
+ *
+ * @author Matthew Inger
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface IndexColumn {
+ /** column name */
+ String name();
+ /** index in DB start from base */
+ int base() default 0;
+ /** is the index nullable */
+ boolean nullable() default true;
+ /** column definition, default to an appropriate integer */
+ String columnDefinition() default "";
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollection.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollection.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollection.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Define the lazy status of a collection
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.METHOD, ElementType.FIELD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface LazyCollection {
- LazyCollectionOption value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollection.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollection.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollection.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollection.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Define the lazy status of a collection
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.METHOD, ElementType.FIELD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface LazyCollection {
+ LazyCollectionOption value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollectionOption.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollectionOption.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollectionOption.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-/**
- * Lazy options available for a collection
- *
- * @author Emmanuel Bernard
- */
-public enum LazyCollectionOption {
- /** eagerly load it */
- FALSE,
- /** load it when the state is requested */
- TRUE,
- /** prefer extra queries over fill collection loading */
- EXTRA
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollectionOption.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollectionOption.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollectionOption.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyCollectionOption.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.annotations;
+
+/**
+ * Lazy options available for a collection
+ *
+ * @author Emmanuel Bernard
+ */
+public enum LazyCollectionOption {
+ /** eagerly load it */
+ FALSE,
+ /** load it when the state is requested */
+ TRUE,
+ /** prefer extra queries over fill collection loading */
+ EXTRA
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOne.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOne.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOne.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Define the lazy status of a ToOne association
- * (ie OneToOne or ManyToOne)
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.METHOD, ElementType.FIELD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface LazyToOne {
- LazyToOneOption value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOne.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOne.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOne.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOne.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Define the lazy status of a ToOne association
+ * (ie OneToOne or ManyToOne)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.METHOD, ElementType.FIELD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface LazyToOne {
+ LazyToOneOption value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOneOption.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOneOption.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOneOption.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-/**
- * Lazy options available for a ToOne association
- *
- * @author Emmanuel Bernard
- */
-public enum LazyToOneOption {
- /** eagerly load the association */
- FALSE,
- /**
- * Lazy, give back a proxy which will be loaded when the state is requested
- * This should be the prefered option
- */
- PROXY,
- /** Lazy, give back the real object loaded when a reference is requested
- * (Bytecode enhancement is mandatory for this option, fall back to PROXY
- * if the class is not enhanced)
- * This option should be avoided unless you can't afford the use of proxies
- */
- NO_PROXY
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOneOption.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOneOption.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOneOption.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/LazyToOneOption.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id: $
+package org.hibernate.annotations;
+
+/**
+ * Lazy options available for a ToOne association
+ *
+ * @author Emmanuel Bernard
+ */
+public enum LazyToOneOption {
+ /** eagerly load the association */
+ FALSE,
+ /**
+ * Lazy, give back a proxy which will be loaded when the state is requested
+ * This should be the prefered option
+ */
+ PROXY,
+ /** Lazy, give back the real object loaded when a reference is requested
+ * (Bytecode enhancement is mandatory for this option, fall back to PROXY
+ * if the class is not enhanced)
+ * This option should be avoided unless you can't afford the use of proxies
+ */
+ NO_PROXY
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Loader.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Loader.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Loader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Loader Annotation for overwriting Hibernate default FIND method
- *
- * @author László Benke
- */
- at Target( {TYPE, FIELD, METHOD} )
- at Retention( RUNTIME )
-public @interface Loader {
- /**
- * namedQuery to use for loading
- */
- String namedQuery() default "";
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Loader.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Loader.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Loader.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Loader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Loader Annotation for overwriting Hibernate default FIND method
+ *
+ * @author László Benke
+ */
+ at Target( {TYPE, FIELD, METHOD} )
+ at Retention( RUNTIME )
+public @interface Loader {
+ /**
+ * namedQuery to use for loading
+ */
+ String namedQuery() default "";
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKey.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKey.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.FIELD;
-import javax.persistence.Column;
-
-/**
- * Define the map key columns as an explicit column holding the map key
- * This is completly different from {@link javax.persistence.MapKey} which use an existing column
- * This annotation and {@link javax.persistence.MapKey} are mutually exclusive
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface MapKey {
- Column[] columns() default {};
- /**
- * Represent the key class in a Map
- * Only useful if the collection does not use generics
- */
- Class targetElement() default void.class;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKey.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKey.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKey.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+import javax.persistence.Column;
+
+/**
+ * Define the map key columns as an explicit column holding the map key
+ * This is completly different from {@link javax.persistence.MapKey} which use an existing column
+ * This annotation and {@link javax.persistence.MapKey} are mutually exclusive
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface MapKey {
+ Column[] columns() default {};
+ /**
+ * Represent the key class in a Map
+ * Only useful if the collection does not use generics
+ */
+ Class targetElement() default void.class;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKeyManyToMany.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKeyManyToMany.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKeyManyToMany.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import javax.persistence.JoinColumn;
-
-/**
- * Define the map key columns as an explicit column holding the map key
- * This is completly different from {@link javax.persistence.MapKey} which use an existing column
- * This annotation and {@link javax.persistence.MapKey} are mutually exclusive
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.METHOD, ElementType.FIELD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface MapKeyManyToMany {
- JoinColumn[] joinColumns() default {};
- /**
- * Represent the key class in a Map
- * Only useful if the collection does not use generics
- */
- Class targetEntity() default void.class;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKeyManyToMany.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKeyManyToMany.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKeyManyToMany.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/MapKeyManyToMany.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.persistence.JoinColumn;
+
+/**
+ * Define the map key columns as an explicit column holding the map key
+ * This is completly different from {@link javax.persistence.MapKey} which use an existing column
+ * This annotation and {@link javax.persistence.MapKey} are mutually exclusive
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.METHOD, ElementType.FIELD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface MapKeyManyToMany {
+ JoinColumn[] joinColumns() default {};
+ /**
+ * Represent the key class in a Map
+ * Only useful if the collection does not use generics
+ */
+ Class targetEntity() default void.class;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQueries.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQueries.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQueries.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Extends {@link javax.persistence.NamedNativeQueries} to hold hibernate NamedNativeQuery
- * objects
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, PACKAGE})
- at Retention(RUNTIME)
-public @interface NamedNativeQueries {
- NamedNativeQuery[] value();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQueries.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQueries.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQueries.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQueries.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.PACKAGE;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Extends {@link javax.persistence.NamedNativeQueries} to hold hibernate NamedNativeQuery
+ * objects
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, PACKAGE})
+ at Retention(RUNTIME)
+public @interface NamedNativeQueries {
+ NamedNativeQuery[] value();
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQuery.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQuery.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQuery.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Extends {@link javax.persistence.NamedNativeQuery} with Hibernate features
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, PACKAGE})
- at Retention(RUNTIME)
-public @interface NamedNativeQuery {
- String name();
-
- String query();
-
- Class resultClass() default void.class;
-
- String resultSetMapping() default ""; // name of SQLResultSetMapping
- /** the flush mode for the query */
- FlushModeType flushMode() default FlushModeType.AUTO;
- /** mark the query as cacheable or not */
- boolean cacheable() default false;
- /** the cache region to use */
- String cacheRegion() default "";
- /** the number of rows fetched by the JDBC Driver per roundtrip */
- int fetchSize() default -1;
- /**the query timeout in seconds*/
- int timeout() default -1;
-
- boolean callable() default false;
- /**comment added to the SQL query, useful for the DBA */
- String comment() default "";
- /**the cache mode used for this query*/
- CacheModeType cacheMode() default CacheModeType.NORMAL;
- /**marks whether the results are fetched in read-only mode or not*/
- boolean readOnly() default false;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQuery.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQuery.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQuery.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedNativeQuery.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.PACKAGE;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Extends {@link javax.persistence.NamedNativeQuery} with Hibernate features
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, PACKAGE})
+ at Retention(RUNTIME)
+public @interface NamedNativeQuery {
+ String name();
+
+ String query();
+
+ Class resultClass() default void.class;
+
+ String resultSetMapping() default ""; // name of SQLResultSetMapping
+ /** the flush mode for the query */
+ FlushModeType flushMode() default FlushModeType.AUTO;
+ /** mark the query as cacheable or not */
+ boolean cacheable() default false;
+ /** the cache region to use */
+ String cacheRegion() default "";
+ /** the number of rows fetched by the JDBC Driver per roundtrip */
+ int fetchSize() default -1;
+ /**the query timeout in seconds*/
+ int timeout() default -1;
+
+ boolean callable() default false;
+ /**comment added to the SQL query, useful for the DBA */
+ String comment() default "";
+ /**the cache mode used for this query*/
+ CacheModeType cacheMode() default CacheModeType.NORMAL;
+ /**marks whether the results are fetched in read-only mode or not*/
+ boolean readOnly() default false;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQueries.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQueries.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQueries.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Extends {@link javax.persistence.NamedQueries} to hold hibernate NamedQuery
- * objects
- *
- * @author Emmanuel Bernard
- * @author Carlos González-Cadenas
- */
- at Target({TYPE, PACKAGE})
- at Retention(RUNTIME)
-public @interface NamedQueries {
- NamedQuery[] value();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQueries.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQueries.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQueries.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQueries.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.PACKAGE;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Extends {@link javax.persistence.NamedQueries} to hold hibernate NamedQuery
+ * objects
+ *
+ * @author Emmanuel Bernard
+ * @author Carlos González-Cadenas
+ */
+ at Target({TYPE, PACKAGE})
+ at Retention(RUNTIME)
+public @interface NamedQueries {
+ NamedQuery[] value();
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQuery.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQuery.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQuery.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Extends {@link javax.persistence.NamedQuery} with Hibernate features
- *
- * @author Carlos González-Cadenas
- */
- at Target({TYPE, PACKAGE})
- at Retention(RUNTIME)
-public @interface NamedQuery {
-
- /** the name of the NamedQuery */
- String name();
- /** the Query String for the NamedQuery */
- String query();
- /** the flush mode for the query */
- FlushModeType flushMode() default FlushModeType.AUTO;
- /** mark the query as cacheable or not */
- boolean cacheable() default false;
- /** the cache region to use */
- String cacheRegion() default "";
- /** the number of rows fetched by the JDBC Driver per roundtrip */
- int fetchSize() default -1;
- /**the query timeout in seconds*/
- int timeout() default -1;
- /**comment added to the SQL query, useful for the DBA */
- String comment() default "";
- /**the cache mode used for this query*/
- CacheModeType cacheMode() default CacheModeType.NORMAL;
- /**marks whether the results are fetched in read-only mode or not*/
- boolean readOnly() default false;
-
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQuery.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQuery.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQuery.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NamedQuery.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.PACKAGE;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Extends {@link javax.persistence.NamedQuery} with Hibernate features
+ *
+ * @author Carlos González-Cadenas
+ */
+ at Target({TYPE, PACKAGE})
+ at Retention(RUNTIME)
+public @interface NamedQuery {
+
+ /** the name of the NamedQuery */
+ String name();
+ /** the Query String for the NamedQuery */
+ String query();
+ /** the flush mode for the query */
+ FlushModeType flushMode() default FlushModeType.AUTO;
+ /** mark the query as cacheable or not */
+ boolean cacheable() default false;
+ /** the cache region to use */
+ String cacheRegion() default "";
+ /** the number of rows fetched by the JDBC Driver per roundtrip */
+ int fetchSize() default -1;
+ /**the query timeout in seconds*/
+ int timeout() default -1;
+ /**comment added to the SQL query, useful for the DBA */
+ String comment() default "";
+ /**the cache mode used for this query*/
+ CacheModeType cacheMode() default CacheModeType.NORMAL;
+ /**marks whether the results are fetched in read-only mode or not*/
+ boolean readOnly() default false;
+
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFound.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFound.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFound.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Action to do when an element is not found on a association whiel beeing expected
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface NotFound {
- NotFoundAction action() default NotFoundAction.EXCEPTION;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFound.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFound.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFound.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFound.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Action to do when an element is not found on a association whiel beeing expected
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface NotFound {
+ NotFoundAction action() default NotFoundAction.EXCEPTION;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFoundAction.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFoundAction.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFoundAction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-package org.hibernate.annotations;
-
-/**
- * Actoin to use when an element is not found in DB while beeing expected
- *
- * @author Emmanuel Bernard
- */
-public enum NotFoundAction {
- /**
- * raise an exception when an element is not found (default and recommended)
- */
- EXCEPTION,
- /**
- * ignore the element when not found in DB
- */
- IGNORE
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFoundAction.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFoundAction.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFoundAction.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/NotFoundAction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+package org.hibernate.annotations;
+
+/**
+ * Actoin to use when an element is not found in DB while beeing expected
+ *
+ * @author Emmanuel Bernard
+ */
+public enum NotFoundAction {
+ /**
+ * raise an exception when an element is not found (default and recommended)
+ */
+ EXCEPTION,
+ /**
+ * ignore the element when not found in DB
+ */
+ IGNORE
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDelete.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDelete.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDelete.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-
-/**
- * Strategy to use on collections, arrays and on joined subclasses delete
- * OnDelete of secondary tables currently not supported.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD, TYPE})
- at Retention(RUNTIME)
-public @interface OnDelete {
- OnDeleteAction action();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDelete.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDelete.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDelete.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDelete.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+
+/**
+ * Strategy to use on collections, arrays and on joined subclasses delete
+ * OnDelete of secondary tables currently not supported.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD, TYPE})
+ at Retention(RUNTIME)
+public @interface OnDelete {
+ OnDeleteAction action();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDeleteAction.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDeleteAction.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDeleteAction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-package org.hibernate.annotations;
-
-/**
- * Possible actions on deletes
- *
- * @author Emmanuel Bernard
- */
-public enum OnDeleteAction {
- /**
- * the default
- */
- NO_ACTION,
- /**
- * use cascade delete capabilities of the DD
- */
- CASCADE
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDeleteAction.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDeleteAction.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDeleteAction.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OnDeleteAction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+package org.hibernate.annotations;
+
+/**
+ * Possible actions on deletes
+ *
+ * @author Emmanuel Bernard
+ */
+public enum OnDeleteAction {
+ /**
+ * the default
+ */
+ NO_ACTION,
+ /**
+ * use cascade delete capabilities of the DD
+ */
+ CASCADE
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLock.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLock.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Whether or not update entity's version on property's change
- * If the annotation is not present, the property is involved in the optimistic lock srategy (default)
- *
- * @author Logi Ragnarsson
- */
- at Target( {ElementType.METHOD, ElementType.FIELD} )
- at Retention( RetentionPolicy.RUNTIME )
-public @interface OptimisticLock {
-
- /**
- * If true, the annotated property change will not trigger a version upgrade
- */
- boolean excluded();
-
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLock.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLock.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLock.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Whether or not update entity's version on property's change
+ * If the annotation is not present, the property is involved in the optimistic lock srategy (default)
+ *
+ * @author Logi Ragnarsson
+ */
+ at Target( {ElementType.METHOD, ElementType.FIELD} )
+ at Retention( RetentionPolicy.RUNTIME )
+public @interface OptimisticLock {
+
+ /**
+ * If true, the annotated property change will not trigger a version upgrade
+ */
+ boolean excluded();
+
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLockType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLockType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLockType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-/**
- * Optimistic locking strategy
- * VERSION is the default and recommanded one
- *
- * @author Emmanuel Bernard
- */
-public enum OptimisticLockType {
- /**
- * no optimistic locking
- */
- NONE,
- /**
- * use a column version
- */
- VERSION,
- /**
- * dirty columns are compared
- */
- DIRTY,
- /**
- * all columns are compared
- */
- ALL
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLockType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLockType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLockType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OptimisticLockType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id$
+package org.hibernate.annotations;
+
+/**
+ * Optimistic locking strategy
+ * VERSION is the default and recommanded one
+ *
+ * @author Emmanuel Bernard
+ */
+public enum OptimisticLockType {
+ /**
+ * no optimistic locking
+ */
+ NONE,
+ /**
+ * use a column version
+ */
+ VERSION,
+ /**
+ * dirty columns are compared
+ */
+ DIRTY,
+ /**
+ * all columns are compared
+ */
+ ALL
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OrderBy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/OrderBy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OrderBy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Order a collection using SQL ordering (not HQL ordering)
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface OrderBy {
- /** SQL orderby clause */
- String clause();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OrderBy.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/OrderBy.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OrderBy.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/OrderBy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Order a collection using SQL ordering (not HQL ordering)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface OrderBy {
+ /** SQL orderby clause */
+ String clause();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ParamDef.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/ParamDef.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ParamDef.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * A parameter definition
- *
- * @author Emmanuel Bernard
- */
- at Target({})
- at Retention(RUNTIME)
-public @interface ParamDef {
- String name();
-
- String type();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ParamDef.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/ParamDef.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ParamDef.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ParamDef.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.annotations;
+
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * A parameter definition
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({})
+ at Retention(RUNTIME)
+public @interface ParamDef {
+ String name();
+
+ String type();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parameter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Parameter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parameter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Parameter (basically key/value pattern)
- *
- * @author Emmanuel Bernard
- */
- at Target({})
- at Retention(RUNTIME)
-public @interface Parameter {
- String name();
-
- String value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parameter.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Parameter.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parameter.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parameter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.annotations;
+
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Parameter (basically key/value pattern)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({})
+ at Retention(RUNTIME)
+public @interface Parameter {
+ String name();
+
+ String value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parent.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Parent.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Reference the property as a pointer back to the owner (generally the owning entity)
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Parent {
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parent.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Parent.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parent.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Reference the property as a pointer back to the owner (generally the owning entity)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Parent {
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Persister.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Persister.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Persister.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.*;
-
-/**
- * Specify a custom persister.
- *
- * @author Shawn Clowater
- */
- at java.lang.annotation.Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
- at Retention( RetentionPolicy.RUNTIME )
-public @interface Persister {
- /** Custom persister */
- Class impl();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Persister.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Persister.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Persister.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Persister.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.*;
+
+/**
+ * Specify a custom persister.
+ *
+ * @author Shawn Clowater
+ */
+ at java.lang.annotation.Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
+ at Retention( RetentionPolicy.RUNTIME )
+public @interface Persister {
+ /** Custom persister */
+ Class impl();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/PolymorphismType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/PolymorphismType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/PolymorphismType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-/**
- * Type of avaliable polymorphism for a particular entity
- *
- * @author Emmanuel Bernard
- */
-public enum PolymorphismType {
- /**
- * default, this entity is retrieved if any of its super entity is asked
- */
- IMPLICIT,
- /**
- * this entity is retrived only if explicitly asked
- */
- EXPLICIT
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/PolymorphismType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/PolymorphismType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/PolymorphismType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/PolymorphismType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id$
+package org.hibernate.annotations;
+
+/**
+ * Type of avaliable polymorphism for a particular entity
+ *
+ * @author Emmanuel Bernard
+ */
+public enum PolymorphismType {
+ /**
+ * default, this entity is retrieved if any of its super entity is asked
+ */
+ IMPLICIT,
+ /**
+ * this entity is retrived only if explicitly asked
+ */
+ EXPLICIT
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Proxy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Proxy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Proxy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Lazy and proxy configuration of a particular class
- *
- * @author Emmanuel Bernard
- */
- at Target(TYPE)
- at Retention(RUNTIME)
-public @interface Proxy {
- /**
- * Whether this class is lazy or not (default to true)
- */
- boolean lazy() default true;
-
- /**
- * Proxy class or interface used. Default entity class name.
- */
- Class proxyClass() default void.class;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Proxy.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Proxy.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Proxy.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Proxy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Lazy and proxy configuration of a particular class
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target(TYPE)
+ at Retention(RUNTIME)
+public @interface Proxy {
+ /**
+ * Whether this class is lazy or not (default to true)
+ */
+ boolean lazy() default true;
+
+ /**
+ * Proxy class or interface used. Default entity class name.
+ */
+ Class proxyClass() default void.class;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ResultCheckStyle.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/ResultCheckStyle.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ResultCheckStyle.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id:
-package org.hibernate.annotations;
-
-/**
- * Possible checks on Sql Insert, Delete, Update
- *
- * @author László Benke
- */
-public enum ResultCheckStyle {
- /**
- * Do not perform checking. Either user simply does not want checking, or is
- * indicating a {@link java.sql.CallableStatement} execution in which the
- * checks are being performed explicitly and failures are handled through
- * propogation of {@link java.sql.SQLException}s.
- */
- NONE,
- /**
- * Perform row-count checking. Row counts are the int values returned by both
- * {@link java.sql.PreparedStatement#executeUpdate()} and
- * {@link java.sql.Statement#executeBatch()}. These values are checked
- * against some expected count.
- */
- COUNT,
- /**
- * Essentially the same as {@link #COUNT} except that the row count actually
- * comes from an output parameter registered as part of a
- * {@link java.sql.CallableStatement}. This style explicitly prohibits
- * statement batching from being used...
- */
- PARAM
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ResultCheckStyle.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/ResultCheckStyle.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ResultCheckStyle.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/ResultCheckStyle.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id:
+package org.hibernate.annotations;
+
+/**
+ * Possible checks on Sql Insert, Delete, Update
+ *
+ * @author László Benke
+ */
+public enum ResultCheckStyle {
+ /**
+ * Do not perform checking. Either user simply does not want checking, or is
+ * indicating a {@link java.sql.CallableStatement} execution in which the
+ * checks are being performed explicitly and failures are handled through
+ * propogation of {@link java.sql.SQLException}s.
+ */
+ NONE,
+ /**
+ * Perform row-count checking. Row counts are the int values returned by both
+ * {@link java.sql.PreparedStatement#executeUpdate()} and
+ * {@link java.sql.Statement#executeBatch()}. These values are checked
+ * against some expected count.
+ */
+ COUNT,
+ /**
+ * Essentially the same as {@link #COUNT} except that the row count actually
+ * comes from an output parameter registered as part of a
+ * {@link java.sql.CallableStatement}. This style explicitly prohibits
+ * statement batching from being used...
+ */
+ PARAM
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDelete.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDelete.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDelete.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id:$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * SqlDelete Annotation for overwriting Hibernate default DELETE method
- *
- * @author László Benke
- */
- at Target( {TYPE, FIELD, METHOD} )
- at Retention( RUNTIME )
-public @interface SQLDelete {
- /**
- * Procedure name or DELETE STATEMENT
- */
- String sql();
-
- /**
- * Is the statement using stored procedure or not
- */
- boolean callable() default false;
-
- /**
- * For persistence operation what style of determining results (success/failure) is to be used.
- */
- ResultCheckStyle check() default ResultCheckStyle.NONE;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDelete.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDelete.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDelete.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDelete.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id:$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * SqlDelete Annotation for overwriting Hibernate default DELETE method
+ *
+ * @author László Benke
+ */
+ at Target( {TYPE, FIELD, METHOD} )
+ at Retention( RUNTIME )
+public @interface SQLDelete {
+ /**
+ * Procedure name or DELETE STATEMENT
+ */
+ String sql();
+
+ /**
+ * Is the statement using stored procedure or not
+ */
+ boolean callable() default false;
+
+ /**
+ * For persistence operation what style of determining results (success/failure) is to be used.
+ */
+ ResultCheckStyle check() default ResultCheckStyle.NONE;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDeleteAll.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDeleteAll.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDeleteAll.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-
-/**
- * SqlDelete Annotation for overwriting Hibernate default DELETE ALL method
- *
- * @author László Benke
- */
- at Target( {TYPE, FIELD, METHOD} )
- at Retention( RetentionPolicy.RUNTIME )
-public @interface SQLDeleteAll {
- /**
- * Procedure name or DELETE STATEMENT
- */
- String sql();
-
- /**
- * Is the statement using stored procedure or not
- */
- boolean callable() default false;
-
- /**
- * For persistence operation what style of determining results (success/failure) is to be used.
- */
- ResultCheckStyle check() default ResultCheckStyle.NONE;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDeleteAll.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDeleteAll.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDeleteAll.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLDeleteAll.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+
+/**
+ * SqlDelete Annotation for overwriting Hibernate default DELETE ALL method
+ *
+ * @author László Benke
+ */
+ at Target( {TYPE, FIELD, METHOD} )
+ at Retention( RetentionPolicy.RUNTIME )
+public @interface SQLDeleteAll {
+ /**
+ * Procedure name or DELETE STATEMENT
+ */
+ String sql();
+
+ /**
+ * Is the statement using stored procedure or not
+ */
+ boolean callable() default false;
+
+ /**
+ * For persistence operation what style of determining results (success/failure) is to be used.
+ */
+ ResultCheckStyle check() default ResultCheckStyle.NONE;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLInsert.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLInsert.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLInsert.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id:$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * SqlInsert Annotation for overwriting Hibernate default INSERT INTO method
- *
- * @author László Benke
- */
- at Target( {TYPE, FIELD, METHOD} )
- at Retention( RUNTIME )
-public @interface SQLInsert {
- /**
- * Procedure name or INSERT STATEMENT
- */
- String sql();
-
- /**
- * Is the statement using stored procedure or not
- */
- boolean callable() default false;
-
- /**
- * For persistence operation what style of determining results (success/failure) is to be used.
- */
- ResultCheckStyle check() default ResultCheckStyle.NONE;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLInsert.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLInsert.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLInsert.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLInsert.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id:$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * SqlInsert Annotation for overwriting Hibernate default INSERT INTO method
+ *
+ * @author László Benke
+ */
+ at Target( {TYPE, FIELD, METHOD} )
+ at Retention( RUNTIME )
+public @interface SQLInsert {
+ /**
+ * Procedure name or INSERT STATEMENT
+ */
+ String sql();
+
+ /**
+ * Is the statement using stored procedure or not
+ */
+ boolean callable() default false;
+
+ /**
+ * For persistence operation what style of determining results (success/failure) is to be used.
+ */
+ ResultCheckStyle check() default ResultCheckStyle.NONE;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLUpdate.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLUpdate.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLUpdate.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id:$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * SqlUpdate Annotation for overwriting Hibernate default UPDATE method
- *
- * @author László Benke
- */
- at Target( {TYPE, FIELD, METHOD} )
- at Retention( RUNTIME )
-public @interface SQLUpdate {
-
- /**
- * Procedure name or UPDATE STATEMENT
- */
- String sql();
-
- /**
- * Is the statement using stored procedure or not
- */
- boolean callable() default false;
-
- /**
- * For persistence operation what style of determining results (success/failure) is to be used.
- */
- ResultCheckStyle check() default ResultCheckStyle.NONE;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLUpdate.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLUpdate.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLUpdate.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SQLUpdate.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id:$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * SqlUpdate Annotation for overwriting Hibernate default UPDATE method
+ *
+ * @author László Benke
+ */
+ at Target( {TYPE, FIELD, METHOD} )
+ at Retention( RUNTIME )
+public @interface SQLUpdate {
+
+ /**
+ * Procedure name or UPDATE STATEMENT
+ */
+ String sql();
+
+ /**
+ * Is the statement using stored procedure or not
+ */
+ boolean callable() default false;
+
+ /**
+ * For persistence operation what style of determining results (success/failure) is to be used.
+ */
+ ResultCheckStyle check() default ResultCheckStyle.NONE;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Sort.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Sort.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Sort.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Collection sort
- * (Java level sorting)
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Sort {
- /**
- * sort type
- */
- SortType type() default SortType.UNSORTED;
- /**
- * Sort comparator implementation
- */
- //TODO find a way to use Class<Comparator>
-
- Class comparator() default void.class;
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Sort.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Sort.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Sort.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Sort.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Collection sort
+ * (Java level sorting)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Sort {
+ /**
+ * sort type
+ */
+ SortType type() default SortType.UNSORTED;
+ /**
+ * Sort comparator implementation
+ */
+ //TODO find a way to use Class<Comparator>
+
+ Class comparator() default void.class;
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SortType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/SortType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SortType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-/**
- * Sort strategies
- *
- * @author Emmanuel Bernard
- */
-public enum SortType {
- UNSORTED,
- NATURAL,
- COMPARATOR
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SortType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/SortType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SortType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/SortType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id$
+package org.hibernate.annotations;
+
+/**
+ * Sort strategies
+ *
+ * @author Emmanuel Bernard
+ */
+public enum SortType {
+ UNSORTED,
+ NATURAL,
+ COMPARATOR
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Table.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Table.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Table.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Complementary information to a table either primary or secondary
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE})
- at Retention(RUNTIME)
-public @interface Table {
- /**
- * name of the targeted table
- */
- String appliesTo();
-
- /**
- * Indexes
- */
- Index[] indexes() default {};
-
- /**
- * define a table comment
- */
- String comment() default "";
-
- /**
- * Defines the Foreign Key name of a secondary table
- * pointing back to the primary table
- */
- ForeignKey foreignKey() default @ForeignKey( name="" );
-
- /**
- * If set to JOIN, the default, Hibernate will use an inner join to retrieve a
- * secondary table defined by a class or its superclasses and an outer join for a
- * secondary table defined by a subclass.
- * If set to select then Hibernate will use a
- * sequential select for a secondary table defined on a subclass, which will be issued only if a row
- * turns out to represent an instance of the subclass. Inner joins will still be used to retrieve a
- * secondary defined by the class and its superclasses.
- *
- * <b>Only applies to secondary tables</b>
- */
- FetchMode fetch() default FetchMode.JOIN;
-
- /**
- * If true, Hibernate will not try to insert or update the properties defined by this join.
- *
- * <b>Only applies to secondary tables</b>
- */
- boolean inverse() default false;
-
- /**
- * If enabled, Hibernate will insert a row only if the properties defined by this join are non-null
- * and will always use an outer join to retrieve the properties.
- *
- * <b>Only applies to secondary tables</b>
- */
- boolean optional() default true;
-
- /**
- * Defines a custom SQL insert statement
- *
- * <b>Only applies to secondary tables</b>
- */
- SQLInsert sqlInsert() default @SQLInsert(sql="");
-
- /**
- * Defines a custom SQL update statement
- *
- * <b>Only applies to secondary tables</b>
- */
- SQLUpdate sqlUpdate() default @SQLUpdate(sql="");
-
- /**
- * Defines a custom SQL delete statement
- *
- * <b>Only applies to secondary tables</b>
- */
- SQLDelete sqlDelete() default @SQLDelete(sql="");
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Table.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Table.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Table.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Table.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Complementary information to a table either primary or secondary
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE})
+ at Retention(RUNTIME)
+public @interface Table {
+ /**
+ * name of the targeted table
+ */
+ String appliesTo();
+
+ /**
+ * Indexes
+ */
+ Index[] indexes() default {};
+
+ /**
+ * define a table comment
+ */
+ String comment() default "";
+
+ /**
+ * Defines the Foreign Key name of a secondary table
+ * pointing back to the primary table
+ */
+ ForeignKey foreignKey() default @ForeignKey( name="" );
+
+ /**
+ * If set to JOIN, the default, Hibernate will use an inner join to retrieve a
+ * secondary table defined by a class or its superclasses and an outer join for a
+ * secondary table defined by a subclass.
+ * If set to select then Hibernate will use a
+ * sequential select for a secondary table defined on a subclass, which will be issued only if a row
+ * turns out to represent an instance of the subclass. Inner joins will still be used to retrieve a
+ * secondary defined by the class and its superclasses.
+ *
+ * <b>Only applies to secondary tables</b>
+ */
+ FetchMode fetch() default FetchMode.JOIN;
+
+ /**
+ * If true, Hibernate will not try to insert or update the properties defined by this join.
+ *
+ * <b>Only applies to secondary tables</b>
+ */
+ boolean inverse() default false;
+
+ /**
+ * If enabled, Hibernate will insert a row only if the properties defined by this join are non-null
+ * and will always use an outer join to retrieve the properties.
+ *
+ * <b>Only applies to secondary tables</b>
+ */
+ boolean optional() default true;
+
+ /**
+ * Defines a custom SQL insert statement
+ *
+ * <b>Only applies to secondary tables</b>
+ */
+ SQLInsert sqlInsert() default @SQLInsert(sql="");
+
+ /**
+ * Defines a custom SQL update statement
+ *
+ * <b>Only applies to secondary tables</b>
+ */
+ SQLUpdate sqlUpdate() default @SQLUpdate(sql="");
+
+ /**
+ * Defines a custom SQL delete statement
+ *
+ * <b>Only applies to secondary tables</b>
+ */
+ SQLDelete sqlDelete() default @SQLDelete(sql="");
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tables.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Tables.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tables.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Plural of Table
- *
- * @author Emmanuel Bernard
- * @see Table
- */
- at Target({TYPE})
- at Retention(RUNTIME)
-public @interface Tables {
- Table[] value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tables.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Tables.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tables.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tables.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Plural of Table
+ *
+ * @author Emmanuel Bernard
+ * @see Table
+ */
+ at Target({TYPE})
+ at Retention(RUNTIME)
+public @interface Tables {
+ Table[] value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Target.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Target.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Target.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Define an explicit target,a voiding reflection and generics resolving
- *
- * @author Emmanuel Bernard
- */
- at java.lang.annotation.Target({ElementType.FIELD, ElementType.METHOD})
- at Retention( RetentionPolicy.RUNTIME )
-public @interface Target {
- Class value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Target.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Target.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Target.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Target.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Define an explicit target,a voiding reflection and generics resolving
+ *
+ * @author Emmanuel Bernard
+ */
+ at java.lang.annotation.Target({ElementType.FIELD, ElementType.METHOD})
+ at Retention( RetentionPolicy.RUNTIME )
+public @interface Target {
+ Class value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.*;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-
-/**
- * Define a tuplizer for an entity or a component
- * @author Emmanuel Bernard
- */
- at java.lang.annotation.Target( {TYPE, FIELD, METHOD} )
- at Retention( RUNTIME )
-public @interface Tuplizer {
- /** tuplizer implementation */
- Class impl();
- /** either pojo, dynamic-map or dom4j÷ */
- String entityMode() default "pojo";
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.*;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+
+/**
+ * Define a tuplizer for an entity or a component
+ * @author Emmanuel Bernard
+ */
+ at java.lang.annotation.Target( {TYPE, FIELD, METHOD} )
+ at Retention( RUNTIME )
+public @interface Tuplizer {
+ /** tuplizer implementation */
+ Class impl();
+ /** either pojo, dynamic-map or dom4j÷ */
+ String entityMode() default "pojo";
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizers.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizers.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizers.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Define a set of tuplizer for an entity or a component
- * @author Emmanuel Bernard
- */
- at java.lang.annotation.Target( {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD} )
- at Retention( RetentionPolicy.RUNTIME )
-public @interface Tuplizers {
- Tuplizer[] value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizers.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizers.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizers.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Tuplizers.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Define a set of tuplizer for an entity or a component
+ * @author Emmanuel Bernard
+ */
+ at java.lang.annotation.Target( {ElementType.TYPE, ElementType.FIELD, ElementType.METHOD} )
+ at Retention( RetentionPolicy.RUNTIME )
+public @interface Tuplizers {
+ Tuplizer[] value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Type.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Type.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Type.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * hibernate type
- *
- * @author Emmanuel Bernard
- */
- at Target({FIELD, METHOD})
- at Retention(RUNTIME)
-public @interface Type {
- String type();
-
- Parameter[] parameters() default {};
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Type.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Type.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Type.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Type.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * hibernate type
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({FIELD, METHOD})
+ at Retention(RUNTIME)
+public @interface Type {
+ String type();
+
+ Parameter[] parameters() default {};
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDef.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDef.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDef.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Type definition
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, PACKAGE})
- at Retention(RUNTIME)
-public @interface TypeDef {
- String name();
-
- Class typeClass();
-
- Parameter[] parameters() default {};
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDef.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDef.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDef.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDef.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.PACKAGE;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Type definition
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, PACKAGE})
+ at Retention(RUNTIME)
+public @interface TypeDef {
+ String name();
+
+ Class typeClass();
+
+ Parameter[] parameters() default {};
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDefs.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDefs.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDefs.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.PACKAGE;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Type definition array
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, PACKAGE})
- at Retention(RUNTIME)
-public @interface TypeDefs {
- TypeDef[] value();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDefs.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDefs.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDefs.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/TypeDefs.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.PACKAGE;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Type definition array
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, PACKAGE})
+ at Retention(RUNTIME)
+public @interface TypeDefs {
+ TypeDef[] value();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Where.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Where.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Where.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-package org.hibernate.annotations;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Where clause to add to the element Entity or target entity of a collection
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Where {
- String clause();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Where.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/Where.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Where.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/Where.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+package org.hibernate.annotations;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Where clause to add to the element Entity or target entity of a collection
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Where {
+ String clause();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/WhereJoinTable.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/WhereJoinTable.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/WhereJoinTable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Where clause to add to the colleciton join table
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface WhereJoinTable {
- String clause();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/WhereJoinTable.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/annotations/WhereJoinTable.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/WhereJoinTable.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/annotations/WhereJoinTable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Where clause to add to the colleciton join table
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface WhereJoinTable {
+ String clause();
+}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg)
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AbstractPropertyHolder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AbstractPropertyHolder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AbstractPropertyHolder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,188 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.persistence.AssociationOverride;
-import javax.persistence.AssociationOverrides;
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.MappedSuperclass;
-
-import org.hibernate.AssertionFailure;
-import org.hibernate.annotations.common.reflection.XAnnotatedElement;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class AbstractPropertyHolder implements PropertyHolder {
- protected PropertyHolder parent;
- private Map<String, Column[]> holderColumnOverride;
- private Map<String, Column[]> currentPropertyColumnOverride;
- private Map<String, JoinColumn[]> holderJoinColumnOverride;
- private Map<String, JoinColumn[]> currentPropertyJoinColumnOverride;
- private String path;
- private ExtendedMappings mappings;
-
- public AbstractPropertyHolder(
- String path, PropertyHolder parent, XClass clazzToProcess, ExtendedMappings mappings
- ) {
- this.path = path;
- this.parent = parent;
- this.mappings = mappings;
- buildHierarchyColumnOverride( clazzToProcess );
- }
-
- public String getPath() {
- return path;
- }
-
- /**
- * property can be null
- */
- protected void setCurrentProperty(XProperty property) {
- if ( property == null ) {
- this.currentPropertyColumnOverride = null;
- this.currentPropertyJoinColumnOverride = null;
- }
- else {
- this.currentPropertyColumnOverride = buildColumnOverride(
- property,
- getPath()
- );
- if ( this.currentPropertyColumnOverride.size() == 0 ) {
- this.currentPropertyColumnOverride = null;
- }
- this.currentPropertyJoinColumnOverride = buildJoinColumnOverride(
- property,
- getPath()
- );
- if ( this.currentPropertyJoinColumnOverride.size() == 0 ) {
- this.currentPropertyJoinColumnOverride = null;
- }
- }
- }
-
- /**
- * Get column overriding, property first, then parent, then holder
- */
- public Column[] getOverriddenColumn(String propertyName) {
- Column[] override = null;
- if ( parent != null ) {
- override = parent.getOverriddenColumn( propertyName );
- }
- if ( override == null && currentPropertyColumnOverride != null ) {
- override = currentPropertyColumnOverride.get( propertyName );
- }
- if ( override == null && holderColumnOverride != null ) {
- override = holderColumnOverride.get( propertyName );
- }
- return override;
- }
-
- /**
- * Get column overriding, property first, then parent, then holder
- */
- public JoinColumn[] getOverriddenJoinColumn(String propertyName) {
- JoinColumn[] override = null;
- if ( parent != null ) {
- override = parent.getOverriddenJoinColumn( propertyName );
- }
- if ( override == null && currentPropertyJoinColumnOverride != null ) {
- override = currentPropertyJoinColumnOverride.get( propertyName );
- }
- if ( override == null && holderJoinColumnOverride != null ) {
- override = holderJoinColumnOverride.get( propertyName );
- }
- return override;
- }
-
- private void buildHierarchyColumnOverride(XClass element) {
- XClass current = element;
- Map<String, Column[]> columnOverride = new HashMap<String, Column[]>();
- Map<String, JoinColumn[]> joinColumnOverride = new HashMap<String, JoinColumn[]>();
- while ( current != null && ! mappings.getReflectionManager().toXClass( Object.class ).equals( current ) ) {
- if ( current.isAnnotationPresent( Entity.class ) || current.isAnnotationPresent( MappedSuperclass.class )
- || current.isAnnotationPresent( Embeddable.class ) ) {
- //FIXME is embeddable override?
- Map<String, Column[]> currentOverride = buildColumnOverride( current, getPath() );
- Map<String, JoinColumn[]> currentJoinOverride = buildJoinColumnOverride( current, getPath() );
- currentOverride.putAll( columnOverride ); //subclasses have precedence over superclasses
- currentJoinOverride.putAll( joinColumnOverride ); //subclasses have precedence over superclasses
- columnOverride = currentOverride;
- joinColumnOverride = currentJoinOverride;
- }
- current = current.getSuperclass();
- }
-
- holderColumnOverride = columnOverride.size() > 0 ? columnOverride : null;
- holderJoinColumnOverride = joinColumnOverride.size() > 0 ? joinColumnOverride : null;
- }
-
- private static Map<String, Column[]> buildColumnOverride(XAnnotatedElement element, String path) {
- Map<String, Column[]> columnOverride = new HashMap<String, Column[]>();
- if ( element == null ) return columnOverride;
- AttributeOverride singleOverride = element.getAnnotation( AttributeOverride.class );
- AttributeOverrides multipleOverrides = element.getAnnotation( AttributeOverrides.class );
- AttributeOverride[] overrides;
- if ( singleOverride != null ) {
- overrides = new AttributeOverride[]{singleOverride};
- }
- else if ( multipleOverrides != null ) {
- overrides = multipleOverrides.value();
- }
- else {
- overrides = null;
- }
-
- //fill overriden columns
- if ( overrides != null ) {
- for ( AttributeOverride depAttr : overrides ) {
- columnOverride.put(
- StringHelper.qualify( path, depAttr.name() ),
- new Column[]{depAttr.column()}
- );
- }
- }
- return columnOverride;
- }
-
- private static Map<String, JoinColumn[]> buildJoinColumnOverride(XAnnotatedElement element, String path) {
- Map<String, JoinColumn[]> columnOverride = new HashMap<String, JoinColumn[]>();
- if ( element == null ) return columnOverride;
- AssociationOverride singleOverride = element.getAnnotation( AssociationOverride.class );
- AssociationOverrides multipleOverrides = element.getAnnotation( AssociationOverrides.class );
- AssociationOverride[] overrides;
- if ( singleOverride != null ) {
- overrides = new AssociationOverride[]{singleOverride};
- }
- else if ( multipleOverrides != null ) {
- overrides = multipleOverrides.value();
- }
- else {
- overrides = null;
- }
-
- //fill overriden columns
- if ( overrides != null ) {
- for ( AssociationOverride depAttr : overrides ) {
- columnOverride.put(
- StringHelper.qualify( path, depAttr.name() ),
- depAttr.joinColumns()
- );
- }
- }
- return columnOverride;
- }
-
- public void setParentProperty(String parentProperty) {
- throw new AssertionFailure( "Setting the parent property to a non component" );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AbstractPropertyHolder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AbstractPropertyHolder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AbstractPropertyHolder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AbstractPropertyHolder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,188 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.AssociationOverride;
+import javax.persistence.AssociationOverrides;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.MappedSuperclass;
+
+import org.hibernate.AssertionFailure;
+import org.hibernate.annotations.common.reflection.XAnnotatedElement;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class AbstractPropertyHolder implements PropertyHolder {
+ protected PropertyHolder parent;
+ private Map<String, Column[]> holderColumnOverride;
+ private Map<String, Column[]> currentPropertyColumnOverride;
+ private Map<String, JoinColumn[]> holderJoinColumnOverride;
+ private Map<String, JoinColumn[]> currentPropertyJoinColumnOverride;
+ private String path;
+ private ExtendedMappings mappings;
+
+ public AbstractPropertyHolder(
+ String path, PropertyHolder parent, XClass clazzToProcess, ExtendedMappings mappings
+ ) {
+ this.path = path;
+ this.parent = parent;
+ this.mappings = mappings;
+ buildHierarchyColumnOverride( clazzToProcess );
+ }
+
+ public String getPath() {
+ return path;
+ }
+
+ /**
+ * property can be null
+ */
+ protected void setCurrentProperty(XProperty property) {
+ if ( property == null ) {
+ this.currentPropertyColumnOverride = null;
+ this.currentPropertyJoinColumnOverride = null;
+ }
+ else {
+ this.currentPropertyColumnOverride = buildColumnOverride(
+ property,
+ getPath()
+ );
+ if ( this.currentPropertyColumnOverride.size() == 0 ) {
+ this.currentPropertyColumnOverride = null;
+ }
+ this.currentPropertyJoinColumnOverride = buildJoinColumnOverride(
+ property,
+ getPath()
+ );
+ if ( this.currentPropertyJoinColumnOverride.size() == 0 ) {
+ this.currentPropertyJoinColumnOverride = null;
+ }
+ }
+ }
+
+ /**
+ * Get column overriding, property first, then parent, then holder
+ */
+ public Column[] getOverriddenColumn(String propertyName) {
+ Column[] override = null;
+ if ( parent != null ) {
+ override = parent.getOverriddenColumn( propertyName );
+ }
+ if ( override == null && currentPropertyColumnOverride != null ) {
+ override = currentPropertyColumnOverride.get( propertyName );
+ }
+ if ( override == null && holderColumnOverride != null ) {
+ override = holderColumnOverride.get( propertyName );
+ }
+ return override;
+ }
+
+ /**
+ * Get column overriding, property first, then parent, then holder
+ */
+ public JoinColumn[] getOverriddenJoinColumn(String propertyName) {
+ JoinColumn[] override = null;
+ if ( parent != null ) {
+ override = parent.getOverriddenJoinColumn( propertyName );
+ }
+ if ( override == null && currentPropertyJoinColumnOverride != null ) {
+ override = currentPropertyJoinColumnOverride.get( propertyName );
+ }
+ if ( override == null && holderJoinColumnOverride != null ) {
+ override = holderJoinColumnOverride.get( propertyName );
+ }
+ return override;
+ }
+
+ private void buildHierarchyColumnOverride(XClass element) {
+ XClass current = element;
+ Map<String, Column[]> columnOverride = new HashMap<String, Column[]>();
+ Map<String, JoinColumn[]> joinColumnOverride = new HashMap<String, JoinColumn[]>();
+ while ( current != null && ! mappings.getReflectionManager().toXClass( Object.class ).equals( current ) ) {
+ if ( current.isAnnotationPresent( Entity.class ) || current.isAnnotationPresent( MappedSuperclass.class )
+ || current.isAnnotationPresent( Embeddable.class ) ) {
+ //FIXME is embeddable override?
+ Map<String, Column[]> currentOverride = buildColumnOverride( current, getPath() );
+ Map<String, JoinColumn[]> currentJoinOverride = buildJoinColumnOverride( current, getPath() );
+ currentOverride.putAll( columnOverride ); //subclasses have precedence over superclasses
+ currentJoinOverride.putAll( joinColumnOverride ); //subclasses have precedence over superclasses
+ columnOverride = currentOverride;
+ joinColumnOverride = currentJoinOverride;
+ }
+ current = current.getSuperclass();
+ }
+
+ holderColumnOverride = columnOverride.size() > 0 ? columnOverride : null;
+ holderJoinColumnOverride = joinColumnOverride.size() > 0 ? joinColumnOverride : null;
+ }
+
+ private static Map<String, Column[]> buildColumnOverride(XAnnotatedElement element, String path) {
+ Map<String, Column[]> columnOverride = new HashMap<String, Column[]>();
+ if ( element == null ) return columnOverride;
+ AttributeOverride singleOverride = element.getAnnotation( AttributeOverride.class );
+ AttributeOverrides multipleOverrides = element.getAnnotation( AttributeOverrides.class );
+ AttributeOverride[] overrides;
+ if ( singleOverride != null ) {
+ overrides = new AttributeOverride[]{singleOverride};
+ }
+ else if ( multipleOverrides != null ) {
+ overrides = multipleOverrides.value();
+ }
+ else {
+ overrides = null;
+ }
+
+ //fill overriden columns
+ if ( overrides != null ) {
+ for ( AttributeOverride depAttr : overrides ) {
+ columnOverride.put(
+ StringHelper.qualify( path, depAttr.name() ),
+ new Column[]{depAttr.column()}
+ );
+ }
+ }
+ return columnOverride;
+ }
+
+ private static Map<String, JoinColumn[]> buildJoinColumnOverride(XAnnotatedElement element, String path) {
+ Map<String, JoinColumn[]> columnOverride = new HashMap<String, JoinColumn[]>();
+ if ( element == null ) return columnOverride;
+ AssociationOverride singleOverride = element.getAnnotation( AssociationOverride.class );
+ AssociationOverrides multipleOverrides = element.getAnnotation( AssociationOverrides.class );
+ AssociationOverride[] overrides;
+ if ( singleOverride != null ) {
+ overrides = new AssociationOverride[]{singleOverride};
+ }
+ else if ( multipleOverrides != null ) {
+ overrides = multipleOverrides.value();
+ }
+ else {
+ overrides = null;
+ }
+
+ //fill overriden columns
+ if ( overrides != null ) {
+ for ( AssociationOverride depAttr : overrides ) {
+ columnOverride.put(
+ StringHelper.qualify( path, depAttr.name() ),
+ depAttr.joinColumns()
+ );
+ }
+ }
+ return columnOverride;
+ }
+
+ public void setParentProperty(String parentProperty) {
+ throw new AssertionFailure( "Setting the parent property to a non component" );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotatedClassType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotatedClassType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotatedClassType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-package org.hibernate.cfg;
-
-/**
- * Type of annotation of a class will give its type
- *
- * @author Emmanuel Bernard
- */
-public enum AnnotatedClassType {
- /**
- * has no revelent top level annotation
- */
- NONE,
- /**
- * has @Entity annotation
- */
- ENTITY,
- /**
- * has a @Embeddable annotation
- */
- EMBEDDABLE,
- /**
- * has @EmbeddedSuperclass annotation
- */
- EMBEDDABLE_SUPERCLASS
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotatedClassType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotatedClassType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotatedClassType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotatedClassType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+package org.hibernate.cfg;
+
+/**
+ * Type of annotation of a class will give its type
+ *
+ * @author Emmanuel Bernard
+ */
+public enum AnnotatedClassType {
+ /**
+ * has no revelent top level annotation
+ */
+ NONE,
+ /**
+ * has @Entity annotation
+ */
+ ENTITY,
+ /**
+ * has a @Embeddable annotation
+ */
+ EMBEDDABLE,
+ /**
+ * has @EmbeddedSuperclass annotation
+ */
+ EMBEDDABLE_SUPERCLASS
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,2172 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Collections;
-import java.util.Comparator;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorType;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Embeddable;
-import javax.persistence.Embedded;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.MapKey;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.NamedNativeQueries;
-import javax.persistence.NamedNativeQuery;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.PrimaryKeyJoinColumn;
-import javax.persistence.PrimaryKeyJoinColumns;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.SqlResultSetMapping;
-import javax.persistence.SqlResultSetMappings;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Transient;
-import javax.persistence.Version;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.FetchMode;
-import org.hibernate.MappingException;
-import org.hibernate.EntityMode;
-import org.hibernate.annotations.AccessType;
-import org.hibernate.annotations.BatchSize;
-import org.hibernate.annotations.Cache;
-import org.hibernate.annotations.Cascade;
-import org.hibernate.annotations.CascadeType;
-import org.hibernate.annotations.Check;
-import org.hibernate.annotations.CollectionId;
-import org.hibernate.annotations.CollectionOfElements;
-import org.hibernate.annotations.Columns;
-import org.hibernate.annotations.Fetch;
-import org.hibernate.annotations.Filter;
-import org.hibernate.annotations.FilterDef;
-import org.hibernate.annotations.FilterDefs;
-import org.hibernate.annotations.Filters;
-import org.hibernate.annotations.ForeignKey;
-import org.hibernate.annotations.Formula;
-import org.hibernate.annotations.GenericGenerator;
-import org.hibernate.annotations.LazyToOne;
-import org.hibernate.annotations.LazyToOneOption;
-import org.hibernate.annotations.MapKeyManyToMany;
-import org.hibernate.annotations.NotFound;
-import org.hibernate.annotations.NotFoundAction;
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
-import org.hibernate.annotations.OrderBy;
-import org.hibernate.annotations.ParamDef;
-import org.hibernate.annotations.Parameter;
-import org.hibernate.annotations.Parent;
-import org.hibernate.annotations.Proxy;
-import org.hibernate.annotations.Sort;
-import org.hibernate.annotations.Type;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
-import org.hibernate.annotations.Where;
-import org.hibernate.annotations.Index;
-import org.hibernate.annotations.Target;
-import org.hibernate.annotations.Tuplizers;
-import org.hibernate.annotations.Tuplizer;
-import org.hibernate.cfg.annotations.CollectionBinder;
-import org.hibernate.cfg.annotations.EntityBinder;
-import org.hibernate.cfg.annotations.Nullability;
-import org.hibernate.cfg.annotations.PropertyBinder;
-import org.hibernate.cfg.annotations.QueryBinder;
-import org.hibernate.cfg.annotations.SimpleValueBinder;
-import org.hibernate.cfg.annotations.TableBinder;
-import org.hibernate.engine.FilterDefinition;
-import org.hibernate.engine.Versioning;
-import org.hibernate.id.MultipleHiLoPerTableGenerator;
-import org.hibernate.id.PersistentIdentifierGenerator;
-import org.hibernate.id.SequenceHiLoGenerator;
-import org.hibernate.id.TableHiLoGenerator;
-import org.hibernate.mapping.Component;
-import org.hibernate.mapping.DependantValue;
-import org.hibernate.mapping.IdGenerator;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.JoinedSubclass;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.RootClass;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.SingleTableSubclass;
-import org.hibernate.mapping.Subclass;
-import org.hibernate.mapping.ToOne;
-import org.hibernate.mapping.UnionSubclass;
-import org.hibernate.persister.entity.JoinedSubclassEntityPersister;
-import org.hibernate.persister.entity.SingleTableEntityPersister;
-import org.hibernate.persister.entity.UnionSubclassEntityPersister;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XAnnotatedElement;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XPackage;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.type.TypeFactory;
-import org.hibernate.util.StringHelper;
-
-/**
- * JSR 175 annotation binder
- * Will read the annotation from classes, apply the
- * principles of the EJB3 spec and produces the Hibernate
- * configuration-time metamodel (the classes in the <tt>mapping</tt>
- * package)
- *
- * @author Emmanuel Bernard
- */
-public final class AnnotationBinder {
-
- /*
- * Some design description
- * I tried to remove any link to annotation except from the 2 first level of
- * method call.
- * It'll enable to:
- * - facilitate annotation overriding
- * - mutualize one day xml and annotation binder (probably a dream though)
- * - split this huge class in smaller mapping oriented classes
- *
- * bindSomething usually create the mapping container and is accessed by one of the 2 first level method
- * makeSomething usually create the mapping container and is accessed by bindSomething[else]
- * fillSomething take the container into parameter and fill it.
- *
- *
- */
- private AnnotationBinder() {
- }
-
- private static final Log log = LogFactory.getLog( AnnotationBinder.class );
-
- public static void bindDefaults(ExtendedMappings mappings) {
- Map defaults = mappings.getReflectionManager().getDefaults();
- {
- List<SequenceGenerator> anns = (List<SequenceGenerator>) defaults.get( SequenceGenerator.class );
- if ( anns != null ) {
- for ( SequenceGenerator ann : anns ) {
- IdGenerator idGen = buildIdGenerator( ann, mappings );
- if ( idGen != null ) mappings.addDefaultGenerator( idGen );
- }
- }
- }
- {
- List<TableGenerator> anns = (List<TableGenerator>) defaults.get( TableGenerator.class );
- if ( anns != null ) {
- for ( TableGenerator ann : anns ) {
- IdGenerator idGen = buildIdGenerator( ann, mappings );
- if ( idGen != null ) mappings.addDefaultGenerator( idGen );
- }
- }
- }
- {
- List<NamedQuery> anns = (List<NamedQuery>) defaults.get( NamedQuery.class );
- if ( anns != null ) {
- for ( NamedQuery ann : anns ) {
- QueryBinder.bindQuery( ann, mappings, true );
- }
- }
- }
- {
- List<NamedNativeQuery> anns = (List<NamedNativeQuery>) defaults.get( NamedNativeQuery.class );
- if ( anns != null ) {
- for ( NamedNativeQuery ann : anns ) {
- QueryBinder.bindNativeQuery( ann, mappings, true );
- }
- }
- }
- {
- List<SqlResultSetMapping> anns = (List<SqlResultSetMapping>) defaults.get( SqlResultSetMapping.class );
- if ( anns != null ) {
- for ( SqlResultSetMapping ann : anns ) {
- QueryBinder.bindSqlResultsetMapping( ann, mappings, true );
- }
- }
- }
- }
-
- public static void bindPackage(String packageName, ExtendedMappings mappings) {
- XPackage pckg = null;
- try {
- pckg = mappings.getReflectionManager().packageForName( packageName );
- }
- catch (ClassNotFoundException cnf) {
- log.warn( "Package not found or wo package-info.java: " + packageName );
- return;
- }
- if ( pckg.isAnnotationPresent( SequenceGenerator.class ) ) {
- SequenceGenerator ann = pckg.getAnnotation( SequenceGenerator.class );
- IdGenerator idGen = buildIdGenerator( ann, mappings );
- mappings.addGenerator( idGen );
- log.debug( "Add sequence generator with name: " + idGen.getName() );
- }
- if ( pckg.isAnnotationPresent( TableGenerator.class ) ) {
- TableGenerator ann = pckg.getAnnotation( TableGenerator.class );
- IdGenerator idGen = buildIdGenerator( ann, mappings );
- mappings.addGenerator( idGen );
-
- }
- if ( pckg.isAnnotationPresent( GenericGenerator.class ) ) {
- GenericGenerator ann = pckg.getAnnotation( GenericGenerator.class );
- IdGenerator idGen = buildIdGenerator( ann, mappings );
- mappings.addGenerator( idGen );
- }
- bindQueries( pckg, mappings );
- bindFilterDefs( pckg, mappings );
- bindTypeDefs( pckg, mappings );
- }
-
- private static void bindQueries(XAnnotatedElement annotatedElement, ExtendedMappings mappings) {
- {
- SqlResultSetMapping ann = annotatedElement.getAnnotation( SqlResultSetMapping.class );
- QueryBinder.bindSqlResultsetMapping( ann, mappings, false );
- }
- {
- SqlResultSetMappings ann = annotatedElement.getAnnotation( SqlResultSetMappings.class );
- if ( ann != null ) {
- for ( SqlResultSetMapping current : ann.value() ) {
- QueryBinder.bindSqlResultsetMapping( current, mappings, false );
- }
- }
- }
- {
- NamedQuery ann = annotatedElement.getAnnotation( NamedQuery.class );
- QueryBinder.bindQuery( ann, mappings, false );
- }
- {
- org.hibernate.annotations.NamedQuery ann = annotatedElement.getAnnotation(
- org.hibernate.annotations.NamedQuery.class
- );
- QueryBinder.bindQuery( ann, mappings );
- }
- {
- NamedQueries ann = annotatedElement.getAnnotation( NamedQueries.class );
- QueryBinder.bindQueries( ann, mappings, false );
- }
- {
- org.hibernate.annotations.NamedQueries ann = annotatedElement.getAnnotation(
- org.hibernate.annotations.NamedQueries.class
- );
- QueryBinder.bindQueries( ann, mappings );
- }
- {
- NamedNativeQuery ann = annotatedElement.getAnnotation( NamedNativeQuery.class );
- QueryBinder.bindNativeQuery( ann, mappings, false );
- }
- {
- org.hibernate.annotations.NamedNativeQuery ann = annotatedElement.getAnnotation(
- org.hibernate.annotations.NamedNativeQuery.class
- );
- QueryBinder.bindNativeQuery( ann, mappings );
- }
- {
- NamedNativeQueries ann = annotatedElement.getAnnotation( NamedNativeQueries.class );
- QueryBinder.bindNativeQueries( ann, mappings, false );
- }
- {
- org.hibernate.annotations.NamedNativeQueries ann = annotatedElement.getAnnotation(
- org.hibernate.annotations.NamedNativeQueries.class
- );
- QueryBinder.bindNativeQueries( ann, mappings );
- }
- }
-
- private static IdGenerator buildIdGenerator(java.lang.annotation.Annotation ann, Mappings mappings) {
- IdGenerator idGen = new IdGenerator();
- if ( mappings.getSchemaName() != null ) {
- idGen.addParam( PersistentIdentifierGenerator.SCHEMA, mappings.getSchemaName() );
- }
- if ( mappings.getCatalogName() != null ) {
- idGen.addParam( PersistentIdentifierGenerator.CATALOG, mappings.getCatalogName() );
- }
- if ( ann == null ) {
- idGen = null;
- }
- else if ( ann instanceof TableGenerator ) {
- TableGenerator tabGen = (TableGenerator) ann;
- idGen.setName( tabGen.name() );
- idGen.setIdentifierGeneratorStrategy( MultipleHiLoPerTableGenerator.class.getName() );
-
- if ( !BinderHelper.isDefault( tabGen.table() ) ) {
- idGen.addParam( MultipleHiLoPerTableGenerator.ID_TABLE, tabGen.table() );
- }
- if ( !BinderHelper.isDefault( tabGen.catalog() ) ) {
- idGen.addParam( MultipleHiLoPerTableGenerator.CATALOG, tabGen.catalog() );
- }
- if ( !BinderHelper.isDefault( tabGen.schema() ) ) {
- idGen.addParam( MultipleHiLoPerTableGenerator.SCHEMA, tabGen.schema() );
- }
- //FIXME implements uniqueconstrains
-
- if ( !BinderHelper.isDefault( tabGen.pkColumnName() ) ) {
- idGen.addParam( MultipleHiLoPerTableGenerator.PK_COLUMN_NAME, tabGen.pkColumnName() );
- }
- if ( !BinderHelper.isDefault( tabGen.valueColumnName() ) ) {
- idGen.addParam( MultipleHiLoPerTableGenerator.VALUE_COLUMN_NAME, tabGen.valueColumnName() );
- }
- if ( !BinderHelper.isDefault( tabGen.pkColumnValue() ) ) {
- idGen.addParam( MultipleHiLoPerTableGenerator.PK_VALUE_NAME, tabGen.pkColumnValue() );
- }
- idGen.addParam( TableHiLoGenerator.MAX_LO, String.valueOf( tabGen.allocationSize() - 1 ) );
- log.debug( "Add table generator with name: " + idGen.getName() );
- }
- else if ( ann instanceof SequenceGenerator ) {
- SequenceGenerator seqGen = (SequenceGenerator) ann;
- idGen.setName( seqGen.name() );
- idGen.setIdentifierGeneratorStrategy( "seqhilo" );
-
- if ( !BinderHelper.isDefault( seqGen.sequenceName() ) ) {
- idGen.addParam( org.hibernate.id.SequenceGenerator.SEQUENCE, seqGen.sequenceName() );
- }
- //FIXME: work on initialValue() through SequenceGenerator.PARAMETERS
- if ( seqGen.initialValue() != 1 ) {
- log.warn(
- "Hibernate does not support SequenceGenerator.initialValue()"
- );
- }
- idGen.addParam( SequenceHiLoGenerator.MAX_LO, String.valueOf( seqGen.allocationSize() - 1 ) );
- log.debug( "Add sequence generator with name: " + idGen.getName() );
- }
- else if ( ann instanceof GenericGenerator ) {
- GenericGenerator genGen = (GenericGenerator) ann;
- idGen.setName( genGen.name() );
- idGen.setIdentifierGeneratorStrategy( genGen.strategy() );
- Parameter[] params = genGen.parameters();
- for ( Parameter parameter : params ) {
- idGen.addParam( parameter.name(), parameter.value() );
- }
- log.debug( "Add generic generator with name: " + idGen.getName() );
- }
- else {
- throw new AssertionFailure( "Unknown Generator annotation: " + ann );
- }
- return idGen;
- }
-
- /**
- * Bind a class having JSR175 annotations
- * The subclasses <b>have to</b> be binded after its mother class
- */
- public static void bindClass(
- XClass clazzToProcess, Map<XClass, InheritanceState> inheritanceStatePerClass, ExtendedMappings mappings
- ) throws MappingException {
- //TODO: be more strict with secondarytable allowance (not for ids, not for secondary table join columns etc)
- InheritanceState inheritanceState = inheritanceStatePerClass.get( clazzToProcess );
- AnnotatedClassType classType = mappings.getClassType( clazzToProcess );
- if ( AnnotatedClassType.EMBEDDABLE_SUPERCLASS.equals( classType ) //will be processed by their subentities
- || AnnotatedClassType.NONE.equals( classType ) //to be ignored
- || AnnotatedClassType.EMBEDDABLE.equals( classType ) //allow embeddable element declaration
- ) {
- if ( AnnotatedClassType.NONE.equals( classType )
- && clazzToProcess.isAnnotationPresent( org.hibernate.annotations.Entity.class ) ) {
- log.warn("Class annotated @org.hibernate.annotations.Entity but not javax.persistence.Entity "
- + "(most likely a user error): " + clazzToProcess.getName() );
- }
- return;
- }
- if ( !classType.equals( AnnotatedClassType.ENTITY ) ) {
- //TODO make this test accurate by removing the none elements artifically added
- throw new AnnotationException(
- "Annotated class should have a @javax.persistence.Entity, @javax.persistence.Embeddable or @javax.persistence.EmbeddedSuperclass annotation: " + clazzToProcess
- .getName()
- );
- }
- XAnnotatedElement annotatedClass = clazzToProcess;
- if ( log.isInfoEnabled() ) log.info( "Binding entity from annotated class: " + clazzToProcess.getName() );
- InheritanceState superEntityState =
- InheritanceState.getSuperEntityInheritanceState(
- clazzToProcess, inheritanceStatePerClass, mappings.getReflectionManager()
- );
- PersistentClass superEntity = superEntityState != null ?
- mappings.getClass(
- superEntityState.clazz.getName()
- ) :
- null;
- if ( superEntity == null ) {
- //check if superclass is not a potential persistent class
- if ( inheritanceState.hasParents ) {
- throw new AssertionFailure(
- "Subclass has to be binded after it's mother class: "
- + superEntityState.clazz.getName()
- );
- }
- }
- bindQueries( annotatedClass, mappings );
- bindFilterDefs( annotatedClass, mappings );
- bindTypeDefs( annotatedClass, mappings );
-
- String schema = "";
- String table = ""; //might be no @Table annotation on the annotated class
- String catalog = "";
- String discrimValue = null;
- List<String[]> uniqueConstraints = new ArrayList<String[]>();
- Ejb3DiscriminatorColumn discriminatorColumn = null;
- Ejb3JoinColumn[] inheritanceJoinedColumns = null;
-
- if ( annotatedClass.isAnnotationPresent( javax.persistence.Table.class ) ) {
- javax.persistence.Table tabAnn = annotatedClass.getAnnotation( javax.persistence.Table.class );
- table = tabAnn.name();
- schema = tabAnn.schema();
- catalog = tabAnn.catalog();
- uniqueConstraints = TableBinder.buildUniqueConstraints( tabAnn.uniqueConstraints() );
- }
- final boolean hasJoinedColumns = inheritanceState.hasParents
- && InheritanceType.JOINED.equals( inheritanceState.type );
- if ( hasJoinedColumns ) {
- //@Inheritance(JOINED) subclass need to link back to the super entity
- PrimaryKeyJoinColumns jcsAnn = annotatedClass.getAnnotation( PrimaryKeyJoinColumns.class );
- boolean explicitInheritanceJoinedColumns = jcsAnn != null && jcsAnn.value().length != 0;
- if ( explicitInheritanceJoinedColumns ) {
- int nbrOfInhJoinedColumns = jcsAnn.value().length;
- PrimaryKeyJoinColumn jcAnn;
- inheritanceJoinedColumns = new Ejb3JoinColumn[nbrOfInhJoinedColumns];
- for ( int colIndex = 0; colIndex < nbrOfInhJoinedColumns; colIndex++ ) {
- jcAnn = jcsAnn.value()[colIndex];
- inheritanceJoinedColumns[colIndex] = Ejb3JoinColumn.buildJoinColumn(
- jcAnn, null, superEntity.getIdentifier(),
- (Map<String, Join>) null, (PropertyHolder) null, mappings
- );
- }
- }
- else {
- PrimaryKeyJoinColumn jcAnn = annotatedClass.getAnnotation( PrimaryKeyJoinColumn.class );
- inheritanceJoinedColumns = new Ejb3JoinColumn[1];
- inheritanceJoinedColumns[0] = Ejb3JoinColumn.buildJoinColumn(
- jcAnn, null, superEntity.getIdentifier(),
- (Map<String, Join>) null, (PropertyHolder) null, mappings
- );
- }
- log.debug( "Subclass joined column(s) created" );
- }
- else {
- if ( annotatedClass.isAnnotationPresent( javax.persistence.PrimaryKeyJoinColumns.class )
- || annotatedClass.isAnnotationPresent( javax.persistence.PrimaryKeyJoinColumn.class ) ) {
- log.warn( "Root entity should not hold an PrimaryKeyJoinColum(s), will be ignored" );
- }
- }
-
- if ( InheritanceType.SINGLE_TABLE.equals( inheritanceState.type ) ) {
- javax.persistence.Inheritance inhAnn = annotatedClass.getAnnotation( javax.persistence.Inheritance.class );
- javax.persistence.DiscriminatorColumn discAnn = annotatedClass.getAnnotation(
- javax.persistence.DiscriminatorColumn.class
- );
- DiscriminatorType discriminatorType = discAnn != null ?
- discAnn.discriminatorType() :
- DiscriminatorType.STRING;
-
- org.hibernate.annotations.DiscriminatorFormula discFormulaAnn = annotatedClass.getAnnotation(
- org.hibernate.annotations.DiscriminatorFormula.class
- );
- if ( !inheritanceState.hasParents ) {
- discriminatorColumn = Ejb3DiscriminatorColumn.buildDiscriminatorColumn(
- discriminatorType, discAnn, discFormulaAnn, mappings
- );
- }
- if ( discAnn != null && inheritanceState.hasParents ) {
- log.warn(
- "Discriminator column has to be defined in the root entity, it will be ignored in subclass: "
- + clazzToProcess.getName()
- );
- }
- discrimValue = annotatedClass.isAnnotationPresent( DiscriminatorValue.class ) ?
- annotatedClass.getAnnotation( DiscriminatorValue.class ).value() :
- null;
- }
-
- //we now know what kind of persistent entity it is
- PersistentClass persistentClass;
- //create persistent class
- if ( !inheritanceState.hasParents ) {
- persistentClass = new RootClass();
- }
- else if ( InheritanceType.SINGLE_TABLE.equals( inheritanceState.type ) ) {
- persistentClass = new SingleTableSubclass( superEntity );
- }
- else if ( InheritanceType.JOINED.equals( inheritanceState.type ) ) {
- persistentClass = new JoinedSubclass( superEntity );
- }
- else if ( InheritanceType.TABLE_PER_CLASS.equals( inheritanceState.type ) ) {
- persistentClass = new UnionSubclass( superEntity );
- }
- else {
- throw new AssertionFailure( "Unknown inheritance type: " + inheritanceState.type );
- }
- Proxy proxyAnn = annotatedClass.getAnnotation( Proxy.class );
- BatchSize sizeAnn = annotatedClass.getAnnotation( BatchSize.class );
- Where whereAnn = annotatedClass.getAnnotation( Where.class );
- Entity entityAnn = annotatedClass.getAnnotation( Entity.class );
- org.hibernate.annotations.Entity hibEntityAnn = annotatedClass.getAnnotation(
- org.hibernate.annotations.Entity.class
- );
- org.hibernate.annotations.Cache cacheAnn = annotatedClass.getAnnotation(
- org.hibernate.annotations.Cache.class
- );
- EntityBinder entityBinder = new EntityBinder(
- entityAnn, hibEntityAnn, clazzToProcess, persistentClass, mappings
- );
- entityBinder.setDiscriminatorValue( discrimValue );
- entityBinder.setBatchSize( sizeAnn );
- entityBinder.setProxy( proxyAnn );
- entityBinder.setWhere( whereAnn );
- entityBinder.setCache( cacheAnn );
- entityBinder.setInheritanceState( inheritanceState );
- Filter filterAnn = annotatedClass.getAnnotation( Filter.class );
- if ( filterAnn != null ) {
- entityBinder.addFilter( filterAnn.name(), filterAnn.condition() );
- }
- Filters filtersAnn = annotatedClass.getAnnotation( Filters.class );
- if ( filtersAnn != null ) {
- for ( Filter filter : filtersAnn.value() ) {
- entityBinder.addFilter( filter.name(), filter.condition() );
- }
- }
- entityBinder.bindEntity();
-
- if ( inheritanceState.hasTable() ) {
- Check checkAnn = annotatedClass.getAnnotation( Check.class );
- String constraints = checkAnn == null ?
- null :
- checkAnn.constraints();
- entityBinder.bindTable(
- schema, catalog, table, uniqueConstraints,
- constraints, inheritanceState.hasDenormalizedTable() ?
- superEntity.getTable() :
- null
- );
- }
- else {
- if ( annotatedClass.isAnnotationPresent( Table.class ) ) {
- log.warn( "Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: " + clazzToProcess
- .getName() );
- }
- }
-// Map<String, Column[]> columnOverride = PropertyHolderBuilder.buildHierarchyColumnOverride(
-// clazzToProcess,
-// persistentClass.getClassName()
-// );
- PropertyHolder propertyHolder = PropertyHolderBuilder.buildPropertyHolder(
- clazzToProcess,
- persistentClass,
- entityBinder, mappings
- );
-
- javax.persistence.SecondaryTable secTabAnn = annotatedClass.getAnnotation(
- javax.persistence.SecondaryTable.class
- );
- javax.persistence.SecondaryTables secTabsAnn = annotatedClass.getAnnotation(
- javax.persistence.SecondaryTables.class
- );
- entityBinder.firstLevelSecondaryTablesBinding( secTabAnn, secTabsAnn );
-
- OnDelete onDeleteAnn = annotatedClass.getAnnotation( OnDelete.class );
- boolean onDeleteAppropriate = false;
- if ( InheritanceType.JOINED.equals( inheritanceState.type ) && inheritanceState.hasParents ) {
- onDeleteAppropriate = true;
- final JoinedSubclass jsc = (JoinedSubclass) persistentClass;
- if ( persistentClass.getEntityPersisterClass() == null ) {
- persistentClass.getRootClass().setEntityPersisterClass( JoinedSubclassEntityPersister.class );
- }
- SimpleValue key = new DependantValue( jsc.getTable(), jsc.getIdentifier() );
- jsc.setKey( key );
- ForeignKey fk = annotatedClass.getAnnotation( ForeignKey.class );
- if (fk != null && ! BinderHelper.isDefault( fk.name() ) ) {
- key.setForeignKeyName( fk.name() );
- }
- if ( onDeleteAnn != null ) {
- key.setCascadeDeleteEnabled( OnDeleteAction.CASCADE.equals( onDeleteAnn.action() ) );
- }
- else {
- key.setCascadeDeleteEnabled( false );
- }
- TableBinder.bindFk( jsc.getSuperclass(), jsc, inheritanceJoinedColumns, key, false, mappings );
- //no need to handle inSecondPass this is an Etntiy related work
- mappings.addSecondPass( new CreateKeySecondPass( jsc ) );
-
- }
- else if ( InheritanceType.SINGLE_TABLE.equals( inheritanceState.type ) ) {
- if ( inheritanceState.hasParents ) {
- if ( persistentClass.getEntityPersisterClass() == null ) {
- persistentClass.getRootClass().setEntityPersisterClass( SingleTableEntityPersister.class );
- }
- }
- else {
- if ( inheritanceState.hasSons || !discriminatorColumn.isImplicit() ) {
- //need a discriminator column
- bindDiscriminatorToPersistentClass(
- (RootClass) persistentClass,
- discriminatorColumn,
- entityBinder.getSecondaryTables(),
- propertyHolder
- );
- entityBinder.bindDiscriminatorValue();//bind it again since the type might have changed
- }
- }
- }
- else if ( InheritanceType.TABLE_PER_CLASS.equals( inheritanceState.type ) ) {
- if ( inheritanceState.hasParents ) {
- if ( persistentClass.getEntityPersisterClass() == null ) {
- persistentClass.getRootClass().setEntityPersisterClass( UnionSubclassEntityPersister.class );
- }
- }
- }
- if ( onDeleteAnn != null && !onDeleteAppropriate ) {
- log.warn(
- "Inapropriate use of @OnDelete on entity, annotation ignored: " + propertyHolder.getEntityName()
- );
- }
-
- //try to find class level generators
- HashMap<String, IdGenerator> classGenerators = buildLocalGenerators( annotatedClass, mappings );
-
- // check properties
- List<PropertyData> elements =
- getElementsToProcess(
- clazzToProcess, inheritanceStatePerClass, propertyHolder, entityBinder, mappings
- );
- if ( elements == null ) {
- throw new AnnotationException( "No identifier specified for entity: " + propertyHolder.getEntityName() );
- }
- final boolean subclassAndSingleTableStrategy = inheritanceState.type == InheritanceType.SINGLE_TABLE
- && inheritanceState.hasParents;
- //process idclass if any
- Set<String> idProperties = new HashSet<String>();
- IdClass idClass = null;
- if ( !inheritanceState.hasParents ) {
- //look for idClass
- XClass current = inheritanceState.clazz;
- InheritanceState state = inheritanceState;
- do {
- current = state.clazz;
- if ( current.isAnnotationPresent( IdClass.class ) ) {
- idClass = current.getAnnotation( IdClass.class );
- break;
- }
- state = InheritanceState.getSuperclassInheritanceState(
- current, inheritanceStatePerClass, mappings.getReflectionManager()
- );
- }
- while ( state != null );
- }
- if ( idClass != null ) {
- XClass compositeClass = mappings.getReflectionManager().toXClass( idClass.value() );
- boolean isComponent = true;
- boolean propertyAnnotated = entityBinder.isPropertyAnnotated( compositeClass );
- String propertyAccessor = entityBinder.getPropertyAccessor( compositeClass );
- String generatorType = "assigned";
- String generator = BinderHelper.ANNOTATION_STRING_DEFAULT;
- PropertyData inferredData = new PropertyPreloadedData(
- entityBinder.getPropertyAccessor(), "id", compositeClass
- );
- HashMap<String, IdGenerator> localGenerators = new HashMap<String, IdGenerator>();
- boolean ignoreIdAnnotations = entityBinder.isIgnoreIdAnnotations();
- entityBinder.setIgnoreIdAnnotations( true );
- bindId(
- generatorType,
- generator,
- inferredData,
- null,
- propertyHolder,
- localGenerators,
- isComponent,
- propertyAnnotated,
- propertyAccessor, entityBinder,
- null,
- true,
- false, mappings
- );
- inferredData = new PropertyPreloadedData(
- propertyAccessor, "_identifierMapper", compositeClass
- );
- Component mapper = fillComponent(
- propertyHolder,
- inferredData,
- propertyAnnotated,
- propertyAccessor, false,
- entityBinder,
- true, true,
- false, mappings
- );
- entityBinder.setIgnoreIdAnnotations( ignoreIdAnnotations );
- persistentClass.setIdentifierMapper( mapper );
- Property property = new Property();
- property.setName( "_identifierMapper" );
- property.setNodeName( "id" );
- property.setUpdateable( false );
- property.setInsertable( false );
- property.setValue( mapper );
- property.setPropertyAccessorName( "embedded" );
- persistentClass.addProperty( property );
- entityBinder.setIgnoreIdAnnotations( true );
-
- Iterator properties = mapper.getPropertyIterator();
- while ( properties.hasNext() ) {
- idProperties.add( ( (Property) properties.next() ).getName() );
- }
- }
- Set<String> missingIdProperties = new HashSet<String>( idProperties );
- for ( PropertyData propertyAnnotatedElement : elements ) {
- String propertyName = propertyAnnotatedElement.getPropertyName();
- if ( !idProperties.contains( propertyName ) ) {
- processElementAnnotations(
- propertyHolder,
- subclassAndSingleTableStrategy ?
- Nullability.FORCED_NULL :
- Nullability.NO_CONSTRAINT,
- propertyAnnotatedElement.getProperty(),
- propertyAnnotatedElement, classGenerators, entityBinder,
- false, false, false, mappings
- );
- }
- else {
- missingIdProperties.remove( propertyName );
- }
- }
-
- if ( missingIdProperties.size() != 0 ) {
- StringBuilder missings = new StringBuilder();
- for ( String property : missingIdProperties ) {
- missings.append( property ).append( ", " );
- }
- throw new AnnotationException(
- "Unable to find properties ("
- + missings.substring( 0, missings.length() - 2 )
- + ") in entity annotated with @IdClass:" + persistentClass.getEntityName()
- );
- }
-
- if ( !inheritanceState.hasParents ) {
- final RootClass rootClass = (RootClass) persistentClass;
- //no need to handle inSecondPass this is an Entity related work
- mappings.addSecondPass( new CreateKeySecondPass( rootClass ) );
- }
- else {
- superEntity.addSubclass( (Subclass) persistentClass );
- }
-
- mappings.addClass( persistentClass );
- entityBinder.finalSecondaryTableBinding( propertyHolder );
-
- //add process complementary Table definition (index & all)
- entityBinder.processComplementaryTableDefinitions( annotatedClass.getAnnotation( org.hibernate.annotations.Table.class ) );
- entityBinder.processComplementaryTableDefinitions( annotatedClass.getAnnotation( org.hibernate.annotations.Tables.class ) );
-
- }
-
- /**
- * Get the annotated elements
- * Guess the annotated element from @Id or @EmbeddedId presence
- * Change EntityBinder by side effect
- */
- private static List<PropertyData> getElementsToProcess(
- XClass clazzToProcess, Map<XClass, InheritanceState> inheritanceStatePerClass,
- PropertyHolder propertyHolder, EntityBinder entityBinder, ExtendedMappings mappings
- ) {
- InheritanceState inheritanceState = inheritanceStatePerClass.get( clazzToProcess );
- List<XClass> classesToProcess = orderClassesToBeProcessed(
- clazzToProcess, inheritanceStatePerClass, inheritanceState, mappings
- );
- List<PropertyData> elements = new ArrayList<PropertyData>();
- int deep = classesToProcess.size();
- boolean hasIdentifier = false;
-
- assert !inheritanceState.isEmbeddableSuperclass;
- Boolean isExplicitPropertyAnnotated = null;
- String explicitAccessType = null;
- if ( inheritanceState.hasParents ) {
- InheritanceState superEntityState =
- InheritanceState.getSuperEntityInheritanceState(
- clazzToProcess, inheritanceStatePerClass, mappings.getReflectionManager()
- );
- isExplicitPropertyAnnotated = superEntityState != null ?
- superEntityState.isPropertyAnnotated :
- null;
- explicitAccessType = superEntityState != null ?
- superEntityState.accessType :
- null;
- }
- else {
- AccessType access = clazzToProcess.getAnnotation( AccessType.class );
- explicitAccessType = access != null ?
- access.value() :
- null;
- if ( "property".equals( explicitAccessType ) ) {
- isExplicitPropertyAnnotated = Boolean.TRUE;
- }
- else if ( "field".equals( explicitAccessType ) ) {
- isExplicitPropertyAnnotated = Boolean.FALSE;
- }
- }
- Boolean isPropertyAnnotated = isExplicitPropertyAnnotated == null ?
- Boolean.TRUE :
- //default to property and fallback if needed
- isExplicitPropertyAnnotated;
- String accessType = explicitAccessType != null ?
- explicitAccessType :
- "property";
-
- for ( int index = 0; index < deep; index++ ) {
- XClass clazz = classesToProcess.get( index );
-
- boolean currentHasIdentifier = addElementsOfAClass(
- elements, propertyHolder, isPropertyAnnotated,
- accessType, clazz, mappings
- );
- hasIdentifier = hasIdentifier || currentHasIdentifier;
- }
-
- if ( !hasIdentifier && !inheritanceState.hasParents ) {
- if ( isExplicitPropertyAnnotated != null ) return null; //explicit but no @Id
- isPropertyAnnotated = !isPropertyAnnotated;
- accessType = "field";
- elements.clear();
- for ( int index = 0; index < deep; index++ ) {
- XClass clazz = classesToProcess.get( index );
- boolean currentHasIdentifier = addElementsOfAClass(
- elements, propertyHolder, isPropertyAnnotated,
- accessType, clazz, mappings
- );
- hasIdentifier = hasIdentifier || currentHasIdentifier;
- }
- }
- //TODO set the access type here?
- entityBinder.setPropertyAnnotated( isPropertyAnnotated );
- entityBinder.setPropertyAccessor( accessType );
- inheritanceState.isPropertyAnnotated = isPropertyAnnotated;
- inheritanceState.accessType = accessType;
- return hasIdentifier || inheritanceState.hasParents ?
- elements :
- null;
- }
-
- private static List<XClass> orderClassesToBeProcessed(
- XClass annotatedClass, Map<XClass, InheritanceState> inheritanceStatePerClass,
- InheritanceState inheritanceState, ExtendedMappings mappings
- ) {
- //ordered to allow proper messages on properties subclassing
- List<XClass> classesToProcess = new ArrayList<XClass>();
- XClass currentClassInHierarchy = annotatedClass;
- InheritanceState superclassState;
- do {
- classesToProcess.add( 0, currentClassInHierarchy );
- XClass superClass = currentClassInHierarchy;
- do {
- superClass = superClass.getSuperclass();
- superclassState = inheritanceStatePerClass.get( superClass );
- }
- while ( superClass != null && !mappings.getReflectionManager()
- .equals( superClass, Object.class ) && superclassState == null );
-
- currentClassInHierarchy = superClass;
- }
- while ( superclassState != null && superclassState.isEmbeddableSuperclass );
-
- return classesToProcess;
- }
-
- private static void bindFilterDefs(XAnnotatedElement annotatedElement, ExtendedMappings mappings) {
- FilterDef defAnn = annotatedElement.getAnnotation( FilterDef.class );
- FilterDefs defsAnn = annotatedElement.getAnnotation( FilterDefs.class );
- if ( defAnn != null ) {
- bindFilterDef( defAnn, mappings );
- }
- if ( defsAnn != null ) {
- for ( FilterDef def : defsAnn.value() ) {
- bindFilterDef( def, mappings );
- }
- }
- }
-
- private static void bindFilterDef(FilterDef defAnn, ExtendedMappings mappings) {
- Map<String, org.hibernate.type.Type> params = new HashMap<String, org.hibernate.type.Type>();
- for ( ParamDef param : defAnn.parameters() ) {
- params.put( param.name(), TypeFactory.heuristicType( param.type() ) );
- }
- FilterDefinition def = new FilterDefinition( defAnn.name(), defAnn.defaultCondition(), params );
- if ( log.isInfoEnabled() ) log.info( "Binding filter definition: " + def.getFilterName() );
- mappings.addFilterDefinition( def );
- }
-
- private static void bindTypeDefs(XAnnotatedElement annotatedElement, ExtendedMappings mappings) {
- TypeDef defAnn = annotatedElement.getAnnotation( TypeDef.class );
- TypeDefs defsAnn = annotatedElement.getAnnotation( TypeDefs.class );
- if ( defAnn != null ) {
- bindTypeDef( defAnn, mappings );
- }
- if ( defsAnn != null ) {
- for ( TypeDef def : defsAnn.value() ) {
- bindTypeDef( def, mappings );
- }
- }
- }
-
- private static void bindTypeDef(TypeDef defAnn, ExtendedMappings mappings) {
- Properties params = new Properties();
- for ( Parameter param : defAnn.parameters() ) {
- params.setProperty( param.name(), param.value() );
- }
- if ( log.isInfoEnabled() ) log.info( "Binding type definition: " + defAnn.name() );
- mappings.addTypeDef( defAnn.name(), defAnn.typeClass().getName(), params );
- }
-
- private static void bindDiscriminatorToPersistentClass(
- RootClass rootClass,
- Ejb3DiscriminatorColumn discriminatorColumn, Map<String, Join> secondaryTables,
- PropertyHolder propertyHolder
- ) {
- if ( rootClass.getDiscriminator() == null ) {
- if ( discriminatorColumn == null ) {
- throw new AssertionFailure( "discriminator column should have been built" );
- }
- discriminatorColumn.setJoins( secondaryTables );
- discriminatorColumn.setPropertyHolder( propertyHolder );
- SimpleValue discrim = new SimpleValue( rootClass.getTable() );
- rootClass.setDiscriminator( discrim );
- discriminatorColumn.linkWithValue( discrim );
- discrim.setTypeName( discriminatorColumn.getDiscriminatorTypeName() );
- rootClass.setPolymorphic( true );
- log.debug( "Setting discriminator for entity " + rootClass.getEntityName() );
- }
- }
-
- /**
- * Add elements of a class
- */
- private static boolean addElementsOfAClass(
- List<PropertyData> elements, PropertyHolder propertyHolder, boolean isPropertyAnnotated,
- String propertyAccessor, final XClass annotatedClass, ExtendedMappings mappings
- ) {
- boolean hasIdentifier = false;
- AccessType access = annotatedClass.getAnnotation( AccessType.class );
- String localPropertyAccessor = access != null ?
- access.value() :
- null;
- String accessType = null;
- if ( "property".equals( localPropertyAccessor ) || "field".equals( localPropertyAccessor ) ) {
- accessType = localPropertyAccessor;
- }
- else {
- if ( localPropertyAccessor == null ) {
- localPropertyAccessor = propertyAccessor;
- }
-
- if ( isPropertyAnnotated ) {
- accessType = "property";
- }
- else {
- accessType = "field";
- }
- }
-
- log.debug( "Processing " + propertyHolder.getEntityName() + " " + accessType + " annotation" );
- List<XProperty> properties = annotatedClass.getDeclaredProperties( accessType );
- //order so that property are used int he same order when binding native query
- Collections.sort( properties, new Comparator<XProperty>() {
- public int compare(XProperty property1, XProperty property2) {
- return property1.getName().compareTo( property2.getName() );
- }
- } );
- for ( XProperty p : properties ) {
- if ( !p.isTypeResolved() && !discoverTypeWithoutReflection( p ) && !mustBeSkipped( p, mappings ) ) {
- throw new AnnotationException(
- "Property " + StringHelper.qualify( propertyHolder.getEntityName(), p.getName() ) +
- " has an unbound type and no explicit target entity. Resolve this Generic usage issue" +
- " or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type"
- );
- }
- final boolean currentHasIdentifier = addProperty( p, elements, localPropertyAccessor, mappings );
- hasIdentifier = hasIdentifier || currentHasIdentifier;
- }
- return hasIdentifier;
- }
-
- private static boolean discoverTypeWithoutReflection(XProperty p) {
- if ( p.isAnnotationPresent( OneToOne.class ) && !p.getAnnotation( OneToOne.class )
- .targetEntity()
- .equals( void.class ) ) {
- return true;
- }
- else if ( p.isAnnotationPresent( OneToMany.class ) && !p.getAnnotation( OneToMany.class )
- .targetEntity()
- .equals( void.class ) ) {
- return true;
- }
- else if ( p.isAnnotationPresent( ManyToOne.class ) && !p.getAnnotation( ManyToOne.class )
- .targetEntity()
- .equals( void.class ) ) {
- return true;
- }
- else if ( p.isAnnotationPresent( ManyToMany.class ) && !p.getAnnotation( ManyToMany.class )
- .targetEntity()
- .equals( void.class ) ) {
- return true;
- }
- else if ( p.isAnnotationPresent( Type.class ) ) {
- return true;
- }
- else if ( p.isAnnotationPresent( Target.class ) ) {
- return true;
- }
- return false;
- }
-
- private static boolean addProperty(
- XProperty property, List<PropertyData> annElts,
- String propertyAccessor, ExtendedMappings mappings
- ) {
- boolean hasIdentifier = false;
- PropertyData propertyAnnotatedElement = new PropertyInferredData(
- property, propertyAccessor,
- mappings.getReflectionManager() );
- if ( !mustBeSkipped( propertyAnnotatedElement.getProperty(), mappings ) ) {
- /*
- * put element annotated by @Id in front
- * since it has to be parsed before any assoctation by Hibernate
- */
- final XAnnotatedElement element = propertyAnnotatedElement.getProperty();
- if ( element.isAnnotationPresent( Id.class ) || element.isAnnotationPresent( EmbeddedId.class ) ) {
- annElts.add( 0, propertyAnnotatedElement );
- hasIdentifier = true;
- }
- else {
- annElts.add( propertyAnnotatedElement );
- hasIdentifier = false;
- }
- }
- return hasIdentifier;
- }
-
- private static boolean mustBeSkipped(XProperty property, ExtendedMappings mappings) {
- //TODO make those hardcoded tests more portable (through the bytecode provider?)
- return property.isAnnotationPresent( Transient.class )
- || "net.sf.cglib.transform.impl.InterceptFieldCallback".equals( property.getType().getName() )
- || "org.hibernate.tool.instrument.javassist.FieldHandler".equals( property.getType().getName() );
- }
-
- /**
- * Process annotation of a particular property
- */
- private static void processElementAnnotations(
- PropertyHolder propertyHolder, Nullability nullability, XProperty property,
- PropertyData inferredData, HashMap<String, IdGenerator> classGenerators,
- EntityBinder entityBinder, boolean isIdentifierMapper,
- boolean isComponentEmbedded, boolean inSecondPass, ExtendedMappings mappings
- )
- throws MappingException {
- /**
- * inSecondPass can only be used to apply right away the second pass of a composite-element
- * Because it's a value type, there is no bidirectional association, hence second pass
- * ordering does not matter
- */
- Ejb3Column[] columns = null;
- Ejb3JoinColumn[] joinColumns = null;
- if ( log.isDebugEnabled() ) {
- log.debug(
- "Processing annotations of " + propertyHolder.getEntityName() + "." + inferredData.getPropertyName()
- );
- }
-
- if ( property.isAnnotationPresent( Parent.class ) ) {
- if ( propertyHolder.isComponent() ) {
- propertyHolder.setParentProperty( property.getName() );
- }
- else {
- throw new AnnotationException(
- "@Parent cannot be applied outside an embeddable object: "
- + StringHelper.qualify( propertyHolder.getPath(), property.getName() )
- );
- }
- return;
- }
-
- //process @JoinColumn(s) before @Column(s) to handle collection of elements properly
- {
- JoinColumn[] anns = null;
- if ( property.isAnnotationPresent( JoinColumn.class ) ) {
- anns = new JoinColumn[]{property.getAnnotation( JoinColumn.class )};
- }
- else if ( property.isAnnotationPresent( JoinColumns.class ) ) {
- JoinColumns ann = property.getAnnotation( JoinColumns.class );
- anns = ann.value();
- int length = anns.length;
- if ( length == 0 ) {
- throw new AnnotationException( "Cannot bind an empty @JoinColumns" );
- }
- }
- if ( anns != null ) {
- joinColumns = Ejb3JoinColumn.buildJoinColumns(
- anns, null, entityBinder.getSecondaryTables(),
- propertyHolder, inferredData.getPropertyName(), mappings
- );
- }
- }
- if ( property.isAnnotationPresent( Column.class ) || property.isAnnotationPresent( Formula.class ) ) {
- Column ann = property.getAnnotation( Column.class );
- Formula formulaAnn = property.getAnnotation( Formula.class );
- columns = Ejb3Column.buildColumnFromAnnotation(
- new Column[]{ann}, formulaAnn, nullability, propertyHolder, inferredData,
- entityBinder.getSecondaryTables(), mappings
- );
- }
- else if ( property.isAnnotationPresent( Columns.class ) ) {
- Columns anns = property.getAnnotation( Columns.class );
- columns = Ejb3Column.buildColumnFromAnnotation(
- anns.columns(), null, nullability, propertyHolder, inferredData, entityBinder.getSecondaryTables(),
- mappings
- );
- }
-
- //set default values if needed
- if ( joinColumns == null &&
- ( property.isAnnotationPresent( ManyToOne.class )
- || property.isAnnotationPresent( OneToOne.class ) )
- ) {
- if ( property.isAnnotationPresent( JoinTable.class ) ) {
- JoinTable joinTableAnn = property.getAnnotation( JoinTable.class );
- joinColumns = Ejb3JoinColumn.buildJoinColumns(
- joinTableAnn.inverseJoinColumns(), null, entityBinder.getSecondaryTables(),
- propertyHolder, inferredData.getPropertyName(), mappings
- );
- if ( StringHelper.isEmpty( joinTableAnn.name() ) ) {
- throw new AnnotationException(
- "JoinTable.name() on a @ToOne association has to be explicit: "
- + StringHelper.qualify( propertyHolder.getPath(), inferredData.getPropertyName() )
- );
- }
- }
- else {
- OneToOne oneToOneAnn = property.getAnnotation( OneToOne.class );
- String mappedBy = oneToOneAnn != null ?
- oneToOneAnn.mappedBy() :
- null;
- joinColumns = Ejb3JoinColumn.buildJoinColumns(
- (JoinColumn[]) null,
- mappedBy, entityBinder.getSecondaryTables(),
- propertyHolder, inferredData.getPropertyName(), mappings
- );
- }
- }
- else if ( joinColumns == null &&
- ( property.isAnnotationPresent( OneToMany.class )
- || property.isAnnotationPresent( CollectionOfElements.class ) ) ) {
- OneToMany oneToMany = property.getAnnotation( OneToMany.class );
- String mappedBy = oneToMany != null ?
- oneToMany.mappedBy() :
- "";
- joinColumns = Ejb3JoinColumn.buildJoinColumns(
- (JoinColumn[]) null,
- mappedBy, entityBinder.getSecondaryTables(),
- propertyHolder, inferredData.getPropertyName(), mappings
- );
- }
- if ( columns == null && !property.isAnnotationPresent( ManyToMany.class ) ) {
- //useful for collection of embedded elements
- columns = Ejb3Column.buildColumnFromAnnotation(
- null, null, nullability, propertyHolder, inferredData, entityBinder.getSecondaryTables(), mappings
- );
- }
-
- if ( nullability == Nullability.FORCED_NOT_NULL ) {
- //force columns to not null
- for ( Ejb3Column col : columns ) {
- col.forceNotNull();
- }
- }
-
- final XClass returnedClass = inferredData.getClassOrElement();
- if ( !entityBinder.isIgnoreIdAnnotations() &&
- ( property.isAnnotationPresent( Id.class )
- || property.isAnnotationPresent( EmbeddedId.class ) ) ) {
- if ( isIdentifierMapper ) {
- throw new AnnotationException(
- "@IdClass class should not have @Id nor @EmbeddedId properties"
- );
- }
- log.debug( inferredData.getPropertyName() + " is an id" );
- //clone classGenerator and override with local values
- HashMap<String, IdGenerator> localGenerators = (HashMap<String, IdGenerator>) classGenerators.clone();
- localGenerators.putAll( buildLocalGenerators( property, mappings ) );
-
- //manage composite related metadata
- //guess if its a component and find id data access (property, field etc)
- final boolean isComponent = returnedClass.isAnnotationPresent( Embeddable.class )
- || property.isAnnotationPresent( EmbeddedId.class );
- boolean propertyAnnotated = entityBinder.isPropertyAnnotated( returnedClass );
- String propertyAccessor = entityBinder.getPropertyAccessor( returnedClass );
- //if ( isComponent && embeddableAnn != null && embeddableAnn.access() == AccessType.FIELD ) propertyAccess = false;
-
- GeneratedValue generatedValue = property.getAnnotation( GeneratedValue.class );
- String generatorType = generatedValue != null ?
- generatorType( generatedValue.strategy() ) :
- "assigned";
- String generator = generatedValue != null ?
- generatedValue.generator() :
- BinderHelper.ANNOTATION_STRING_DEFAULT;
- if ( isComponent ) generatorType = "assigned"; //a component must not have any generator
- Type typeAnn = property.getAnnotation( Type.class );
- bindId(
- generatorType,
- generator,
- inferredData,
- columns,
- propertyHolder,
- localGenerators,
- isComponent,
- propertyAnnotated,
- propertyAccessor, entityBinder,
- typeAnn,
- false,
- isIdentifierMapper, mappings
- );
- if ( log.isDebugEnabled() ) {
- log.debug(
- "Bind " + ( isComponent ?
- "@EmbeddedId" :
- "@Id" ) + " on " + inferredData.getPropertyName()
- );
- }
- }
- else if ( property.isAnnotationPresent( Version.class ) ) {
- if ( isIdentifierMapper ) {
- throw new AnnotationException(
- "@IdClass class should not have @Version property"
- );
- }
- if ( !( propertyHolder.getPersistentClass() instanceof RootClass ) ) {
- throw new AnnotationException(
- "Unable to define/override @Version on a subclass: "
- + propertyHolder.getEntityName()
- );
- }
- log.debug( inferredData.getPropertyName() + " is a version property" );
- RootClass rootClass = (RootClass) propertyHolder.getPersistentClass();
- boolean lazy = false;
- PropertyBinder propBinder = new PropertyBinder();
- propBinder.setName( inferredData.getPropertyName() );
- propBinder.setReturnedClassName( inferredData.getTypeName() );
- propBinder.setLazy( lazy );
- propBinder.setPropertyAccessorName( inferredData.getDefaultAccess() );
- propBinder.setColumns( columns );
- propBinder.setHolder( propertyHolder ); //PropertyHolderBuilder.buildPropertyHolder(rootClass)
- propBinder.setProperty( property );
- propBinder.setReturnedClass( inferredData.getPropertyClass() );
-
- propBinder.setMappings( mappings );
- Property prop = propBinder.bind();
- rootClass.setVersion( prop );
- SimpleValue simpleValue = (SimpleValue) prop.getValue();
- if ( !simpleValue.isTypeSpecified() ) simpleValue.setTypeName( "integer" );
- simpleValue.setNullValue( "undefined" );
- rootClass.setOptimisticLockMode( Versioning.OPTIMISTIC_LOCK_VERSION );
- log.debug(
- "Version name: " + rootClass.getVersion().getName() + ", unsavedValue: " + ( (SimpleValue) rootClass
- .getVersion()
- .getValue() ).getNullValue()
- );
- }
- else if ( property.isAnnotationPresent( ManyToOne.class ) ) {
- ManyToOne ann = property.getAnnotation( ManyToOne.class );
-
- //check validity
- if ( property.isAnnotationPresent( Column.class )
- || property.isAnnotationPresent( Columns.class ) ) {
- throw new AnnotationException( "@Column(s) not allowed on a @ManyToOne property: "
- + StringHelper.qualify( propertyHolder.getPath(), inferredData.getPropertyName() ) );
- }
-
- Cascade hibernateCascade = property.getAnnotation( Cascade.class );
- NotFound notFound = property.getAnnotation( NotFound.class );
- boolean ignoreNotFound = notFound != null && notFound.action().equals( NotFoundAction.IGNORE );
- OnDelete onDeleteAnn = property.getAnnotation( OnDelete.class );
- boolean onDeleteCascade = onDeleteAnn != null && OnDeleteAction.CASCADE.equals( onDeleteAnn.action() );
- JoinTable assocTable = property.getAnnotation( JoinTable.class );
- if ( assocTable != null ) {
- Join join = propertyHolder.addJoin( assocTable, false );
- for ( Ejb3JoinColumn joinColumn : joinColumns ) {
- joinColumn.setSecondaryTableName( join.getTable().getName() );
- }
- }
- bindManyToOne(
- getCascadeStrategy( ann.cascade(), hibernateCascade ),
- joinColumns,
- ann.optional(),
- ignoreNotFound, onDeleteCascade,
- mappings.getReflectionManager().toXClass( ann.targetEntity() ),
- propertyHolder,
- inferredData, false, isIdentifierMapper, inSecondPass, mappings
- );
- }
- else if ( property.isAnnotationPresent( OneToOne.class ) ) {
- OneToOne ann = property.getAnnotation( OneToOne.class );
-
- //check validity
- if ( property.isAnnotationPresent( Column.class )
- || property.isAnnotationPresent( Columns.class ) ) {
- throw new AnnotationException( "@Column(s) not allowed on a @OneToOne property: "
- + StringHelper.qualify( propertyHolder.getPath(), inferredData.getPropertyName() ) );
- }
-
- //FIXME support a proper PKJCs
- boolean trueOneToOne = property.isAnnotationPresent( PrimaryKeyJoinColumn.class )
- || property.isAnnotationPresent( PrimaryKeyJoinColumns.class );
- Cascade hibernateCascade = property.getAnnotation( Cascade.class );
- NotFound notFound = property.getAnnotation( NotFound.class );
- boolean ignoreNotFound = notFound != null && notFound.action().equals( NotFoundAction.IGNORE );
- OnDelete onDeleteAnn = property.getAnnotation( OnDelete.class );
- boolean onDeleteCascade = onDeleteAnn != null && OnDeleteAction.CASCADE.equals( onDeleteAnn.action() );
- JoinTable assocTable = property.getAnnotation( JoinTable.class );
- if ( assocTable != null ) {
- Join join = propertyHolder.addJoin( assocTable, false );
- for ( Ejb3JoinColumn joinColumn : joinColumns ) {
- joinColumn.setSecondaryTableName( join.getTable().getName() );
- }
- }
- bindOneToOne(
- getCascadeStrategy( ann.cascade(), hibernateCascade ),
- joinColumns,
- ann.optional(),
- getFetchMode( ann.fetch() ),
- ignoreNotFound, onDeleteCascade,
- mappings.getReflectionManager().toXClass( ann.targetEntity() ),
- propertyHolder,
- inferredData, ann.mappedBy(), trueOneToOne, isIdentifierMapper, inSecondPass, mappings
- );
- }
- else if ( property.isAnnotationPresent( OneToMany.class )
- || property.isAnnotationPresent( ManyToMany.class )
- || property.isAnnotationPresent( CollectionOfElements.class ) ) {
- OneToMany oneToManyAnn = property.getAnnotation( OneToMany.class );
- ManyToMany manyToManyAnn = property.getAnnotation( ManyToMany.class );
- CollectionOfElements collectionOfElementsAnn = property.getAnnotation( CollectionOfElements.class );
- org.hibernate.annotations.IndexColumn indexAnn = property.getAnnotation(
- org.hibernate.annotations.IndexColumn.class
- );
- JoinTable assocTable = property.getAnnotation( JoinTable.class );
-
- IndexColumn indexColumn = IndexColumn.buildColumnFromAnnotation(
- indexAnn, propertyHolder, inferredData, mappings
- );
- CollectionBinder collectionBinder = CollectionBinder.getCollectionBinder(
- propertyHolder.getEntityName(),
- property,
- !indexColumn.isImplicit()
- );
- collectionBinder.setIndexColumn( indexColumn );
- MapKey mapKeyAnn = property.getAnnotation( MapKey.class );
- collectionBinder.setMapKey( mapKeyAnn );
- collectionBinder.setPropertyName( inferredData.getPropertyName() );
- BatchSize batchAnn = property.getAnnotation( BatchSize.class );
- collectionBinder.setBatchSize( batchAnn );
- javax.persistence.OrderBy ejb3OrderByAnn = property.getAnnotation( javax.persistence.OrderBy.class );
- OrderBy orderByAnn = property.getAnnotation( OrderBy.class );
- collectionBinder.setEjb3OrderBy( ejb3OrderByAnn );
- collectionBinder.setSqlOrderBy( orderByAnn );
- Sort sortAnn = property.getAnnotation( Sort.class );
- collectionBinder.setSort( sortAnn );
- Cache cachAnn = property.getAnnotation( Cache.class );
- collectionBinder.setCache( cachAnn );
- collectionBinder.setPropertyHolder( propertyHolder );
- Cascade hibernateCascade = property.getAnnotation( Cascade.class );
- NotFound notFound = property.getAnnotation( NotFound.class );
- boolean ignoreNotFound = notFound != null && notFound.action().equals( NotFoundAction.IGNORE );
- collectionBinder.setIgnoreNotFound( ignoreNotFound );
- collectionBinder.setCollectionType( inferredData.getProperty().getElementClass() );
- collectionBinder.setMappings( mappings );
- collectionBinder.setPropertyAccessorName( inferredData.getDefaultAccess() );
-
- Ejb3Column[] elementColumns = null;
- PropertyData virtualProperty = new WrappedInferredData( inferredData, "element" );
- if ( property.isAnnotationPresent( Column.class ) || property.isAnnotationPresent(
- Formula.class
- ) ) {
- Column ann = property.getAnnotation( Column.class );
- Formula formulaAnn = property.getAnnotation( Formula.class );
- elementColumns = Ejb3Column.buildColumnFromAnnotation(
- new Column[]{ann},
- formulaAnn,
- nullability,
- propertyHolder,
- virtualProperty,
- entityBinder.getSecondaryTables(),
- mappings
- );
- }
- else if ( property.isAnnotationPresent( Columns.class ) ) {
- Columns anns = property.getAnnotation( Columns.class );
- elementColumns = Ejb3Column.buildColumnFromAnnotation(
- anns.columns(), null, nullability, propertyHolder, virtualProperty,
- entityBinder.getSecondaryTables(), mappings
- );
- }
- else {
- elementColumns = Ejb3Column.buildColumnFromAnnotation(
- null,
- null,
- nullability,
- propertyHolder,
- virtualProperty,
- entityBinder.getSecondaryTables(),
- mappings
- );
- }
-
- org.hibernate.annotations.MapKey hibMapKeyAnn = property.getAnnotation(
- org.hibernate.annotations.MapKey.class
- );
- PropertyData mapKeyVirtualProperty = new WrappedInferredData( inferredData, "mapkey" );
- Ejb3Column[] mapColumns = Ejb3Column.buildColumnFromAnnotation(
- hibMapKeyAnn != null && hibMapKeyAnn.columns().length > 0 ?
- hibMapKeyAnn.columns() :
- null,
- null,
- Nullability.FORCED_NOT_NULL,
- propertyHolder,
- mapKeyVirtualProperty,
- entityBinder.getSecondaryTables(),
- mappings
- );
- collectionBinder.setMapKeyColumns( mapColumns );
-
- MapKeyManyToMany mapKeyManyToMany = property.getAnnotation( MapKeyManyToMany.class );
- Ejb3JoinColumn[] mapJoinColumns = Ejb3JoinColumn.buildJoinColumns(
- mapKeyManyToMany != null ?
- mapKeyManyToMany.joinColumns() :
- null,
- null, entityBinder.getSecondaryTables(),
- propertyHolder, mapKeyVirtualProperty.getPropertyName(), mappings
- );
- collectionBinder.setMapKeyManyToManyColumns( mapJoinColumns );
-
- //potential element
- collectionBinder.setEmbedded( property.isAnnotationPresent( Embedded.class ) );
- collectionBinder.setElementColumns( elementColumns );
- collectionBinder.setProperty( property );
-
- if ( oneToManyAnn != null && manyToManyAnn != null ) {
- throw new AnnotationException(
- "@OneToMany and @ManyToMany on the same property is not allowed: "
- + propertyHolder.getEntityName() + "." + inferredData.getPropertyName()
- );
- }
- String mappedBy = null;
- if ( oneToManyAnn != null ) {
- for ( Ejb3JoinColumn column : joinColumns ) {
- if ( column.isSecondary() ) {
- throw new NotYetImplementedException( "Collections having FK in secondary table" );
- }
- }
- collectionBinder.setFkJoinColumns( joinColumns );
- mappedBy = oneToManyAnn.mappedBy();
- collectionBinder.setTargetEntity(
- mappings.getReflectionManager().toXClass( oneToManyAnn.targetEntity() )
- );
- collectionBinder.setCascadeStrategy( getCascadeStrategy( oneToManyAnn.cascade(), hibernateCascade ) );
- collectionBinder.setOneToMany( true );
- }
- else if ( collectionOfElementsAnn != null ) {
- for ( Ejb3JoinColumn column : joinColumns ) {
- if ( column.isSecondary() ) {
- throw new NotYetImplementedException( "Collections having FK in secondary table" );
- }
- }
- collectionBinder.setFkJoinColumns( joinColumns );
- mappedBy = "";
- collectionBinder.setTargetEntity(
- mappings.getReflectionManager().toXClass( collectionOfElementsAnn.targetElement() )
- );
- //collectionBinder.setCascadeStrategy( getCascadeStrategy( embeddedCollectionAnn.cascade(), hibernateCascade ) );
- collectionBinder.setOneToMany( true );
- }
- else if ( manyToManyAnn != null ) {
- mappedBy = manyToManyAnn.mappedBy();
- collectionBinder.setTargetEntity(
- mappings.getReflectionManager().toXClass( manyToManyAnn.targetEntity() )
- );
- collectionBinder.setCascadeStrategy( getCascadeStrategy( manyToManyAnn.cascade(), hibernateCascade ) );
- collectionBinder.setOneToMany( false );
- }
- collectionBinder.setMappedBy( mappedBy );
- bindJoinedTableAssociation(
- assocTable, mappings, entityBinder, collectionBinder, propertyHolder, inferredData, mappedBy
- );
-
- OnDelete onDeleteAnn = property.getAnnotation( OnDelete.class );
- boolean onDeleteCascade = onDeleteAnn != null && OnDeleteAction.CASCADE.equals( onDeleteAnn.action() );
- collectionBinder.setCascadeDeleteEnabled( onDeleteCascade );
- if ( isIdentifierMapper ) {
- collectionBinder.setInsertable( false );
- collectionBinder.setUpdatable( false );
- }
- if ( property.isAnnotationPresent( CollectionId.class ) ) { //do not compute the generators unless necessary
- HashMap<String, IdGenerator> localGenerators = (HashMap<String, IdGenerator>) classGenerators.clone();
- localGenerators.putAll( buildLocalGenerators( property, mappings ) );
- collectionBinder.setLocalGenerators( localGenerators );
-
- }
- collectionBinder.bind();
-
- }
- else {
- //define whether the type is a component or not
- boolean isComponent = false;
- Embeddable embeddableAnn = (Embeddable) returnedClass.getAnnotation( Embeddable.class );
- Embedded embeddedAnn = (Embedded) property.getAnnotation( Embedded.class );
- isComponent = embeddedAnn != null || embeddableAnn != null;
-
- if ( isComponent ) {
- //process component object
- //boolean propertyAccess = true;
- //if ( embeddableAnn != null && embeddableAnn.access() == AccessType.FIELD ) propertyAccess = false;
- boolean propertyAnnotated = entityBinder.isPropertyAnnotated( property );
- String propertyAccessor = entityBinder.getPropertyAccessor( property );
- bindComponent(
- inferredData, propertyHolder, propertyAnnotated, propertyAccessor, entityBinder,
- isIdentifierMapper,
- mappings, isComponentEmbedded
- );
- }
- else {
- //provide the basic property mapping
- boolean optional = true;
- boolean lazy = false;
- if ( property.isAnnotationPresent( Basic.class ) ) {
- Basic ann = property.getAnnotation( Basic.class );
- optional = ann.optional();
- lazy = ann.fetch() == FetchType.LAZY;
- }
- //implicit type will check basic types and Serializable classes
- if ( !optional && nullability != Nullability.FORCED_NULL ) {
- //force columns to not null
- for ( Ejb3Column col : columns ) {
- col.forceNotNull();
- }
- }
-
- PropertyBinder propBinder = new PropertyBinder();
- propBinder.setName( inferredData.getPropertyName() );
- propBinder.setReturnedClassName( inferredData.getTypeName() );
- propBinder.setLazy( lazy );
- propBinder.setPropertyAccessorName( inferredData.getDefaultAccess() );
- propBinder.setColumns( columns );
- propBinder.setHolder( propertyHolder );
- propBinder.setProperty( property );
- propBinder.setReturnedClass( inferredData.getPropertyClass() );
- propBinder.setMappings( mappings );
- if ( isIdentifierMapper ) {
- propBinder.setInsertable( false );
- propBinder.setUpdatable( false );
- }
- propBinder.bind();
- }
- }
- //init index
- //process indexes after everything: in second pass, many to one has to be done before indexes
- Index index = property.getAnnotation( Index.class );
- if ( index != null ) {
- if ( joinColumns != null ) {
- for ( Ejb3Column column : joinColumns ) {
- column.addIndex( index, inSecondPass );
- }
- }
- else {
- for ( Ejb3Column column : columns ) {
- column.addIndex( index, inSecondPass );
- }
- }
- }
- }
-
- //TODO move that to collection binder?
- private static void bindJoinedTableAssociation(
- JoinTable joinTableAnn, ExtendedMappings mappings, EntityBinder entityBinder,
- CollectionBinder collectionBinder, PropertyHolder propertyHolder, PropertyData inferredData,
- String mappedBy
- ) {
- TableBinder associationTableBinder = new TableBinder();
- JoinColumn[] annJoins;
- JoinColumn[] annInverseJoins;
- if ( joinTableAnn != null ) {
- collectionBinder.setExplicitAssociationTable( true );
- if ( !BinderHelper.isDefault( joinTableAnn.schema() ) )
- associationTableBinder.setSchema( joinTableAnn.schema() );
- if ( !BinderHelper.isDefault( joinTableAnn.catalog() ) )
- associationTableBinder.setCatalog( joinTableAnn.catalog() );
- if ( !BinderHelper.isDefault( joinTableAnn.name() ) ) associationTableBinder.setName( joinTableAnn.name() );
- associationTableBinder.setUniqueConstraints( joinTableAnn.uniqueConstraints() );
-
- //set check constaint in the second pass
-
- JoinColumn[] joins = joinTableAnn.joinColumns();
-
- if ( joins.length == 0 ) {
- annJoins = null;
- }
- else {
- annJoins = joins;
- }
-
- JoinColumn[] inverseJoins = joinTableAnn.inverseJoinColumns();
-
- if ( inverseJoins.length == 0 ) {
- annInverseJoins = null;
- }
- else {
- annInverseJoins = inverseJoins;
- }
- }
- else {
- annJoins = null;
- annInverseJoins = null;
- }
- Ejb3JoinColumn[] joinColumns = Ejb3JoinColumn.buildJoinTableJoinColumns(
- annJoins, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappedBy,
- mappings
- );
- Ejb3JoinColumn[] inverseJoinColumns = Ejb3JoinColumn.buildJoinTableJoinColumns(
- annInverseJoins, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(),
- mappedBy, mappings
- );
- associationTableBinder.setMappings( mappings );
- collectionBinder.setTableBinder( associationTableBinder );
- collectionBinder.setJoinColumns( joinColumns );
- collectionBinder.setInverseJoinColumns( inverseJoinColumns );
- }
-
- private static void bindComponent(
- PropertyData inferredData,
- PropertyHolder propertyHolder,
- boolean propertyAnnotated,
- String propertyAccessor, EntityBinder entityBinder,
- boolean isIdentifierMapper,
- ExtendedMappings mappings, boolean isComponentEmbedded
- ) {
- Component comp = fillComponent(
- propertyHolder, inferredData, propertyAnnotated, propertyAccessor, true, entityBinder,
- isComponentEmbedded, isIdentifierMapper,
- false, mappings
- );
- XProperty property = inferredData.getProperty();
- setupComponentTuplizer( property, comp );
-
- PropertyBinder binder = new PropertyBinder();
- binder.setName( inferredData.getPropertyName() );
- binder.setValue( comp );
- binder.setProperty( inferredData.getProperty() );
- binder.setPropertyAccessorName( inferredData.getDefaultAccess() );
- Property prop = binder.make();
- propertyHolder.addProperty( prop );
- }
-
- public static Component fillComponent(
- PropertyHolder propertyHolder, PropertyData inferredData,
- boolean propertyAnnotated, String propertyAccessor, boolean isNullable,
- EntityBinder entityBinder,
- boolean isComponentEmbedded, boolean isIdentifierMapper, boolean inSecondPass, ExtendedMappings mappings
- ) {
- /**
- * inSecondPass can only be used to apply right away the second pass of a composite-element
- * Because it's a value type, there is no bidirectional association, hence second pass
- * ordering does not matter
- */
- Component comp = new Component( propertyHolder.getPersistentClass() );
- comp.setEmbedded( isComponentEmbedded );
- //yuk
- comp.setTable( propertyHolder.getTable() );
- if ( !isIdentifierMapper ) {
- comp.setComponentClassName( inferredData.getClassOrElementName() );
- }
- else {
- comp.setComponentClassName( comp.getOwner().getClassName() );
- }
- comp.setNodeName( inferredData.getPropertyName() );
- String subpath = StringHelper.qualify( propertyHolder.getPath(), inferredData.getPropertyName() );
- log.debug( "Binding component with path: " + subpath );
- PropertyHolder subHolder = PropertyHolderBuilder.buildPropertyHolder(
- comp, subpath,
- inferredData, propertyHolder, mappings
- );
- List<PropertyData> classElements = new ArrayList<PropertyData>();
- XClass returnedClassOrElement = inferredData.getClassOrElement();
- addElementsOfAClass(
- classElements,
- subHolder,
- propertyAnnotated,
- propertyAccessor, returnedClassOrElement, mappings
- );
- //add elements of the embeddable superclass
- XClass superClass = inferredData.getPropertyClass().getSuperclass();
- while ( superClass != null && superClass.isAnnotationPresent( MappedSuperclass.class ) ) {
- //FIXME: proper support of typevariables incl var resolved at upper levels
- addElementsOfAClass(
- classElements,
- subHolder,
- entityBinder.isPropertyAnnotated( superClass ),
- propertyAccessor, superClass, mappings
- );
- superClass = superClass.getSuperclass();
- }
- for ( PropertyData propertyAnnotatedElement : classElements ) {
- processElementAnnotations(
- subHolder, isNullable ?
- Nullability.NO_CONSTRAINT :
- Nullability.FORCED_NOT_NULL,
- propertyAnnotatedElement.getProperty(), propertyAnnotatedElement,
- new HashMap<String, IdGenerator>(), entityBinder, isIdentifierMapper, isComponentEmbedded,
- inSecondPass, mappings
- );
- }
- return comp;
- }
-
- private static void bindId(
- String generatorType, String generatorName,
- PropertyData inferredData, Ejb3Column[] columns, PropertyHolder propertyHolder,
- Map<String, IdGenerator> localGenerators,
- boolean isComposite,
- boolean isPropertyAnnotated,
- String propertyAccessor, EntityBinder entityBinder, Type typeAnn, boolean isEmbedded,
- boolean isIdentifierMapper, ExtendedMappings mappings
- ) {
- /*
- * Fill simple value and property since and Id is a property
- */
- PersistentClass persistentClass = propertyHolder.getPersistentClass();
- if ( !( persistentClass instanceof RootClass ) ) {
- throw new AnnotationException(
- "Unable to define/override @Id(s) on a subclass: "
- + propertyHolder.getEntityName()
- );
- }
- RootClass rootClass = (RootClass) persistentClass;
- String persistentClassName = rootClass == null ?
- null :
- rootClass.getClassName();
- SimpleValue id;
- if ( isComposite ) {
- id = fillComponent(
- propertyHolder, inferredData, isPropertyAnnotated, propertyAccessor,
- false, entityBinder, isEmbedded, isIdentifierMapper, false, mappings
- );
- Component componentId = (Component) id;
- componentId.setKey( true );
- if ( componentId.getPropertySpan() == 0 ) {
- throw new AnnotationException( componentId.getComponentClassName() + " has no persistent id property" );
- }
- //tuplizers
- XProperty property = inferredData.getProperty();
- setupComponentTuplizer( property, componentId );
- }
- else {
- for ( Ejb3Column column : columns ) {
- column.forceNotNull(); //this is an id
- }
- SimpleValueBinder value = new SimpleValueBinder();
- value.setPropertyName( inferredData.getPropertyName() );
- value.setReturnedClassName( inferredData.getTypeName() );
- value.setColumns( columns );
- value.setPersistentClassName( persistentClassName );
- value.setMappings( mappings );
- value.setExplicitType( typeAnn );
- id = value.make();
- }
- rootClass.setIdentifier( id );
- BinderHelper.makeIdGenerator( id, generatorType, generatorName, mappings, localGenerators );
- if ( isEmbedded ) {
- rootClass.setEmbeddedIdentifier( inferredData.getPropertyClass() == null );
- }
- else {
- PropertyBinder binder = new PropertyBinder();
- binder.setName( inferredData.getPropertyName() );
- binder.setValue( id );
- binder.setPropertyAccessorName( inferredData.getDefaultAccess() );
- binder.setProperty( inferredData.getProperty() );
- Property prop = binder.make();
- rootClass.setIdentifierProperty( prop );
- }
- }
-
- private static void setupComponentTuplizer(XProperty property, Component component) {
- if ( property == null ) return;
- if ( property.isAnnotationPresent( Tuplizers.class ) ) {
- for ( Tuplizer tuplizer : property.getAnnotation( Tuplizers.class ).value() ) {
- EntityMode mode = EntityMode.parse( tuplizer.entityMode() );
- component.addTuplizer( mode, tuplizer.impl().getName() );
- }
- }
- if ( property.isAnnotationPresent( Tuplizer.class ) ) {
- Tuplizer tuplizer = property.getAnnotation( Tuplizer.class );
- EntityMode mode = EntityMode.parse( tuplizer.entityMode() );
- component.addTuplizer( mode, tuplizer.impl().getName() );
- }
- }
-
- private static void bindManyToOne(
- String cascadeStrategy, Ejb3JoinColumn[] columns, boolean optional,
- boolean ignoreNotFound, boolean cascadeOnDelete,
- XClass targetEntity, PropertyHolder propertyHolder,
- PropertyData inferredData, boolean unique, boolean isIdentifierMapper, boolean inSecondPass,
- ExtendedMappings mappings
- ) {
- //All FK columns should be in the same table
- org.hibernate.mapping.ManyToOne value = new org.hibernate.mapping.ManyToOne( columns[0].getTable() );
- if ( isDefault( targetEntity, mappings ) ) {
- value.setReferencedEntityName( inferredData.getClassOrElementName() );
- }
- else {
- value.setReferencedEntityName( targetEntity.getName() );
- }
- defineFetchingStrategy( value, inferredData.getProperty() );
- //value.setFetchMode( fetchMode );
- value.setIgnoreNotFound( ignoreNotFound );
- value.setCascadeDeleteEnabled( cascadeOnDelete );
- //value.setLazy( fetchMode != FetchMode.JOIN );
- if ( !optional ) {
- for ( Ejb3JoinColumn column : columns ) {
- column.setNullable( false );
- }
- }
- value.setTypeName( inferredData.getClassOrElementName() );
- final String propertyName = inferredData.getPropertyName();
- value.setTypeUsingReflection( propertyHolder.getClassName(), propertyName );
-
- ForeignKey fk = inferredData.getProperty().getAnnotation( ForeignKey.class );
- String fkName = fk != null ?
- fk.name() :
- "";
- if ( !BinderHelper.isDefault( fkName ) ) value.setForeignKeyName( fkName );
-
- String path = propertyHolder.getPath() + "." + propertyName;
- FkSecondPass secondPass = new FkSecondPass(
- value, columns,
- !optional && unique, //cannot have nullabe and unique on certain DBs like Derby
- propertyHolder.getEntityOwnerClassName(),
- path, mappings
- );
- if ( inSecondPass ) {
- secondPass.doSecondPass( mappings.getClasses() );
- }
- else {
- mappings.addSecondPass(
- secondPass
- );
- }
- Ejb3Column.checkPropertyConsistency( columns, propertyHolder.getEntityName() + propertyName );
- PropertyBinder binder = new PropertyBinder();
- binder.setName( propertyName );
- binder.setValue( value );
- //binder.setCascade(cascadeStrategy);
- if ( isIdentifierMapper ) {
- binder.setInsertable( false );
- binder.setInsertable( false );
- }
- else {
- binder.setInsertable( columns[0].isInsertable() );
- binder.setUpdatable( columns[0].isUpdatable() );
- }
- binder.setPropertyAccessorName( inferredData.getDefaultAccess() );
- binder.setCascade( cascadeStrategy );
- Property prop = binder.make();
- //composite FK columns are in the same table so its OK
- propertyHolder.addProperty( prop, columns );
- }
-
- protected static void defineFetchingStrategy(ToOne toOne, XProperty property) {
- LazyToOne lazy = property.getAnnotation( LazyToOne.class );
- Fetch fetch = property.getAnnotation( Fetch.class );
- ManyToOne manyToOne = property.getAnnotation( ManyToOne.class );
- OneToOne oneToOne = property.getAnnotation( OneToOne.class );
- FetchType fetchType;
- if ( manyToOne != null ) {
- fetchType = manyToOne.fetch();
- }
- else if ( oneToOne != null ) {
- fetchType = oneToOne.fetch();
- }
- else {
- throw new AssertionFailure(
- "Define fetch strategy on a property not annotated with @OneToMany nor @OneToOne"
- );
- }
- if ( lazy != null ) {
- toOne.setLazy( !( lazy.value() == LazyToOneOption.FALSE ) );
- toOne.setUnwrapProxy( ( lazy.value() == LazyToOneOption.NO_PROXY ) );
- }
- else {
- toOne.setLazy( fetchType == FetchType.LAZY );
- toOne.setUnwrapProxy( false );
- }
- if ( fetch != null ) {
- if ( fetch.value() == org.hibernate.annotations.FetchMode.JOIN ) {
- toOne.setFetchMode( FetchMode.JOIN );
- toOne.setLazy( false );
- toOne.setUnwrapProxy( false );
- }
- else if ( fetch.value() == org.hibernate.annotations.FetchMode.SELECT ) {
- toOne.setFetchMode( FetchMode.SELECT );
- }
- else if ( fetch.value() == org.hibernate.annotations.FetchMode.SUBSELECT ) {
- throw new AnnotationException( "Use of FetchMode.SUBSELECT not allowed on ToOne associations" );
- }
- else {
- throw new AssertionFailure( "Unknown FetchMode: " + fetch.value() );
- }
- }
- else {
- toOne.setFetchMode( getFetchMode( fetchType ) );
- }
- }
-
- private static void bindOneToOne(
- String cascadeStrategy,
- Ejb3JoinColumn[] joinColumns,
- boolean optional,
- FetchMode fetchMode,
- boolean ignoreNotFound,
- boolean cascadeOnDelete,
- XClass targetEntity,
- PropertyHolder propertyHolder,
- PropertyData inferredData, String mappedBy,
- boolean trueOneToOne,
- boolean isIdentifierMapper, boolean inSecondPass, ExtendedMappings mappings
- ) {
- //column.getTable() => persistentClass.getTable()
- final String propertyName = inferredData.getPropertyName();
- log.debug( "Fetching " + propertyName + " with " + fetchMode );
- boolean mapToPK = true;
- if ( !trueOneToOne ) {
- //try to find a hidden true one to one (FK == PK columns)
- Iterator idColumns = propertyHolder.getIdentifier().getColumnIterator();
- List<String> idColumnNames = new ArrayList<String>();
- org.hibernate.mapping.Column currentColumn;
- while ( idColumns.hasNext() ) {
- currentColumn = (org.hibernate.mapping.Column) idColumns.next();
- idColumnNames.add( currentColumn.getName() );
- }
- for ( Ejb3JoinColumn col : joinColumns ) {
- if ( !idColumnNames.contains( col.getMappingColumn().getName() ) ) {
- mapToPK = false;
- break;
- }
- }
- }
- if ( trueOneToOne || mapToPK || !BinderHelper.isDefault( mappedBy ) ) {
- //is a true one-to-one
- //FIXME referencedColumnName ignored => ordering may fail.
- OneToOneSecondPass secondPass = new OneToOneSecondPass(
- mappedBy,
- propertyHolder.getEntityName(),
- propertyName,
- propertyHolder, inferredData, targetEntity, ignoreNotFound, cascadeOnDelete,
- optional, cascadeStrategy, joinColumns, mappings
- );
- if ( inSecondPass ) {
- secondPass.doSecondPass( mappings.getClasses() );
- }
- else {
- mappings.addSecondPass(
- secondPass, BinderHelper.isDefault( mappedBy )
- );
- }
- }
- else {
- //has a FK on the table
- bindManyToOne(
- cascadeStrategy, joinColumns, optional, ignoreNotFound, cascadeOnDelete,
- targetEntity,
- propertyHolder, inferredData, true, isIdentifierMapper, inSecondPass, mappings
- );
- }
- }
-
- private static String generatorType(GenerationType generatorEnum) {
- switch (generatorEnum) {
- case IDENTITY:
- return "identity";
- case AUTO:
- return "native";
- case TABLE:
- return MultipleHiLoPerTableGenerator.class.getName();
- case SEQUENCE:
- return "seqhilo";
- }
- throw new AssertionFailure( "Unknown GeneratorType: " + generatorEnum );
- }
-
- private static EnumSet<CascadeType> convertToHibernateCascadeType(javax.persistence.CascadeType[] ejbCascades) {
- EnumSet<CascadeType> hibernateCascadeSet = EnumSet.noneOf( CascadeType.class );
- if ( ejbCascades != null && ejbCascades.length > 0 ) {
- for ( javax.persistence.CascadeType cascade : ejbCascades ) {
- switch (cascade) {
- case ALL:
- hibernateCascadeSet.add( CascadeType.ALL );
- break;
- case PERSIST:
- hibernateCascadeSet.add( CascadeType.PERSIST );
- break;
- case MERGE:
- hibernateCascadeSet.add( CascadeType.MERGE );
- break;
- case REMOVE:
- hibernateCascadeSet.add( CascadeType.REMOVE );
- break;
- case REFRESH:
- hibernateCascadeSet.add( CascadeType.REFRESH );
- break;
- }
- }
- }
-
- return hibernateCascadeSet;
- }
-
- private static String getCascadeStrategy(
- javax.persistence.CascadeType[] ejbCascades, Cascade hibernateCascadeAnnotation
- ) {
- EnumSet<CascadeType> hibernateCascadeSet = convertToHibernateCascadeType( ejbCascades );
- CascadeType[] hibernateCascades = hibernateCascadeAnnotation == null ?
- null :
- hibernateCascadeAnnotation.value();
-
- if ( hibernateCascades != null && hibernateCascades.length > 0 ) {
- for ( CascadeType cascadeType : hibernateCascades ) {
- hibernateCascadeSet.add( cascadeType );
- }
- }
-
- StringBuilder cascade = new StringBuilder();
- Iterator<CascadeType> cascadeType = hibernateCascadeSet.iterator();
- while ( cascadeType.hasNext() ) {
- switch (cascadeType.next()) {
- case ALL:
- cascade.append( "," ).append( "all" );
- break;
- case SAVE_UPDATE:
- cascade.append( "," ).append( "save-update" );
- break;
- case PERSIST:
- cascade.append( "," ).append( "persist" );
- break;
- case MERGE:
- cascade.append( "," ).append( "merge" );
- break;
- case LOCK:
- cascade.append( "," ).append( "lock" );
- break;
- case REFRESH:
- cascade.append( "," ).append( "refresh" );
- break;
- case REPLICATE:
- cascade.append( "," ).append( "replicate" );
- break;
- case EVICT:
- cascade.append( "," ).append( "evict" );
- break;
- case DELETE:
- cascade.append( "," ).append( "delete" );
- break;
- case DELETE_ORPHAN:
- cascade.append( "," ).append( "delete-orphan" );
- break;
- case REMOVE:
- cascade.append( "," ).append( "delete" );
- break;
- }
- }
- return cascade.length() > 0 ?
- cascade.substring( 1 ) :
- "none";
- }
-
- public static FetchMode getFetchMode(FetchType fetch) {
- if ( fetch == FetchType.EAGER ) {
- return FetchMode.JOIN;
- }
- else {
- return FetchMode.SELECT;
- }
- }
-
- private static HashMap<String, IdGenerator> buildLocalGenerators(XAnnotatedElement annElt, Mappings mappings) {
- HashMap<String, IdGenerator> generators = new HashMap<String, IdGenerator>();
- TableGenerator tabGen = annElt.getAnnotation( TableGenerator.class );
- SequenceGenerator seqGen = annElt.getAnnotation( SequenceGenerator.class );
- GenericGenerator genGen = annElt.getAnnotation( GenericGenerator.class );
- if ( tabGen != null ) {
- IdGenerator idGen = buildIdGenerator( tabGen, mappings );
- generators.put( idGen.getName(), idGen );
- }
- if ( seqGen != null ) {
- IdGenerator idGen = buildIdGenerator( seqGen, mappings );
- generators.put( idGen.getName(), idGen );
- }
- if ( genGen != null ) {
- IdGenerator idGen = buildIdGenerator( genGen, mappings );
- generators.put( idGen.getName(), idGen );
- }
- return generators;
- }
-
- public static boolean isDefault(XClass clazz, ExtendedMappings mappings) {
- return mappings.getReflectionManager().equals( clazz, void.class );
- }
-
- public static Map<XClass, InheritanceState> buildInheritanceStates(
- List<XClass> orderedClasses, ReflectionManager reflectionManager
- ) {
- Map<XClass, InheritanceState> inheritanceStatePerClass = new HashMap<XClass, InheritanceState>(
- orderedClasses.size()
- );
- for ( XClass clazz : orderedClasses ) {
- InheritanceState superclassState = InheritanceState.getSuperclassInheritanceState(
- clazz, inheritanceStatePerClass,
- reflectionManager
- );
- InheritanceState state = new InheritanceState( clazz );
- if ( superclassState != null ) {
- //the classes are ordered thus preventing an NPE
- //FIXME if an entity has subclasses annotated @MappedSperclass wo sub @Entity this is wrong
- superclassState.hasSons = true;
- InheritanceState superEntityState = InheritanceState.getSuperEntityInheritanceState(
- clazz, inheritanceStatePerClass,
- reflectionManager
- );
- state.hasParents = superEntityState != null;
- final boolean nonDefault = state.type != null && !InheritanceType.SINGLE_TABLE.equals( state.type );
- if ( superclassState.type != null ) {
- final boolean mixingStrategy = state.type != null && !state.type.equals( superclassState.type );
- if ( nonDefault && mixingStrategy ) {
- log.warn(
- "Mixing inheritance strategy in a entity hierarchy is not allowed, ignoring sub strategy in: " + clazz
- .getName()
- );
- }
- state.type = superclassState.type;
- }
- }
- inheritanceStatePerClass.put( clazz, state );
- }
- return inheritanceStatePerClass;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,2172 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Collections;
+import java.util.Comparator;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.MapKey;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.PrimaryKeyJoinColumns;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.SqlResultSetMapping;
+import javax.persistence.SqlResultSetMappings;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.FetchMode;
+import org.hibernate.MappingException;
+import org.hibernate.EntityMode;
+import org.hibernate.annotations.AccessType;
+import org.hibernate.annotations.BatchSize;
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.Cascade;
+import org.hibernate.annotations.CascadeType;
+import org.hibernate.annotations.Check;
+import org.hibernate.annotations.CollectionId;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.Columns;
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.FilterDefs;
+import org.hibernate.annotations.Filters;
+import org.hibernate.annotations.ForeignKey;
+import org.hibernate.annotations.Formula;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.LazyToOne;
+import org.hibernate.annotations.LazyToOneOption;
+import org.hibernate.annotations.MapKeyManyToMany;
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+import org.hibernate.annotations.OnDelete;
+import org.hibernate.annotations.OnDeleteAction;
+import org.hibernate.annotations.OrderBy;
+import org.hibernate.annotations.ParamDef;
+import org.hibernate.annotations.Parameter;
+import org.hibernate.annotations.Parent;
+import org.hibernate.annotations.Proxy;
+import org.hibernate.annotations.Sort;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.TypeDef;
+import org.hibernate.annotations.TypeDefs;
+import org.hibernate.annotations.Where;
+import org.hibernate.annotations.Index;
+import org.hibernate.annotations.Target;
+import org.hibernate.annotations.Tuplizers;
+import org.hibernate.annotations.Tuplizer;
+import org.hibernate.cfg.annotations.CollectionBinder;
+import org.hibernate.cfg.annotations.EntityBinder;
+import org.hibernate.cfg.annotations.Nullability;
+import org.hibernate.cfg.annotations.PropertyBinder;
+import org.hibernate.cfg.annotations.QueryBinder;
+import org.hibernate.cfg.annotations.SimpleValueBinder;
+import org.hibernate.cfg.annotations.TableBinder;
+import org.hibernate.engine.FilterDefinition;
+import org.hibernate.engine.Versioning;
+import org.hibernate.id.MultipleHiLoPerTableGenerator;
+import org.hibernate.id.PersistentIdentifierGenerator;
+import org.hibernate.id.SequenceHiLoGenerator;
+import org.hibernate.id.TableHiLoGenerator;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.DependantValue;
+import org.hibernate.mapping.IdGenerator;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.JoinedSubclass;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.RootClass;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.SingleTableSubclass;
+import org.hibernate.mapping.Subclass;
+import org.hibernate.mapping.ToOne;
+import org.hibernate.mapping.UnionSubclass;
+import org.hibernate.persister.entity.JoinedSubclassEntityPersister;
+import org.hibernate.persister.entity.SingleTableEntityPersister;
+import org.hibernate.persister.entity.UnionSubclassEntityPersister;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XAnnotatedElement;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XPackage;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.type.TypeFactory;
+import org.hibernate.util.StringHelper;
+
+/**
+ * JSR 175 annotation binder
+ * Will read the annotation from classes, apply the
+ * principles of the EJB3 spec and produces the Hibernate
+ * configuration-time metamodel (the classes in the <tt>mapping</tt>
+ * package)
+ *
+ * @author Emmanuel Bernard
+ */
+public final class AnnotationBinder {
+
+ /*
+ * Some design description
+ * I tried to remove any link to annotation except from the 2 first level of
+ * method call.
+ * It'll enable to:
+ * - facilitate annotation overriding
+ * - mutualize one day xml and annotation binder (probably a dream though)
+ * - split this huge class in smaller mapping oriented classes
+ *
+ * bindSomething usually create the mapping container and is accessed by one of the 2 first level method
+ * makeSomething usually create the mapping container and is accessed by bindSomething[else]
+ * fillSomething take the container into parameter and fill it.
+ *
+ *
+ */
+ private AnnotationBinder() {
+ }
+
+ private static final Log log = LogFactory.getLog( AnnotationBinder.class );
+
+ public static void bindDefaults(ExtendedMappings mappings) {
+ Map defaults = mappings.getReflectionManager().getDefaults();
+ {
+ List<SequenceGenerator> anns = (List<SequenceGenerator>) defaults.get( SequenceGenerator.class );
+ if ( anns != null ) {
+ for ( SequenceGenerator ann : anns ) {
+ IdGenerator idGen = buildIdGenerator( ann, mappings );
+ if ( idGen != null ) mappings.addDefaultGenerator( idGen );
+ }
+ }
+ }
+ {
+ List<TableGenerator> anns = (List<TableGenerator>) defaults.get( TableGenerator.class );
+ if ( anns != null ) {
+ for ( TableGenerator ann : anns ) {
+ IdGenerator idGen = buildIdGenerator( ann, mappings );
+ if ( idGen != null ) mappings.addDefaultGenerator( idGen );
+ }
+ }
+ }
+ {
+ List<NamedQuery> anns = (List<NamedQuery>) defaults.get( NamedQuery.class );
+ if ( anns != null ) {
+ for ( NamedQuery ann : anns ) {
+ QueryBinder.bindQuery( ann, mappings, true );
+ }
+ }
+ }
+ {
+ List<NamedNativeQuery> anns = (List<NamedNativeQuery>) defaults.get( NamedNativeQuery.class );
+ if ( anns != null ) {
+ for ( NamedNativeQuery ann : anns ) {
+ QueryBinder.bindNativeQuery( ann, mappings, true );
+ }
+ }
+ }
+ {
+ List<SqlResultSetMapping> anns = (List<SqlResultSetMapping>) defaults.get( SqlResultSetMapping.class );
+ if ( anns != null ) {
+ for ( SqlResultSetMapping ann : anns ) {
+ QueryBinder.bindSqlResultsetMapping( ann, mappings, true );
+ }
+ }
+ }
+ }
+
+ public static void bindPackage(String packageName, ExtendedMappings mappings) {
+ XPackage pckg = null;
+ try {
+ pckg = mappings.getReflectionManager().packageForName( packageName );
+ }
+ catch (ClassNotFoundException cnf) {
+ log.warn( "Package not found or wo package-info.java: " + packageName );
+ return;
+ }
+ if ( pckg.isAnnotationPresent( SequenceGenerator.class ) ) {
+ SequenceGenerator ann = pckg.getAnnotation( SequenceGenerator.class );
+ IdGenerator idGen = buildIdGenerator( ann, mappings );
+ mappings.addGenerator( idGen );
+ log.debug( "Add sequence generator with name: " + idGen.getName() );
+ }
+ if ( pckg.isAnnotationPresent( TableGenerator.class ) ) {
+ TableGenerator ann = pckg.getAnnotation( TableGenerator.class );
+ IdGenerator idGen = buildIdGenerator( ann, mappings );
+ mappings.addGenerator( idGen );
+
+ }
+ if ( pckg.isAnnotationPresent( GenericGenerator.class ) ) {
+ GenericGenerator ann = pckg.getAnnotation( GenericGenerator.class );
+ IdGenerator idGen = buildIdGenerator( ann, mappings );
+ mappings.addGenerator( idGen );
+ }
+ bindQueries( pckg, mappings );
+ bindFilterDefs( pckg, mappings );
+ bindTypeDefs( pckg, mappings );
+ }
+
+ private static void bindQueries(XAnnotatedElement annotatedElement, ExtendedMappings mappings) {
+ {
+ SqlResultSetMapping ann = annotatedElement.getAnnotation( SqlResultSetMapping.class );
+ QueryBinder.bindSqlResultsetMapping( ann, mappings, false );
+ }
+ {
+ SqlResultSetMappings ann = annotatedElement.getAnnotation( SqlResultSetMappings.class );
+ if ( ann != null ) {
+ for ( SqlResultSetMapping current : ann.value() ) {
+ QueryBinder.bindSqlResultsetMapping( current, mappings, false );
+ }
+ }
+ }
+ {
+ NamedQuery ann = annotatedElement.getAnnotation( NamedQuery.class );
+ QueryBinder.bindQuery( ann, mappings, false );
+ }
+ {
+ org.hibernate.annotations.NamedQuery ann = annotatedElement.getAnnotation(
+ org.hibernate.annotations.NamedQuery.class
+ );
+ QueryBinder.bindQuery( ann, mappings );
+ }
+ {
+ NamedQueries ann = annotatedElement.getAnnotation( NamedQueries.class );
+ QueryBinder.bindQueries( ann, mappings, false );
+ }
+ {
+ org.hibernate.annotations.NamedQueries ann = annotatedElement.getAnnotation(
+ org.hibernate.annotations.NamedQueries.class
+ );
+ QueryBinder.bindQueries( ann, mappings );
+ }
+ {
+ NamedNativeQuery ann = annotatedElement.getAnnotation( NamedNativeQuery.class );
+ QueryBinder.bindNativeQuery( ann, mappings, false );
+ }
+ {
+ org.hibernate.annotations.NamedNativeQuery ann = annotatedElement.getAnnotation(
+ org.hibernate.annotations.NamedNativeQuery.class
+ );
+ QueryBinder.bindNativeQuery( ann, mappings );
+ }
+ {
+ NamedNativeQueries ann = annotatedElement.getAnnotation( NamedNativeQueries.class );
+ QueryBinder.bindNativeQueries( ann, mappings, false );
+ }
+ {
+ org.hibernate.annotations.NamedNativeQueries ann = annotatedElement.getAnnotation(
+ org.hibernate.annotations.NamedNativeQueries.class
+ );
+ QueryBinder.bindNativeQueries( ann, mappings );
+ }
+ }
+
+ private static IdGenerator buildIdGenerator(java.lang.annotation.Annotation ann, Mappings mappings) {
+ IdGenerator idGen = new IdGenerator();
+ if ( mappings.getSchemaName() != null ) {
+ idGen.addParam( PersistentIdentifierGenerator.SCHEMA, mappings.getSchemaName() );
+ }
+ if ( mappings.getCatalogName() != null ) {
+ idGen.addParam( PersistentIdentifierGenerator.CATALOG, mappings.getCatalogName() );
+ }
+ if ( ann == null ) {
+ idGen = null;
+ }
+ else if ( ann instanceof TableGenerator ) {
+ TableGenerator tabGen = (TableGenerator) ann;
+ idGen.setName( tabGen.name() );
+ idGen.setIdentifierGeneratorStrategy( MultipleHiLoPerTableGenerator.class.getName() );
+
+ if ( !BinderHelper.isDefault( tabGen.table() ) ) {
+ idGen.addParam( MultipleHiLoPerTableGenerator.ID_TABLE, tabGen.table() );
+ }
+ if ( !BinderHelper.isDefault( tabGen.catalog() ) ) {
+ idGen.addParam( MultipleHiLoPerTableGenerator.CATALOG, tabGen.catalog() );
+ }
+ if ( !BinderHelper.isDefault( tabGen.schema() ) ) {
+ idGen.addParam( MultipleHiLoPerTableGenerator.SCHEMA, tabGen.schema() );
+ }
+ //FIXME implements uniqueconstrains
+
+ if ( !BinderHelper.isDefault( tabGen.pkColumnName() ) ) {
+ idGen.addParam( MultipleHiLoPerTableGenerator.PK_COLUMN_NAME, tabGen.pkColumnName() );
+ }
+ if ( !BinderHelper.isDefault( tabGen.valueColumnName() ) ) {
+ idGen.addParam( MultipleHiLoPerTableGenerator.VALUE_COLUMN_NAME, tabGen.valueColumnName() );
+ }
+ if ( !BinderHelper.isDefault( tabGen.pkColumnValue() ) ) {
+ idGen.addParam( MultipleHiLoPerTableGenerator.PK_VALUE_NAME, tabGen.pkColumnValue() );
+ }
+ idGen.addParam( TableHiLoGenerator.MAX_LO, String.valueOf( tabGen.allocationSize() - 1 ) );
+ log.debug( "Add table generator with name: " + idGen.getName() );
+ }
+ else if ( ann instanceof SequenceGenerator ) {
+ SequenceGenerator seqGen = (SequenceGenerator) ann;
+ idGen.setName( seqGen.name() );
+ idGen.setIdentifierGeneratorStrategy( "seqhilo" );
+
+ if ( !BinderHelper.isDefault( seqGen.sequenceName() ) ) {
+ idGen.addParam( org.hibernate.id.SequenceGenerator.SEQUENCE, seqGen.sequenceName() );
+ }
+ //FIXME: work on initialValue() through SequenceGenerator.PARAMETERS
+ if ( seqGen.initialValue() != 1 ) {
+ log.warn(
+ "Hibernate does not support SequenceGenerator.initialValue()"
+ );
+ }
+ idGen.addParam( SequenceHiLoGenerator.MAX_LO, String.valueOf( seqGen.allocationSize() - 1 ) );
+ log.debug( "Add sequence generator with name: " + idGen.getName() );
+ }
+ else if ( ann instanceof GenericGenerator ) {
+ GenericGenerator genGen = (GenericGenerator) ann;
+ idGen.setName( genGen.name() );
+ idGen.setIdentifierGeneratorStrategy( genGen.strategy() );
+ Parameter[] params = genGen.parameters();
+ for ( Parameter parameter : params ) {
+ idGen.addParam( parameter.name(), parameter.value() );
+ }
+ log.debug( "Add generic generator with name: " + idGen.getName() );
+ }
+ else {
+ throw new AssertionFailure( "Unknown Generator annotation: " + ann );
+ }
+ return idGen;
+ }
+
+ /**
+ * Bind a class having JSR175 annotations
+ * The subclasses <b>have to</b> be binded after its mother class
+ */
+ public static void bindClass(
+ XClass clazzToProcess, Map<XClass, InheritanceState> inheritanceStatePerClass, ExtendedMappings mappings
+ ) throws MappingException {
+ //TODO: be more strict with secondarytable allowance (not for ids, not for secondary table join columns etc)
+ InheritanceState inheritanceState = inheritanceStatePerClass.get( clazzToProcess );
+ AnnotatedClassType classType = mappings.getClassType( clazzToProcess );
+ if ( AnnotatedClassType.EMBEDDABLE_SUPERCLASS.equals( classType ) //will be processed by their subentities
+ || AnnotatedClassType.NONE.equals( classType ) //to be ignored
+ || AnnotatedClassType.EMBEDDABLE.equals( classType ) //allow embeddable element declaration
+ ) {
+ if ( AnnotatedClassType.NONE.equals( classType )
+ && clazzToProcess.isAnnotationPresent( org.hibernate.annotations.Entity.class ) ) {
+ log.warn("Class annotated @org.hibernate.annotations.Entity but not javax.persistence.Entity "
+ + "(most likely a user error): " + clazzToProcess.getName() );
+ }
+ return;
+ }
+ if ( !classType.equals( AnnotatedClassType.ENTITY ) ) {
+ //TODO make this test accurate by removing the none elements artifically added
+ throw new AnnotationException(
+ "Annotated class should have a @javax.persistence.Entity, @javax.persistence.Embeddable or @javax.persistence.EmbeddedSuperclass annotation: " + clazzToProcess
+ .getName()
+ );
+ }
+ XAnnotatedElement annotatedClass = clazzToProcess;
+ if ( log.isInfoEnabled() ) log.info( "Binding entity from annotated class: " + clazzToProcess.getName() );
+ InheritanceState superEntityState =
+ InheritanceState.getSuperEntityInheritanceState(
+ clazzToProcess, inheritanceStatePerClass, mappings.getReflectionManager()
+ );
+ PersistentClass superEntity = superEntityState != null ?
+ mappings.getClass(
+ superEntityState.clazz.getName()
+ ) :
+ null;
+ if ( superEntity == null ) {
+ //check if superclass is not a potential persistent class
+ if ( inheritanceState.hasParents ) {
+ throw new AssertionFailure(
+ "Subclass has to be binded after it's mother class: "
+ + superEntityState.clazz.getName()
+ );
+ }
+ }
+ bindQueries( annotatedClass, mappings );
+ bindFilterDefs( annotatedClass, mappings );
+ bindTypeDefs( annotatedClass, mappings );
+
+ String schema = "";
+ String table = ""; //might be no @Table annotation on the annotated class
+ String catalog = "";
+ String discrimValue = null;
+ List<String[]> uniqueConstraints = new ArrayList<String[]>();
+ Ejb3DiscriminatorColumn discriminatorColumn = null;
+ Ejb3JoinColumn[] inheritanceJoinedColumns = null;
+
+ if ( annotatedClass.isAnnotationPresent( javax.persistence.Table.class ) ) {
+ javax.persistence.Table tabAnn = annotatedClass.getAnnotation( javax.persistence.Table.class );
+ table = tabAnn.name();
+ schema = tabAnn.schema();
+ catalog = tabAnn.catalog();
+ uniqueConstraints = TableBinder.buildUniqueConstraints( tabAnn.uniqueConstraints() );
+ }
+ final boolean hasJoinedColumns = inheritanceState.hasParents
+ && InheritanceType.JOINED.equals( inheritanceState.type );
+ if ( hasJoinedColumns ) {
+ //@Inheritance(JOINED) subclass need to link back to the super entity
+ PrimaryKeyJoinColumns jcsAnn = annotatedClass.getAnnotation( PrimaryKeyJoinColumns.class );
+ boolean explicitInheritanceJoinedColumns = jcsAnn != null && jcsAnn.value().length != 0;
+ if ( explicitInheritanceJoinedColumns ) {
+ int nbrOfInhJoinedColumns = jcsAnn.value().length;
+ PrimaryKeyJoinColumn jcAnn;
+ inheritanceJoinedColumns = new Ejb3JoinColumn[nbrOfInhJoinedColumns];
+ for ( int colIndex = 0; colIndex < nbrOfInhJoinedColumns; colIndex++ ) {
+ jcAnn = jcsAnn.value()[colIndex];
+ inheritanceJoinedColumns[colIndex] = Ejb3JoinColumn.buildJoinColumn(
+ jcAnn, null, superEntity.getIdentifier(),
+ (Map<String, Join>) null, (PropertyHolder) null, mappings
+ );
+ }
+ }
+ else {
+ PrimaryKeyJoinColumn jcAnn = annotatedClass.getAnnotation( PrimaryKeyJoinColumn.class );
+ inheritanceJoinedColumns = new Ejb3JoinColumn[1];
+ inheritanceJoinedColumns[0] = Ejb3JoinColumn.buildJoinColumn(
+ jcAnn, null, superEntity.getIdentifier(),
+ (Map<String, Join>) null, (PropertyHolder) null, mappings
+ );
+ }
+ log.debug( "Subclass joined column(s) created" );
+ }
+ else {
+ if ( annotatedClass.isAnnotationPresent( javax.persistence.PrimaryKeyJoinColumns.class )
+ || annotatedClass.isAnnotationPresent( javax.persistence.PrimaryKeyJoinColumn.class ) ) {
+ log.warn( "Root entity should not hold an PrimaryKeyJoinColum(s), will be ignored" );
+ }
+ }
+
+ if ( InheritanceType.SINGLE_TABLE.equals( inheritanceState.type ) ) {
+ javax.persistence.Inheritance inhAnn = annotatedClass.getAnnotation( javax.persistence.Inheritance.class );
+ javax.persistence.DiscriminatorColumn discAnn = annotatedClass.getAnnotation(
+ javax.persistence.DiscriminatorColumn.class
+ );
+ DiscriminatorType discriminatorType = discAnn != null ?
+ discAnn.discriminatorType() :
+ DiscriminatorType.STRING;
+
+ org.hibernate.annotations.DiscriminatorFormula discFormulaAnn = annotatedClass.getAnnotation(
+ org.hibernate.annotations.DiscriminatorFormula.class
+ );
+ if ( !inheritanceState.hasParents ) {
+ discriminatorColumn = Ejb3DiscriminatorColumn.buildDiscriminatorColumn(
+ discriminatorType, discAnn, discFormulaAnn, mappings
+ );
+ }
+ if ( discAnn != null && inheritanceState.hasParents ) {
+ log.warn(
+ "Discriminator column has to be defined in the root entity, it will be ignored in subclass: "
+ + clazzToProcess.getName()
+ );
+ }
+ discrimValue = annotatedClass.isAnnotationPresent( DiscriminatorValue.class ) ?
+ annotatedClass.getAnnotation( DiscriminatorValue.class ).value() :
+ null;
+ }
+
+ //we now know what kind of persistent entity it is
+ PersistentClass persistentClass;
+ //create persistent class
+ if ( !inheritanceState.hasParents ) {
+ persistentClass = new RootClass();
+ }
+ else if ( InheritanceType.SINGLE_TABLE.equals( inheritanceState.type ) ) {
+ persistentClass = new SingleTableSubclass( superEntity );
+ }
+ else if ( InheritanceType.JOINED.equals( inheritanceState.type ) ) {
+ persistentClass = new JoinedSubclass( superEntity );
+ }
+ else if ( InheritanceType.TABLE_PER_CLASS.equals( inheritanceState.type ) ) {
+ persistentClass = new UnionSubclass( superEntity );
+ }
+ else {
+ throw new AssertionFailure( "Unknown inheritance type: " + inheritanceState.type );
+ }
+ Proxy proxyAnn = annotatedClass.getAnnotation( Proxy.class );
+ BatchSize sizeAnn = annotatedClass.getAnnotation( BatchSize.class );
+ Where whereAnn = annotatedClass.getAnnotation( Where.class );
+ Entity entityAnn = annotatedClass.getAnnotation( Entity.class );
+ org.hibernate.annotations.Entity hibEntityAnn = annotatedClass.getAnnotation(
+ org.hibernate.annotations.Entity.class
+ );
+ org.hibernate.annotations.Cache cacheAnn = annotatedClass.getAnnotation(
+ org.hibernate.annotations.Cache.class
+ );
+ EntityBinder entityBinder = new EntityBinder(
+ entityAnn, hibEntityAnn, clazzToProcess, persistentClass, mappings
+ );
+ entityBinder.setDiscriminatorValue( discrimValue );
+ entityBinder.setBatchSize( sizeAnn );
+ entityBinder.setProxy( proxyAnn );
+ entityBinder.setWhere( whereAnn );
+ entityBinder.setCache( cacheAnn );
+ entityBinder.setInheritanceState( inheritanceState );
+ Filter filterAnn = annotatedClass.getAnnotation( Filter.class );
+ if ( filterAnn != null ) {
+ entityBinder.addFilter( filterAnn.name(), filterAnn.condition() );
+ }
+ Filters filtersAnn = annotatedClass.getAnnotation( Filters.class );
+ if ( filtersAnn != null ) {
+ for ( Filter filter : filtersAnn.value() ) {
+ entityBinder.addFilter( filter.name(), filter.condition() );
+ }
+ }
+ entityBinder.bindEntity();
+
+ if ( inheritanceState.hasTable() ) {
+ Check checkAnn = annotatedClass.getAnnotation( Check.class );
+ String constraints = checkAnn == null ?
+ null :
+ checkAnn.constraints();
+ entityBinder.bindTable(
+ schema, catalog, table, uniqueConstraints,
+ constraints, inheritanceState.hasDenormalizedTable() ?
+ superEntity.getTable() :
+ null
+ );
+ }
+ else {
+ if ( annotatedClass.isAnnotationPresent( Table.class ) ) {
+ log.warn( "Illegal use of @Table in a subclass of a SINGLE_TABLE hierarchy: " + clazzToProcess
+ .getName() );
+ }
+ }
+// Map<String, Column[]> columnOverride = PropertyHolderBuilder.buildHierarchyColumnOverride(
+// clazzToProcess,
+// persistentClass.getClassName()
+// );
+ PropertyHolder propertyHolder = PropertyHolderBuilder.buildPropertyHolder(
+ clazzToProcess,
+ persistentClass,
+ entityBinder, mappings
+ );
+
+ javax.persistence.SecondaryTable secTabAnn = annotatedClass.getAnnotation(
+ javax.persistence.SecondaryTable.class
+ );
+ javax.persistence.SecondaryTables secTabsAnn = annotatedClass.getAnnotation(
+ javax.persistence.SecondaryTables.class
+ );
+ entityBinder.firstLevelSecondaryTablesBinding( secTabAnn, secTabsAnn );
+
+ OnDelete onDeleteAnn = annotatedClass.getAnnotation( OnDelete.class );
+ boolean onDeleteAppropriate = false;
+ if ( InheritanceType.JOINED.equals( inheritanceState.type ) && inheritanceState.hasParents ) {
+ onDeleteAppropriate = true;
+ final JoinedSubclass jsc = (JoinedSubclass) persistentClass;
+ if ( persistentClass.getEntityPersisterClass() == null ) {
+ persistentClass.getRootClass().setEntityPersisterClass( JoinedSubclassEntityPersister.class );
+ }
+ SimpleValue key = new DependantValue( jsc.getTable(), jsc.getIdentifier() );
+ jsc.setKey( key );
+ ForeignKey fk = annotatedClass.getAnnotation( ForeignKey.class );
+ if (fk != null && ! BinderHelper.isDefault( fk.name() ) ) {
+ key.setForeignKeyName( fk.name() );
+ }
+ if ( onDeleteAnn != null ) {
+ key.setCascadeDeleteEnabled( OnDeleteAction.CASCADE.equals( onDeleteAnn.action() ) );
+ }
+ else {
+ key.setCascadeDeleteEnabled( false );
+ }
+ TableBinder.bindFk( jsc.getSuperclass(), jsc, inheritanceJoinedColumns, key, false, mappings );
+ //no need to handle inSecondPass this is an Etntiy related work
+ mappings.addSecondPass( new CreateKeySecondPass( jsc ) );
+
+ }
+ else if ( InheritanceType.SINGLE_TABLE.equals( inheritanceState.type ) ) {
+ if ( inheritanceState.hasParents ) {
+ if ( persistentClass.getEntityPersisterClass() == null ) {
+ persistentClass.getRootClass().setEntityPersisterClass( SingleTableEntityPersister.class );
+ }
+ }
+ else {
+ if ( inheritanceState.hasSons || !discriminatorColumn.isImplicit() ) {
+ //need a discriminator column
+ bindDiscriminatorToPersistentClass(
+ (RootClass) persistentClass,
+ discriminatorColumn,
+ entityBinder.getSecondaryTables(),
+ propertyHolder
+ );
+ entityBinder.bindDiscriminatorValue();//bind it again since the type might have changed
+ }
+ }
+ }
+ else if ( InheritanceType.TABLE_PER_CLASS.equals( inheritanceState.type ) ) {
+ if ( inheritanceState.hasParents ) {
+ if ( persistentClass.getEntityPersisterClass() == null ) {
+ persistentClass.getRootClass().setEntityPersisterClass( UnionSubclassEntityPersister.class );
+ }
+ }
+ }
+ if ( onDeleteAnn != null && !onDeleteAppropriate ) {
+ log.warn(
+ "Inapropriate use of @OnDelete on entity, annotation ignored: " + propertyHolder.getEntityName()
+ );
+ }
+
+ //try to find class level generators
+ HashMap<String, IdGenerator> classGenerators = buildLocalGenerators( annotatedClass, mappings );
+
+ // check properties
+ List<PropertyData> elements =
+ getElementsToProcess(
+ clazzToProcess, inheritanceStatePerClass, propertyHolder, entityBinder, mappings
+ );
+ if ( elements == null ) {
+ throw new AnnotationException( "No identifier specified for entity: " + propertyHolder.getEntityName() );
+ }
+ final boolean subclassAndSingleTableStrategy = inheritanceState.type == InheritanceType.SINGLE_TABLE
+ && inheritanceState.hasParents;
+ //process idclass if any
+ Set<String> idProperties = new HashSet<String>();
+ IdClass idClass = null;
+ if ( !inheritanceState.hasParents ) {
+ //look for idClass
+ XClass current = inheritanceState.clazz;
+ InheritanceState state = inheritanceState;
+ do {
+ current = state.clazz;
+ if ( current.isAnnotationPresent( IdClass.class ) ) {
+ idClass = current.getAnnotation( IdClass.class );
+ break;
+ }
+ state = InheritanceState.getSuperclassInheritanceState(
+ current, inheritanceStatePerClass, mappings.getReflectionManager()
+ );
+ }
+ while ( state != null );
+ }
+ if ( idClass != null ) {
+ XClass compositeClass = mappings.getReflectionManager().toXClass( idClass.value() );
+ boolean isComponent = true;
+ boolean propertyAnnotated = entityBinder.isPropertyAnnotated( compositeClass );
+ String propertyAccessor = entityBinder.getPropertyAccessor( compositeClass );
+ String generatorType = "assigned";
+ String generator = BinderHelper.ANNOTATION_STRING_DEFAULT;
+ PropertyData inferredData = new PropertyPreloadedData(
+ entityBinder.getPropertyAccessor(), "id", compositeClass
+ );
+ HashMap<String, IdGenerator> localGenerators = new HashMap<String, IdGenerator>();
+ boolean ignoreIdAnnotations = entityBinder.isIgnoreIdAnnotations();
+ entityBinder.setIgnoreIdAnnotations( true );
+ bindId(
+ generatorType,
+ generator,
+ inferredData,
+ null,
+ propertyHolder,
+ localGenerators,
+ isComponent,
+ propertyAnnotated,
+ propertyAccessor, entityBinder,
+ null,
+ true,
+ false, mappings
+ );
+ inferredData = new PropertyPreloadedData(
+ propertyAccessor, "_identifierMapper", compositeClass
+ );
+ Component mapper = fillComponent(
+ propertyHolder,
+ inferredData,
+ propertyAnnotated,
+ propertyAccessor, false,
+ entityBinder,
+ true, true,
+ false, mappings
+ );
+ entityBinder.setIgnoreIdAnnotations( ignoreIdAnnotations );
+ persistentClass.setIdentifierMapper( mapper );
+ Property property = new Property();
+ property.setName( "_identifierMapper" );
+ property.setNodeName( "id" );
+ property.setUpdateable( false );
+ property.setInsertable( false );
+ property.setValue( mapper );
+ property.setPropertyAccessorName( "embedded" );
+ persistentClass.addProperty( property );
+ entityBinder.setIgnoreIdAnnotations( true );
+
+ Iterator properties = mapper.getPropertyIterator();
+ while ( properties.hasNext() ) {
+ idProperties.add( ( (Property) properties.next() ).getName() );
+ }
+ }
+ Set<String> missingIdProperties = new HashSet<String>( idProperties );
+ for ( PropertyData propertyAnnotatedElement : elements ) {
+ String propertyName = propertyAnnotatedElement.getPropertyName();
+ if ( !idProperties.contains( propertyName ) ) {
+ processElementAnnotations(
+ propertyHolder,
+ subclassAndSingleTableStrategy ?
+ Nullability.FORCED_NULL :
+ Nullability.NO_CONSTRAINT,
+ propertyAnnotatedElement.getProperty(),
+ propertyAnnotatedElement, classGenerators, entityBinder,
+ false, false, false, mappings
+ );
+ }
+ else {
+ missingIdProperties.remove( propertyName );
+ }
+ }
+
+ if ( missingIdProperties.size() != 0 ) {
+ StringBuilder missings = new StringBuilder();
+ for ( String property : missingIdProperties ) {
+ missings.append( property ).append( ", " );
+ }
+ throw new AnnotationException(
+ "Unable to find properties ("
+ + missings.substring( 0, missings.length() - 2 )
+ + ") in entity annotated with @IdClass:" + persistentClass.getEntityName()
+ );
+ }
+
+ if ( !inheritanceState.hasParents ) {
+ final RootClass rootClass = (RootClass) persistentClass;
+ //no need to handle inSecondPass this is an Entity related work
+ mappings.addSecondPass( new CreateKeySecondPass( rootClass ) );
+ }
+ else {
+ superEntity.addSubclass( (Subclass) persistentClass );
+ }
+
+ mappings.addClass( persistentClass );
+ entityBinder.finalSecondaryTableBinding( propertyHolder );
+
+ //add process complementary Table definition (index & all)
+ entityBinder.processComplementaryTableDefinitions( annotatedClass.getAnnotation( org.hibernate.annotations.Table.class ) );
+ entityBinder.processComplementaryTableDefinitions( annotatedClass.getAnnotation( org.hibernate.annotations.Tables.class ) );
+
+ }
+
+ /**
+ * Get the annotated elements
+ * Guess the annotated element from @Id or @EmbeddedId presence
+ * Change EntityBinder by side effect
+ */
+ private static List<PropertyData> getElementsToProcess(
+ XClass clazzToProcess, Map<XClass, InheritanceState> inheritanceStatePerClass,
+ PropertyHolder propertyHolder, EntityBinder entityBinder, ExtendedMappings mappings
+ ) {
+ InheritanceState inheritanceState = inheritanceStatePerClass.get( clazzToProcess );
+ List<XClass> classesToProcess = orderClassesToBeProcessed(
+ clazzToProcess, inheritanceStatePerClass, inheritanceState, mappings
+ );
+ List<PropertyData> elements = new ArrayList<PropertyData>();
+ int deep = classesToProcess.size();
+ boolean hasIdentifier = false;
+
+ assert !inheritanceState.isEmbeddableSuperclass;
+ Boolean isExplicitPropertyAnnotated = null;
+ String explicitAccessType = null;
+ if ( inheritanceState.hasParents ) {
+ InheritanceState superEntityState =
+ InheritanceState.getSuperEntityInheritanceState(
+ clazzToProcess, inheritanceStatePerClass, mappings.getReflectionManager()
+ );
+ isExplicitPropertyAnnotated = superEntityState != null ?
+ superEntityState.isPropertyAnnotated :
+ null;
+ explicitAccessType = superEntityState != null ?
+ superEntityState.accessType :
+ null;
+ }
+ else {
+ AccessType access = clazzToProcess.getAnnotation( AccessType.class );
+ explicitAccessType = access != null ?
+ access.value() :
+ null;
+ if ( "property".equals( explicitAccessType ) ) {
+ isExplicitPropertyAnnotated = Boolean.TRUE;
+ }
+ else if ( "field".equals( explicitAccessType ) ) {
+ isExplicitPropertyAnnotated = Boolean.FALSE;
+ }
+ }
+ Boolean isPropertyAnnotated = isExplicitPropertyAnnotated == null ?
+ Boolean.TRUE :
+ //default to property and fallback if needed
+ isExplicitPropertyAnnotated;
+ String accessType = explicitAccessType != null ?
+ explicitAccessType :
+ "property";
+
+ for ( int index = 0; index < deep; index++ ) {
+ XClass clazz = classesToProcess.get( index );
+
+ boolean currentHasIdentifier = addElementsOfAClass(
+ elements, propertyHolder, isPropertyAnnotated,
+ accessType, clazz, mappings
+ );
+ hasIdentifier = hasIdentifier || currentHasIdentifier;
+ }
+
+ if ( !hasIdentifier && !inheritanceState.hasParents ) {
+ if ( isExplicitPropertyAnnotated != null ) return null; //explicit but no @Id
+ isPropertyAnnotated = !isPropertyAnnotated;
+ accessType = "field";
+ elements.clear();
+ for ( int index = 0; index < deep; index++ ) {
+ XClass clazz = classesToProcess.get( index );
+ boolean currentHasIdentifier = addElementsOfAClass(
+ elements, propertyHolder, isPropertyAnnotated,
+ accessType, clazz, mappings
+ );
+ hasIdentifier = hasIdentifier || currentHasIdentifier;
+ }
+ }
+ //TODO set the access type here?
+ entityBinder.setPropertyAnnotated( isPropertyAnnotated );
+ entityBinder.setPropertyAccessor( accessType );
+ inheritanceState.isPropertyAnnotated = isPropertyAnnotated;
+ inheritanceState.accessType = accessType;
+ return hasIdentifier || inheritanceState.hasParents ?
+ elements :
+ null;
+ }
+
+ private static List<XClass> orderClassesToBeProcessed(
+ XClass annotatedClass, Map<XClass, InheritanceState> inheritanceStatePerClass,
+ InheritanceState inheritanceState, ExtendedMappings mappings
+ ) {
+ //ordered to allow proper messages on properties subclassing
+ List<XClass> classesToProcess = new ArrayList<XClass>();
+ XClass currentClassInHierarchy = annotatedClass;
+ InheritanceState superclassState;
+ do {
+ classesToProcess.add( 0, currentClassInHierarchy );
+ XClass superClass = currentClassInHierarchy;
+ do {
+ superClass = superClass.getSuperclass();
+ superclassState = inheritanceStatePerClass.get( superClass );
+ }
+ while ( superClass != null && !mappings.getReflectionManager()
+ .equals( superClass, Object.class ) && superclassState == null );
+
+ currentClassInHierarchy = superClass;
+ }
+ while ( superclassState != null && superclassState.isEmbeddableSuperclass );
+
+ return classesToProcess;
+ }
+
+ private static void bindFilterDefs(XAnnotatedElement annotatedElement, ExtendedMappings mappings) {
+ FilterDef defAnn = annotatedElement.getAnnotation( FilterDef.class );
+ FilterDefs defsAnn = annotatedElement.getAnnotation( FilterDefs.class );
+ if ( defAnn != null ) {
+ bindFilterDef( defAnn, mappings );
+ }
+ if ( defsAnn != null ) {
+ for ( FilterDef def : defsAnn.value() ) {
+ bindFilterDef( def, mappings );
+ }
+ }
+ }
+
+ private static void bindFilterDef(FilterDef defAnn, ExtendedMappings mappings) {
+ Map<String, org.hibernate.type.Type> params = new HashMap<String, org.hibernate.type.Type>();
+ for ( ParamDef param : defAnn.parameters() ) {
+ params.put( param.name(), TypeFactory.heuristicType( param.type() ) );
+ }
+ FilterDefinition def = new FilterDefinition( defAnn.name(), defAnn.defaultCondition(), params );
+ if ( log.isInfoEnabled() ) log.info( "Binding filter definition: " + def.getFilterName() );
+ mappings.addFilterDefinition( def );
+ }
+
+ private static void bindTypeDefs(XAnnotatedElement annotatedElement, ExtendedMappings mappings) {
+ TypeDef defAnn = annotatedElement.getAnnotation( TypeDef.class );
+ TypeDefs defsAnn = annotatedElement.getAnnotation( TypeDefs.class );
+ if ( defAnn != null ) {
+ bindTypeDef( defAnn, mappings );
+ }
+ if ( defsAnn != null ) {
+ for ( TypeDef def : defsAnn.value() ) {
+ bindTypeDef( def, mappings );
+ }
+ }
+ }
+
+ private static void bindTypeDef(TypeDef defAnn, ExtendedMappings mappings) {
+ Properties params = new Properties();
+ for ( Parameter param : defAnn.parameters() ) {
+ params.setProperty( param.name(), param.value() );
+ }
+ if ( log.isInfoEnabled() ) log.info( "Binding type definition: " + defAnn.name() );
+ mappings.addTypeDef( defAnn.name(), defAnn.typeClass().getName(), params );
+ }
+
+ private static void bindDiscriminatorToPersistentClass(
+ RootClass rootClass,
+ Ejb3DiscriminatorColumn discriminatorColumn, Map<String, Join> secondaryTables,
+ PropertyHolder propertyHolder
+ ) {
+ if ( rootClass.getDiscriminator() == null ) {
+ if ( discriminatorColumn == null ) {
+ throw new AssertionFailure( "discriminator column should have been built" );
+ }
+ discriminatorColumn.setJoins( secondaryTables );
+ discriminatorColumn.setPropertyHolder( propertyHolder );
+ SimpleValue discrim = new SimpleValue( rootClass.getTable() );
+ rootClass.setDiscriminator( discrim );
+ discriminatorColumn.linkWithValue( discrim );
+ discrim.setTypeName( discriminatorColumn.getDiscriminatorTypeName() );
+ rootClass.setPolymorphic( true );
+ log.debug( "Setting discriminator for entity " + rootClass.getEntityName() );
+ }
+ }
+
+ /**
+ * Add elements of a class
+ */
+ private static boolean addElementsOfAClass(
+ List<PropertyData> elements, PropertyHolder propertyHolder, boolean isPropertyAnnotated,
+ String propertyAccessor, final XClass annotatedClass, ExtendedMappings mappings
+ ) {
+ boolean hasIdentifier = false;
+ AccessType access = annotatedClass.getAnnotation( AccessType.class );
+ String localPropertyAccessor = access != null ?
+ access.value() :
+ null;
+ String accessType = null;
+ if ( "property".equals( localPropertyAccessor ) || "field".equals( localPropertyAccessor ) ) {
+ accessType = localPropertyAccessor;
+ }
+ else {
+ if ( localPropertyAccessor == null ) {
+ localPropertyAccessor = propertyAccessor;
+ }
+
+ if ( isPropertyAnnotated ) {
+ accessType = "property";
+ }
+ else {
+ accessType = "field";
+ }
+ }
+
+ log.debug( "Processing " + propertyHolder.getEntityName() + " " + accessType + " annotation" );
+ List<XProperty> properties = annotatedClass.getDeclaredProperties( accessType );
+ //order so that property are used int he same order when binding native query
+ Collections.sort( properties, new Comparator<XProperty>() {
+ public int compare(XProperty property1, XProperty property2) {
+ return property1.getName().compareTo( property2.getName() );
+ }
+ } );
+ for ( XProperty p : properties ) {
+ if ( !p.isTypeResolved() && !discoverTypeWithoutReflection( p ) && !mustBeSkipped( p, mappings ) ) {
+ throw new AnnotationException(
+ "Property " + StringHelper.qualify( propertyHolder.getEntityName(), p.getName() ) +
+ " has an unbound type and no explicit target entity. Resolve this Generic usage issue" +
+ " or set an explicit target attribute (eg @OneToMany(target=) or use an explicit @Type"
+ );
+ }
+ final boolean currentHasIdentifier = addProperty( p, elements, localPropertyAccessor, mappings );
+ hasIdentifier = hasIdentifier || currentHasIdentifier;
+ }
+ return hasIdentifier;
+ }
+
+ private static boolean discoverTypeWithoutReflection(XProperty p) {
+ if ( p.isAnnotationPresent( OneToOne.class ) && !p.getAnnotation( OneToOne.class )
+ .targetEntity()
+ .equals( void.class ) ) {
+ return true;
+ }
+ else if ( p.isAnnotationPresent( OneToMany.class ) && !p.getAnnotation( OneToMany.class )
+ .targetEntity()
+ .equals( void.class ) ) {
+ return true;
+ }
+ else if ( p.isAnnotationPresent( ManyToOne.class ) && !p.getAnnotation( ManyToOne.class )
+ .targetEntity()
+ .equals( void.class ) ) {
+ return true;
+ }
+ else if ( p.isAnnotationPresent( ManyToMany.class ) && !p.getAnnotation( ManyToMany.class )
+ .targetEntity()
+ .equals( void.class ) ) {
+ return true;
+ }
+ else if ( p.isAnnotationPresent( Type.class ) ) {
+ return true;
+ }
+ else if ( p.isAnnotationPresent( Target.class ) ) {
+ return true;
+ }
+ return false;
+ }
+
+ private static boolean addProperty(
+ XProperty property, List<PropertyData> annElts,
+ String propertyAccessor, ExtendedMappings mappings
+ ) {
+ boolean hasIdentifier = false;
+ PropertyData propertyAnnotatedElement = new PropertyInferredData(
+ property, propertyAccessor,
+ mappings.getReflectionManager() );
+ if ( !mustBeSkipped( propertyAnnotatedElement.getProperty(), mappings ) ) {
+ /*
+ * put element annotated by @Id in front
+ * since it has to be parsed before any assoctation by Hibernate
+ */
+ final XAnnotatedElement element = propertyAnnotatedElement.getProperty();
+ if ( element.isAnnotationPresent( Id.class ) || element.isAnnotationPresent( EmbeddedId.class ) ) {
+ annElts.add( 0, propertyAnnotatedElement );
+ hasIdentifier = true;
+ }
+ else {
+ annElts.add( propertyAnnotatedElement );
+ hasIdentifier = false;
+ }
+ }
+ return hasIdentifier;
+ }
+
+ private static boolean mustBeSkipped(XProperty property, ExtendedMappings mappings) {
+ //TODO make those hardcoded tests more portable (through the bytecode provider?)
+ return property.isAnnotationPresent( Transient.class )
+ || "net.sf.cglib.transform.impl.InterceptFieldCallback".equals( property.getType().getName() )
+ || "org.hibernate.tool.instrument.javassist.FieldHandler".equals( property.getType().getName() );
+ }
+
+ /**
+ * Process annotation of a particular property
+ */
+ private static void processElementAnnotations(
+ PropertyHolder propertyHolder, Nullability nullability, XProperty property,
+ PropertyData inferredData, HashMap<String, IdGenerator> classGenerators,
+ EntityBinder entityBinder, boolean isIdentifierMapper,
+ boolean isComponentEmbedded, boolean inSecondPass, ExtendedMappings mappings
+ )
+ throws MappingException {
+ /**
+ * inSecondPass can only be used to apply right away the second pass of a composite-element
+ * Because it's a value type, there is no bidirectional association, hence second pass
+ * ordering does not matter
+ */
+ Ejb3Column[] columns = null;
+ Ejb3JoinColumn[] joinColumns = null;
+ if ( log.isDebugEnabled() ) {
+ log.debug(
+ "Processing annotations of " + propertyHolder.getEntityName() + "." + inferredData.getPropertyName()
+ );
+ }
+
+ if ( property.isAnnotationPresent( Parent.class ) ) {
+ if ( propertyHolder.isComponent() ) {
+ propertyHolder.setParentProperty( property.getName() );
+ }
+ else {
+ throw new AnnotationException(
+ "@Parent cannot be applied outside an embeddable object: "
+ + StringHelper.qualify( propertyHolder.getPath(), property.getName() )
+ );
+ }
+ return;
+ }
+
+ //process @JoinColumn(s) before @Column(s) to handle collection of elements properly
+ {
+ JoinColumn[] anns = null;
+ if ( property.isAnnotationPresent( JoinColumn.class ) ) {
+ anns = new JoinColumn[]{property.getAnnotation( JoinColumn.class )};
+ }
+ else if ( property.isAnnotationPresent( JoinColumns.class ) ) {
+ JoinColumns ann = property.getAnnotation( JoinColumns.class );
+ anns = ann.value();
+ int length = anns.length;
+ if ( length == 0 ) {
+ throw new AnnotationException( "Cannot bind an empty @JoinColumns" );
+ }
+ }
+ if ( anns != null ) {
+ joinColumns = Ejb3JoinColumn.buildJoinColumns(
+ anns, null, entityBinder.getSecondaryTables(),
+ propertyHolder, inferredData.getPropertyName(), mappings
+ );
+ }
+ }
+ if ( property.isAnnotationPresent( Column.class ) || property.isAnnotationPresent( Formula.class ) ) {
+ Column ann = property.getAnnotation( Column.class );
+ Formula formulaAnn = property.getAnnotation( Formula.class );
+ columns = Ejb3Column.buildColumnFromAnnotation(
+ new Column[]{ann}, formulaAnn, nullability, propertyHolder, inferredData,
+ entityBinder.getSecondaryTables(), mappings
+ );
+ }
+ else if ( property.isAnnotationPresent( Columns.class ) ) {
+ Columns anns = property.getAnnotation( Columns.class );
+ columns = Ejb3Column.buildColumnFromAnnotation(
+ anns.columns(), null, nullability, propertyHolder, inferredData, entityBinder.getSecondaryTables(),
+ mappings
+ );
+ }
+
+ //set default values if needed
+ if ( joinColumns == null &&
+ ( property.isAnnotationPresent( ManyToOne.class )
+ || property.isAnnotationPresent( OneToOne.class ) )
+ ) {
+ if ( property.isAnnotationPresent( JoinTable.class ) ) {
+ JoinTable joinTableAnn = property.getAnnotation( JoinTable.class );
+ joinColumns = Ejb3JoinColumn.buildJoinColumns(
+ joinTableAnn.inverseJoinColumns(), null, entityBinder.getSecondaryTables(),
+ propertyHolder, inferredData.getPropertyName(), mappings
+ );
+ if ( StringHelper.isEmpty( joinTableAnn.name() ) ) {
+ throw new AnnotationException(
+ "JoinTable.name() on a @ToOne association has to be explicit: "
+ + StringHelper.qualify( propertyHolder.getPath(), inferredData.getPropertyName() )
+ );
+ }
+ }
+ else {
+ OneToOne oneToOneAnn = property.getAnnotation( OneToOne.class );
+ String mappedBy = oneToOneAnn != null ?
+ oneToOneAnn.mappedBy() :
+ null;
+ joinColumns = Ejb3JoinColumn.buildJoinColumns(
+ (JoinColumn[]) null,
+ mappedBy, entityBinder.getSecondaryTables(),
+ propertyHolder, inferredData.getPropertyName(), mappings
+ );
+ }
+ }
+ else if ( joinColumns == null &&
+ ( property.isAnnotationPresent( OneToMany.class )
+ || property.isAnnotationPresent( CollectionOfElements.class ) ) ) {
+ OneToMany oneToMany = property.getAnnotation( OneToMany.class );
+ String mappedBy = oneToMany != null ?
+ oneToMany.mappedBy() :
+ "";
+ joinColumns = Ejb3JoinColumn.buildJoinColumns(
+ (JoinColumn[]) null,
+ mappedBy, entityBinder.getSecondaryTables(),
+ propertyHolder, inferredData.getPropertyName(), mappings
+ );
+ }
+ if ( columns == null && !property.isAnnotationPresent( ManyToMany.class ) ) {
+ //useful for collection of embedded elements
+ columns = Ejb3Column.buildColumnFromAnnotation(
+ null, null, nullability, propertyHolder, inferredData, entityBinder.getSecondaryTables(), mappings
+ );
+ }
+
+ if ( nullability == Nullability.FORCED_NOT_NULL ) {
+ //force columns to not null
+ for ( Ejb3Column col : columns ) {
+ col.forceNotNull();
+ }
+ }
+
+ final XClass returnedClass = inferredData.getClassOrElement();
+ if ( !entityBinder.isIgnoreIdAnnotations() &&
+ ( property.isAnnotationPresent( Id.class )
+ || property.isAnnotationPresent( EmbeddedId.class ) ) ) {
+ if ( isIdentifierMapper ) {
+ throw new AnnotationException(
+ "@IdClass class should not have @Id nor @EmbeddedId properties"
+ );
+ }
+ log.debug( inferredData.getPropertyName() + " is an id" );
+ //clone classGenerator and override with local values
+ HashMap<String, IdGenerator> localGenerators = (HashMap<String, IdGenerator>) classGenerators.clone();
+ localGenerators.putAll( buildLocalGenerators( property, mappings ) );
+
+ //manage composite related metadata
+ //guess if its a component and find id data access (property, field etc)
+ final boolean isComponent = returnedClass.isAnnotationPresent( Embeddable.class )
+ || property.isAnnotationPresent( EmbeddedId.class );
+ boolean propertyAnnotated = entityBinder.isPropertyAnnotated( returnedClass );
+ String propertyAccessor = entityBinder.getPropertyAccessor( returnedClass );
+ //if ( isComponent && embeddableAnn != null && embeddableAnn.access() == AccessType.FIELD ) propertyAccess = false;
+
+ GeneratedValue generatedValue = property.getAnnotation( GeneratedValue.class );
+ String generatorType = generatedValue != null ?
+ generatorType( generatedValue.strategy() ) :
+ "assigned";
+ String generator = generatedValue != null ?
+ generatedValue.generator() :
+ BinderHelper.ANNOTATION_STRING_DEFAULT;
+ if ( isComponent ) generatorType = "assigned"; //a component must not have any generator
+ Type typeAnn = property.getAnnotation( Type.class );
+ bindId(
+ generatorType,
+ generator,
+ inferredData,
+ columns,
+ propertyHolder,
+ localGenerators,
+ isComponent,
+ propertyAnnotated,
+ propertyAccessor, entityBinder,
+ typeAnn,
+ false,
+ isIdentifierMapper, mappings
+ );
+ if ( log.isDebugEnabled() ) {
+ log.debug(
+ "Bind " + ( isComponent ?
+ "@EmbeddedId" :
+ "@Id" ) + " on " + inferredData.getPropertyName()
+ );
+ }
+ }
+ else if ( property.isAnnotationPresent( Version.class ) ) {
+ if ( isIdentifierMapper ) {
+ throw new AnnotationException(
+ "@IdClass class should not have @Version property"
+ );
+ }
+ if ( !( propertyHolder.getPersistentClass() instanceof RootClass ) ) {
+ throw new AnnotationException(
+ "Unable to define/override @Version on a subclass: "
+ + propertyHolder.getEntityName()
+ );
+ }
+ log.debug( inferredData.getPropertyName() + " is a version property" );
+ RootClass rootClass = (RootClass) propertyHolder.getPersistentClass();
+ boolean lazy = false;
+ PropertyBinder propBinder = new PropertyBinder();
+ propBinder.setName( inferredData.getPropertyName() );
+ propBinder.setReturnedClassName( inferredData.getTypeName() );
+ propBinder.setLazy( lazy );
+ propBinder.setPropertyAccessorName( inferredData.getDefaultAccess() );
+ propBinder.setColumns( columns );
+ propBinder.setHolder( propertyHolder ); //PropertyHolderBuilder.buildPropertyHolder(rootClass)
+ propBinder.setProperty( property );
+ propBinder.setReturnedClass( inferredData.getPropertyClass() );
+
+ propBinder.setMappings( mappings );
+ Property prop = propBinder.bind();
+ rootClass.setVersion( prop );
+ SimpleValue simpleValue = (SimpleValue) prop.getValue();
+ if ( !simpleValue.isTypeSpecified() ) simpleValue.setTypeName( "integer" );
+ simpleValue.setNullValue( "undefined" );
+ rootClass.setOptimisticLockMode( Versioning.OPTIMISTIC_LOCK_VERSION );
+ log.debug(
+ "Version name: " + rootClass.getVersion().getName() + ", unsavedValue: " + ( (SimpleValue) rootClass
+ .getVersion()
+ .getValue() ).getNullValue()
+ );
+ }
+ else if ( property.isAnnotationPresent( ManyToOne.class ) ) {
+ ManyToOne ann = property.getAnnotation( ManyToOne.class );
+
+ //check validity
+ if ( property.isAnnotationPresent( Column.class )
+ || property.isAnnotationPresent( Columns.class ) ) {
+ throw new AnnotationException( "@Column(s) not allowed on a @ManyToOne property: "
+ + StringHelper.qualify( propertyHolder.getPath(), inferredData.getPropertyName() ) );
+ }
+
+ Cascade hibernateCascade = property.getAnnotation( Cascade.class );
+ NotFound notFound = property.getAnnotation( NotFound.class );
+ boolean ignoreNotFound = notFound != null && notFound.action().equals( NotFoundAction.IGNORE );
+ OnDelete onDeleteAnn = property.getAnnotation( OnDelete.class );
+ boolean onDeleteCascade = onDeleteAnn != null && OnDeleteAction.CASCADE.equals( onDeleteAnn.action() );
+ JoinTable assocTable = property.getAnnotation( JoinTable.class );
+ if ( assocTable != null ) {
+ Join join = propertyHolder.addJoin( assocTable, false );
+ for ( Ejb3JoinColumn joinColumn : joinColumns ) {
+ joinColumn.setSecondaryTableName( join.getTable().getName() );
+ }
+ }
+ bindManyToOne(
+ getCascadeStrategy( ann.cascade(), hibernateCascade ),
+ joinColumns,
+ ann.optional(),
+ ignoreNotFound, onDeleteCascade,
+ mappings.getReflectionManager().toXClass( ann.targetEntity() ),
+ propertyHolder,
+ inferredData, false, isIdentifierMapper, inSecondPass, mappings
+ );
+ }
+ else if ( property.isAnnotationPresent( OneToOne.class ) ) {
+ OneToOne ann = property.getAnnotation( OneToOne.class );
+
+ //check validity
+ if ( property.isAnnotationPresent( Column.class )
+ || property.isAnnotationPresent( Columns.class ) ) {
+ throw new AnnotationException( "@Column(s) not allowed on a @OneToOne property: "
+ + StringHelper.qualify( propertyHolder.getPath(), inferredData.getPropertyName() ) );
+ }
+
+ //FIXME support a proper PKJCs
+ boolean trueOneToOne = property.isAnnotationPresent( PrimaryKeyJoinColumn.class )
+ || property.isAnnotationPresent( PrimaryKeyJoinColumns.class );
+ Cascade hibernateCascade = property.getAnnotation( Cascade.class );
+ NotFound notFound = property.getAnnotation( NotFound.class );
+ boolean ignoreNotFound = notFound != null && notFound.action().equals( NotFoundAction.IGNORE );
+ OnDelete onDeleteAnn = property.getAnnotation( OnDelete.class );
+ boolean onDeleteCascade = onDeleteAnn != null && OnDeleteAction.CASCADE.equals( onDeleteAnn.action() );
+ JoinTable assocTable = property.getAnnotation( JoinTable.class );
+ if ( assocTable != null ) {
+ Join join = propertyHolder.addJoin( assocTable, false );
+ for ( Ejb3JoinColumn joinColumn : joinColumns ) {
+ joinColumn.setSecondaryTableName( join.getTable().getName() );
+ }
+ }
+ bindOneToOne(
+ getCascadeStrategy( ann.cascade(), hibernateCascade ),
+ joinColumns,
+ ann.optional(),
+ getFetchMode( ann.fetch() ),
+ ignoreNotFound, onDeleteCascade,
+ mappings.getReflectionManager().toXClass( ann.targetEntity() ),
+ propertyHolder,
+ inferredData, ann.mappedBy(), trueOneToOne, isIdentifierMapper, inSecondPass, mappings
+ );
+ }
+ else if ( property.isAnnotationPresent( OneToMany.class )
+ || property.isAnnotationPresent( ManyToMany.class )
+ || property.isAnnotationPresent( CollectionOfElements.class ) ) {
+ OneToMany oneToManyAnn = property.getAnnotation( OneToMany.class );
+ ManyToMany manyToManyAnn = property.getAnnotation( ManyToMany.class );
+ CollectionOfElements collectionOfElementsAnn = property.getAnnotation( CollectionOfElements.class );
+ org.hibernate.annotations.IndexColumn indexAnn = property.getAnnotation(
+ org.hibernate.annotations.IndexColumn.class
+ );
+ JoinTable assocTable = property.getAnnotation( JoinTable.class );
+
+ IndexColumn indexColumn = IndexColumn.buildColumnFromAnnotation(
+ indexAnn, propertyHolder, inferredData, mappings
+ );
+ CollectionBinder collectionBinder = CollectionBinder.getCollectionBinder(
+ propertyHolder.getEntityName(),
+ property,
+ !indexColumn.isImplicit()
+ );
+ collectionBinder.setIndexColumn( indexColumn );
+ MapKey mapKeyAnn = property.getAnnotation( MapKey.class );
+ collectionBinder.setMapKey( mapKeyAnn );
+ collectionBinder.setPropertyName( inferredData.getPropertyName() );
+ BatchSize batchAnn = property.getAnnotation( BatchSize.class );
+ collectionBinder.setBatchSize( batchAnn );
+ javax.persistence.OrderBy ejb3OrderByAnn = property.getAnnotation( javax.persistence.OrderBy.class );
+ OrderBy orderByAnn = property.getAnnotation( OrderBy.class );
+ collectionBinder.setEjb3OrderBy( ejb3OrderByAnn );
+ collectionBinder.setSqlOrderBy( orderByAnn );
+ Sort sortAnn = property.getAnnotation( Sort.class );
+ collectionBinder.setSort( sortAnn );
+ Cache cachAnn = property.getAnnotation( Cache.class );
+ collectionBinder.setCache( cachAnn );
+ collectionBinder.setPropertyHolder( propertyHolder );
+ Cascade hibernateCascade = property.getAnnotation( Cascade.class );
+ NotFound notFound = property.getAnnotation( NotFound.class );
+ boolean ignoreNotFound = notFound != null && notFound.action().equals( NotFoundAction.IGNORE );
+ collectionBinder.setIgnoreNotFound( ignoreNotFound );
+ collectionBinder.setCollectionType( inferredData.getProperty().getElementClass() );
+ collectionBinder.setMappings( mappings );
+ collectionBinder.setPropertyAccessorName( inferredData.getDefaultAccess() );
+
+ Ejb3Column[] elementColumns = null;
+ PropertyData virtualProperty = new WrappedInferredData( inferredData, "element" );
+ if ( property.isAnnotationPresent( Column.class ) || property.isAnnotationPresent(
+ Formula.class
+ ) ) {
+ Column ann = property.getAnnotation( Column.class );
+ Formula formulaAnn = property.getAnnotation( Formula.class );
+ elementColumns = Ejb3Column.buildColumnFromAnnotation(
+ new Column[]{ann},
+ formulaAnn,
+ nullability,
+ propertyHolder,
+ virtualProperty,
+ entityBinder.getSecondaryTables(),
+ mappings
+ );
+ }
+ else if ( property.isAnnotationPresent( Columns.class ) ) {
+ Columns anns = property.getAnnotation( Columns.class );
+ elementColumns = Ejb3Column.buildColumnFromAnnotation(
+ anns.columns(), null, nullability, propertyHolder, virtualProperty,
+ entityBinder.getSecondaryTables(), mappings
+ );
+ }
+ else {
+ elementColumns = Ejb3Column.buildColumnFromAnnotation(
+ null,
+ null,
+ nullability,
+ propertyHolder,
+ virtualProperty,
+ entityBinder.getSecondaryTables(),
+ mappings
+ );
+ }
+
+ org.hibernate.annotations.MapKey hibMapKeyAnn = property.getAnnotation(
+ org.hibernate.annotations.MapKey.class
+ );
+ PropertyData mapKeyVirtualProperty = new WrappedInferredData( inferredData, "mapkey" );
+ Ejb3Column[] mapColumns = Ejb3Column.buildColumnFromAnnotation(
+ hibMapKeyAnn != null && hibMapKeyAnn.columns().length > 0 ?
+ hibMapKeyAnn.columns() :
+ null,
+ null,
+ Nullability.FORCED_NOT_NULL,
+ propertyHolder,
+ mapKeyVirtualProperty,
+ entityBinder.getSecondaryTables(),
+ mappings
+ );
+ collectionBinder.setMapKeyColumns( mapColumns );
+
+ MapKeyManyToMany mapKeyManyToMany = property.getAnnotation( MapKeyManyToMany.class );
+ Ejb3JoinColumn[] mapJoinColumns = Ejb3JoinColumn.buildJoinColumns(
+ mapKeyManyToMany != null ?
+ mapKeyManyToMany.joinColumns() :
+ null,
+ null, entityBinder.getSecondaryTables(),
+ propertyHolder, mapKeyVirtualProperty.getPropertyName(), mappings
+ );
+ collectionBinder.setMapKeyManyToManyColumns( mapJoinColumns );
+
+ //potential element
+ collectionBinder.setEmbedded( property.isAnnotationPresent( Embedded.class ) );
+ collectionBinder.setElementColumns( elementColumns );
+ collectionBinder.setProperty( property );
+
+ if ( oneToManyAnn != null && manyToManyAnn != null ) {
+ throw new AnnotationException(
+ "@OneToMany and @ManyToMany on the same property is not allowed: "
+ + propertyHolder.getEntityName() + "." + inferredData.getPropertyName()
+ );
+ }
+ String mappedBy = null;
+ if ( oneToManyAnn != null ) {
+ for ( Ejb3JoinColumn column : joinColumns ) {
+ if ( column.isSecondary() ) {
+ throw new NotYetImplementedException( "Collections having FK in secondary table" );
+ }
+ }
+ collectionBinder.setFkJoinColumns( joinColumns );
+ mappedBy = oneToManyAnn.mappedBy();
+ collectionBinder.setTargetEntity(
+ mappings.getReflectionManager().toXClass( oneToManyAnn.targetEntity() )
+ );
+ collectionBinder.setCascadeStrategy( getCascadeStrategy( oneToManyAnn.cascade(), hibernateCascade ) );
+ collectionBinder.setOneToMany( true );
+ }
+ else if ( collectionOfElementsAnn != null ) {
+ for ( Ejb3JoinColumn column : joinColumns ) {
+ if ( column.isSecondary() ) {
+ throw new NotYetImplementedException( "Collections having FK in secondary table" );
+ }
+ }
+ collectionBinder.setFkJoinColumns( joinColumns );
+ mappedBy = "";
+ collectionBinder.setTargetEntity(
+ mappings.getReflectionManager().toXClass( collectionOfElementsAnn.targetElement() )
+ );
+ //collectionBinder.setCascadeStrategy( getCascadeStrategy( embeddedCollectionAnn.cascade(), hibernateCascade ) );
+ collectionBinder.setOneToMany( true );
+ }
+ else if ( manyToManyAnn != null ) {
+ mappedBy = manyToManyAnn.mappedBy();
+ collectionBinder.setTargetEntity(
+ mappings.getReflectionManager().toXClass( manyToManyAnn.targetEntity() )
+ );
+ collectionBinder.setCascadeStrategy( getCascadeStrategy( manyToManyAnn.cascade(), hibernateCascade ) );
+ collectionBinder.setOneToMany( false );
+ }
+ collectionBinder.setMappedBy( mappedBy );
+ bindJoinedTableAssociation(
+ assocTable, mappings, entityBinder, collectionBinder, propertyHolder, inferredData, mappedBy
+ );
+
+ OnDelete onDeleteAnn = property.getAnnotation( OnDelete.class );
+ boolean onDeleteCascade = onDeleteAnn != null && OnDeleteAction.CASCADE.equals( onDeleteAnn.action() );
+ collectionBinder.setCascadeDeleteEnabled( onDeleteCascade );
+ if ( isIdentifierMapper ) {
+ collectionBinder.setInsertable( false );
+ collectionBinder.setUpdatable( false );
+ }
+ if ( property.isAnnotationPresent( CollectionId.class ) ) { //do not compute the generators unless necessary
+ HashMap<String, IdGenerator> localGenerators = (HashMap<String, IdGenerator>) classGenerators.clone();
+ localGenerators.putAll( buildLocalGenerators( property, mappings ) );
+ collectionBinder.setLocalGenerators( localGenerators );
+
+ }
+ collectionBinder.bind();
+
+ }
+ else {
+ //define whether the type is a component or not
+ boolean isComponent = false;
+ Embeddable embeddableAnn = (Embeddable) returnedClass.getAnnotation( Embeddable.class );
+ Embedded embeddedAnn = (Embedded) property.getAnnotation( Embedded.class );
+ isComponent = embeddedAnn != null || embeddableAnn != null;
+
+ if ( isComponent ) {
+ //process component object
+ //boolean propertyAccess = true;
+ //if ( embeddableAnn != null && embeddableAnn.access() == AccessType.FIELD ) propertyAccess = false;
+ boolean propertyAnnotated = entityBinder.isPropertyAnnotated( property );
+ String propertyAccessor = entityBinder.getPropertyAccessor( property );
+ bindComponent(
+ inferredData, propertyHolder, propertyAnnotated, propertyAccessor, entityBinder,
+ isIdentifierMapper,
+ mappings, isComponentEmbedded
+ );
+ }
+ else {
+ //provide the basic property mapping
+ boolean optional = true;
+ boolean lazy = false;
+ if ( property.isAnnotationPresent( Basic.class ) ) {
+ Basic ann = property.getAnnotation( Basic.class );
+ optional = ann.optional();
+ lazy = ann.fetch() == FetchType.LAZY;
+ }
+ //implicit type will check basic types and Serializable classes
+ if ( !optional && nullability != Nullability.FORCED_NULL ) {
+ //force columns to not null
+ for ( Ejb3Column col : columns ) {
+ col.forceNotNull();
+ }
+ }
+
+ PropertyBinder propBinder = new PropertyBinder();
+ propBinder.setName( inferredData.getPropertyName() );
+ propBinder.setReturnedClassName( inferredData.getTypeName() );
+ propBinder.setLazy( lazy );
+ propBinder.setPropertyAccessorName( inferredData.getDefaultAccess() );
+ propBinder.setColumns( columns );
+ propBinder.setHolder( propertyHolder );
+ propBinder.setProperty( property );
+ propBinder.setReturnedClass( inferredData.getPropertyClass() );
+ propBinder.setMappings( mappings );
+ if ( isIdentifierMapper ) {
+ propBinder.setInsertable( false );
+ propBinder.setUpdatable( false );
+ }
+ propBinder.bind();
+ }
+ }
+ //init index
+ //process indexes after everything: in second pass, many to one has to be done before indexes
+ Index index = property.getAnnotation( Index.class );
+ if ( index != null ) {
+ if ( joinColumns != null ) {
+ for ( Ejb3Column column : joinColumns ) {
+ column.addIndex( index, inSecondPass );
+ }
+ }
+ else {
+ for ( Ejb3Column column : columns ) {
+ column.addIndex( index, inSecondPass );
+ }
+ }
+ }
+ }
+
+ //TODO move that to collection binder?
+ private static void bindJoinedTableAssociation(
+ JoinTable joinTableAnn, ExtendedMappings mappings, EntityBinder entityBinder,
+ CollectionBinder collectionBinder, PropertyHolder propertyHolder, PropertyData inferredData,
+ String mappedBy
+ ) {
+ TableBinder associationTableBinder = new TableBinder();
+ JoinColumn[] annJoins;
+ JoinColumn[] annInverseJoins;
+ if ( joinTableAnn != null ) {
+ collectionBinder.setExplicitAssociationTable( true );
+ if ( !BinderHelper.isDefault( joinTableAnn.schema() ) )
+ associationTableBinder.setSchema( joinTableAnn.schema() );
+ if ( !BinderHelper.isDefault( joinTableAnn.catalog() ) )
+ associationTableBinder.setCatalog( joinTableAnn.catalog() );
+ if ( !BinderHelper.isDefault( joinTableAnn.name() ) ) associationTableBinder.setName( joinTableAnn.name() );
+ associationTableBinder.setUniqueConstraints( joinTableAnn.uniqueConstraints() );
+
+ //set check constaint in the second pass
+
+ JoinColumn[] joins = joinTableAnn.joinColumns();
+
+ if ( joins.length == 0 ) {
+ annJoins = null;
+ }
+ else {
+ annJoins = joins;
+ }
+
+ JoinColumn[] inverseJoins = joinTableAnn.inverseJoinColumns();
+
+ if ( inverseJoins.length == 0 ) {
+ annInverseJoins = null;
+ }
+ else {
+ annInverseJoins = inverseJoins;
+ }
+ }
+ else {
+ annJoins = null;
+ annInverseJoins = null;
+ }
+ Ejb3JoinColumn[] joinColumns = Ejb3JoinColumn.buildJoinTableJoinColumns(
+ annJoins, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(), mappedBy,
+ mappings
+ );
+ Ejb3JoinColumn[] inverseJoinColumns = Ejb3JoinColumn.buildJoinTableJoinColumns(
+ annInverseJoins, entityBinder.getSecondaryTables(), propertyHolder, inferredData.getPropertyName(),
+ mappedBy, mappings
+ );
+ associationTableBinder.setMappings( mappings );
+ collectionBinder.setTableBinder( associationTableBinder );
+ collectionBinder.setJoinColumns( joinColumns );
+ collectionBinder.setInverseJoinColumns( inverseJoinColumns );
+ }
+
+ private static void bindComponent(
+ PropertyData inferredData,
+ PropertyHolder propertyHolder,
+ boolean propertyAnnotated,
+ String propertyAccessor, EntityBinder entityBinder,
+ boolean isIdentifierMapper,
+ ExtendedMappings mappings, boolean isComponentEmbedded
+ ) {
+ Component comp = fillComponent(
+ propertyHolder, inferredData, propertyAnnotated, propertyAccessor, true, entityBinder,
+ isComponentEmbedded, isIdentifierMapper,
+ false, mappings
+ );
+ XProperty property = inferredData.getProperty();
+ setupComponentTuplizer( property, comp );
+
+ PropertyBinder binder = new PropertyBinder();
+ binder.setName( inferredData.getPropertyName() );
+ binder.setValue( comp );
+ binder.setProperty( inferredData.getProperty() );
+ binder.setPropertyAccessorName( inferredData.getDefaultAccess() );
+ Property prop = binder.make();
+ propertyHolder.addProperty( prop );
+ }
+
+ public static Component fillComponent(
+ PropertyHolder propertyHolder, PropertyData inferredData,
+ boolean propertyAnnotated, String propertyAccessor, boolean isNullable,
+ EntityBinder entityBinder,
+ boolean isComponentEmbedded, boolean isIdentifierMapper, boolean inSecondPass, ExtendedMappings mappings
+ ) {
+ /**
+ * inSecondPass can only be used to apply right away the second pass of a composite-element
+ * Because it's a value type, there is no bidirectional association, hence second pass
+ * ordering does not matter
+ */
+ Component comp = new Component( propertyHolder.getPersistentClass() );
+ comp.setEmbedded( isComponentEmbedded );
+ //yuk
+ comp.setTable( propertyHolder.getTable() );
+ if ( !isIdentifierMapper ) {
+ comp.setComponentClassName( inferredData.getClassOrElementName() );
+ }
+ else {
+ comp.setComponentClassName( comp.getOwner().getClassName() );
+ }
+ comp.setNodeName( inferredData.getPropertyName() );
+ String subpath = StringHelper.qualify( propertyHolder.getPath(), inferredData.getPropertyName() );
+ log.debug( "Binding component with path: " + subpath );
+ PropertyHolder subHolder = PropertyHolderBuilder.buildPropertyHolder(
+ comp, subpath,
+ inferredData, propertyHolder, mappings
+ );
+ List<PropertyData> classElements = new ArrayList<PropertyData>();
+ XClass returnedClassOrElement = inferredData.getClassOrElement();
+ addElementsOfAClass(
+ classElements,
+ subHolder,
+ propertyAnnotated,
+ propertyAccessor, returnedClassOrElement, mappings
+ );
+ //add elements of the embeddable superclass
+ XClass superClass = inferredData.getPropertyClass().getSuperclass();
+ while ( superClass != null && superClass.isAnnotationPresent( MappedSuperclass.class ) ) {
+ //FIXME: proper support of typevariables incl var resolved at upper levels
+ addElementsOfAClass(
+ classElements,
+ subHolder,
+ entityBinder.isPropertyAnnotated( superClass ),
+ propertyAccessor, superClass, mappings
+ );
+ superClass = superClass.getSuperclass();
+ }
+ for ( PropertyData propertyAnnotatedElement : classElements ) {
+ processElementAnnotations(
+ subHolder, isNullable ?
+ Nullability.NO_CONSTRAINT :
+ Nullability.FORCED_NOT_NULL,
+ propertyAnnotatedElement.getProperty(), propertyAnnotatedElement,
+ new HashMap<String, IdGenerator>(), entityBinder, isIdentifierMapper, isComponentEmbedded,
+ inSecondPass, mappings
+ );
+ }
+ return comp;
+ }
+
+ private static void bindId(
+ String generatorType, String generatorName,
+ PropertyData inferredData, Ejb3Column[] columns, PropertyHolder propertyHolder,
+ Map<String, IdGenerator> localGenerators,
+ boolean isComposite,
+ boolean isPropertyAnnotated,
+ String propertyAccessor, EntityBinder entityBinder, Type typeAnn, boolean isEmbedded,
+ boolean isIdentifierMapper, ExtendedMappings mappings
+ ) {
+ /*
+ * Fill simple value and property since and Id is a property
+ */
+ PersistentClass persistentClass = propertyHolder.getPersistentClass();
+ if ( !( persistentClass instanceof RootClass ) ) {
+ throw new AnnotationException(
+ "Unable to define/override @Id(s) on a subclass: "
+ + propertyHolder.getEntityName()
+ );
+ }
+ RootClass rootClass = (RootClass) persistentClass;
+ String persistentClassName = rootClass == null ?
+ null :
+ rootClass.getClassName();
+ SimpleValue id;
+ if ( isComposite ) {
+ id = fillComponent(
+ propertyHolder, inferredData, isPropertyAnnotated, propertyAccessor,
+ false, entityBinder, isEmbedded, isIdentifierMapper, false, mappings
+ );
+ Component componentId = (Component) id;
+ componentId.setKey( true );
+ if ( componentId.getPropertySpan() == 0 ) {
+ throw new AnnotationException( componentId.getComponentClassName() + " has no persistent id property" );
+ }
+ //tuplizers
+ XProperty property = inferredData.getProperty();
+ setupComponentTuplizer( property, componentId );
+ }
+ else {
+ for ( Ejb3Column column : columns ) {
+ column.forceNotNull(); //this is an id
+ }
+ SimpleValueBinder value = new SimpleValueBinder();
+ value.setPropertyName( inferredData.getPropertyName() );
+ value.setReturnedClassName( inferredData.getTypeName() );
+ value.setColumns( columns );
+ value.setPersistentClassName( persistentClassName );
+ value.setMappings( mappings );
+ value.setExplicitType( typeAnn );
+ id = value.make();
+ }
+ rootClass.setIdentifier( id );
+ BinderHelper.makeIdGenerator( id, generatorType, generatorName, mappings, localGenerators );
+ if ( isEmbedded ) {
+ rootClass.setEmbeddedIdentifier( inferredData.getPropertyClass() == null );
+ }
+ else {
+ PropertyBinder binder = new PropertyBinder();
+ binder.setName( inferredData.getPropertyName() );
+ binder.setValue( id );
+ binder.setPropertyAccessorName( inferredData.getDefaultAccess() );
+ binder.setProperty( inferredData.getProperty() );
+ Property prop = binder.make();
+ rootClass.setIdentifierProperty( prop );
+ }
+ }
+
+ private static void setupComponentTuplizer(XProperty property, Component component) {
+ if ( property == null ) return;
+ if ( property.isAnnotationPresent( Tuplizers.class ) ) {
+ for ( Tuplizer tuplizer : property.getAnnotation( Tuplizers.class ).value() ) {
+ EntityMode mode = EntityMode.parse( tuplizer.entityMode() );
+ component.addTuplizer( mode, tuplizer.impl().getName() );
+ }
+ }
+ if ( property.isAnnotationPresent( Tuplizer.class ) ) {
+ Tuplizer tuplizer = property.getAnnotation( Tuplizer.class );
+ EntityMode mode = EntityMode.parse( tuplizer.entityMode() );
+ component.addTuplizer( mode, tuplizer.impl().getName() );
+ }
+ }
+
+ private static void bindManyToOne(
+ String cascadeStrategy, Ejb3JoinColumn[] columns, boolean optional,
+ boolean ignoreNotFound, boolean cascadeOnDelete,
+ XClass targetEntity, PropertyHolder propertyHolder,
+ PropertyData inferredData, boolean unique, boolean isIdentifierMapper, boolean inSecondPass,
+ ExtendedMappings mappings
+ ) {
+ //All FK columns should be in the same table
+ org.hibernate.mapping.ManyToOne value = new org.hibernate.mapping.ManyToOne( columns[0].getTable() );
+ if ( isDefault( targetEntity, mappings ) ) {
+ value.setReferencedEntityName( inferredData.getClassOrElementName() );
+ }
+ else {
+ value.setReferencedEntityName( targetEntity.getName() );
+ }
+ defineFetchingStrategy( value, inferredData.getProperty() );
+ //value.setFetchMode( fetchMode );
+ value.setIgnoreNotFound( ignoreNotFound );
+ value.setCascadeDeleteEnabled( cascadeOnDelete );
+ //value.setLazy( fetchMode != FetchMode.JOIN );
+ if ( !optional ) {
+ for ( Ejb3JoinColumn column : columns ) {
+ column.setNullable( false );
+ }
+ }
+ value.setTypeName( inferredData.getClassOrElementName() );
+ final String propertyName = inferredData.getPropertyName();
+ value.setTypeUsingReflection( propertyHolder.getClassName(), propertyName );
+
+ ForeignKey fk = inferredData.getProperty().getAnnotation( ForeignKey.class );
+ String fkName = fk != null ?
+ fk.name() :
+ "";
+ if ( !BinderHelper.isDefault( fkName ) ) value.setForeignKeyName( fkName );
+
+ String path = propertyHolder.getPath() + "." + propertyName;
+ FkSecondPass secondPass = new FkSecondPass(
+ value, columns,
+ !optional && unique, //cannot have nullabe and unique on certain DBs like Derby
+ propertyHolder.getEntityOwnerClassName(),
+ path, mappings
+ );
+ if ( inSecondPass ) {
+ secondPass.doSecondPass( mappings.getClasses() );
+ }
+ else {
+ mappings.addSecondPass(
+ secondPass
+ );
+ }
+ Ejb3Column.checkPropertyConsistency( columns, propertyHolder.getEntityName() + propertyName );
+ PropertyBinder binder = new PropertyBinder();
+ binder.setName( propertyName );
+ binder.setValue( value );
+ //binder.setCascade(cascadeStrategy);
+ if ( isIdentifierMapper ) {
+ binder.setInsertable( false );
+ binder.setInsertable( false );
+ }
+ else {
+ binder.setInsertable( columns[0].isInsertable() );
+ binder.setUpdatable( columns[0].isUpdatable() );
+ }
+ binder.setPropertyAccessorName( inferredData.getDefaultAccess() );
+ binder.setCascade( cascadeStrategy );
+ Property prop = binder.make();
+ //composite FK columns are in the same table so its OK
+ propertyHolder.addProperty( prop, columns );
+ }
+
+ protected static void defineFetchingStrategy(ToOne toOne, XProperty property) {
+ LazyToOne lazy = property.getAnnotation( LazyToOne.class );
+ Fetch fetch = property.getAnnotation( Fetch.class );
+ ManyToOne manyToOne = property.getAnnotation( ManyToOne.class );
+ OneToOne oneToOne = property.getAnnotation( OneToOne.class );
+ FetchType fetchType;
+ if ( manyToOne != null ) {
+ fetchType = manyToOne.fetch();
+ }
+ else if ( oneToOne != null ) {
+ fetchType = oneToOne.fetch();
+ }
+ else {
+ throw new AssertionFailure(
+ "Define fetch strategy on a property not annotated with @OneToMany nor @OneToOne"
+ );
+ }
+ if ( lazy != null ) {
+ toOne.setLazy( !( lazy.value() == LazyToOneOption.FALSE ) );
+ toOne.setUnwrapProxy( ( lazy.value() == LazyToOneOption.NO_PROXY ) );
+ }
+ else {
+ toOne.setLazy( fetchType == FetchType.LAZY );
+ toOne.setUnwrapProxy( false );
+ }
+ if ( fetch != null ) {
+ if ( fetch.value() == org.hibernate.annotations.FetchMode.JOIN ) {
+ toOne.setFetchMode( FetchMode.JOIN );
+ toOne.setLazy( false );
+ toOne.setUnwrapProxy( false );
+ }
+ else if ( fetch.value() == org.hibernate.annotations.FetchMode.SELECT ) {
+ toOne.setFetchMode( FetchMode.SELECT );
+ }
+ else if ( fetch.value() == org.hibernate.annotations.FetchMode.SUBSELECT ) {
+ throw new AnnotationException( "Use of FetchMode.SUBSELECT not allowed on ToOne associations" );
+ }
+ else {
+ throw new AssertionFailure( "Unknown FetchMode: " + fetch.value() );
+ }
+ }
+ else {
+ toOne.setFetchMode( getFetchMode( fetchType ) );
+ }
+ }
+
+ private static void bindOneToOne(
+ String cascadeStrategy,
+ Ejb3JoinColumn[] joinColumns,
+ boolean optional,
+ FetchMode fetchMode,
+ boolean ignoreNotFound,
+ boolean cascadeOnDelete,
+ XClass targetEntity,
+ PropertyHolder propertyHolder,
+ PropertyData inferredData, String mappedBy,
+ boolean trueOneToOne,
+ boolean isIdentifierMapper, boolean inSecondPass, ExtendedMappings mappings
+ ) {
+ //column.getTable() => persistentClass.getTable()
+ final String propertyName = inferredData.getPropertyName();
+ log.debug( "Fetching " + propertyName + " with " + fetchMode );
+ boolean mapToPK = true;
+ if ( !trueOneToOne ) {
+ //try to find a hidden true one to one (FK == PK columns)
+ Iterator idColumns = propertyHolder.getIdentifier().getColumnIterator();
+ List<String> idColumnNames = new ArrayList<String>();
+ org.hibernate.mapping.Column currentColumn;
+ while ( idColumns.hasNext() ) {
+ currentColumn = (org.hibernate.mapping.Column) idColumns.next();
+ idColumnNames.add( currentColumn.getName() );
+ }
+ for ( Ejb3JoinColumn col : joinColumns ) {
+ if ( !idColumnNames.contains( col.getMappingColumn().getName() ) ) {
+ mapToPK = false;
+ break;
+ }
+ }
+ }
+ if ( trueOneToOne || mapToPK || !BinderHelper.isDefault( mappedBy ) ) {
+ //is a true one-to-one
+ //FIXME referencedColumnName ignored => ordering may fail.
+ OneToOneSecondPass secondPass = new OneToOneSecondPass(
+ mappedBy,
+ propertyHolder.getEntityName(),
+ propertyName,
+ propertyHolder, inferredData, targetEntity, ignoreNotFound, cascadeOnDelete,
+ optional, cascadeStrategy, joinColumns, mappings
+ );
+ if ( inSecondPass ) {
+ secondPass.doSecondPass( mappings.getClasses() );
+ }
+ else {
+ mappings.addSecondPass(
+ secondPass, BinderHelper.isDefault( mappedBy )
+ );
+ }
+ }
+ else {
+ //has a FK on the table
+ bindManyToOne(
+ cascadeStrategy, joinColumns, optional, ignoreNotFound, cascadeOnDelete,
+ targetEntity,
+ propertyHolder, inferredData, true, isIdentifierMapper, inSecondPass, mappings
+ );
+ }
+ }
+
+ private static String generatorType(GenerationType generatorEnum) {
+ switch (generatorEnum) {
+ case IDENTITY:
+ return "identity";
+ case AUTO:
+ return "native";
+ case TABLE:
+ return MultipleHiLoPerTableGenerator.class.getName();
+ case SEQUENCE:
+ return "seqhilo";
+ }
+ throw new AssertionFailure( "Unknown GeneratorType: " + generatorEnum );
+ }
+
+ private static EnumSet<CascadeType> convertToHibernateCascadeType(javax.persistence.CascadeType[] ejbCascades) {
+ EnumSet<CascadeType> hibernateCascadeSet = EnumSet.noneOf( CascadeType.class );
+ if ( ejbCascades != null && ejbCascades.length > 0 ) {
+ for ( javax.persistence.CascadeType cascade : ejbCascades ) {
+ switch (cascade) {
+ case ALL:
+ hibernateCascadeSet.add( CascadeType.ALL );
+ break;
+ case PERSIST:
+ hibernateCascadeSet.add( CascadeType.PERSIST );
+ break;
+ case MERGE:
+ hibernateCascadeSet.add( CascadeType.MERGE );
+ break;
+ case REMOVE:
+ hibernateCascadeSet.add( CascadeType.REMOVE );
+ break;
+ case REFRESH:
+ hibernateCascadeSet.add( CascadeType.REFRESH );
+ break;
+ }
+ }
+ }
+
+ return hibernateCascadeSet;
+ }
+
+ private static String getCascadeStrategy(
+ javax.persistence.CascadeType[] ejbCascades, Cascade hibernateCascadeAnnotation
+ ) {
+ EnumSet<CascadeType> hibernateCascadeSet = convertToHibernateCascadeType( ejbCascades );
+ CascadeType[] hibernateCascades = hibernateCascadeAnnotation == null ?
+ null :
+ hibernateCascadeAnnotation.value();
+
+ if ( hibernateCascades != null && hibernateCascades.length > 0 ) {
+ for ( CascadeType cascadeType : hibernateCascades ) {
+ hibernateCascadeSet.add( cascadeType );
+ }
+ }
+
+ StringBuilder cascade = new StringBuilder();
+ Iterator<CascadeType> cascadeType = hibernateCascadeSet.iterator();
+ while ( cascadeType.hasNext() ) {
+ switch (cascadeType.next()) {
+ case ALL:
+ cascade.append( "," ).append( "all" );
+ break;
+ case SAVE_UPDATE:
+ cascade.append( "," ).append( "save-update" );
+ break;
+ case PERSIST:
+ cascade.append( "," ).append( "persist" );
+ break;
+ case MERGE:
+ cascade.append( "," ).append( "merge" );
+ break;
+ case LOCK:
+ cascade.append( "," ).append( "lock" );
+ break;
+ case REFRESH:
+ cascade.append( "," ).append( "refresh" );
+ break;
+ case REPLICATE:
+ cascade.append( "," ).append( "replicate" );
+ break;
+ case EVICT:
+ cascade.append( "," ).append( "evict" );
+ break;
+ case DELETE:
+ cascade.append( "," ).append( "delete" );
+ break;
+ case DELETE_ORPHAN:
+ cascade.append( "," ).append( "delete-orphan" );
+ break;
+ case REMOVE:
+ cascade.append( "," ).append( "delete" );
+ break;
+ }
+ }
+ return cascade.length() > 0 ?
+ cascade.substring( 1 ) :
+ "none";
+ }
+
+ public static FetchMode getFetchMode(FetchType fetch) {
+ if ( fetch == FetchType.EAGER ) {
+ return FetchMode.JOIN;
+ }
+ else {
+ return FetchMode.SELECT;
+ }
+ }
+
+ private static HashMap<String, IdGenerator> buildLocalGenerators(XAnnotatedElement annElt, Mappings mappings) {
+ HashMap<String, IdGenerator> generators = new HashMap<String, IdGenerator>();
+ TableGenerator tabGen = annElt.getAnnotation( TableGenerator.class );
+ SequenceGenerator seqGen = annElt.getAnnotation( SequenceGenerator.class );
+ GenericGenerator genGen = annElt.getAnnotation( GenericGenerator.class );
+ if ( tabGen != null ) {
+ IdGenerator idGen = buildIdGenerator( tabGen, mappings );
+ generators.put( idGen.getName(), idGen );
+ }
+ if ( seqGen != null ) {
+ IdGenerator idGen = buildIdGenerator( seqGen, mappings );
+ generators.put( idGen.getName(), idGen );
+ }
+ if ( genGen != null ) {
+ IdGenerator idGen = buildIdGenerator( genGen, mappings );
+ generators.put( idGen.getName(), idGen );
+ }
+ return generators;
+ }
+
+ public static boolean isDefault(XClass clazz, ExtendedMappings mappings) {
+ return mappings.getReflectionManager().equals( clazz, void.class );
+ }
+
+ public static Map<XClass, InheritanceState> buildInheritanceStates(
+ List<XClass> orderedClasses, ReflectionManager reflectionManager
+ ) {
+ Map<XClass, InheritanceState> inheritanceStatePerClass = new HashMap<XClass, InheritanceState>(
+ orderedClasses.size()
+ );
+ for ( XClass clazz : orderedClasses ) {
+ InheritanceState superclassState = InheritanceState.getSuperclassInheritanceState(
+ clazz, inheritanceStatePerClass,
+ reflectionManager
+ );
+ InheritanceState state = new InheritanceState( clazz );
+ if ( superclassState != null ) {
+ //the classes are ordered thus preventing an NPE
+ //FIXME if an entity has subclasses annotated @MappedSperclass wo sub @Entity this is wrong
+ superclassState.hasSons = true;
+ InheritanceState superEntityState = InheritanceState.getSuperEntityInheritanceState(
+ clazz, inheritanceStatePerClass,
+ reflectionManager
+ );
+ state.hasParents = superEntityState != null;
+ final boolean nonDefault = state.type != null && !InheritanceType.SINGLE_TABLE.equals( state.type );
+ if ( superclassState.type != null ) {
+ final boolean mixingStrategy = state.type != null && !state.type.equals( superclassState.type );
+ if ( nonDefault && mixingStrategy ) {
+ log.warn(
+ "Mixing inheritance strategy in a entity hierarchy is not allowed, ignoring sub strategy in: " + clazz
+ .getName()
+ );
+ }
+ state.type = superclassState.type;
+ }
+ }
+ inheritanceStatePerClass.put( clazz, state );
+ }
+ return inheritanceStatePerClass;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,922 +0,0 @@
-// $Id$
-package org.hibernate.cfg;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.SortedSet;
-import java.util.StringTokenizer;
-import java.util.TreeSet;
-import javax.persistence.Entity;
-import javax.persistence.MappedSuperclass;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.dom4j.Attribute;
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.HibernateException;
-import org.hibernate.MappingException;
-import org.hibernate.SessionFactory;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.cfg.annotations.Version;
-import org.hibernate.cfg.annotations.reflection.EJB3ReflectionManager;
-import org.hibernate.event.PreInsertEventListener;
-import org.hibernate.event.PreUpdateEventListener;
-import org.hibernate.event.PostInsertEventListener;
-import org.hibernate.event.PostUpdateEventListener;
-import org.hibernate.event.PostDeleteEventListener;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Table;
-import org.hibernate.mapping.UniqueKey;
-import org.hibernate.util.JoinedIterator;
-import org.hibernate.util.ReflectHelper;
-import org.hibernate.util.StringHelper;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-
-/**
- * Similar to the {@link Configuration} object but handles EJB3 and Hibernate
- * specific annotations as a metadata facility
- *
- * @author Emmanuel Bernard
- */
-public class AnnotationConfiguration extends Configuration {
- private static Log log = LogFactory.getLog( AnnotationConfiguration.class );
-
- static {
- Version.touch(); //touch version
- }
-
- public static final String ARTEFACT = "hibernate.mapping.precedence";
- public static final String DEFAULT_PRECEDENCE = "hbm, class";
-
- private Map namedGenerators;
- private Map<String, Map<String, Join>> joins;
- private Map<String, AnnotatedClassType> classTypes;
- private Set<String> defaultNamedQueryNames;
- private Set<String> defaultNamedNativeQueryNames;
- private Set<String> defaultSqlResulSetMappingNames;
- private Set<String> defaultNamedGenerators;
- private Map<String, Properties> generatorTables;
- private Map<Table, List<String[]>> tableUniqueConstraints;
- private Map<String, String> mappedByResolver;
- private Map<String, String> propertyRefResolver;
- private List<XClass> annotatedClasses;
- private Map<String, XClass> annotatedClassEntities;
- private Map<String, Document> hbmEntities;
- private List<CacheHolder> caches;
- private List<Document> hbmDocuments; //user ordering matters, hence the list
- private String precedence = null;
- private boolean inSecondPass = false;
- private transient ReflectionManager reflectionManager;
- private boolean isDefaultProcessed = false;
-
- public AnnotationConfiguration() {
- super();
- }
-
- public AnnotationConfiguration(SettingsFactory sf) {
- super( sf );
- }
-
- protected List<XClass> orderAndFillHierarchy(List<XClass> original) {
- //TODO remove embeddable
- List<XClass> copy = new ArrayList<XClass>( original );
- //for each class, copy all the relevent hierarchy
- for ( XClass clazz : original ) {
- XClass superClass = clazz.getSuperclass();
- while ( superClass != null && ! reflectionManager.equals( superClass, Object.class ) && ! copy.contains( superClass ) ) {
- if ( superClass.isAnnotationPresent( Entity.class )
- || superClass.isAnnotationPresent( MappedSuperclass.class ) ) {
- copy.add( superClass );
- }
- superClass = superClass.getSuperclass();
- }
- }
- List<XClass> workingCopy = new ArrayList<XClass>( copy );
- List<XClass> newList = new ArrayList<XClass>( copy.size() );
- while ( workingCopy.size() > 0 ) {
- XClass clazz = workingCopy.get( 0 );
- orderHierarchy( workingCopy, newList, copy, clazz );
- }
- return newList;
- }
-
- private void orderHierarchy(List<XClass> copy, List<XClass> newList, List<XClass> original, XClass clazz) {
- if ( clazz == null || reflectionManager.equals( clazz, Object.class ) ) return;
- //process superclass first
- orderHierarchy( copy, newList, original, clazz.getSuperclass() );
- if ( original.contains( clazz ) ) {
- if ( !newList.contains( clazz ) ) {
- newList.add( clazz );
- }
- copy.remove( clazz );
- }
- }
-
- /**
- * Read a mapping from the class annotation metadata (JSR 175).
- *
- * @param persistentClass the mapped class
- * @return the configuration object
- */
- public AnnotationConfiguration addAnnotatedClass(Class persistentClass) throws MappingException {
- XClass persistentXClass = reflectionManager.toXClass( persistentClass );
- try {
- annotatedClasses.add( persistentXClass );
- return this;
- }
- catch (MappingException me) {
- log.error( "Could not compile the mapping annotations", me );
- throw me;
- }
- }
-
- /**
- * Read package level metadata
- *
- * @param packageName java package name
- * @return the configuration object
- */
- public AnnotationConfiguration addPackage(String packageName) throws MappingException {
- log.info( "Mapping package " + packageName );
- try {
- AnnotationBinder.bindPackage( packageName, createExtendedMappings() );
- return this;
- }
- catch (MappingException me) {
- log.error( "Could not compile the mapping annotations", me );
- throw me;
- }
- }
-
- public ExtendedMappings createExtendedMappings() {
- return new ExtendedMappings(
- classes,
- collections,
- tables,
- namedQueries,
- namedSqlQueries,
- sqlResultSetMappings,
- defaultNamedQueryNames,
- defaultNamedNativeQueryNames,
- defaultSqlResulSetMappingNames,
- defaultNamedGenerators,
- imports,
- secondPasses,
- propertyReferences,
- namingStrategy,
- typeDefs,
- filterDefinitions,
- namedGenerators,
- joins,
- classTypes,
- extendsQueue,
- tableNameBinding, columnNameBindingPerTable, auxiliaryDatabaseObjects,
- generatorTables,
- tableUniqueConstraints,
- mappedByResolver,
- propertyRefResolver,
- reflectionManager
- );
- }
-
- @Override
- public void setCacheConcurrencyStrategy(
- String clazz, String concurrencyStrategy, String region, boolean cacheLazyProperty
- ) throws MappingException {
- caches.add( new CacheHolder( clazz, concurrencyStrategy, region, true, cacheLazyProperty ) );
- }
-
- @Override
- public void setCollectionCacheConcurrencyStrategy(String collectionRole, String concurrencyStrategy, String region)
- throws MappingException {
- caches.add( new CacheHolder( collectionRole, concurrencyStrategy, region, false, false ) );
- }
-
- @Override
- protected void reset() {
- super.reset();
- namedGenerators = new HashMap();
- joins = new HashMap<String, Map<String, Join>>();
- classTypes = new HashMap<String, AnnotatedClassType>();
- generatorTables = new HashMap<String, Properties>();
- defaultNamedQueryNames = new HashSet<String>();
- defaultNamedNativeQueryNames = new HashSet<String>();
- defaultSqlResulSetMappingNames = new HashSet<String>();
- defaultNamedGenerators = new HashSet<String>();
- tableUniqueConstraints = new HashMap<Table, List<String[]>>();
- mappedByResolver = new HashMap<String, String>();
- propertyRefResolver = new HashMap<String, String>();
- annotatedClasses = new ArrayList<XClass>();
- caches = new ArrayList<CacheHolder>();
- hbmEntities = new HashMap<String, Document>();
- annotatedClassEntities = new HashMap<String, XClass>();
- hbmDocuments = new ArrayList<Document>();
- namingStrategy = EJB3NamingStrategy.INSTANCE;
- setEntityResolver( new EJB3DTDEntityResolver() );
- reflectionManager = new EJB3ReflectionManager();
- }
-
- @Override
- protected void secondPassCompile() throws MappingException {
- log.debug( "Execute first pass mapping processing" );
- //build annotatedClassEntities
- {
- List<XClass> tempAnnotatedClasses = new ArrayList<XClass>( annotatedClasses.size() );
- for ( XClass clazz : annotatedClasses ) {
- if ( clazz.isAnnotationPresent( Entity.class ) ) {
- annotatedClassEntities.put( clazz.getName(), clazz );
- tempAnnotatedClasses.add( clazz );
- }
- else if ( clazz.isAnnotationPresent( MappedSuperclass.class ) ) {
- tempAnnotatedClasses.add( clazz );
- }
- //only keep MappedSuperclasses and Entity in this list
- }
- annotatedClasses = tempAnnotatedClasses;
- }
-
- //process default values first
- if ( ! isDefaultProcessed ) {
- AnnotationBinder.bindDefaults( createExtendedMappings() );
- isDefaultProcessed = true;
- }
-
- //process entities
- if ( precedence == null ) precedence = getProperties().getProperty( ARTEFACT );
- if ( precedence == null ) precedence = DEFAULT_PRECEDENCE;
- StringTokenizer precedences = new StringTokenizer( precedence, ",; ", false );
- if ( ! precedences.hasMoreElements() ) {
- throw new MappingException( ARTEFACT + " cannot be empty: " + precedence );
- }
- while ( precedences.hasMoreElements() ) {
- String artifact = (String) precedences.nextElement();
- removeConflictedArtifact( artifact );
- processArtifactsOfType( artifact );
- }
-
- int cacheNbr = caches.size();
- for ( int index = 0; index < cacheNbr ; index++ ) {
- CacheHolder cacheHolder = caches.get( index );
- if ( cacheHolder.isClass ) {
- super.setCacheConcurrencyStrategy(
- cacheHolder.role, cacheHolder.usage, cacheHolder.region, cacheHolder.cacheLazy
- );
- }
- else {
- super.setCollectionCacheConcurrencyStrategy( cacheHolder.role, cacheHolder.usage, cacheHolder.region );
- }
- }
- caches.clear();
-
- inSecondPass = true;
- processFkSecondPassInOrder();
- Iterator iter = secondPasses.iterator();
- while ( iter.hasNext() ) {
- SecondPass sp = (SecondPass) iter.next();
- //do the second pass of fk before the others and remove them
- if ( sp instanceof CreateKeySecondPass ) {
- sp.doSecondPass( classes );
- iter.remove();
- }
- }
-
- //process OneToManySecondPass in order: first
- iter = secondPasses.iterator();
- while ( iter.hasNext() ) {
- SecondPass sp = (SecondPass) iter.next();
-
- if ( sp instanceof CreateKeySecondPass ) {
- sp.doSecondPass( classes );
- iter.remove();
- }
- }
- super.secondPassCompile();
- inSecondPass = false;
- Iterator tables = (Iterator<Map.Entry<Table, List<String[]>>>) tableUniqueConstraints.entrySet().iterator();
- Table table;
- Map.Entry entry;
- String keyName;
- int uniqueIndexPerTable;
- while ( tables.hasNext() ) {
- entry = (Map.Entry) tables.next();
- table = (Table) entry.getKey();
- List<String[]> uniqueConstraints = (List<String[]>) entry.getValue();
- uniqueIndexPerTable = 0;
- for ( String[] columnNames : uniqueConstraints ) {
- keyName = "key" + uniqueIndexPerTable++;
- buildUniqueKeyFromColumnNames( columnNames, table, keyName );
- }
- }
- boolean applyOnDdl = getProperties().getProperty(
- "hibernate.validator.apply_to_ddl", //org.hibernate.validator.Environment.APPLY_TO_DDL
- "true" )
- .equalsIgnoreCase( "true" );
-
- Constructor validatorCtr = null;
- Method applyMethod = null;
- try {
- Class classValidator = ReflectHelper.classForName("org.hibernate.validator.ClassValidator", this.getClass() );
- Class messageInterpolator = ReflectHelper.classForName("org.hibernate.validator.MessageInterpolator", this.getClass() );
- validatorCtr = classValidator.getDeclaredConstructor( new Class[] {
- Class.class, ResourceBundle.class, messageInterpolator, Map.class, ReflectionManager.class
- }
- );
- applyMethod = classValidator.getMethod( "apply", PersistentClass.class );
- }
- catch (ClassNotFoundException e) {
- log.info( "Hibernate Validator not found: ignoring");
- }
- catch (NoSuchMethodException e) {
- throw new AnnotationException(e);
- }
- if ( applyMethod != null && applyOnDdl) {
- for ( PersistentClass persistentClazz : (Collection<PersistentClass>) classes.values() ) {
- //integrate the validate framework
- String className = persistentClazz.getClassName();
- if ( StringHelper.isNotEmpty( className ) ) {
- try {
- Object validator = validatorCtr.newInstance(
- ReflectHelper.classForName( className ), null, null, null, reflectionManager
- );
- applyMethod.invoke( validator, persistentClazz );
- }
- catch (Exception e) {
- log.warn("Unable to apply constraints on DDL for " + className, e);
- }
- }
- }
- }
- }
-
- private void processFkSecondPassInOrder() {
- log.debug( "processing manytoone fk mappings" );
- Iterator iter = secondPasses.iterator();
- /* We need to process FKSecond pass trying to resolve any
- * graph circularity (ie PK made of a many to one linking to
- * an entity having a PK made of a ManyToOne ...
- */
- SortedSet<FkSecondPass> fkSecondPasses = new TreeSet<FkSecondPass>(
- new Comparator() {
- //The comparator implementation has to respect the compare=0 => equals() = true for sets
- public int compare(Object o1, Object o2) {
- if (! (o1 instanceof FkSecondPass && o2 instanceof FkSecondPass) ) {
- throw new AssertionFailure("comparint FkSecondPass with non FkSecondPass");
- }
- FkSecondPass f1 = (FkSecondPass) o1;
- FkSecondPass f2 = (FkSecondPass) o2;
- int compare = f1.getValue().getTable().getQuotedName().compareTo(
- f2.getValue().getTable().getQuotedName()
- );
- if (compare == 0) {
- //same table, we still need to differenciate true equality
- if ( f1.hashCode() < f2.hashCode() ) {
- compare = -1;
- }
- else if ( f1.hashCode() == f2.hashCode() ) {
- compare = 0;
- }
- else {
- compare = 1;
- }
- }
- return compare;
- }
- }
- );
- while ( iter.hasNext() ) {
- SecondPass sp = (SecondPass) iter.next();
- //do the second pass of fk before the others and remove them
- if ( sp instanceof FkSecondPass ) {
- fkSecondPasses.add( (FkSecondPass) sp );
- iter.remove();
- }
- }
- if ( fkSecondPasses.size() > 0 ) {
- Map<String, Set<String>> isADependencyOf = new HashMap<String, Set<String>>();
- List orderedFkSecondPasses = new ArrayList( fkSecondPasses.size() );
- List endOfQueueFkSecondPasses = new ArrayList( fkSecondPasses.size() );
- List orderedTable = new ArrayList( fkSecondPasses.size() );
- Iterator it = fkSecondPasses.iterator();
- while ( it.hasNext() ) {
- FkSecondPass sp = (FkSecondPass) it.next();
- String referenceEntityName = sp.getValue().getReferencedEntityName();
- PersistentClass classMapping = getClassMapping( referenceEntityName );
- if ( sp.isInPrimaryKey() ) {
- String dependentTable = classMapping.getTable().getQuotedName();
- if ( ! isADependencyOf.containsKey( dependentTable ) ) {
- isADependencyOf.put( dependentTable, new HashSet<String>() );
- }
- String table = sp.getValue().getTable().getQuotedName();
- isADependencyOf.get( dependentTable ).add( table );
- int beAfter = orderedTable.indexOf( dependentTable );
- int beBefore = orderedFkSecondPasses.size();
- Set<String> dependencies = isADependencyOf.get( table );
- if ( dependencies != null ) {
- for ( String tableDep : dependencies ) {
- //for each declared dependency take the lowest index
- int index = orderedTable.indexOf( tableDep );
- //index = -1 when we have a self dependency
- beBefore = index != -1 && index < beBefore ? index : beBefore;
- }
- }
- int currentIndex = orderedTable.indexOf( table );
- if ( beBefore < beAfter ||
- ( currentIndex != -1 && ( currentIndex < beAfter || currentIndex > beBefore ) )
- ) {
- StringBuilder sb = new StringBuilder(
- "Foreign key circularity dependency involving the following tables: "
- );
- //TODO deduplicate tables
- sb.append( table );
- if ( beAfter > -1 ) sb.append( ", " ).append( dependentTable );
- if ( beBefore < orderedFkSecondPasses.size() ) {
- sb.append( ", " ).append( orderedTable.get( beBefore ) );
- }
- throw new AnnotationException( sb.toString() );
- }
- currentIndex = currentIndex == -1 ? beBefore : currentIndex;
- orderedTable.add( currentIndex, table );
- orderedFkSecondPasses.add( currentIndex, sp );
- }
- else {
- endOfQueueFkSecondPasses.add( sp );
- }
- }
- it = orderedFkSecondPasses.listIterator();
- while ( it.hasNext() ) {
- ( (SecondPass) it.next() ).doSecondPass( classes );
- }
- it = endOfQueueFkSecondPasses.listIterator();
- while ( it.hasNext() ) {
- ( (SecondPass) it.next() ).doSecondPass( classes );
- }
- }
- }
-
- private void processArtifactsOfType(String artifact) {
- if ( "hbm".equalsIgnoreCase( artifact ) ) {
- log.debug( "Process hbm files" );
- for ( Document document : hbmDocuments ) {
- super.add( document );
- }
- hbmDocuments.clear();
- hbmEntities.clear();
- }
- else if ( "class".equalsIgnoreCase( artifact ) ) {
- log.debug( "Process annotated classes" );
- //bind classes in the correct order calculating some inheritance state
- List<XClass> orderedClasses = orderAndFillHierarchy( annotatedClasses );
- Map<XClass, InheritanceState> inheritanceStatePerClass = AnnotationBinder.buildInheritanceStates(
- orderedClasses, reflectionManager
- );
- ExtendedMappings mappings = createExtendedMappings();
- for ( XClass clazz : orderedClasses ) {
- //todo use the same extended mapping
- AnnotationBinder.bindClass( clazz, inheritanceStatePerClass, mappings );
- }
- annotatedClasses.clear();
- annotatedClassEntities.clear();
- }
- else {
- log.warn( "Unknown artifact: " + artifact );
- }
- }
-
- private void removeConflictedArtifact(String artifact) {
- if ( "hbm".equalsIgnoreCase( artifact ) ) {
- for ( String entity : hbmEntities.keySet() ) {
- if ( annotatedClassEntities.containsKey( entity ) ) {
- annotatedClasses.remove( annotatedClassEntities.get( entity ) );
- annotatedClassEntities.remove( entity );
- }
- }
- }
- else if ( "class".equalsIgnoreCase( artifact ) ) {
- for ( String entity : annotatedClassEntities.keySet() ) {
- if ( hbmEntities.containsKey( entity ) ) {
- hbmDocuments.remove( hbmEntities.get( entity ) );
- hbmEntities.remove( entity );
- }
- }
- }
- }
-
- private void buildUniqueKeyFromColumnNames(String[] columnNames, Table table, String keyName) {
- UniqueKey uc;
- int size = columnNames.length;
- Column[] columns = new Column[size];
- Set<Column> unbound = new HashSet<Column>();
- Set<Column> unboundNoLogical = new HashSet<Column>();
- ExtendedMappings mappings = createExtendedMappings();
- for ( int index = 0; index < size ; index++ ) {
- String columnName;
- try {
- columnName = mappings.getPhysicalColumnName( columnNames[index], table );
- columns[index] = new Column( columnName );
- unbound.add( columns[index] );
- //column equals and hashcode is based on column name
- }
- catch( MappingException e ) {
- unboundNoLogical.add( new Column( columnNames[index] ) );
- }
- }
- for ( Column column : columns ) {
- if ( table.containsColumn( column ) ) {
- uc = table.getOrCreateUniqueKey( keyName );
- uc.addColumn( table.getColumn( column ) );
- unbound.remove( column );
- }
- }
- if ( unbound.size() > 0 || unboundNoLogical.size() > 0 ) {
- StringBuilder sb = new StringBuilder( "Unable to create unique key constraint (" );
- for ( String columnName : columnNames ) {
- sb.append( columnName ).append( ", " );
- }
- sb.setLength( sb.length() - 2 );
- sb.append( ") on table " ).append( table.getName() ).append( ": " );
- for ( Column column : unbound ) {
- sb.append( column.getName() ).append( ", " );
- }
- for ( Column column : unboundNoLogical ) {
- sb.append( column.getName() ).append( ", " );
- }
- sb.setLength( sb.length() - 2 );
- sb.append( " not found" );
- throw new AnnotationException( sb.toString() );
- }
- }
-
- @Override
- protected void parseMappingElement(Element subelement, String name) {
- Attribute rsrc = subelement.attribute( "resource" );
- Attribute file = subelement.attribute( "file" );
- Attribute jar = subelement.attribute( "jar" );
- Attribute pckg = subelement.attribute( "package" );
- Attribute clazz = subelement.attribute( "class" );
- if ( rsrc != null ) {
- log.debug( name + "<-" + rsrc );
- addResource( rsrc.getValue() );
- }
- else if ( jar != null ) {
- log.debug( name + "<-" + jar );
- addJar( new File( jar.getValue() ) );
- }
- else if ( file != null ) {
- log.debug( name + "<-" + file );
- addFile( file.getValue() );
- }
- else if ( pckg != null ) {
- log.debug( name + "<-" + pckg );
- addPackage( pckg.getValue() );
- }
- else if ( clazz != null ) {
- log.debug( name + "<-" + clazz );
- Class loadedClass = null;
- try {
- loadedClass = ReflectHelper.classForName( clazz.getValue() );
- }
- catch (ClassNotFoundException cnf) {
- throw new MappingException(
- "Unable to load class declared as <mapping class=\"" + clazz.getValue() + "\"/> in the configuration:",
- cnf
- );
- }
- catch (NoClassDefFoundError ncdf) {
- throw new MappingException(
- "Unable to load class declared as <mapping class=\"" + clazz.getValue() + "\"/> in the configuration:",
- ncdf
- );
- }
-
- addAnnotatedClass( loadedClass );
- }
- else {
- throw new MappingException( "<mapping> element in configuration specifies no attributes" );
- }
- }
-
- @Override
- protected void add(org.dom4j.Document doc) throws MappingException {
- boolean ejb3Xml = "entity-mappings".equals( doc.getRootElement().getName() );
- if ( inSecondPass ) {
- //if in second pass bypass the queueing, getExtendedQueue reuse this method
- if ( !ejb3Xml ) super.add( doc );
- }
- else {
- if ( ! ejb3Xml ) {
- final Element hmNode = doc.getRootElement();
- Attribute packNode = hmNode.attribute( "package" );
- String defaultPackage = packNode != null
- ? packNode.getValue()
- : "";
- Set<String> entityNames = new HashSet<String>();
- findClassNames( defaultPackage, hmNode, entityNames );
- for ( String entity : entityNames ) {
- hbmEntities.put( entity, doc );
- }
- hbmDocuments.add( doc );
- }
- else {
- List<String> classnames = ( (EJB3ReflectionManager) reflectionManager ).getXMLContext().addDocument( doc );
- for ( String classname : classnames ) {
- try {
- annotatedClasses.add( reflectionManager.classForName( classname, this.getClass() ) );
- }
- catch (ClassNotFoundException e) {
- throw new AnnotationException( "Unable to load class defined in XML: " + classname, e );
- }
- }
- }
- }
- }
-
- private static void findClassNames(
- String defaultPackage, final Element startNode,
- final java.util.Set names
- ) {
- // if we have some extends we need to check if those classes possibly could be inside the
- // same hbm.xml file...
- Iterator[] classes = new Iterator[4];
- classes[0] = startNode.elementIterator( "class" );
- classes[1] = startNode.elementIterator( "subclass" );
- classes[2] = startNode.elementIterator( "joined-subclass" );
- classes[3] = startNode.elementIterator( "union-subclass" );
-
- Iterator classIterator = new JoinedIterator( classes );
- while ( classIterator.hasNext() ) {
- Element element = (Element) classIterator.next();
- String entityName = element.attributeValue( "entity-name" );
- if ( entityName == null ) entityName = getClassName( element.attribute( "name" ), defaultPackage );
- names.add( entityName );
- findClassNames( defaultPackage, element, names );
- }
- }
-
- private static String getClassName(Attribute name, String defaultPackage) {
- if ( name == null ) return null;
- String unqualifiedName = name.getValue();
- if ( unqualifiedName == null ) return null;
- if ( unqualifiedName.indexOf( '.' ) < 0 && defaultPackage != null ) {
- return defaultPackage + '.' + unqualifiedName;
- }
- return unqualifiedName;
- }
-
- public void setPrecedence(String precedence) {
- this.precedence = precedence;
- }
-
- private static class CacheHolder {
- public CacheHolder(String role, String usage, String region, boolean isClass, boolean cacheLazy) {
- this.role = role;
- this.usage = usage;
- this.region = region;
- this.isClass = isClass;
- this.cacheLazy = cacheLazy;
- }
-
- public String role;
- public String usage;
- public String region;
- public boolean isClass;
- public boolean cacheLazy;
- }
-
- @Override
- public Configuration addInputStream(InputStream xmlInputStream) throws MappingException {
- try {
- List errors = new ArrayList();
- SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, getEntityResolver() );
- try {
- saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
- //saxReader.setFeature( "http://apache.org/xml/features/validation/dynamic", true );
- //set the default schema locators
- saxReader.setProperty(
- "http://apache.org/xml/properties/schema/external-schemaLocation",
- "http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
- );
- }
- catch (SAXException e) {
- saxReader.setValidation( false );
- }
- org.dom4j.Document doc = saxReader
- .read( new InputSource( xmlInputStream ) );
-
- if ( errors.size() != 0 ) {
- throw new MappingException( "invalid mapping", (Throwable) errors.get( 0 ) );
- }
- add( doc );
- return this;
- }
- catch (DocumentException e) {
- throw new MappingException( "Could not parse mapping document in input stream", e );
- }
- finally {
- try {
- xmlInputStream.close();
- }
- catch (IOException ioe) {
- log.warn( "Could not close input stream", ioe );
- }
- }
- }
-
- public SessionFactory buildSessionFactory() throws HibernateException {
- //add validator events if the jar is available
- boolean enableValidatorListeners = ! "false".equalsIgnoreCase( getProperty( "hibernate.validator.autoregister_listeners" ) );
- Class validateEventListenerClass = null;
- try {
- validateEventListenerClass = ReflectHelper.classForName(
- "org.hibernate.validator.event.ValidateEventListener",
- AnnotationConfiguration.class );
- }
- catch (ClassNotFoundException e) {
- //validator is not present
- log.debug( "Validator not present in classpath, ignoring event listener registration" );
- }
- if (enableValidatorListeners && validateEventListenerClass != null) {
- //TODO so much duplication
- Object validateEventListener;
- try {
- validateEventListener = validateEventListenerClass.newInstance();
- }
- catch (Exception e) {
- throw new AnnotationException("Unable to load Validator event listener", e );
- }
- {
- boolean present = false;
- PreInsertEventListener[] listeners = getEventListeners().getPreInsertEventListeners();
- if (listeners != null) {
- for ( Object eventListener : listeners ) {
- //not isAssignableFrom since the user could subclass
- present = present || validateEventListenerClass == eventListener.getClass();
- }
- if (!present) {
- int length = listeners.length + 1;
- PreInsertEventListener[] newListeners = new PreInsertEventListener[length];
- for ( int i = 0 ; i < length - 1 ; i++ ) {
- newListeners[i] = listeners[i];
- }
- newListeners[length-1] = (PreInsertEventListener) validateEventListener;
- getEventListeners().setPreInsertEventListeners(newListeners);
- }
- }
- else {
- getEventListeners().setPreInsertEventListeners(
- new PreInsertEventListener[] { (PreInsertEventListener) validateEventListener }
- );
- }
- }
-
- //update event listener
- {
- boolean present = false;
- PreUpdateEventListener[] listeners = getEventListeners().getPreUpdateEventListeners();
- if (listeners != null) {
- for ( Object eventListener : listeners ) {
- //not isAssignableFrom since the user could subclass
- present = present || validateEventListenerClass == eventListener.getClass();
- }
- if (!present) {
- int length = listeners.length + 1;
- PreUpdateEventListener[] newListeners = new PreUpdateEventListener[length];
- for ( int i = 0 ; i < length - 1 ; i++ ) {
- newListeners[i] = listeners[i];
- }
- newListeners[length-1] = (PreUpdateEventListener) validateEventListener;
- getEventListeners().setPreUpdateEventListeners(newListeners);
- }
- }
- else {
- getEventListeners().setPreUpdateEventListeners(
- new PreUpdateEventListener[] { (PreUpdateEventListener) validateEventListener }
- );
- }
- }
- }
-
- //add search events if the jar is available
- boolean enableSearchListeners = ! "false".equalsIgnoreCase( getProperty( "hibernate.search.autoregister_listeners" ) );
- Class searchEventListenerClass = null;
- try {
- searchEventListenerClass = ReflectHelper.classForName(
- "org.hibernate.search.event.FullTextIndexEventListener",
- AnnotationConfiguration.class );
- }
- catch (ClassNotFoundException e) {
- //search is not present
- log.debug( "Search not present in classpath, ignoring event listener registration" );
- }
- if (enableSearchListeners && searchEventListenerClass != null) {
- //TODO so much duplication
- Object searchEventListener;
- try {
- searchEventListener = searchEventListenerClass.newInstance();
- }
- catch (Exception e) {
- throw new AnnotationException("Unable to load Search event listener", e );
- }
- {
- boolean present = false;
- PostInsertEventListener[] listeners = getEventListeners().getPostInsertEventListeners();
- if (listeners != null) {
- for ( Object eventListener : listeners ) {
- //not isAssignableFrom since the user could subclass
- present = present || searchEventListenerClass == eventListener.getClass();
- }
- if (!present) {
- int length = listeners.length + 1;
- PostInsertEventListener[] newListeners = new PostInsertEventListener[length];
- for ( int i = 0 ; i < length - 1 ; i++ ) {
- newListeners[i] = listeners[i];
- }
- newListeners[length-1] = (PostInsertEventListener) searchEventListener;
- getEventListeners().setPostInsertEventListeners(newListeners);
- }
- }
- else {
- getEventListeners().setPostInsertEventListeners(
- new PostInsertEventListener[] { (PostInsertEventListener) searchEventListener }
- );
- }
- }
- {
- boolean present = false;
- PostUpdateEventListener[] listeners = getEventListeners().getPostUpdateEventListeners();
- if (listeners != null) {
- for ( Object eventListener : listeners ) {
- //not isAssignableFrom since the user could subclass
- present = present || searchEventListenerClass == eventListener.getClass();
- }
- if (!present) {
- int length = listeners.length + 1;
- PostUpdateEventListener[] newListeners = new PostUpdateEventListener[length];
- for ( int i = 0 ; i < length - 1 ; i++ ) {
- newListeners[i] = listeners[i];
- }
- newListeners[length-1] = (PostUpdateEventListener) searchEventListener;
- getEventListeners().setPostUpdateEventListeners(newListeners);
- }
- }
- else {
- getEventListeners().setPostUpdateEventListeners(
- new PostUpdateEventListener[] { (PostUpdateEventListener) searchEventListener }
- );
- }
- }
- {
- boolean present = false;
- PostDeleteEventListener[] listeners = getEventListeners().getPostDeleteEventListeners();
- if (listeners != null) {
- for ( Object eventListener : listeners ) {
- //not isAssignableFrom since the user could subclass
- present = present || searchEventListenerClass == eventListener.getClass();
- }
- if (!present) {
- int length = listeners.length + 1;
- PostDeleteEventListener[] newListeners = new PostDeleteEventListener[length];
- for ( int i = 0 ; i < length - 1 ; i++ ) {
- newListeners[i] = listeners[i];
- }
- newListeners[length-1] = (PostDeleteEventListener) searchEventListener;
- getEventListeners().setPostDeleteEventListeners(newListeners);
- }
- }
- else {
- getEventListeners().setPostDeleteEventListeners(
- new PostDeleteEventListener[] { (PostDeleteEventListener) searchEventListener }
- );
- }
- }
- }
- return super.buildSessionFactory();
- }
-
- //not a public API
- public ReflectionManager getReflectionManager() {
- return reflectionManager;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/AnnotationConfiguration.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,922 @@
+// $Id$
+package org.hibernate.cfg;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.SortedSet;
+import java.util.StringTokenizer;
+import java.util.TreeSet;
+import javax.persistence.Entity;
+import javax.persistence.MappedSuperclass;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.dom4j.Attribute;
+import org.dom4j.Document;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.SessionFactory;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.cfg.annotations.Version;
+import org.hibernate.cfg.annotations.reflection.EJB3ReflectionManager;
+import org.hibernate.event.PreInsertEventListener;
+import org.hibernate.event.PreUpdateEventListener;
+import org.hibernate.event.PostInsertEventListener;
+import org.hibernate.event.PostUpdateEventListener;
+import org.hibernate.event.PostDeleteEventListener;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Table;
+import org.hibernate.mapping.UniqueKey;
+import org.hibernate.util.JoinedIterator;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.util.StringHelper;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+
+/**
+ * Similar to the {@link Configuration} object but handles EJB3 and Hibernate
+ * specific annotations as a metadata facility
+ *
+ * @author Emmanuel Bernard
+ */
+public class AnnotationConfiguration extends Configuration {
+ private static Log log = LogFactory.getLog( AnnotationConfiguration.class );
+
+ static {
+ Version.touch(); //touch version
+ }
+
+ public static final String ARTEFACT = "hibernate.mapping.precedence";
+ public static final String DEFAULT_PRECEDENCE = "hbm, class";
+
+ private Map namedGenerators;
+ private Map<String, Map<String, Join>> joins;
+ private Map<String, AnnotatedClassType> classTypes;
+ private Set<String> defaultNamedQueryNames;
+ private Set<String> defaultNamedNativeQueryNames;
+ private Set<String> defaultSqlResulSetMappingNames;
+ private Set<String> defaultNamedGenerators;
+ private Map<String, Properties> generatorTables;
+ private Map<Table, List<String[]>> tableUniqueConstraints;
+ private Map<String, String> mappedByResolver;
+ private Map<String, String> propertyRefResolver;
+ private List<XClass> annotatedClasses;
+ private Map<String, XClass> annotatedClassEntities;
+ private Map<String, Document> hbmEntities;
+ private List<CacheHolder> caches;
+ private List<Document> hbmDocuments; //user ordering matters, hence the list
+ private String precedence = null;
+ private boolean inSecondPass = false;
+ private transient ReflectionManager reflectionManager;
+ private boolean isDefaultProcessed = false;
+
+ public AnnotationConfiguration() {
+ super();
+ }
+
+ public AnnotationConfiguration(SettingsFactory sf) {
+ super( sf );
+ }
+
+ protected List<XClass> orderAndFillHierarchy(List<XClass> original) {
+ //TODO remove embeddable
+ List<XClass> copy = new ArrayList<XClass>( original );
+ //for each class, copy all the relevent hierarchy
+ for ( XClass clazz : original ) {
+ XClass superClass = clazz.getSuperclass();
+ while ( superClass != null && ! reflectionManager.equals( superClass, Object.class ) && ! copy.contains( superClass ) ) {
+ if ( superClass.isAnnotationPresent( Entity.class )
+ || superClass.isAnnotationPresent( MappedSuperclass.class ) ) {
+ copy.add( superClass );
+ }
+ superClass = superClass.getSuperclass();
+ }
+ }
+ List<XClass> workingCopy = new ArrayList<XClass>( copy );
+ List<XClass> newList = new ArrayList<XClass>( copy.size() );
+ while ( workingCopy.size() > 0 ) {
+ XClass clazz = workingCopy.get( 0 );
+ orderHierarchy( workingCopy, newList, copy, clazz );
+ }
+ return newList;
+ }
+
+ private void orderHierarchy(List<XClass> copy, List<XClass> newList, List<XClass> original, XClass clazz) {
+ if ( clazz == null || reflectionManager.equals( clazz, Object.class ) ) return;
+ //process superclass first
+ orderHierarchy( copy, newList, original, clazz.getSuperclass() );
+ if ( original.contains( clazz ) ) {
+ if ( !newList.contains( clazz ) ) {
+ newList.add( clazz );
+ }
+ copy.remove( clazz );
+ }
+ }
+
+ /**
+ * Read a mapping from the class annotation metadata (JSR 175).
+ *
+ * @param persistentClass the mapped class
+ * @return the configuration object
+ */
+ public AnnotationConfiguration addAnnotatedClass(Class persistentClass) throws MappingException {
+ XClass persistentXClass = reflectionManager.toXClass( persistentClass );
+ try {
+ annotatedClasses.add( persistentXClass );
+ return this;
+ }
+ catch (MappingException me) {
+ log.error( "Could not compile the mapping annotations", me );
+ throw me;
+ }
+ }
+
+ /**
+ * Read package level metadata
+ *
+ * @param packageName java package name
+ * @return the configuration object
+ */
+ public AnnotationConfiguration addPackage(String packageName) throws MappingException {
+ log.info( "Mapping package " + packageName );
+ try {
+ AnnotationBinder.bindPackage( packageName, createExtendedMappings() );
+ return this;
+ }
+ catch (MappingException me) {
+ log.error( "Could not compile the mapping annotations", me );
+ throw me;
+ }
+ }
+
+ public ExtendedMappings createExtendedMappings() {
+ return new ExtendedMappings(
+ classes,
+ collections,
+ tables,
+ namedQueries,
+ namedSqlQueries,
+ sqlResultSetMappings,
+ defaultNamedQueryNames,
+ defaultNamedNativeQueryNames,
+ defaultSqlResulSetMappingNames,
+ defaultNamedGenerators,
+ imports,
+ secondPasses,
+ propertyReferences,
+ namingStrategy,
+ typeDefs,
+ filterDefinitions,
+ namedGenerators,
+ joins,
+ classTypes,
+ extendsQueue,
+ tableNameBinding, columnNameBindingPerTable, auxiliaryDatabaseObjects,
+ generatorTables,
+ tableUniqueConstraints,
+ mappedByResolver,
+ propertyRefResolver,
+ reflectionManager
+ );
+ }
+
+ @Override
+ public void setCacheConcurrencyStrategy(
+ String clazz, String concurrencyStrategy, String region, boolean cacheLazyProperty
+ ) throws MappingException {
+ caches.add( new CacheHolder( clazz, concurrencyStrategy, region, true, cacheLazyProperty ) );
+ }
+
+ @Override
+ public void setCollectionCacheConcurrencyStrategy(String collectionRole, String concurrencyStrategy, String region)
+ throws MappingException {
+ caches.add( new CacheHolder( collectionRole, concurrencyStrategy, region, false, false ) );
+ }
+
+ @Override
+ protected void reset() {
+ super.reset();
+ namedGenerators = new HashMap();
+ joins = new HashMap<String, Map<String, Join>>();
+ classTypes = new HashMap<String, AnnotatedClassType>();
+ generatorTables = new HashMap<String, Properties>();
+ defaultNamedQueryNames = new HashSet<String>();
+ defaultNamedNativeQueryNames = new HashSet<String>();
+ defaultSqlResulSetMappingNames = new HashSet<String>();
+ defaultNamedGenerators = new HashSet<String>();
+ tableUniqueConstraints = new HashMap<Table, List<String[]>>();
+ mappedByResolver = new HashMap<String, String>();
+ propertyRefResolver = new HashMap<String, String>();
+ annotatedClasses = new ArrayList<XClass>();
+ caches = new ArrayList<CacheHolder>();
+ hbmEntities = new HashMap<String, Document>();
+ annotatedClassEntities = new HashMap<String, XClass>();
+ hbmDocuments = new ArrayList<Document>();
+ namingStrategy = EJB3NamingStrategy.INSTANCE;
+ setEntityResolver( new EJB3DTDEntityResolver() );
+ reflectionManager = new EJB3ReflectionManager();
+ }
+
+ @Override
+ protected void secondPassCompile() throws MappingException {
+ log.debug( "Execute first pass mapping processing" );
+ //build annotatedClassEntities
+ {
+ List<XClass> tempAnnotatedClasses = new ArrayList<XClass>( annotatedClasses.size() );
+ for ( XClass clazz : annotatedClasses ) {
+ if ( clazz.isAnnotationPresent( Entity.class ) ) {
+ annotatedClassEntities.put( clazz.getName(), clazz );
+ tempAnnotatedClasses.add( clazz );
+ }
+ else if ( clazz.isAnnotationPresent( MappedSuperclass.class ) ) {
+ tempAnnotatedClasses.add( clazz );
+ }
+ //only keep MappedSuperclasses and Entity in this list
+ }
+ annotatedClasses = tempAnnotatedClasses;
+ }
+
+ //process default values first
+ if ( ! isDefaultProcessed ) {
+ AnnotationBinder.bindDefaults( createExtendedMappings() );
+ isDefaultProcessed = true;
+ }
+
+ //process entities
+ if ( precedence == null ) precedence = getProperties().getProperty( ARTEFACT );
+ if ( precedence == null ) precedence = DEFAULT_PRECEDENCE;
+ StringTokenizer precedences = new StringTokenizer( precedence, ",; ", false );
+ if ( ! precedences.hasMoreElements() ) {
+ throw new MappingException( ARTEFACT + " cannot be empty: " + precedence );
+ }
+ while ( precedences.hasMoreElements() ) {
+ String artifact = (String) precedences.nextElement();
+ removeConflictedArtifact( artifact );
+ processArtifactsOfType( artifact );
+ }
+
+ int cacheNbr = caches.size();
+ for ( int index = 0; index < cacheNbr ; index++ ) {
+ CacheHolder cacheHolder = caches.get( index );
+ if ( cacheHolder.isClass ) {
+ super.setCacheConcurrencyStrategy(
+ cacheHolder.role, cacheHolder.usage, cacheHolder.region, cacheHolder.cacheLazy
+ );
+ }
+ else {
+ super.setCollectionCacheConcurrencyStrategy( cacheHolder.role, cacheHolder.usage, cacheHolder.region );
+ }
+ }
+ caches.clear();
+
+ inSecondPass = true;
+ processFkSecondPassInOrder();
+ Iterator iter = secondPasses.iterator();
+ while ( iter.hasNext() ) {
+ SecondPass sp = (SecondPass) iter.next();
+ //do the second pass of fk before the others and remove them
+ if ( sp instanceof CreateKeySecondPass ) {
+ sp.doSecondPass( classes );
+ iter.remove();
+ }
+ }
+
+ //process OneToManySecondPass in order: first
+ iter = secondPasses.iterator();
+ while ( iter.hasNext() ) {
+ SecondPass sp = (SecondPass) iter.next();
+
+ if ( sp instanceof CreateKeySecondPass ) {
+ sp.doSecondPass( classes );
+ iter.remove();
+ }
+ }
+ super.secondPassCompile();
+ inSecondPass = false;
+ Iterator tables = (Iterator<Map.Entry<Table, List<String[]>>>) tableUniqueConstraints.entrySet().iterator();
+ Table table;
+ Map.Entry entry;
+ String keyName;
+ int uniqueIndexPerTable;
+ while ( tables.hasNext() ) {
+ entry = (Map.Entry) tables.next();
+ table = (Table) entry.getKey();
+ List<String[]> uniqueConstraints = (List<String[]>) entry.getValue();
+ uniqueIndexPerTable = 0;
+ for ( String[] columnNames : uniqueConstraints ) {
+ keyName = "key" + uniqueIndexPerTable++;
+ buildUniqueKeyFromColumnNames( columnNames, table, keyName );
+ }
+ }
+ boolean applyOnDdl = getProperties().getProperty(
+ "hibernate.validator.apply_to_ddl", //org.hibernate.validator.Environment.APPLY_TO_DDL
+ "true" )
+ .equalsIgnoreCase( "true" );
+
+ Constructor validatorCtr = null;
+ Method applyMethod = null;
+ try {
+ Class classValidator = ReflectHelper.classForName("org.hibernate.validator.ClassValidator", this.getClass() );
+ Class messageInterpolator = ReflectHelper.classForName("org.hibernate.validator.MessageInterpolator", this.getClass() );
+ validatorCtr = classValidator.getDeclaredConstructor( new Class[] {
+ Class.class, ResourceBundle.class, messageInterpolator, Map.class, ReflectionManager.class
+ }
+ );
+ applyMethod = classValidator.getMethod( "apply", PersistentClass.class );
+ }
+ catch (ClassNotFoundException e) {
+ log.info( "Hibernate Validator not found: ignoring");
+ }
+ catch (NoSuchMethodException e) {
+ throw new AnnotationException(e);
+ }
+ if ( applyMethod != null && applyOnDdl) {
+ for ( PersistentClass persistentClazz : (Collection<PersistentClass>) classes.values() ) {
+ //integrate the validate framework
+ String className = persistentClazz.getClassName();
+ if ( StringHelper.isNotEmpty( className ) ) {
+ try {
+ Object validator = validatorCtr.newInstance(
+ ReflectHelper.classForName( className ), null, null, null, reflectionManager
+ );
+ applyMethod.invoke( validator, persistentClazz );
+ }
+ catch (Exception e) {
+ log.warn("Unable to apply constraints on DDL for " + className, e);
+ }
+ }
+ }
+ }
+ }
+
+ private void processFkSecondPassInOrder() {
+ log.debug( "processing manytoone fk mappings" );
+ Iterator iter = secondPasses.iterator();
+ /* We need to process FKSecond pass trying to resolve any
+ * graph circularity (ie PK made of a many to one linking to
+ * an entity having a PK made of a ManyToOne ...
+ */
+ SortedSet<FkSecondPass> fkSecondPasses = new TreeSet<FkSecondPass>(
+ new Comparator() {
+ //The comparator implementation has to respect the compare=0 => equals() = true for sets
+ public int compare(Object o1, Object o2) {
+ if (! (o1 instanceof FkSecondPass && o2 instanceof FkSecondPass) ) {
+ throw new AssertionFailure("comparint FkSecondPass with non FkSecondPass");
+ }
+ FkSecondPass f1 = (FkSecondPass) o1;
+ FkSecondPass f2 = (FkSecondPass) o2;
+ int compare = f1.getValue().getTable().getQuotedName().compareTo(
+ f2.getValue().getTable().getQuotedName()
+ );
+ if (compare == 0) {
+ //same table, we still need to differenciate true equality
+ if ( f1.hashCode() < f2.hashCode() ) {
+ compare = -1;
+ }
+ else if ( f1.hashCode() == f2.hashCode() ) {
+ compare = 0;
+ }
+ else {
+ compare = 1;
+ }
+ }
+ return compare;
+ }
+ }
+ );
+ while ( iter.hasNext() ) {
+ SecondPass sp = (SecondPass) iter.next();
+ //do the second pass of fk before the others and remove them
+ if ( sp instanceof FkSecondPass ) {
+ fkSecondPasses.add( (FkSecondPass) sp );
+ iter.remove();
+ }
+ }
+ if ( fkSecondPasses.size() > 0 ) {
+ Map<String, Set<String>> isADependencyOf = new HashMap<String, Set<String>>();
+ List orderedFkSecondPasses = new ArrayList( fkSecondPasses.size() );
+ List endOfQueueFkSecondPasses = new ArrayList( fkSecondPasses.size() );
+ List orderedTable = new ArrayList( fkSecondPasses.size() );
+ Iterator it = fkSecondPasses.iterator();
+ while ( it.hasNext() ) {
+ FkSecondPass sp = (FkSecondPass) it.next();
+ String referenceEntityName = sp.getValue().getReferencedEntityName();
+ PersistentClass classMapping = getClassMapping( referenceEntityName );
+ if ( sp.isInPrimaryKey() ) {
+ String dependentTable = classMapping.getTable().getQuotedName();
+ if ( ! isADependencyOf.containsKey( dependentTable ) ) {
+ isADependencyOf.put( dependentTable, new HashSet<String>() );
+ }
+ String table = sp.getValue().getTable().getQuotedName();
+ isADependencyOf.get( dependentTable ).add( table );
+ int beAfter = orderedTable.indexOf( dependentTable );
+ int beBefore = orderedFkSecondPasses.size();
+ Set<String> dependencies = isADependencyOf.get( table );
+ if ( dependencies != null ) {
+ for ( String tableDep : dependencies ) {
+ //for each declared dependency take the lowest index
+ int index = orderedTable.indexOf( tableDep );
+ //index = -1 when we have a self dependency
+ beBefore = index != -1 && index < beBefore ? index : beBefore;
+ }
+ }
+ int currentIndex = orderedTable.indexOf( table );
+ if ( beBefore < beAfter ||
+ ( currentIndex != -1 && ( currentIndex < beAfter || currentIndex > beBefore ) )
+ ) {
+ StringBuilder sb = new StringBuilder(
+ "Foreign key circularity dependency involving the following tables: "
+ );
+ //TODO deduplicate tables
+ sb.append( table );
+ if ( beAfter > -1 ) sb.append( ", " ).append( dependentTable );
+ if ( beBefore < orderedFkSecondPasses.size() ) {
+ sb.append( ", " ).append( orderedTable.get( beBefore ) );
+ }
+ throw new AnnotationException( sb.toString() );
+ }
+ currentIndex = currentIndex == -1 ? beBefore : currentIndex;
+ orderedTable.add( currentIndex, table );
+ orderedFkSecondPasses.add( currentIndex, sp );
+ }
+ else {
+ endOfQueueFkSecondPasses.add( sp );
+ }
+ }
+ it = orderedFkSecondPasses.listIterator();
+ while ( it.hasNext() ) {
+ ( (SecondPass) it.next() ).doSecondPass( classes );
+ }
+ it = endOfQueueFkSecondPasses.listIterator();
+ while ( it.hasNext() ) {
+ ( (SecondPass) it.next() ).doSecondPass( classes );
+ }
+ }
+ }
+
+ private void processArtifactsOfType(String artifact) {
+ if ( "hbm".equalsIgnoreCase( artifact ) ) {
+ log.debug( "Process hbm files" );
+ for ( Document document : hbmDocuments ) {
+ super.add( document );
+ }
+ hbmDocuments.clear();
+ hbmEntities.clear();
+ }
+ else if ( "class".equalsIgnoreCase( artifact ) ) {
+ log.debug( "Process annotated classes" );
+ //bind classes in the correct order calculating some inheritance state
+ List<XClass> orderedClasses = orderAndFillHierarchy( annotatedClasses );
+ Map<XClass, InheritanceState> inheritanceStatePerClass = AnnotationBinder.buildInheritanceStates(
+ orderedClasses, reflectionManager
+ );
+ ExtendedMappings mappings = createExtendedMappings();
+ for ( XClass clazz : orderedClasses ) {
+ //todo use the same extended mapping
+ AnnotationBinder.bindClass( clazz, inheritanceStatePerClass, mappings );
+ }
+ annotatedClasses.clear();
+ annotatedClassEntities.clear();
+ }
+ else {
+ log.warn( "Unknown artifact: " + artifact );
+ }
+ }
+
+ private void removeConflictedArtifact(String artifact) {
+ if ( "hbm".equalsIgnoreCase( artifact ) ) {
+ for ( String entity : hbmEntities.keySet() ) {
+ if ( annotatedClassEntities.containsKey( entity ) ) {
+ annotatedClasses.remove( annotatedClassEntities.get( entity ) );
+ annotatedClassEntities.remove( entity );
+ }
+ }
+ }
+ else if ( "class".equalsIgnoreCase( artifact ) ) {
+ for ( String entity : annotatedClassEntities.keySet() ) {
+ if ( hbmEntities.containsKey( entity ) ) {
+ hbmDocuments.remove( hbmEntities.get( entity ) );
+ hbmEntities.remove( entity );
+ }
+ }
+ }
+ }
+
+ private void buildUniqueKeyFromColumnNames(String[] columnNames, Table table, String keyName) {
+ UniqueKey uc;
+ int size = columnNames.length;
+ Column[] columns = new Column[size];
+ Set<Column> unbound = new HashSet<Column>();
+ Set<Column> unboundNoLogical = new HashSet<Column>();
+ ExtendedMappings mappings = createExtendedMappings();
+ for ( int index = 0; index < size ; index++ ) {
+ String columnName;
+ try {
+ columnName = mappings.getPhysicalColumnName( columnNames[index], table );
+ columns[index] = new Column( columnName );
+ unbound.add( columns[index] );
+ //column equals and hashcode is based on column name
+ }
+ catch( MappingException e ) {
+ unboundNoLogical.add( new Column( columnNames[index] ) );
+ }
+ }
+ for ( Column column : columns ) {
+ if ( table.containsColumn( column ) ) {
+ uc = table.getOrCreateUniqueKey( keyName );
+ uc.addColumn( table.getColumn( column ) );
+ unbound.remove( column );
+ }
+ }
+ if ( unbound.size() > 0 || unboundNoLogical.size() > 0 ) {
+ StringBuilder sb = new StringBuilder( "Unable to create unique key constraint (" );
+ for ( String columnName : columnNames ) {
+ sb.append( columnName ).append( ", " );
+ }
+ sb.setLength( sb.length() - 2 );
+ sb.append( ") on table " ).append( table.getName() ).append( ": " );
+ for ( Column column : unbound ) {
+ sb.append( column.getName() ).append( ", " );
+ }
+ for ( Column column : unboundNoLogical ) {
+ sb.append( column.getName() ).append( ", " );
+ }
+ sb.setLength( sb.length() - 2 );
+ sb.append( " not found" );
+ throw new AnnotationException( sb.toString() );
+ }
+ }
+
+ @Override
+ protected void parseMappingElement(Element subelement, String name) {
+ Attribute rsrc = subelement.attribute( "resource" );
+ Attribute file = subelement.attribute( "file" );
+ Attribute jar = subelement.attribute( "jar" );
+ Attribute pckg = subelement.attribute( "package" );
+ Attribute clazz = subelement.attribute( "class" );
+ if ( rsrc != null ) {
+ log.debug( name + "<-" + rsrc );
+ addResource( rsrc.getValue() );
+ }
+ else if ( jar != null ) {
+ log.debug( name + "<-" + jar );
+ addJar( new File( jar.getValue() ) );
+ }
+ else if ( file != null ) {
+ log.debug( name + "<-" + file );
+ addFile( file.getValue() );
+ }
+ else if ( pckg != null ) {
+ log.debug( name + "<-" + pckg );
+ addPackage( pckg.getValue() );
+ }
+ else if ( clazz != null ) {
+ log.debug( name + "<-" + clazz );
+ Class loadedClass = null;
+ try {
+ loadedClass = ReflectHelper.classForName( clazz.getValue() );
+ }
+ catch (ClassNotFoundException cnf) {
+ throw new MappingException(
+ "Unable to load class declared as <mapping class=\"" + clazz.getValue() + "\"/> in the configuration:",
+ cnf
+ );
+ }
+ catch (NoClassDefFoundError ncdf) {
+ throw new MappingException(
+ "Unable to load class declared as <mapping class=\"" + clazz.getValue() + "\"/> in the configuration:",
+ ncdf
+ );
+ }
+
+ addAnnotatedClass( loadedClass );
+ }
+ else {
+ throw new MappingException( "<mapping> element in configuration specifies no attributes" );
+ }
+ }
+
+ @Override
+ protected void add(org.dom4j.Document doc) throws MappingException {
+ boolean ejb3Xml = "entity-mappings".equals( doc.getRootElement().getName() );
+ if ( inSecondPass ) {
+ //if in second pass bypass the queueing, getExtendedQueue reuse this method
+ if ( !ejb3Xml ) super.add( doc );
+ }
+ else {
+ if ( ! ejb3Xml ) {
+ final Element hmNode = doc.getRootElement();
+ Attribute packNode = hmNode.attribute( "package" );
+ String defaultPackage = packNode != null
+ ? packNode.getValue()
+ : "";
+ Set<String> entityNames = new HashSet<String>();
+ findClassNames( defaultPackage, hmNode, entityNames );
+ for ( String entity : entityNames ) {
+ hbmEntities.put( entity, doc );
+ }
+ hbmDocuments.add( doc );
+ }
+ else {
+ List<String> classnames = ( (EJB3ReflectionManager) reflectionManager ).getXMLContext().addDocument( doc );
+ for ( String classname : classnames ) {
+ try {
+ annotatedClasses.add( reflectionManager.classForName( classname, this.getClass() ) );
+ }
+ catch (ClassNotFoundException e) {
+ throw new AnnotationException( "Unable to load class defined in XML: " + classname, e );
+ }
+ }
+ }
+ }
+ }
+
+ private static void findClassNames(
+ String defaultPackage, final Element startNode,
+ final java.util.Set names
+ ) {
+ // if we have some extends we need to check if those classes possibly could be inside the
+ // same hbm.xml file...
+ Iterator[] classes = new Iterator[4];
+ classes[0] = startNode.elementIterator( "class" );
+ classes[1] = startNode.elementIterator( "subclass" );
+ classes[2] = startNode.elementIterator( "joined-subclass" );
+ classes[3] = startNode.elementIterator( "union-subclass" );
+
+ Iterator classIterator = new JoinedIterator( classes );
+ while ( classIterator.hasNext() ) {
+ Element element = (Element) classIterator.next();
+ String entityName = element.attributeValue( "entity-name" );
+ if ( entityName == null ) entityName = getClassName( element.attribute( "name" ), defaultPackage );
+ names.add( entityName );
+ findClassNames( defaultPackage, element, names );
+ }
+ }
+
+ private static String getClassName(Attribute name, String defaultPackage) {
+ if ( name == null ) return null;
+ String unqualifiedName = name.getValue();
+ if ( unqualifiedName == null ) return null;
+ if ( unqualifiedName.indexOf( '.' ) < 0 && defaultPackage != null ) {
+ return defaultPackage + '.' + unqualifiedName;
+ }
+ return unqualifiedName;
+ }
+
+ public void setPrecedence(String precedence) {
+ this.precedence = precedence;
+ }
+
+ private static class CacheHolder {
+ public CacheHolder(String role, String usage, String region, boolean isClass, boolean cacheLazy) {
+ this.role = role;
+ this.usage = usage;
+ this.region = region;
+ this.isClass = isClass;
+ this.cacheLazy = cacheLazy;
+ }
+
+ public String role;
+ public String usage;
+ public String region;
+ public boolean isClass;
+ public boolean cacheLazy;
+ }
+
+ @Override
+ public Configuration addInputStream(InputStream xmlInputStream) throws MappingException {
+ try {
+ List errors = new ArrayList();
+ SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, getEntityResolver() );
+ try {
+ saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
+ //saxReader.setFeature( "http://apache.org/xml/features/validation/dynamic", true );
+ //set the default schema locators
+ saxReader.setProperty(
+ "http://apache.org/xml/properties/schema/external-schemaLocation",
+ "http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd"
+ );
+ }
+ catch (SAXException e) {
+ saxReader.setValidation( false );
+ }
+ org.dom4j.Document doc = saxReader
+ .read( new InputSource( xmlInputStream ) );
+
+ if ( errors.size() != 0 ) {
+ throw new MappingException( "invalid mapping", (Throwable) errors.get( 0 ) );
+ }
+ add( doc );
+ return this;
+ }
+ catch (DocumentException e) {
+ throw new MappingException( "Could not parse mapping document in input stream", e );
+ }
+ finally {
+ try {
+ xmlInputStream.close();
+ }
+ catch (IOException ioe) {
+ log.warn( "Could not close input stream", ioe );
+ }
+ }
+ }
+
+ public SessionFactory buildSessionFactory() throws HibernateException {
+ //add validator events if the jar is available
+ boolean enableValidatorListeners = ! "false".equalsIgnoreCase( getProperty( "hibernate.validator.autoregister_listeners" ) );
+ Class validateEventListenerClass = null;
+ try {
+ validateEventListenerClass = ReflectHelper.classForName(
+ "org.hibernate.validator.event.ValidateEventListener",
+ AnnotationConfiguration.class );
+ }
+ catch (ClassNotFoundException e) {
+ //validator is not present
+ log.debug( "Validator not present in classpath, ignoring event listener registration" );
+ }
+ if (enableValidatorListeners && validateEventListenerClass != null) {
+ //TODO so much duplication
+ Object validateEventListener;
+ try {
+ validateEventListener = validateEventListenerClass.newInstance();
+ }
+ catch (Exception e) {
+ throw new AnnotationException("Unable to load Validator event listener", e );
+ }
+ {
+ boolean present = false;
+ PreInsertEventListener[] listeners = getEventListeners().getPreInsertEventListeners();
+ if (listeners != null) {
+ for ( Object eventListener : listeners ) {
+ //not isAssignableFrom since the user could subclass
+ present = present || validateEventListenerClass == eventListener.getClass();
+ }
+ if (!present) {
+ int length = listeners.length + 1;
+ PreInsertEventListener[] newListeners = new PreInsertEventListener[length];
+ for ( int i = 0 ; i < length - 1 ; i++ ) {
+ newListeners[i] = listeners[i];
+ }
+ newListeners[length-1] = (PreInsertEventListener) validateEventListener;
+ getEventListeners().setPreInsertEventListeners(newListeners);
+ }
+ }
+ else {
+ getEventListeners().setPreInsertEventListeners(
+ new PreInsertEventListener[] { (PreInsertEventListener) validateEventListener }
+ );
+ }
+ }
+
+ //update event listener
+ {
+ boolean present = false;
+ PreUpdateEventListener[] listeners = getEventListeners().getPreUpdateEventListeners();
+ if (listeners != null) {
+ for ( Object eventListener : listeners ) {
+ //not isAssignableFrom since the user could subclass
+ present = present || validateEventListenerClass == eventListener.getClass();
+ }
+ if (!present) {
+ int length = listeners.length + 1;
+ PreUpdateEventListener[] newListeners = new PreUpdateEventListener[length];
+ for ( int i = 0 ; i < length - 1 ; i++ ) {
+ newListeners[i] = listeners[i];
+ }
+ newListeners[length-1] = (PreUpdateEventListener) validateEventListener;
+ getEventListeners().setPreUpdateEventListeners(newListeners);
+ }
+ }
+ else {
+ getEventListeners().setPreUpdateEventListeners(
+ new PreUpdateEventListener[] { (PreUpdateEventListener) validateEventListener }
+ );
+ }
+ }
+ }
+
+ //add search events if the jar is available
+ boolean enableSearchListeners = ! "false".equalsIgnoreCase( getProperty( "hibernate.search.autoregister_listeners" ) );
+ Class searchEventListenerClass = null;
+ try {
+ searchEventListenerClass = ReflectHelper.classForName(
+ "org.hibernate.search.event.FullTextIndexEventListener",
+ AnnotationConfiguration.class );
+ }
+ catch (ClassNotFoundException e) {
+ //search is not present
+ log.debug( "Search not present in classpath, ignoring event listener registration" );
+ }
+ if (enableSearchListeners && searchEventListenerClass != null) {
+ //TODO so much duplication
+ Object searchEventListener;
+ try {
+ searchEventListener = searchEventListenerClass.newInstance();
+ }
+ catch (Exception e) {
+ throw new AnnotationException("Unable to load Search event listener", e );
+ }
+ {
+ boolean present = false;
+ PostInsertEventListener[] listeners = getEventListeners().getPostInsertEventListeners();
+ if (listeners != null) {
+ for ( Object eventListener : listeners ) {
+ //not isAssignableFrom since the user could subclass
+ present = present || searchEventListenerClass == eventListener.getClass();
+ }
+ if (!present) {
+ int length = listeners.length + 1;
+ PostInsertEventListener[] newListeners = new PostInsertEventListener[length];
+ for ( int i = 0 ; i < length - 1 ; i++ ) {
+ newListeners[i] = listeners[i];
+ }
+ newListeners[length-1] = (PostInsertEventListener) searchEventListener;
+ getEventListeners().setPostInsertEventListeners(newListeners);
+ }
+ }
+ else {
+ getEventListeners().setPostInsertEventListeners(
+ new PostInsertEventListener[] { (PostInsertEventListener) searchEventListener }
+ );
+ }
+ }
+ {
+ boolean present = false;
+ PostUpdateEventListener[] listeners = getEventListeners().getPostUpdateEventListeners();
+ if (listeners != null) {
+ for ( Object eventListener : listeners ) {
+ //not isAssignableFrom since the user could subclass
+ present = present || searchEventListenerClass == eventListener.getClass();
+ }
+ if (!present) {
+ int length = listeners.length + 1;
+ PostUpdateEventListener[] newListeners = new PostUpdateEventListener[length];
+ for ( int i = 0 ; i < length - 1 ; i++ ) {
+ newListeners[i] = listeners[i];
+ }
+ newListeners[length-1] = (PostUpdateEventListener) searchEventListener;
+ getEventListeners().setPostUpdateEventListeners(newListeners);
+ }
+ }
+ else {
+ getEventListeners().setPostUpdateEventListeners(
+ new PostUpdateEventListener[] { (PostUpdateEventListener) searchEventListener }
+ );
+ }
+ }
+ {
+ boolean present = false;
+ PostDeleteEventListener[] listeners = getEventListeners().getPostDeleteEventListeners();
+ if (listeners != null) {
+ for ( Object eventListener : listeners ) {
+ //not isAssignableFrom since the user could subclass
+ present = present || searchEventListenerClass == eventListener.getClass();
+ }
+ if (!present) {
+ int length = listeners.length + 1;
+ PostDeleteEventListener[] newListeners = new PostDeleteEventListener[length];
+ for ( int i = 0 ; i < length - 1 ; i++ ) {
+ newListeners[i] = listeners[i];
+ }
+ newListeners[length-1] = (PostDeleteEventListener) searchEventListener;
+ getEventListeners().setPostDeleteEventListeners(newListeners);
+ }
+ }
+ else {
+ getEventListeners().setPostDeleteEventListeners(
+ new PostDeleteEventListener[] { (PostDeleteEventListener) searchEventListener }
+ );
+ }
+ }
+ }
+ return super.buildSessionFactory();
+ }
+
+ //not a public API
+ public ReflectionManager getReflectionManager() {
+ return reflectionManager;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/BinderHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/BinderHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/BinderHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,440 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.StringTokenizer;
-import java.util.Properties;
-
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.MappingException;
-import org.hibernate.id.PersistentIdentifierGenerator;
-import org.hibernate.id.MultipleHiLoPerTableGenerator;
-import org.hibernate.cfg.annotations.TableBinder;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Component;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.Table;
-import org.hibernate.mapping.ToOne;
-import org.hibernate.mapping.Value;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.IdGenerator;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class BinderHelper {
-
- public static final String ANNOTATION_STRING_DEFAULT = "";
-
- private BinderHelper() {
- }
-
- static {
- Set<String> primitiveNames = new HashSet<String>();
- primitiveNames.add( byte.class.getName() );
- primitiveNames.add( short.class.getName() );
- primitiveNames.add( int.class.getName() );
- primitiveNames.add( long.class.getName() );
- primitiveNames.add( float.class.getName() );
- primitiveNames.add( double.class.getName() );
- primitiveNames.add( char.class.getName() );
- primitiveNames.add( boolean.class.getName() );
- PRIMITIVE_NAMES = Collections.unmodifiableSet( primitiveNames );
- }
-
- public static final Set<String> PRIMITIVE_NAMES;
-
- /**
- * create a property copy reusing the same value
- */
- public static Property shallowCopy(Property property) {
- Property clone = new Property();
- clone.setCascade( property.getCascade() );
- clone.setInsertable( property.isInsertable() );
- clone.setLazy( property.isLazy() );
- clone.setName( property.getName() );
- clone.setNodeName( property.getNodeName() );
- clone.setNaturalIdentifier( property.isNaturalIdentifier() );
- clone.setOptimisticLocked( property.isOptimisticLocked() );
- clone.setOptional( property.isOptional() );
- clone.setPersistentClass( property.getPersistentClass() );
- clone.setPropertyAccessorName( property.getPropertyAccessorName() );
- clone.setSelectable( property.isSelectable() );
- clone.setUpdateable( property.isUpdateable() );
- clone.setValue( property.getValue() );
- return clone;
- }
-
- public static void createSyntheticPropertyReference(
- Ejb3JoinColumn[] columns,
- PersistentClass ownerEntity,
- PersistentClass associatedEntity,
- Value value,
- boolean inverse, ExtendedMappings mappings
- ) {
- //associated entity only used for more precise exception, yuk!
- if ( columns[0].isImplicit() || StringHelper.isNotEmpty( columns[0].getMappedBy() ) ) return;
- int fkEnum = Ejb3JoinColumn.checkReferencedColumnsType( columns, ownerEntity, mappings );
- PersistentClass associatedClass = columns[0].getPropertyHolder() != null ?
- columns[0].getPropertyHolder().getPersistentClass() :
- null;
- if ( Ejb3JoinColumn.NON_PK_REFERENCE == fkEnum ) {
- /**
- * Create a synthetic property to refer to including an
- * embedded component value containing all the properties
- * mapped to the referenced columns
- * We need to shallow copy those properties to mark them
- * as non insertable / non updatable
- */
- StringBuilder propertyNameBuffer = new StringBuilder( "_" );
- propertyNameBuffer.append( associatedClass.getEntityName().replace( '.', '_' ) );
- propertyNameBuffer.append( "_" ).append( columns[0].getPropertyName() );
- String syntheticPropertyName = propertyNameBuffer.toString();
- //find properties associated to a certain column
- Object columnOwner = findColumnOwner( ownerEntity, columns[0].getReferencedColumn(), mappings );
- List<Property> properties = findPropertiesByColumns( columnOwner, columns, mappings );
- //create an embeddable component
- Property synthProp = null;
- if ( properties != null ) {
- //todo how about properties.size() == 1, this should be much simpler
- Component embeddedComp = columnOwner instanceof PersistentClass ?
- new Component( (PersistentClass) columnOwner ) :
- new Component( (Join) columnOwner );
- embeddedComp.setEmbedded( true );
- embeddedComp.setNodeName( syntheticPropertyName );
- embeddedComp.setComponentClassName( embeddedComp.getOwner().getClassName() );
- for ( Property property : properties ) {
- Property clone = BinderHelper.shallowCopy( property );
- clone.setInsertable( false );
- clone.setUpdateable( false );
- clone.setNaturalIdentifier( false );
- embeddedComp.addProperty( clone );
- }
- synthProp = new Property();
- synthProp.setName( syntheticPropertyName );
- synthProp.setNodeName(syntheticPropertyName);
- synthProp.setPersistentClass( ownerEntity );
- synthProp.setUpdateable( false );
- synthProp.setInsertable( false );
- synthProp.setValue( embeddedComp );
- synthProp.setPropertyAccessorName( "embedded" );
- ownerEntity.addProperty( synthProp );
- //make it unique
- TableBinder.createUniqueConstraint( embeddedComp );
- }
- else {
- //TODO use a ToOne type doing a second select
- StringBuilder columnsList = new StringBuilder();
- columnsList.append( "referencedColumnNames(" );
- for ( Ejb3JoinColumn column : columns ) {
- columnsList.append( column.getReferencedColumn() ).append( ", " );
- }
- columnsList.setLength( columnsList.length() - 2 );
- columnsList.append( ") " );
-
- if ( associatedEntity != null ) {
- //overidden destination
- columnsList.append( "of " )
- .append( associatedEntity.getEntityName() )
- .append( "." )
- .append( columns[0].getPropertyName() )
- .append( " " );
- }
- else {
- if ( columns[0].getPropertyHolder() != null ) {
- columnsList.append( "of " )
- .append( columns[0].getPropertyHolder().getEntityName() )
- .append( "." )
- .append( columns[0].getPropertyName() )
- .append( " " );
- }
- }
- columnsList.append( "referencing " )
- .append( ownerEntity.getEntityName() )
- .append( " not mapped to a single property" );
- throw new AnnotationException( columnsList.toString() );
- }
-
- /**
- * creating the property ref to the new synthetic property
- */
- if ( value instanceof ToOne ) {
- ( (ToOne) value ).setReferencedPropertyName( syntheticPropertyName );
- mappings.addUniquePropertyReference( ownerEntity.getEntityName(), syntheticPropertyName );
- }
- else if ( value instanceof Collection ) {
- ( (Collection) value ).setReferencedPropertyName( syntheticPropertyName );
- //not unique because we could create a mtm wo association table
- mappings.addPropertyReference( ownerEntity.getEntityName(), syntheticPropertyName );
- }
- else {
- throw new AssertionFailure(
- "Do a property ref on an unexpected Value type: "
- + value.getClass().getName()
- );
- }
- mappings.addPropertyReferencedAssociation(
- ( inverse ? "inverse__" : "" ) + associatedClass.getEntityName(),
- columns[0].getPropertyName(),
- syntheticPropertyName
- );
- }
- }
-
-
- private static List<Property> findPropertiesByColumns(
- Object columnOwner, Ejb3JoinColumn[] columns,
- ExtendedMappings mappings
- ) {
- Map<Column, Set<Property>> columnsToProperty = new HashMap<Column, Set<Property>>();
- List<Column> orderedColumns = new ArrayList<Column>( columns.length );
- Table referencedTable = null;
- if ( columnOwner instanceof PersistentClass ) {
- referencedTable = ( (PersistentClass) columnOwner ).getTable();
- }
- else if ( columnOwner instanceof Join ) {
- referencedTable = ( (Join) columnOwner ).getTable();
- }
- else {
- throw new AssertionFailure(
- columnOwner == null ?
- "columnOwner is null" :
- "columnOwner neither PersistentClass nor Join: " + columnOwner.getClass()
- );
- }
- //build the list of column names
- for ( Ejb3JoinColumn column1 : columns ) {
- Column column = new Column(
- mappings.getPhysicalColumnName( column1.getReferencedColumn(), referencedTable )
- );
- orderedColumns.add( column );
- columnsToProperty.put( column, new HashSet<Property>() );
- }
- boolean isPersistentClass = columnOwner instanceof PersistentClass;
- Iterator it = isPersistentClass ?
- ( (PersistentClass) columnOwner ).getPropertyIterator() :
- ( (Join) columnOwner ).getPropertyIterator();
- while ( it.hasNext() ) {
- matchColumnsByProperty( (Property) it.next(), columnsToProperty );
- }
- if (isPersistentClass) {
- matchColumnsByProperty( ( (PersistentClass) columnOwner ).getIdentifierProperty(), columnsToProperty );
- }
-
- //first naive implementation
- //only check 1 columns properties
- //TODO make it smarter by checking correctly ordered multi column properties
- List<Property> orderedProperties = new ArrayList<Property>();
- for ( Column column : orderedColumns ) {
- boolean found = false;
- for ( Property property : columnsToProperty.get( column ) ) {
- if ( property.getColumnSpan() == 1 ) {
- orderedProperties.add( property );
- found = true;
- break;
- }
- }
- if ( !found ) return null; //have to find it the hard way
- }
- return orderedProperties;
- }
-
- private static void matchColumnsByProperty(Property property, Map<Column, Set<Property>> columnsToProperty) {
- if ( property == null ) return;
- if ( "noop".equals( property.getPropertyAccessorName() )
- || "embedded".equals( property.getPropertyAccessorName() ) ) {
- return;
- }
-// FIXME cannot use subproperties becasue the caller needs top level properties
-// if ( property.isComposite() ) {
-// Iterator subProperties = ( (Component) property.getValue() ).getPropertyIterator();
-// while ( subProperties.hasNext() ) {
-// matchColumnsByProperty( (Property) subProperties.next(), columnsToProperty );
-// }
-// }
- else {
- Iterator columnIt = property.getColumnIterator();
- while ( columnIt.hasNext() ) {
- Object column = columnIt.next(); //can be a Formula so we don't cast
- //noinspection SuspiciousMethodCalls
- if ( columnsToProperty.containsKey( column ) ) {
- columnsToProperty.get( column ).add( property );
- }
- }
- }
- }
-
- /**
- * Retrieve the property by path in a recursive way, including IndetifierProperty in the loop
- * If propertyName is null or empty, the IdentifierProperty is returned
- */
- public static Property findPropertyByName(PersistentClass associatedClass, String propertyName) {
- Property property = null;
- Property idProperty = associatedClass.getIdentifierProperty();
- String idName = idProperty != null ? idProperty.getName() : null;
- try {
- if ( propertyName == null
- || propertyName.length() == 0
- || propertyName.equals( idName ) ) {
- //default to id
- property = idProperty;
- }
- else {
- if ( propertyName.indexOf( idName + "." ) == 0 ) {
- property = idProperty;
- propertyName = propertyName.substring( idName.length() + 1 );
- }
- StringTokenizer st = new StringTokenizer( propertyName, ".", false );
- while ( st.hasMoreElements() ) {
- String element = (String) st.nextElement();
- if ( property == null ) {
- property = associatedClass.getProperty( element );
- }
- else {
- if ( ! property.isComposite() ) return null;
- property = ( (Component) property.getValue() ).getProperty( element );
- }
- }
- }
- }
- catch (MappingException e) {
- try {
- //if we do not find it try to check the identifier mapper
- if ( associatedClass.getIdentifierMapper() == null ) return null;
- StringTokenizer st = new StringTokenizer( propertyName, ".", false );
- while ( st.hasMoreElements() ) {
- String element = (String) st.nextElement();
- if ( property == null ) {
- property = associatedClass.getIdentifierMapper().getProperty( element );
- }
- else {
- if ( ! property.isComposite() ) return null;
- property = ( (Component) property.getValue() ).getProperty( element );
- }
- }
- }
- catch (MappingException ee) {
- return null;
- }
- }
- return property;
- }
-
- public static String getRelativePath(PropertyHolder propertyHolder, String propertyName) {
- if ( propertyHolder == null ) return propertyName;
- String path = propertyHolder.getPath();
- String entityName = propertyHolder.getPersistentClass().getEntityName();
- if ( path.length() == entityName.length() ) {
- return propertyName;
- }
- else {
- return StringHelper.qualify( path.substring( entityName.length() + 1 ), propertyName );
- }
- }
-
- /**
- * Find the column owner (ie PersistentClass or Join) of columnName.
- * If columnName is null or empty, persistentClass is returned
- */
- public static Object findColumnOwner(
- PersistentClass persistentClass, String columnName, ExtendedMappings mappings
- ) {
- if ( StringHelper.isEmpty( columnName ) ) {
- return persistentClass; //shortcut for implicit referenced column names
- }
- PersistentClass current = persistentClass;
- Object result = null;
- boolean found = false;
- do {
- result = current;
- Table currentTable = current.getTable();
- try {
- mappings.getPhysicalColumnName( columnName, currentTable );
- found = true;
- }
- catch (MappingException me) {
- //swallow it
- }
- Iterator joins = current.getJoinIterator();
- while ( ! found && joins.hasNext() ) {
- result = joins.next();
- currentTable = ( (Join) result ).getTable();
- try {
- mappings.getPhysicalColumnName( columnName, currentTable );
- found = true;
- }
- catch (MappingException me) {
- //swallow it
- }
- }
- current = current.getSuperclass();
- }
- while ( !found && current != null );
- return found ? result : null;
- }
-
- /** apply an id generator to a SimpleValue */
- public static void makeIdGenerator(
- SimpleValue id, String generatorType, String generatorName, ExtendedMappings mappings,
- Map<String, IdGenerator> localGenerators
- ) {
- Table table = id.getTable();
- table.setIdentifierValue( id );
- //generator settings
- id.setIdentifierGeneratorStrategy( generatorType );
- Properties params = new Properties();
- //always settable
- params.setProperty(
- PersistentIdentifierGenerator.TABLE, table.getName()
- );
-
- if ( id.getColumnSpan() == 1 ) {
- params.setProperty(
- PersistentIdentifierGenerator.PK,
- ( (org.hibernate.mapping.Column) id.getColumnIterator().next() ).getName()
- );
- }
- if ( ! isDefault( generatorName ) ) {
- //we have a named generator
- IdGenerator gen = mappings.getGenerator( generatorName, localGenerators );
- if ( gen == null ) {
- throw new AnnotationException( "Unknown Id.generator: " + generatorName );
- }
- //This is quite vague in the spec but a generator could override the generate choice
- String identifierGeneratorStrategy = gen.getIdentifierGeneratorStrategy();
- //yuk! this is a hack not to override 'AUTO' even if generator is set
- final boolean avoidOverriding =
- identifierGeneratorStrategy.equals( "identity" )
- || identifierGeneratorStrategy.equals( "seqhilo" )
- || identifierGeneratorStrategy.equals( MultipleHiLoPerTableGenerator.class.getName() );
- if ( generatorType == null || ! avoidOverriding ) {
- id.setIdentifierGeneratorStrategy( identifierGeneratorStrategy );
- }
- //checkIfMatchingGenerator(gen, generatorType, generatorName);
- Iterator genParams = gen.getParams().entrySet().iterator();
- while ( genParams.hasNext() ) {
- Map.Entry elt = (Map.Entry) genParams.next();
- params.setProperty( (String) elt.getKey(), (String) elt.getValue() );
- }
- }
- if ( "assigned".equals( generatorType ) ) id.setNullValue( "undefined" );
- id.setIdentifierGeneratorProperties( params );
- }
-
- public static boolean isDefault(String annotationString) {
- return annotationString != null && annotationString.length() == 0;
- //equivalent to (but faster) ANNOTATION_STRING_DEFAULT.equals( annotationString );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/BinderHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/BinderHelper.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/BinderHelper.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/BinderHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,440 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.StringTokenizer;
+import java.util.Properties;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.MappingException;
+import org.hibernate.id.PersistentIdentifierGenerator;
+import org.hibernate.id.MultipleHiLoPerTableGenerator;
+import org.hibernate.cfg.annotations.TableBinder;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Table;
+import org.hibernate.mapping.ToOne;
+import org.hibernate.mapping.Value;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.IdGenerator;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BinderHelper {
+
+ public static final String ANNOTATION_STRING_DEFAULT = "";
+
+ private BinderHelper() {
+ }
+
+ static {
+ Set<String> primitiveNames = new HashSet<String>();
+ primitiveNames.add( byte.class.getName() );
+ primitiveNames.add( short.class.getName() );
+ primitiveNames.add( int.class.getName() );
+ primitiveNames.add( long.class.getName() );
+ primitiveNames.add( float.class.getName() );
+ primitiveNames.add( double.class.getName() );
+ primitiveNames.add( char.class.getName() );
+ primitiveNames.add( boolean.class.getName() );
+ PRIMITIVE_NAMES = Collections.unmodifiableSet( primitiveNames );
+ }
+
+ public static final Set<String> PRIMITIVE_NAMES;
+
+ /**
+ * create a property copy reusing the same value
+ */
+ public static Property shallowCopy(Property property) {
+ Property clone = new Property();
+ clone.setCascade( property.getCascade() );
+ clone.setInsertable( property.isInsertable() );
+ clone.setLazy( property.isLazy() );
+ clone.setName( property.getName() );
+ clone.setNodeName( property.getNodeName() );
+ clone.setNaturalIdentifier( property.isNaturalIdentifier() );
+ clone.setOptimisticLocked( property.isOptimisticLocked() );
+ clone.setOptional( property.isOptional() );
+ clone.setPersistentClass( property.getPersistentClass() );
+ clone.setPropertyAccessorName( property.getPropertyAccessorName() );
+ clone.setSelectable( property.isSelectable() );
+ clone.setUpdateable( property.isUpdateable() );
+ clone.setValue( property.getValue() );
+ return clone;
+ }
+
+ public static void createSyntheticPropertyReference(
+ Ejb3JoinColumn[] columns,
+ PersistentClass ownerEntity,
+ PersistentClass associatedEntity,
+ Value value,
+ boolean inverse, ExtendedMappings mappings
+ ) {
+ //associated entity only used for more precise exception, yuk!
+ if ( columns[0].isImplicit() || StringHelper.isNotEmpty( columns[0].getMappedBy() ) ) return;
+ int fkEnum = Ejb3JoinColumn.checkReferencedColumnsType( columns, ownerEntity, mappings );
+ PersistentClass associatedClass = columns[0].getPropertyHolder() != null ?
+ columns[0].getPropertyHolder().getPersistentClass() :
+ null;
+ if ( Ejb3JoinColumn.NON_PK_REFERENCE == fkEnum ) {
+ /**
+ * Create a synthetic property to refer to including an
+ * embedded component value containing all the properties
+ * mapped to the referenced columns
+ * We need to shallow copy those properties to mark them
+ * as non insertable / non updatable
+ */
+ StringBuilder propertyNameBuffer = new StringBuilder( "_" );
+ propertyNameBuffer.append( associatedClass.getEntityName().replace( '.', '_' ) );
+ propertyNameBuffer.append( "_" ).append( columns[0].getPropertyName() );
+ String syntheticPropertyName = propertyNameBuffer.toString();
+ //find properties associated to a certain column
+ Object columnOwner = findColumnOwner( ownerEntity, columns[0].getReferencedColumn(), mappings );
+ List<Property> properties = findPropertiesByColumns( columnOwner, columns, mappings );
+ //create an embeddable component
+ Property synthProp = null;
+ if ( properties != null ) {
+ //todo how about properties.size() == 1, this should be much simpler
+ Component embeddedComp = columnOwner instanceof PersistentClass ?
+ new Component( (PersistentClass) columnOwner ) :
+ new Component( (Join) columnOwner );
+ embeddedComp.setEmbedded( true );
+ embeddedComp.setNodeName( syntheticPropertyName );
+ embeddedComp.setComponentClassName( embeddedComp.getOwner().getClassName() );
+ for ( Property property : properties ) {
+ Property clone = BinderHelper.shallowCopy( property );
+ clone.setInsertable( false );
+ clone.setUpdateable( false );
+ clone.setNaturalIdentifier( false );
+ embeddedComp.addProperty( clone );
+ }
+ synthProp = new Property();
+ synthProp.setName( syntheticPropertyName );
+ synthProp.setNodeName(syntheticPropertyName);
+ synthProp.setPersistentClass( ownerEntity );
+ synthProp.setUpdateable( false );
+ synthProp.setInsertable( false );
+ synthProp.setValue( embeddedComp );
+ synthProp.setPropertyAccessorName( "embedded" );
+ ownerEntity.addProperty( synthProp );
+ //make it unique
+ TableBinder.createUniqueConstraint( embeddedComp );
+ }
+ else {
+ //TODO use a ToOne type doing a second select
+ StringBuilder columnsList = new StringBuilder();
+ columnsList.append( "referencedColumnNames(" );
+ for ( Ejb3JoinColumn column : columns ) {
+ columnsList.append( column.getReferencedColumn() ).append( ", " );
+ }
+ columnsList.setLength( columnsList.length() - 2 );
+ columnsList.append( ") " );
+
+ if ( associatedEntity != null ) {
+ //overidden destination
+ columnsList.append( "of " )
+ .append( associatedEntity.getEntityName() )
+ .append( "." )
+ .append( columns[0].getPropertyName() )
+ .append( " " );
+ }
+ else {
+ if ( columns[0].getPropertyHolder() != null ) {
+ columnsList.append( "of " )
+ .append( columns[0].getPropertyHolder().getEntityName() )
+ .append( "." )
+ .append( columns[0].getPropertyName() )
+ .append( " " );
+ }
+ }
+ columnsList.append( "referencing " )
+ .append( ownerEntity.getEntityName() )
+ .append( " not mapped to a single property" );
+ throw new AnnotationException( columnsList.toString() );
+ }
+
+ /**
+ * creating the property ref to the new synthetic property
+ */
+ if ( value instanceof ToOne ) {
+ ( (ToOne) value ).setReferencedPropertyName( syntheticPropertyName );
+ mappings.addUniquePropertyReference( ownerEntity.getEntityName(), syntheticPropertyName );
+ }
+ else if ( value instanceof Collection ) {
+ ( (Collection) value ).setReferencedPropertyName( syntheticPropertyName );
+ //not unique because we could create a mtm wo association table
+ mappings.addPropertyReference( ownerEntity.getEntityName(), syntheticPropertyName );
+ }
+ else {
+ throw new AssertionFailure(
+ "Do a property ref on an unexpected Value type: "
+ + value.getClass().getName()
+ );
+ }
+ mappings.addPropertyReferencedAssociation(
+ ( inverse ? "inverse__" : "" ) + associatedClass.getEntityName(),
+ columns[0].getPropertyName(),
+ syntheticPropertyName
+ );
+ }
+ }
+
+
+ private static List<Property> findPropertiesByColumns(
+ Object columnOwner, Ejb3JoinColumn[] columns,
+ ExtendedMappings mappings
+ ) {
+ Map<Column, Set<Property>> columnsToProperty = new HashMap<Column, Set<Property>>();
+ List<Column> orderedColumns = new ArrayList<Column>( columns.length );
+ Table referencedTable = null;
+ if ( columnOwner instanceof PersistentClass ) {
+ referencedTable = ( (PersistentClass) columnOwner ).getTable();
+ }
+ else if ( columnOwner instanceof Join ) {
+ referencedTable = ( (Join) columnOwner ).getTable();
+ }
+ else {
+ throw new AssertionFailure(
+ columnOwner == null ?
+ "columnOwner is null" :
+ "columnOwner neither PersistentClass nor Join: " + columnOwner.getClass()
+ );
+ }
+ //build the list of column names
+ for ( Ejb3JoinColumn column1 : columns ) {
+ Column column = new Column(
+ mappings.getPhysicalColumnName( column1.getReferencedColumn(), referencedTable )
+ );
+ orderedColumns.add( column );
+ columnsToProperty.put( column, new HashSet<Property>() );
+ }
+ boolean isPersistentClass = columnOwner instanceof PersistentClass;
+ Iterator it = isPersistentClass ?
+ ( (PersistentClass) columnOwner ).getPropertyIterator() :
+ ( (Join) columnOwner ).getPropertyIterator();
+ while ( it.hasNext() ) {
+ matchColumnsByProperty( (Property) it.next(), columnsToProperty );
+ }
+ if (isPersistentClass) {
+ matchColumnsByProperty( ( (PersistentClass) columnOwner ).getIdentifierProperty(), columnsToProperty );
+ }
+
+ //first naive implementation
+ //only check 1 columns properties
+ //TODO make it smarter by checking correctly ordered multi column properties
+ List<Property> orderedProperties = new ArrayList<Property>();
+ for ( Column column : orderedColumns ) {
+ boolean found = false;
+ for ( Property property : columnsToProperty.get( column ) ) {
+ if ( property.getColumnSpan() == 1 ) {
+ orderedProperties.add( property );
+ found = true;
+ break;
+ }
+ }
+ if ( !found ) return null; //have to find it the hard way
+ }
+ return orderedProperties;
+ }
+
+ private static void matchColumnsByProperty(Property property, Map<Column, Set<Property>> columnsToProperty) {
+ if ( property == null ) return;
+ if ( "noop".equals( property.getPropertyAccessorName() )
+ || "embedded".equals( property.getPropertyAccessorName() ) ) {
+ return;
+ }
+// FIXME cannot use subproperties becasue the caller needs top level properties
+// if ( property.isComposite() ) {
+// Iterator subProperties = ( (Component) property.getValue() ).getPropertyIterator();
+// while ( subProperties.hasNext() ) {
+// matchColumnsByProperty( (Property) subProperties.next(), columnsToProperty );
+// }
+// }
+ else {
+ Iterator columnIt = property.getColumnIterator();
+ while ( columnIt.hasNext() ) {
+ Object column = columnIt.next(); //can be a Formula so we don't cast
+ //noinspection SuspiciousMethodCalls
+ if ( columnsToProperty.containsKey( column ) ) {
+ columnsToProperty.get( column ).add( property );
+ }
+ }
+ }
+ }
+
+ /**
+ * Retrieve the property by path in a recursive way, including IndetifierProperty in the loop
+ * If propertyName is null or empty, the IdentifierProperty is returned
+ */
+ public static Property findPropertyByName(PersistentClass associatedClass, String propertyName) {
+ Property property = null;
+ Property idProperty = associatedClass.getIdentifierProperty();
+ String idName = idProperty != null ? idProperty.getName() : null;
+ try {
+ if ( propertyName == null
+ || propertyName.length() == 0
+ || propertyName.equals( idName ) ) {
+ //default to id
+ property = idProperty;
+ }
+ else {
+ if ( propertyName.indexOf( idName + "." ) == 0 ) {
+ property = idProperty;
+ propertyName = propertyName.substring( idName.length() + 1 );
+ }
+ StringTokenizer st = new StringTokenizer( propertyName, ".", false );
+ while ( st.hasMoreElements() ) {
+ String element = (String) st.nextElement();
+ if ( property == null ) {
+ property = associatedClass.getProperty( element );
+ }
+ else {
+ if ( ! property.isComposite() ) return null;
+ property = ( (Component) property.getValue() ).getProperty( element );
+ }
+ }
+ }
+ }
+ catch (MappingException e) {
+ try {
+ //if we do not find it try to check the identifier mapper
+ if ( associatedClass.getIdentifierMapper() == null ) return null;
+ StringTokenizer st = new StringTokenizer( propertyName, ".", false );
+ while ( st.hasMoreElements() ) {
+ String element = (String) st.nextElement();
+ if ( property == null ) {
+ property = associatedClass.getIdentifierMapper().getProperty( element );
+ }
+ else {
+ if ( ! property.isComposite() ) return null;
+ property = ( (Component) property.getValue() ).getProperty( element );
+ }
+ }
+ }
+ catch (MappingException ee) {
+ return null;
+ }
+ }
+ return property;
+ }
+
+ public static String getRelativePath(PropertyHolder propertyHolder, String propertyName) {
+ if ( propertyHolder == null ) return propertyName;
+ String path = propertyHolder.getPath();
+ String entityName = propertyHolder.getPersistentClass().getEntityName();
+ if ( path.length() == entityName.length() ) {
+ return propertyName;
+ }
+ else {
+ return StringHelper.qualify( path.substring( entityName.length() + 1 ), propertyName );
+ }
+ }
+
+ /**
+ * Find the column owner (ie PersistentClass or Join) of columnName.
+ * If columnName is null or empty, persistentClass is returned
+ */
+ public static Object findColumnOwner(
+ PersistentClass persistentClass, String columnName, ExtendedMappings mappings
+ ) {
+ if ( StringHelper.isEmpty( columnName ) ) {
+ return persistentClass; //shortcut for implicit referenced column names
+ }
+ PersistentClass current = persistentClass;
+ Object result = null;
+ boolean found = false;
+ do {
+ result = current;
+ Table currentTable = current.getTable();
+ try {
+ mappings.getPhysicalColumnName( columnName, currentTable );
+ found = true;
+ }
+ catch (MappingException me) {
+ //swallow it
+ }
+ Iterator joins = current.getJoinIterator();
+ while ( ! found && joins.hasNext() ) {
+ result = joins.next();
+ currentTable = ( (Join) result ).getTable();
+ try {
+ mappings.getPhysicalColumnName( columnName, currentTable );
+ found = true;
+ }
+ catch (MappingException me) {
+ //swallow it
+ }
+ }
+ current = current.getSuperclass();
+ }
+ while ( !found && current != null );
+ return found ? result : null;
+ }
+
+ /** apply an id generator to a SimpleValue */
+ public static void makeIdGenerator(
+ SimpleValue id, String generatorType, String generatorName, ExtendedMappings mappings,
+ Map<String, IdGenerator> localGenerators
+ ) {
+ Table table = id.getTable();
+ table.setIdentifierValue( id );
+ //generator settings
+ id.setIdentifierGeneratorStrategy( generatorType );
+ Properties params = new Properties();
+ //always settable
+ params.setProperty(
+ PersistentIdentifierGenerator.TABLE, table.getName()
+ );
+
+ if ( id.getColumnSpan() == 1 ) {
+ params.setProperty(
+ PersistentIdentifierGenerator.PK,
+ ( (org.hibernate.mapping.Column) id.getColumnIterator().next() ).getName()
+ );
+ }
+ if ( ! isDefault( generatorName ) ) {
+ //we have a named generator
+ IdGenerator gen = mappings.getGenerator( generatorName, localGenerators );
+ if ( gen == null ) {
+ throw new AnnotationException( "Unknown Id.generator: " + generatorName );
+ }
+ //This is quite vague in the spec but a generator could override the generate choice
+ String identifierGeneratorStrategy = gen.getIdentifierGeneratorStrategy();
+ //yuk! this is a hack not to override 'AUTO' even if generator is set
+ final boolean avoidOverriding =
+ identifierGeneratorStrategy.equals( "identity" )
+ || identifierGeneratorStrategy.equals( "seqhilo" )
+ || identifierGeneratorStrategy.equals( MultipleHiLoPerTableGenerator.class.getName() );
+ if ( generatorType == null || ! avoidOverriding ) {
+ id.setIdentifierGeneratorStrategy( identifierGeneratorStrategy );
+ }
+ //checkIfMatchingGenerator(gen, generatorType, generatorName);
+ Iterator genParams = gen.getParams().entrySet().iterator();
+ while ( genParams.hasNext() ) {
+ Map.Entry elt = (Map.Entry) genParams.next();
+ params.setProperty( (String) elt.getKey(), (String) elt.getValue() );
+ }
+ }
+ if ( "assigned".equals( generatorType ) ) id.setNullValue( "undefined" );
+ id.setIdentifierGeneratorProperties( params );
+ }
+
+ public static boolean isDefault(String annotationString) {
+ return annotationString != null && annotationString.length() == 0;
+ //equivalent to (but faster) ANNOTATION_STRING_DEFAULT.equals( annotationString );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ClassPropertyHolder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/ClassPropertyHolder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ClassPropertyHolder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,116 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.persistence.JoinTable;
-
-import org.hibernate.cfg.annotations.EntityBinder;
-import org.hibernate.mapping.Component;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.KeyValue;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.Table;
-import org.hibernate.annotations.common.reflection.XClass;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ClassPropertyHolder extends AbstractPropertyHolder {
- private PersistentClass persistentClass;
- private Map<String, Join> joins;
- private transient Map<String, Join> joinsPerRealTableName;
- private EntityBinder entityBinder;
-
- public ClassPropertyHolder(
- PersistentClass persistentClass, XClass clazzToProcess, Map<String, Join> joins, ExtendedMappings mappings
- ) {
- super( persistentClass.getEntityName(), null, clazzToProcess, mappings );
- this.persistentClass = persistentClass;
- this.joins = joins;
- }
-
- public ClassPropertyHolder(
- PersistentClass persistentClass, XClass clazzToProcess, EntityBinder entityBinder,
- ExtendedMappings mappings
- ) {
- this( persistentClass, clazzToProcess, entityBinder.getSecondaryTables(), mappings );
- this.entityBinder = entityBinder;
- }
-
- public String getEntityName() {
- return persistentClass.getEntityName();
- }
-
- public void addProperty(Property prop, Ejb3Column[] columns) {
- //Ejb3Column.checkPropertyConsistency( ); //already called earlier
- if ( columns[0].isSecondary() ) {
- //TODO move the getJoin() code here?
- columns[0].getJoin().addProperty( prop );
- }
- else {
- addProperty( prop );
- }
- }
-
- public Join addJoin(JoinTable joinTableAnn, boolean noDelayInPkColumnCreation) {
- Join join = entityBinder.addJoin( joinTableAnn, this, noDelayInPkColumnCreation );
- this.joins = entityBinder.getSecondaryTables();
- return join;
- }
-
- public void addProperty(Property prop) {
- if ( prop.getValue() instanceof Component ) {
- //TODO handle quote and non quote table comparison
- String tableName = prop.getValue().getTable().getName();
- if ( getJoinsPerRealTableName().containsKey( tableName ) ) {
- getJoinsPerRealTableName().get( tableName ).addProperty( prop );
- }
- else {
- persistentClass.addProperty( prop );
- }
- }
- else {
- persistentClass.addProperty( prop );
- }
- }
-
- /**
- * Needed for proper compliance with naming strategy, the property table
- * can be overriden if the properties are part of secondary tables
- */
- private Map<String, Join> getJoinsPerRealTableName() {
- if ( joinsPerRealTableName == null ) {
- joinsPerRealTableName = new HashMap<String, Join>( joins.size() );
- for ( Join join : joins.values() ) {
- joinsPerRealTableName.put( join.getTable().getName(), join );
- }
- }
- return joinsPerRealTableName;
- }
-
- public String getClassName() {
- return persistentClass.getClassName();
- }
-
- public String getEntityOwnerClassName() {
- return getClassName();
- }
-
- public Table getTable() {
- return persistentClass.getTable();
- }
-
- public boolean isComponent() {
- return false;
- }
-
- public PersistentClass getPersistentClass() {
- return persistentClass;
- }
-
- public KeyValue getIdentifier() {
- return persistentClass.getIdentifier();
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ClassPropertyHolder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/ClassPropertyHolder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ClassPropertyHolder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ClassPropertyHolder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,116 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.JoinTable;
+
+import org.hibernate.cfg.annotations.EntityBinder;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.KeyValue;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Table;
+import org.hibernate.annotations.common.reflection.XClass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ClassPropertyHolder extends AbstractPropertyHolder {
+ private PersistentClass persistentClass;
+ private Map<String, Join> joins;
+ private transient Map<String, Join> joinsPerRealTableName;
+ private EntityBinder entityBinder;
+
+ public ClassPropertyHolder(
+ PersistentClass persistentClass, XClass clazzToProcess, Map<String, Join> joins, ExtendedMappings mappings
+ ) {
+ super( persistentClass.getEntityName(), null, clazzToProcess, mappings );
+ this.persistentClass = persistentClass;
+ this.joins = joins;
+ }
+
+ public ClassPropertyHolder(
+ PersistentClass persistentClass, XClass clazzToProcess, EntityBinder entityBinder,
+ ExtendedMappings mappings
+ ) {
+ this( persistentClass, clazzToProcess, entityBinder.getSecondaryTables(), mappings );
+ this.entityBinder = entityBinder;
+ }
+
+ public String getEntityName() {
+ return persistentClass.getEntityName();
+ }
+
+ public void addProperty(Property prop, Ejb3Column[] columns) {
+ //Ejb3Column.checkPropertyConsistency( ); //already called earlier
+ if ( columns[0].isSecondary() ) {
+ //TODO move the getJoin() code here?
+ columns[0].getJoin().addProperty( prop );
+ }
+ else {
+ addProperty( prop );
+ }
+ }
+
+ public Join addJoin(JoinTable joinTableAnn, boolean noDelayInPkColumnCreation) {
+ Join join = entityBinder.addJoin( joinTableAnn, this, noDelayInPkColumnCreation );
+ this.joins = entityBinder.getSecondaryTables();
+ return join;
+ }
+
+ public void addProperty(Property prop) {
+ if ( prop.getValue() instanceof Component ) {
+ //TODO handle quote and non quote table comparison
+ String tableName = prop.getValue().getTable().getName();
+ if ( getJoinsPerRealTableName().containsKey( tableName ) ) {
+ getJoinsPerRealTableName().get( tableName ).addProperty( prop );
+ }
+ else {
+ persistentClass.addProperty( prop );
+ }
+ }
+ else {
+ persistentClass.addProperty( prop );
+ }
+ }
+
+ /**
+ * Needed for proper compliance with naming strategy, the property table
+ * can be overriden if the properties are part of secondary tables
+ */
+ private Map<String, Join> getJoinsPerRealTableName() {
+ if ( joinsPerRealTableName == null ) {
+ joinsPerRealTableName = new HashMap<String, Join>( joins.size() );
+ for ( Join join : joins.values() ) {
+ joinsPerRealTableName.put( join.getTable().getName(), join );
+ }
+ }
+ return joinsPerRealTableName;
+ }
+
+ public String getClassName() {
+ return persistentClass.getClassName();
+ }
+
+ public String getEntityOwnerClassName() {
+ return getClassName();
+ }
+
+ public Table getTable() {
+ return persistentClass.getTable();
+ }
+
+ public boolean isComponent() {
+ return false;
+ }
+
+ public PersistentClass getPersistentClass() {
+ return persistentClass;
+ }
+
+ public KeyValue getIdentifier() {
+ return persistentClass.getIdentifier();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CollectionPropertyHolder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/CollectionPropertyHolder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CollectionPropertyHolder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,71 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import javax.persistence.JoinTable;
-
-import org.hibernate.AssertionFailure;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.KeyValue;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.Table;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CollectionPropertyHolder extends AbstractPropertyHolder {
- Collection collection;
-
- public CollectionPropertyHolder(
- Collection collection, String path, XClass clazzToProcess, XProperty property,
- PropertyHolder parentPropertyHolder, ExtendedMappings mappings
- ) {
- super( path, parentPropertyHolder, clazzToProcess, mappings );
- this.collection = collection;
- setCurrentProperty( property );
- }
-
- public String getClassName() {
- throw new AssertionFailure( "Collection property holder does not have a class name" );
- }
-
- public String getEntityOwnerClassName() {
- return null;
- }
-
- public Table getTable() {
- return collection.getCollectionTable();
- }
-
- public void addProperty(Property prop) {
- throw new AssertionFailure( "Cannot add property to a collection" );
- }
-
- public KeyValue getIdentifier() {
- throw new AssertionFailure( "Identifier collection not yet managed" );
- }
-
- public PersistentClass getPersistentClass() {
- return collection.getOwner();
- }
-
- public boolean isComponent() {
- return false;
- }
-
- public String getEntityName() {
- return collection.getOwner().getEntityName();
- }
-
- public void addProperty(Property prop, Ejb3Column[] columns) {
- //Ejb3Column.checkPropertyConsistency( ); //already called earlier
- throw new AssertionFailure( "addProperty to a join table of a collection: does it make sense?" );
- }
-
- public Join addJoin(JoinTable joinTableAnn, boolean noDelayInPkColumnCreation) {
- throw new AssertionFailure( "Add a <join> in a second pass" );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CollectionPropertyHolder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/CollectionPropertyHolder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CollectionPropertyHolder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CollectionPropertyHolder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,71 @@
+//$Id$
+package org.hibernate.cfg;
+
+import javax.persistence.JoinTable;
+
+import org.hibernate.AssertionFailure;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.KeyValue;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Table;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CollectionPropertyHolder extends AbstractPropertyHolder {
+ Collection collection;
+
+ public CollectionPropertyHolder(
+ Collection collection, String path, XClass clazzToProcess, XProperty property,
+ PropertyHolder parentPropertyHolder, ExtendedMappings mappings
+ ) {
+ super( path, parentPropertyHolder, clazzToProcess, mappings );
+ this.collection = collection;
+ setCurrentProperty( property );
+ }
+
+ public String getClassName() {
+ throw new AssertionFailure( "Collection property holder does not have a class name" );
+ }
+
+ public String getEntityOwnerClassName() {
+ return null;
+ }
+
+ public Table getTable() {
+ return collection.getCollectionTable();
+ }
+
+ public void addProperty(Property prop) {
+ throw new AssertionFailure( "Cannot add property to a collection" );
+ }
+
+ public KeyValue getIdentifier() {
+ throw new AssertionFailure( "Identifier collection not yet managed" );
+ }
+
+ public PersistentClass getPersistentClass() {
+ return collection.getOwner();
+ }
+
+ public boolean isComponent() {
+ return false;
+ }
+
+ public String getEntityName() {
+ return collection.getOwner().getEntityName();
+ }
+
+ public void addProperty(Property prop, Ejb3Column[] columns) {
+ //Ejb3Column.checkPropertyConsistency( ); //already called earlier
+ throw new AssertionFailure( "addProperty to a join table of a collection: does it make sense?" );
+ }
+
+ public Join addJoin(JoinTable joinTableAnn, boolean noDelayInPkColumnCreation) {
+ throw new AssertionFailure( "Add a <join> in a second pass" );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ComponentPropertyHolder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/ComponentPropertyHolder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ComponentPropertyHolder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,132 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import javax.persistence.Column;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-
-import org.hibernate.AnnotationException;
-import org.hibernate.mapping.Component;
-import org.hibernate.mapping.KeyValue;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.Table;
-import org.hibernate.mapping.Join;
-
-/**
- * Component implementation of property holder
- *
- * @author Emmanuel Bernard
- */
-public class ComponentPropertyHolder extends AbstractPropertyHolder {
- //TODO introduce a overrideTable() method for columns held by sec table rather than the hack
- // joinsPerRealTableName in ClassPropertyHolder
- private Component component;
-
- public String getEntityName() {
- return component.getComponentClassName();
- }
-
- public void addProperty(Property prop, Ejb3Column[] columns) {
- //Ejb3Column.checkPropertyConsistency( ); //already called earlier
- /*
- * Check table matches between the component and the columns
- * if not, change the component table if no properties are set
- * if a property is set already the core cannot support that
- */
- Table table = columns[0].getTable();
- if ( ! table.equals( component.getTable() ) ) {
- if ( component.getPropertySpan() == 0 ) {
- component.setTable( table );
- }
- else {
- throw new AnnotationException(
- "A component cannot hold properties split into 2 different tables: "
- + this.getPath()
- );
- }
- }
- addProperty( prop );
- }
-
- public Join addJoin(JoinTable joinTableAnn, boolean noDelayInPkColumnCreation) {
- return parent.addJoin( joinTableAnn, noDelayInPkColumnCreation );
-
- }
-
- public ComponentPropertyHolder(
- Component component, String path, PropertyData inferredData, PropertyHolder parent,
- ExtendedMappings mappings
- ) {
- super( path, parent, inferredData.getPropertyClass(), mappings );
- setCurrentProperty( inferredData.getProperty() );
- this.component = component;
- }
-
- public String getClassName() {
- return component.getComponentClassName();
- }
-
- public String getEntityOwnerClassName() {
- return component.getOwner().getClassName();
- }
-
- public Table getTable() {
- return component.getTable();
- }
-
- public void addProperty(Property prop) {
- component.addProperty( prop );
- }
-
- public KeyValue getIdentifier() {
- return component.getOwner().getIdentifier();
- }
-
- public PersistentClass getPersistentClass() {
- return component.getOwner();
- }
-
- public boolean isComponent() {
- return true;
- }
-
- public void setParentProperty(String parentProperty) {
- component.setParentProperty( parentProperty );
- }
-
- @Override
- public Column[] getOverriddenColumn(String propertyName) {
- //FIXME this is yukky
- Column[] result = super.getOverriddenColumn( propertyName );
- if ( result == null ) {
- String userPropertyName = extractUserPropertyName( "id", propertyName );
- if ( userPropertyName != null ) result = super.getOverriddenColumn( userPropertyName );
- }
- if ( result == null ) {
- String userPropertyName = extractUserPropertyName( "_identifierMapper", propertyName );
- if ( userPropertyName != null ) result = super.getOverriddenColumn( userPropertyName );
- }
- return result;
- }
-
- private String extractUserPropertyName(String redundantString, String propertyName) {
- String result = null;
- String className = component.getOwner().getClassName();
- if ( propertyName.startsWith( className )
- && propertyName.length() > className.length() + 2 + redundantString.length() // .id.
- && propertyName.substring(
- className.length() + 1, className.length() + 1 + redundantString.length()
- ).equals( redundantString )
- ) {
- //remove id we might be in a @IdCLass case
- result = className + propertyName.substring( className.length() + 1 + redundantString.length() );
- }
- return result;
- }
-
- @Override
- public JoinColumn[] getOverriddenJoinColumn(String propertyName) {
- return super.getOverriddenJoinColumn( propertyName );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ComponentPropertyHolder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/ComponentPropertyHolder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ComponentPropertyHolder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ComponentPropertyHolder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,132 @@
+//$Id$
+package org.hibernate.cfg;
+
+import javax.persistence.Column;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.KeyValue;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Table;
+import org.hibernate.mapping.Join;
+
+/**
+ * Component implementation of property holder
+ *
+ * @author Emmanuel Bernard
+ */
+public class ComponentPropertyHolder extends AbstractPropertyHolder {
+ //TODO introduce a overrideTable() method for columns held by sec table rather than the hack
+ // joinsPerRealTableName in ClassPropertyHolder
+ private Component component;
+
+ public String getEntityName() {
+ return component.getComponentClassName();
+ }
+
+ public void addProperty(Property prop, Ejb3Column[] columns) {
+ //Ejb3Column.checkPropertyConsistency( ); //already called earlier
+ /*
+ * Check table matches between the component and the columns
+ * if not, change the component table if no properties are set
+ * if a property is set already the core cannot support that
+ */
+ Table table = columns[0].getTable();
+ if ( ! table.equals( component.getTable() ) ) {
+ if ( component.getPropertySpan() == 0 ) {
+ component.setTable( table );
+ }
+ else {
+ throw new AnnotationException(
+ "A component cannot hold properties split into 2 different tables: "
+ + this.getPath()
+ );
+ }
+ }
+ addProperty( prop );
+ }
+
+ public Join addJoin(JoinTable joinTableAnn, boolean noDelayInPkColumnCreation) {
+ return parent.addJoin( joinTableAnn, noDelayInPkColumnCreation );
+
+ }
+
+ public ComponentPropertyHolder(
+ Component component, String path, PropertyData inferredData, PropertyHolder parent,
+ ExtendedMappings mappings
+ ) {
+ super( path, parent, inferredData.getPropertyClass(), mappings );
+ setCurrentProperty( inferredData.getProperty() );
+ this.component = component;
+ }
+
+ public String getClassName() {
+ return component.getComponentClassName();
+ }
+
+ public String getEntityOwnerClassName() {
+ return component.getOwner().getClassName();
+ }
+
+ public Table getTable() {
+ return component.getTable();
+ }
+
+ public void addProperty(Property prop) {
+ component.addProperty( prop );
+ }
+
+ public KeyValue getIdentifier() {
+ return component.getOwner().getIdentifier();
+ }
+
+ public PersistentClass getPersistentClass() {
+ return component.getOwner();
+ }
+
+ public boolean isComponent() {
+ return true;
+ }
+
+ public void setParentProperty(String parentProperty) {
+ component.setParentProperty( parentProperty );
+ }
+
+ @Override
+ public Column[] getOverriddenColumn(String propertyName) {
+ //FIXME this is yukky
+ Column[] result = super.getOverriddenColumn( propertyName );
+ if ( result == null ) {
+ String userPropertyName = extractUserPropertyName( "id", propertyName );
+ if ( userPropertyName != null ) result = super.getOverriddenColumn( userPropertyName );
+ }
+ if ( result == null ) {
+ String userPropertyName = extractUserPropertyName( "_identifierMapper", propertyName );
+ if ( userPropertyName != null ) result = super.getOverriddenColumn( userPropertyName );
+ }
+ return result;
+ }
+
+ private String extractUserPropertyName(String redundantString, String propertyName) {
+ String result = null;
+ String className = component.getOwner().getClassName();
+ if ( propertyName.startsWith( className )
+ && propertyName.length() > className.length() + 2 + redundantString.length() // .id.
+ && propertyName.substring(
+ className.length() + 1, className.length() + 1 + redundantString.length()
+ ).equals( redundantString )
+ ) {
+ //remove id we might be in a @IdCLass case
+ result = className + propertyName.substring( className.length() + 1 + redundantString.length() );
+ }
+ return result;
+ }
+
+ @Override
+ public JoinColumn[] getOverriddenJoinColumn(String propertyName) {
+ return super.getOverriddenJoinColumn( propertyName );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CreateKeySecondPass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/CreateKeySecondPass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CreateKeySecondPass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,37 +0,0 @@
-//$Id: $
-package org.hibernate.cfg;
-
-import java.util.Map;
-
-import org.hibernate.MappingException;
-import org.hibernate.mapping.JoinedSubclass;
-import org.hibernate.mapping.RootClass;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CreateKeySecondPass implements SecondPass {
- private RootClass rootClass;
- private JoinedSubclass joinedSubClass;
-
- public CreateKeySecondPass(RootClass rootClass) {
- this.rootClass = rootClass;
- }
-
- public CreateKeySecondPass(JoinedSubclass joinedSubClass) {
- this.joinedSubClass = joinedSubClass;
- }
-
- public void doSecondPass(Map persistentClasses) throws MappingException {
- if ( rootClass != null ) {
- rootClass.createPrimaryKey();
- }
- else if ( joinedSubClass != null ) {
- joinedSubClass.createPrimaryKey();
- joinedSubClass.createForeignKey();
- }
- else {
- throw new AssertionError( "rootClass and joinedSubClass are null" );
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CreateKeySecondPass.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/CreateKeySecondPass.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CreateKeySecondPass.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/CreateKeySecondPass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,37 @@
+//$Id: $
+package org.hibernate.cfg;
+
+import java.util.Map;
+
+import org.hibernate.MappingException;
+import org.hibernate.mapping.JoinedSubclass;
+import org.hibernate.mapping.RootClass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CreateKeySecondPass implements SecondPass {
+ private RootClass rootClass;
+ private JoinedSubclass joinedSubClass;
+
+ public CreateKeySecondPass(RootClass rootClass) {
+ this.rootClass = rootClass;
+ }
+
+ public CreateKeySecondPass(JoinedSubclass joinedSubClass) {
+ this.joinedSubClass = joinedSubClass;
+ }
+
+ public void doSecondPass(Map persistentClasses) throws MappingException {
+ if ( rootClass != null ) {
+ rootClass.createPrimaryKey();
+ }
+ else if ( joinedSubClass != null ) {
+ joinedSubClass.createPrimaryKey();
+ joinedSubClass.createForeignKey();
+ }
+ else {
+ throw new AssertionError( "rootClass and joinedSubClass are null" );
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,77 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import org.hibernate.AssertionFailure;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DefaultComponentSafeNamingStrategy extends EJB3NamingStrategy {
- public static final NamingStrategy INSTANCE = new DefaultComponentSafeNamingStrategy();
-
- protected static String addUnderscores(String name) {
- return name.replace( '.', '_' ).toLowerCase();
- }
-
- @Override
- public String propertyToColumnName(String propertyName) {
- return addUnderscores( propertyName );
- }
-
- @Override
- public String collectionTableName(
- String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
- String propertyName
- ) {
- return tableName(
- new StringBuilder( ownerEntityTable ).append( "_" )
- .append(
- associatedEntityTable != null ?
- associatedEntityTable :
- addUnderscores( propertyName )
- ).toString()
- );
- }
-
-
- public String foreignKeyColumnName(
- String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName
- ) {
- String header = propertyName != null ? addUnderscores( propertyName ) : propertyTableName;
- if ( header == null ) throw new AssertionFailure( "NamingStrategy not properly filled" );
- return columnName( header + "_" + referencedColumnName );
- }
-
- @Override
- public String logicalColumnName(String columnName, String propertyName) {
- return StringHelper.isNotEmpty( columnName ) ? columnName : propertyName;
- }
-
- @Override
- public String logicalCollectionTableName(
- String tableName, String ownerEntityTable, String associatedEntityTable, String propertyName
- ) {
- if ( tableName != null ) {
- return tableName;
- }
- else {
- //use of a stringbuffer to workaround a JDK bug
- return new StringBuffer( ownerEntityTable ).append( "_" )
- .append(
- associatedEntityTable != null ?
- associatedEntityTable :
- propertyName
- ).toString();
- }
-
- }
-
- @Override
- public String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn) {
- return StringHelper.isNotEmpty( columnName ) ?
- columnName :
- propertyName + "_" + referencedColumn;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/DefaultComponentSafeNamingStrategy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,77 @@
+//$Id$
+package org.hibernate.cfg;
+
+import org.hibernate.AssertionFailure;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DefaultComponentSafeNamingStrategy extends EJB3NamingStrategy {
+ public static final NamingStrategy INSTANCE = new DefaultComponentSafeNamingStrategy();
+
+ protected static String addUnderscores(String name) {
+ return name.replace( '.', '_' ).toLowerCase();
+ }
+
+ @Override
+ public String propertyToColumnName(String propertyName) {
+ return addUnderscores( propertyName );
+ }
+
+ @Override
+ public String collectionTableName(
+ String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
+ String propertyName
+ ) {
+ return tableName(
+ new StringBuilder( ownerEntityTable ).append( "_" )
+ .append(
+ associatedEntityTable != null ?
+ associatedEntityTable :
+ addUnderscores( propertyName )
+ ).toString()
+ );
+ }
+
+
+ public String foreignKeyColumnName(
+ String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName
+ ) {
+ String header = propertyName != null ? addUnderscores( propertyName ) : propertyTableName;
+ if ( header == null ) throw new AssertionFailure( "NamingStrategy not properly filled" );
+ return columnName( header + "_" + referencedColumnName );
+ }
+
+ @Override
+ public String logicalColumnName(String columnName, String propertyName) {
+ return StringHelper.isNotEmpty( columnName ) ? columnName : propertyName;
+ }
+
+ @Override
+ public String logicalCollectionTableName(
+ String tableName, String ownerEntityTable, String associatedEntityTable, String propertyName
+ ) {
+ if ( tableName != null ) {
+ return tableName;
+ }
+ else {
+ //use of a stringbuffer to workaround a JDK bug
+ return new StringBuffer( ownerEntityTable ).append( "_" )
+ .append(
+ associatedEntityTable != null ?
+ associatedEntityTable :
+ propertyName
+ ).toString();
+ }
+
+ }
+
+ @Override
+ public String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn) {
+ return StringHelper.isNotEmpty( columnName ) ?
+ columnName :
+ propertyName + "_" + referencedColumn;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,75 +0,0 @@
-//$Id: $
-package org.hibernate.cfg;
-
-import java.io.InputStream;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.util.DTDEntityResolver;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EJB3DTDEntityResolver extends DTDEntityResolver {
- public static final EntityResolver INSTANCE = new EJB3DTDEntityResolver();
-
- private static final Log log = LogFactory.getLog( EJB3DTDEntityResolver.class );
-
- boolean resolved = false;
-
- public boolean isResolved() {
- return resolved;
- }
-
- public InputSource resolveEntity(String publicId, String systemId) {
- InputSource is = super.resolveEntity( publicId, systemId );
- if ( is == null ) {
- if ( systemId != null ) {
- if ( systemId.endsWith( "orm_1_0.xsd" ) ) {
- log.debug(
- "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/ejb"
- );
- String path = "org/hibernate/ejb/" + "orm_1_0.xsd";
- InputStream dtdStream = resolveInHibernateNamespace( path );
- if ( dtdStream == null ) {
- log.debug( "unable to locate [" + systemId + "] on classpath" );
- }
- else {
- log.debug( "located [" + systemId + "] in classpath" );
- InputSource source = new InputSource( dtdStream );
- source.setPublicId( publicId );
- source.setSystemId( systemId );
- resolved = false;
- return source;
- }
- }
- else if ( systemId.endsWith( "persistence_1_0.xsd" ) ) {
- log.debug(
- "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/ejb"
- );
- String path = "org/hibernate/ejb/" + "persistence_1_0.xsd";
- InputStream dtdStream = resolveInHibernateNamespace( path );
- if ( dtdStream == null ) {
- log.debug( "unable to locate [" + systemId + "] on classpath" );
- }
- else {
- log.debug( "located [" + systemId + "] in classpath" );
- InputSource source = new InputSource( dtdStream );
- source.setPublicId( publicId );
- source.setSystemId( systemId );
- resolved = true;
- return source;
- }
- }
- }
- }
- else {
- resolved = true;
- return is;
- }
- //use the default behavior
- return null;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3DTDEntityResolver.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,75 @@
+//$Id: $
+package org.hibernate.cfg;
+
+import java.io.InputStream;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.util.DTDEntityResolver;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.InputSource;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EJB3DTDEntityResolver extends DTDEntityResolver {
+ public static final EntityResolver INSTANCE = new EJB3DTDEntityResolver();
+
+ private static final Log log = LogFactory.getLog( EJB3DTDEntityResolver.class );
+
+ boolean resolved = false;
+
+ public boolean isResolved() {
+ return resolved;
+ }
+
+ public InputSource resolveEntity(String publicId, String systemId) {
+ InputSource is = super.resolveEntity( publicId, systemId );
+ if ( is == null ) {
+ if ( systemId != null ) {
+ if ( systemId.endsWith( "orm_1_0.xsd" ) ) {
+ log.debug(
+ "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/ejb"
+ );
+ String path = "org/hibernate/ejb/" + "orm_1_0.xsd";
+ InputStream dtdStream = resolveInHibernateNamespace( path );
+ if ( dtdStream == null ) {
+ log.debug( "unable to locate [" + systemId + "] on classpath" );
+ }
+ else {
+ log.debug( "located [" + systemId + "] in classpath" );
+ InputSource source = new InputSource( dtdStream );
+ source.setPublicId( publicId );
+ source.setSystemId( systemId );
+ resolved = false;
+ return source;
+ }
+ }
+ else if ( systemId.endsWith( "persistence_1_0.xsd" ) ) {
+ log.debug(
+ "recognized EJB3 ORM namespace; attempting to resolve on classpath under org/hibernate/ejb"
+ );
+ String path = "org/hibernate/ejb/" + "persistence_1_0.xsd";
+ InputStream dtdStream = resolveInHibernateNamespace( path );
+ if ( dtdStream == null ) {
+ log.debug( "unable to locate [" + systemId + "] on classpath" );
+ }
+ else {
+ log.debug( "located [" + systemId + "] in classpath" );
+ InputSource source = new InputSource( dtdStream );
+ source.setPublicId( publicId );
+ source.setSystemId( systemId );
+ resolved = true;
+ return source;
+ }
+ }
+ }
+ }
+ else {
+ resolved = true;
+ return is;
+ }
+ //use the default behavior
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3NamingStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3NamingStrategy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3NamingStrategy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.io.Serializable;
-
-import org.hibernate.AssertionFailure;
-import org.hibernate.util.StringHelper;
-
-/**
- * NAming strategy implementing the EJB3 standards
- *
- * @author Emmanuel Bernard
- */
-public class EJB3NamingStrategy implements NamingStrategy, Serializable {
- public static final NamingStrategy INSTANCE = new EJB3NamingStrategy();
-
- public String classToTableName(String className) {
- return StringHelper.unqualify( className );
- }
-
- public String propertyToColumnName(String propertyName) {
- return StringHelper.unqualify( propertyName );
- }
-
- public String tableName(String tableName) {
- return tableName;
- }
-
- public String columnName(String columnName) {
- return columnName;
- }
-
- public String collectionTableName(
- String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
- String propertyName
- ) {
- return tableName(
- new StringBuilder( ownerEntityTable ).append( "_" )
- .append(
- associatedEntityTable != null ?
- associatedEntityTable :
- StringHelper.unqualify( propertyName )
- ).toString()
- );
- }
-
- public String joinKeyColumnName(String joinedColumn, String joinedTable) {
- return columnName( joinedColumn );
- }
-
- public String foreignKeyColumnName(
- String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName
- ) {
- String header = propertyName != null ? StringHelper.unqualify( propertyName ) : propertyTableName;
- if ( header == null ) throw new AssertionFailure( "NamingStrategy not properly filled" );
- return columnName( header + "_" + referencedColumnName );
- }
-
- public String logicalColumnName(String columnName, String propertyName) {
- return StringHelper.isNotEmpty( columnName ) ? columnName : StringHelper.unqualify( propertyName );
- }
-
- public String logicalCollectionTableName(
- String tableName,
- String ownerEntityTable, String associatedEntityTable, String propertyName
- ) {
- if ( tableName != null ) {
- return tableName;
- }
- else {
- //use of a stringbuffer to workaround a JDK bug
- return new StringBuffer( ownerEntityTable ).append( "_" )
- .append(
- associatedEntityTable != null ?
- associatedEntityTable :
- StringHelper.unqualify( propertyName )
- ).toString();
- }
- }
-
- public String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn) {
- return StringHelper.isNotEmpty( columnName ) ?
- columnName :
- StringHelper.unqualify( propertyName ) + "_" + referencedColumn;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3NamingStrategy.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3NamingStrategy.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3NamingStrategy.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/EJB3NamingStrategy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.io.Serializable;
+
+import org.hibernate.AssertionFailure;
+import org.hibernate.util.StringHelper;
+
+/**
+ * NAming strategy implementing the EJB3 standards
+ *
+ * @author Emmanuel Bernard
+ */
+public class EJB3NamingStrategy implements NamingStrategy, Serializable {
+ public static final NamingStrategy INSTANCE = new EJB3NamingStrategy();
+
+ public String classToTableName(String className) {
+ return StringHelper.unqualify( className );
+ }
+
+ public String propertyToColumnName(String propertyName) {
+ return StringHelper.unqualify( propertyName );
+ }
+
+ public String tableName(String tableName) {
+ return tableName;
+ }
+
+ public String columnName(String columnName) {
+ return columnName;
+ }
+
+ public String collectionTableName(
+ String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
+ String propertyName
+ ) {
+ return tableName(
+ new StringBuilder( ownerEntityTable ).append( "_" )
+ .append(
+ associatedEntityTable != null ?
+ associatedEntityTable :
+ StringHelper.unqualify( propertyName )
+ ).toString()
+ );
+ }
+
+ public String joinKeyColumnName(String joinedColumn, String joinedTable) {
+ return columnName( joinedColumn );
+ }
+
+ public String foreignKeyColumnName(
+ String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName
+ ) {
+ String header = propertyName != null ? StringHelper.unqualify( propertyName ) : propertyTableName;
+ if ( header == null ) throw new AssertionFailure( "NamingStrategy not properly filled" );
+ return columnName( header + "_" + referencedColumnName );
+ }
+
+ public String logicalColumnName(String columnName, String propertyName) {
+ return StringHelper.isNotEmpty( columnName ) ? columnName : StringHelper.unqualify( propertyName );
+ }
+
+ public String logicalCollectionTableName(
+ String tableName,
+ String ownerEntityTable, String associatedEntityTable, String propertyName
+ ) {
+ if ( tableName != null ) {
+ return tableName;
+ }
+ else {
+ //use of a stringbuffer to workaround a JDK bug
+ return new StringBuffer( ownerEntityTable ).append( "_" )
+ .append(
+ associatedEntityTable != null ?
+ associatedEntityTable :
+ StringHelper.unqualify( propertyName )
+ ).toString();
+ }
+ }
+
+ public String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn) {
+ return StringHelper.isNotEmpty( columnName ) ?
+ columnName :
+ StringHelper.unqualify( propertyName ) + "_" + referencedColumn;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3Column.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3Column.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3Column.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,444 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.annotations.Index;
-import org.hibernate.cfg.annotations.Nullability;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Formula;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.Table;
-import org.hibernate.util.StringHelper;
-
-/**
- * Wrap state of an EJB3 @Column annotation
- * and build the Hibernate column mapping element
- *
- * @author Emmanuel Bernard
- */
-public class Ejb3Column {
- private static final Log log = LogFactory.getLog( Ejb3Column.class );
- private Column mappingColumn;
- private boolean insertable = true;
- private boolean updatable = true;
- private String secondaryTableName;
- protected Map<String, Join> joins;
- protected PropertyHolder propertyHolder;
- private ExtendedMappings mappings;
- private boolean isImplicit;
- public static final int DEFAULT_COLUMN_LENGTH = 255;
- public String sqlType;
- private int length = DEFAULT_COLUMN_LENGTH;
- private int precision;
- private int scale;
- private String logicalColumnName;
- private String propertyName;
- private boolean unique;
- private boolean nullable = true;
- private String formulaString;
- private Formula formula;
- private Table table;
-
- public void setTable(Table table) {
- this.table = table;
- }
-
- public String getLogicalColumnName() {
- return logicalColumnName;
- }
-
- public String getSqlType() {
- return sqlType;
- }
-
- public int getLength() {
- return length;
- }
-
- public int getPrecision() {
- return precision;
- }
-
- public int getScale() {
- return scale;
- }
-
- public boolean isUnique() {
- return unique;
- }
-
- public String getFormulaString() {
- return formulaString;
- }
-
- public String getSecondaryTableName() {
- return secondaryTableName;
- }
-
- public void setFormula(String formula) {
- this.formulaString = formula;
- }
-
- public boolean isImplicit() {
- return isImplicit;
- }
-
- public void setInsertable(boolean insertable) {
- this.insertable = insertable;
- }
-
- public void setUpdatable(boolean updatable) {
- this.updatable = updatable;
- }
-
- protected ExtendedMappings getMappings() {
- return mappings;
- }
-
- public void setMappings(ExtendedMappings mappings) {
- this.mappings = mappings;
- }
-
- public void setImplicit(boolean implicit) {
- isImplicit = implicit;
- }
-
- public void setSqlType(String sqlType) {
- this.sqlType = sqlType;
- }
-
- public void setLength(int length) {
- this.length = length;
- }
-
- public void setPrecision(int precision) {
- this.precision = precision;
- }
-
- public void setScale(int scale) {
- this.scale = scale;
- }
-
- public void setLogicalColumnName(String logicalColumnName) {
- this.logicalColumnName = logicalColumnName;
- }
-
- public void setPropertyName(String propertyName) {
- this.propertyName = propertyName;
- }
-
- public String getPropertyName() {
- return propertyName;
- }
-
- public void setUnique(boolean unique) {
- this.unique = unique;
- }
-
- public boolean isNullable() {
- return mappingColumn.isNullable();
- }
-
- public Ejb3Column() {
- }
-
- public void bind() {
- if ( StringHelper.isNotEmpty( formulaString ) ) {
- log.debug( "binding formula " + formulaString );
- formula = new Formula();
- formula.setFormula( formulaString );
- }
- else {
- initMappingColumn(
- logicalColumnName, propertyName, length, precision, scale, nullable, sqlType, unique, true
- );
- log.debug( "Binding column " + mappingColumn.getName() + " unique " + unique );
- }
- }
-
- protected void initMappingColumn(
- String columnName, String propertyName, int length, int precision, int scale, boolean nullable,
- String sqlType, boolean unique, boolean applyNamingStrategy
- ) {
- this.mappingColumn = new Column();
- redefineColumnName( columnName, propertyName, applyNamingStrategy );
- this.mappingColumn.setLength( length );
- if ( precision > 0 ) { //revelent precision
- this.mappingColumn.setPrecision( precision );
- this.mappingColumn.setScale( scale );
- }
- this.mappingColumn.setNullable( nullable );
- this.mappingColumn.setSqlType( sqlType );
- this.mappingColumn.setUnique( unique );
- }
-
- public boolean isNameDeferred() {
- return mappingColumn == null || StringHelper.isEmpty( mappingColumn.getName() );
- }
-
- public void redefineColumnName(String columnName, String propertyName, boolean applyNamingStrategy) {
- if ( applyNamingStrategy ) {
- if ( StringHelper.isEmpty( columnName ) ) {
- if ( propertyName != null ) {
- mappingColumn.setName( mappings.getNamingStrategy().propertyToColumnName( propertyName ) );
- }
- //Do nothing otherwise
- }
- else {
- mappingColumn.setName( mappings.getNamingStrategy().columnName( columnName ) );
- }
- }
- else {
- if ( StringHelper.isNotEmpty( columnName ) ) mappingColumn.setName( columnName );
- }
- }
-
- public String getName() {
- return mappingColumn.getName();
- }
-
- public Column getMappingColumn() {
- return mappingColumn;
- }
-
- public boolean isInsertable() {
- return insertable;
- }
-
- public boolean isUpdatable() {
- return updatable;
- }
-
- public void setNullable(boolean nullable) {
- if ( mappingColumn != null ) {
- mappingColumn.setNullable( nullable );
- }
- else {
- this.nullable = nullable;
- }
- }
-
- public void setJoins(Map<String, Join> joins) {
- this.joins = joins;
- }
-
- public PropertyHolder getPropertyHolder() {
- return propertyHolder;
- }
-
- public void setPropertyHolder(PropertyHolder propertyHolder) {
- this.propertyHolder = propertyHolder;
- }
-
- protected void setMappingColumn(Column mappingColumn) {
- this.mappingColumn = mappingColumn;
- }
-
- public void linkWithValue(SimpleValue value) {
- if ( formula != null ) {
- value.addFormula( formula );
- }
- else {
- getMappingColumn().setValue( value );
- value.addColumn( getMappingColumn() );
- value.getTable().addColumn( getMappingColumn() );
- addColumnBinding( value );
- table = value.getTable();
- }
- }
-
- protected void addColumnBinding(SimpleValue value) {
- String logicalColumnName = mappings.getNamingStrategy()
- .logicalColumnName( this.logicalColumnName, propertyName );
- mappings.addColumnBinding( logicalColumnName, getMappingColumn(), value.getTable() );
- }
-
- /**
- * Find appropriate table of the column.
- * It can come from a secondary table or from the main table of the persistent class
- *
- * @return appropriate table
- * @throws AnnotationException missing secondary table
- */
- public Table getTable() {
- if ( table != null ) return table; //association table
- if ( isSecondary() ) {
- return getJoin().getTable();
- }
- else {
- return propertyHolder.getTable();
- }
- }
-
- public boolean isSecondary() {
- if ( propertyHolder == null ) {
- throw new AssertionFailure( "Should not call getTable() on column wo persistent class defined" );
- }
- if ( StringHelper.isNotEmpty( secondaryTableName ) ) {
- return true;
- }
- // else {
- return false;
- }
-
- public Join getJoin() {
- Join join = joins.get( secondaryTableName );
- if ( join == null ) {
- throw new AnnotationException(
- "Cannot find the expected secondary table: no "
- + secondaryTableName + " available for " + propertyHolder.getClassName()
- );
- }
- else {
- return join;
- }
- }
-
- public void forceNotNull() {
- mappingColumn.setNullable( false );
- }
-
- public void setSecondaryTableName(String secondaryTableName) {
- this.secondaryTableName = secondaryTableName;
- }
-
- public static Ejb3Column[] buildColumnFromAnnotation(
- javax.persistence.Column[] anns,
- org.hibernate.annotations.Formula formulaAnn, Nullability nullability, PropertyHolder propertyHolder,
- PropertyData inferredData,
- Map<String, Join> secondaryTables,
- ExtendedMappings mappings
- ) {
- Ejb3Column[] columns;
- if ( formulaAnn != null ) {
- Ejb3Column formulaColumn = new Ejb3Column();
- formulaColumn.setFormula( formulaAnn.value() );
- formulaColumn.setImplicit( false );
- formulaColumn.setMappings( mappings );
- formulaColumn.setPropertyHolder( propertyHolder );
- formulaColumn.bind();
- columns = new Ejb3Column[]{formulaColumn};
- }
- else {
- javax.persistence.Column[] actualCols = anns;
- javax.persistence.Column[] overriddenCols = propertyHolder.getOverriddenColumn(
- StringHelper.qualify( propertyHolder.getPath(), inferredData.getPropertyName() )
- );
- if ( overriddenCols != null ) {
- //check for overridden first
- if ( anns != null && overriddenCols.length != anns.length ) {
- throw new AnnotationException( "AttributeOverride.column() should override all columns for now" );
- }
- actualCols = overriddenCols.length == 0 ? null : overriddenCols;
- log.debug( "Column(s) overridden for property " + inferredData.getPropertyName() );
- }
- if ( actualCols == null ) {
- columns = buildImplicitColumn( inferredData, secondaryTables, propertyHolder, nullability, mappings );
- }
- else {
- final int length = actualCols.length;
- columns = new Ejb3Column[length];
- for ( int index = 0; index < length ; index++ ) {
- javax.persistence.Column col = actualCols[index];
- String sqlType = col.columnDefinition().equals( "" ) ? null : col.columnDefinition();
- Ejb3Column column = new Ejb3Column();
- column.setImplicit( false );
- column.setSqlType( sqlType );
- column.setLength( col.length() );
- column.setPrecision( col.precision() );
- column.setScale( col.scale() );
- column.setLogicalColumnName( col.name() );
- column.setPropertyName(
- BinderHelper.getRelativePath( propertyHolder, inferredData.getPropertyName() )
- );
- column.setNullable(
- col.nullable()
- ); //TODO force to not null if available? This is a (bad) user choice.
- column.setUnique( col.unique() );
- column.setInsertable( col.insertable() );
- column.setUpdatable( col.updatable() );
- column.setSecondaryTableName( col.table() );
- column.setPropertyHolder( propertyHolder );
- column.setJoins( secondaryTables );
- column.setMappings( mappings );
- column.bind();
- columns[index] = column;
- }
- }
- }
- return columns;
- }
-
- private static Ejb3Column[] buildImplicitColumn(
- PropertyData inferredData, Map<String, Join> secondaryTables, PropertyHolder propertyHolder,
- Nullability nullability, ExtendedMappings mappings
- ) {
- Ejb3Column[] columns;
- columns = new Ejb3Column[1];
- Ejb3Column column = new Ejb3Column();
- column.setImplicit( false );
- //not following the spec but more clean
- if ( nullability != Nullability.FORCED_NULL
- && inferredData.getClassOrElement().isPrimitive()
- && ! inferredData.getProperty().isArray() ) {
- column.setNullable( false );
- }
- column.setLength( DEFAULT_COLUMN_LENGTH );
- column.setPropertyName(
- BinderHelper.getRelativePath( propertyHolder, inferredData.getPropertyName() )
- );
- column.setPropertyHolder( propertyHolder );
- column.setJoins( secondaryTables );
- column.setMappings( mappings );
- column.bind();
- columns[0] = column;
- return columns;
- }
-
- public static void checkPropertyConsistency(Ejb3Column[] columns, String propertyName) {
- int nbrOfColumns = columns.length;
- if ( nbrOfColumns > 1 ) {
- for ( int currentIndex = 1; currentIndex < nbrOfColumns ; currentIndex++ ) {
- if ( columns[currentIndex].isInsertable() != columns[currentIndex - 1].isInsertable() ) {
- throw new AnnotationException(
- "Mixing insertable and non insertable columns in a property is not allowed: " + propertyName
- );
- }
- if ( columns[currentIndex].isNullable() != columns[currentIndex - 1].isNullable() ) {
- throw new AnnotationException(
- "Mixing nullable and non nullable columns in a property is not allowed: " + propertyName
- );
- }
- if ( columns[currentIndex].isUpdatable() != columns[currentIndex - 1].isUpdatable() ) {
- throw new AnnotationException(
- "Mixing updatable and non updatable columns in a property is not allowed: " + propertyName
- );
- }
- if ( ! columns[currentIndex].getTable().equals( columns[currentIndex - 1].getTable() ) ) {
- throw new AnnotationException(
- "Mixing different tables in a property is not allowed: " + propertyName
- );
- }
- }
- }
- }
-
- public void addIndex(Index index, boolean inSecondPass) {
- if ( index == null ) return;
- IndexSecondPass secondPass = new IndexSecondPass( index.name(), this, mappings );
- if (inSecondPass) {
- secondPass.doSecondPass( mappings.getClasses() );
- }
- else {
- mappings.addSecondPass(
- secondPass
- );
- }
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3Column.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3Column.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3Column.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3Column.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,444 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.annotations.Index;
+import org.hibernate.cfg.annotations.Nullability;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Formula;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.Table;
+import org.hibernate.util.StringHelper;
+
+/**
+ * Wrap state of an EJB3 @Column annotation
+ * and build the Hibernate column mapping element
+ *
+ * @author Emmanuel Bernard
+ */
+public class Ejb3Column {
+ private static final Log log = LogFactory.getLog( Ejb3Column.class );
+ private Column mappingColumn;
+ private boolean insertable = true;
+ private boolean updatable = true;
+ private String secondaryTableName;
+ protected Map<String, Join> joins;
+ protected PropertyHolder propertyHolder;
+ private ExtendedMappings mappings;
+ private boolean isImplicit;
+ public static final int DEFAULT_COLUMN_LENGTH = 255;
+ public String sqlType;
+ private int length = DEFAULT_COLUMN_LENGTH;
+ private int precision;
+ private int scale;
+ private String logicalColumnName;
+ private String propertyName;
+ private boolean unique;
+ private boolean nullable = true;
+ private String formulaString;
+ private Formula formula;
+ private Table table;
+
+ public void setTable(Table table) {
+ this.table = table;
+ }
+
+ public String getLogicalColumnName() {
+ return logicalColumnName;
+ }
+
+ public String getSqlType() {
+ return sqlType;
+ }
+
+ public int getLength() {
+ return length;
+ }
+
+ public int getPrecision() {
+ return precision;
+ }
+
+ public int getScale() {
+ return scale;
+ }
+
+ public boolean isUnique() {
+ return unique;
+ }
+
+ public String getFormulaString() {
+ return formulaString;
+ }
+
+ public String getSecondaryTableName() {
+ return secondaryTableName;
+ }
+
+ public void setFormula(String formula) {
+ this.formulaString = formula;
+ }
+
+ public boolean isImplicit() {
+ return isImplicit;
+ }
+
+ public void setInsertable(boolean insertable) {
+ this.insertable = insertable;
+ }
+
+ public void setUpdatable(boolean updatable) {
+ this.updatable = updatable;
+ }
+
+ protected ExtendedMappings getMappings() {
+ return mappings;
+ }
+
+ public void setMappings(ExtendedMappings mappings) {
+ this.mappings = mappings;
+ }
+
+ public void setImplicit(boolean implicit) {
+ isImplicit = implicit;
+ }
+
+ public void setSqlType(String sqlType) {
+ this.sqlType = sqlType;
+ }
+
+ public void setLength(int length) {
+ this.length = length;
+ }
+
+ public void setPrecision(int precision) {
+ this.precision = precision;
+ }
+
+ public void setScale(int scale) {
+ this.scale = scale;
+ }
+
+ public void setLogicalColumnName(String logicalColumnName) {
+ this.logicalColumnName = logicalColumnName;
+ }
+
+ public void setPropertyName(String propertyName) {
+ this.propertyName = propertyName;
+ }
+
+ public String getPropertyName() {
+ return propertyName;
+ }
+
+ public void setUnique(boolean unique) {
+ this.unique = unique;
+ }
+
+ public boolean isNullable() {
+ return mappingColumn.isNullable();
+ }
+
+ public Ejb3Column() {
+ }
+
+ public void bind() {
+ if ( StringHelper.isNotEmpty( formulaString ) ) {
+ log.debug( "binding formula " + formulaString );
+ formula = new Formula();
+ formula.setFormula( formulaString );
+ }
+ else {
+ initMappingColumn(
+ logicalColumnName, propertyName, length, precision, scale, nullable, sqlType, unique, true
+ );
+ log.debug( "Binding column " + mappingColumn.getName() + " unique " + unique );
+ }
+ }
+
+ protected void initMappingColumn(
+ String columnName, String propertyName, int length, int precision, int scale, boolean nullable,
+ String sqlType, boolean unique, boolean applyNamingStrategy
+ ) {
+ this.mappingColumn = new Column();
+ redefineColumnName( columnName, propertyName, applyNamingStrategy );
+ this.mappingColumn.setLength( length );
+ if ( precision > 0 ) { //revelent precision
+ this.mappingColumn.setPrecision( precision );
+ this.mappingColumn.setScale( scale );
+ }
+ this.mappingColumn.setNullable( nullable );
+ this.mappingColumn.setSqlType( sqlType );
+ this.mappingColumn.setUnique( unique );
+ }
+
+ public boolean isNameDeferred() {
+ return mappingColumn == null || StringHelper.isEmpty( mappingColumn.getName() );
+ }
+
+ public void redefineColumnName(String columnName, String propertyName, boolean applyNamingStrategy) {
+ if ( applyNamingStrategy ) {
+ if ( StringHelper.isEmpty( columnName ) ) {
+ if ( propertyName != null ) {
+ mappingColumn.setName( mappings.getNamingStrategy().propertyToColumnName( propertyName ) );
+ }
+ //Do nothing otherwise
+ }
+ else {
+ mappingColumn.setName( mappings.getNamingStrategy().columnName( columnName ) );
+ }
+ }
+ else {
+ if ( StringHelper.isNotEmpty( columnName ) ) mappingColumn.setName( columnName );
+ }
+ }
+
+ public String getName() {
+ return mappingColumn.getName();
+ }
+
+ public Column getMappingColumn() {
+ return mappingColumn;
+ }
+
+ public boolean isInsertable() {
+ return insertable;
+ }
+
+ public boolean isUpdatable() {
+ return updatable;
+ }
+
+ public void setNullable(boolean nullable) {
+ if ( mappingColumn != null ) {
+ mappingColumn.setNullable( nullable );
+ }
+ else {
+ this.nullable = nullable;
+ }
+ }
+
+ public void setJoins(Map<String, Join> joins) {
+ this.joins = joins;
+ }
+
+ public PropertyHolder getPropertyHolder() {
+ return propertyHolder;
+ }
+
+ public void setPropertyHolder(PropertyHolder propertyHolder) {
+ this.propertyHolder = propertyHolder;
+ }
+
+ protected void setMappingColumn(Column mappingColumn) {
+ this.mappingColumn = mappingColumn;
+ }
+
+ public void linkWithValue(SimpleValue value) {
+ if ( formula != null ) {
+ value.addFormula( formula );
+ }
+ else {
+ getMappingColumn().setValue( value );
+ value.addColumn( getMappingColumn() );
+ value.getTable().addColumn( getMappingColumn() );
+ addColumnBinding( value );
+ table = value.getTable();
+ }
+ }
+
+ protected void addColumnBinding(SimpleValue value) {
+ String logicalColumnName = mappings.getNamingStrategy()
+ .logicalColumnName( this.logicalColumnName, propertyName );
+ mappings.addColumnBinding( logicalColumnName, getMappingColumn(), value.getTable() );
+ }
+
+ /**
+ * Find appropriate table of the column.
+ * It can come from a secondary table or from the main table of the persistent class
+ *
+ * @return appropriate table
+ * @throws AnnotationException missing secondary table
+ */
+ public Table getTable() {
+ if ( table != null ) return table; //association table
+ if ( isSecondary() ) {
+ return getJoin().getTable();
+ }
+ else {
+ return propertyHolder.getTable();
+ }
+ }
+
+ public boolean isSecondary() {
+ if ( propertyHolder == null ) {
+ throw new AssertionFailure( "Should not call getTable() on column wo persistent class defined" );
+ }
+ if ( StringHelper.isNotEmpty( secondaryTableName ) ) {
+ return true;
+ }
+ // else {
+ return false;
+ }
+
+ public Join getJoin() {
+ Join join = joins.get( secondaryTableName );
+ if ( join == null ) {
+ throw new AnnotationException(
+ "Cannot find the expected secondary table: no "
+ + secondaryTableName + " available for " + propertyHolder.getClassName()
+ );
+ }
+ else {
+ return join;
+ }
+ }
+
+ public void forceNotNull() {
+ mappingColumn.setNullable( false );
+ }
+
+ public void setSecondaryTableName(String secondaryTableName) {
+ this.secondaryTableName = secondaryTableName;
+ }
+
+ public static Ejb3Column[] buildColumnFromAnnotation(
+ javax.persistence.Column[] anns,
+ org.hibernate.annotations.Formula formulaAnn, Nullability nullability, PropertyHolder propertyHolder,
+ PropertyData inferredData,
+ Map<String, Join> secondaryTables,
+ ExtendedMappings mappings
+ ) {
+ Ejb3Column[] columns;
+ if ( formulaAnn != null ) {
+ Ejb3Column formulaColumn = new Ejb3Column();
+ formulaColumn.setFormula( formulaAnn.value() );
+ formulaColumn.setImplicit( false );
+ formulaColumn.setMappings( mappings );
+ formulaColumn.setPropertyHolder( propertyHolder );
+ formulaColumn.bind();
+ columns = new Ejb3Column[]{formulaColumn};
+ }
+ else {
+ javax.persistence.Column[] actualCols = anns;
+ javax.persistence.Column[] overriddenCols = propertyHolder.getOverriddenColumn(
+ StringHelper.qualify( propertyHolder.getPath(), inferredData.getPropertyName() )
+ );
+ if ( overriddenCols != null ) {
+ //check for overridden first
+ if ( anns != null && overriddenCols.length != anns.length ) {
+ throw new AnnotationException( "AttributeOverride.column() should override all columns for now" );
+ }
+ actualCols = overriddenCols.length == 0 ? null : overriddenCols;
+ log.debug( "Column(s) overridden for property " + inferredData.getPropertyName() );
+ }
+ if ( actualCols == null ) {
+ columns = buildImplicitColumn( inferredData, secondaryTables, propertyHolder, nullability, mappings );
+ }
+ else {
+ final int length = actualCols.length;
+ columns = new Ejb3Column[length];
+ for ( int index = 0; index < length ; index++ ) {
+ javax.persistence.Column col = actualCols[index];
+ String sqlType = col.columnDefinition().equals( "" ) ? null : col.columnDefinition();
+ Ejb3Column column = new Ejb3Column();
+ column.setImplicit( false );
+ column.setSqlType( sqlType );
+ column.setLength( col.length() );
+ column.setPrecision( col.precision() );
+ column.setScale( col.scale() );
+ column.setLogicalColumnName( col.name() );
+ column.setPropertyName(
+ BinderHelper.getRelativePath( propertyHolder, inferredData.getPropertyName() )
+ );
+ column.setNullable(
+ col.nullable()
+ ); //TODO force to not null if available? This is a (bad) user choice.
+ column.setUnique( col.unique() );
+ column.setInsertable( col.insertable() );
+ column.setUpdatable( col.updatable() );
+ column.setSecondaryTableName( col.table() );
+ column.setPropertyHolder( propertyHolder );
+ column.setJoins( secondaryTables );
+ column.setMappings( mappings );
+ column.bind();
+ columns[index] = column;
+ }
+ }
+ }
+ return columns;
+ }
+
+ private static Ejb3Column[] buildImplicitColumn(
+ PropertyData inferredData, Map<String, Join> secondaryTables, PropertyHolder propertyHolder,
+ Nullability nullability, ExtendedMappings mappings
+ ) {
+ Ejb3Column[] columns;
+ columns = new Ejb3Column[1];
+ Ejb3Column column = new Ejb3Column();
+ column.setImplicit( false );
+ //not following the spec but more clean
+ if ( nullability != Nullability.FORCED_NULL
+ && inferredData.getClassOrElement().isPrimitive()
+ && ! inferredData.getProperty().isArray() ) {
+ column.setNullable( false );
+ }
+ column.setLength( DEFAULT_COLUMN_LENGTH );
+ column.setPropertyName(
+ BinderHelper.getRelativePath( propertyHolder, inferredData.getPropertyName() )
+ );
+ column.setPropertyHolder( propertyHolder );
+ column.setJoins( secondaryTables );
+ column.setMappings( mappings );
+ column.bind();
+ columns[0] = column;
+ return columns;
+ }
+
+ public static void checkPropertyConsistency(Ejb3Column[] columns, String propertyName) {
+ int nbrOfColumns = columns.length;
+ if ( nbrOfColumns > 1 ) {
+ for ( int currentIndex = 1; currentIndex < nbrOfColumns ; currentIndex++ ) {
+ if ( columns[currentIndex].isInsertable() != columns[currentIndex - 1].isInsertable() ) {
+ throw new AnnotationException(
+ "Mixing insertable and non insertable columns in a property is not allowed: " + propertyName
+ );
+ }
+ if ( columns[currentIndex].isNullable() != columns[currentIndex - 1].isNullable() ) {
+ throw new AnnotationException(
+ "Mixing nullable and non nullable columns in a property is not allowed: " + propertyName
+ );
+ }
+ if ( columns[currentIndex].isUpdatable() != columns[currentIndex - 1].isUpdatable() ) {
+ throw new AnnotationException(
+ "Mixing updatable and non updatable columns in a property is not allowed: " + propertyName
+ );
+ }
+ if ( ! columns[currentIndex].getTable().equals( columns[currentIndex - 1].getTable() ) ) {
+ throw new AnnotationException(
+ "Mixing different tables in a property is not allowed: " + propertyName
+ );
+ }
+ }
+ }
+ }
+
+ public void addIndex(Index index, boolean inSecondPass) {
+ if ( index == null ) return;
+ IndexSecondPass secondPass = new IndexSecondPass( index.name(), this, mappings );
+ if (inSecondPass) {
+ secondPass.doSecondPass( mappings.getClasses() );
+ }
+ else {
+ mappings.addSecondPass(
+ secondPass
+ );
+ }
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,82 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorType;
-
-import org.hibernate.AssertionFailure;
-import org.hibernate.annotations.DiscriminatorFormula;
-
-/**
- * Discriminator column
- *
- * @author Emmanuel Bernard
- */
-public class Ejb3DiscriminatorColumn extends Ejb3Column {
-
-
- private static final String DEFAULT_DISCRIMINATOR_COLUMN_NAME = "DTYPE";
- private static final String DEFAULT_DISCRIMINATOR_TYPE = "string";
-
- private String discriminatorTypeName;
- private static final int DEFAULT_DISCRIMINATOR_LENGTH = 31;
-
- public Ejb3DiscriminatorColumn() {
- //discriminator default value
- super();
- setLogicalColumnName( DEFAULT_DISCRIMINATOR_COLUMN_NAME );
- setNullable( false );
- setDiscriminatorTypeName( DEFAULT_DISCRIMINATOR_TYPE );
- setLength( DEFAULT_DISCRIMINATOR_LENGTH );
- }
-
- public String getDiscriminatorTypeName() {
- return discriminatorTypeName;
- }
-
- public void setDiscriminatorTypeName(String discriminatorTypeName) {
- this.discriminatorTypeName = discriminatorTypeName;
- }
-
- public static Ejb3DiscriminatorColumn buildDiscriminatorColumn(
- DiscriminatorType type, DiscriminatorColumn discAnn, DiscriminatorFormula discFormulaAnn,
- ExtendedMappings mappings
- ) {
- Ejb3DiscriminatorColumn discriminatorColumn = new Ejb3DiscriminatorColumn();
- discriminatorColumn.setMappings( mappings );
- discriminatorColumn.setImplicit( true );
- if ( discFormulaAnn != null ) {
- discriminatorColumn.setImplicit( false );
- discriminatorColumn.setFormula( discFormulaAnn.value() );
- }
- else if ( discAnn != null ) {
- discriminatorColumn.setImplicit( false );
- if ( ! BinderHelper.isDefault( discAnn.columnDefinition() ) ) {
- discriminatorColumn.setSqlType(
- discAnn.columnDefinition()
- );
- }
- if ( ! BinderHelper.isDefault( discAnn.name() ) ) {
- discriminatorColumn.setLogicalColumnName( discAnn.name() );
- }
- discriminatorColumn.setNullable( false );
- }
- if ( DiscriminatorType.CHAR.equals( type ) ) {
- discriminatorColumn.setDiscriminatorTypeName( "character" );
- discriminatorColumn.setImplicit( false );
- }
- else if ( DiscriminatorType.INTEGER.equals( type ) ) {
- discriminatorColumn.setDiscriminatorTypeName( "integer" );
- discriminatorColumn.setImplicit( false );
- }
- else if ( DiscriminatorType.STRING.equals( type ) || type == null ) {
- if ( discAnn != null ) discriminatorColumn.setLength( discAnn.length() );
- discriminatorColumn.setDiscriminatorTypeName( "string" );
- }
- else {
- throw new AssertionFailure( "Unknown discriminator type: " + type );
- }
- discriminatorColumn.bind();
- return discriminatorColumn;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3DiscriminatorColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,82 @@
+//$Id$
+package org.hibernate.cfg;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+
+import org.hibernate.AssertionFailure;
+import org.hibernate.annotations.DiscriminatorFormula;
+
+/**
+ * Discriminator column
+ *
+ * @author Emmanuel Bernard
+ */
+public class Ejb3DiscriminatorColumn extends Ejb3Column {
+
+
+ private static final String DEFAULT_DISCRIMINATOR_COLUMN_NAME = "DTYPE";
+ private static final String DEFAULT_DISCRIMINATOR_TYPE = "string";
+
+ private String discriminatorTypeName;
+ private static final int DEFAULT_DISCRIMINATOR_LENGTH = 31;
+
+ public Ejb3DiscriminatorColumn() {
+ //discriminator default value
+ super();
+ setLogicalColumnName( DEFAULT_DISCRIMINATOR_COLUMN_NAME );
+ setNullable( false );
+ setDiscriminatorTypeName( DEFAULT_DISCRIMINATOR_TYPE );
+ setLength( DEFAULT_DISCRIMINATOR_LENGTH );
+ }
+
+ public String getDiscriminatorTypeName() {
+ return discriminatorTypeName;
+ }
+
+ public void setDiscriminatorTypeName(String discriminatorTypeName) {
+ this.discriminatorTypeName = discriminatorTypeName;
+ }
+
+ public static Ejb3DiscriminatorColumn buildDiscriminatorColumn(
+ DiscriminatorType type, DiscriminatorColumn discAnn, DiscriminatorFormula discFormulaAnn,
+ ExtendedMappings mappings
+ ) {
+ Ejb3DiscriminatorColumn discriminatorColumn = new Ejb3DiscriminatorColumn();
+ discriminatorColumn.setMappings( mappings );
+ discriminatorColumn.setImplicit( true );
+ if ( discFormulaAnn != null ) {
+ discriminatorColumn.setImplicit( false );
+ discriminatorColumn.setFormula( discFormulaAnn.value() );
+ }
+ else if ( discAnn != null ) {
+ discriminatorColumn.setImplicit( false );
+ if ( ! BinderHelper.isDefault( discAnn.columnDefinition() ) ) {
+ discriminatorColumn.setSqlType(
+ discAnn.columnDefinition()
+ );
+ }
+ if ( ! BinderHelper.isDefault( discAnn.name() ) ) {
+ discriminatorColumn.setLogicalColumnName( discAnn.name() );
+ }
+ discriminatorColumn.setNullable( false );
+ }
+ if ( DiscriminatorType.CHAR.equals( type ) ) {
+ discriminatorColumn.setDiscriminatorTypeName( "character" );
+ discriminatorColumn.setImplicit( false );
+ }
+ else if ( DiscriminatorType.INTEGER.equals( type ) ) {
+ discriminatorColumn.setDiscriminatorTypeName( "integer" );
+ discriminatorColumn.setImplicit( false );
+ }
+ else if ( DiscriminatorType.STRING.equals( type ) || type == null ) {
+ if ( discAnn != null ) discriminatorColumn.setLength( discAnn.length() );
+ discriminatorColumn.setDiscriminatorTypeName( "string" );
+ }
+ else {
+ throw new AssertionFailure( "Unknown discriminator type: " + type );
+ }
+ discriminatorColumn.bind();
+ return discriminatorColumn;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3JoinColumn.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3JoinColumn.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3JoinColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,510 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import javax.persistence.JoinColumn;
-import javax.persistence.PrimaryKeyJoinColumn;
-
-import org.hibernate.AnnotationException;
-import org.hibernate.MappingException;
-import org.hibernate.annotations.common.util.StringHelper;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.Table;
-import org.hibernate.mapping.Value;
-
-/**
- * Wrap state of an EJB3 @JoinColumn annotation
- * and build the Hibernate column mapping element
- *
- * @author Emmanuel Bernard
- */
-public class Ejb3JoinColumn extends Ejb3Column {
- /**
- * property name repated to this column
- */
- private String referencedColumn;
- private String mappedBy;
- //property name on the mapped by side if any
- private String mappedByPropertyName;
- //table name on the mapped by side if any
- private String mappedByTableName;
- private String mappedByEntityName;
-
- //FIXME hacky solution to get the information at proeprty ref resolution
- public String getManyToManyOwnerSideEntityName() {
- return manyToManyOwnerSideEntityName;
- }
-
- public void setManyToManyOwnerSideEntityName(String manyToManyOwnerSideEntityName) {
- this.manyToManyOwnerSideEntityName = manyToManyOwnerSideEntityName;
- }
-
- private String manyToManyOwnerSideEntityName;
-
- public void setReferencedColumn(String referencedColumn) {
- this.referencedColumn = referencedColumn;
- }
-
- public String getMappedBy() {
- return mappedBy;
- }
-
- public void setMappedBy(String mappedBy) {
- this.mappedBy = mappedBy;
- }
-
- //Due to @AnnotationOverride overriding rules, I don't want the constructor to be public
- private Ejb3JoinColumn() {
- setMappedBy( BinderHelper.ANNOTATION_STRING_DEFAULT );
- }
-
- //Due to @AnnotationOverride overriding rules, I don't want the constructor to be public
- //TODO get rid of it and use setters
- private Ejb3JoinColumn(
- String sqlType,
- String name,
- boolean nullable,
- boolean unique,
- boolean insertable,
- boolean updatable,
- String referencedColumn,
- String secondaryTable,
- Map<String, Join> joins,
- PropertyHolder propertyHolder,
- String propertyName,
- String mappedBy,
- boolean isImplicit,
- ExtendedMappings mappings
- ) {
- super();
- setImplicit( isImplicit );
- setSqlType( sqlType );
- setLogicalColumnName( name );
- setNullable( nullable );
- setUnique( unique );
- setInsertable( insertable );
- setUpdatable( updatable );
- setSecondaryTableName( secondaryTable );
- setPropertyHolder( propertyHolder );
- setJoins( joins );
- setMappings( mappings );
- setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) );
- bind();
- this.referencedColumn = referencedColumn;
- this.mappedBy = mappedBy;
- }
-
- public String getReferencedColumn() {
- return referencedColumn;
- }
-
- public static Ejb3JoinColumn[] buildJoinColumns(
- JoinColumn[] anns,
- String mappedBy, Map<String, Join> joins,
- PropertyHolder propertyHolder,
- String propertyName,
- ExtendedMappings mappings
- ) {
- JoinColumn[] actualColumns = propertyHolder.getOverriddenJoinColumn(
- StringHelper.qualify( propertyHolder.getPath(), propertyName )
- );
- if ( actualColumns == null ) actualColumns = anns;
- if ( actualColumns == null || actualColumns.length == 0 ) {
- return new Ejb3JoinColumn[]{
- buildJoinColumn( (JoinColumn) null, mappedBy, joins, propertyHolder, propertyName, mappings )
- };
- }
- else {
- int size = actualColumns.length;
- Ejb3JoinColumn[] result = new Ejb3JoinColumn[ size ];
- for ( int index = 0; index < size ; index++ ) {
- result[index] = buildJoinColumn(
- actualColumns[index],
- mappedBy,
- joins,
- propertyHolder,
- propertyName,
- mappings
- );
- }
- return result;
- }
- }
-
- /**
- * build join column for SecondaryTables
- */
- private static Ejb3JoinColumn buildJoinColumn(
- JoinColumn ann,
- String mappedBy, Map<String, Join> joins,
- PropertyHolder propertyHolder,
- String propertyName,
- ExtendedMappings mappings
- ) {
- if ( ann != null ) {
- if ( BinderHelper.isDefault( mappedBy ) ) {
- throw new AnnotationException(
- "Illegal attempt to define a @JoinColumn with a mappedBy association: "
- + BinderHelper.getRelativePath( propertyHolder, propertyName )
- );
- }
- Ejb3JoinColumn joinColumn = new Ejb3JoinColumn();
- joinColumn.setJoinAnnotation( ann, null );
- joinColumn.setJoins( joins );
- joinColumn.setPropertyHolder( propertyHolder );
- joinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) );
- joinColumn.setImplicit( false );
- joinColumn.setMappings( mappings );
- joinColumn.bind();
- return joinColumn;
- }
- else {
- Ejb3JoinColumn joinColumn = new Ejb3JoinColumn();
- joinColumn.setMappedBy( mappedBy );
- joinColumn.setJoins( joins );
- joinColumn.setPropertyHolder( propertyHolder );
- joinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) );
- joinColumn.setImplicit( true );
- joinColumn.setMappings( mappings );
- joinColumn.bind();
- return joinColumn;
- }
- }
-
-
- //FIXME default name still useful in association table
- public void setJoinAnnotation(JoinColumn annJoin, String defaultName) {
- if ( annJoin == null ) {
- setImplicit( true );
- }
- else {
- setImplicit( false );
- if ( ! BinderHelper.isDefault( annJoin.columnDefinition() ) ) setSqlType( annJoin.columnDefinition() );
- if ( ! BinderHelper.isDefault( annJoin.name() ) ) setLogicalColumnName( annJoin.name() );
- setNullable( annJoin.nullable() );
- setUnique( annJoin.unique() );
- setInsertable( annJoin.insertable() );
- setUpdatable( annJoin.updatable() );
- setReferencedColumn( annJoin.referencedColumnName() );
- setSecondaryTableName( annJoin.table() );
- }
- }
-
- /**
- * Build JoinColumn for a JOINED hierarchy
- */
- public static Ejb3JoinColumn buildJoinColumn(
- PrimaryKeyJoinColumn pkJoinAnn,
- JoinColumn joinAnn,
- Value identifier,
- Map<String, Join> joins,
- PropertyHolder propertyHolder, ExtendedMappings mappings
- ) {
-
- Column col = (Column) identifier.getColumnIterator().next();
- String defaultName = mappings.getLogicalColumnName( col.getName(), identifier.getTable() );
- if ( pkJoinAnn != null || joinAnn != null ) {
- String colName;
- String columnDefinition;
- String referencedColumnName;
- if ( pkJoinAnn != null ) {
- colName = pkJoinAnn.name();
- columnDefinition = pkJoinAnn.columnDefinition();
- referencedColumnName = pkJoinAnn.referencedColumnName();
- }
- else {
- colName = joinAnn.name();
- columnDefinition = joinAnn.columnDefinition();
- referencedColumnName = joinAnn.referencedColumnName();
- }
- String sqlType = "".equals( columnDefinition ) ? null : columnDefinition;
- String name = "".equals( colName ) ? defaultName : colName;
- return new Ejb3JoinColumn(
- sqlType,
- name, false, false,
- true, true,
- referencedColumnName,
- null, joins,
- propertyHolder, null, null, false, mappings
- );
- }
- else {
- return new Ejb3JoinColumn(
- (String) null, defaultName,
- false, false, true, true, null, (String) null,
- joins, propertyHolder, null, null, true, mappings
- );
- }
- }
-
- /**
- * Override persistent class on oneToMany Cases for late settings
- * Must only be used on second level pass binding
- */
- public void setPersistentClass(PersistentClass persistentClass, Map<String, Join> joins) {
- //FIXME shouldn't we deduce the classname from the persistentclasS?
- this.propertyHolder = PropertyHolderBuilder.buildPropertyHolder( persistentClass, joins, getMappings() );
- }
-
- public static void checkIfJoinColumn(Object columns, PropertyHolder holder, PropertyData property) {
- if ( ! ( columns instanceof Ejb3JoinColumn[] ) ) {
- throw new AnnotationException(
- "@Column cannot be used on an association property: "
- + holder.getEntityName()
- + "."
- + property.getPropertyName()
- );
- }
- }
-
- public void linkValueUsingDefaultColumnNaming(
- Column referencedColumn, PersistentClass referencedEntity, SimpleValue value
- ) {
- String columnName;
- String logicalReferencedColumn = getMappings().getLogicalColumnName(
- referencedColumn.getName(), referencedEntity.getTable()
- );
- boolean mappedBySide = mappedByTableName != null || mappedByPropertyName != null;
- boolean ownerSide = getPropertyName() != null;
-
- Boolean isRefColumnQuoted = StringHelper.isQuoted( logicalReferencedColumn );
- String unquotedLogicalReferenceColumn = isRefColumnQuoted ?
- StringHelper.unquote( logicalReferencedColumn ) :
- logicalReferencedColumn;
-
- if ( mappedBySide ) {
- String unquotedMappedbyTable = StringHelper.unquote( mappedByTableName );
- columnName = getMappings().getNamingStrategy().foreignKeyColumnName(
- mappedByPropertyName,
- mappedByEntityName,
- unquotedMappedbyTable,
- unquotedLogicalReferenceColumn
- );
- //one element was quoted so we quote
- if ( isRefColumnQuoted || StringHelper.isQuoted( mappedByTableName ) ) {
- columnName = StringHelper.quote( columnName );
- }
- }
- else if ( ownerSide ) {
- String logicalTableName = getMappings().getLogicalTableName( referencedEntity.getTable() );
- String unquotedLogicalTableName = StringHelper.unquote( logicalTableName );
- columnName = getMappings().getNamingStrategy().foreignKeyColumnName(
- getPropertyName(),
- referencedEntity.getEntityName(),
- unquotedLogicalTableName,
- unquotedLogicalReferenceColumn
- );
- //one element was quoted so we quote
- if ( isRefColumnQuoted || StringHelper.isQuoted( logicalTableName ) ) {
- columnName = StringHelper.quote( columnName );
- }
- }
- else {
- //is an intra-entity hierarchy table join so copy the name by default
- String logicalTableName = getMappings().getLogicalTableName( referencedEntity.getTable() );
- String unquotedLogicalTableName = StringHelper.unquote( logicalTableName );
- columnName = getMappings().getNamingStrategy().joinKeyColumnName(
- unquotedLogicalReferenceColumn,
- unquotedLogicalTableName
- );
- //one element was quoted so we quote
- if ( isRefColumnQuoted || StringHelper.isQuoted( logicalTableName ) ) {
- columnName = StringHelper.quote( columnName );
- }
- }
- //yuk side effect on an implicit column
- setLogicalColumnName( columnName );
- setReferencedColumn( logicalReferencedColumn );
- initMappingColumn(
- columnName,
- null, referencedColumn.getLength(),
- referencedColumn.getPrecision(),
- referencedColumn.getScale(),
- getMappingColumn().isNullable(),
- referencedColumn.getSqlType(),
- getMappingColumn().isUnique(), false
- );
- linkWithValue( value );
- }
-
- /**
- * used for mappedBy cases
- */
- public void linkValueUsingAColumnCopy(Column column, SimpleValue value) {
- initMappingColumn(
- //column.getName(),
- column.getQuotedName(),
- null, column.getLength(),
- column.getPrecision(),
- column.getScale(),
- getMappingColumn().isNullable(),
- column.getSqlType(),
- getMappingColumn().isUnique(),
- false //We do copy no strategy here
- );
- linkWithValue( value );
- }
-
- protected void addColumnBinding(SimpleValue value) {
- if ( StringHelper.isEmpty( mappedBy ) ) {
- String unquotedLogColName = StringHelper.unquote( getLogicalColumnName() );
- String unquotedRefColumn = StringHelper.unquote( getReferencedColumn() );
- String logicalColumnName = getMappings().getNamingStrategy()
- .logicalCollectionColumnName( unquotedLogColName, getPropertyName(), unquotedRefColumn );
- if ( StringHelper.isQuoted( getLogicalColumnName() ) || StringHelper.isQuoted( getLogicalColumnName() ) ) {
- logicalColumnName = StringHelper.quote( logicalColumnName );
- }
- getMappings().addColumnBinding( logicalColumnName, getMappingColumn(), value.getTable() );
- }
- }
-
- //keep it JDK 1.4 compliant
- //implicit way
- public static final int NO_REFERENCE = 0;
- //reference to the pk in an explicit order
- public static final int PK_REFERENCE = 1;
- //reference to non pk columns
- public static final int NON_PK_REFERENCE = 2;
-
- public static int checkReferencedColumnsType(
- Ejb3JoinColumn[] columns, PersistentClass referencedEntity,
- ExtendedMappings mappings
- ) {
- //convenient container to find whether a column is an id one or not
- Set<Column> idColumns = new HashSet<Column>();
- Iterator idColumnsIt = referencedEntity.getKey().getColumnIterator();
- while ( idColumnsIt.hasNext() ) {
- idColumns.add( (Column) idColumnsIt.next() );
- }
-
- boolean isFkReferencedColumnName = false;
- boolean noReferencedColumn = true;
- //build the list of potential tables
- if ( columns.length == 0 ) return NO_REFERENCE; //shortcut
- Object columnOwner = BinderHelper.findColumnOwner(
- referencedEntity, columns[0].getReferencedColumn(), mappings
- );
- if ( columnOwner == null ) {
- throw new MappingException(
- "Unable to find column with logical name: "
- + columns[0].getReferencedColumn() + " in " + referencedEntity.getTable() + " and its related "
- + "supertables and secondary tables"
- );
- }
- Table matchingTable = columnOwner instanceof PersistentClass ?
- ( (PersistentClass) columnOwner ).getTable() :
- ( (Join) columnOwner ).getTable();
- //check each referenced column
- for ( Ejb3JoinColumn ejb3Column : columns ) {
- String logicalReferencedColumnName = ejb3Column.getReferencedColumn();
- if ( StringHelper.isNotEmpty( logicalReferencedColumnName ) ) {
- String referencedColumnName = null;
- try {
- referencedColumnName = mappings.getPhysicalColumnName( logicalReferencedColumnName, matchingTable );
- }
- catch (MappingException me) {
- //rewrite the exception
- throw new MappingException(
- "Unable to find column with logical name: "
- + logicalReferencedColumnName + " in " + matchingTable.getName()
- );
- }
- noReferencedColumn = false;
- Column refCol = new Column( referencedColumnName );
- boolean contains = idColumns.contains( refCol );
- if ( ! contains ) {
- isFkReferencedColumnName = true;
- break; //we know the state
- }
- }
- }
- if ( isFkReferencedColumnName ) {
- return NON_PK_REFERENCE;
- }
- else if ( noReferencedColumn ) {
- return NO_REFERENCE;
- }
- else if ( idColumns.size() != columns.length ) {
- //reference use PK but is a subset or a superset
- return NON_PK_REFERENCE;
- } else {
- return PK_REFERENCE;
- }
- }
-
- public void overrideSqlTypeIfNecessary(org.hibernate.mapping.Column column) {
- if ( StringHelper.isEmpty( sqlType ) ) {
- sqlType = column.getSqlType();
- if ( getMappingColumn() != null ) getMappingColumn().setSqlType( sqlType );
- }
- }
-
- @Override
- public void redefineColumnName(String columnName, String propertyName, boolean applyNamingStrategy) {
- if ( StringHelper.isNotEmpty( columnName ) ) {
- getMappingColumn().setName(
- applyNamingStrategy ?
- getMappings().getNamingStrategy().columnName( columnName ) :
- columnName
- );
- }
- }
-
- public static Ejb3JoinColumn[] buildJoinTableJoinColumns(
- JoinColumn[] annJoins, Map<String, Join> secondaryTables,
- PropertyHolder propertyHolder, String propertyName, String mappedBy, ExtendedMappings mappings
- ) {
- Ejb3JoinColumn[] joinColumns;
- if ( annJoins == null ) {
- Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn();
- currentJoinColumn.setImplicit( true );
- currentJoinColumn.setNullable( false ); //I break the spec, but it's for good
- currentJoinColumn.setPropertyHolder( propertyHolder );
- currentJoinColumn.setJoins( secondaryTables );
- currentJoinColumn.setMappings( mappings );
- currentJoinColumn.setPropertyName(
- BinderHelper.getRelativePath( propertyHolder, propertyName )
- );
- currentJoinColumn.setMappedBy( mappedBy );
- currentJoinColumn.bind();
-
- joinColumns = new Ejb3JoinColumn[]{
- currentJoinColumn
-
- };
- }
- else {
- joinColumns = new Ejb3JoinColumn[annJoins.length];
- JoinColumn annJoin;
- int length = annJoins.length;
- for ( int index = 0; index < length ; index++ ) {
- annJoin = annJoins[index];
- Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn();
- currentJoinColumn.setImplicit( true );
- currentJoinColumn.setPropertyHolder( propertyHolder );
- currentJoinColumn.setJoins( secondaryTables );
- currentJoinColumn.setMappings( mappings );
- currentJoinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) );
- currentJoinColumn.setMappedBy( mappedBy );
- currentJoinColumn.setJoinAnnotation( annJoin, propertyName );
- currentJoinColumn.setNullable( false ); //I break the spec, but it's for good
- //done after the annotation to override it
- currentJoinColumn.bind();
- joinColumns[index] = currentJoinColumn;
- }
- }
- return joinColumns;
- }
-
- public void setMappedBy(String entityName, String logicalTableName, String mappedByProperty) {
- this.mappedByEntityName = entityName;
- this.mappedByTableName = logicalTableName;
- this.mappedByPropertyName = mappedByProperty;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3JoinColumn.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3JoinColumn.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3JoinColumn.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/Ejb3JoinColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,510 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import javax.persistence.JoinColumn;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.MappingException;
+import org.hibernate.annotations.common.util.StringHelper;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.Table;
+import org.hibernate.mapping.Value;
+
+/**
+ * Wrap state of an EJB3 @JoinColumn annotation
+ * and build the Hibernate column mapping element
+ *
+ * @author Emmanuel Bernard
+ */
+public class Ejb3JoinColumn extends Ejb3Column {
+ /**
+ * property name repated to this column
+ */
+ private String referencedColumn;
+ private String mappedBy;
+ //property name on the mapped by side if any
+ private String mappedByPropertyName;
+ //table name on the mapped by side if any
+ private String mappedByTableName;
+ private String mappedByEntityName;
+
+ //FIXME hacky solution to get the information at proeprty ref resolution
+ public String getManyToManyOwnerSideEntityName() {
+ return manyToManyOwnerSideEntityName;
+ }
+
+ public void setManyToManyOwnerSideEntityName(String manyToManyOwnerSideEntityName) {
+ this.manyToManyOwnerSideEntityName = manyToManyOwnerSideEntityName;
+ }
+
+ private String manyToManyOwnerSideEntityName;
+
+ public void setReferencedColumn(String referencedColumn) {
+ this.referencedColumn = referencedColumn;
+ }
+
+ public String getMappedBy() {
+ return mappedBy;
+ }
+
+ public void setMappedBy(String mappedBy) {
+ this.mappedBy = mappedBy;
+ }
+
+ //Due to @AnnotationOverride overriding rules, I don't want the constructor to be public
+ private Ejb3JoinColumn() {
+ setMappedBy( BinderHelper.ANNOTATION_STRING_DEFAULT );
+ }
+
+ //Due to @AnnotationOverride overriding rules, I don't want the constructor to be public
+ //TODO get rid of it and use setters
+ private Ejb3JoinColumn(
+ String sqlType,
+ String name,
+ boolean nullable,
+ boolean unique,
+ boolean insertable,
+ boolean updatable,
+ String referencedColumn,
+ String secondaryTable,
+ Map<String, Join> joins,
+ PropertyHolder propertyHolder,
+ String propertyName,
+ String mappedBy,
+ boolean isImplicit,
+ ExtendedMappings mappings
+ ) {
+ super();
+ setImplicit( isImplicit );
+ setSqlType( sqlType );
+ setLogicalColumnName( name );
+ setNullable( nullable );
+ setUnique( unique );
+ setInsertable( insertable );
+ setUpdatable( updatable );
+ setSecondaryTableName( secondaryTable );
+ setPropertyHolder( propertyHolder );
+ setJoins( joins );
+ setMappings( mappings );
+ setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) );
+ bind();
+ this.referencedColumn = referencedColumn;
+ this.mappedBy = mappedBy;
+ }
+
+ public String getReferencedColumn() {
+ return referencedColumn;
+ }
+
+ public static Ejb3JoinColumn[] buildJoinColumns(
+ JoinColumn[] anns,
+ String mappedBy, Map<String, Join> joins,
+ PropertyHolder propertyHolder,
+ String propertyName,
+ ExtendedMappings mappings
+ ) {
+ JoinColumn[] actualColumns = propertyHolder.getOverriddenJoinColumn(
+ StringHelper.qualify( propertyHolder.getPath(), propertyName )
+ );
+ if ( actualColumns == null ) actualColumns = anns;
+ if ( actualColumns == null || actualColumns.length == 0 ) {
+ return new Ejb3JoinColumn[]{
+ buildJoinColumn( (JoinColumn) null, mappedBy, joins, propertyHolder, propertyName, mappings )
+ };
+ }
+ else {
+ int size = actualColumns.length;
+ Ejb3JoinColumn[] result = new Ejb3JoinColumn[ size ];
+ for ( int index = 0; index < size ; index++ ) {
+ result[index] = buildJoinColumn(
+ actualColumns[index],
+ mappedBy,
+ joins,
+ propertyHolder,
+ propertyName,
+ mappings
+ );
+ }
+ return result;
+ }
+ }
+
+ /**
+ * build join column for SecondaryTables
+ */
+ private static Ejb3JoinColumn buildJoinColumn(
+ JoinColumn ann,
+ String mappedBy, Map<String, Join> joins,
+ PropertyHolder propertyHolder,
+ String propertyName,
+ ExtendedMappings mappings
+ ) {
+ if ( ann != null ) {
+ if ( BinderHelper.isDefault( mappedBy ) ) {
+ throw new AnnotationException(
+ "Illegal attempt to define a @JoinColumn with a mappedBy association: "
+ + BinderHelper.getRelativePath( propertyHolder, propertyName )
+ );
+ }
+ Ejb3JoinColumn joinColumn = new Ejb3JoinColumn();
+ joinColumn.setJoinAnnotation( ann, null );
+ joinColumn.setJoins( joins );
+ joinColumn.setPropertyHolder( propertyHolder );
+ joinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) );
+ joinColumn.setImplicit( false );
+ joinColumn.setMappings( mappings );
+ joinColumn.bind();
+ return joinColumn;
+ }
+ else {
+ Ejb3JoinColumn joinColumn = new Ejb3JoinColumn();
+ joinColumn.setMappedBy( mappedBy );
+ joinColumn.setJoins( joins );
+ joinColumn.setPropertyHolder( propertyHolder );
+ joinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) );
+ joinColumn.setImplicit( true );
+ joinColumn.setMappings( mappings );
+ joinColumn.bind();
+ return joinColumn;
+ }
+ }
+
+
+ //FIXME default name still useful in association table
+ public void setJoinAnnotation(JoinColumn annJoin, String defaultName) {
+ if ( annJoin == null ) {
+ setImplicit( true );
+ }
+ else {
+ setImplicit( false );
+ if ( ! BinderHelper.isDefault( annJoin.columnDefinition() ) ) setSqlType( annJoin.columnDefinition() );
+ if ( ! BinderHelper.isDefault( annJoin.name() ) ) setLogicalColumnName( annJoin.name() );
+ setNullable( annJoin.nullable() );
+ setUnique( annJoin.unique() );
+ setInsertable( annJoin.insertable() );
+ setUpdatable( annJoin.updatable() );
+ setReferencedColumn( annJoin.referencedColumnName() );
+ setSecondaryTableName( annJoin.table() );
+ }
+ }
+
+ /**
+ * Build JoinColumn for a JOINED hierarchy
+ */
+ public static Ejb3JoinColumn buildJoinColumn(
+ PrimaryKeyJoinColumn pkJoinAnn,
+ JoinColumn joinAnn,
+ Value identifier,
+ Map<String, Join> joins,
+ PropertyHolder propertyHolder, ExtendedMappings mappings
+ ) {
+
+ Column col = (Column) identifier.getColumnIterator().next();
+ String defaultName = mappings.getLogicalColumnName( col.getName(), identifier.getTable() );
+ if ( pkJoinAnn != null || joinAnn != null ) {
+ String colName;
+ String columnDefinition;
+ String referencedColumnName;
+ if ( pkJoinAnn != null ) {
+ colName = pkJoinAnn.name();
+ columnDefinition = pkJoinAnn.columnDefinition();
+ referencedColumnName = pkJoinAnn.referencedColumnName();
+ }
+ else {
+ colName = joinAnn.name();
+ columnDefinition = joinAnn.columnDefinition();
+ referencedColumnName = joinAnn.referencedColumnName();
+ }
+ String sqlType = "".equals( columnDefinition ) ? null : columnDefinition;
+ String name = "".equals( colName ) ? defaultName : colName;
+ return new Ejb3JoinColumn(
+ sqlType,
+ name, false, false,
+ true, true,
+ referencedColumnName,
+ null, joins,
+ propertyHolder, null, null, false, mappings
+ );
+ }
+ else {
+ return new Ejb3JoinColumn(
+ (String) null, defaultName,
+ false, false, true, true, null, (String) null,
+ joins, propertyHolder, null, null, true, mappings
+ );
+ }
+ }
+
+ /**
+ * Override persistent class on oneToMany Cases for late settings
+ * Must only be used on second level pass binding
+ */
+ public void setPersistentClass(PersistentClass persistentClass, Map<String, Join> joins) {
+ //FIXME shouldn't we deduce the classname from the persistentclasS?
+ this.propertyHolder = PropertyHolderBuilder.buildPropertyHolder( persistentClass, joins, getMappings() );
+ }
+
+ public static void checkIfJoinColumn(Object columns, PropertyHolder holder, PropertyData property) {
+ if ( ! ( columns instanceof Ejb3JoinColumn[] ) ) {
+ throw new AnnotationException(
+ "@Column cannot be used on an association property: "
+ + holder.getEntityName()
+ + "."
+ + property.getPropertyName()
+ );
+ }
+ }
+
+ public void linkValueUsingDefaultColumnNaming(
+ Column referencedColumn, PersistentClass referencedEntity, SimpleValue value
+ ) {
+ String columnName;
+ String logicalReferencedColumn = getMappings().getLogicalColumnName(
+ referencedColumn.getName(), referencedEntity.getTable()
+ );
+ boolean mappedBySide = mappedByTableName != null || mappedByPropertyName != null;
+ boolean ownerSide = getPropertyName() != null;
+
+ Boolean isRefColumnQuoted = StringHelper.isQuoted( logicalReferencedColumn );
+ String unquotedLogicalReferenceColumn = isRefColumnQuoted ?
+ StringHelper.unquote( logicalReferencedColumn ) :
+ logicalReferencedColumn;
+
+ if ( mappedBySide ) {
+ String unquotedMappedbyTable = StringHelper.unquote( mappedByTableName );
+ columnName = getMappings().getNamingStrategy().foreignKeyColumnName(
+ mappedByPropertyName,
+ mappedByEntityName,
+ unquotedMappedbyTable,
+ unquotedLogicalReferenceColumn
+ );
+ //one element was quoted so we quote
+ if ( isRefColumnQuoted || StringHelper.isQuoted( mappedByTableName ) ) {
+ columnName = StringHelper.quote( columnName );
+ }
+ }
+ else if ( ownerSide ) {
+ String logicalTableName = getMappings().getLogicalTableName( referencedEntity.getTable() );
+ String unquotedLogicalTableName = StringHelper.unquote( logicalTableName );
+ columnName = getMappings().getNamingStrategy().foreignKeyColumnName(
+ getPropertyName(),
+ referencedEntity.getEntityName(),
+ unquotedLogicalTableName,
+ unquotedLogicalReferenceColumn
+ );
+ //one element was quoted so we quote
+ if ( isRefColumnQuoted || StringHelper.isQuoted( logicalTableName ) ) {
+ columnName = StringHelper.quote( columnName );
+ }
+ }
+ else {
+ //is an intra-entity hierarchy table join so copy the name by default
+ String logicalTableName = getMappings().getLogicalTableName( referencedEntity.getTable() );
+ String unquotedLogicalTableName = StringHelper.unquote( logicalTableName );
+ columnName = getMappings().getNamingStrategy().joinKeyColumnName(
+ unquotedLogicalReferenceColumn,
+ unquotedLogicalTableName
+ );
+ //one element was quoted so we quote
+ if ( isRefColumnQuoted || StringHelper.isQuoted( logicalTableName ) ) {
+ columnName = StringHelper.quote( columnName );
+ }
+ }
+ //yuk side effect on an implicit column
+ setLogicalColumnName( columnName );
+ setReferencedColumn( logicalReferencedColumn );
+ initMappingColumn(
+ columnName,
+ null, referencedColumn.getLength(),
+ referencedColumn.getPrecision(),
+ referencedColumn.getScale(),
+ getMappingColumn().isNullable(),
+ referencedColumn.getSqlType(),
+ getMappingColumn().isUnique(), false
+ );
+ linkWithValue( value );
+ }
+
+ /**
+ * used for mappedBy cases
+ */
+ public void linkValueUsingAColumnCopy(Column column, SimpleValue value) {
+ initMappingColumn(
+ //column.getName(),
+ column.getQuotedName(),
+ null, column.getLength(),
+ column.getPrecision(),
+ column.getScale(),
+ getMappingColumn().isNullable(),
+ column.getSqlType(),
+ getMappingColumn().isUnique(),
+ false //We do copy no strategy here
+ );
+ linkWithValue( value );
+ }
+
+ protected void addColumnBinding(SimpleValue value) {
+ if ( StringHelper.isEmpty( mappedBy ) ) {
+ String unquotedLogColName = StringHelper.unquote( getLogicalColumnName() );
+ String unquotedRefColumn = StringHelper.unquote( getReferencedColumn() );
+ String logicalColumnName = getMappings().getNamingStrategy()
+ .logicalCollectionColumnName( unquotedLogColName, getPropertyName(), unquotedRefColumn );
+ if ( StringHelper.isQuoted( getLogicalColumnName() ) || StringHelper.isQuoted( getLogicalColumnName() ) ) {
+ logicalColumnName = StringHelper.quote( logicalColumnName );
+ }
+ getMappings().addColumnBinding( logicalColumnName, getMappingColumn(), value.getTable() );
+ }
+ }
+
+ //keep it JDK 1.4 compliant
+ //implicit way
+ public static final int NO_REFERENCE = 0;
+ //reference to the pk in an explicit order
+ public static final int PK_REFERENCE = 1;
+ //reference to non pk columns
+ public static final int NON_PK_REFERENCE = 2;
+
+ public static int checkReferencedColumnsType(
+ Ejb3JoinColumn[] columns, PersistentClass referencedEntity,
+ ExtendedMappings mappings
+ ) {
+ //convenient container to find whether a column is an id one or not
+ Set<Column> idColumns = new HashSet<Column>();
+ Iterator idColumnsIt = referencedEntity.getKey().getColumnIterator();
+ while ( idColumnsIt.hasNext() ) {
+ idColumns.add( (Column) idColumnsIt.next() );
+ }
+
+ boolean isFkReferencedColumnName = false;
+ boolean noReferencedColumn = true;
+ //build the list of potential tables
+ if ( columns.length == 0 ) return NO_REFERENCE; //shortcut
+ Object columnOwner = BinderHelper.findColumnOwner(
+ referencedEntity, columns[0].getReferencedColumn(), mappings
+ );
+ if ( columnOwner == null ) {
+ throw new MappingException(
+ "Unable to find column with logical name: "
+ + columns[0].getReferencedColumn() + " in " + referencedEntity.getTable() + " and its related "
+ + "supertables and secondary tables"
+ );
+ }
+ Table matchingTable = columnOwner instanceof PersistentClass ?
+ ( (PersistentClass) columnOwner ).getTable() :
+ ( (Join) columnOwner ).getTable();
+ //check each referenced column
+ for ( Ejb3JoinColumn ejb3Column : columns ) {
+ String logicalReferencedColumnName = ejb3Column.getReferencedColumn();
+ if ( StringHelper.isNotEmpty( logicalReferencedColumnName ) ) {
+ String referencedColumnName = null;
+ try {
+ referencedColumnName = mappings.getPhysicalColumnName( logicalReferencedColumnName, matchingTable );
+ }
+ catch (MappingException me) {
+ //rewrite the exception
+ throw new MappingException(
+ "Unable to find column with logical name: "
+ + logicalReferencedColumnName + " in " + matchingTable.getName()
+ );
+ }
+ noReferencedColumn = false;
+ Column refCol = new Column( referencedColumnName );
+ boolean contains = idColumns.contains( refCol );
+ if ( ! contains ) {
+ isFkReferencedColumnName = true;
+ break; //we know the state
+ }
+ }
+ }
+ if ( isFkReferencedColumnName ) {
+ return NON_PK_REFERENCE;
+ }
+ else if ( noReferencedColumn ) {
+ return NO_REFERENCE;
+ }
+ else if ( idColumns.size() != columns.length ) {
+ //reference use PK but is a subset or a superset
+ return NON_PK_REFERENCE;
+ } else {
+ return PK_REFERENCE;
+ }
+ }
+
+ public void overrideSqlTypeIfNecessary(org.hibernate.mapping.Column column) {
+ if ( StringHelper.isEmpty( sqlType ) ) {
+ sqlType = column.getSqlType();
+ if ( getMappingColumn() != null ) getMappingColumn().setSqlType( sqlType );
+ }
+ }
+
+ @Override
+ public void redefineColumnName(String columnName, String propertyName, boolean applyNamingStrategy) {
+ if ( StringHelper.isNotEmpty( columnName ) ) {
+ getMappingColumn().setName(
+ applyNamingStrategy ?
+ getMappings().getNamingStrategy().columnName( columnName ) :
+ columnName
+ );
+ }
+ }
+
+ public static Ejb3JoinColumn[] buildJoinTableJoinColumns(
+ JoinColumn[] annJoins, Map<String, Join> secondaryTables,
+ PropertyHolder propertyHolder, String propertyName, String mappedBy, ExtendedMappings mappings
+ ) {
+ Ejb3JoinColumn[] joinColumns;
+ if ( annJoins == null ) {
+ Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn();
+ currentJoinColumn.setImplicit( true );
+ currentJoinColumn.setNullable( false ); //I break the spec, but it's for good
+ currentJoinColumn.setPropertyHolder( propertyHolder );
+ currentJoinColumn.setJoins( secondaryTables );
+ currentJoinColumn.setMappings( mappings );
+ currentJoinColumn.setPropertyName(
+ BinderHelper.getRelativePath( propertyHolder, propertyName )
+ );
+ currentJoinColumn.setMappedBy( mappedBy );
+ currentJoinColumn.bind();
+
+ joinColumns = new Ejb3JoinColumn[]{
+ currentJoinColumn
+
+ };
+ }
+ else {
+ joinColumns = new Ejb3JoinColumn[annJoins.length];
+ JoinColumn annJoin;
+ int length = annJoins.length;
+ for ( int index = 0; index < length ; index++ ) {
+ annJoin = annJoins[index];
+ Ejb3JoinColumn currentJoinColumn = new Ejb3JoinColumn();
+ currentJoinColumn.setImplicit( true );
+ currentJoinColumn.setPropertyHolder( propertyHolder );
+ currentJoinColumn.setJoins( secondaryTables );
+ currentJoinColumn.setMappings( mappings );
+ currentJoinColumn.setPropertyName( BinderHelper.getRelativePath( propertyHolder, propertyName ) );
+ currentJoinColumn.setMappedBy( mappedBy );
+ currentJoinColumn.setJoinAnnotation( annJoin, propertyName );
+ currentJoinColumn.setNullable( false ); //I break the spec, but it's for good
+ //done after the annotation to override it
+ currentJoinColumn.bind();
+ joinColumns[index] = currentJoinColumn;
+ }
+ }
+ return joinColumns;
+ }
+
+ public void setMappedBy(String entityName, String logicalTableName, String mappedByProperty) {
+ this.mappedByEntityName = entityName;
+ this.mappedByTableName = logicalTableName;
+ this.mappedByPropertyName = mappedByProperty;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ExtendedMappings.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/ExtendedMappings.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ExtendedMappings.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,266 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import javax.persistence.Embeddable;
-import javax.persistence.Entity;
-import javax.persistence.MappedSuperclass;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.MappingException;
-import org.hibernate.engine.NamedQueryDefinition;
-import org.hibernate.engine.NamedSQLQueryDefinition;
-import org.hibernate.engine.ResultSetMappingDefinition;
-import org.hibernate.mapping.IdGenerator;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Table;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-
-/**
- * Allow annotation related mappings
- * <p/>
- * at least for named generators
- *
- * @author Emmanuel Bernard
- */
-public class ExtendedMappings extends Mappings {
-
- private static final Log log = LogFactory.getLog( ExtendedMappings.class );
-
- private final Map<String, IdGenerator> namedGenerators;
- private final Map<String, Map<String, Join>> joins;
- private final Map<String, AnnotatedClassType> classTypes;
- private final Map<String, Properties> generatorTables;
- private final Map<Table, List<String[]>> tableUniqueConstraints;
- private final Map<String, String> mappedByResolver;
- private final Map<String, String> propertyRefResolver;
- private final ReflectionManager reflectionManager;
- private final Set<String> defaultNamedQueryNames;
- private final Set<String> defaultNamedNativeQueryNames;
- private final Set<String> defaultSqlResulSetMappingNames;
- private final Set<String> defaultNamedGenerators;
-
- ExtendedMappings(
- Map classes, Map collections, Map tables, Map queries, Map sqlqueries, Map sqlResultSetMappings,
- Set<String> defaultNamedQueryNames, Set<String> defaultNamedNativeQueryNames,
- Set<String> defaultSqlResulSetMappingNames, Set<String> defaultNamedGenerators, Map imports,
- List secondPasses, List propertyReferences, NamingStrategy namingStrategy, Map typeDefs,
- Map filterDefinitions, Map namedGenerators, Map<String, Map<String, Join>> joins, Map<String,
- AnnotatedClassType> classTypes, Map extendsQueue, Map<String, TableDescription> tableNameBinding,
- Map<Table, ColumnNames> columnNameBindingPerTable,
- final List auxiliaryDatabaseObjects,
- Map<String, Properties> generatorTables,
- Map<Table, List<String[]>> tableUniqueConstraints,
- Map<String, String> mappedByResolver,
- Map<String, String> propertyRefResolver,
- ReflectionManager reflectionManager
- ) {
- super(
- classes,
- collections,
- tables,
- queries,
- sqlqueries,
- sqlResultSetMappings,
- imports,
- secondPasses,
- propertyReferences,
- namingStrategy,
- typeDefs,
- filterDefinitions,
- extendsQueue,
- auxiliaryDatabaseObjects,
- tableNameBinding,
- columnNameBindingPerTable
- );
- this.namedGenerators = namedGenerators;
- this.joins = joins;
- this.classTypes = classTypes;
- this.generatorTables = generatorTables;
- this.tableUniqueConstraints = tableUniqueConstraints;
- this.mappedByResolver = mappedByResolver;
- this.propertyRefResolver = propertyRefResolver;
- this.reflectionManager = reflectionManager;
- this.defaultNamedQueryNames = defaultNamedQueryNames;
- this.defaultNamedNativeQueryNames = defaultNamedNativeQueryNames;
- this.defaultSqlResulSetMappingNames = defaultSqlResulSetMappingNames;
- this.defaultNamedGenerators = defaultNamedGenerators;
- }
-
- public void addGenerator(IdGenerator generator) throws MappingException {
- if ( ! defaultNamedGenerators.contains( generator.getName() ) ) {
- Object old = namedGenerators.put( generator.getName(), generator );
- if ( old != null ) log.warn( "duplicate generator name: " + generator.getName() );
- }
- }
-
- public void addJoins(PersistentClass persistentClass, Map<String, Join> joins) throws MappingException {
- Object old = this.joins.put( persistentClass.getEntityName(), joins );
- if ( old != null ) log.warn( "duplicate joins for class: " + persistentClass.getEntityName() );
- }
-
- public AnnotatedClassType addClassType(XClass clazz) {
- AnnotatedClassType type;
- if ( clazz.isAnnotationPresent( Entity.class ) ) {
- type = AnnotatedClassType.ENTITY;
- }
- else if ( clazz.isAnnotationPresent( Embeddable.class ) ) {
- type = AnnotatedClassType.EMBEDDABLE;
- }
- else if ( clazz.isAnnotationPresent( MappedSuperclass.class ) ) {
- type = AnnotatedClassType.EMBEDDABLE_SUPERCLASS;
- }
- else {
- type = AnnotatedClassType.NONE;
- }
- classTypes.put( clazz.getName(), type );
- return type;
- }
-
- /**
- * get and maintain a cache of class type.
- * A class can be an entity, a embedded objet or nothing.
- */
- public AnnotatedClassType getClassType(XClass clazz) {
- AnnotatedClassType type = classTypes.get( clazz.getName() );
- if ( type == null ) {
- return addClassType( clazz );
- }
- else {
- return type;
- }
- }
-
- public IdGenerator getGenerator(String name) {
- return getGenerator( name, null );
- }
-
- public Map<String, Join> getJoins(String persistentClass) {
- return joins.get( persistentClass );
- }
-
- /**
- * Try to find the generator from the localGenerators
- * and then from the global generator list
- *
- * @param name generator name
- * @param localGenerators local generators to find to
- * @return the appropriate idgenerator or null if not found
- */
- public IdGenerator getGenerator(String name, Map<String, IdGenerator> localGenerators) {
- if ( localGenerators != null ) {
- IdGenerator result = localGenerators.get( name );
- if ( result != null ) return result;
- }
- return namedGenerators.get( name );
- }
-
- public void addGeneratorTable(String name, Properties params) {
- Object old = generatorTables.put( name, params );
- if ( old != null ) log.warn( "duplicate generator table: " + name );
- }
-
- public Properties getGeneratorTableProperties(String name, Map<String, Properties> localGeneratorTables) {
- if ( localGeneratorTables != null ) {
- Properties result = localGeneratorTables.get( name );
- if ( result != null ) return result;
- }
- return generatorTables.get( name );
- }
-
- public void addUniqueConstraints(Table table, List uniqueConstraints) {
- List oldConstraints = tableUniqueConstraints.get( table );
- if ( oldConstraints == null ) {
- oldConstraints = new ArrayList();
- tableUniqueConstraints.put( table, oldConstraints );
- }
- oldConstraints.addAll( uniqueConstraints );
- }
-
- public Map<Table, List<String[]>> getTableUniqueConstraints() {
- return tableUniqueConstraints;
- }
-
- public void addMappedBy(String entityName, String propertyName, String inversePropertyName) {
- mappedByResolver.put( entityName + "." + propertyName, inversePropertyName );
- }
-
- public String getFromMappedBy(String entityName, String propertyName) {
- return mappedByResolver.get( entityName + "." + propertyName );
- }
-
- public void addPropertyReferencedAssociation(String entityName, String propertyName, String propertyRef) {
- propertyRefResolver.put( entityName + "." + propertyName, propertyRef );
- }
-
- public String getPropertyReferencedAssociation(String entityName, String propertyName) {
- return propertyRefResolver.get( entityName + "." + propertyName );
- }
-
- @Override
- public void addUniquePropertyReference(String referencedClass, String propertyName) {
- super.addUniquePropertyReference( referencedClass, propertyName );
- }
-
- @Override
- public void addPropertyReference(String referencedClass, String propertyName) {
- super.addPropertyReference( referencedClass, propertyName );
- }
-
- public ReflectionManager getReflectionManager() {
- return reflectionManager;
- }
-
- public void addDefaultQuery(String name, NamedQueryDefinition query) {
- super.addQuery(name, query);
- defaultNamedQueryNames.add( name );
- }
-
- public void addDefaultSQLQuery(String name, NamedSQLQueryDefinition query) {
- super.addSQLQuery(name, query);
- defaultNamedNativeQueryNames.add( name );
- }
-
- public void addDefaultGenerator(IdGenerator idGen) {
- this.addGenerator(idGen);
- defaultNamedGenerators.add( idGen.getName() );
-
- }
-
- public void addDefaultResultSetMapping(ResultSetMappingDefinition definition) {
- final String name = definition.getName();
- if ( ! defaultSqlResulSetMappingNames.contains( name )
- && super.getResultSetMapping( name ) != null ) {
- resultSetMappings.remove( name );
- }
- super.addResultSetMapping(definition);
- defaultSqlResulSetMappingNames.add( name );
- }
-
- @Override
- public void addQuery(String name, NamedQueryDefinition query) throws MappingException {
- if ( ! defaultNamedQueryNames.contains( name ) ) super.addQuery( name, query );
- }
-
- @Override
- public void addResultSetMapping(ResultSetMappingDefinition definition) {
- if ( ! defaultSqlResulSetMappingNames.contains( definition.getName() ) )
- super.addResultSetMapping( definition );
- }
-
- @Override
- public void addSQLQuery(String name, NamedSQLQueryDefinition query) throws MappingException {
- if ( ! defaultNamedNativeQueryNames.contains( name ) ) super.addSQLQuery( name, query );
- }
-
- public Map getClasses() {
- return classes;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ExtendedMappings.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/ExtendedMappings.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ExtendedMappings.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/ExtendedMappings.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,266 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import javax.persistence.Embeddable;
+import javax.persistence.Entity;
+import javax.persistence.MappedSuperclass;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.MappingException;
+import org.hibernate.engine.NamedQueryDefinition;
+import org.hibernate.engine.NamedSQLQueryDefinition;
+import org.hibernate.engine.ResultSetMappingDefinition;
+import org.hibernate.mapping.IdGenerator;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Table;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+
+/**
+ * Allow annotation related mappings
+ * <p/>
+ * at least for named generators
+ *
+ * @author Emmanuel Bernard
+ */
+public class ExtendedMappings extends Mappings {
+
+ private static final Log log = LogFactory.getLog( ExtendedMappings.class );
+
+ private final Map<String, IdGenerator> namedGenerators;
+ private final Map<String, Map<String, Join>> joins;
+ private final Map<String, AnnotatedClassType> classTypes;
+ private final Map<String, Properties> generatorTables;
+ private final Map<Table, List<String[]>> tableUniqueConstraints;
+ private final Map<String, String> mappedByResolver;
+ private final Map<String, String> propertyRefResolver;
+ private final ReflectionManager reflectionManager;
+ private final Set<String> defaultNamedQueryNames;
+ private final Set<String> defaultNamedNativeQueryNames;
+ private final Set<String> defaultSqlResulSetMappingNames;
+ private final Set<String> defaultNamedGenerators;
+
+ ExtendedMappings(
+ Map classes, Map collections, Map tables, Map queries, Map sqlqueries, Map sqlResultSetMappings,
+ Set<String> defaultNamedQueryNames, Set<String> defaultNamedNativeQueryNames,
+ Set<String> defaultSqlResulSetMappingNames, Set<String> defaultNamedGenerators, Map imports,
+ List secondPasses, List propertyReferences, NamingStrategy namingStrategy, Map typeDefs,
+ Map filterDefinitions, Map namedGenerators, Map<String, Map<String, Join>> joins, Map<String,
+ AnnotatedClassType> classTypes, Map extendsQueue, Map<String, TableDescription> tableNameBinding,
+ Map<Table, ColumnNames> columnNameBindingPerTable,
+ final List auxiliaryDatabaseObjects,
+ Map<String, Properties> generatorTables,
+ Map<Table, List<String[]>> tableUniqueConstraints,
+ Map<String, String> mappedByResolver,
+ Map<String, String> propertyRefResolver,
+ ReflectionManager reflectionManager
+ ) {
+ super(
+ classes,
+ collections,
+ tables,
+ queries,
+ sqlqueries,
+ sqlResultSetMappings,
+ imports,
+ secondPasses,
+ propertyReferences,
+ namingStrategy,
+ typeDefs,
+ filterDefinitions,
+ extendsQueue,
+ auxiliaryDatabaseObjects,
+ tableNameBinding,
+ columnNameBindingPerTable
+ );
+ this.namedGenerators = namedGenerators;
+ this.joins = joins;
+ this.classTypes = classTypes;
+ this.generatorTables = generatorTables;
+ this.tableUniqueConstraints = tableUniqueConstraints;
+ this.mappedByResolver = mappedByResolver;
+ this.propertyRefResolver = propertyRefResolver;
+ this.reflectionManager = reflectionManager;
+ this.defaultNamedQueryNames = defaultNamedQueryNames;
+ this.defaultNamedNativeQueryNames = defaultNamedNativeQueryNames;
+ this.defaultSqlResulSetMappingNames = defaultSqlResulSetMappingNames;
+ this.defaultNamedGenerators = defaultNamedGenerators;
+ }
+
+ public void addGenerator(IdGenerator generator) throws MappingException {
+ if ( ! defaultNamedGenerators.contains( generator.getName() ) ) {
+ Object old = namedGenerators.put( generator.getName(), generator );
+ if ( old != null ) log.warn( "duplicate generator name: " + generator.getName() );
+ }
+ }
+
+ public void addJoins(PersistentClass persistentClass, Map<String, Join> joins) throws MappingException {
+ Object old = this.joins.put( persistentClass.getEntityName(), joins );
+ if ( old != null ) log.warn( "duplicate joins for class: " + persistentClass.getEntityName() );
+ }
+
+ public AnnotatedClassType addClassType(XClass clazz) {
+ AnnotatedClassType type;
+ if ( clazz.isAnnotationPresent( Entity.class ) ) {
+ type = AnnotatedClassType.ENTITY;
+ }
+ else if ( clazz.isAnnotationPresent( Embeddable.class ) ) {
+ type = AnnotatedClassType.EMBEDDABLE;
+ }
+ else if ( clazz.isAnnotationPresent( MappedSuperclass.class ) ) {
+ type = AnnotatedClassType.EMBEDDABLE_SUPERCLASS;
+ }
+ else {
+ type = AnnotatedClassType.NONE;
+ }
+ classTypes.put( clazz.getName(), type );
+ return type;
+ }
+
+ /**
+ * get and maintain a cache of class type.
+ * A class can be an entity, a embedded objet or nothing.
+ */
+ public AnnotatedClassType getClassType(XClass clazz) {
+ AnnotatedClassType type = classTypes.get( clazz.getName() );
+ if ( type == null ) {
+ return addClassType( clazz );
+ }
+ else {
+ return type;
+ }
+ }
+
+ public IdGenerator getGenerator(String name) {
+ return getGenerator( name, null );
+ }
+
+ public Map<String, Join> getJoins(String persistentClass) {
+ return joins.get( persistentClass );
+ }
+
+ /**
+ * Try to find the generator from the localGenerators
+ * and then from the global generator list
+ *
+ * @param name generator name
+ * @param localGenerators local generators to find to
+ * @return the appropriate idgenerator or null if not found
+ */
+ public IdGenerator getGenerator(String name, Map<String, IdGenerator> localGenerators) {
+ if ( localGenerators != null ) {
+ IdGenerator result = localGenerators.get( name );
+ if ( result != null ) return result;
+ }
+ return namedGenerators.get( name );
+ }
+
+ public void addGeneratorTable(String name, Properties params) {
+ Object old = generatorTables.put( name, params );
+ if ( old != null ) log.warn( "duplicate generator table: " + name );
+ }
+
+ public Properties getGeneratorTableProperties(String name, Map<String, Properties> localGeneratorTables) {
+ if ( localGeneratorTables != null ) {
+ Properties result = localGeneratorTables.get( name );
+ if ( result != null ) return result;
+ }
+ return generatorTables.get( name );
+ }
+
+ public void addUniqueConstraints(Table table, List uniqueConstraints) {
+ List oldConstraints = tableUniqueConstraints.get( table );
+ if ( oldConstraints == null ) {
+ oldConstraints = new ArrayList();
+ tableUniqueConstraints.put( table, oldConstraints );
+ }
+ oldConstraints.addAll( uniqueConstraints );
+ }
+
+ public Map<Table, List<String[]>> getTableUniqueConstraints() {
+ return tableUniqueConstraints;
+ }
+
+ public void addMappedBy(String entityName, String propertyName, String inversePropertyName) {
+ mappedByResolver.put( entityName + "." + propertyName, inversePropertyName );
+ }
+
+ public String getFromMappedBy(String entityName, String propertyName) {
+ return mappedByResolver.get( entityName + "." + propertyName );
+ }
+
+ public void addPropertyReferencedAssociation(String entityName, String propertyName, String propertyRef) {
+ propertyRefResolver.put( entityName + "." + propertyName, propertyRef );
+ }
+
+ public String getPropertyReferencedAssociation(String entityName, String propertyName) {
+ return propertyRefResolver.get( entityName + "." + propertyName );
+ }
+
+ @Override
+ public void addUniquePropertyReference(String referencedClass, String propertyName) {
+ super.addUniquePropertyReference( referencedClass, propertyName );
+ }
+
+ @Override
+ public void addPropertyReference(String referencedClass, String propertyName) {
+ super.addPropertyReference( referencedClass, propertyName );
+ }
+
+ public ReflectionManager getReflectionManager() {
+ return reflectionManager;
+ }
+
+ public void addDefaultQuery(String name, NamedQueryDefinition query) {
+ super.addQuery(name, query);
+ defaultNamedQueryNames.add( name );
+ }
+
+ public void addDefaultSQLQuery(String name, NamedSQLQueryDefinition query) {
+ super.addSQLQuery(name, query);
+ defaultNamedNativeQueryNames.add( name );
+ }
+
+ public void addDefaultGenerator(IdGenerator idGen) {
+ this.addGenerator(idGen);
+ defaultNamedGenerators.add( idGen.getName() );
+
+ }
+
+ public void addDefaultResultSetMapping(ResultSetMappingDefinition definition) {
+ final String name = definition.getName();
+ if ( ! defaultSqlResulSetMappingNames.contains( name )
+ && super.getResultSetMapping( name ) != null ) {
+ resultSetMappings.remove( name );
+ }
+ super.addResultSetMapping(definition);
+ defaultSqlResulSetMappingNames.add( name );
+ }
+
+ @Override
+ public void addQuery(String name, NamedQueryDefinition query) throws MappingException {
+ if ( ! defaultNamedQueryNames.contains( name ) ) super.addQuery( name, query );
+ }
+
+ @Override
+ public void addResultSetMapping(ResultSetMappingDefinition definition) {
+ if ( ! defaultSqlResulSetMappingNames.contains( definition.getName() ) )
+ super.addResultSetMapping( definition );
+ }
+
+ @Override
+ public void addSQLQuery(String name, NamedSQLQueryDefinition query) throws MappingException {
+ if ( ! defaultNamedNativeQueryNames.contains( name ) ) super.addSQLQuery( name, query );
+ }
+
+ public Map getClasses() {
+ return classes;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/FkSecondPass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/FkSecondPass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/FkSecondPass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,77 +0,0 @@
-// $Id$
-package org.hibernate.cfg;
-
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.MappingException;
-import org.hibernate.util.StringHelper;
-import org.hibernate.cfg.annotations.TableBinder;
-import org.hibernate.mapping.ManyToOne;
-import org.hibernate.mapping.OneToOne;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.ToOne;
-import org.hibernate.mapping.Property;
-
-/**
- * Enable a proper set of the FK columns in respect with the id column order
- * Allow the correct implementation of the default EJB3 values which needs both
- * sides of the association to be resolved
- *
- * @author Emmanuel Bernard
- */
-public class FkSecondPass implements SecondPass {
- private ToOne value;
- private Ejb3JoinColumn[] columns;
- private boolean unique;
- private ExtendedMappings mappings;
- private String path;
- private String entityClassName;
-
- FkSecondPass(
- ToOne value, Ejb3JoinColumn[] columns, boolean unique, String entityClassName, String path, ExtendedMappings mappings
- ) {
- this.mappings = mappings;
- this.value = value;
- this.columns = columns;
- this.unique = unique;
- this.entityClassName = entityClassName;
- this.path = entityClassName != null ? path.substring( entityClassName.length() + 1 ) : path;
- }
-
- public ToOne getValue() {
- return value;
- }
-
- public boolean isInPrimaryKey() {
- if (entityClassName == null) return false;
- Property property = mappings.getClass( entityClassName ).getIdentifierProperty();
- return property != null && path != null && path.startsWith( property.getName() );
- }
-
- public void doSecondPass(java.util.Map persistentClasses) throws MappingException {
- if ( value instanceof ManyToOne ) {
- ManyToOne manyToOne = (ManyToOne) value;
- PersistentClass ref = (PersistentClass) persistentClasses.get( manyToOne.getReferencedEntityName() );
- if ( ref == null ) {
- throw new AnnotationException(
- "@OneToOne or @ManyToOne on "
- + StringHelper.qualify(entityClassName, path)
- + " references an unknown entity: "
- + manyToOne.getReferencedEntityName()
- );
- }
- BinderHelper.createSyntheticPropertyReference( columns, ref, null, manyToOne, false, mappings );
- TableBinder.bindFk( ref, null, columns, manyToOne, unique, mappings );
- /*
- * HbmBinder does this only when property-ref != null, but IMO, it makes sense event if it is null
- */
- if ( ! manyToOne.isIgnoreNotFound() ) manyToOne.createPropertyRefConstraints( persistentClasses );
- }
- else if ( value instanceof OneToOne ) {
- ( (OneToOne) value ).createForeignKey();
- }
- else {
- throw new AssertionFailure( "FkSecondPass for a wrong value type: " + value.getClass().getName() );
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/FkSecondPass.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/FkSecondPass.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/FkSecondPass.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/FkSecondPass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,77 @@
+// $Id$
+package org.hibernate.cfg;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.MappingException;
+import org.hibernate.util.StringHelper;
+import org.hibernate.cfg.annotations.TableBinder;
+import org.hibernate.mapping.ManyToOne;
+import org.hibernate.mapping.OneToOne;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.ToOne;
+import org.hibernate.mapping.Property;
+
+/**
+ * Enable a proper set of the FK columns in respect with the id column order
+ * Allow the correct implementation of the default EJB3 values which needs both
+ * sides of the association to be resolved
+ *
+ * @author Emmanuel Bernard
+ */
+public class FkSecondPass implements SecondPass {
+ private ToOne value;
+ private Ejb3JoinColumn[] columns;
+ private boolean unique;
+ private ExtendedMappings mappings;
+ private String path;
+ private String entityClassName;
+
+ FkSecondPass(
+ ToOne value, Ejb3JoinColumn[] columns, boolean unique, String entityClassName, String path, ExtendedMappings mappings
+ ) {
+ this.mappings = mappings;
+ this.value = value;
+ this.columns = columns;
+ this.unique = unique;
+ this.entityClassName = entityClassName;
+ this.path = entityClassName != null ? path.substring( entityClassName.length() + 1 ) : path;
+ }
+
+ public ToOne getValue() {
+ return value;
+ }
+
+ public boolean isInPrimaryKey() {
+ if (entityClassName == null) return false;
+ Property property = mappings.getClass( entityClassName ).getIdentifierProperty();
+ return property != null && path != null && path.startsWith( property.getName() );
+ }
+
+ public void doSecondPass(java.util.Map persistentClasses) throws MappingException {
+ if ( value instanceof ManyToOne ) {
+ ManyToOne manyToOne = (ManyToOne) value;
+ PersistentClass ref = (PersistentClass) persistentClasses.get( manyToOne.getReferencedEntityName() );
+ if ( ref == null ) {
+ throw new AnnotationException(
+ "@OneToOne or @ManyToOne on "
+ + StringHelper.qualify(entityClassName, path)
+ + " references an unknown entity: "
+ + manyToOne.getReferencedEntityName()
+ );
+ }
+ BinderHelper.createSyntheticPropertyReference( columns, ref, null, manyToOne, false, mappings );
+ TableBinder.bindFk( ref, null, columns, manyToOne, unique, mappings );
+ /*
+ * HbmBinder does this only when property-ref != null, but IMO, it makes sense event if it is null
+ */
+ if ( ! manyToOne.isIgnoreNotFound() ) manyToOne.createPropertyRefConstraints( persistentClasses );
+ }
+ else if ( value instanceof OneToOne ) {
+ ( (OneToOne) value ).createForeignKey();
+ }
+ else {
+ throw new AssertionFailure( "FkSecondPass for a wrong value type: " + value.getClass().getName() );
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexColumn.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexColumn.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,87 +0,0 @@
-package org.hibernate.cfg;
-
-import java.util.Map;
-
-import org.hibernate.mapping.Join;
-
-/**
- * index column
- *
- * @author inger
- */
-public class IndexColumn
- extends Ejb3Column {
-
- private int base;
-
- //FIXME move to a getter setter strategy for readeability
- public IndexColumn(
- boolean isImplicit,
- String sqlType,
- int length,
- int precision,
- int scale,
- String name,
- boolean nullable,
- boolean unique,
- boolean insertable,
- boolean updatable,
- String secondaryTableName,
- Map<String, Join> joins,
- PropertyHolder propertyHolder,
- ExtendedMappings mappings
- ) {
- super();
- setImplicit( isImplicit );
- setSqlType( sqlType );
- setLength( length );
- setPrecision( precision );
- setScale( scale );
- setLogicalColumnName( name );
- setNullable( nullable );
- setUnique( unique );
- setInsertable( insertable );
- setUpdatable( updatable );
- setSecondaryTableName( secondaryTableName );
- setPropertyHolder( propertyHolder );
- setJoins( joins );
- setMappings( mappings );
- bind();
- //super(isImplicit, sqlType, length, precision, scale, name, nullable, unique, insertable, updatable, secondaryTableName, joins, propertyHolder, mappings);
-
- }
-
- public int getBase() {
- return base;
- }
-
- public void setBase(int base) {
- this.base = base;
- }
-
- public static IndexColumn buildColumnFromAnnotation(
- org.hibernate.annotations.IndexColumn ann,
- PropertyHolder propertyHolder,
- PropertyData inferredData,
- ExtendedMappings mappings
- ) {
- IndexColumn column;
- if ( ann != null ) {
- String sqlType = BinderHelper.isDefault( ann.columnDefinition() ) ? null : ann.columnDefinition();
- String name = BinderHelper.isDefault( ann.name() ) ? inferredData.getPropertyName() : ann.name();
- //TODO move it to a getter based system and remove the constructor
- column = new IndexColumn(
- false, sqlType, 0, 0, 0, name, ann.nullable(),
- false, true, true, null, null, propertyHolder, mappings
- );
- column.setBase( ann.base() );
- }
- else {
- column = new IndexColumn(
- true, null, 0, 0, 0, null, true,
- false, true, true, null, null, propertyHolder, mappings
- );
- }
- return column;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexColumn.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexColumn.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexColumn.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,87 @@
+package org.hibernate.cfg;
+
+import java.util.Map;
+
+import org.hibernate.mapping.Join;
+
+/**
+ * index column
+ *
+ * @author inger
+ */
+public class IndexColumn
+ extends Ejb3Column {
+
+ private int base;
+
+ //FIXME move to a getter setter strategy for readeability
+ public IndexColumn(
+ boolean isImplicit,
+ String sqlType,
+ int length,
+ int precision,
+ int scale,
+ String name,
+ boolean nullable,
+ boolean unique,
+ boolean insertable,
+ boolean updatable,
+ String secondaryTableName,
+ Map<String, Join> joins,
+ PropertyHolder propertyHolder,
+ ExtendedMappings mappings
+ ) {
+ super();
+ setImplicit( isImplicit );
+ setSqlType( sqlType );
+ setLength( length );
+ setPrecision( precision );
+ setScale( scale );
+ setLogicalColumnName( name );
+ setNullable( nullable );
+ setUnique( unique );
+ setInsertable( insertable );
+ setUpdatable( updatable );
+ setSecondaryTableName( secondaryTableName );
+ setPropertyHolder( propertyHolder );
+ setJoins( joins );
+ setMappings( mappings );
+ bind();
+ //super(isImplicit, sqlType, length, precision, scale, name, nullable, unique, insertable, updatable, secondaryTableName, joins, propertyHolder, mappings);
+
+ }
+
+ public int getBase() {
+ return base;
+ }
+
+ public void setBase(int base) {
+ this.base = base;
+ }
+
+ public static IndexColumn buildColumnFromAnnotation(
+ org.hibernate.annotations.IndexColumn ann,
+ PropertyHolder propertyHolder,
+ PropertyData inferredData,
+ ExtendedMappings mappings
+ ) {
+ IndexColumn column;
+ if ( ann != null ) {
+ String sqlType = BinderHelper.isDefault( ann.columnDefinition() ) ? null : ann.columnDefinition();
+ String name = BinderHelper.isDefault( ann.name() ) ? inferredData.getPropertyName() : ann.name();
+ //TODO move it to a getter based system and remove the constructor
+ column = new IndexColumn(
+ false, sqlType, 0, 0, 0, name, ann.nullable(),
+ false, true, true, null, null, propertyHolder, mappings
+ );
+ column.setBase( ann.base() );
+ }
+ else {
+ column = new IndexColumn(
+ true, null, 0, 0, 0, null, true,
+ false, true, true, null, null, propertyHolder, mappings
+ );
+ }
+ return column;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexSecondPass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexSecondPass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexSecondPass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,61 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.Map;
-
-import org.hibernate.AnnotationException;
-import org.hibernate.MappingException;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Table;
-
-/**
- * @author Emmanuel Bernard
- */
-public class IndexSecondPass implements SecondPass {
- private Table table;
- private final String indexName;
- private final String[] columns;
- private final ExtendedMappings mappings;
- private final Ejb3Column column;
-
- public IndexSecondPass(Table table, String indexName, String[] columns, ExtendedMappings mappings) {
- this.table = table;
- this.indexName = indexName;
- this.columns = columns;
- this.mappings = mappings;
- this.column = null;
- }
-
- public IndexSecondPass(String indexName, Ejb3Column column, ExtendedMappings mappings) {
- this.indexName = indexName;
- this.column = column;
- this.columns = null;
- this.mappings = mappings;
- }
-
- public void doSecondPass(Map persistentClasses) throws MappingException {
- if ( columns != null ) {
- for ( String columnName : columns ) {
- addIndexToColumn( columnName );
- }
- }
- if ( column != null ) {
- this.table = column.getTable();
- addIndexToColumn( mappings.getLogicalColumnName( column.getName(), table ) );
- }
- }
-
- private void addIndexToColumn(String columnName) {
- Column column = table.getColumn(
- new Column(
- mappings.getPhysicalColumnName( columnName, table )
- )
- );
- if ( column == null ) {
- throw new AnnotationException(
- "@Index references a unknown column: " + columnName
- );
- }
- table.getOrCreateIndex( indexName ).addColumn( column );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexSecondPass.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexSecondPass.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexSecondPass.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/IndexSecondPass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,61 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.Map;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.MappingException;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IndexSecondPass implements SecondPass {
+ private Table table;
+ private final String indexName;
+ private final String[] columns;
+ private final ExtendedMappings mappings;
+ private final Ejb3Column column;
+
+ public IndexSecondPass(Table table, String indexName, String[] columns, ExtendedMappings mappings) {
+ this.table = table;
+ this.indexName = indexName;
+ this.columns = columns;
+ this.mappings = mappings;
+ this.column = null;
+ }
+
+ public IndexSecondPass(String indexName, Ejb3Column column, ExtendedMappings mappings) {
+ this.indexName = indexName;
+ this.column = column;
+ this.columns = null;
+ this.mappings = mappings;
+ }
+
+ public void doSecondPass(Map persistentClasses) throws MappingException {
+ if ( columns != null ) {
+ for ( String columnName : columns ) {
+ addIndexToColumn( columnName );
+ }
+ }
+ if ( column != null ) {
+ this.table = column.getTable();
+ addIndexToColumn( mappings.getLogicalColumnName( column.getName(), table ) );
+ }
+ }
+
+ private void addIndexToColumn(String columnName) {
+ Column column = table.getColumn(
+ new Column(
+ mappings.getPhysicalColumnName( columnName, table )
+ )
+ );
+ if ( column == null ) {
+ throw new AnnotationException(
+ "@Index references a unknown column: " + columnName
+ );
+ }
+ table.getOrCreateIndex( indexName ).addColumn( column );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/InheritanceState.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/InheritanceState.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/InheritanceState.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,90 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.Map;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.MappedSuperclass;
-
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XAnnotatedElement;
-import org.hibernate.annotations.common.reflection.XClass;
-
-/**
- * Some extra data to the inheritance position of a class
- *
- * @author Emmanuel Bernard
- */
-public class InheritanceState {
- public InheritanceState(XClass clazz) {
- this.clazz = clazz;
- extractInheritanceType();
- }
-
- public XClass clazz;
- /**
- * has son either mappedsuperclass son or entity son
- */
- public boolean hasSons = false;
- /**
- * a mother entity is available
- */
- public boolean hasParents = false;
- public InheritanceType type;
- public boolean isEmbeddableSuperclass = false;
-
- /**
- * only defined on embedded superclasses
- */
- public String accessType = null;
- public Boolean isPropertyAnnotated;
-
- private void extractInheritanceType() {
- XAnnotatedElement element = clazz;
- Inheritance inhAnn = element.getAnnotation( Inheritance.class );
- MappedSuperclass mappedSuperClass = element.getAnnotation( MappedSuperclass.class );
- if ( mappedSuperClass != null ) {
- isEmbeddableSuperclass = true;
- type = inhAnn == null ? null : inhAnn.strategy();
- }
- else {
- type = inhAnn == null ? InheritanceType.SINGLE_TABLE : inhAnn.strategy();
- }
- }
-
- boolean hasTable() {
- return !hasParents || !InheritanceType.SINGLE_TABLE.equals( type );
- }
-
- boolean hasDenormalizedTable() {
- return hasParents && InheritanceType.TABLE_PER_CLASS.equals( type );
- }
-
- public static InheritanceState getSuperEntityInheritanceState(
- XClass clazz, Map<XClass, InheritanceState> states,
- ReflectionManager reflectionManager
- ) {
- XClass superclass = clazz;
- do {
- superclass = superclass.getSuperclass();
- InheritanceState currentState = states.get( superclass );
- if ( currentState != null && ! currentState.isEmbeddableSuperclass ) return currentState;
- }
- while ( superclass != null && ! reflectionManager.equals( superclass, Object.class ) );
- return null;
- }
-
- public static InheritanceState getSuperclassInheritanceState(
- XClass clazz, Map<XClass, InheritanceState> states,
- ReflectionManager reflectionManager
- ) {
- XClass superclass = clazz;
- do {
- superclass = superclass.getSuperclass();
- InheritanceState currentState = states.get( superclass );
- if ( currentState != null ) return currentState;
- }
- while ( superclass != null && ! reflectionManager.equals( superclass, Object.class ) );
- return null;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/InheritanceState.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/InheritanceState.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/InheritanceState.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/InheritanceState.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,90 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.Map;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.MappedSuperclass;
+
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XAnnotatedElement;
+import org.hibernate.annotations.common.reflection.XClass;
+
+/**
+ * Some extra data to the inheritance position of a class
+ *
+ * @author Emmanuel Bernard
+ */
+public class InheritanceState {
+ public InheritanceState(XClass clazz) {
+ this.clazz = clazz;
+ extractInheritanceType();
+ }
+
+ public XClass clazz;
+ /**
+ * has son either mappedsuperclass son or entity son
+ */
+ public boolean hasSons = false;
+ /**
+ * a mother entity is available
+ */
+ public boolean hasParents = false;
+ public InheritanceType type;
+ public boolean isEmbeddableSuperclass = false;
+
+ /**
+ * only defined on embedded superclasses
+ */
+ public String accessType = null;
+ public Boolean isPropertyAnnotated;
+
+ private void extractInheritanceType() {
+ XAnnotatedElement element = clazz;
+ Inheritance inhAnn = element.getAnnotation( Inheritance.class );
+ MappedSuperclass mappedSuperClass = element.getAnnotation( MappedSuperclass.class );
+ if ( mappedSuperClass != null ) {
+ isEmbeddableSuperclass = true;
+ type = inhAnn == null ? null : inhAnn.strategy();
+ }
+ else {
+ type = inhAnn == null ? InheritanceType.SINGLE_TABLE : inhAnn.strategy();
+ }
+ }
+
+ boolean hasTable() {
+ return !hasParents || !InheritanceType.SINGLE_TABLE.equals( type );
+ }
+
+ boolean hasDenormalizedTable() {
+ return hasParents && InheritanceType.TABLE_PER_CLASS.equals( type );
+ }
+
+ public static InheritanceState getSuperEntityInheritanceState(
+ XClass clazz, Map<XClass, InheritanceState> states,
+ ReflectionManager reflectionManager
+ ) {
+ XClass superclass = clazz;
+ do {
+ superclass = superclass.getSuperclass();
+ InheritanceState currentState = states.get( superclass );
+ if ( currentState != null && ! currentState.isEmbeddableSuperclass ) return currentState;
+ }
+ while ( superclass != null && ! reflectionManager.equals( superclass, Object.class ) );
+ return null;
+ }
+
+ public static InheritanceState getSuperclassInheritanceState(
+ XClass clazz, Map<XClass, InheritanceState> states,
+ ReflectionManager reflectionManager
+ ) {
+ XClass superclass = clazz;
+ do {
+ superclass = superclass.getSuperclass();
+ InheritanceState currentState = states.get( superclass );
+ if ( currentState != null ) return currentState;
+ }
+ while ( superclass != null && ! reflectionManager.equals( superclass, Object.class ) );
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/NotYetImplementedException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/NotYetImplementedException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/NotYetImplementedException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import org.hibernate.MappingException;
-
-/**
- * Mapping not yet implemented
- *
- * @author Emmanuel Bernard
- */
-public class NotYetImplementedException extends MappingException {
-
- public NotYetImplementedException(String msg, Throwable root) {
- super( msg, root );
- }
-
- public NotYetImplementedException(Throwable root) {
- super( root );
- }
-
- public NotYetImplementedException(String s) {
- super( s );
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/NotYetImplementedException.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/NotYetImplementedException.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/NotYetImplementedException.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/NotYetImplementedException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id$
+package org.hibernate.cfg;
+
+import org.hibernate.MappingException;
+
+/**
+ * Mapping not yet implemented
+ *
+ * @author Emmanuel Bernard
+ */
+public class NotYetImplementedException extends MappingException {
+
+ public NotYetImplementedException(String msg, Throwable root) {
+ super( msg, root );
+ }
+
+ public NotYetImplementedException(Throwable root) {
+ super( root );
+ }
+
+ public NotYetImplementedException(String s) {
+ super( s );
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/OneToOneSecondPass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/OneToOneSecondPass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/OneToOneSecondPass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,249 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.Iterator;
-import java.util.Map;
-
-import org.hibernate.AnnotationException;
-import org.hibernate.MappingException;
-import org.hibernate.annotations.ForeignKey;
-import org.hibernate.cfg.annotations.PropertyBinder;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.DependantValue;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.ManyToOne;
-import org.hibernate.mapping.OneToOne;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.type.ForeignKeyDirection;
-import org.hibernate.util.StringHelper;
-
-/**
- * We have to handle OneToOne in a second pass because:
- * -
- */
-public class OneToOneSecondPass implements SecondPass {
- private String mappedBy;
- private ExtendedMappings mappings;
- private String ownerEntity;
- private String ownerProperty;
- private PropertyHolder propertyHolder;
- private boolean ignoreNotFound;
- private PropertyData inferredData;
- private XClass targetEntity;
- private boolean cascadeOnDelete;
- private boolean optional;
- private String cascadeStrategy;
- private Ejb3JoinColumn[] joinColumns;
-
- //that suck, we should read that from the property mainly
- public OneToOneSecondPass(
- String mappedBy, String ownerEntity, String ownerProperty,
- PropertyHolder propertyHolder, PropertyData inferredData, XClass targetEntity, boolean ignoreNotFound,
- boolean cascadeOnDelete, boolean optional, String cascadeStrategy, Ejb3JoinColumn[] columns,
- ExtendedMappings mappings
- ) {
- this.ownerEntity = ownerEntity;
- this.ownerProperty = ownerProperty;
- this.mappedBy = mappedBy;
- this.propertyHolder = propertyHolder;
- this.mappings = mappings;
- this.ignoreNotFound = ignoreNotFound;
- this.inferredData = inferredData;
- this.targetEntity = targetEntity;
- this.cascadeOnDelete = cascadeOnDelete;
- this.optional = optional;
- this.cascadeStrategy = cascadeStrategy;
- this.joinColumns = columns;
- }
-
- //TODO refactor this code, there is a lot of duplication in this method
- public void doSecondPass(Map persistentClasses) throws MappingException {
- org.hibernate.mapping.OneToOne value = new org.hibernate.mapping.OneToOne(
- propertyHolder.getTable(), propertyHolder.getPersistentClass()
- );
- final String propertyName = inferredData.getPropertyName();
- value.setPropertyName( propertyName );
- String referencedEntityName;
- if ( AnnotationBinder.isDefault( targetEntity, mappings ) ) {
- referencedEntityName = inferredData.getClassOrElementName();
- }
- else {
- referencedEntityName = targetEntity.getName();
- }
- value.setReferencedEntityName( referencedEntityName );
- AnnotationBinder.defineFetchingStrategy( value, inferredData.getProperty() );
- //value.setFetchMode( fetchMode );
- value.setCascadeDeleteEnabled( cascadeOnDelete );
- //value.setLazy( fetchMode != FetchMode.JOIN );
-
- if ( !optional ) value.setConstrained( true );
- value.setForeignKeyType(
- value.isConstrained() ?
- ForeignKeyDirection.FOREIGN_KEY_FROM_PARENT :
- ForeignKeyDirection.FOREIGN_KEY_TO_PARENT
- );
- PropertyBinder binder = new PropertyBinder();
- binder.setName( propertyName );
- binder.setValue( value );
- binder.setCascade( cascadeStrategy );
- binder.setPropertyAccessorName( inferredData.getDefaultAccess() );
- Property prop = binder.make();
- if ( BinderHelper.isDefault( mappedBy ) ) {
- /*
- * we need to check if the columns are in the right order
- * if not, then we need to create a many to one and formula
- * but actually, since entities linked by a one to one need
- * to share the same composite id class, this cannot happen in hibernate
- */
- boolean rightOrder = true;
-
- if (rightOrder) {
- String path = StringHelper.qualify( propertyHolder.getPath(), propertyName );
- ( new FkSecondPass(
- value, joinColumns,
- !optional, //cannot have nullabe and unique on certain DBs
- propertyHolder.getEntityOwnerClassName(),
- path, mappings
- ) ).doSecondPass( persistentClasses );
- //no column associated since its a one to one
- propertyHolder.addProperty( prop );
- }
- else {
- //this is a many to one with Formula
-
- }
- }
- else {
- PersistentClass otherSide = (PersistentClass) persistentClasses.get( value.getReferencedEntityName() );
- Property otherSideProperty;
- try {
- if ( otherSide == null ) {
- throw new MappingException( "Unable to find entity: " + value.getReferencedEntityName() );
- }
- otherSideProperty = BinderHelper.findPropertyByName( otherSide, mappedBy );
- }
- catch (MappingException e) {
- throw new AnnotationException(
- "Unknown mappedBy in: " + StringHelper.qualify( ownerEntity, ownerProperty )
- + ", referenced property unknown: "
- + StringHelper.qualify( value.getReferencedEntityName(), mappedBy )
- );
- }
- if ( otherSideProperty.getValue() instanceof OneToOne ) {
- propertyHolder.addProperty( prop );
- }
- else if ( otherSideProperty.getValue() instanceof ManyToOne ) {
- Iterator it = otherSide.getJoinIterator();
- Join otherSideJoin = null;
- while ( it.hasNext() ) {
- otherSideJoin = (Join) it.next();
- if ( otherSideJoin.containsProperty( otherSideProperty ) ) {
- break;
- }
- }
- if ( otherSideJoin != null ) {
- //@OneToOne @JoinTable
- Join mappedByJoin = buildJoin(
- (PersistentClass) persistentClasses.get( ownerEntity ), otherSideProperty, otherSideJoin
- );
- ManyToOne manyToOne = new ManyToOne( mappedByJoin.getTable() );
- //FIXME use ignore not found here
- manyToOne.setIgnoreNotFound( ignoreNotFound );
- manyToOne.setCascadeDeleteEnabled( value.isCascadeDeleteEnabled() );
- manyToOne.setEmbedded( value.isEmbedded() );
- manyToOne.setFetchMode( value.getFetchMode() );
- manyToOne.setLazy( value.isLazy() );
- manyToOne.setReferencedEntityName( value.getReferencedEntityName() );
- manyToOne.setUnwrapProxy( value.isUnwrapProxy() );
- prop.setValue( manyToOne );
- Iterator otherSideJoinKeyColumns = otherSideJoin.getKey().getColumnIterator();
- while ( otherSideJoinKeyColumns.hasNext() ) {
- Column column = (Column) otherSideJoinKeyColumns.next();
- Column copy = new Column();
- copy.setLength( column.getLength() );
- copy.setScale( column.getScale() );
- copy.setValue( manyToOne );
- copy.setName( column.getQuotedName() );
- copy.setNullable( column.isNullable() );
- copy.setPrecision( column.getPrecision() );
- copy.setUnique( column.isUnique() );
- copy.setSqlType( column.getSqlType() );
- copy.setCheckConstraint( column.getCheckConstraint() );
- copy.setComment( column.getComment() );
- copy.setDefaultValue( column.getDefaultValue() );
- manyToOne.addColumn( copy );
- }
- mappedByJoin.addProperty( prop );
- }
- else {
- propertyHolder.addProperty( prop );
- }
-
- value.setReferencedPropertyName( mappedBy );
-
- String propertyRef = value.getReferencedPropertyName();
- if ( propertyRef != null ) {
- mappings.addUniquePropertyReference(
- value.getReferencedEntityName(),
- propertyRef
- );
- }
- }
- else {
- throw new AnnotationException(
- "Referenced property not a (One|Many)ToOne: "
- + StringHelper.qualify(
- otherSide.getEntityName(), mappedBy
- )
- + " in mappedBy of "
- + StringHelper.qualify( ownerEntity, ownerProperty )
- );
- }
- }
- ForeignKey fk = inferredData.getProperty().getAnnotation( ForeignKey.class );
- String fkName = fk != null ? fk.name() : "";
- if ( ! BinderHelper.isDefault( fkName ) ) value.setForeignKeyName( fkName );
- }
-
- //dirty dupe of EntityBinder.bindSecondaryTable
- private Join buildJoin(PersistentClass persistentClass, Property otherSideProperty, Join originalJoin) {
- Join join = new Join();
- join.setPersistentClass( persistentClass );
-
- //no check constraints available on joins
- join.setTable( originalJoin.getTable() );
- join.setInverse( true );
- SimpleValue key = new DependantValue( join.getTable(), persistentClass.getIdentifier() );
- //TODO support @ForeignKey
- join.setKey( key );
- join.setSequentialSelect( false );
- //TODO support for inverse and optional
- join.setOptional( true ); //perhaps not quite per-spec, but a Good Thing anyway
- key.setCascadeDeleteEnabled( false );
- Iterator mappedByColumns = otherSideProperty.getValue().getColumnIterator();
- while ( mappedByColumns.hasNext() ) {
- Column column = (Column) mappedByColumns.next();
- Column copy = new Column();
- copy.setLength( column.getLength() );
- copy.setScale( column.getScale() );
- copy.setValue( key );
- copy.setName( column.getQuotedName() );
- copy.setNullable( column.isNullable() );
- copy.setPrecision( column.getPrecision() );
- copy.setUnique( column.isUnique() );
- copy.setSqlType( column.getSqlType() );
- copy.setCheckConstraint( column.getCheckConstraint() );
- copy.setComment( column.getComment() );
- copy.setDefaultValue( column.getDefaultValue() );
- key.addColumn( copy );
- }
- join.createPrimaryKey();
- join.createForeignKey();
- persistentClass.addJoin( join );
- return join;
- }
-}
-
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/OneToOneSecondPass.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/OneToOneSecondPass.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/OneToOneSecondPass.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/OneToOneSecondPass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,249 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.Iterator;
+import java.util.Map;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.MappingException;
+import org.hibernate.annotations.ForeignKey;
+import org.hibernate.cfg.annotations.PropertyBinder;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.DependantValue;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.ManyToOne;
+import org.hibernate.mapping.OneToOne;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.type.ForeignKeyDirection;
+import org.hibernate.util.StringHelper;
+
+/**
+ * We have to handle OneToOne in a second pass because:
+ * -
+ */
+public class OneToOneSecondPass implements SecondPass {
+ private String mappedBy;
+ private ExtendedMappings mappings;
+ private String ownerEntity;
+ private String ownerProperty;
+ private PropertyHolder propertyHolder;
+ private boolean ignoreNotFound;
+ private PropertyData inferredData;
+ private XClass targetEntity;
+ private boolean cascadeOnDelete;
+ private boolean optional;
+ private String cascadeStrategy;
+ private Ejb3JoinColumn[] joinColumns;
+
+ //that suck, we should read that from the property mainly
+ public OneToOneSecondPass(
+ String mappedBy, String ownerEntity, String ownerProperty,
+ PropertyHolder propertyHolder, PropertyData inferredData, XClass targetEntity, boolean ignoreNotFound,
+ boolean cascadeOnDelete, boolean optional, String cascadeStrategy, Ejb3JoinColumn[] columns,
+ ExtendedMappings mappings
+ ) {
+ this.ownerEntity = ownerEntity;
+ this.ownerProperty = ownerProperty;
+ this.mappedBy = mappedBy;
+ this.propertyHolder = propertyHolder;
+ this.mappings = mappings;
+ this.ignoreNotFound = ignoreNotFound;
+ this.inferredData = inferredData;
+ this.targetEntity = targetEntity;
+ this.cascadeOnDelete = cascadeOnDelete;
+ this.optional = optional;
+ this.cascadeStrategy = cascadeStrategy;
+ this.joinColumns = columns;
+ }
+
+ //TODO refactor this code, there is a lot of duplication in this method
+ public void doSecondPass(Map persistentClasses) throws MappingException {
+ org.hibernate.mapping.OneToOne value = new org.hibernate.mapping.OneToOne(
+ propertyHolder.getTable(), propertyHolder.getPersistentClass()
+ );
+ final String propertyName = inferredData.getPropertyName();
+ value.setPropertyName( propertyName );
+ String referencedEntityName;
+ if ( AnnotationBinder.isDefault( targetEntity, mappings ) ) {
+ referencedEntityName = inferredData.getClassOrElementName();
+ }
+ else {
+ referencedEntityName = targetEntity.getName();
+ }
+ value.setReferencedEntityName( referencedEntityName );
+ AnnotationBinder.defineFetchingStrategy( value, inferredData.getProperty() );
+ //value.setFetchMode( fetchMode );
+ value.setCascadeDeleteEnabled( cascadeOnDelete );
+ //value.setLazy( fetchMode != FetchMode.JOIN );
+
+ if ( !optional ) value.setConstrained( true );
+ value.setForeignKeyType(
+ value.isConstrained() ?
+ ForeignKeyDirection.FOREIGN_KEY_FROM_PARENT :
+ ForeignKeyDirection.FOREIGN_KEY_TO_PARENT
+ );
+ PropertyBinder binder = new PropertyBinder();
+ binder.setName( propertyName );
+ binder.setValue( value );
+ binder.setCascade( cascadeStrategy );
+ binder.setPropertyAccessorName( inferredData.getDefaultAccess() );
+ Property prop = binder.make();
+ if ( BinderHelper.isDefault( mappedBy ) ) {
+ /*
+ * we need to check if the columns are in the right order
+ * if not, then we need to create a many to one and formula
+ * but actually, since entities linked by a one to one need
+ * to share the same composite id class, this cannot happen in hibernate
+ */
+ boolean rightOrder = true;
+
+ if (rightOrder) {
+ String path = StringHelper.qualify( propertyHolder.getPath(), propertyName );
+ ( new FkSecondPass(
+ value, joinColumns,
+ !optional, //cannot have nullabe and unique on certain DBs
+ propertyHolder.getEntityOwnerClassName(),
+ path, mappings
+ ) ).doSecondPass( persistentClasses );
+ //no column associated since its a one to one
+ propertyHolder.addProperty( prop );
+ }
+ else {
+ //this is a many to one with Formula
+
+ }
+ }
+ else {
+ PersistentClass otherSide = (PersistentClass) persistentClasses.get( value.getReferencedEntityName() );
+ Property otherSideProperty;
+ try {
+ if ( otherSide == null ) {
+ throw new MappingException( "Unable to find entity: " + value.getReferencedEntityName() );
+ }
+ otherSideProperty = BinderHelper.findPropertyByName( otherSide, mappedBy );
+ }
+ catch (MappingException e) {
+ throw new AnnotationException(
+ "Unknown mappedBy in: " + StringHelper.qualify( ownerEntity, ownerProperty )
+ + ", referenced property unknown: "
+ + StringHelper.qualify( value.getReferencedEntityName(), mappedBy )
+ );
+ }
+ if ( otherSideProperty.getValue() instanceof OneToOne ) {
+ propertyHolder.addProperty( prop );
+ }
+ else if ( otherSideProperty.getValue() instanceof ManyToOne ) {
+ Iterator it = otherSide.getJoinIterator();
+ Join otherSideJoin = null;
+ while ( it.hasNext() ) {
+ otherSideJoin = (Join) it.next();
+ if ( otherSideJoin.containsProperty( otherSideProperty ) ) {
+ break;
+ }
+ }
+ if ( otherSideJoin != null ) {
+ //@OneToOne @JoinTable
+ Join mappedByJoin = buildJoin(
+ (PersistentClass) persistentClasses.get( ownerEntity ), otherSideProperty, otherSideJoin
+ );
+ ManyToOne manyToOne = new ManyToOne( mappedByJoin.getTable() );
+ //FIXME use ignore not found here
+ manyToOne.setIgnoreNotFound( ignoreNotFound );
+ manyToOne.setCascadeDeleteEnabled( value.isCascadeDeleteEnabled() );
+ manyToOne.setEmbedded( value.isEmbedded() );
+ manyToOne.setFetchMode( value.getFetchMode() );
+ manyToOne.setLazy( value.isLazy() );
+ manyToOne.setReferencedEntityName( value.getReferencedEntityName() );
+ manyToOne.setUnwrapProxy( value.isUnwrapProxy() );
+ prop.setValue( manyToOne );
+ Iterator otherSideJoinKeyColumns = otherSideJoin.getKey().getColumnIterator();
+ while ( otherSideJoinKeyColumns.hasNext() ) {
+ Column column = (Column) otherSideJoinKeyColumns.next();
+ Column copy = new Column();
+ copy.setLength( column.getLength() );
+ copy.setScale( column.getScale() );
+ copy.setValue( manyToOne );
+ copy.setName( column.getQuotedName() );
+ copy.setNullable( column.isNullable() );
+ copy.setPrecision( column.getPrecision() );
+ copy.setUnique( column.isUnique() );
+ copy.setSqlType( column.getSqlType() );
+ copy.setCheckConstraint( column.getCheckConstraint() );
+ copy.setComment( column.getComment() );
+ copy.setDefaultValue( column.getDefaultValue() );
+ manyToOne.addColumn( copy );
+ }
+ mappedByJoin.addProperty( prop );
+ }
+ else {
+ propertyHolder.addProperty( prop );
+ }
+
+ value.setReferencedPropertyName( mappedBy );
+
+ String propertyRef = value.getReferencedPropertyName();
+ if ( propertyRef != null ) {
+ mappings.addUniquePropertyReference(
+ value.getReferencedEntityName(),
+ propertyRef
+ );
+ }
+ }
+ else {
+ throw new AnnotationException(
+ "Referenced property not a (One|Many)ToOne: "
+ + StringHelper.qualify(
+ otherSide.getEntityName(), mappedBy
+ )
+ + " in mappedBy of "
+ + StringHelper.qualify( ownerEntity, ownerProperty )
+ );
+ }
+ }
+ ForeignKey fk = inferredData.getProperty().getAnnotation( ForeignKey.class );
+ String fkName = fk != null ? fk.name() : "";
+ if ( ! BinderHelper.isDefault( fkName ) ) value.setForeignKeyName( fkName );
+ }
+
+ //dirty dupe of EntityBinder.bindSecondaryTable
+ private Join buildJoin(PersistentClass persistentClass, Property otherSideProperty, Join originalJoin) {
+ Join join = new Join();
+ join.setPersistentClass( persistentClass );
+
+ //no check constraints available on joins
+ join.setTable( originalJoin.getTable() );
+ join.setInverse( true );
+ SimpleValue key = new DependantValue( join.getTable(), persistentClass.getIdentifier() );
+ //TODO support @ForeignKey
+ join.setKey( key );
+ join.setSequentialSelect( false );
+ //TODO support for inverse and optional
+ join.setOptional( true ); //perhaps not quite per-spec, but a Good Thing anyway
+ key.setCascadeDeleteEnabled( false );
+ Iterator mappedByColumns = otherSideProperty.getValue().getColumnIterator();
+ while ( mappedByColumns.hasNext() ) {
+ Column column = (Column) mappedByColumns.next();
+ Column copy = new Column();
+ copy.setLength( column.getLength() );
+ copy.setScale( column.getScale() );
+ copy.setValue( key );
+ copy.setName( column.getQuotedName() );
+ copy.setNullable( column.isNullable() );
+ copy.setPrecision( column.getPrecision() );
+ copy.setUnique( column.isUnique() );
+ copy.setSqlType( column.getSqlType() );
+ copy.setCheckConstraint( column.getCheckConstraint() );
+ copy.setComment( column.getComment() );
+ copy.setDefaultValue( column.getDefaultValue() );
+ key.addColumn( copy );
+ }
+ join.createPrimaryKey();
+ join.createForeignKey();
+ persistentClass.addJoin( join );
+ return join;
+ }
+}
+
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyData.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyData.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyData.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-package org.hibernate.cfg;
-
-import org.hibernate.MappingException;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-
-public interface PropertyData {
-
- /**
- * @return default member access (whether field or property)
- * @throws MappingException No getter or field found or wrong JavaBean spec usage
- */
- public String getDefaultAccess();
-
- /**
- * @return property name
- * @throws MappingException No getter or field found or wrong JavaBean spec usage
- */
- public String getPropertyName() throws MappingException;
-
- /**
- * Returns the returned class itself or the element type if an array
- */
- public XClass getClassOrElement() throws MappingException;
-
- /**
- * Return the class itself
- */
- public XClass getPropertyClass() throws MappingException;
-
- /**
- * Returns the returned class name itself or the element type if an array
- */
- public String getClassOrElementName() throws MappingException;
-
- /**
- * Returns the returned class name itself
- */
- public String getTypeName() throws MappingException;
-
- public XProperty getProperty();
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyData.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyData.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyData.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyData.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+package org.hibernate.cfg;
+
+import org.hibernate.MappingException;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+
+public interface PropertyData {
+
+ /**
+ * @return default member access (whether field or property)
+ * @throws MappingException No getter or field found or wrong JavaBean spec usage
+ */
+ public String getDefaultAccess();
+
+ /**
+ * @return property name
+ * @throws MappingException No getter or field found or wrong JavaBean spec usage
+ */
+ public String getPropertyName() throws MappingException;
+
+ /**
+ * Returns the returned class itself or the element type if an array
+ */
+ public XClass getClassOrElement() throws MappingException;
+
+ /**
+ * Return the class itself
+ */
+ public XClass getPropertyClass() throws MappingException;
+
+ /**
+ * Returns the returned class name itself or the element type if an array
+ */
+ public String getClassOrElementName() throws MappingException;
+
+ /**
+ * Returns the returned class name itself
+ */
+ public String getTypeName() throws MappingException;
+
+ public XProperty getProperty();
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-package org.hibernate.cfg;
-
-import javax.persistence.Column;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-
-import org.hibernate.mapping.KeyValue;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.Table;
-import org.hibernate.mapping.Join;
-
-/**
- * Property holder abstract property containers from their direct implementation
- *
- * @author Emmanuel Bernard
- */
-public interface PropertyHolder {
- String getClassName();
-
- String getEntityOwnerClassName();
-
- Table getTable();
-
- void addProperty(Property prop);
-
- KeyValue getIdentifier();
-
- PersistentClass getPersistentClass();
-
- boolean isComponent();
-
- void setParentProperty(String parentProperty);
-
- String getPath();
-
- /**
- * return null if the column is not overridden, or an array of column if true
- */
- Column[] getOverriddenColumn(String propertyName);
-
- /**
- * return null if the column is not overridden, or an array of column if true
- */
- JoinColumn[] getOverriddenJoinColumn(String propertyName);
-
- String getEntityName();
-
- void addProperty(Property prop, Ejb3Column[] columns);
-
- Join addJoin(JoinTable joinTableAnn, boolean noDelayInPkColumnCreation);
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+package org.hibernate.cfg;
+
+import javax.persistence.Column;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+
+import org.hibernate.mapping.KeyValue;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Table;
+import org.hibernate.mapping.Join;
+
+/**
+ * Property holder abstract property containers from their direct implementation
+ *
+ * @author Emmanuel Bernard
+ */
+public interface PropertyHolder {
+ String getClassName();
+
+ String getEntityOwnerClassName();
+
+ Table getTable();
+
+ void addProperty(Property prop);
+
+ KeyValue getIdentifier();
+
+ PersistentClass getPersistentClass();
+
+ boolean isComponent();
+
+ void setParentProperty(String parentProperty);
+
+ String getPath();
+
+ /**
+ * return null if the column is not overridden, or an array of column if true
+ */
+ Column[] getOverriddenColumn(String propertyName);
+
+ /**
+ * return null if the column is not overridden, or an array of column if true
+ */
+ JoinColumn[] getOverriddenJoinColumn(String propertyName);
+
+ String getEntityName();
+
+ void addProperty(Property prop, Ejb3Column[] columns);
+
+ Join addJoin(JoinTable joinTableAnn, boolean noDelayInPkColumnCreation);
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolderBuilder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolderBuilder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolderBuilder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,67 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import java.util.Map;
-
-import org.hibernate.cfg.annotations.EntityBinder;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.Component;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-
-/**
- * This factory is here ot build a PropertyHolder and prevent .mapping interface adding
- *
- * @author Emmanuel Bernard
- */
-public final class PropertyHolderBuilder {
- private PropertyHolderBuilder() {
- }
-
- public static PropertyHolder buildPropertyHolder(
- XClass clazzToProcess,
- PersistentClass persistentClass,
- EntityBinder entityBinder,
- //Map<String, Join> joins,
- ExtendedMappings mappings
- ) {
- return (PropertyHolder) new ClassPropertyHolder( persistentClass, clazzToProcess, entityBinder, mappings );
- }
-
- /**
- * build a component property holder
- *
- * @param component component to wrap
- * @param path component path
- * @param mappings
- * @return PropertyHolder
- */
- public static PropertyHolder buildPropertyHolder(
- Component component, String path, PropertyData inferredData, PropertyHolder parent,
- ExtendedMappings mappings
- ) {
- return (PropertyHolder) new ComponentPropertyHolder( component, path, inferredData, parent, mappings );
- }
-
- /**
- * buid a property holder on top of a collection
- */
- public static PropertyHolder buildPropertyHolder(
- Collection collection, String path, XClass clazzToProcess, XProperty property,
- PropertyHolder parentPropertyHolder, ExtendedMappings mappings
- ) {
- return new CollectionPropertyHolder( collection, path, clazzToProcess, property, parentPropertyHolder, mappings );
- }
-
- /**
- * must only be used on second level phases (<join> has to be settled already)
- */
- public static PropertyHolder buildPropertyHolder(
- PersistentClass persistentClass, Map<String, Join> joins,
- ExtendedMappings mappings
- ) {
- return (PropertyHolder) new ClassPropertyHolder( persistentClass, null, joins, mappings );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolderBuilder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolderBuilder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolderBuilder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyHolderBuilder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,67 @@
+//$Id$
+package org.hibernate.cfg;
+
+import java.util.Map;
+
+import org.hibernate.cfg.annotations.EntityBinder;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+
+/**
+ * This factory is here ot build a PropertyHolder and prevent .mapping interface adding
+ *
+ * @author Emmanuel Bernard
+ */
+public final class PropertyHolderBuilder {
+ private PropertyHolderBuilder() {
+ }
+
+ public static PropertyHolder buildPropertyHolder(
+ XClass clazzToProcess,
+ PersistentClass persistentClass,
+ EntityBinder entityBinder,
+ //Map<String, Join> joins,
+ ExtendedMappings mappings
+ ) {
+ return (PropertyHolder) new ClassPropertyHolder( persistentClass, clazzToProcess, entityBinder, mappings );
+ }
+
+ /**
+ * build a component property holder
+ *
+ * @param component component to wrap
+ * @param path component path
+ * @param mappings
+ * @return PropertyHolder
+ */
+ public static PropertyHolder buildPropertyHolder(
+ Component component, String path, PropertyData inferredData, PropertyHolder parent,
+ ExtendedMappings mappings
+ ) {
+ return (PropertyHolder) new ComponentPropertyHolder( component, path, inferredData, parent, mappings );
+ }
+
+ /**
+ * buid a property holder on top of a collection
+ */
+ public static PropertyHolder buildPropertyHolder(
+ Collection collection, String path, XClass clazzToProcess, XProperty property,
+ PropertyHolder parentPropertyHolder, ExtendedMappings mappings
+ ) {
+ return new CollectionPropertyHolder( collection, path, clazzToProcess, property, parentPropertyHolder, mappings );
+ }
+
+ /**
+ * must only be used on second level phases (<join> has to be settled already)
+ */
+ public static PropertyHolder buildPropertyHolder(
+ PersistentClass persistentClass, Map<String, Join> joins,
+ ExtendedMappings mappings
+ ) {
+ return (PropertyHolder) new ClassPropertyHolder( persistentClass, null, joins, mappings );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyInferredData.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyInferredData.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyInferredData.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,72 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import org.hibernate.MappingException;
-import org.hibernate.annotations.AccessType;
-import org.hibernate.annotations.Target;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-
-/**
- * Retrieve all inferred data from an annnoted element
- *
- * @author Emmanuel Bernard
- * @author Paolo Perrotta
- */
-public class PropertyInferredData implements PropertyData {
- private final String defaultAccess;
-
- private final XProperty property;
- private final ReflectionManager reflectionManager;
-
- /**
- * Take the annoted element for lazy process
- */
- public PropertyInferredData(XProperty property, String propertyAccessor, ReflectionManager reflectionManager) {
- this.property = property;
- this.defaultAccess = propertyAccessor;
- this.reflectionManager = reflectionManager;
- }
-
- public String getDefaultAccess() throws MappingException {
- // if(skip())
- // return defaultAccess;
- AccessType access = property.getAnnotation( AccessType.class );
- return access != null ? access.value() : defaultAccess;
- }
-
- public String getPropertyName() throws MappingException {
- return property.getName();
- }
-
- public XClass getPropertyClass() throws MappingException {
- if ( property.isAnnotationPresent( Target.class ) ) {
- return reflectionManager.toXClass( property.getAnnotation( Target.class ).value() );
- }
- else {
- return property.getType();
- }
- }
-
- public XClass getClassOrElement() throws MappingException {
- if ( property.isAnnotationPresent( Target.class ) ) {
- return reflectionManager.toXClass( property.getAnnotation( Target.class ).value() );
- }
- else {
- return property.getClassOrElementClass();
- }
- }
-
- public String getClassOrElementName() throws MappingException {
- return getClassOrElement().getName();
- }
-
- public String getTypeName() throws MappingException {
- return getPropertyClass().getName();
- }
-
- public XProperty getProperty() {
- return property;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyInferredData.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyInferredData.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyInferredData.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyInferredData.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,72 @@
+//$Id$
+package org.hibernate.cfg;
+
+import org.hibernate.MappingException;
+import org.hibernate.annotations.AccessType;
+import org.hibernate.annotations.Target;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+
+/**
+ * Retrieve all inferred data from an annnoted element
+ *
+ * @author Emmanuel Bernard
+ * @author Paolo Perrotta
+ */
+public class PropertyInferredData implements PropertyData {
+ private final String defaultAccess;
+
+ private final XProperty property;
+ private final ReflectionManager reflectionManager;
+
+ /**
+ * Take the annoted element for lazy process
+ */
+ public PropertyInferredData(XProperty property, String propertyAccessor, ReflectionManager reflectionManager) {
+ this.property = property;
+ this.defaultAccess = propertyAccessor;
+ this.reflectionManager = reflectionManager;
+ }
+
+ public String getDefaultAccess() throws MappingException {
+ // if(skip())
+ // return defaultAccess;
+ AccessType access = property.getAnnotation( AccessType.class );
+ return access != null ? access.value() : defaultAccess;
+ }
+
+ public String getPropertyName() throws MappingException {
+ return property.getName();
+ }
+
+ public XClass getPropertyClass() throws MappingException {
+ if ( property.isAnnotationPresent( Target.class ) ) {
+ return reflectionManager.toXClass( property.getAnnotation( Target.class ).value() );
+ }
+ else {
+ return property.getType();
+ }
+ }
+
+ public XClass getClassOrElement() throws MappingException {
+ if ( property.isAnnotationPresent( Target.class ) ) {
+ return reflectionManager.toXClass( property.getAnnotation( Target.class ).value() );
+ }
+ else {
+ return property.getClassOrElementClass();
+ }
+ }
+
+ public String getClassOrElementName() throws MappingException {
+ return getClassOrElement().getName();
+ }
+
+ public String getTypeName() throws MappingException {
+ return getPropertyClass().getName();
+ }
+
+ public XProperty getProperty() {
+ return property;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyPreloadedData.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyPreloadedData.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyPreloadedData.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,48 +0,0 @@
-//$Id$
-package org.hibernate.cfg;
-
-import org.hibernate.MappingException;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-
-public class PropertyPreloadedData implements PropertyData {
- private final String defaultAccess;
-
- private final String propertyName;
-
- private final XClass returnedClass;
-
- public PropertyPreloadedData(String defaultAccess, String propertyName, XClass returnedClass) {
- this.defaultAccess = defaultAccess;
- this.propertyName = propertyName;
- this.returnedClass = returnedClass;
- }
-
- public String getDefaultAccess() throws MappingException {
- return defaultAccess;
- }
-
- public String getPropertyName() throws MappingException {
- return propertyName;
- }
-
- public XClass getClassOrElement() throws MappingException {
- return getPropertyClass();
- }
-
- public XClass getPropertyClass() throws MappingException {
- return returnedClass;
- }
-
- public String getClassOrElementName() throws MappingException {
- return getTypeName();
- }
-
- public String getTypeName() throws MappingException {
- return returnedClass == null ? null : returnedClass.getName();
- }
-
- public XProperty getProperty() {
- return null; //instead of UnsupportedOperationException
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyPreloadedData.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyPreloadedData.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyPreloadedData.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/PropertyPreloadedData.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,48 @@
+//$Id$
+package org.hibernate.cfg;
+
+import org.hibernate.MappingException;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+
+public class PropertyPreloadedData implements PropertyData {
+ private final String defaultAccess;
+
+ private final String propertyName;
+
+ private final XClass returnedClass;
+
+ public PropertyPreloadedData(String defaultAccess, String propertyName, XClass returnedClass) {
+ this.defaultAccess = defaultAccess;
+ this.propertyName = propertyName;
+ this.returnedClass = returnedClass;
+ }
+
+ public String getDefaultAccess() throws MappingException {
+ return defaultAccess;
+ }
+
+ public String getPropertyName() throws MappingException {
+ return propertyName;
+ }
+
+ public XClass getClassOrElement() throws MappingException {
+ return getPropertyClass();
+ }
+
+ public XClass getPropertyClass() throws MappingException {
+ return returnedClass;
+ }
+
+ public String getClassOrElementName() throws MappingException {
+ return getTypeName();
+ }
+
+ public String getTypeName() throws MappingException {
+ return returnedClass == null ? null : returnedClass.getName();
+ }
+
+ public XProperty getProperty() {
+ return null; //instead of UnsupportedOperationException
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/WrappedInferredData.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/WrappedInferredData.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/WrappedInferredData.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,48 +0,0 @@
-//$Id: $
-package org.hibernate.cfg;
-
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.MappingException;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class WrappedInferredData implements PropertyData {
- private PropertyData wrappedInferredData;
- private String propertyName;
-
- public XClass getClassOrElement() throws MappingException {
- return wrappedInferredData.getClassOrElement();
- }
-
- public String getClassOrElementName() throws MappingException {
- return wrappedInferredData.getClassOrElementName();
- }
-
- public String getDefaultAccess() {
- return wrappedInferredData.getDefaultAccess();
- }
-
- public XProperty getProperty() {
- return wrappedInferredData.getProperty();
- }
-
- public XClass getPropertyClass() throws MappingException {
- return wrappedInferredData.getPropertyClass();
- }
-
- public String getPropertyName() throws MappingException {
- return propertyName;
- }
-
- public String getTypeName() throws MappingException {
- return wrappedInferredData.getTypeName();
- }
-
- public WrappedInferredData(PropertyData inferredData, String suffix) {
- this.wrappedInferredData = inferredData;
- this.propertyName = StringHelper.qualify( inferredData.getPropertyName(), suffix );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/WrappedInferredData.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/WrappedInferredData.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/WrappedInferredData.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/WrappedInferredData.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,48 @@
+//$Id: $
+package org.hibernate.cfg;
+
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.MappingException;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class WrappedInferredData implements PropertyData {
+ private PropertyData wrappedInferredData;
+ private String propertyName;
+
+ public XClass getClassOrElement() throws MappingException {
+ return wrappedInferredData.getClassOrElement();
+ }
+
+ public String getClassOrElementName() throws MappingException {
+ return wrappedInferredData.getClassOrElementName();
+ }
+
+ public String getDefaultAccess() {
+ return wrappedInferredData.getDefaultAccess();
+ }
+
+ public XProperty getProperty() {
+ return wrappedInferredData.getProperty();
+ }
+
+ public XClass getPropertyClass() throws MappingException {
+ return wrappedInferredData.getPropertyClass();
+ }
+
+ public String getPropertyName() throws MappingException {
+ return propertyName;
+ }
+
+ public String getTypeName() throws MappingException {
+ return wrappedInferredData.getTypeName();
+ }
+
+ public WrappedInferredData(PropertyData inferredData, String suffix) {
+ this.wrappedInferredData = inferredData;
+ this.propertyName = StringHelper.qualify( inferredData.getPropertyName(), suffix );
+ }
+}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations)
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ArrayBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ArrayBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ArrayBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-package org.hibernate.cfg.annotations;
-
-import org.hibernate.mapping.Array;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.PersistentClass;
-
-/**
- * Bind an Array
- *
- * @author Anthony Patricio
- */
-public class ArrayBinder extends ListBinder {
-
- public ArrayBinder() {
- }
-
- protected Collection createCollection(PersistentClass persistentClass) {
- return new Array( persistentClass );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ArrayBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ArrayBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ArrayBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ArrayBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+package org.hibernate.cfg.annotations;
+
+import org.hibernate.mapping.Array;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.PersistentClass;
+
+/**
+ * Bind an Array
+ *
+ * @author Anthony Patricio
+ */
+public class ArrayBinder extends ListBinder {
+
+ public ArrayBinder() {
+ }
+
+ protected Collection createCollection(PersistentClass persistentClass) {
+ return new Array( persistentClass );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/BagBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/BagBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/BagBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-package org.hibernate.cfg.annotations;
-
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.PersistentClass;
-
-/**
- * Bind a bag.
- *
- * @author Matthew Inger
- */
-public class BagBinder extends CollectionBinder {
-
- public BagBinder() {
- }
-
- protected Collection createCollection(PersistentClass persistentClass) {
- return new org.hibernate.mapping.Bag( persistentClass );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/BagBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/BagBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/BagBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/BagBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+package org.hibernate.cfg.annotations;
+
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.PersistentClass;
+
+/**
+ * Bind a bag.
+ *
+ * @author Matthew Inger
+ */
+public class BagBinder extends CollectionBinder {
+
+ public BagBinder() {
+ }
+
+ protected Collection createCollection(PersistentClass persistentClass) {
+ return new org.hibernate.mapping.Bag( persistentClass );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/CollectionBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,1369 +0,0 @@
-package org.hibernate.cfg.annotations;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.StringTokenizer;
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.Embeddable;
-import javax.persistence.FetchType;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.MapKey;
-import javax.persistence.OneToMany;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.FetchMode;
-import org.hibernate.MappingException;
-import org.hibernate.engine.ExecuteUpdateResultCheckStyle;
-import org.hibernate.annotations.BatchSize;
-import org.hibernate.annotations.Cache;
-import org.hibernate.annotations.CollectionId;
-import org.hibernate.annotations.CollectionOfElements;
-import org.hibernate.annotations.Fetch;
-import org.hibernate.annotations.Filter;
-import org.hibernate.annotations.FilterJoinTable;
-import org.hibernate.annotations.FilterJoinTables;
-import org.hibernate.annotations.Filters;
-import org.hibernate.annotations.ForeignKey;
-import org.hibernate.annotations.LazyCollection;
-import org.hibernate.annotations.LazyCollectionOption;
-import org.hibernate.annotations.OrderBy;
-import org.hibernate.annotations.Sort;
-import org.hibernate.annotations.SortType;
-import org.hibernate.annotations.Where;
-import org.hibernate.annotations.WhereJoinTable;
-import org.hibernate.annotations.SQLInsert;
-import org.hibernate.annotations.SQLUpdate;
-import org.hibernate.annotations.SQLDelete;
-import org.hibernate.annotations.SQLDeleteAll;
-import org.hibernate.annotations.Loader;
-import org.hibernate.annotations.Immutable;
-import org.hibernate.annotations.OptimisticLock;
-import org.hibernate.annotations.Persister;
-import org.hibernate.cfg.AnnotatedClassType;
-import org.hibernate.cfg.AnnotationBinder;
-import org.hibernate.cfg.BinderHelper;
-import org.hibernate.cfg.CollectionSecondPass;
-import org.hibernate.cfg.Ejb3Column;
-import org.hibernate.cfg.Ejb3JoinColumn;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.IndexColumn;
-import org.hibernate.cfg.PropertyData;
-import org.hibernate.cfg.PropertyHolder;
-import org.hibernate.cfg.PropertyHolderBuilder;
-import org.hibernate.cfg.PropertyPreloadedData;
-import org.hibernate.cfg.SecondPass;
-import org.hibernate.mapping.Backref;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Component;
-import org.hibernate.mapping.DependantValue;
-import org.hibernate.mapping.IdGenerator;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.KeyValue;
-import org.hibernate.mapping.ManyToOne;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.Selectable;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.Table;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.util.StringHelper;
-
-/**
- * Collection binder
- *
- * @author inger
- * @author Emmanuel Bernard
- */
-public abstract class CollectionBinder {
-
- private static final Log log = LogFactory.getLog( CollectionBinder.class );
-
- protected Collection collection;
- protected String propertyName;
- PropertyHolder propertyHolder;
- int batchSize;
- private String mappedBy;
- private XClass collectionType;
- private XClass targetEntity;
- private ExtendedMappings mappings;
- private Ejb3JoinColumn[] inverseJoinColumns;
- private String cascadeStrategy;
- String cacheConcurrencyStrategy;
- String cacheRegionName;
- private boolean oneToMany;
- protected IndexColumn indexColumn;
- private String orderBy;
- protected String hqlOrderBy;
- private boolean isSorted;
- private Class comparator;
- private boolean hasToBeSorted;
- protected boolean cascadeDeleteEnabled;
- protected String mapKeyPropertyName;
- private boolean insertable = true;
- private boolean updatable = true;
- private Ejb3JoinColumn[] fkJoinColumns;
- private boolean isExplicitAssociationTable;
- private Ejb3Column[] elementColumns;
- private boolean isEmbedded;
- private XProperty property;
- private boolean ignoreNotFound;
- private TableBinder tableBinder;
- private Ejb3Column[] mapKeyColumns;
- private Ejb3JoinColumn[] mapKeyManyToManyColumns;
- protected HashMap<String, IdGenerator> localGenerators;
-
- public void setUpdatable(boolean updatable) {
- this.updatable = updatable;
- }
-
- public void setInsertable(boolean insertable) {
- this.insertable = insertable;
- }
-
-
- public void setCascadeStrategy(String cascadeStrategy) {
- this.cascadeStrategy = cascadeStrategy;
- }
-
- public void setPropertyAccessorName(String propertyAccessorName) {
- this.propertyAccessorName = propertyAccessorName;
- }
-
- private String propertyAccessorName;
-
- public void setInverseJoinColumns(Ejb3JoinColumn[] inverseJoinColumns) {
- this.inverseJoinColumns = inverseJoinColumns;
- }
-
- public void setJoinColumns(Ejb3JoinColumn[] joinColumns) {
- this.joinColumns = joinColumns;
- }
-
- private Ejb3JoinColumn[] joinColumns;
-
- public void setPropertyHolder(PropertyHolder propertyHolder) {
- this.propertyHolder = propertyHolder;
- }
-
- public void setBatchSize(BatchSize batchSize) {
- this.batchSize = batchSize == null ? -1 : batchSize.size();
- }
-
- public void setEjb3OrderBy(javax.persistence.OrderBy orderByAnn) {
- if ( orderByAnn != null ) {
- hqlOrderBy = orderByAnn.value();
- }
- }
-
- public void setSqlOrderBy(OrderBy orderByAnn) {
- if ( orderByAnn != null ) {
- if ( ! BinderHelper.isDefault( orderByAnn.clause() ) ) orderBy = orderByAnn.clause();
- }
- }
-
- public void setSort(Sort sortAnn) {
- if ( sortAnn != null ) {
- isSorted = ! SortType.UNSORTED.equals( sortAnn.type() );
- if ( isSorted && SortType.COMPARATOR.equals( sortAnn.type() ) ) {
- comparator = sortAnn.comparator();
- }
- }
- }
-
- /**
- * collection binder factory
- */
- public static CollectionBinder getCollectionBinder(
- String entityName, XProperty property,
- boolean isIndexed
- ) {
- if ( property.isArray() ) {
- if ( property.getElementClass().isPrimitive() ) {
- return new PrimitiveArrayBinder();
- }
- else {
- return new ArrayBinder();
- }
- }
- else if ( property.isCollection() ) {
- //TODO consider using an XClass
- Class returnedClass = property.getCollectionClass();
- if ( java.util.Set.class.equals( returnedClass ) ) {
- return new SetBinder();
- }
- else if ( java.util.SortedSet.class.equals( returnedClass ) ) {
- return new SetBinder( true );
- }
- else if ( java.util.Map.class.equals( returnedClass ) ) {
- return new MapBinder();
- }
- else if ( java.util.SortedMap.class.equals( returnedClass ) ) {
- return new MapBinder(true);
- }
- else if ( java.util.Collection.class.equals( returnedClass ) ) {
- if ( property.isAnnotationPresent( CollectionId.class ) ) {
- return new IdBagBinder();
- }
- else {
- return new BagBinder();
- }
- }
- else if ( java.util.List.class.equals( returnedClass ) ) {
- if ( isIndexed ) {
- return new ListBinder();
- }
- else if ( property.isAnnotationPresent( CollectionId.class ) ) {
- return new IdBagBinder();
- }
- else {
- return new BagBinder();
- }
- }
- else {
- throw new AnnotationException(
- returnedClass.getName() + " collection not yet supported: "
- + StringHelper.qualify( entityName, property.getName() )
- );
- }
- }
- else {
- throw new AnnotationException(
- "Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: "
- + StringHelper.qualify( entityName, property.getName() )
- );
- }
- }
-
- protected CollectionBinder() {
- }
-
- protected CollectionBinder(boolean sorted) {
- this.hasToBeSorted = sorted;
- }
-
- public void setMappedBy(String mappedBy) {
- this.mappedBy = mappedBy;
- }
-
- public void setTableBinder(TableBinder tableBinder) {
- this.tableBinder = tableBinder;
- }
-
- public void setCollectionType(XClass collectionType) {
- this.collectionType = collectionType;
- }
-
- public void setTargetEntity(XClass targetEntity) {
- this.targetEntity = targetEntity;
- }
-
- public void setMappings(ExtendedMappings mappings) {
- this.mappings = mappings;
- }
-
- protected abstract Collection createCollection(PersistentClass persistentClass);
-
- public Collection getCollection() {
- return collection;
- }
-
- public void setPropertyName(String propertyName) {
- this.propertyName = propertyName;
- }
-
- public void bind() {
- this.collection = createCollection( propertyHolder.getPersistentClass() );
- log.debug( "Collection role: " + StringHelper.qualify( propertyHolder.getPath(), propertyName ) );
- collection.setRole( StringHelper.qualify( propertyHolder.getPath(), propertyName ) );
- collection.setNodeName( propertyName );
-
- if ( property.isAnnotationPresent( org.hibernate.annotations.MapKey.class ) && mapKeyPropertyName != null ) {
- throw new AnnotationException(
- "Cannot mix @javax.persistence.MapKey and @org.hibernate.annotations.MapKey "
- + "on the same collection: " + StringHelper.qualify(
- propertyHolder.getPath(), propertyName
- )
- );
- }
-
- //set laziness
- defineFetchingStrategy();
- //collection.setFetchMode( fetchMode );
- //collection.setLazy( fetchMode == FetchMode.SELECT );
- collection.setBatchSize( batchSize );
- if ( orderBy != null && hqlOrderBy != null ) {
- throw new AnnotationException(
- "Cannot use sql order by clause in conjunction of EJB3 order by clause: " + safeCollectionRole()
- );
- }
-
- collection.setMutable( ! property.isAnnotationPresent( Immutable.class ) );
- OptimisticLock lockAnn = property.getAnnotation( OptimisticLock.class );
- if (lockAnn != null) collection.setOptimisticLocked( ! lockAnn.excluded() );
- Persister persisterAnn = property.getAnnotation( Persister.class );
- if ( persisterAnn != null ) collection.setCollectionPersisterClass( persisterAnn.impl() );
-
- // set ordering
- if ( orderBy != null ) collection.setOrderBy( orderBy );
- if ( isSorted ) {
- collection.setSorted( true );
- if ( comparator != null ) {
- try {
- collection.setComparator( (Comparator) comparator.newInstance() );
- }
- catch (ClassCastException e) {
- throw new AnnotationException(
- "Comparator not implementing java.util.Comparator class: "
- + comparator.getName() + "(" + safeCollectionRole() + ")"
- );
- }
- catch (Exception e) {
- throw new AnnotationException(
- "Could not instantiate comparator class: "
- + comparator.getName() + "(" + safeCollectionRole() + ")"
- );
- }
- }
- }
- else {
- if ( hasToBeSorted ) {
- throw new AnnotationException(
- "A sorted collection has to define @Sort: "
- + safeCollectionRole()
- );
- }
- }
-
- //set cache
- if ( StringHelper.isNotEmpty( cacheConcurrencyStrategy ) ) {
- collection.setCacheConcurrencyStrategy( cacheConcurrencyStrategy );
- collection.setCacheRegionName( cacheRegionName );
- }
-
- //SQL overriding
- SQLInsert sqlInsert = property.getAnnotation( SQLInsert.class );
- SQLUpdate sqlUpdate = property.getAnnotation( SQLUpdate.class );
- SQLDelete sqlDelete = property.getAnnotation( SQLDelete.class );
- SQLDeleteAll sqlDeleteAll = property.getAnnotation( SQLDeleteAll.class );
- Loader loader = property.getAnnotation( Loader.class );
- if ( sqlInsert != null ) {
- collection.setCustomSQLInsert( sqlInsert.sql().trim(), sqlInsert.callable(),
- ExecuteUpdateResultCheckStyle.parse( sqlInsert.check().toString().toLowerCase() )
- );
-
- }
- if ( sqlUpdate != null ) {
- collection.setCustomSQLUpdate( sqlUpdate.sql(), sqlUpdate.callable(),
- ExecuteUpdateResultCheckStyle.parse( sqlUpdate.check().toString().toLowerCase() )
- );
- }
- if ( sqlDelete != null ) {
- collection.setCustomSQLDelete( sqlDelete.sql(), sqlDelete.callable(),
- ExecuteUpdateResultCheckStyle.parse( sqlDelete.check().toString().toLowerCase() )
- );
- }
- if ( sqlDeleteAll != null ) {
- collection.setCustomSQLDeleteAll( sqlDeleteAll.sql(), sqlDeleteAll.callable(),
- ExecuteUpdateResultCheckStyle.parse( sqlDeleteAll.check().toString().toLowerCase() )
- );
- }
- if ( loader != null ) {
- collection.setLoaderName( loader.namedQuery() );
- }
-
- //work on association
- boolean isMappedBy = ! BinderHelper.isDefault( mappedBy );
- collection.setInverse( isMappedBy );
-
- //many to many may need some second pass informations
- if ( ! oneToMany && isMappedBy ) {
- mappings.addMappedBy( getCollectionType().getName(), mappedBy, propertyName );
- }
- //TODO reducce tableBinder != null and oneToMany
- //FIXME collection of elements shouldn't be executed as a secondpass
- SecondPass sp = getSecondPass(
- fkJoinColumns,
- joinColumns,
- inverseJoinColumns,
- elementColumns,
- mapKeyColumns, mapKeyManyToManyColumns, isEmbedded,
- property, getCollectionType(),
- ignoreNotFound, oneToMany,
- tableBinder, mappings
- );
- XClass collectionType = getCollectionType();
- if ( collectionType.isAnnotationPresent( Embeddable.class )
- || property.isAnnotationPresent( CollectionOfElements.class ) ) {
- // do it right away, otherwise @ManyToon on composite element call addSecondPass
- // and raise a ConcurrentModificationException
- //sp.doSecondPass( CollectionHelper.EMPTY_MAP );
- mappings.addSecondPass( sp, ! isMappedBy );
- }
- else {
- mappings.addSecondPass( sp, ! isMappedBy );
- }
-
- mappings.addCollection( collection );
-
- //property building
- PropertyBinder binder = new PropertyBinder();
- binder.setName( propertyName );
- binder.setValue( collection );
- binder.setCascade( cascadeStrategy );
- if ( cascadeStrategy != null && cascadeStrategy.indexOf( "delete-orphan" ) >= 0 ) {
- collection.setOrphanDelete( true );
- }
- binder.setPropertyAccessorName( propertyAccessorName );
- binder.setProperty( property );
- binder.setInsertable( insertable );
- binder.setUpdatable( updatable );
- Property prop = binder.make();
- //we don't care about the join stuffs because the column is on the association table.
- propertyHolder.addProperty( prop );
- }
-
- private void defineFetchingStrategy() {
- LazyCollection lazy = property.getAnnotation( LazyCollection.class );
- Fetch fetch = property.getAnnotation( Fetch.class );
- OneToMany oneToMany = property.getAnnotation( OneToMany.class );
- ManyToMany manyToMany = property.getAnnotation( ManyToMany.class );
- CollectionOfElements elements = property.getAnnotation( CollectionOfElements.class );
- FetchType fetchType;
- if ( oneToMany != null ) {
- fetchType = oneToMany.fetch();
- }
- else if ( manyToMany != null ) {
- fetchType = manyToMany.fetch();
- }
- else if ( elements != null ) {
- fetchType = elements.fetch();
- }
- else {
- throw new AssertionFailure(
- "Define fetch strategy on a property not annotated with @ManyToOne nor @OneToMany nor @CollectionOfElements"
- );
- }
- if ( lazy != null ) {
- collection.setLazy( ! ( lazy.value() == LazyCollectionOption.FALSE ) );
- collection.setExtraLazy( lazy.value() == LazyCollectionOption.EXTRA );
- }
- else {
- collection.setLazy( fetchType == FetchType.LAZY );
- collection.setExtraLazy( false );
- }
- if ( fetch != null ) {
- if ( fetch.value() == org.hibernate.annotations.FetchMode.JOIN ) {
- collection.setFetchMode( FetchMode.JOIN );
- collection.setLazy( false );
- }
- else if ( fetch.value() == org.hibernate.annotations.FetchMode.SELECT ) {
- collection.setFetchMode( FetchMode.SELECT );
- }
- else if ( fetch.value() == org.hibernate.annotations.FetchMode.SUBSELECT ) {
- collection.setFetchMode( FetchMode.SELECT );
- collection.setSubselectLoadable( true );
- collection.getOwner().setSubselectLoadableCollections( true );
- }
- else {
- throw new AssertionFailure( "Unknown FetchMode: " + fetch.value() );
- }
- }
- else {
- collection.setFetchMode( AnnotationBinder.getFetchMode( fetchType ) );
- }
- }
-
- private XClass getCollectionType() {
- if ( AnnotationBinder.isDefault( targetEntity, mappings ) ) {
- if ( collectionType != null ) {
- return collectionType;
- }
- else {
- String errorMsg = "Collection has neither generic type or OneToMany.targetEntity() defined: "
- + safeCollectionRole();
- throw new AnnotationException( errorMsg );
- }
- }
- else {
- return targetEntity;
- }
- }
-
- public SecondPass getSecondPass(
- final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns,
- final Ejb3JoinColumn[] inverseColumns,
- final Ejb3Column[] elementColumns,
- final Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
- final XProperty property, final XClass collType,
- final boolean ignoreNotFound, final boolean unique,
- final TableBinder assocTableBinder, final ExtendedMappings mappings
- ) {
-
- return new CollectionSecondPass( mappings, collection ) {
-
- public void secondPass(java.util.Map persistentClasses, java.util.Map inheritedMetas)
- throws MappingException {
- bindStarToManySecondPass(
- persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns,
- isEmbedded, property, unique, assocTableBinder, ignoreNotFound, mappings
- );
-
- }
- };
- }
-
- /**
- * return true if it's a Fk, false if it's an association table
- */
- protected boolean bindStarToManySecondPass(
- Map persistentClasses, XClass collType, Ejb3JoinColumn[] fkJoinColumns,
- Ejb3JoinColumn[] keyColumns, Ejb3JoinColumn[] inverseColumns, Ejb3Column[] elementColumns,
- boolean isEmbedded,
- XProperty property, boolean unique,
- TableBinder associationTableBinder, boolean ignoreNotFound, ExtendedMappings mappings
- ) {
- PersistentClass persistentClass = (PersistentClass) persistentClasses.get( collType.getName() );
- boolean reversePropertyInJoin = false;
- if ( persistentClass != null && StringHelper.isNotEmpty( this.mappedBy ) ) {
- try {
- reversePropertyInJoin = 0 != persistentClass.getJoinNumber(
- persistentClass.getRecursiveProperty( this.mappedBy )
- );
- }
- catch (MappingException e) {
- StringBuilder error = new StringBuilder( 80 );
- error.append( "mappedBy reference an unknown target entity property: " )
- .append( collType ).append( "." ).append( this.mappedBy )
- .append( " in " )
- .append( collection.getOwnerEntityName() )
- .append( "." )
- .append( property.getName() );
- throw new AnnotationException( error.toString() );
- }
- }
- if ( persistentClass != null
- && ! reversePropertyInJoin
- && oneToMany
- && ! this.isExplicitAssociationTable
- && ( joinColumns[0].isImplicit() && ! BinderHelper.isDefault( this.mappedBy ) //implicit @JoinColumn
- || ! fkJoinColumns[0].isImplicit() ) //this is an explicit @JoinColumn
- ) {
- //this is a Foreign key
- bindOneToManySecondPass(
- getCollection(),
- persistentClasses,
- fkJoinColumns,
- collType,
- cascadeDeleteEnabled,
- ignoreNotFound, hqlOrderBy,
- mappings
- );
- return true;
- }
- else {
- //this is an association table
- bindManyToManySecondPass(
- this.collection,
- persistentClasses,
- keyColumns,
- inverseColumns,
- elementColumns,
- isEmbedded, collType,
- ignoreNotFound, unique,
- cascadeDeleteEnabled,
- associationTableBinder, property, propertyHolder, hqlOrderBy, mappings
- );
- return false;
- }
- }
-
- protected void bindOneToManySecondPass(
- Collection collection, Map persistentClasses, Ejb3JoinColumn[] fkJoinColumns,
- XClass collectionType,
- boolean cascadeDeleteEnabled, boolean ignoreNotFound, String hqlOrderBy, ExtendedMappings extendedMappings
- ) {
- if ( log.isDebugEnabled() ) {
- log.debug(
- "Binding a OneToMany: " + propertyHolder.getEntityName() + "." + propertyName + " through a foreign key"
- );
- }
- org.hibernate.mapping.OneToMany oneToMany = new org.hibernate.mapping.OneToMany( collection.getOwner() );
- collection.setElement( oneToMany );
- oneToMany.setReferencedEntityName( collectionType.getName() );
- oneToMany.setIgnoreNotFound( ignoreNotFound );
-
- String assocClass = oneToMany.getReferencedEntityName();
- PersistentClass associatedClass = (PersistentClass) persistentClasses.get( assocClass );
- String orderBy = buildOrderByClauseFromHql( hqlOrderBy, associatedClass, collection.getRole() );
- if ( orderBy != null ) collection.setOrderBy( orderBy );
- if ( mappings == null ) {
- throw new AssertionFailure(
- "CollectionSecondPass for oneToMany should not be called with null mappings"
- );
- }
- Map<String, Join> joins = mappings.getJoins( assocClass );
- if ( associatedClass == null ) {
- throw new MappingException(
- "Association references unmapped class: " + assocClass
- );
- }
- oneToMany.setAssociatedClass( associatedClass );
- for ( Ejb3JoinColumn column : fkJoinColumns ) {
- column.setPersistentClass( associatedClass, joins );
- column.setJoins( joins );
- collection.setCollectionTable( column.getTable() );
- }
- log.info(
- "Mapping collection: " + collection.getRole() + " -> " + collection.getCollectionTable().getName()
- );
- bindFilters(false);
- bindCollectionSecondPass( collection, null, fkJoinColumns, cascadeDeleteEnabled, property, mappings );
- if ( !collection.isInverse()
- && !collection.getKey().isNullable() ) {
- // for non-inverse one-to-many, with a not-null fk, add a backref!
- String entityName = oneToMany.getReferencedEntityName();
- PersistentClass referenced = mappings.getClass( entityName );
- Backref prop = new Backref();
- prop.setName( '_' + fkJoinColumns[0].getPropertyName() + "Backref" );
- prop.setUpdateable( false );
- prop.setSelectable( false );
- prop.setCollectionRole( collection.getRole() );
- prop.setEntityName( collection.getOwner().getEntityName() );
- prop.setValue( collection.getKey() );
- referenced.addProperty( prop );
- }
- }
-
- private void bindFilters(boolean hasAssociationTable) {
- Filter simpleFilter = property.getAnnotation( Filter.class );
- //set filtering
- //test incompatible choices
- //if ( StringHelper.isNotEmpty( where ) ) collection.setWhere( where );
- if (simpleFilter != null) {
- if (hasAssociationTable) {
- collection.addManyToManyFilter( simpleFilter.name(), getCondition( simpleFilter ) );
- }
- else {
- collection.addFilter( simpleFilter.name(), getCondition( simpleFilter ) );
- }
- }
- Filters filters = property.getAnnotation( Filters.class );
- if (filters != null) {
- for ( Filter filter : filters.value() ) {
- if (hasAssociationTable) {
- collection.addManyToManyFilter( filter.name(), getCondition( filter ) );
- }
- else {
- collection.addFilter( filter.name(), getCondition( filter ) );
- }
- }
- }
- FilterJoinTable simpleFilterJoinTable = property.getAnnotation( FilterJoinTable.class );
- if (simpleFilterJoinTable != null) {
- if (hasAssociationTable) {
- collection.addFilter( simpleFilterJoinTable.name(), getCondition( simpleFilterJoinTable ) );
- }
- else {
- throw new AnnotationException(
- "Illegal use of @FilterJoinTable on an association without join table:"
- + StringHelper.qualify( propertyHolder.getPath(), propertyName )
- );
- }
- }
- FilterJoinTables filterJoinTables = property.getAnnotation( FilterJoinTables.class );
- if (filterJoinTables != null) {
- for ( FilterJoinTable filter : filterJoinTables.value() ) {
- if (hasAssociationTable) {
- collection.addFilter( filter.name(), getCondition( filter ) );
- }
- else {
- throw new AnnotationException(
- "Illegal use of @FilterJoinTable on an association without join table:"
- + StringHelper.qualify( propertyHolder.getPath(), propertyName )
- );
- }
- }
- }
-
- Where where = property.getAnnotation( Where.class );
- String whereClause = where == null ? null : where.clause();
- if ( StringHelper.isNotEmpty( whereClause ) ) {
- if (hasAssociationTable) {
- collection.setManyToManyWhere( whereClause );
- }
- else {
- collection.setWhere( whereClause );
- }
- }
-
- WhereJoinTable whereJoinTable = property.getAnnotation( WhereJoinTable.class );
- String whereJoinTableClause = whereJoinTable == null ? null : whereJoinTable.clause();
- if ( StringHelper.isNotEmpty( whereJoinTableClause ) ) {
- if (hasAssociationTable) {
- collection.setWhere( whereJoinTableClause );
- }
- else {
- throw new AnnotationException(
- "Illegal use of @WhereJoinTable on an association without join table:"
- + StringHelper.qualify( propertyHolder.getPath(), propertyName )
- );
- }
- }
-// This cannot happen in annotations since the second fetch is hardcoded to join
-// if ( ( ! collection.getManyToManyFilterMap().isEmpty() || collection.getManyToManyWhere() != null ) &&
-// collection.getFetchMode() == FetchMode.JOIN &&
-// collection.getElement().getFetchMode() != FetchMode.JOIN ) {
-// throw new MappingException(
-// "association with join table defining filter or where without join fetching " +
-// "not valid within collection using join fetching [" + collection.getRole() + "]"
-// );
-// }
- }
-
- private String getCondition(FilterJoinTable filter) {
- //set filtering
- String name = filter.name();
- String cond = filter.condition();
- return getCondition( cond, name );
- }
-
- private String getCondition(Filter filter) {
- //set filtering
- String name = filter.name();
- String cond = filter.condition();
- return getCondition( cond, name );
- }
-
- private String getCondition(String cond, String name) {
- if ( BinderHelper.isDefault( cond ) ) {
- cond = mappings.getFilterDefinition( name ).getDefaultFilterCondition();
- if ( StringHelper.isEmpty( cond ) ) {
- throw new AnnotationException(
- "no filter condition found for filter " + name + " in "
- + StringHelper.qualify( propertyHolder.getPath(), propertyName )
- );
- }
- }
- return cond;
- }
-
- public void setCache(Cache cacheAnn) {
- if ( cacheAnn != null ) {
- cacheRegionName = BinderHelper.isDefault( cacheAnn.region() ) ? null : cacheAnn.region();
- cacheConcurrencyStrategy = EntityBinder.getCacheConcurrencyStrategy( cacheAnn.usage() );
- }
- else {
- cacheConcurrencyStrategy = null;
- cacheRegionName = null;
- }
- }
-
- public void setOneToMany(boolean oneToMany) {
- this.oneToMany = oneToMany;
- }
-
- public void setIndexColumn(IndexColumn indexColumn) {
- this.indexColumn = indexColumn;
- }
-
- public void setMapKey(MapKey key) {
- if ( key != null ) {
- mapKeyPropertyName = key.name();
- }
- }
-
- private static String buildOrderByClauseFromHql(String hqlOrderBy, PersistentClass associatedClass, String role) {
- String orderByString = null;
- if ( hqlOrderBy != null ) {
- List<String> properties = new ArrayList<String>();
- List<String> ordering = new ArrayList<String>();
- StringBuilder orderByBuffer = new StringBuilder();
- if ( hqlOrderBy.length() == 0 ) {
- //order by id
- Iterator it = associatedClass.getIdentifier().getColumnIterator();
- while ( it.hasNext() ) {
- Selectable col = (Selectable) it.next();
- orderByBuffer.append( col.getText() ).append( " asc" ).append( ", " );
- }
- }
- else {
- StringTokenizer st = new StringTokenizer( hqlOrderBy, " ,", false );
- String currentOrdering = null;
- //FIXME make this code decent
- while ( st.hasMoreTokens() ) {
- String token = st.nextToken();
- if ( isNonPropertyToken( token ) ) {
- if ( currentOrdering != null ) {
- throw new AnnotationException(
- "Error while parsing HQL orderBy clause: " + hqlOrderBy
- + " (" + role + ")"
- );
- }
- currentOrdering = token;
- }
- else {
- //Add ordering of the previous
- if ( currentOrdering == null ) {
- //default ordering
- ordering.add( "asc" );
- }
- else {
- ordering.add( currentOrdering );
- currentOrdering = null;
- }
- properties.add( token );
- }
- }
- ordering.remove( 0 ); //first one is the algorithm starter
- // add last one ordering
- if ( currentOrdering == null ) {
- //default ordering
- ordering.add( "asc" );
- }
- else {
- ordering.add( currentOrdering );
- currentOrdering = null;
- }
- int index = 0;
-
- for ( String property : properties ) {
- Property p = BinderHelper.findPropertyByName( associatedClass, property );
- if ( p == null ) {
- throw new AnnotationException(
- "property from @OrderBy clause not found: "
- + associatedClass.getEntityName() + "." + property
- );
- }
- PersistentClass pc = p.getPersistentClass();
- String table;
- if (pc != associatedClass) {
- table = pc.getTable().getQuotedName() + ".";
- }
- else {
- table = "";
- }
- Iterator propertyColumns = p.getColumnIterator();
- while ( propertyColumns.hasNext() ) {
- Selectable column = (Selectable) propertyColumns.next();
- orderByBuffer.append( table )
- .append( column.getText() )
- .append( " " )
- .append( ordering.get( index ) )
- .append( ", " );
- }
- index++;
- }
- }
- orderByString = orderByBuffer.substring( 0, orderByBuffer.length() - 2 );
- }
- return orderByString;
- }
-
- private static String buildOrderByClauseFromHql(String hqlOrderBy, Component component, String role) {
- String orderByString = null;
- if ( hqlOrderBy != null ) {
- List<String> properties = new ArrayList<String>();
- List<String> ordering = new ArrayList<String>();
- StringBuilder orderByBuffer = new StringBuilder();
- if ( hqlOrderBy.length() == 0 ) {
- //TODO : Check that. Maybe order by key for maps
- }
- else {
- StringTokenizer st = new StringTokenizer( hqlOrderBy, " ,", false );
- String currentOrdering = null;
- //FIXME make this code decent
- while ( st.hasMoreTokens() ) {
- String token = st.nextToken();
- if ( isNonPropertyToken( token ) ) {
- if ( currentOrdering != null ) {
- throw new AnnotationException(
- "Error while parsing HQL orderBy clause: " + hqlOrderBy
- + " (" + role + ")"
- );
- }
- currentOrdering = token;
- }
- else {
- //Add ordering of the previous
- if ( currentOrdering == null ) {
- //default ordering
- ordering.add( "asc" );
- }
- else {
- ordering.add( currentOrdering );
- currentOrdering = null;
- }
- properties.add( token );
- }
- }
- ordering.remove( 0 ); //first one is the algorithm starter
- // add last one ordering
- if ( currentOrdering == null ) {
- //default ordering
- ordering.add( "asc" );
- }
- else {
- ordering.add( currentOrdering );
- currentOrdering = null;
- }
- int index = 0;
-
- for ( String property : properties ) {
- Property p = component.getProperty( property );
- if ( p == null ) {
- throw new AnnotationException(
- "property from @OrderBy clause not found: "
- + role + "." + property
- );
- }
-
- Iterator propertyColumns = p.getColumnIterator();
- while ( propertyColumns.hasNext() ) {
- Selectable column = (Selectable) propertyColumns.next();
- orderByBuffer.append( column.getText() )
- .append( " " )
- .append( ordering.get( index ) )
- .append( ", " );
- }
- index++;
- }
-
- if ( orderByBuffer.length() >= 2 ) {
- orderByString = orderByBuffer.substring( 0, orderByBuffer.length() - 2 );
- }
- }
- }
- return orderByString;
- }
-
- private static boolean isNonPropertyToken(String token) {
- if ( " ".equals( token ) ) return true;
- if ( ",".equals( token ) ) return true;
- if ( token.equalsIgnoreCase( "desc" ) ) return true;
- if ( token.equalsIgnoreCase( "asc" ) ) return true;
- return false;
- }
-
- private static SimpleValue buildCollectionKey(
- Collection collValue, Ejb3JoinColumn[] joinColumns, boolean cascadeDeleteEnabled,
- XProperty property, ExtendedMappings mappings
- ) {
- //binding key reference using column
- KeyValue keyVal;
- //give a chance to override the referenced property name
- //has to do that here because the referencedProperty creation happens in a FKSecondPass for Many to one yuk!
- if ( joinColumns.length > 0 && StringHelper.isNotEmpty( joinColumns[0].getMappedBy() ) ) {
- String entityName = joinColumns[0].getManyToManyOwnerSideEntityName() != null ?
- "inverse__" + joinColumns[0].getManyToManyOwnerSideEntityName() :
- joinColumns[0].getPropertyHolder().getEntityName();
- String propRef = mappings.getPropertyReferencedAssociation(
- entityName,
- joinColumns[0].getMappedBy()
- );
- if ( propRef != null ) {
- collValue.setReferencedPropertyName( propRef );
- mappings.addPropertyReference( collValue.getOwnerEntityName(), propRef );
- }
- }
- String propRef = collValue.getReferencedPropertyName();
- if ( propRef == null ) {
- keyVal = collValue.getOwner().getIdentifier();
- }
- else {
- keyVal = (KeyValue) collValue.getOwner()
- .getRecursiveProperty( propRef )
- .getValue();
- }
- DependantValue key = new DependantValue( collValue.getCollectionTable(), keyVal );
- key.setTypeName( null );
- Ejb3Column.checkPropertyConsistency( joinColumns, collValue.getOwnerEntityName() );
- key.setNullable( joinColumns.length == 0 || joinColumns[0].isNullable() );
- key.setUpdateable( joinColumns.length == 0 || joinColumns[0].isUpdatable() );
- key.setCascadeDeleteEnabled( cascadeDeleteEnabled );
- collValue.setKey( key );
- ForeignKey fk = property != null ? property.getAnnotation( ForeignKey.class ) : null;
- String fkName = fk != null ? fk.name() : "";
- if ( ! BinderHelper.isDefault( fkName ) ) key.setForeignKeyName( fkName );
- return key;
- }
-
- protected void bindManyToManySecondPass(
- Collection collValue,
- Map persistentClasses,
- Ejb3JoinColumn[] joinColumns,
- Ejb3JoinColumn[] inverseJoinColumns,
- Ejb3Column[] elementColumns,
- boolean isEmbedded,
- XClass collType,
- boolean ignoreNotFound, boolean unique,
- boolean cascadeDeleteEnabled,
- TableBinder associationTableBinder, XProperty property, PropertyHolder parentPropertyHolder,
- String hqlOrderBy, ExtendedMappings mappings
- ) throws MappingException {
-
- PersistentClass collectionEntity = (PersistentClass) persistentClasses.get( collType.getName() );
- boolean isCollectionOfEntities = collectionEntity != null;
- if ( log.isDebugEnabled() ) {
- String path = collValue.getOwnerEntityName() + "." + joinColumns[0].getPropertyName();
- if ( isCollectionOfEntities && unique ) {
- log.debug( "Binding a OneToMany: " + path + " through an association table" );
- }
- else if ( isCollectionOfEntities ) {
- log.debug( "Binding as ManyToMany: " + path );
- }
- else {
- log.debug( "Binding a collection of element: " + path );
- }
- }
- //check for user error
- if ( ! isCollectionOfEntities ) {
- if ( property.isAnnotationPresent( ManyToMany.class ) || property.isAnnotationPresent( OneToMany.class ) ) {
- String path = collValue.getOwnerEntityName() + "." + joinColumns[0].getPropertyName();
- throw new AnnotationException(
- "Use of @OneToMany or @ManyToMany targeting an unmapped class: " + path + "[" + collType + "]"
- );
- }
- else {
- JoinTable joinTableAnn = property.getAnnotation( JoinTable.class );
- if ( joinTableAnn != null && joinTableAnn.inverseJoinColumns().length > 0 ) {
- String path = collValue.getOwnerEntityName() + "." + joinColumns[0].getPropertyName();
- throw new AnnotationException(
- "Use of @JoinTable.inverseJoinColumns targeting an unmapped class: " + path + "[" + collType + "]"
- );
- }
- }
- }
-
- boolean mappedBy = ! BinderHelper.isDefault( joinColumns[0].getMappedBy() );
- if ( mappedBy ) {
- if ( ! isCollectionOfEntities ) {
- StringBuilder error = new StringBuilder( 80 )
- .append(
- "Collection of elements must not have mappedBy or association reference an unmapped entity: "
- )
- .append( collValue.getOwnerEntityName() )
- .append( "." )
- .append( joinColumns[0].getPropertyName() );
- throw new AnnotationException( error.toString() );
- }
- Property otherSideProperty;
- try {
- otherSideProperty = collectionEntity.getRecursiveProperty( joinColumns[0].getMappedBy() );
- }
- catch (MappingException e) {
- StringBuilder error = new StringBuilder( 80 );
- error.append( "mappedBy reference an unknown target entity property: " )
- .append( collType ).append( "." ).append( joinColumns[0].getMappedBy() )
- .append( " in " )
- .append( collValue.getOwnerEntityName() )
- .append( "." )
- .append( joinColumns[0].getPropertyName() );
- throw new AnnotationException( error.toString() );
- }
- Table table;
- if ( otherSideProperty.getValue() instanceof Collection ) {
- //this is a collection on the other side
- table = ( (Collection) otherSideProperty.getValue() ).getCollectionTable();
- }
- else {
- //This is a ToOne with a @JoinTable or a regular property
- table = otherSideProperty.getValue().getTable();
- }
- collValue.setCollectionTable( table );
- String entityName = collectionEntity.getEntityName();
- for ( Ejb3JoinColumn column : joinColumns ) {
- //column.setDefaultColumnHeader( joinColumns[0].getMappedBy() ); //seems not to be used, make sense
- column.setManyToManyOwnerSideEntityName( entityName );
- }
- }
- else {
- //TODO: only for implicit columns?
- //FIXME NamingStrategy
- for ( Ejb3JoinColumn column : joinColumns ) {
- String mappedByProperty = mappings.getFromMappedBy(
- collValue.getOwnerEntityName(), column.getPropertyName()
- );
- Table ownerTable = collValue.getOwner().getTable();
- column.setMappedBy(
- collValue.getOwner().getEntityName(), mappings.getLogicalTableName( ownerTable ),
- mappedByProperty
- );
-// String header = ( mappedByProperty == null ) ? mappings.getLogicalTableName( ownerTable ) : mappedByProperty;
-// column.setDefaultColumnHeader( header );
- }
- if ( StringHelper.isEmpty( associationTableBinder.getName() ) ) {
- //default value
- associationTableBinder.setDefaultName(
- collValue.getOwner().getEntityName(),
- mappings.getLogicalTableName( collValue.getOwner().getTable() ),
- collectionEntity != null ? collectionEntity.getEntityName() : null,
- collectionEntity != null ? mappings.getLogicalTableName( collectionEntity.getTable() ) : null,
- joinColumns[0].getPropertyName()
- );
- }
- collValue.setCollectionTable( associationTableBinder.bind() );
- }
- bindFilters( isCollectionOfEntities );
- bindCollectionSecondPass( collValue, collectionEntity, joinColumns, cascadeDeleteEnabled, property, mappings );
-
- ManyToOne element = null;
- if ( isCollectionOfEntities ) {
- element =
- new ManyToOne( collValue.getCollectionTable() );
- collValue.setElement( element );
- element.setReferencedEntityName( collType.getName() );
- //element.setFetchMode( fetchMode );
- //element.setLazy( fetchMode != FetchMode.JOIN );
- //make the second join non lazy
- element.setFetchMode( FetchMode.JOIN );
- element.setLazy( false );
- element.setIgnoreNotFound( ignoreNotFound );
- if ( StringHelper.isNotEmpty( hqlOrderBy ) ) {
- collValue.setManyToManyOrdering(
- buildOrderByClauseFromHql( hqlOrderBy, collectionEntity, collValue.getRole() )
- );
- }
- ForeignKey fk = property != null ? property.getAnnotation( ForeignKey.class ) : null;
- String fkName = fk != null ? fk.inverseName() : "";
- if ( ! BinderHelper.isDefault( fkName ) ) element.setForeignKeyName( fkName );
- }
- else {
- XClass elementClass;
- AnnotatedClassType classType;
-// Map<String, javax.persistence.Column[]> columnOverrides = PropertyHolderBuilder.buildColumnOverride(
-// property, StringHelper.qualify( collValue.getRole(), "element" )
-// );
- //FIXME the "element" is lost
- PropertyHolder holder = null;
- if ( BinderHelper.PRIMITIVE_NAMES.contains( collType.getName() ) ) {
- classType = AnnotatedClassType.NONE;
- elementClass = null;
- }
- else {
- elementClass = collType;
- classType = mappings.getClassType( elementClass );
-
- holder = PropertyHolderBuilder.buildPropertyHolder(
- collValue,
- collValue.getRole(), // + ".element",
- elementClass,
- property, parentPropertyHolder, mappings
- );
- //force in case of attribute override
- boolean attributeOverride = property.isAnnotationPresent( AttributeOverride.class )
- || property.isAnnotationPresent( AttributeOverrides.class );
- if ( isEmbedded || attributeOverride ) {
- classType = AnnotatedClassType.EMBEDDABLE;
- }
- }
-
- if ( AnnotatedClassType.EMBEDDABLE.equals( classType ) ) {
- EntityBinder entityBinder = new EntityBinder();
- PersistentClass owner = collValue.getOwner();
- boolean isPropertyAnnotated;
- //FIXME support @Access for collection of elements
- //String accessType = access != null ? access.value() : null;
- if ( owner.getIdentifierProperty() != null ) {
- isPropertyAnnotated = owner.getIdentifierProperty().getPropertyAccessorName().equals( "property" );
- }
- else if ( owner.getIdentifierMapper() != null && owner.getIdentifierMapper().getPropertySpan() > 0 ) {
- Property prop = (Property) owner.getIdentifierMapper().getPropertyIterator().next();
- isPropertyAnnotated = prop.getPropertyAccessorName().equals( "property" );
- }
- else {
- throw new AssertionFailure( "Unable to guess collection property accessor name" );
- }
-
- //boolean propertyAccess = embeddable == null || AccessType.PROPERTY.equals( embeddable.access() );
- PropertyData inferredData = new PropertyPreloadedData( "property", "element", elementClass );
- //TODO be smart with isNullable
- Component component = AnnotationBinder.fillComponent(
- holder, inferredData, isPropertyAnnotated, isPropertyAnnotated ? "property" : "field", true,
- entityBinder, false, false,
- true, mappings
- );
-
- collValue.setElement( component );
-
- if ( StringHelper.isNotEmpty( hqlOrderBy ) ) {
- String path = collValue.getOwnerEntityName() + "." + joinColumns[0].getPropertyName();
- String orderBy = buildOrderByClauseFromHql( hqlOrderBy, component, path );
- if ( orderBy != null ) {
- collValue.setOrderBy( orderBy );
- }
- }
- }
- else {
- SimpleValueBinder elementBinder = new SimpleValueBinder();
- elementBinder.setMappings( mappings );
- elementBinder.setReturnedClassName( collType.getName() );
- if ( elementColumns == null || elementColumns.length == 0 ) {
- elementColumns = new Ejb3Column[1];
- Ejb3Column column = new Ejb3Column();
- column.setImplicit( false );
- //not following the spec but more clean
- column.setNullable( true );
- column.setLength( Ejb3Column.DEFAULT_COLUMN_LENGTH );
- column.setLogicalColumnName( Collection.DEFAULT_ELEMENT_COLUMN_NAME );
- //TODO create an EMPTY_JOINS collection
- column.setJoins( new HashMap<String, Join>() );
- column.setMappings( mappings );
- column.bind();
- elementColumns[0] = column;
- }
- //override the table
- for ( Ejb3Column column : elementColumns ) {
- column.setTable( collValue.getCollectionTable() );
- }
- elementBinder.setColumns( elementColumns );
- elementBinder.setType( property, elementClass );
- collValue.setElement( elementBinder.make() );
- }
- }
-
- checkFilterConditions( collValue );
-
- //FIXME: do optional = false
- if ( isCollectionOfEntities ) {
- bindManytoManyInverseFk( collectionEntity, inverseJoinColumns, element, unique, mappings );
- }
-
- }
-
- private static void checkFilterConditions(Collection collValue) {
- //for now it can't happen, but sometime soon...
- if ( ( collValue.getFilterMap().size() != 0 || StringHelper.isNotEmpty( collValue.getWhere() ) ) &&
- collValue.getFetchMode() == FetchMode.JOIN &&
- collValue.getElement().getFetchMode() != FetchMode.JOIN ) {
- throw new MappingException(
- "@ManyToMany or @CollectionOfElements defining filter or where without join fetching "
- + "not valid within collection using join fetching[" + collValue.getRole() + "]"
- );
- }
- }
-
- private static void bindCollectionSecondPass(
- Collection collValue, PersistentClass collectionEntity, Ejb3JoinColumn[] joinColumns,
- boolean cascadeDeleteEnabled, XProperty property,
- ExtendedMappings mappings
- ) {
- BinderHelper.createSyntheticPropertyReference(
- joinColumns, collValue.getOwner(), collectionEntity, collValue, false, mappings
- );
- SimpleValue key = buildCollectionKey( collValue, joinColumns, cascadeDeleteEnabled, property, mappings );
- TableBinder.bindFk( collValue.getOwner(), collectionEntity, joinColumns, key, false, mappings );
- }
-
- public void setCascadeDeleteEnabled(boolean onDeleteCascade) {
- this.cascadeDeleteEnabled = onDeleteCascade;
- }
-
- private String safeCollectionRole() {
- if ( propertyHolder != null ) {
- return propertyHolder.getEntityName() + "." + propertyName;
- }
- else {
- return "";
- }
- }
-
-
- /**
- * bind the inverse FK of a ManyToMany
- * If we are in a mappedBy case, read the columns from the associated
- * colletion element
- * Otherwise delegates to the usual algorithm
- */
- public static void bindManytoManyInverseFk(
- PersistentClass referencedEntity, Ejb3JoinColumn[] columns, SimpleValue value, boolean unique,
- ExtendedMappings mappings
- ) {
- final String mappedBy = columns[0].getMappedBy();
- if ( StringHelper.isNotEmpty( mappedBy ) ) {
- final Property property = referencedEntity.getRecursiveProperty( mappedBy );
- Iterator mappedByColumns;
- if ( property.getValue() instanceof Collection ) {
- mappedByColumns = ( (Collection) property.getValue() ).getKey().getColumnIterator();
- }
- else {
- //find the appropriate reference key, can be in a join
- Iterator joinsIt = referencedEntity.getJoinIterator();
- KeyValue key = null;
- while ( joinsIt.hasNext() ) {
- Join join = (Join) joinsIt.next();
- if ( join.containsProperty( property ) ) {
- key = join.getKey();
- break;
- }
- }
- if ( key == null ) key = property.getPersistentClass().getIdentifier();
- mappedByColumns = key.getColumnIterator();
- }
- while ( mappedByColumns.hasNext() ) {
- Column column = (Column) mappedByColumns.next();
- columns[0].linkValueUsingAColumnCopy( column, value );
- }
- String referencedPropertyName =
- mappings.getPropertyReferencedAssociation(
- "inverse__" + referencedEntity.getEntityName(), mappedBy
- );
- if ( referencedPropertyName != null ) {
- //TODO always a many to one?
- ( (ManyToOne) value ).setReferencedPropertyName( referencedPropertyName );
- mappings.addUniquePropertyReference( referencedEntity.getEntityName(), referencedPropertyName );
- }
- value.createForeignKey();
- }
- else {
- BinderHelper.createSyntheticPropertyReference( columns, referencedEntity, null, value, true, mappings );
- TableBinder.bindFk( referencedEntity, null, columns, value, unique, mappings );
- }
- }
-
- public void setFkJoinColumns(Ejb3JoinColumn[] ejb3JoinColumns) {
- this.fkJoinColumns = ejb3JoinColumns;
- }
-
- public void setExplicitAssociationTable(boolean explicitAssocTable) {
- this.isExplicitAssociationTable = explicitAssocTable;
- }
-
- public void setElementColumns(Ejb3Column[] elementColumns) {
- this.elementColumns = elementColumns;
- }
-
- public void setEmbedded(boolean annotationPresent) {
- this.isEmbedded = annotationPresent;
- }
-
- public void setProperty(XProperty property) {
- this.property = property;
- }
-
- public void setIgnoreNotFound(boolean ignoreNotFound) {
- this.ignoreNotFound = ignoreNotFound;
- }
-
- public void setMapKeyColumns(Ejb3Column[] mapKeyColumns) {
- this.mapKeyColumns = mapKeyColumns;
- }
-
- public void setMapKeyManyToManyColumns(Ejb3JoinColumn[] mapJoinColumns) {
- this.mapKeyManyToManyColumns = mapJoinColumns;
- }
-
- public void setLocalGenerators(HashMap<String, IdGenerator> localGenerators) {
- this.localGenerators = localGenerators;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/CollectionBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/CollectionBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/CollectionBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/CollectionBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,1369 @@
+package org.hibernate.cfg.annotations;
+
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.StringTokenizer;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Embeddable;
+import javax.persistence.FetchType;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.MapKey;
+import javax.persistence.OneToMany;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.FetchMode;
+import org.hibernate.MappingException;
+import org.hibernate.engine.ExecuteUpdateResultCheckStyle;
+import org.hibernate.annotations.BatchSize;
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CollectionId;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterJoinTable;
+import org.hibernate.annotations.FilterJoinTables;
+import org.hibernate.annotations.Filters;
+import org.hibernate.annotations.ForeignKey;
+import org.hibernate.annotations.LazyCollection;
+import org.hibernate.annotations.LazyCollectionOption;
+import org.hibernate.annotations.OrderBy;
+import org.hibernate.annotations.Sort;
+import org.hibernate.annotations.SortType;
+import org.hibernate.annotations.Where;
+import org.hibernate.annotations.WhereJoinTable;
+import org.hibernate.annotations.SQLInsert;
+import org.hibernate.annotations.SQLUpdate;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.SQLDeleteAll;
+import org.hibernate.annotations.Loader;
+import org.hibernate.annotations.Immutable;
+import org.hibernate.annotations.OptimisticLock;
+import org.hibernate.annotations.Persister;
+import org.hibernate.cfg.AnnotatedClassType;
+import org.hibernate.cfg.AnnotationBinder;
+import org.hibernate.cfg.BinderHelper;
+import org.hibernate.cfg.CollectionSecondPass;
+import org.hibernate.cfg.Ejb3Column;
+import org.hibernate.cfg.Ejb3JoinColumn;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.IndexColumn;
+import org.hibernate.cfg.PropertyData;
+import org.hibernate.cfg.PropertyHolder;
+import org.hibernate.cfg.PropertyHolderBuilder;
+import org.hibernate.cfg.PropertyPreloadedData;
+import org.hibernate.cfg.SecondPass;
+import org.hibernate.mapping.Backref;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.DependantValue;
+import org.hibernate.mapping.IdGenerator;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.KeyValue;
+import org.hibernate.mapping.ManyToOne;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Selectable;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.Table;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.util.StringHelper;
+
+/**
+ * Collection binder
+ *
+ * @author inger
+ * @author Emmanuel Bernard
+ */
+public abstract class CollectionBinder {
+
+ private static final Log log = LogFactory.getLog( CollectionBinder.class );
+
+ protected Collection collection;
+ protected String propertyName;
+ PropertyHolder propertyHolder;
+ int batchSize;
+ private String mappedBy;
+ private XClass collectionType;
+ private XClass targetEntity;
+ private ExtendedMappings mappings;
+ private Ejb3JoinColumn[] inverseJoinColumns;
+ private String cascadeStrategy;
+ String cacheConcurrencyStrategy;
+ String cacheRegionName;
+ private boolean oneToMany;
+ protected IndexColumn indexColumn;
+ private String orderBy;
+ protected String hqlOrderBy;
+ private boolean isSorted;
+ private Class comparator;
+ private boolean hasToBeSorted;
+ protected boolean cascadeDeleteEnabled;
+ protected String mapKeyPropertyName;
+ private boolean insertable = true;
+ private boolean updatable = true;
+ private Ejb3JoinColumn[] fkJoinColumns;
+ private boolean isExplicitAssociationTable;
+ private Ejb3Column[] elementColumns;
+ private boolean isEmbedded;
+ private XProperty property;
+ private boolean ignoreNotFound;
+ private TableBinder tableBinder;
+ private Ejb3Column[] mapKeyColumns;
+ private Ejb3JoinColumn[] mapKeyManyToManyColumns;
+ protected HashMap<String, IdGenerator> localGenerators;
+
+ public void setUpdatable(boolean updatable) {
+ this.updatable = updatable;
+ }
+
+ public void setInsertable(boolean insertable) {
+ this.insertable = insertable;
+ }
+
+
+ public void setCascadeStrategy(String cascadeStrategy) {
+ this.cascadeStrategy = cascadeStrategy;
+ }
+
+ public void setPropertyAccessorName(String propertyAccessorName) {
+ this.propertyAccessorName = propertyAccessorName;
+ }
+
+ private String propertyAccessorName;
+
+ public void setInverseJoinColumns(Ejb3JoinColumn[] inverseJoinColumns) {
+ this.inverseJoinColumns = inverseJoinColumns;
+ }
+
+ public void setJoinColumns(Ejb3JoinColumn[] joinColumns) {
+ this.joinColumns = joinColumns;
+ }
+
+ private Ejb3JoinColumn[] joinColumns;
+
+ public void setPropertyHolder(PropertyHolder propertyHolder) {
+ this.propertyHolder = propertyHolder;
+ }
+
+ public void setBatchSize(BatchSize batchSize) {
+ this.batchSize = batchSize == null ? -1 : batchSize.size();
+ }
+
+ public void setEjb3OrderBy(javax.persistence.OrderBy orderByAnn) {
+ if ( orderByAnn != null ) {
+ hqlOrderBy = orderByAnn.value();
+ }
+ }
+
+ public void setSqlOrderBy(OrderBy orderByAnn) {
+ if ( orderByAnn != null ) {
+ if ( ! BinderHelper.isDefault( orderByAnn.clause() ) ) orderBy = orderByAnn.clause();
+ }
+ }
+
+ public void setSort(Sort sortAnn) {
+ if ( sortAnn != null ) {
+ isSorted = ! SortType.UNSORTED.equals( sortAnn.type() );
+ if ( isSorted && SortType.COMPARATOR.equals( sortAnn.type() ) ) {
+ comparator = sortAnn.comparator();
+ }
+ }
+ }
+
+ /**
+ * collection binder factory
+ */
+ public static CollectionBinder getCollectionBinder(
+ String entityName, XProperty property,
+ boolean isIndexed
+ ) {
+ if ( property.isArray() ) {
+ if ( property.getElementClass().isPrimitive() ) {
+ return new PrimitiveArrayBinder();
+ }
+ else {
+ return new ArrayBinder();
+ }
+ }
+ else if ( property.isCollection() ) {
+ //TODO consider using an XClass
+ Class returnedClass = property.getCollectionClass();
+ if ( java.util.Set.class.equals( returnedClass ) ) {
+ return new SetBinder();
+ }
+ else if ( java.util.SortedSet.class.equals( returnedClass ) ) {
+ return new SetBinder( true );
+ }
+ else if ( java.util.Map.class.equals( returnedClass ) ) {
+ return new MapBinder();
+ }
+ else if ( java.util.SortedMap.class.equals( returnedClass ) ) {
+ return new MapBinder(true);
+ }
+ else if ( java.util.Collection.class.equals( returnedClass ) ) {
+ if ( property.isAnnotationPresent( CollectionId.class ) ) {
+ return new IdBagBinder();
+ }
+ else {
+ return new BagBinder();
+ }
+ }
+ else if ( java.util.List.class.equals( returnedClass ) ) {
+ if ( isIndexed ) {
+ return new ListBinder();
+ }
+ else if ( property.isAnnotationPresent( CollectionId.class ) ) {
+ return new IdBagBinder();
+ }
+ else {
+ return new BagBinder();
+ }
+ }
+ else {
+ throw new AnnotationException(
+ returnedClass.getName() + " collection not yet supported: "
+ + StringHelper.qualify( entityName, property.getName() )
+ );
+ }
+ }
+ else {
+ throw new AnnotationException(
+ "Illegal attempt to map a non collection as a @OneToMany, @ManyToMany or @CollectionOfElements: "
+ + StringHelper.qualify( entityName, property.getName() )
+ );
+ }
+ }
+
+ protected CollectionBinder() {
+ }
+
+ protected CollectionBinder(boolean sorted) {
+ this.hasToBeSorted = sorted;
+ }
+
+ public void setMappedBy(String mappedBy) {
+ this.mappedBy = mappedBy;
+ }
+
+ public void setTableBinder(TableBinder tableBinder) {
+ this.tableBinder = tableBinder;
+ }
+
+ public void setCollectionType(XClass collectionType) {
+ this.collectionType = collectionType;
+ }
+
+ public void setTargetEntity(XClass targetEntity) {
+ this.targetEntity = targetEntity;
+ }
+
+ public void setMappings(ExtendedMappings mappings) {
+ this.mappings = mappings;
+ }
+
+ protected abstract Collection createCollection(PersistentClass persistentClass);
+
+ public Collection getCollection() {
+ return collection;
+ }
+
+ public void setPropertyName(String propertyName) {
+ this.propertyName = propertyName;
+ }
+
+ public void bind() {
+ this.collection = createCollection( propertyHolder.getPersistentClass() );
+ log.debug( "Collection role: " + StringHelper.qualify( propertyHolder.getPath(), propertyName ) );
+ collection.setRole( StringHelper.qualify( propertyHolder.getPath(), propertyName ) );
+ collection.setNodeName( propertyName );
+
+ if ( property.isAnnotationPresent( org.hibernate.annotations.MapKey.class ) && mapKeyPropertyName != null ) {
+ throw new AnnotationException(
+ "Cannot mix @javax.persistence.MapKey and @org.hibernate.annotations.MapKey "
+ + "on the same collection: " + StringHelper.qualify(
+ propertyHolder.getPath(), propertyName
+ )
+ );
+ }
+
+ //set laziness
+ defineFetchingStrategy();
+ //collection.setFetchMode( fetchMode );
+ //collection.setLazy( fetchMode == FetchMode.SELECT );
+ collection.setBatchSize( batchSize );
+ if ( orderBy != null && hqlOrderBy != null ) {
+ throw new AnnotationException(
+ "Cannot use sql order by clause in conjunction of EJB3 order by clause: " + safeCollectionRole()
+ );
+ }
+
+ collection.setMutable( ! property.isAnnotationPresent( Immutable.class ) );
+ OptimisticLock lockAnn = property.getAnnotation( OptimisticLock.class );
+ if (lockAnn != null) collection.setOptimisticLocked( ! lockAnn.excluded() );
+ Persister persisterAnn = property.getAnnotation( Persister.class );
+ if ( persisterAnn != null ) collection.setCollectionPersisterClass( persisterAnn.impl() );
+
+ // set ordering
+ if ( orderBy != null ) collection.setOrderBy( orderBy );
+ if ( isSorted ) {
+ collection.setSorted( true );
+ if ( comparator != null ) {
+ try {
+ collection.setComparator( (Comparator) comparator.newInstance() );
+ }
+ catch (ClassCastException e) {
+ throw new AnnotationException(
+ "Comparator not implementing java.util.Comparator class: "
+ + comparator.getName() + "(" + safeCollectionRole() + ")"
+ );
+ }
+ catch (Exception e) {
+ throw new AnnotationException(
+ "Could not instantiate comparator class: "
+ + comparator.getName() + "(" + safeCollectionRole() + ")"
+ );
+ }
+ }
+ }
+ else {
+ if ( hasToBeSorted ) {
+ throw new AnnotationException(
+ "A sorted collection has to define @Sort: "
+ + safeCollectionRole()
+ );
+ }
+ }
+
+ //set cache
+ if ( StringHelper.isNotEmpty( cacheConcurrencyStrategy ) ) {
+ collection.setCacheConcurrencyStrategy( cacheConcurrencyStrategy );
+ collection.setCacheRegionName( cacheRegionName );
+ }
+
+ //SQL overriding
+ SQLInsert sqlInsert = property.getAnnotation( SQLInsert.class );
+ SQLUpdate sqlUpdate = property.getAnnotation( SQLUpdate.class );
+ SQLDelete sqlDelete = property.getAnnotation( SQLDelete.class );
+ SQLDeleteAll sqlDeleteAll = property.getAnnotation( SQLDeleteAll.class );
+ Loader loader = property.getAnnotation( Loader.class );
+ if ( sqlInsert != null ) {
+ collection.setCustomSQLInsert( sqlInsert.sql().trim(), sqlInsert.callable(),
+ ExecuteUpdateResultCheckStyle.parse( sqlInsert.check().toString().toLowerCase() )
+ );
+
+ }
+ if ( sqlUpdate != null ) {
+ collection.setCustomSQLUpdate( sqlUpdate.sql(), sqlUpdate.callable(),
+ ExecuteUpdateResultCheckStyle.parse( sqlUpdate.check().toString().toLowerCase() )
+ );
+ }
+ if ( sqlDelete != null ) {
+ collection.setCustomSQLDelete( sqlDelete.sql(), sqlDelete.callable(),
+ ExecuteUpdateResultCheckStyle.parse( sqlDelete.check().toString().toLowerCase() )
+ );
+ }
+ if ( sqlDeleteAll != null ) {
+ collection.setCustomSQLDeleteAll( sqlDeleteAll.sql(), sqlDeleteAll.callable(),
+ ExecuteUpdateResultCheckStyle.parse( sqlDeleteAll.check().toString().toLowerCase() )
+ );
+ }
+ if ( loader != null ) {
+ collection.setLoaderName( loader.namedQuery() );
+ }
+
+ //work on association
+ boolean isMappedBy = ! BinderHelper.isDefault( mappedBy );
+ collection.setInverse( isMappedBy );
+
+ //many to many may need some second pass informations
+ if ( ! oneToMany && isMappedBy ) {
+ mappings.addMappedBy( getCollectionType().getName(), mappedBy, propertyName );
+ }
+ //TODO reducce tableBinder != null and oneToMany
+ //FIXME collection of elements shouldn't be executed as a secondpass
+ SecondPass sp = getSecondPass(
+ fkJoinColumns,
+ joinColumns,
+ inverseJoinColumns,
+ elementColumns,
+ mapKeyColumns, mapKeyManyToManyColumns, isEmbedded,
+ property, getCollectionType(),
+ ignoreNotFound, oneToMany,
+ tableBinder, mappings
+ );
+ XClass collectionType = getCollectionType();
+ if ( collectionType.isAnnotationPresent( Embeddable.class )
+ || property.isAnnotationPresent( CollectionOfElements.class ) ) {
+ // do it right away, otherwise @ManyToon on composite element call addSecondPass
+ // and raise a ConcurrentModificationException
+ //sp.doSecondPass( CollectionHelper.EMPTY_MAP );
+ mappings.addSecondPass( sp, ! isMappedBy );
+ }
+ else {
+ mappings.addSecondPass( sp, ! isMappedBy );
+ }
+
+ mappings.addCollection( collection );
+
+ //property building
+ PropertyBinder binder = new PropertyBinder();
+ binder.setName( propertyName );
+ binder.setValue( collection );
+ binder.setCascade( cascadeStrategy );
+ if ( cascadeStrategy != null && cascadeStrategy.indexOf( "delete-orphan" ) >= 0 ) {
+ collection.setOrphanDelete( true );
+ }
+ binder.setPropertyAccessorName( propertyAccessorName );
+ binder.setProperty( property );
+ binder.setInsertable( insertable );
+ binder.setUpdatable( updatable );
+ Property prop = binder.make();
+ //we don't care about the join stuffs because the column is on the association table.
+ propertyHolder.addProperty( prop );
+ }
+
+ private void defineFetchingStrategy() {
+ LazyCollection lazy = property.getAnnotation( LazyCollection.class );
+ Fetch fetch = property.getAnnotation( Fetch.class );
+ OneToMany oneToMany = property.getAnnotation( OneToMany.class );
+ ManyToMany manyToMany = property.getAnnotation( ManyToMany.class );
+ CollectionOfElements elements = property.getAnnotation( CollectionOfElements.class );
+ FetchType fetchType;
+ if ( oneToMany != null ) {
+ fetchType = oneToMany.fetch();
+ }
+ else if ( manyToMany != null ) {
+ fetchType = manyToMany.fetch();
+ }
+ else if ( elements != null ) {
+ fetchType = elements.fetch();
+ }
+ else {
+ throw new AssertionFailure(
+ "Define fetch strategy on a property not annotated with @ManyToOne nor @OneToMany nor @CollectionOfElements"
+ );
+ }
+ if ( lazy != null ) {
+ collection.setLazy( ! ( lazy.value() == LazyCollectionOption.FALSE ) );
+ collection.setExtraLazy( lazy.value() == LazyCollectionOption.EXTRA );
+ }
+ else {
+ collection.setLazy( fetchType == FetchType.LAZY );
+ collection.setExtraLazy( false );
+ }
+ if ( fetch != null ) {
+ if ( fetch.value() == org.hibernate.annotations.FetchMode.JOIN ) {
+ collection.setFetchMode( FetchMode.JOIN );
+ collection.setLazy( false );
+ }
+ else if ( fetch.value() == org.hibernate.annotations.FetchMode.SELECT ) {
+ collection.setFetchMode( FetchMode.SELECT );
+ }
+ else if ( fetch.value() == org.hibernate.annotations.FetchMode.SUBSELECT ) {
+ collection.setFetchMode( FetchMode.SELECT );
+ collection.setSubselectLoadable( true );
+ collection.getOwner().setSubselectLoadableCollections( true );
+ }
+ else {
+ throw new AssertionFailure( "Unknown FetchMode: " + fetch.value() );
+ }
+ }
+ else {
+ collection.setFetchMode( AnnotationBinder.getFetchMode( fetchType ) );
+ }
+ }
+
+ private XClass getCollectionType() {
+ if ( AnnotationBinder.isDefault( targetEntity, mappings ) ) {
+ if ( collectionType != null ) {
+ return collectionType;
+ }
+ else {
+ String errorMsg = "Collection has neither generic type or OneToMany.targetEntity() defined: "
+ + safeCollectionRole();
+ throw new AnnotationException( errorMsg );
+ }
+ }
+ else {
+ return targetEntity;
+ }
+ }
+
+ public SecondPass getSecondPass(
+ final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns,
+ final Ejb3JoinColumn[] inverseColumns,
+ final Ejb3Column[] elementColumns,
+ final Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
+ final XProperty property, final XClass collType,
+ final boolean ignoreNotFound, final boolean unique,
+ final TableBinder assocTableBinder, final ExtendedMappings mappings
+ ) {
+
+ return new CollectionSecondPass( mappings, collection ) {
+
+ public void secondPass(java.util.Map persistentClasses, java.util.Map inheritedMetas)
+ throws MappingException {
+ bindStarToManySecondPass(
+ persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns,
+ isEmbedded, property, unique, assocTableBinder, ignoreNotFound, mappings
+ );
+
+ }
+ };
+ }
+
+ /**
+ * return true if it's a Fk, false if it's an association table
+ */
+ protected boolean bindStarToManySecondPass(
+ Map persistentClasses, XClass collType, Ejb3JoinColumn[] fkJoinColumns,
+ Ejb3JoinColumn[] keyColumns, Ejb3JoinColumn[] inverseColumns, Ejb3Column[] elementColumns,
+ boolean isEmbedded,
+ XProperty property, boolean unique,
+ TableBinder associationTableBinder, boolean ignoreNotFound, ExtendedMappings mappings
+ ) {
+ PersistentClass persistentClass = (PersistentClass) persistentClasses.get( collType.getName() );
+ boolean reversePropertyInJoin = false;
+ if ( persistentClass != null && StringHelper.isNotEmpty( this.mappedBy ) ) {
+ try {
+ reversePropertyInJoin = 0 != persistentClass.getJoinNumber(
+ persistentClass.getRecursiveProperty( this.mappedBy )
+ );
+ }
+ catch (MappingException e) {
+ StringBuilder error = new StringBuilder( 80 );
+ error.append( "mappedBy reference an unknown target entity property: " )
+ .append( collType ).append( "." ).append( this.mappedBy )
+ .append( " in " )
+ .append( collection.getOwnerEntityName() )
+ .append( "." )
+ .append( property.getName() );
+ throw new AnnotationException( error.toString() );
+ }
+ }
+ if ( persistentClass != null
+ && ! reversePropertyInJoin
+ && oneToMany
+ && ! this.isExplicitAssociationTable
+ && ( joinColumns[0].isImplicit() && ! BinderHelper.isDefault( this.mappedBy ) //implicit @JoinColumn
+ || ! fkJoinColumns[0].isImplicit() ) //this is an explicit @JoinColumn
+ ) {
+ //this is a Foreign key
+ bindOneToManySecondPass(
+ getCollection(),
+ persistentClasses,
+ fkJoinColumns,
+ collType,
+ cascadeDeleteEnabled,
+ ignoreNotFound, hqlOrderBy,
+ mappings
+ );
+ return true;
+ }
+ else {
+ //this is an association table
+ bindManyToManySecondPass(
+ this.collection,
+ persistentClasses,
+ keyColumns,
+ inverseColumns,
+ elementColumns,
+ isEmbedded, collType,
+ ignoreNotFound, unique,
+ cascadeDeleteEnabled,
+ associationTableBinder, property, propertyHolder, hqlOrderBy, mappings
+ );
+ return false;
+ }
+ }
+
+ protected void bindOneToManySecondPass(
+ Collection collection, Map persistentClasses, Ejb3JoinColumn[] fkJoinColumns,
+ XClass collectionType,
+ boolean cascadeDeleteEnabled, boolean ignoreNotFound, String hqlOrderBy, ExtendedMappings extendedMappings
+ ) {
+ if ( log.isDebugEnabled() ) {
+ log.debug(
+ "Binding a OneToMany: " + propertyHolder.getEntityName() + "." + propertyName + " through a foreign key"
+ );
+ }
+ org.hibernate.mapping.OneToMany oneToMany = new org.hibernate.mapping.OneToMany( collection.getOwner() );
+ collection.setElement( oneToMany );
+ oneToMany.setReferencedEntityName( collectionType.getName() );
+ oneToMany.setIgnoreNotFound( ignoreNotFound );
+
+ String assocClass = oneToMany.getReferencedEntityName();
+ PersistentClass associatedClass = (PersistentClass) persistentClasses.get( assocClass );
+ String orderBy = buildOrderByClauseFromHql( hqlOrderBy, associatedClass, collection.getRole() );
+ if ( orderBy != null ) collection.setOrderBy( orderBy );
+ if ( mappings == null ) {
+ throw new AssertionFailure(
+ "CollectionSecondPass for oneToMany should not be called with null mappings"
+ );
+ }
+ Map<String, Join> joins = mappings.getJoins( assocClass );
+ if ( associatedClass == null ) {
+ throw new MappingException(
+ "Association references unmapped class: " + assocClass
+ );
+ }
+ oneToMany.setAssociatedClass( associatedClass );
+ for ( Ejb3JoinColumn column : fkJoinColumns ) {
+ column.setPersistentClass( associatedClass, joins );
+ column.setJoins( joins );
+ collection.setCollectionTable( column.getTable() );
+ }
+ log.info(
+ "Mapping collection: " + collection.getRole() + " -> " + collection.getCollectionTable().getName()
+ );
+ bindFilters(false);
+ bindCollectionSecondPass( collection, null, fkJoinColumns, cascadeDeleteEnabled, property, mappings );
+ if ( !collection.isInverse()
+ && !collection.getKey().isNullable() ) {
+ // for non-inverse one-to-many, with a not-null fk, add a backref!
+ String entityName = oneToMany.getReferencedEntityName();
+ PersistentClass referenced = mappings.getClass( entityName );
+ Backref prop = new Backref();
+ prop.setName( '_' + fkJoinColumns[0].getPropertyName() + "Backref" );
+ prop.setUpdateable( false );
+ prop.setSelectable( false );
+ prop.setCollectionRole( collection.getRole() );
+ prop.setEntityName( collection.getOwner().getEntityName() );
+ prop.setValue( collection.getKey() );
+ referenced.addProperty( prop );
+ }
+ }
+
+ private void bindFilters(boolean hasAssociationTable) {
+ Filter simpleFilter = property.getAnnotation( Filter.class );
+ //set filtering
+ //test incompatible choices
+ //if ( StringHelper.isNotEmpty( where ) ) collection.setWhere( where );
+ if (simpleFilter != null) {
+ if (hasAssociationTable) {
+ collection.addManyToManyFilter( simpleFilter.name(), getCondition( simpleFilter ) );
+ }
+ else {
+ collection.addFilter( simpleFilter.name(), getCondition( simpleFilter ) );
+ }
+ }
+ Filters filters = property.getAnnotation( Filters.class );
+ if (filters != null) {
+ for ( Filter filter : filters.value() ) {
+ if (hasAssociationTable) {
+ collection.addManyToManyFilter( filter.name(), getCondition( filter ) );
+ }
+ else {
+ collection.addFilter( filter.name(), getCondition( filter ) );
+ }
+ }
+ }
+ FilterJoinTable simpleFilterJoinTable = property.getAnnotation( FilterJoinTable.class );
+ if (simpleFilterJoinTable != null) {
+ if (hasAssociationTable) {
+ collection.addFilter( simpleFilterJoinTable.name(), getCondition( simpleFilterJoinTable ) );
+ }
+ else {
+ throw new AnnotationException(
+ "Illegal use of @FilterJoinTable on an association without join table:"
+ + StringHelper.qualify( propertyHolder.getPath(), propertyName )
+ );
+ }
+ }
+ FilterJoinTables filterJoinTables = property.getAnnotation( FilterJoinTables.class );
+ if (filterJoinTables != null) {
+ for ( FilterJoinTable filter : filterJoinTables.value() ) {
+ if (hasAssociationTable) {
+ collection.addFilter( filter.name(), getCondition( filter ) );
+ }
+ else {
+ throw new AnnotationException(
+ "Illegal use of @FilterJoinTable on an association without join table:"
+ + StringHelper.qualify( propertyHolder.getPath(), propertyName )
+ );
+ }
+ }
+ }
+
+ Where where = property.getAnnotation( Where.class );
+ String whereClause = where == null ? null : where.clause();
+ if ( StringHelper.isNotEmpty( whereClause ) ) {
+ if (hasAssociationTable) {
+ collection.setManyToManyWhere( whereClause );
+ }
+ else {
+ collection.setWhere( whereClause );
+ }
+ }
+
+ WhereJoinTable whereJoinTable = property.getAnnotation( WhereJoinTable.class );
+ String whereJoinTableClause = whereJoinTable == null ? null : whereJoinTable.clause();
+ if ( StringHelper.isNotEmpty( whereJoinTableClause ) ) {
+ if (hasAssociationTable) {
+ collection.setWhere( whereJoinTableClause );
+ }
+ else {
+ throw new AnnotationException(
+ "Illegal use of @WhereJoinTable on an association without join table:"
+ + StringHelper.qualify( propertyHolder.getPath(), propertyName )
+ );
+ }
+ }
+// This cannot happen in annotations since the second fetch is hardcoded to join
+// if ( ( ! collection.getManyToManyFilterMap().isEmpty() || collection.getManyToManyWhere() != null ) &&
+// collection.getFetchMode() == FetchMode.JOIN &&
+// collection.getElement().getFetchMode() != FetchMode.JOIN ) {
+// throw new MappingException(
+// "association with join table defining filter or where without join fetching " +
+// "not valid within collection using join fetching [" + collection.getRole() + "]"
+// );
+// }
+ }
+
+ private String getCondition(FilterJoinTable filter) {
+ //set filtering
+ String name = filter.name();
+ String cond = filter.condition();
+ return getCondition( cond, name );
+ }
+
+ private String getCondition(Filter filter) {
+ //set filtering
+ String name = filter.name();
+ String cond = filter.condition();
+ return getCondition( cond, name );
+ }
+
+ private String getCondition(String cond, String name) {
+ if ( BinderHelper.isDefault( cond ) ) {
+ cond = mappings.getFilterDefinition( name ).getDefaultFilterCondition();
+ if ( StringHelper.isEmpty( cond ) ) {
+ throw new AnnotationException(
+ "no filter condition found for filter " + name + " in "
+ + StringHelper.qualify( propertyHolder.getPath(), propertyName )
+ );
+ }
+ }
+ return cond;
+ }
+
+ public void setCache(Cache cacheAnn) {
+ if ( cacheAnn != null ) {
+ cacheRegionName = BinderHelper.isDefault( cacheAnn.region() ) ? null : cacheAnn.region();
+ cacheConcurrencyStrategy = EntityBinder.getCacheConcurrencyStrategy( cacheAnn.usage() );
+ }
+ else {
+ cacheConcurrencyStrategy = null;
+ cacheRegionName = null;
+ }
+ }
+
+ public void setOneToMany(boolean oneToMany) {
+ this.oneToMany = oneToMany;
+ }
+
+ public void setIndexColumn(IndexColumn indexColumn) {
+ this.indexColumn = indexColumn;
+ }
+
+ public void setMapKey(MapKey key) {
+ if ( key != null ) {
+ mapKeyPropertyName = key.name();
+ }
+ }
+
+ private static String buildOrderByClauseFromHql(String hqlOrderBy, PersistentClass associatedClass, String role) {
+ String orderByString = null;
+ if ( hqlOrderBy != null ) {
+ List<String> properties = new ArrayList<String>();
+ List<String> ordering = new ArrayList<String>();
+ StringBuilder orderByBuffer = new StringBuilder();
+ if ( hqlOrderBy.length() == 0 ) {
+ //order by id
+ Iterator it = associatedClass.getIdentifier().getColumnIterator();
+ while ( it.hasNext() ) {
+ Selectable col = (Selectable) it.next();
+ orderByBuffer.append( col.getText() ).append( " asc" ).append( ", " );
+ }
+ }
+ else {
+ StringTokenizer st = new StringTokenizer( hqlOrderBy, " ,", false );
+ String currentOrdering = null;
+ //FIXME make this code decent
+ while ( st.hasMoreTokens() ) {
+ String token = st.nextToken();
+ if ( isNonPropertyToken( token ) ) {
+ if ( currentOrdering != null ) {
+ throw new AnnotationException(
+ "Error while parsing HQL orderBy clause: " + hqlOrderBy
+ + " (" + role + ")"
+ );
+ }
+ currentOrdering = token;
+ }
+ else {
+ //Add ordering of the previous
+ if ( currentOrdering == null ) {
+ //default ordering
+ ordering.add( "asc" );
+ }
+ else {
+ ordering.add( currentOrdering );
+ currentOrdering = null;
+ }
+ properties.add( token );
+ }
+ }
+ ordering.remove( 0 ); //first one is the algorithm starter
+ // add last one ordering
+ if ( currentOrdering == null ) {
+ //default ordering
+ ordering.add( "asc" );
+ }
+ else {
+ ordering.add( currentOrdering );
+ currentOrdering = null;
+ }
+ int index = 0;
+
+ for ( String property : properties ) {
+ Property p = BinderHelper.findPropertyByName( associatedClass, property );
+ if ( p == null ) {
+ throw new AnnotationException(
+ "property from @OrderBy clause not found: "
+ + associatedClass.getEntityName() + "." + property
+ );
+ }
+ PersistentClass pc = p.getPersistentClass();
+ String table;
+ if (pc != associatedClass) {
+ table = pc.getTable().getQuotedName() + ".";
+ }
+ else {
+ table = "";
+ }
+ Iterator propertyColumns = p.getColumnIterator();
+ while ( propertyColumns.hasNext() ) {
+ Selectable column = (Selectable) propertyColumns.next();
+ orderByBuffer.append( table )
+ .append( column.getText() )
+ .append( " " )
+ .append( ordering.get( index ) )
+ .append( ", " );
+ }
+ index++;
+ }
+ }
+ orderByString = orderByBuffer.substring( 0, orderByBuffer.length() - 2 );
+ }
+ return orderByString;
+ }
+
+ private static String buildOrderByClauseFromHql(String hqlOrderBy, Component component, String role) {
+ String orderByString = null;
+ if ( hqlOrderBy != null ) {
+ List<String> properties = new ArrayList<String>();
+ List<String> ordering = new ArrayList<String>();
+ StringBuilder orderByBuffer = new StringBuilder();
+ if ( hqlOrderBy.length() == 0 ) {
+ //TODO : Check that. Maybe order by key for maps
+ }
+ else {
+ StringTokenizer st = new StringTokenizer( hqlOrderBy, " ,", false );
+ String currentOrdering = null;
+ //FIXME make this code decent
+ while ( st.hasMoreTokens() ) {
+ String token = st.nextToken();
+ if ( isNonPropertyToken( token ) ) {
+ if ( currentOrdering != null ) {
+ throw new AnnotationException(
+ "Error while parsing HQL orderBy clause: " + hqlOrderBy
+ + " (" + role + ")"
+ );
+ }
+ currentOrdering = token;
+ }
+ else {
+ //Add ordering of the previous
+ if ( currentOrdering == null ) {
+ //default ordering
+ ordering.add( "asc" );
+ }
+ else {
+ ordering.add( currentOrdering );
+ currentOrdering = null;
+ }
+ properties.add( token );
+ }
+ }
+ ordering.remove( 0 ); //first one is the algorithm starter
+ // add last one ordering
+ if ( currentOrdering == null ) {
+ //default ordering
+ ordering.add( "asc" );
+ }
+ else {
+ ordering.add( currentOrdering );
+ currentOrdering = null;
+ }
+ int index = 0;
+
+ for ( String property : properties ) {
+ Property p = component.getProperty( property );
+ if ( p == null ) {
+ throw new AnnotationException(
+ "property from @OrderBy clause not found: "
+ + role + "." + property
+ );
+ }
+
+ Iterator propertyColumns = p.getColumnIterator();
+ while ( propertyColumns.hasNext() ) {
+ Selectable column = (Selectable) propertyColumns.next();
+ orderByBuffer.append( column.getText() )
+ .append( " " )
+ .append( ordering.get( index ) )
+ .append( ", " );
+ }
+ index++;
+ }
+
+ if ( orderByBuffer.length() >= 2 ) {
+ orderByString = orderByBuffer.substring( 0, orderByBuffer.length() - 2 );
+ }
+ }
+ }
+ return orderByString;
+ }
+
+ private static boolean isNonPropertyToken(String token) {
+ if ( " ".equals( token ) ) return true;
+ if ( ",".equals( token ) ) return true;
+ if ( token.equalsIgnoreCase( "desc" ) ) return true;
+ if ( token.equalsIgnoreCase( "asc" ) ) return true;
+ return false;
+ }
+
+ private static SimpleValue buildCollectionKey(
+ Collection collValue, Ejb3JoinColumn[] joinColumns, boolean cascadeDeleteEnabled,
+ XProperty property, ExtendedMappings mappings
+ ) {
+ //binding key reference using column
+ KeyValue keyVal;
+ //give a chance to override the referenced property name
+ //has to do that here because the referencedProperty creation happens in a FKSecondPass for Many to one yuk!
+ if ( joinColumns.length > 0 && StringHelper.isNotEmpty( joinColumns[0].getMappedBy() ) ) {
+ String entityName = joinColumns[0].getManyToManyOwnerSideEntityName() != null ?
+ "inverse__" + joinColumns[0].getManyToManyOwnerSideEntityName() :
+ joinColumns[0].getPropertyHolder().getEntityName();
+ String propRef = mappings.getPropertyReferencedAssociation(
+ entityName,
+ joinColumns[0].getMappedBy()
+ );
+ if ( propRef != null ) {
+ collValue.setReferencedPropertyName( propRef );
+ mappings.addPropertyReference( collValue.getOwnerEntityName(), propRef );
+ }
+ }
+ String propRef = collValue.getReferencedPropertyName();
+ if ( propRef == null ) {
+ keyVal = collValue.getOwner().getIdentifier();
+ }
+ else {
+ keyVal = (KeyValue) collValue.getOwner()
+ .getRecursiveProperty( propRef )
+ .getValue();
+ }
+ DependantValue key = new DependantValue( collValue.getCollectionTable(), keyVal );
+ key.setTypeName( null );
+ Ejb3Column.checkPropertyConsistency( joinColumns, collValue.getOwnerEntityName() );
+ key.setNullable( joinColumns.length == 0 || joinColumns[0].isNullable() );
+ key.setUpdateable( joinColumns.length == 0 || joinColumns[0].isUpdatable() );
+ key.setCascadeDeleteEnabled( cascadeDeleteEnabled );
+ collValue.setKey( key );
+ ForeignKey fk = property != null ? property.getAnnotation( ForeignKey.class ) : null;
+ String fkName = fk != null ? fk.name() : "";
+ if ( ! BinderHelper.isDefault( fkName ) ) key.setForeignKeyName( fkName );
+ return key;
+ }
+
+ protected void bindManyToManySecondPass(
+ Collection collValue,
+ Map persistentClasses,
+ Ejb3JoinColumn[] joinColumns,
+ Ejb3JoinColumn[] inverseJoinColumns,
+ Ejb3Column[] elementColumns,
+ boolean isEmbedded,
+ XClass collType,
+ boolean ignoreNotFound, boolean unique,
+ boolean cascadeDeleteEnabled,
+ TableBinder associationTableBinder, XProperty property, PropertyHolder parentPropertyHolder,
+ String hqlOrderBy, ExtendedMappings mappings
+ ) throws MappingException {
+
+ PersistentClass collectionEntity = (PersistentClass) persistentClasses.get( collType.getName() );
+ boolean isCollectionOfEntities = collectionEntity != null;
+ if ( log.isDebugEnabled() ) {
+ String path = collValue.getOwnerEntityName() + "." + joinColumns[0].getPropertyName();
+ if ( isCollectionOfEntities && unique ) {
+ log.debug( "Binding a OneToMany: " + path + " through an association table" );
+ }
+ else if ( isCollectionOfEntities ) {
+ log.debug( "Binding as ManyToMany: " + path );
+ }
+ else {
+ log.debug( "Binding a collection of element: " + path );
+ }
+ }
+ //check for user error
+ if ( ! isCollectionOfEntities ) {
+ if ( property.isAnnotationPresent( ManyToMany.class ) || property.isAnnotationPresent( OneToMany.class ) ) {
+ String path = collValue.getOwnerEntityName() + "." + joinColumns[0].getPropertyName();
+ throw new AnnotationException(
+ "Use of @OneToMany or @ManyToMany targeting an unmapped class: " + path + "[" + collType + "]"
+ );
+ }
+ else {
+ JoinTable joinTableAnn = property.getAnnotation( JoinTable.class );
+ if ( joinTableAnn != null && joinTableAnn.inverseJoinColumns().length > 0 ) {
+ String path = collValue.getOwnerEntityName() + "." + joinColumns[0].getPropertyName();
+ throw new AnnotationException(
+ "Use of @JoinTable.inverseJoinColumns targeting an unmapped class: " + path + "[" + collType + "]"
+ );
+ }
+ }
+ }
+
+ boolean mappedBy = ! BinderHelper.isDefault( joinColumns[0].getMappedBy() );
+ if ( mappedBy ) {
+ if ( ! isCollectionOfEntities ) {
+ StringBuilder error = new StringBuilder( 80 )
+ .append(
+ "Collection of elements must not have mappedBy or association reference an unmapped entity: "
+ )
+ .append( collValue.getOwnerEntityName() )
+ .append( "." )
+ .append( joinColumns[0].getPropertyName() );
+ throw new AnnotationException( error.toString() );
+ }
+ Property otherSideProperty;
+ try {
+ otherSideProperty = collectionEntity.getRecursiveProperty( joinColumns[0].getMappedBy() );
+ }
+ catch (MappingException e) {
+ StringBuilder error = new StringBuilder( 80 );
+ error.append( "mappedBy reference an unknown target entity property: " )
+ .append( collType ).append( "." ).append( joinColumns[0].getMappedBy() )
+ .append( " in " )
+ .append( collValue.getOwnerEntityName() )
+ .append( "." )
+ .append( joinColumns[0].getPropertyName() );
+ throw new AnnotationException( error.toString() );
+ }
+ Table table;
+ if ( otherSideProperty.getValue() instanceof Collection ) {
+ //this is a collection on the other side
+ table = ( (Collection) otherSideProperty.getValue() ).getCollectionTable();
+ }
+ else {
+ //This is a ToOne with a @JoinTable or a regular property
+ table = otherSideProperty.getValue().getTable();
+ }
+ collValue.setCollectionTable( table );
+ String entityName = collectionEntity.getEntityName();
+ for ( Ejb3JoinColumn column : joinColumns ) {
+ //column.setDefaultColumnHeader( joinColumns[0].getMappedBy() ); //seems not to be used, make sense
+ column.setManyToManyOwnerSideEntityName( entityName );
+ }
+ }
+ else {
+ //TODO: only for implicit columns?
+ //FIXME NamingStrategy
+ for ( Ejb3JoinColumn column : joinColumns ) {
+ String mappedByProperty = mappings.getFromMappedBy(
+ collValue.getOwnerEntityName(), column.getPropertyName()
+ );
+ Table ownerTable = collValue.getOwner().getTable();
+ column.setMappedBy(
+ collValue.getOwner().getEntityName(), mappings.getLogicalTableName( ownerTable ),
+ mappedByProperty
+ );
+// String header = ( mappedByProperty == null ) ? mappings.getLogicalTableName( ownerTable ) : mappedByProperty;
+// column.setDefaultColumnHeader( header );
+ }
+ if ( StringHelper.isEmpty( associationTableBinder.getName() ) ) {
+ //default value
+ associationTableBinder.setDefaultName(
+ collValue.getOwner().getEntityName(),
+ mappings.getLogicalTableName( collValue.getOwner().getTable() ),
+ collectionEntity != null ? collectionEntity.getEntityName() : null,
+ collectionEntity != null ? mappings.getLogicalTableName( collectionEntity.getTable() ) : null,
+ joinColumns[0].getPropertyName()
+ );
+ }
+ collValue.setCollectionTable( associationTableBinder.bind() );
+ }
+ bindFilters( isCollectionOfEntities );
+ bindCollectionSecondPass( collValue, collectionEntity, joinColumns, cascadeDeleteEnabled, property, mappings );
+
+ ManyToOne element = null;
+ if ( isCollectionOfEntities ) {
+ element =
+ new ManyToOne( collValue.getCollectionTable() );
+ collValue.setElement( element );
+ element.setReferencedEntityName( collType.getName() );
+ //element.setFetchMode( fetchMode );
+ //element.setLazy( fetchMode != FetchMode.JOIN );
+ //make the second join non lazy
+ element.setFetchMode( FetchMode.JOIN );
+ element.setLazy( false );
+ element.setIgnoreNotFound( ignoreNotFound );
+ if ( StringHelper.isNotEmpty( hqlOrderBy ) ) {
+ collValue.setManyToManyOrdering(
+ buildOrderByClauseFromHql( hqlOrderBy, collectionEntity, collValue.getRole() )
+ );
+ }
+ ForeignKey fk = property != null ? property.getAnnotation( ForeignKey.class ) : null;
+ String fkName = fk != null ? fk.inverseName() : "";
+ if ( ! BinderHelper.isDefault( fkName ) ) element.setForeignKeyName( fkName );
+ }
+ else {
+ XClass elementClass;
+ AnnotatedClassType classType;
+// Map<String, javax.persistence.Column[]> columnOverrides = PropertyHolderBuilder.buildColumnOverride(
+// property, StringHelper.qualify( collValue.getRole(), "element" )
+// );
+ //FIXME the "element" is lost
+ PropertyHolder holder = null;
+ if ( BinderHelper.PRIMITIVE_NAMES.contains( collType.getName() ) ) {
+ classType = AnnotatedClassType.NONE;
+ elementClass = null;
+ }
+ else {
+ elementClass = collType;
+ classType = mappings.getClassType( elementClass );
+
+ holder = PropertyHolderBuilder.buildPropertyHolder(
+ collValue,
+ collValue.getRole(), // + ".element",
+ elementClass,
+ property, parentPropertyHolder, mappings
+ );
+ //force in case of attribute override
+ boolean attributeOverride = property.isAnnotationPresent( AttributeOverride.class )
+ || property.isAnnotationPresent( AttributeOverrides.class );
+ if ( isEmbedded || attributeOverride ) {
+ classType = AnnotatedClassType.EMBEDDABLE;
+ }
+ }
+
+ if ( AnnotatedClassType.EMBEDDABLE.equals( classType ) ) {
+ EntityBinder entityBinder = new EntityBinder();
+ PersistentClass owner = collValue.getOwner();
+ boolean isPropertyAnnotated;
+ //FIXME support @Access for collection of elements
+ //String accessType = access != null ? access.value() : null;
+ if ( owner.getIdentifierProperty() != null ) {
+ isPropertyAnnotated = owner.getIdentifierProperty().getPropertyAccessorName().equals( "property" );
+ }
+ else if ( owner.getIdentifierMapper() != null && owner.getIdentifierMapper().getPropertySpan() > 0 ) {
+ Property prop = (Property) owner.getIdentifierMapper().getPropertyIterator().next();
+ isPropertyAnnotated = prop.getPropertyAccessorName().equals( "property" );
+ }
+ else {
+ throw new AssertionFailure( "Unable to guess collection property accessor name" );
+ }
+
+ //boolean propertyAccess = embeddable == null || AccessType.PROPERTY.equals( embeddable.access() );
+ PropertyData inferredData = new PropertyPreloadedData( "property", "element", elementClass );
+ //TODO be smart with isNullable
+ Component component = AnnotationBinder.fillComponent(
+ holder, inferredData, isPropertyAnnotated, isPropertyAnnotated ? "property" : "field", true,
+ entityBinder, false, false,
+ true, mappings
+ );
+
+ collValue.setElement( component );
+
+ if ( StringHelper.isNotEmpty( hqlOrderBy ) ) {
+ String path = collValue.getOwnerEntityName() + "." + joinColumns[0].getPropertyName();
+ String orderBy = buildOrderByClauseFromHql( hqlOrderBy, component, path );
+ if ( orderBy != null ) {
+ collValue.setOrderBy( orderBy );
+ }
+ }
+ }
+ else {
+ SimpleValueBinder elementBinder = new SimpleValueBinder();
+ elementBinder.setMappings( mappings );
+ elementBinder.setReturnedClassName( collType.getName() );
+ if ( elementColumns == null || elementColumns.length == 0 ) {
+ elementColumns = new Ejb3Column[1];
+ Ejb3Column column = new Ejb3Column();
+ column.setImplicit( false );
+ //not following the spec but more clean
+ column.setNullable( true );
+ column.setLength( Ejb3Column.DEFAULT_COLUMN_LENGTH );
+ column.setLogicalColumnName( Collection.DEFAULT_ELEMENT_COLUMN_NAME );
+ //TODO create an EMPTY_JOINS collection
+ column.setJoins( new HashMap<String, Join>() );
+ column.setMappings( mappings );
+ column.bind();
+ elementColumns[0] = column;
+ }
+ //override the table
+ for ( Ejb3Column column : elementColumns ) {
+ column.setTable( collValue.getCollectionTable() );
+ }
+ elementBinder.setColumns( elementColumns );
+ elementBinder.setType( property, elementClass );
+ collValue.setElement( elementBinder.make() );
+ }
+ }
+
+ checkFilterConditions( collValue );
+
+ //FIXME: do optional = false
+ if ( isCollectionOfEntities ) {
+ bindManytoManyInverseFk( collectionEntity, inverseJoinColumns, element, unique, mappings );
+ }
+
+ }
+
+ private static void checkFilterConditions(Collection collValue) {
+ //for now it can't happen, but sometime soon...
+ if ( ( collValue.getFilterMap().size() != 0 || StringHelper.isNotEmpty( collValue.getWhere() ) ) &&
+ collValue.getFetchMode() == FetchMode.JOIN &&
+ collValue.getElement().getFetchMode() != FetchMode.JOIN ) {
+ throw new MappingException(
+ "@ManyToMany or @CollectionOfElements defining filter or where without join fetching "
+ + "not valid within collection using join fetching[" + collValue.getRole() + "]"
+ );
+ }
+ }
+
+ private static void bindCollectionSecondPass(
+ Collection collValue, PersistentClass collectionEntity, Ejb3JoinColumn[] joinColumns,
+ boolean cascadeDeleteEnabled, XProperty property,
+ ExtendedMappings mappings
+ ) {
+ BinderHelper.createSyntheticPropertyReference(
+ joinColumns, collValue.getOwner(), collectionEntity, collValue, false, mappings
+ );
+ SimpleValue key = buildCollectionKey( collValue, joinColumns, cascadeDeleteEnabled, property, mappings );
+ TableBinder.bindFk( collValue.getOwner(), collectionEntity, joinColumns, key, false, mappings );
+ }
+
+ public void setCascadeDeleteEnabled(boolean onDeleteCascade) {
+ this.cascadeDeleteEnabled = onDeleteCascade;
+ }
+
+ private String safeCollectionRole() {
+ if ( propertyHolder != null ) {
+ return propertyHolder.getEntityName() + "." + propertyName;
+ }
+ else {
+ return "";
+ }
+ }
+
+
+ /**
+ * bind the inverse FK of a ManyToMany
+ * If we are in a mappedBy case, read the columns from the associated
+ * colletion element
+ * Otherwise delegates to the usual algorithm
+ */
+ public static void bindManytoManyInverseFk(
+ PersistentClass referencedEntity, Ejb3JoinColumn[] columns, SimpleValue value, boolean unique,
+ ExtendedMappings mappings
+ ) {
+ final String mappedBy = columns[0].getMappedBy();
+ if ( StringHelper.isNotEmpty( mappedBy ) ) {
+ final Property property = referencedEntity.getRecursiveProperty( mappedBy );
+ Iterator mappedByColumns;
+ if ( property.getValue() instanceof Collection ) {
+ mappedByColumns = ( (Collection) property.getValue() ).getKey().getColumnIterator();
+ }
+ else {
+ //find the appropriate reference key, can be in a join
+ Iterator joinsIt = referencedEntity.getJoinIterator();
+ KeyValue key = null;
+ while ( joinsIt.hasNext() ) {
+ Join join = (Join) joinsIt.next();
+ if ( join.containsProperty( property ) ) {
+ key = join.getKey();
+ break;
+ }
+ }
+ if ( key == null ) key = property.getPersistentClass().getIdentifier();
+ mappedByColumns = key.getColumnIterator();
+ }
+ while ( mappedByColumns.hasNext() ) {
+ Column column = (Column) mappedByColumns.next();
+ columns[0].linkValueUsingAColumnCopy( column, value );
+ }
+ String referencedPropertyName =
+ mappings.getPropertyReferencedAssociation(
+ "inverse__" + referencedEntity.getEntityName(), mappedBy
+ );
+ if ( referencedPropertyName != null ) {
+ //TODO always a many to one?
+ ( (ManyToOne) value ).setReferencedPropertyName( referencedPropertyName );
+ mappings.addUniquePropertyReference( referencedEntity.getEntityName(), referencedPropertyName );
+ }
+ value.createForeignKey();
+ }
+ else {
+ BinderHelper.createSyntheticPropertyReference( columns, referencedEntity, null, value, true, mappings );
+ TableBinder.bindFk( referencedEntity, null, columns, value, unique, mappings );
+ }
+ }
+
+ public void setFkJoinColumns(Ejb3JoinColumn[] ejb3JoinColumns) {
+ this.fkJoinColumns = ejb3JoinColumns;
+ }
+
+ public void setExplicitAssociationTable(boolean explicitAssocTable) {
+ this.isExplicitAssociationTable = explicitAssocTable;
+ }
+
+ public void setElementColumns(Ejb3Column[] elementColumns) {
+ this.elementColumns = elementColumns;
+ }
+
+ public void setEmbedded(boolean annotationPresent) {
+ this.isEmbedded = annotationPresent;
+ }
+
+ public void setProperty(XProperty property) {
+ this.property = property;
+ }
+
+ public void setIgnoreNotFound(boolean ignoreNotFound) {
+ this.ignoreNotFound = ignoreNotFound;
+ }
+
+ public void setMapKeyColumns(Ejb3Column[] mapKeyColumns) {
+ this.mapKeyColumns = mapKeyColumns;
+ }
+
+ public void setMapKeyManyToManyColumns(Ejb3JoinColumn[] mapJoinColumns) {
+ this.mapKeyManyToManyColumns = mapJoinColumns;
+ }
+
+ public void setLocalGenerators(HashMap<String, IdGenerator> localGenerators) {
+ this.localGenerators = localGenerators;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/EntityBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,798 +0,0 @@
-//$Id$
-package org.hibernate.cfg.annotations;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.PrimaryKeyJoinColumn;
-import javax.persistence.SecondaryTable;
-import javax.persistence.SecondaryTables;
-import javax.persistence.UniqueConstraint;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.MappingException;
-import org.hibernate.EntityMode;
-import org.hibernate.annotations.AccessType;
-import org.hibernate.annotations.BatchSize;
-import org.hibernate.annotations.Cache;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
-import org.hibernate.annotations.ForceDiscriminator;
-import org.hibernate.annotations.Loader;
-import org.hibernate.annotations.OptimisticLockType;
-import org.hibernate.annotations.PolymorphismType;
-import org.hibernate.annotations.Proxy;
-import org.hibernate.annotations.SQLDelete;
-import org.hibernate.annotations.SQLInsert;
-import org.hibernate.annotations.SQLUpdate;
-import org.hibernate.annotations.Tables;
-import org.hibernate.annotations.Where;
-import org.hibernate.annotations.SQLDeleteAll;
-import org.hibernate.annotations.Tuplizers;
-import org.hibernate.annotations.Tuplizer;
-import org.hibernate.annotations.Immutable;
-import org.hibernate.annotations.FetchMode;
-import org.hibernate.annotations.Persister;
-import org.hibernate.cache.CacheFactory;
-import org.hibernate.cfg.AnnotationBinder;
-import org.hibernate.cfg.BinderHelper;
-import org.hibernate.cfg.Ejb3JoinColumn;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.InheritanceState;
-import org.hibernate.cfg.PropertyHolder;
-import org.hibernate.engine.Versioning;
-import org.hibernate.engine.ExecuteUpdateResultCheckStyle;
-import org.hibernate.engine.FilterDefinition;
-import org.hibernate.mapping.DependantValue;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.RootClass;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.Table;
-import org.hibernate.mapping.TableOwner;
-import org.hibernate.mapping.Value;
-import org.hibernate.annotations.common.reflection.XAnnotatedElement;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.util.ReflectHelper;
-import org.hibernate.util.StringHelper;
-
-/**
- * Stateful holder and processor for binding Entity information
- *
- * @author Emmanuel Bernard
- */
-public class EntityBinder {
- private String name;
- private XClass annotatedClass;
- private PersistentClass persistentClass;
- private ExtendedMappings mappings;
- private static Log log = LogFactory.getLog( EntityBinder.class );
- private String discriminatorValue = "";
- private boolean isPropertyAnnotated = false;
- private boolean dynamicInsert;
- private boolean dynamicUpdate;
- private boolean explicitHibernateEntityAnnotation;
- private OptimisticLockType optimisticLockType;
- private PolymorphismType polymorphismType;
- private boolean selectBeforeUpdate;
- private int batchSize;
- private boolean lazy;
- private XClass proxyClass;
- private String where;
- private java.util.Map<String, Join> secondaryTables = new HashMap<String, Join>();
- private java.util.Map<String, Object> secondaryTableJoins = new HashMap<String, Object>();
- private String cacheConcurrentStrategy;
- private String cacheRegion;
- private java.util.Map<String, String> filters = new HashMap<String, String>();
- private InheritanceState inheritanceState;
- private boolean ignoreIdAnnotations;
- private boolean cacheLazyProperty;
- private String propertyAccessor;
-
- public boolean isPropertyAnnotated() {
- return isPropertyAnnotated;
- }
-
- /**
- * Use as a fake one for Collection of elements
- */
- public EntityBinder() {
- }
-
- public EntityBinder(
- Entity ejb3Ann, org.hibernate.annotations.Entity hibAnn,
- XClass annotatedClass, PersistentClass persistentClass,
- ExtendedMappings mappings
- ) {
- this.mappings = mappings;
- this.persistentClass = persistentClass;
- this.annotatedClass = annotatedClass;
- bindEjb3Annotation( ejb3Ann );
- bindHibernateAnnotation( hibAnn );
- }
-
- private void bindHibernateAnnotation(org.hibernate.annotations.Entity hibAnn) {
- if ( hibAnn != null ) {
- dynamicInsert = hibAnn.dynamicInsert();
- dynamicUpdate = hibAnn.dynamicUpdate();
- optimisticLockType = hibAnn.optimisticLock();
- selectBeforeUpdate = hibAnn.selectBeforeUpdate();
- polymorphismType = hibAnn.polymorphism();
- explicitHibernateEntityAnnotation = true;
- //persister handled in bind
- }
- else {
- //default values when the annotation is not there
- dynamicInsert = false;
- dynamicUpdate = false;
- optimisticLockType = OptimisticLockType.VERSION;
- polymorphismType = PolymorphismType.IMPLICIT;
- selectBeforeUpdate = false;
- }
- }
-
- private void bindEjb3Annotation(Entity ejb3Ann) {
- if ( ejb3Ann == null ) throw new AssertionFailure( "@Entity should always be not null" );
- if ( BinderHelper.isDefault( ejb3Ann.name() ) ) {
- name = StringHelper.unqualify( annotatedClass.getName() );
- }
- else {
- name = ejb3Ann.name();
- }
- }
-
- public void setDiscriminatorValue(String discriminatorValue) {
- this.discriminatorValue = discriminatorValue;
- }
-
- public void bindEntity() {
- persistentClass.setAbstract( annotatedClass.isAbstract() );
- persistentClass.setClassName( annotatedClass.getName() );
- persistentClass.setNodeName( name );
- //persistentClass.setDynamic(false); //no longer needed with the Entity name refactoring?
- persistentClass.setEntityName( annotatedClass.getName() );
- bindDiscriminatorValue();
-
- persistentClass.setLazy( lazy );
- if ( proxyClass != null ) {
- persistentClass.setProxyInterfaceName( proxyClass.getName() );
- }
- persistentClass.setDynamicInsert( dynamicInsert );
- persistentClass.setDynamicUpdate( dynamicUpdate );
-
- if ( persistentClass instanceof RootClass ) {
- RootClass rootClass = (RootClass) persistentClass;
- boolean mutable = true;
- //priority on @Immutable, then @Entity.mutable()
- if ( annotatedClass.isAnnotationPresent( Immutable.class ) ) {
- mutable = false;
- }
- else {
- org.hibernate.annotations.Entity entityAnn =
- annotatedClass.getAnnotation( org.hibernate.annotations.Entity.class );
- if ( entityAnn != null ) {
- mutable = entityAnn.mutable();
- }
- }
- rootClass.setMutable( mutable );
- rootClass.setExplicitPolymorphism( isExplicitPolymorphism( polymorphismType ) );
- if ( StringHelper.isNotEmpty( where ) ) rootClass.setWhere( where );
- if ( cacheConcurrentStrategy != null ) {
- rootClass.setCacheConcurrencyStrategy( cacheConcurrentStrategy );
- rootClass.setCacheRegionName( cacheRegion );
- rootClass.setLazyPropertiesCacheable( cacheLazyProperty );
- }
- rootClass.setForceDiscriminator( annotatedClass.isAnnotationPresent( ForceDiscriminator.class ) );
- }
- else {
- if ( explicitHibernateEntityAnnotation ) {
- log.warn( "@org.hibernate.annotations.Entity used on a non root entity: ignored for "
- + annotatedClass.getName() );
- }
- }
- persistentClass.setOptimisticLockMode( getVersioning( optimisticLockType ) );
- persistentClass.setSelectBeforeUpdate( selectBeforeUpdate );
-
- //set persister if needed
- //@Persister has precedence over @Entity.persister
- Persister persisterAnn = annotatedClass.getAnnotation( Persister.class );
- Class persister = null;
- if ( persisterAnn!= null ) {
- persister = persisterAnn.impl();
- }
- else {
- org.hibernate.annotations.Entity entityAnn = annotatedClass.getAnnotation( org.hibernate.annotations.Entity.class );
- if (entityAnn != null && !BinderHelper.isDefault( entityAnn.persister() ) ) {
- try {
- persister = ReflectHelper.classForName( entityAnn.persister() );
- }
- catch (ClassNotFoundException cnfe) {
- throw new AnnotationException( "Could not find persister class: " + persister );
- }
- }
- }
- if ( persister != null ) persistentClass.setEntityPersisterClass(persister);
-
- persistentClass.setBatchSize( batchSize );
-
- //SQL overriding
- SQLInsert sqlInsert = annotatedClass.getAnnotation( SQLInsert.class );
- SQLUpdate sqlUpdate = annotatedClass.getAnnotation( SQLUpdate.class );
- SQLDelete sqlDelete = annotatedClass.getAnnotation( SQLDelete.class );
- SQLDeleteAll sqlDeleteAll = annotatedClass.getAnnotation( SQLDeleteAll.class );
- Loader loader = annotatedClass.getAnnotation( Loader.class );
- if ( sqlInsert != null ) {
- persistentClass.setCustomSQLInsert( sqlInsert.sql().trim(), sqlInsert.callable(),
- ExecuteUpdateResultCheckStyle.parse( sqlInsert.check().toString().toLowerCase() )
- );
-
- }
- if ( sqlUpdate != null ) {
- persistentClass.setCustomSQLUpdate( sqlUpdate.sql(), sqlUpdate.callable(),
- ExecuteUpdateResultCheckStyle.parse( sqlUpdate.check().toString().toLowerCase() )
- );
- }
- if ( sqlDelete != null ) {
- persistentClass.setCustomSQLDelete( sqlDelete.sql(), sqlDelete.callable(),
- ExecuteUpdateResultCheckStyle.parse( sqlDelete.check().toString().toLowerCase() )
- );
- }
- if ( sqlDeleteAll != null ) {
- persistentClass.setCustomSQLDelete( sqlDeleteAll.sql(), sqlDeleteAll.callable(),
- ExecuteUpdateResultCheckStyle.parse( sqlDeleteAll.check().toString().toLowerCase() )
- );
- }
- if ( loader != null ) {
- persistentClass.setLoaderName( loader.namedQuery() );
- }
-
- //tuplizers
- if ( annotatedClass.isAnnotationPresent( Tuplizers.class ) ) {
- for ( Tuplizer tuplizer : annotatedClass.getAnnotation( Tuplizers.class ).value() ) {
- EntityMode mode = EntityMode.parse( tuplizer.entityMode() );
- persistentClass.addTuplizer( mode, tuplizer.impl().getName() );
- }
- }
- if ( annotatedClass.isAnnotationPresent( Tuplizer.class ) ) {
- Tuplizer tuplizer = annotatedClass.getAnnotation( Tuplizer.class );
- EntityMode mode = EntityMode.parse( tuplizer.entityMode() );
- persistentClass.addTuplizer( mode, tuplizer.impl().getName() );
- }
-
- if ( !inheritanceState.hasParents ) {
- Iterator<Map.Entry<String, String>> iter = filters.entrySet().iterator();
- while ( iter.hasNext() ) {
- Map.Entry<String, String> filter = iter.next();
- String filterName = filter.getKey();
- String cond = filter.getValue();
- if ( BinderHelper.isDefault( cond ) ) {
- FilterDefinition definition = mappings.getFilterDefinition( filterName );
- cond = definition == null ? null : definition.getDefaultFilterCondition();
- if ( StringHelper.isEmpty( cond ) ) {
- throw new AnnotationException(
- "no filter condition found for filter " + filterName + " in " + this.name
- );
- }
- }
- persistentClass.addFilter( filterName, cond );
- }
- }
- else {
- if ( filters.size() > 0 ) {
- log.warn( "@Filter not allowed on subclasses (ignored): " + persistentClass.getEntityName() );
- }
- }
- log.debug( "Import with entity name=" + name );
- try {
- mappings.addImport( persistentClass.getEntityName(), name );
- String entityName = persistentClass.getEntityName();
- if ( !entityName.equals( name ) ) {
- mappings.addImport( entityName, entityName );
- }
- }
- catch (MappingException me) {
- throw new AnnotationException( "Use of the same entity name twice: " + name, me );
- }
- }
-
- public void bindDiscriminatorValue() {
- if ( StringHelper.isEmpty( discriminatorValue ) ) {
- Value discriminator = persistentClass.getDiscriminator();
- if ( discriminator == null ) {
- persistentClass.setDiscriminatorValue( name );
- }
- else if ( "character".equals( discriminator.getType().getName() ) ) {
- throw new AnnotationException(
- "Using default @DiscriminatorValue for a discriminator of type CHAR is not safe"
- );
- }
- else if ( "integer".equals( discriminator.getType().getName() ) ) {
- persistentClass.setDiscriminatorValue( String.valueOf( name.hashCode() ) );
- }
- else {
- persistentClass.setDiscriminatorValue( name ); //Spec compliant
- }
- }
- else {
- //persistentClass.getDiscriminator()
- persistentClass.setDiscriminatorValue( discriminatorValue );
- }
- }
-
- int getVersioning(OptimisticLockType type) {
- switch (type) {
- case VERSION:
- return Versioning.OPTIMISTIC_LOCK_VERSION;
- case NONE:
- return Versioning.OPTIMISTIC_LOCK_NONE;
- case DIRTY:
- return Versioning.OPTIMISTIC_LOCK_DIRTY;
- case ALL:
- return Versioning.OPTIMISTIC_LOCK_ALL;
- default:
- throw new AssertionFailure( "optimistic locking not supported: " + type );
- }
- }
-
- private boolean isExplicitPolymorphism(PolymorphismType type) {
- switch (type) {
- case IMPLICIT:
- return false;
- case EXPLICIT:
- return true;
- default:
- throw new AssertionFailure( "Unknown polymorphism type: " + type );
- }
- }
-
- public void setBatchSize(BatchSize sizeAnn) {
- if ( sizeAnn != null ) {
- batchSize = sizeAnn.size();
- }
- else {
- batchSize = -1;
- }
- }
-
- public void setProxy(Proxy proxy) {
- if ( proxy != null ) {
- lazy = proxy.lazy();
- if ( !lazy ) {
- proxyClass = null;
- }
- else {
- if ( AnnotationBinder.isDefault(
- mappings.getReflectionManager().toXClass( proxy.proxyClass() ), mappings
- ) ) {
- proxyClass = annotatedClass;
- }
- else {
- proxyClass = mappings.getReflectionManager().toXClass( proxy.proxyClass() );
- }
- }
- }
- else {
- lazy = true; //needed to allow association lazy loading.
- proxyClass = annotatedClass;
- }
- }
-
- public void setWhere(Where whereAnn) {
- if ( whereAnn != null ) {
- where = whereAnn.clause();
- }
- }
-
- private String getClassTableName(String tableName) {
- if ( StringHelper.isEmpty( tableName ) ) {
- return mappings.getNamingStrategy().classToTableName( name );
- }
- else {
- return mappings.getNamingStrategy().tableName( tableName );
- }
- }
-
- public void bindTable(
- String schema, String catalog,
- String tableName, List uniqueConstraints,
- String constraints, Table denormalizedSuperclassTable
- ) {
- String logicalName = StringHelper.isNotEmpty( tableName ) ?
- tableName :
- StringHelper.unqualify( name );
- Table table = TableBinder.fillTable(
- schema, catalog,
- getClassTableName( tableName ),
- logicalName,
- persistentClass.isAbstract(), uniqueConstraints, constraints,
- denormalizedSuperclassTable, mappings
- );
-
- if ( persistentClass instanceof TableOwner ) {
- if ( log.isInfoEnabled() ) {
- log.info( "Bind entity " + persistentClass.getEntityName() + " on table " + table.getName() );
- }
- ( (TableOwner) persistentClass ).setTable( table );
- }
- else {
- throw new AssertionFailure( "binding a table for a subclass" );
- }
- }
-
- public void finalSecondaryTableBinding(PropertyHolder propertyHolder) {
- /*
- * Those operations has to be done after the id definition of the persistence class.
- * ie after the properties parsing
- */
- Iterator joins = secondaryTables.values().iterator();
- Iterator joinColumns = secondaryTableJoins.values().iterator();
-
- while ( joins.hasNext() ) {
- Object uncastedColumn = joinColumns.next();
- Join join = (Join) joins.next();
- createPrimaryColumnsToSecondaryTable( uncastedColumn, propertyHolder, join );
- }
- mappings.addJoins( persistentClass, secondaryTables );
- }
-
- private void createPrimaryColumnsToSecondaryTable(Object uncastedColumn, PropertyHolder propertyHolder, Join join) {
- Ejb3JoinColumn[] ejb3JoinColumns;
- PrimaryKeyJoinColumn[] pkColumnsAnn = null;
- JoinColumn[] joinColumnsAnn = null;
- if ( uncastedColumn instanceof PrimaryKeyJoinColumn[] ) {
- pkColumnsAnn = (PrimaryKeyJoinColumn[]) uncastedColumn;
- }
- if ( uncastedColumn instanceof JoinColumn[] ) {
- joinColumnsAnn = (JoinColumn[]) uncastedColumn;
- }
- if ( pkColumnsAnn == null && joinColumnsAnn == null ) {
- ejb3JoinColumns = new Ejb3JoinColumn[1];
- ejb3JoinColumns[0] = Ejb3JoinColumn.buildJoinColumn(
- null,
- null,
- persistentClass.getIdentifier(),
- secondaryTables,
- propertyHolder, mappings
- );
- }
- else {
- int nbrOfJoinColumns = pkColumnsAnn != null ?
- pkColumnsAnn.length :
- joinColumnsAnn.length;
- if ( nbrOfJoinColumns == 0 ) {
- ejb3JoinColumns = new Ejb3JoinColumn[1];
- ejb3JoinColumns[0] = Ejb3JoinColumn.buildJoinColumn(
- null,
- null,
- persistentClass.getIdentifier(),
- secondaryTables,
- propertyHolder, mappings
- );
- }
- else {
- ejb3JoinColumns = new Ejb3JoinColumn[nbrOfJoinColumns];
- if ( pkColumnsAnn != null ) {
- for ( int colIndex = 0; colIndex < nbrOfJoinColumns; colIndex++ ) {
- ejb3JoinColumns[colIndex] = Ejb3JoinColumn.buildJoinColumn(
- pkColumnsAnn[colIndex],
- null,
- persistentClass.getIdentifier(),
- secondaryTables,
- propertyHolder, mappings
- );
- }
- }
- else {
- for ( int colIndex = 0; colIndex < nbrOfJoinColumns; colIndex++ ) {
- ejb3JoinColumns[colIndex] = Ejb3JoinColumn.buildJoinColumn(
- null,
- joinColumnsAnn[colIndex],
- persistentClass.getIdentifier(),
- secondaryTables,
- propertyHolder, mappings
- );
- }
- }
- }
- }
-
- for ( Ejb3JoinColumn joinColumn : ejb3JoinColumns ) {
- joinColumn.forceNotNull();
- }
- bindJoinToPersistentClass( join, ejb3JoinColumns );
- }
-
- private void bindJoinToPersistentClass(
- Join join, Ejb3JoinColumn[] ejb3JoinColumns
- ) {
- SimpleValue key = new DependantValue( join.getTable(), persistentClass.getIdentifier() );
- join.setKey( key );
- setFKNameIfDefined(join);
- key.setCascadeDeleteEnabled( false );
- TableBinder.bindFk( persistentClass, null, ejb3JoinColumns, key, false, mappings );
- join.createPrimaryKey();
- join.createForeignKey();
- persistentClass.addJoin( join );
- }
-
- private void setFKNameIfDefined(Join join) {
- org.hibernate.annotations.Table matchingTable = findMatchingComplimentTableAnnotation( join );
- if (matchingTable != null && ! BinderHelper.isDefault( matchingTable.foreignKey().name() ) ) {
- ( (SimpleValue) join.getKey() ).setForeignKeyName( matchingTable.foreignKey().name() );
- }
- }
-
- private org.hibernate.annotations.Table findMatchingComplimentTableAnnotation(Join join) {
- String tableName = join.getTable().getQuotedName();
- org.hibernate.annotations.Table table = annotatedClass.getAnnotation( org.hibernate.annotations.Table.class );
- org.hibernate.annotations.Table matchingTable = null;
- if ( table != null && tableName.equals( table.appliesTo() ) ) {
- matchingTable = table;
- }
- else {
- Tables tables = annotatedClass.getAnnotation( Tables.class );
- if ( tables != null) {
- for (org.hibernate.annotations.Table current : tables.value() ) {
- if ( tableName.equals( current.appliesTo() ) ) {
- matchingTable = current;
- break;
- }
- }
- }
- }
- return matchingTable;
- }
-
- public void firstLevelSecondaryTablesBinding(
- SecondaryTable secTable, SecondaryTables secTables
- ) {
- if ( secTables != null ) {
- //loop through it
- for ( SecondaryTable tab : secTables.value() ) {
- addJoin( tab, null, null, false );
- }
- }
- else {
- if ( secTable != null ) addJoin( secTable, null, null, false );
- }
- }
-
- //Used for @*ToMany @JoinTable
- public Join addJoin(JoinTable joinTable, PropertyHolder holder, boolean noDelayInPkColumnCreation) {
- return addJoin( null, joinTable, holder, noDelayInPkColumnCreation );
- }
-
- /**
- * A non null propertyHolder means than we process the Pk creation without delay
- */
- private Join addJoin(
- SecondaryTable secondaryTable, JoinTable joinTable, PropertyHolder propertyHolder,
- boolean noDelayInPkColumnCreation
- ) {
- Join join = new Join();
- join.setPersistentClass( persistentClass );
- String schema;
- String catalog;
- String table;
- String realTable;
- UniqueConstraint[] uniqueConstraintsAnn;
- if ( secondaryTable != null ) {
- schema = secondaryTable.schema();
- catalog = secondaryTable.catalog();
- table = secondaryTable.name();
- realTable = mappings.getNamingStrategy().tableName( table ); //always an explicit table name
- uniqueConstraintsAnn = secondaryTable.uniqueConstraints();
- }
- else if ( joinTable != null ) {
- schema = joinTable.schema();
- catalog = joinTable.catalog();
- table = joinTable.name();
- realTable = mappings.getNamingStrategy().tableName( table ); //always an explicit table name
- uniqueConstraintsAnn = joinTable.uniqueConstraints();
- }
- else {
- throw new AssertionFailure( "Both JoinTable and SecondaryTable are null" );
- }
- List uniqueConstraints = new ArrayList( uniqueConstraintsAnn == null ?
- 0 :
- uniqueConstraintsAnn.length );
- if ( uniqueConstraintsAnn != null && uniqueConstraintsAnn.length != 0 ) {
- for ( UniqueConstraint uc : uniqueConstraintsAnn ) {
- uniqueConstraints.add( uc.columnNames() );
- }
- }
- Table tableMapping = TableBinder.fillTable(
- schema,
- catalog,
- realTable,
- table, false, uniqueConstraints, null, null, mappings
- );
- //no check constraints available on joins
- join.setTable( tableMapping );
-
- //somehow keep joins() for later.
- //Has to do the work later because it needs persistentClass id!
- Object joinColumns = null;
- //get the appropriate pk columns
- if ( secondaryTable != null ) {
- joinColumns = secondaryTable.pkJoinColumns();
- }
- else if ( joinTable != null ) {
- joinColumns = joinTable.joinColumns();
- }
- if ( log.isInfoEnabled() ) {
- log.info(
- "Adding secondary table to entity " + persistentClass.getEntityName() + " -> " + join.getTable()
- .getName()
- );
- }
-
- org.hibernate.annotations.Table matchingTable = findMatchingComplimentTableAnnotation( join );
- if (matchingTable != null) {
- join.setSequentialSelect( FetchMode.JOIN != matchingTable.fetch() );
- join.setInverse( matchingTable.inverse() );
- join.setOptional( matchingTable.optional() );
- if ( ! BinderHelper.isDefault( matchingTable.sqlInsert().sql() ) ) {
- join.setCustomSQLInsert( matchingTable.sqlInsert().sql().trim(),
- matchingTable.sqlInsert().callable(),
- ExecuteUpdateResultCheckStyle.parse( matchingTable.sqlInsert().check().toString().toLowerCase() )
- );
- }
- if ( ! BinderHelper.isDefault( matchingTable.sqlUpdate().sql() ) ) {
- join.setCustomSQLUpdate( matchingTable.sqlUpdate().sql().trim(),
- matchingTable.sqlUpdate().callable(),
- ExecuteUpdateResultCheckStyle.parse( matchingTable.sqlUpdate().check().toString().toLowerCase() )
- );
- }
- if ( ! BinderHelper.isDefault( matchingTable.sqlDelete().sql() ) ) {
- join.setCustomSQLDelete( matchingTable.sqlDelete().sql().trim(),
- matchingTable.sqlDelete().callable(),
- ExecuteUpdateResultCheckStyle.parse( matchingTable.sqlDelete().check().toString().toLowerCase() )
- );
- }
- }
- else {
- //default
- join.setSequentialSelect( false );
- join.setInverse( false );
- join.setOptional( true ); //perhaps not quite per-spec, but a Good Thing anyway
- }
-
- if ( noDelayInPkColumnCreation ) {
- createPrimaryColumnsToSecondaryTable( joinColumns, propertyHolder, join );
- }
- else {
- secondaryTables.put( table, join );
- secondaryTableJoins.put( table, joinColumns );
- }
- return join;
- }
-
- public java.util.Map<String, Join> getSecondaryTables() {
- return secondaryTables;
- }
-
- public void setCache(Cache cacheAnn) {
- if ( cacheAnn != null ) {
- cacheRegion = BinderHelper.isDefault( cacheAnn.region() ) ?
- null :
- cacheAnn.region();
- cacheConcurrentStrategy = getCacheConcurrencyStrategy( cacheAnn.usage() );
- if ( "all".equalsIgnoreCase( cacheAnn.include() ) ) {
- cacheLazyProperty = true;
- }
- else if ( "non-lazy".equalsIgnoreCase( cacheAnn.include() ) ) {
- cacheLazyProperty = false;
- }
- else {
- throw new AnnotationException( "Unknown lazy property annotations: " + cacheAnn.include() );
- }
- }
- else {
- cacheConcurrentStrategy = null;
- cacheRegion = null;
- cacheLazyProperty = true;
- }
- }
-
- public static String getCacheConcurrencyStrategy(CacheConcurrencyStrategy strategy) {
- switch (strategy) {
- case NONE:
- return null;
- case READ_ONLY:
- return CacheFactory.READ_ONLY;
- case READ_WRITE:
- return CacheFactory.READ_WRITE;
- case NONSTRICT_READ_WRITE:
- return CacheFactory.NONSTRICT_READ_WRITE;
- case TRANSACTIONAL:
- return CacheFactory.TRANSACTIONAL;
- default:
- throw new AssertionFailure( "CacheConcurrencyStrategy unknown: " + strategy );
- }
- }
-
- public void addFilter(String name, String condition) {
- filters.put( name, condition );
- }
-
- public void setInheritanceState(InheritanceState inheritanceState) {
- this.inheritanceState = inheritanceState;
- }
-
- public boolean isIgnoreIdAnnotations() {
- return ignoreIdAnnotations;
- }
-
- public void setIgnoreIdAnnotations(boolean ignoreIdAnnotations) {
- this.ignoreIdAnnotations = ignoreIdAnnotations;
- }
-
- public void processComplementaryTableDefinitions(org.hibernate.annotations.Table table) {
- if ( table == null ) return;
- String appliedTable = table.appliesTo();
- Iterator tables = persistentClass.getTableClosureIterator();
- Table hibTable = null;
- while ( tables.hasNext() ) {
- hibTable = (Table) tables.next();
- if ( hibTable.getQuotedName().equals( appliedTable ) ) {
- //we are in the correct table to find columns
- break;
- }
- }
- if ( hibTable == null ) {
- throw new AnnotationException(
- "@org.hibernate.annotations.Table references an unknown table: " + appliedTable
- );
- }
- if ( ! BinderHelper.isDefault( table.comment() ) ) hibTable.setComment( table.comment() );
- TableBinder.addIndexes( hibTable, table.indexes(), mappings );
- }
-
- public void processComplementaryTableDefinitions(Tables tables) {
- if ( tables == null ) return;
- for ( org.hibernate.annotations.Table table : tables.value() ) {
- processComplementaryTableDefinitions( table );
- }
- }
-
- public void setPropertyAnnotated(boolean propertyAnnotated) {
- this.isPropertyAnnotated = propertyAnnotated;
- }
-
- public String getPropertyAccessor() {
- return propertyAccessor;
- }
-
- public void setPropertyAccessor(String propertyAccessor) {
- this.propertyAccessor = propertyAccessor;
- }
-
- public boolean isPropertyAnnotated(XAnnotatedElement element) {
- AccessType access = element.getAnnotation( AccessType.class );
- if ( access == null ) return isPropertyAnnotated;
- String propertyAccessor = access.value();
- if ( "property".equals( propertyAccessor ) ) {
- return Boolean.TRUE;
- }
- else if ( "field".equals( propertyAccessor ) ) {
- return Boolean.FALSE;
- }
- else {
- return isPropertyAnnotated;
- }
- }
-
- public String getPropertyAccessor(XAnnotatedElement element) {
- AccessType access = element.getAnnotation( AccessType.class );
- if ( access == null ) return propertyAccessor;
- return access.value();
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/EntityBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/EntityBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/EntityBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/EntityBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,798 @@
+//$Id$
+package org.hibernate.cfg.annotations;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.SecondaryTable;
+import javax.persistence.SecondaryTables;
+import javax.persistence.UniqueConstraint;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.MappingException;
+import org.hibernate.EntityMode;
+import org.hibernate.annotations.AccessType;
+import org.hibernate.annotations.BatchSize;
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+import org.hibernate.annotations.ForceDiscriminator;
+import org.hibernate.annotations.Loader;
+import org.hibernate.annotations.OptimisticLockType;
+import org.hibernate.annotations.PolymorphismType;
+import org.hibernate.annotations.Proxy;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.SQLInsert;
+import org.hibernate.annotations.SQLUpdate;
+import org.hibernate.annotations.Tables;
+import org.hibernate.annotations.Where;
+import org.hibernate.annotations.SQLDeleteAll;
+import org.hibernate.annotations.Tuplizers;
+import org.hibernate.annotations.Tuplizer;
+import org.hibernate.annotations.Immutable;
+import org.hibernate.annotations.FetchMode;
+import org.hibernate.annotations.Persister;
+import org.hibernate.cache.CacheFactory;
+import org.hibernate.cfg.AnnotationBinder;
+import org.hibernate.cfg.BinderHelper;
+import org.hibernate.cfg.Ejb3JoinColumn;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.InheritanceState;
+import org.hibernate.cfg.PropertyHolder;
+import org.hibernate.engine.Versioning;
+import org.hibernate.engine.ExecuteUpdateResultCheckStyle;
+import org.hibernate.engine.FilterDefinition;
+import org.hibernate.mapping.DependantValue;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.RootClass;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.Table;
+import org.hibernate.mapping.TableOwner;
+import org.hibernate.mapping.Value;
+import org.hibernate.annotations.common.reflection.XAnnotatedElement;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.util.StringHelper;
+
+/**
+ * Stateful holder and processor for binding Entity information
+ *
+ * @author Emmanuel Bernard
+ */
+public class EntityBinder {
+ private String name;
+ private XClass annotatedClass;
+ private PersistentClass persistentClass;
+ private ExtendedMappings mappings;
+ private static Log log = LogFactory.getLog( EntityBinder.class );
+ private String discriminatorValue = "";
+ private boolean isPropertyAnnotated = false;
+ private boolean dynamicInsert;
+ private boolean dynamicUpdate;
+ private boolean explicitHibernateEntityAnnotation;
+ private OptimisticLockType optimisticLockType;
+ private PolymorphismType polymorphismType;
+ private boolean selectBeforeUpdate;
+ private int batchSize;
+ private boolean lazy;
+ private XClass proxyClass;
+ private String where;
+ private java.util.Map<String, Join> secondaryTables = new HashMap<String, Join>();
+ private java.util.Map<String, Object> secondaryTableJoins = new HashMap<String, Object>();
+ private String cacheConcurrentStrategy;
+ private String cacheRegion;
+ private java.util.Map<String, String> filters = new HashMap<String, String>();
+ private InheritanceState inheritanceState;
+ private boolean ignoreIdAnnotations;
+ private boolean cacheLazyProperty;
+ private String propertyAccessor;
+
+ public boolean isPropertyAnnotated() {
+ return isPropertyAnnotated;
+ }
+
+ /**
+ * Use as a fake one for Collection of elements
+ */
+ public EntityBinder() {
+ }
+
+ public EntityBinder(
+ Entity ejb3Ann, org.hibernate.annotations.Entity hibAnn,
+ XClass annotatedClass, PersistentClass persistentClass,
+ ExtendedMappings mappings
+ ) {
+ this.mappings = mappings;
+ this.persistentClass = persistentClass;
+ this.annotatedClass = annotatedClass;
+ bindEjb3Annotation( ejb3Ann );
+ bindHibernateAnnotation( hibAnn );
+ }
+
+ private void bindHibernateAnnotation(org.hibernate.annotations.Entity hibAnn) {
+ if ( hibAnn != null ) {
+ dynamicInsert = hibAnn.dynamicInsert();
+ dynamicUpdate = hibAnn.dynamicUpdate();
+ optimisticLockType = hibAnn.optimisticLock();
+ selectBeforeUpdate = hibAnn.selectBeforeUpdate();
+ polymorphismType = hibAnn.polymorphism();
+ explicitHibernateEntityAnnotation = true;
+ //persister handled in bind
+ }
+ else {
+ //default values when the annotation is not there
+ dynamicInsert = false;
+ dynamicUpdate = false;
+ optimisticLockType = OptimisticLockType.VERSION;
+ polymorphismType = PolymorphismType.IMPLICIT;
+ selectBeforeUpdate = false;
+ }
+ }
+
+ private void bindEjb3Annotation(Entity ejb3Ann) {
+ if ( ejb3Ann == null ) throw new AssertionFailure( "@Entity should always be not null" );
+ if ( BinderHelper.isDefault( ejb3Ann.name() ) ) {
+ name = StringHelper.unqualify( annotatedClass.getName() );
+ }
+ else {
+ name = ejb3Ann.name();
+ }
+ }
+
+ public void setDiscriminatorValue(String discriminatorValue) {
+ this.discriminatorValue = discriminatorValue;
+ }
+
+ public void bindEntity() {
+ persistentClass.setAbstract( annotatedClass.isAbstract() );
+ persistentClass.setClassName( annotatedClass.getName() );
+ persistentClass.setNodeName( name );
+ //persistentClass.setDynamic(false); //no longer needed with the Entity name refactoring?
+ persistentClass.setEntityName( annotatedClass.getName() );
+ bindDiscriminatorValue();
+
+ persistentClass.setLazy( lazy );
+ if ( proxyClass != null ) {
+ persistentClass.setProxyInterfaceName( proxyClass.getName() );
+ }
+ persistentClass.setDynamicInsert( dynamicInsert );
+ persistentClass.setDynamicUpdate( dynamicUpdate );
+
+ if ( persistentClass instanceof RootClass ) {
+ RootClass rootClass = (RootClass) persistentClass;
+ boolean mutable = true;
+ //priority on @Immutable, then @Entity.mutable()
+ if ( annotatedClass.isAnnotationPresent( Immutable.class ) ) {
+ mutable = false;
+ }
+ else {
+ org.hibernate.annotations.Entity entityAnn =
+ annotatedClass.getAnnotation( org.hibernate.annotations.Entity.class );
+ if ( entityAnn != null ) {
+ mutable = entityAnn.mutable();
+ }
+ }
+ rootClass.setMutable( mutable );
+ rootClass.setExplicitPolymorphism( isExplicitPolymorphism( polymorphismType ) );
+ if ( StringHelper.isNotEmpty( where ) ) rootClass.setWhere( where );
+ if ( cacheConcurrentStrategy != null ) {
+ rootClass.setCacheConcurrencyStrategy( cacheConcurrentStrategy );
+ rootClass.setCacheRegionName( cacheRegion );
+ rootClass.setLazyPropertiesCacheable( cacheLazyProperty );
+ }
+ rootClass.setForceDiscriminator( annotatedClass.isAnnotationPresent( ForceDiscriminator.class ) );
+ }
+ else {
+ if ( explicitHibernateEntityAnnotation ) {
+ log.warn( "@org.hibernate.annotations.Entity used on a non root entity: ignored for "
+ + annotatedClass.getName() );
+ }
+ }
+ persistentClass.setOptimisticLockMode( getVersioning( optimisticLockType ) );
+ persistentClass.setSelectBeforeUpdate( selectBeforeUpdate );
+
+ //set persister if needed
+ //@Persister has precedence over @Entity.persister
+ Persister persisterAnn = annotatedClass.getAnnotation( Persister.class );
+ Class persister = null;
+ if ( persisterAnn!= null ) {
+ persister = persisterAnn.impl();
+ }
+ else {
+ org.hibernate.annotations.Entity entityAnn = annotatedClass.getAnnotation( org.hibernate.annotations.Entity.class );
+ if (entityAnn != null && !BinderHelper.isDefault( entityAnn.persister() ) ) {
+ try {
+ persister = ReflectHelper.classForName( entityAnn.persister() );
+ }
+ catch (ClassNotFoundException cnfe) {
+ throw new AnnotationException( "Could not find persister class: " + persister );
+ }
+ }
+ }
+ if ( persister != null ) persistentClass.setEntityPersisterClass(persister);
+
+ persistentClass.setBatchSize( batchSize );
+
+ //SQL overriding
+ SQLInsert sqlInsert = annotatedClass.getAnnotation( SQLInsert.class );
+ SQLUpdate sqlUpdate = annotatedClass.getAnnotation( SQLUpdate.class );
+ SQLDelete sqlDelete = annotatedClass.getAnnotation( SQLDelete.class );
+ SQLDeleteAll sqlDeleteAll = annotatedClass.getAnnotation( SQLDeleteAll.class );
+ Loader loader = annotatedClass.getAnnotation( Loader.class );
+ if ( sqlInsert != null ) {
+ persistentClass.setCustomSQLInsert( sqlInsert.sql().trim(), sqlInsert.callable(),
+ ExecuteUpdateResultCheckStyle.parse( sqlInsert.check().toString().toLowerCase() )
+ );
+
+ }
+ if ( sqlUpdate != null ) {
+ persistentClass.setCustomSQLUpdate( sqlUpdate.sql(), sqlUpdate.callable(),
+ ExecuteUpdateResultCheckStyle.parse( sqlUpdate.check().toString().toLowerCase() )
+ );
+ }
+ if ( sqlDelete != null ) {
+ persistentClass.setCustomSQLDelete( sqlDelete.sql(), sqlDelete.callable(),
+ ExecuteUpdateResultCheckStyle.parse( sqlDelete.check().toString().toLowerCase() )
+ );
+ }
+ if ( sqlDeleteAll != null ) {
+ persistentClass.setCustomSQLDelete( sqlDeleteAll.sql(), sqlDeleteAll.callable(),
+ ExecuteUpdateResultCheckStyle.parse( sqlDeleteAll.check().toString().toLowerCase() )
+ );
+ }
+ if ( loader != null ) {
+ persistentClass.setLoaderName( loader.namedQuery() );
+ }
+
+ //tuplizers
+ if ( annotatedClass.isAnnotationPresent( Tuplizers.class ) ) {
+ for ( Tuplizer tuplizer : annotatedClass.getAnnotation( Tuplizers.class ).value() ) {
+ EntityMode mode = EntityMode.parse( tuplizer.entityMode() );
+ persistentClass.addTuplizer( mode, tuplizer.impl().getName() );
+ }
+ }
+ if ( annotatedClass.isAnnotationPresent( Tuplizer.class ) ) {
+ Tuplizer tuplizer = annotatedClass.getAnnotation( Tuplizer.class );
+ EntityMode mode = EntityMode.parse( tuplizer.entityMode() );
+ persistentClass.addTuplizer( mode, tuplizer.impl().getName() );
+ }
+
+ if ( !inheritanceState.hasParents ) {
+ Iterator<Map.Entry<String, String>> iter = filters.entrySet().iterator();
+ while ( iter.hasNext() ) {
+ Map.Entry<String, String> filter = iter.next();
+ String filterName = filter.getKey();
+ String cond = filter.getValue();
+ if ( BinderHelper.isDefault( cond ) ) {
+ FilterDefinition definition = mappings.getFilterDefinition( filterName );
+ cond = definition == null ? null : definition.getDefaultFilterCondition();
+ if ( StringHelper.isEmpty( cond ) ) {
+ throw new AnnotationException(
+ "no filter condition found for filter " + filterName + " in " + this.name
+ );
+ }
+ }
+ persistentClass.addFilter( filterName, cond );
+ }
+ }
+ else {
+ if ( filters.size() > 0 ) {
+ log.warn( "@Filter not allowed on subclasses (ignored): " + persistentClass.getEntityName() );
+ }
+ }
+ log.debug( "Import with entity name=" + name );
+ try {
+ mappings.addImport( persistentClass.getEntityName(), name );
+ String entityName = persistentClass.getEntityName();
+ if ( !entityName.equals( name ) ) {
+ mappings.addImport( entityName, entityName );
+ }
+ }
+ catch (MappingException me) {
+ throw new AnnotationException( "Use of the same entity name twice: " + name, me );
+ }
+ }
+
+ public void bindDiscriminatorValue() {
+ if ( StringHelper.isEmpty( discriminatorValue ) ) {
+ Value discriminator = persistentClass.getDiscriminator();
+ if ( discriminator == null ) {
+ persistentClass.setDiscriminatorValue( name );
+ }
+ else if ( "character".equals( discriminator.getType().getName() ) ) {
+ throw new AnnotationException(
+ "Using default @DiscriminatorValue for a discriminator of type CHAR is not safe"
+ );
+ }
+ else if ( "integer".equals( discriminator.getType().getName() ) ) {
+ persistentClass.setDiscriminatorValue( String.valueOf( name.hashCode() ) );
+ }
+ else {
+ persistentClass.setDiscriminatorValue( name ); //Spec compliant
+ }
+ }
+ else {
+ //persistentClass.getDiscriminator()
+ persistentClass.setDiscriminatorValue( discriminatorValue );
+ }
+ }
+
+ int getVersioning(OptimisticLockType type) {
+ switch (type) {
+ case VERSION:
+ return Versioning.OPTIMISTIC_LOCK_VERSION;
+ case NONE:
+ return Versioning.OPTIMISTIC_LOCK_NONE;
+ case DIRTY:
+ return Versioning.OPTIMISTIC_LOCK_DIRTY;
+ case ALL:
+ return Versioning.OPTIMISTIC_LOCK_ALL;
+ default:
+ throw new AssertionFailure( "optimistic locking not supported: " + type );
+ }
+ }
+
+ private boolean isExplicitPolymorphism(PolymorphismType type) {
+ switch (type) {
+ case IMPLICIT:
+ return false;
+ case EXPLICIT:
+ return true;
+ default:
+ throw new AssertionFailure( "Unknown polymorphism type: " + type );
+ }
+ }
+
+ public void setBatchSize(BatchSize sizeAnn) {
+ if ( sizeAnn != null ) {
+ batchSize = sizeAnn.size();
+ }
+ else {
+ batchSize = -1;
+ }
+ }
+
+ public void setProxy(Proxy proxy) {
+ if ( proxy != null ) {
+ lazy = proxy.lazy();
+ if ( !lazy ) {
+ proxyClass = null;
+ }
+ else {
+ if ( AnnotationBinder.isDefault(
+ mappings.getReflectionManager().toXClass( proxy.proxyClass() ), mappings
+ ) ) {
+ proxyClass = annotatedClass;
+ }
+ else {
+ proxyClass = mappings.getReflectionManager().toXClass( proxy.proxyClass() );
+ }
+ }
+ }
+ else {
+ lazy = true; //needed to allow association lazy loading.
+ proxyClass = annotatedClass;
+ }
+ }
+
+ public void setWhere(Where whereAnn) {
+ if ( whereAnn != null ) {
+ where = whereAnn.clause();
+ }
+ }
+
+ private String getClassTableName(String tableName) {
+ if ( StringHelper.isEmpty( tableName ) ) {
+ return mappings.getNamingStrategy().classToTableName( name );
+ }
+ else {
+ return mappings.getNamingStrategy().tableName( tableName );
+ }
+ }
+
+ public void bindTable(
+ String schema, String catalog,
+ String tableName, List uniqueConstraints,
+ String constraints, Table denormalizedSuperclassTable
+ ) {
+ String logicalName = StringHelper.isNotEmpty( tableName ) ?
+ tableName :
+ StringHelper.unqualify( name );
+ Table table = TableBinder.fillTable(
+ schema, catalog,
+ getClassTableName( tableName ),
+ logicalName,
+ persistentClass.isAbstract(), uniqueConstraints, constraints,
+ denormalizedSuperclassTable, mappings
+ );
+
+ if ( persistentClass instanceof TableOwner ) {
+ if ( log.isInfoEnabled() ) {
+ log.info( "Bind entity " + persistentClass.getEntityName() + " on table " + table.getName() );
+ }
+ ( (TableOwner) persistentClass ).setTable( table );
+ }
+ else {
+ throw new AssertionFailure( "binding a table for a subclass" );
+ }
+ }
+
+ public void finalSecondaryTableBinding(PropertyHolder propertyHolder) {
+ /*
+ * Those operations has to be done after the id definition of the persistence class.
+ * ie after the properties parsing
+ */
+ Iterator joins = secondaryTables.values().iterator();
+ Iterator joinColumns = secondaryTableJoins.values().iterator();
+
+ while ( joins.hasNext() ) {
+ Object uncastedColumn = joinColumns.next();
+ Join join = (Join) joins.next();
+ createPrimaryColumnsToSecondaryTable( uncastedColumn, propertyHolder, join );
+ }
+ mappings.addJoins( persistentClass, secondaryTables );
+ }
+
+ private void createPrimaryColumnsToSecondaryTable(Object uncastedColumn, PropertyHolder propertyHolder, Join join) {
+ Ejb3JoinColumn[] ejb3JoinColumns;
+ PrimaryKeyJoinColumn[] pkColumnsAnn = null;
+ JoinColumn[] joinColumnsAnn = null;
+ if ( uncastedColumn instanceof PrimaryKeyJoinColumn[] ) {
+ pkColumnsAnn = (PrimaryKeyJoinColumn[]) uncastedColumn;
+ }
+ if ( uncastedColumn instanceof JoinColumn[] ) {
+ joinColumnsAnn = (JoinColumn[]) uncastedColumn;
+ }
+ if ( pkColumnsAnn == null && joinColumnsAnn == null ) {
+ ejb3JoinColumns = new Ejb3JoinColumn[1];
+ ejb3JoinColumns[0] = Ejb3JoinColumn.buildJoinColumn(
+ null,
+ null,
+ persistentClass.getIdentifier(),
+ secondaryTables,
+ propertyHolder, mappings
+ );
+ }
+ else {
+ int nbrOfJoinColumns = pkColumnsAnn != null ?
+ pkColumnsAnn.length :
+ joinColumnsAnn.length;
+ if ( nbrOfJoinColumns == 0 ) {
+ ejb3JoinColumns = new Ejb3JoinColumn[1];
+ ejb3JoinColumns[0] = Ejb3JoinColumn.buildJoinColumn(
+ null,
+ null,
+ persistentClass.getIdentifier(),
+ secondaryTables,
+ propertyHolder, mappings
+ );
+ }
+ else {
+ ejb3JoinColumns = new Ejb3JoinColumn[nbrOfJoinColumns];
+ if ( pkColumnsAnn != null ) {
+ for ( int colIndex = 0; colIndex < nbrOfJoinColumns; colIndex++ ) {
+ ejb3JoinColumns[colIndex] = Ejb3JoinColumn.buildJoinColumn(
+ pkColumnsAnn[colIndex],
+ null,
+ persistentClass.getIdentifier(),
+ secondaryTables,
+ propertyHolder, mappings
+ );
+ }
+ }
+ else {
+ for ( int colIndex = 0; colIndex < nbrOfJoinColumns; colIndex++ ) {
+ ejb3JoinColumns[colIndex] = Ejb3JoinColumn.buildJoinColumn(
+ null,
+ joinColumnsAnn[colIndex],
+ persistentClass.getIdentifier(),
+ secondaryTables,
+ propertyHolder, mappings
+ );
+ }
+ }
+ }
+ }
+
+ for ( Ejb3JoinColumn joinColumn : ejb3JoinColumns ) {
+ joinColumn.forceNotNull();
+ }
+ bindJoinToPersistentClass( join, ejb3JoinColumns );
+ }
+
+ private void bindJoinToPersistentClass(
+ Join join, Ejb3JoinColumn[] ejb3JoinColumns
+ ) {
+ SimpleValue key = new DependantValue( join.getTable(), persistentClass.getIdentifier() );
+ join.setKey( key );
+ setFKNameIfDefined(join);
+ key.setCascadeDeleteEnabled( false );
+ TableBinder.bindFk( persistentClass, null, ejb3JoinColumns, key, false, mappings );
+ join.createPrimaryKey();
+ join.createForeignKey();
+ persistentClass.addJoin( join );
+ }
+
+ private void setFKNameIfDefined(Join join) {
+ org.hibernate.annotations.Table matchingTable = findMatchingComplimentTableAnnotation( join );
+ if (matchingTable != null && ! BinderHelper.isDefault( matchingTable.foreignKey().name() ) ) {
+ ( (SimpleValue) join.getKey() ).setForeignKeyName( matchingTable.foreignKey().name() );
+ }
+ }
+
+ private org.hibernate.annotations.Table findMatchingComplimentTableAnnotation(Join join) {
+ String tableName = join.getTable().getQuotedName();
+ org.hibernate.annotations.Table table = annotatedClass.getAnnotation( org.hibernate.annotations.Table.class );
+ org.hibernate.annotations.Table matchingTable = null;
+ if ( table != null && tableName.equals( table.appliesTo() ) ) {
+ matchingTable = table;
+ }
+ else {
+ Tables tables = annotatedClass.getAnnotation( Tables.class );
+ if ( tables != null) {
+ for (org.hibernate.annotations.Table current : tables.value() ) {
+ if ( tableName.equals( current.appliesTo() ) ) {
+ matchingTable = current;
+ break;
+ }
+ }
+ }
+ }
+ return matchingTable;
+ }
+
+ public void firstLevelSecondaryTablesBinding(
+ SecondaryTable secTable, SecondaryTables secTables
+ ) {
+ if ( secTables != null ) {
+ //loop through it
+ for ( SecondaryTable tab : secTables.value() ) {
+ addJoin( tab, null, null, false );
+ }
+ }
+ else {
+ if ( secTable != null ) addJoin( secTable, null, null, false );
+ }
+ }
+
+ //Used for @*ToMany @JoinTable
+ public Join addJoin(JoinTable joinTable, PropertyHolder holder, boolean noDelayInPkColumnCreation) {
+ return addJoin( null, joinTable, holder, noDelayInPkColumnCreation );
+ }
+
+ /**
+ * A non null propertyHolder means than we process the Pk creation without delay
+ */
+ private Join addJoin(
+ SecondaryTable secondaryTable, JoinTable joinTable, PropertyHolder propertyHolder,
+ boolean noDelayInPkColumnCreation
+ ) {
+ Join join = new Join();
+ join.setPersistentClass( persistentClass );
+ String schema;
+ String catalog;
+ String table;
+ String realTable;
+ UniqueConstraint[] uniqueConstraintsAnn;
+ if ( secondaryTable != null ) {
+ schema = secondaryTable.schema();
+ catalog = secondaryTable.catalog();
+ table = secondaryTable.name();
+ realTable = mappings.getNamingStrategy().tableName( table ); //always an explicit table name
+ uniqueConstraintsAnn = secondaryTable.uniqueConstraints();
+ }
+ else if ( joinTable != null ) {
+ schema = joinTable.schema();
+ catalog = joinTable.catalog();
+ table = joinTable.name();
+ realTable = mappings.getNamingStrategy().tableName( table ); //always an explicit table name
+ uniqueConstraintsAnn = joinTable.uniqueConstraints();
+ }
+ else {
+ throw new AssertionFailure( "Both JoinTable and SecondaryTable are null" );
+ }
+ List uniqueConstraints = new ArrayList( uniqueConstraintsAnn == null ?
+ 0 :
+ uniqueConstraintsAnn.length );
+ if ( uniqueConstraintsAnn != null && uniqueConstraintsAnn.length != 0 ) {
+ for ( UniqueConstraint uc : uniqueConstraintsAnn ) {
+ uniqueConstraints.add( uc.columnNames() );
+ }
+ }
+ Table tableMapping = TableBinder.fillTable(
+ schema,
+ catalog,
+ realTable,
+ table, false, uniqueConstraints, null, null, mappings
+ );
+ //no check constraints available on joins
+ join.setTable( tableMapping );
+
+ //somehow keep joins() for later.
+ //Has to do the work later because it needs persistentClass id!
+ Object joinColumns = null;
+ //get the appropriate pk columns
+ if ( secondaryTable != null ) {
+ joinColumns = secondaryTable.pkJoinColumns();
+ }
+ else if ( joinTable != null ) {
+ joinColumns = joinTable.joinColumns();
+ }
+ if ( log.isInfoEnabled() ) {
+ log.info(
+ "Adding secondary table to entity " + persistentClass.getEntityName() + " -> " + join.getTable()
+ .getName()
+ );
+ }
+
+ org.hibernate.annotations.Table matchingTable = findMatchingComplimentTableAnnotation( join );
+ if (matchingTable != null) {
+ join.setSequentialSelect( FetchMode.JOIN != matchingTable.fetch() );
+ join.setInverse( matchingTable.inverse() );
+ join.setOptional( matchingTable.optional() );
+ if ( ! BinderHelper.isDefault( matchingTable.sqlInsert().sql() ) ) {
+ join.setCustomSQLInsert( matchingTable.sqlInsert().sql().trim(),
+ matchingTable.sqlInsert().callable(),
+ ExecuteUpdateResultCheckStyle.parse( matchingTable.sqlInsert().check().toString().toLowerCase() )
+ );
+ }
+ if ( ! BinderHelper.isDefault( matchingTable.sqlUpdate().sql() ) ) {
+ join.setCustomSQLUpdate( matchingTable.sqlUpdate().sql().trim(),
+ matchingTable.sqlUpdate().callable(),
+ ExecuteUpdateResultCheckStyle.parse( matchingTable.sqlUpdate().check().toString().toLowerCase() )
+ );
+ }
+ if ( ! BinderHelper.isDefault( matchingTable.sqlDelete().sql() ) ) {
+ join.setCustomSQLDelete( matchingTable.sqlDelete().sql().trim(),
+ matchingTable.sqlDelete().callable(),
+ ExecuteUpdateResultCheckStyle.parse( matchingTable.sqlDelete().check().toString().toLowerCase() )
+ );
+ }
+ }
+ else {
+ //default
+ join.setSequentialSelect( false );
+ join.setInverse( false );
+ join.setOptional( true ); //perhaps not quite per-spec, but a Good Thing anyway
+ }
+
+ if ( noDelayInPkColumnCreation ) {
+ createPrimaryColumnsToSecondaryTable( joinColumns, propertyHolder, join );
+ }
+ else {
+ secondaryTables.put( table, join );
+ secondaryTableJoins.put( table, joinColumns );
+ }
+ return join;
+ }
+
+ public java.util.Map<String, Join> getSecondaryTables() {
+ return secondaryTables;
+ }
+
+ public void setCache(Cache cacheAnn) {
+ if ( cacheAnn != null ) {
+ cacheRegion = BinderHelper.isDefault( cacheAnn.region() ) ?
+ null :
+ cacheAnn.region();
+ cacheConcurrentStrategy = getCacheConcurrencyStrategy( cacheAnn.usage() );
+ if ( "all".equalsIgnoreCase( cacheAnn.include() ) ) {
+ cacheLazyProperty = true;
+ }
+ else if ( "non-lazy".equalsIgnoreCase( cacheAnn.include() ) ) {
+ cacheLazyProperty = false;
+ }
+ else {
+ throw new AnnotationException( "Unknown lazy property annotations: " + cacheAnn.include() );
+ }
+ }
+ else {
+ cacheConcurrentStrategy = null;
+ cacheRegion = null;
+ cacheLazyProperty = true;
+ }
+ }
+
+ public static String getCacheConcurrencyStrategy(CacheConcurrencyStrategy strategy) {
+ switch (strategy) {
+ case NONE:
+ return null;
+ case READ_ONLY:
+ return CacheFactory.READ_ONLY;
+ case READ_WRITE:
+ return CacheFactory.READ_WRITE;
+ case NONSTRICT_READ_WRITE:
+ return CacheFactory.NONSTRICT_READ_WRITE;
+ case TRANSACTIONAL:
+ return CacheFactory.TRANSACTIONAL;
+ default:
+ throw new AssertionFailure( "CacheConcurrencyStrategy unknown: " + strategy );
+ }
+ }
+
+ public void addFilter(String name, String condition) {
+ filters.put( name, condition );
+ }
+
+ public void setInheritanceState(InheritanceState inheritanceState) {
+ this.inheritanceState = inheritanceState;
+ }
+
+ public boolean isIgnoreIdAnnotations() {
+ return ignoreIdAnnotations;
+ }
+
+ public void setIgnoreIdAnnotations(boolean ignoreIdAnnotations) {
+ this.ignoreIdAnnotations = ignoreIdAnnotations;
+ }
+
+ public void processComplementaryTableDefinitions(org.hibernate.annotations.Table table) {
+ if ( table == null ) return;
+ String appliedTable = table.appliesTo();
+ Iterator tables = persistentClass.getTableClosureIterator();
+ Table hibTable = null;
+ while ( tables.hasNext() ) {
+ hibTable = (Table) tables.next();
+ if ( hibTable.getQuotedName().equals( appliedTable ) ) {
+ //we are in the correct table to find columns
+ break;
+ }
+ }
+ if ( hibTable == null ) {
+ throw new AnnotationException(
+ "@org.hibernate.annotations.Table references an unknown table: " + appliedTable
+ );
+ }
+ if ( ! BinderHelper.isDefault( table.comment() ) ) hibTable.setComment( table.comment() );
+ TableBinder.addIndexes( hibTable, table.indexes(), mappings );
+ }
+
+ public void processComplementaryTableDefinitions(Tables tables) {
+ if ( tables == null ) return;
+ for ( org.hibernate.annotations.Table table : tables.value() ) {
+ processComplementaryTableDefinitions( table );
+ }
+ }
+
+ public void setPropertyAnnotated(boolean propertyAnnotated) {
+ this.isPropertyAnnotated = propertyAnnotated;
+ }
+
+ public String getPropertyAccessor() {
+ return propertyAccessor;
+ }
+
+ public void setPropertyAccessor(String propertyAccessor) {
+ this.propertyAccessor = propertyAccessor;
+ }
+
+ public boolean isPropertyAnnotated(XAnnotatedElement element) {
+ AccessType access = element.getAnnotation( AccessType.class );
+ if ( access == null ) return isPropertyAnnotated;
+ String propertyAccessor = access.value();
+ if ( "property".equals( propertyAccessor ) ) {
+ return Boolean.TRUE;
+ }
+ else if ( "field".equals( propertyAccessor ) ) {
+ return Boolean.FALSE;
+ }
+ else {
+ return isPropertyAnnotated;
+ }
+ }
+
+ public String getPropertyAccessor(XAnnotatedElement element) {
+ AccessType access = element.getAnnotation( AccessType.class );
+ if ( access == null ) return propertyAccessor;
+ return access.value();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/IdBagBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/IdBagBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/IdBagBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,89 +0,0 @@
-//$Id: $
-package org.hibernate.cfg.annotations;
-
-import java.util.Collections;
-import java.util.Map;
-
-import org.hibernate.AnnotationException;
-import org.hibernate.annotations.CollectionId;
-import org.hibernate.annotations.Type;
-import org.hibernate.cfg.BinderHelper;
-import org.hibernate.cfg.Ejb3Column;
-import org.hibernate.cfg.Ejb3JoinColumn;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.PropertyData;
-import org.hibernate.cfg.PropertyInferredData;
-import org.hibernate.cfg.WrappedInferredData;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.IdentifierCollection;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.Table;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class IdBagBinder extends BagBinder {
- protected Collection createCollection(PersistentClass persistentClass) {
- return new org.hibernate.mapping.IdentifierBag( persistentClass );
- }
-
- @Override
- protected boolean bindStarToManySecondPass(
- Map persistentClasses, XClass collType, Ejb3JoinColumn[] fkJoinColumns, Ejb3JoinColumn[] keyColumns,
- Ejb3JoinColumn[] inverseColumns, Ejb3Column[] elementColumns, boolean isEmbedded, XProperty property,
- boolean unique, TableBinder associationTableBinder, boolean ignoreNotFound, ExtendedMappings mappings
- ) {
- boolean result = super.bindStarToManySecondPass(
- persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns, isEmbedded,
- property, unique, associationTableBinder, ignoreNotFound, mappings
- );
- CollectionId collectionIdAnn = property.getAnnotation( CollectionId.class );
- if (collectionIdAnn != null) {
- SimpleValueBinder simpleValue = new SimpleValueBinder();
-
- PropertyData propertyData = new WrappedInferredData(
- new PropertyInferredData(property, null, //default access should not be useful
- mappings.getReflectionManager() ),
- "id" );
- Ejb3Column[] idColumns = Ejb3Column.buildColumnFromAnnotation(
- collectionIdAnn.columns(),
- null,
- Nullability.FORCED_NOT_NULL,
- propertyHolder,
- propertyData,
- Collections.EMPTY_MAP,
- mappings
- );
- Table table = collection.getCollectionTable();
- simpleValue.setTable( table );
- simpleValue.setColumns( idColumns );
- Type typeAnn = collectionIdAnn.type();
- if ( typeAnn != null && ! BinderHelper.isDefault( typeAnn.type() ) ) {
- simpleValue.setExplicitType( typeAnn );
- }
- else {
- throw new AnnotationException("@CollectionId is missing type: "
- + StringHelper.qualify( propertyHolder.getPath(), propertyName ) );
- }
- simpleValue.setMappings( mappings );
- SimpleValue id = simpleValue.make();
- ( (IdentifierCollection) collection ).setIdentifier( id );
- String generator = collectionIdAnn.generator();
- String generatorType;
- if ( "identity".equals( generator ) || "assigned".equals( generator )
- || "sequence".equals( generator ) || "native".equals( generator ) ) {
- generatorType = generator;
- generator = "";
- }
- else {
- generatorType = null;
- }
- BinderHelper.makeIdGenerator( id, generatorType, generator, mappings, localGenerators);
- }
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/IdBagBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/IdBagBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/IdBagBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/IdBagBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,89 @@
+//$Id: $
+package org.hibernate.cfg.annotations;
+
+import java.util.Collections;
+import java.util.Map;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.annotations.CollectionId;
+import org.hibernate.annotations.Type;
+import org.hibernate.cfg.BinderHelper;
+import org.hibernate.cfg.Ejb3Column;
+import org.hibernate.cfg.Ejb3JoinColumn;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.PropertyData;
+import org.hibernate.cfg.PropertyInferredData;
+import org.hibernate.cfg.WrappedInferredData;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.IdentifierCollection;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.Table;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IdBagBinder extends BagBinder {
+ protected Collection createCollection(PersistentClass persistentClass) {
+ return new org.hibernate.mapping.IdentifierBag( persistentClass );
+ }
+
+ @Override
+ protected boolean bindStarToManySecondPass(
+ Map persistentClasses, XClass collType, Ejb3JoinColumn[] fkJoinColumns, Ejb3JoinColumn[] keyColumns,
+ Ejb3JoinColumn[] inverseColumns, Ejb3Column[] elementColumns, boolean isEmbedded, XProperty property,
+ boolean unique, TableBinder associationTableBinder, boolean ignoreNotFound, ExtendedMappings mappings
+ ) {
+ boolean result = super.bindStarToManySecondPass(
+ persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns, isEmbedded,
+ property, unique, associationTableBinder, ignoreNotFound, mappings
+ );
+ CollectionId collectionIdAnn = property.getAnnotation( CollectionId.class );
+ if (collectionIdAnn != null) {
+ SimpleValueBinder simpleValue = new SimpleValueBinder();
+
+ PropertyData propertyData = new WrappedInferredData(
+ new PropertyInferredData(property, null, //default access should not be useful
+ mappings.getReflectionManager() ),
+ "id" );
+ Ejb3Column[] idColumns = Ejb3Column.buildColumnFromAnnotation(
+ collectionIdAnn.columns(),
+ null,
+ Nullability.FORCED_NOT_NULL,
+ propertyHolder,
+ propertyData,
+ Collections.EMPTY_MAP,
+ mappings
+ );
+ Table table = collection.getCollectionTable();
+ simpleValue.setTable( table );
+ simpleValue.setColumns( idColumns );
+ Type typeAnn = collectionIdAnn.type();
+ if ( typeAnn != null && ! BinderHelper.isDefault( typeAnn.type() ) ) {
+ simpleValue.setExplicitType( typeAnn );
+ }
+ else {
+ throw new AnnotationException("@CollectionId is missing type: "
+ + StringHelper.qualify( propertyHolder.getPath(), propertyName ) );
+ }
+ simpleValue.setMappings( mappings );
+ SimpleValue id = simpleValue.make();
+ ( (IdentifierCollection) collection ).setIdentifier( id );
+ String generator = collectionIdAnn.generator();
+ String generatorType;
+ if ( "identity".equals( generator ) || "assigned".equals( generator )
+ || "sequence".equals( generator ) || "native".equals( generator ) ) {
+ generatorType = generator;
+ generator = "";
+ }
+ else {
+ generatorType = null;
+ }
+ BinderHelper.makeIdGenerator( id, generatorType, generator, mappings, localGenerators);
+ }
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ListBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ListBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ListBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,114 +0,0 @@
-package org.hibernate.cfg.annotations;
-
-import java.util.Map;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AnnotationException;
-import org.hibernate.MappingException;
-import org.hibernate.util.StringHelper;
-import org.hibernate.annotations.OrderBy;
-import org.hibernate.annotations.Sort;
-import org.hibernate.cfg.CollectionSecondPass;
-import org.hibernate.cfg.Ejb3Column;
-import org.hibernate.cfg.Ejb3JoinColumn;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.PropertyHolder;
-import org.hibernate.cfg.PropertyHolderBuilder;
-import org.hibernate.cfg.SecondPass;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.IndexBackref;
-import org.hibernate.mapping.List;
-import org.hibernate.mapping.OneToMany;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-
-/**
- * Bind a list
- *
- * @author Matthew Inger
- * @author Emmanuel Bernard
- */
-public class ListBinder extends CollectionBinder {
- private static Log log = LogFactory.getLog( ListBinder.class );
-
- public ListBinder() {
- }
-
- protected Collection createCollection(PersistentClass persistentClass) {
- return new org.hibernate.mapping.List( persistentClass );
- }
-
- public void setSqlOrderBy(OrderBy orderByAnn) {
- if ( orderByAnn != null ) log.warn( "@OrderBy not allowed for a indexed collection, annotation ignored." );
- }
-
- public void setSort(Sort sortAnn) {
- if ( sortAnn != null ) log.warn( "@Sort not allowed for a indexed collection, annotation ignored." );
- }
-
- @Override
- public SecondPass getSecondPass(
- final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns,
- final Ejb3JoinColumn[] inverseColumns,
- final Ejb3Column[] elementColumns,
- Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
- final XProperty property, final XClass collType,
- final boolean ignoreNotFound, final boolean unique,
- final TableBinder assocTableBinder, final ExtendedMappings mappings
- ) {
- return new CollectionSecondPass( mappings, ListBinder.this.collection ) {
- public void secondPass(Map persistentClasses, Map inheritedMetas)
- throws MappingException {
- bindStarToManySecondPass(
- persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns,
- isEmbedded, property, unique, assocTableBinder, ignoreNotFound, mappings
- );
- bindIndex( mappings );
- }
- };
- }
-
- private void bindIndex(final ExtendedMappings mappings) {
- if ( indexColumn.isImplicit() == false ) {
- PropertyHolder valueHolder = PropertyHolderBuilder.buildPropertyHolder(
- this.collection,
- StringHelper.qualify( this.collection.getRole(), "key" ),
- (XClass) null,
- (XProperty) null, propertyHolder, mappings
- );
- List list = (List) this.collection;
- if ( ! list.isOneToMany() ) indexColumn.forceNotNull();
- indexColumn.setPropertyHolder( valueHolder );
- SimpleValueBinder value = new SimpleValueBinder();
- value.setColumns( new Ejb3Column[]{indexColumn} );
- value.setExplicitType( "integer" );
- value.setMappings( mappings );
- SimpleValue indexValue = value.make();
- indexColumn.linkWithValue( indexValue );
- list.setIndex( indexValue );
- list.setBaseIndex( indexColumn.getBase() );
- if ( list.isOneToMany() && !list.getKey().isNullable() && !list.isInverse() ) {
- String entityName = ( (OneToMany) list.getElement() ).getReferencedEntityName();
- PersistentClass referenced = mappings.getClass( entityName );
- IndexBackref ib = new IndexBackref();
- ib.setName( '_' + propertyName + "IndexBackref" );
- ib.setUpdateable( false );
- ib.setSelectable( false );
- ib.setCollectionRole( list.getRole() );
- ib.setEntityName( list.getOwner().getEntityName() );
- ib.setValue( list.getIndex() );
- referenced.addProperty( ib );
- }
- }
- else {
- Collection coll = this.collection;
- throw new AnnotationException(
- "List/array has to be annotated with an @IndexColumn: "
- + coll.getRole()
- );
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ListBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ListBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ListBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ListBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,114 @@
+package org.hibernate.cfg.annotations;
+
+import java.util.Map;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AnnotationException;
+import org.hibernate.MappingException;
+import org.hibernate.util.StringHelper;
+import org.hibernate.annotations.OrderBy;
+import org.hibernate.annotations.Sort;
+import org.hibernate.cfg.CollectionSecondPass;
+import org.hibernate.cfg.Ejb3Column;
+import org.hibernate.cfg.Ejb3JoinColumn;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.PropertyHolder;
+import org.hibernate.cfg.PropertyHolderBuilder;
+import org.hibernate.cfg.SecondPass;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.IndexBackref;
+import org.hibernate.mapping.List;
+import org.hibernate.mapping.OneToMany;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+
+/**
+ * Bind a list
+ *
+ * @author Matthew Inger
+ * @author Emmanuel Bernard
+ */
+public class ListBinder extends CollectionBinder {
+ private static Log log = LogFactory.getLog( ListBinder.class );
+
+ public ListBinder() {
+ }
+
+ protected Collection createCollection(PersistentClass persistentClass) {
+ return new org.hibernate.mapping.List( persistentClass );
+ }
+
+ public void setSqlOrderBy(OrderBy orderByAnn) {
+ if ( orderByAnn != null ) log.warn( "@OrderBy not allowed for a indexed collection, annotation ignored." );
+ }
+
+ public void setSort(Sort sortAnn) {
+ if ( sortAnn != null ) log.warn( "@Sort not allowed for a indexed collection, annotation ignored." );
+ }
+
+ @Override
+ public SecondPass getSecondPass(
+ final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns,
+ final Ejb3JoinColumn[] inverseColumns,
+ final Ejb3Column[] elementColumns,
+ Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
+ final XProperty property, final XClass collType,
+ final boolean ignoreNotFound, final boolean unique,
+ final TableBinder assocTableBinder, final ExtendedMappings mappings
+ ) {
+ return new CollectionSecondPass( mappings, ListBinder.this.collection ) {
+ public void secondPass(Map persistentClasses, Map inheritedMetas)
+ throws MappingException {
+ bindStarToManySecondPass(
+ persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns,
+ isEmbedded, property, unique, assocTableBinder, ignoreNotFound, mappings
+ );
+ bindIndex( mappings );
+ }
+ };
+ }
+
+ private void bindIndex(final ExtendedMappings mappings) {
+ if ( indexColumn.isImplicit() == false ) {
+ PropertyHolder valueHolder = PropertyHolderBuilder.buildPropertyHolder(
+ this.collection,
+ StringHelper.qualify( this.collection.getRole(), "key" ),
+ (XClass) null,
+ (XProperty) null, propertyHolder, mappings
+ );
+ List list = (List) this.collection;
+ if ( ! list.isOneToMany() ) indexColumn.forceNotNull();
+ indexColumn.setPropertyHolder( valueHolder );
+ SimpleValueBinder value = new SimpleValueBinder();
+ value.setColumns( new Ejb3Column[]{indexColumn} );
+ value.setExplicitType( "integer" );
+ value.setMappings( mappings );
+ SimpleValue indexValue = value.make();
+ indexColumn.linkWithValue( indexValue );
+ list.setIndex( indexValue );
+ list.setBaseIndex( indexColumn.getBase() );
+ if ( list.isOneToMany() && !list.getKey().isNullable() && !list.isInverse() ) {
+ String entityName = ( (OneToMany) list.getElement() ).getReferencedEntityName();
+ PersistentClass referenced = mappings.getClass( entityName );
+ IndexBackref ib = new IndexBackref();
+ ib.setName( '_' + propertyName + "IndexBackref" );
+ ib.setUpdateable( false );
+ ib.setSelectable( false );
+ ib.setCollectionRole( list.getRole() );
+ ib.setEntityName( list.getOwner().getEntityName() );
+ ib.setValue( list.getIndex() );
+ referenced.addProperty( ib );
+ }
+ }
+ else {
+ Collection coll = this.collection;
+ throw new AnnotationException(
+ "List/array has to be annotated with an @IndexColumn: "
+ + coll.getRole()
+ );
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/MapBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/MapBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/MapBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,383 +0,0 @@
-//$Id$
-package org.hibernate.cfg.annotations;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Random;
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.FetchMode;
-import org.hibernate.MappingException;
-import org.hibernate.annotations.MapKeyManyToMany;
-import org.hibernate.cfg.AnnotatedClassType;
-import org.hibernate.cfg.AnnotationBinder;
-import org.hibernate.cfg.BinderHelper;
-import org.hibernate.cfg.CollectionSecondPass;
-import org.hibernate.cfg.Ejb3Column;
-import org.hibernate.cfg.Ejb3JoinColumn;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.PropertyData;
-import org.hibernate.cfg.PropertyHolder;
-import org.hibernate.cfg.PropertyHolderBuilder;
-import org.hibernate.cfg.PropertyPreloadedData;
-import org.hibernate.cfg.SecondPass;
-import org.hibernate.dialect.HSQLDialect;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Component;
-import org.hibernate.mapping.DependantValue;
-import org.hibernate.mapping.Formula;
-import org.hibernate.mapping.Join;
-import org.hibernate.mapping.ManyToOne;
-import org.hibernate.mapping.OneToMany;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.ToOne;
-import org.hibernate.mapping.Value;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.sql.Template;
-import org.hibernate.util.StringHelper;
-
-/**
- * Implementation to bind a Map
- *
- * @author Emmanuel Bernard
- */
-public class MapBinder extends CollectionBinder {
- public MapBinder(boolean sorted) {
- super(sorted);
- }
-
- public MapBinder() {
- super();
- }
-
- protected Collection createCollection(PersistentClass persistentClass) {
- return new org.hibernate.mapping.Map( persistentClass );
- }
-
- @Override
- public SecondPass getSecondPass(
- final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns,
- final Ejb3JoinColumn[] inverseColumns,
- final Ejb3Column[] elementColumns,
- final Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
- final XProperty property, final XClass collType,
- final boolean ignoreNotFound, final boolean unique,
- final TableBinder assocTableBinder, final ExtendedMappings mappings
- ) {
- return new CollectionSecondPass( mappings, MapBinder.this.collection ) {
- public void secondPass(Map persistentClasses, Map inheritedMetas)
- throws MappingException {
- bindStarToManySecondPass(
- persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns,
- isEmbedded, property, unique, assocTableBinder, ignoreNotFound, mappings
- );
- bindKeyFromAssociationTable(
- collType, persistentClasses, mapKeyPropertyName, property, isEmbedded, mappings,
- mapKeyColumns, mapKeyManyToManyColumns,
- inverseColumns != null ? inverseColumns[0].getPropertyName() : null
- );
- }
- };
- }
-
- private void bindKeyFromAssociationTable(
- XClass collType, Map persistentClasses, String mapKeyPropertyName, XProperty property,
- boolean isEmbedded, ExtendedMappings mappings, Ejb3Column[] mapKeyColumns,
- Ejb3JoinColumn[] mapKeyManyToManyColumns, String targetPropertyName
- ) {
- if ( mapKeyPropertyName != null ) {
- //this is an EJB3 @MapKey
- PersistentClass associatedClass = (PersistentClass) persistentClasses.get( collType.getName() );
- if ( associatedClass == null ) throw new AnnotationException( "Associated class not found: " + collType );
- Property mapProperty = BinderHelper.findPropertyByName( associatedClass, mapKeyPropertyName );
- if ( mapProperty == null ) {
- throw new AnnotationException(
- "Map key property not found: " + collType + "." + mapKeyPropertyName
- );
- }
- org.hibernate.mapping.Map map = (org.hibernate.mapping.Map) this.collection;
- Value indexValue = createFormulatedValue( mapProperty.getValue(), map, targetPropertyName, associatedClass );
- map.setIndex( indexValue );
- }
- else {
- //this is a true Map mapping
- //TODO ugly copy/pastle from CollectionBinder.bindManyToManySecondPass
- String mapKeyType;
- Class target = void.class;
- /*
- * target has priority over reflection for the map key type
- */
- if ( property.isAnnotationPresent( org.hibernate.annotations.MapKey.class ) ) {
- target = property.getAnnotation( org.hibernate.annotations.MapKey.class ).targetElement();
- }
- else if ( property.isAnnotationPresent( MapKeyManyToMany.class ) ) {
- target = property.getAnnotation( MapKeyManyToMany.class ).targetEntity();
- }
- if ( ! void.class.equals( target ) ) {
- mapKeyType = target.getName();
- }
- else {
- mapKeyType = property.getMapKey().getName();
- }
- PersistentClass collectionEntity = (PersistentClass) persistentClasses.get( mapKeyType );
- boolean isIndexOfEntities = collectionEntity != null;
- ManyToOne element = null;
- org.hibernate.mapping.Map mapValue = (org.hibernate.mapping.Map) this.collection;
- if ( isIndexOfEntities ) {
- element = new ManyToOne( mapValue.getCollectionTable() );
- mapValue.setIndex( element );
- element.setReferencedEntityName( mapKeyType );
- //element.setFetchMode( fetchMode );
- //element.setLazy( fetchMode != FetchMode.JOIN );
- //make the second join non lazy
- element.setFetchMode( FetchMode.JOIN );
- element.setLazy( false );
- //does not make sense for a map key element.setIgnoreNotFound( ignoreNotFound );
- }
- else {
- XClass elementClass;
- AnnotatedClassType classType;
- // Map<String, javax.persistence.Column[]> columnOverrides = PropertyHolderBuilder.buildColumnOverride(
- // property, StringHelper.qualify( collValue.getRole(), "element" )
- // );
- //FIXME the "element" is lost
- PropertyHolder holder = null;
- if ( BinderHelper.PRIMITIVE_NAMES.contains( mapKeyType ) ) {
- classType = AnnotatedClassType.NONE;
- elementClass = null;
- }
- else {
- try {
- elementClass = mappings.getReflectionManager().classForName( mapKeyType, MapBinder.class );
- }
- catch (ClassNotFoundException e) {
- throw new AnnotationException( "Unable to find class: " + mapKeyType, e );
- }
- classType = mappings.getClassType( elementClass );
-
- holder = PropertyHolderBuilder.buildPropertyHolder(
- mapValue,
- StringHelper.qualify( mapValue.getRole(), "mapkey" ),
- elementClass,
- property, propertyHolder, mappings
- );
- //force in case of attribute override
- boolean attributeOverride = property.isAnnotationPresent( AttributeOverride.class )
- || property.isAnnotationPresent( AttributeOverrides.class );
- if ( isEmbedded || attributeOverride ) {
- classType = AnnotatedClassType.EMBEDDABLE;
- }
- }
-
- if ( AnnotatedClassType.EMBEDDABLE.equals( classType ) ) {
- EntityBinder entityBinder = new EntityBinder();
- PersistentClass owner = mapValue.getOwner();
- boolean isPropertyAnnotated;
- //FIXME support @Access for collection of elements
- //String accessType = access != null ? access.value() : null;
- if ( owner.getIdentifierProperty() != null ) {
- isPropertyAnnotated = owner.getIdentifierProperty()
- .getPropertyAccessorName()
- .equals( "property" );
- }
- else
- if ( owner.getIdentifierMapper() != null && owner.getIdentifierMapper().getPropertySpan() > 0 ) {
- Property prop = (Property) owner.getIdentifierMapper().getPropertyIterator().next();
- isPropertyAnnotated = prop.getPropertyAccessorName().equals( "property" );
- }
- else {
- throw new AssertionFailure( "Unable to guess collection property accessor name" );
- }
-
- //boolean propertyAccess = embeddable == null || AccessType.PROPERTY.equals( embeddable.access() );
- //FIXME "index" is it right?
- PropertyData inferredData = new PropertyPreloadedData( "property", "index", elementClass );
- //TODO be smart with isNullable
- Component component = AnnotationBinder.fillComponent(
- holder, inferredData, isPropertyAnnotated, isPropertyAnnotated ? "property" : "field", true,
- entityBinder, false, false,
- true, mappings
- );
- mapValue.setIndex( component );
- }
- else {
- SimpleValueBinder elementBinder = new SimpleValueBinder();
- elementBinder.setMappings( mappings );
- elementBinder.setReturnedClassName( mapKeyType );
-
- Ejb3Column[] elementColumns = mapKeyColumns;
- if ( elementColumns == null || elementColumns.length == 0 ) {
- elementColumns = new Ejb3Column[1];
- Ejb3Column column = new Ejb3Column();
- column.setImplicit( false );
- column.setNullable( true );
- column.setLength( Ejb3Column.DEFAULT_COLUMN_LENGTH );
- column.setLogicalColumnName( Collection.DEFAULT_KEY_COLUMN_NAME );
- //TODO create an EMPTY_JOINS collection
- column.setJoins( new HashMap<String, Join>() );
- column.setMappings( mappings );
- column.bind();
- elementColumns[0] = column;
- }
- //override the table
- for ( Ejb3Column column : elementColumns ) {
- column.setTable( mapValue.getCollectionTable() );
- }
- elementBinder.setColumns( elementColumns );
- elementBinder.setType( property, elementClass );
- mapValue.setIndex( elementBinder.make() );
- }
- }
- //FIXME pass the Index Entity JoinColumns
- if ( ! collection.isOneToMany() ) {
- //index column shoud not be null
- for ( Ejb3JoinColumn col : mapKeyManyToManyColumns ) {
- col.forceNotNull();
- }
- }
- if ( isIndexOfEntities ) {
- bindManytoManyInverseFk(
- collectionEntity,
- mapKeyManyToManyColumns,
- element,
- false, //a map key column has no unique constraint
- mappings
- );
- }
- }
- }
-
- protected Value createFormulatedValue(
- Value value, Collection collection, String targetPropertyName, PersistentClass associatedClass
- ) {
- Value element = collection.getElement();
- String fromAndWhere = null;
- if ( ! ( element instanceof OneToMany ) ) {
- String referencedPropertyName= null;
- if ( element instanceof ToOne ) {
- referencedPropertyName = ( (ToOne) element ).getReferencedPropertyName();
- }
- else if ( element instanceof DependantValue ) {
- //TODO this never happen I think
- if ( propertyName != null ) {
- referencedPropertyName = collection.getReferencedPropertyName();
- }
- else {
- throw new AnnotationException( "SecondaryTable JoinColumn cannot reference a non primary key" );
- }
- }
- Iterator referencedEntityColumns;
- if (referencedPropertyName == null) {
- referencedEntityColumns = associatedClass.getIdentifier().getColumnIterator();
- }
- else {
- Property referencedProperty = associatedClass.getRecursiveProperty( referencedPropertyName );
- referencedEntityColumns = referencedProperty.getColumnIterator();
- }
- String alias = "$alias$";
- StringBuilder fromAndWhereSb = new StringBuilder( " from " )
- .append( associatedClass.getTable().getName() )
- //.append(" as ") //Oracle doesn't support it in subqueries
- .append(" ")
- .append(alias).append(" where ");
- Iterator collectionTableColumns = element.getColumnIterator();
- while ( collectionTableColumns.hasNext() ) {
- Column colColumn = (Column) collectionTableColumns.next();
- Column refColumn = (Column) referencedEntityColumns.next();
- fromAndWhereSb.append(alias).append('.').append( refColumn.getQuotedName() )
- .append('=').append( colColumn.getQuotedName() ).append(" and ");
- }
- fromAndWhere = fromAndWhereSb.substring(0, fromAndWhereSb.length() - 5 );
- }
-
- if ( value instanceof Component ) {
- Component component = (Component) value;
- Iterator properties = component.getPropertyIterator();
- Component indexComponent = new Component( collection );
- indexComponent.setComponentClassName( component.getComponentClassName() );
- //TODO I don't know if this is appropriate
- indexComponent.setNodeName( "index" );
- while ( properties.hasNext() ) {
- Property current = (Property) properties.next();
- Property newProperty = new Property();
- newProperty.setCascade( current.getCascade() );
- newProperty.setGeneration( current.getGeneration() );
- newProperty.setInsertable( false );
- newProperty.setUpdateable( false );
- newProperty.setMetaAttributes( current.getMetaAttributes() );
- newProperty.setName( current.getName() );
- newProperty.setNodeName( current.getNodeName() );
- newProperty.setNaturalIdentifier( false );
- //newProperty.setOptimisticLocked( false );
- newProperty.setOptional( false );
- newProperty.setPersistentClass( current.getPersistentClass() );
- newProperty.setPropertyAccessorName( current.getPropertyAccessorName() );
- newProperty.setSelectable( current.isSelectable() );
- newProperty.setValue( createFormulatedValue( current.getValue(), collection, targetPropertyName,
- associatedClass
- ) );
- indexComponent.addProperty( newProperty );
- }
- return indexComponent;
- }
- else if ( value instanceof SimpleValue ) {
- SimpleValue sourceValue = (SimpleValue) value;
- SimpleValue targetValue;
- if( value instanceof ManyToOne ) {
- ManyToOne sourceManyToOne = (ManyToOne) sourceValue;
- ManyToOne targetManyToOne = new ManyToOne( collection.getCollectionTable() );
- targetManyToOne.setFetchMode( FetchMode.DEFAULT );
- targetManyToOne.setLazy( true );
- //targetValue.setIgnoreNotFound( ); does not make sense for a map key
- targetManyToOne.setReferencedEntityName( sourceManyToOne.getReferencedEntityName() );
- targetValue = targetManyToOne;
- }
- else {
- targetValue = new SimpleValue( collection.getCollectionTable() );
- targetValue.setTypeName( sourceValue.getTypeName() );
- targetValue.setTypeParameters( sourceValue.getTypeParameters() );
- }
- Iterator columns = sourceValue.getColumnIterator();
- Random random = new Random();
- while ( columns.hasNext() ) {
- Object current = columns.next();
- Formula formula = new Formula();
- String formulaString;
- if ( current instanceof Column ) {
- formulaString = ( (Column) current ).getQuotedName();
- }
- else if ( current instanceof Formula ) {
- formulaString = ( (Formula) current ).getFormula();
- }
- else {
- throw new AssertionFailure( "Unknown element in column iterator: " + current.getClass() );
- }
- if (fromAndWhere != null) {
- formulaString = Template.renderWhereStringTemplate( formulaString, "$alias$", new HSQLDialect() );
- formulaString = "(select " + formulaString + fromAndWhere + ")";
- formulaString = StringHelper.replace(
- formulaString,
- "$alias$",
- "a" + random.nextInt( 16 )
- );
- }
- formula.setFormula( formulaString );
- targetValue.addFormula( formula );
-
- }
- return targetValue;
- }
- else {
- throw new AssertionFailure( "Unknown type encounters for map key: " + value.getClass() );
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/MapBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/MapBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/MapBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/MapBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,383 @@
+//$Id$
+package org.hibernate.cfg.annotations;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Random;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.FetchMode;
+import org.hibernate.MappingException;
+import org.hibernate.annotations.MapKeyManyToMany;
+import org.hibernate.cfg.AnnotatedClassType;
+import org.hibernate.cfg.AnnotationBinder;
+import org.hibernate.cfg.BinderHelper;
+import org.hibernate.cfg.CollectionSecondPass;
+import org.hibernate.cfg.Ejb3Column;
+import org.hibernate.cfg.Ejb3JoinColumn;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.PropertyData;
+import org.hibernate.cfg.PropertyHolder;
+import org.hibernate.cfg.PropertyHolderBuilder;
+import org.hibernate.cfg.PropertyPreloadedData;
+import org.hibernate.cfg.SecondPass;
+import org.hibernate.dialect.HSQLDialect;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.DependantValue;
+import org.hibernate.mapping.Formula;
+import org.hibernate.mapping.Join;
+import org.hibernate.mapping.ManyToOne;
+import org.hibernate.mapping.OneToMany;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.ToOne;
+import org.hibernate.mapping.Value;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.sql.Template;
+import org.hibernate.util.StringHelper;
+
+/**
+ * Implementation to bind a Map
+ *
+ * @author Emmanuel Bernard
+ */
+public class MapBinder extends CollectionBinder {
+ public MapBinder(boolean sorted) {
+ super(sorted);
+ }
+
+ public MapBinder() {
+ super();
+ }
+
+ protected Collection createCollection(PersistentClass persistentClass) {
+ return new org.hibernate.mapping.Map( persistentClass );
+ }
+
+ @Override
+ public SecondPass getSecondPass(
+ final Ejb3JoinColumn[] fkJoinColumns, final Ejb3JoinColumn[] keyColumns,
+ final Ejb3JoinColumn[] inverseColumns,
+ final Ejb3Column[] elementColumns,
+ final Ejb3Column[] mapKeyColumns, final Ejb3JoinColumn[] mapKeyManyToManyColumns, final boolean isEmbedded,
+ final XProperty property, final XClass collType,
+ final boolean ignoreNotFound, final boolean unique,
+ final TableBinder assocTableBinder, final ExtendedMappings mappings
+ ) {
+ return new CollectionSecondPass( mappings, MapBinder.this.collection ) {
+ public void secondPass(Map persistentClasses, Map inheritedMetas)
+ throws MappingException {
+ bindStarToManySecondPass(
+ persistentClasses, collType, fkJoinColumns, keyColumns, inverseColumns, elementColumns,
+ isEmbedded, property, unique, assocTableBinder, ignoreNotFound, mappings
+ );
+ bindKeyFromAssociationTable(
+ collType, persistentClasses, mapKeyPropertyName, property, isEmbedded, mappings,
+ mapKeyColumns, mapKeyManyToManyColumns,
+ inverseColumns != null ? inverseColumns[0].getPropertyName() : null
+ );
+ }
+ };
+ }
+
+ private void bindKeyFromAssociationTable(
+ XClass collType, Map persistentClasses, String mapKeyPropertyName, XProperty property,
+ boolean isEmbedded, ExtendedMappings mappings, Ejb3Column[] mapKeyColumns,
+ Ejb3JoinColumn[] mapKeyManyToManyColumns, String targetPropertyName
+ ) {
+ if ( mapKeyPropertyName != null ) {
+ //this is an EJB3 @MapKey
+ PersistentClass associatedClass = (PersistentClass) persistentClasses.get( collType.getName() );
+ if ( associatedClass == null ) throw new AnnotationException( "Associated class not found: " + collType );
+ Property mapProperty = BinderHelper.findPropertyByName( associatedClass, mapKeyPropertyName );
+ if ( mapProperty == null ) {
+ throw new AnnotationException(
+ "Map key property not found: " + collType + "." + mapKeyPropertyName
+ );
+ }
+ org.hibernate.mapping.Map map = (org.hibernate.mapping.Map) this.collection;
+ Value indexValue = createFormulatedValue( mapProperty.getValue(), map, targetPropertyName, associatedClass );
+ map.setIndex( indexValue );
+ }
+ else {
+ //this is a true Map mapping
+ //TODO ugly copy/pastle from CollectionBinder.bindManyToManySecondPass
+ String mapKeyType;
+ Class target = void.class;
+ /*
+ * target has priority over reflection for the map key type
+ */
+ if ( property.isAnnotationPresent( org.hibernate.annotations.MapKey.class ) ) {
+ target = property.getAnnotation( org.hibernate.annotations.MapKey.class ).targetElement();
+ }
+ else if ( property.isAnnotationPresent( MapKeyManyToMany.class ) ) {
+ target = property.getAnnotation( MapKeyManyToMany.class ).targetEntity();
+ }
+ if ( ! void.class.equals( target ) ) {
+ mapKeyType = target.getName();
+ }
+ else {
+ mapKeyType = property.getMapKey().getName();
+ }
+ PersistentClass collectionEntity = (PersistentClass) persistentClasses.get( mapKeyType );
+ boolean isIndexOfEntities = collectionEntity != null;
+ ManyToOne element = null;
+ org.hibernate.mapping.Map mapValue = (org.hibernate.mapping.Map) this.collection;
+ if ( isIndexOfEntities ) {
+ element = new ManyToOne( mapValue.getCollectionTable() );
+ mapValue.setIndex( element );
+ element.setReferencedEntityName( mapKeyType );
+ //element.setFetchMode( fetchMode );
+ //element.setLazy( fetchMode != FetchMode.JOIN );
+ //make the second join non lazy
+ element.setFetchMode( FetchMode.JOIN );
+ element.setLazy( false );
+ //does not make sense for a map key element.setIgnoreNotFound( ignoreNotFound );
+ }
+ else {
+ XClass elementClass;
+ AnnotatedClassType classType;
+ // Map<String, javax.persistence.Column[]> columnOverrides = PropertyHolderBuilder.buildColumnOverride(
+ // property, StringHelper.qualify( collValue.getRole(), "element" )
+ // );
+ //FIXME the "element" is lost
+ PropertyHolder holder = null;
+ if ( BinderHelper.PRIMITIVE_NAMES.contains( mapKeyType ) ) {
+ classType = AnnotatedClassType.NONE;
+ elementClass = null;
+ }
+ else {
+ try {
+ elementClass = mappings.getReflectionManager().classForName( mapKeyType, MapBinder.class );
+ }
+ catch (ClassNotFoundException e) {
+ throw new AnnotationException( "Unable to find class: " + mapKeyType, e );
+ }
+ classType = mappings.getClassType( elementClass );
+
+ holder = PropertyHolderBuilder.buildPropertyHolder(
+ mapValue,
+ StringHelper.qualify( mapValue.getRole(), "mapkey" ),
+ elementClass,
+ property, propertyHolder, mappings
+ );
+ //force in case of attribute override
+ boolean attributeOverride = property.isAnnotationPresent( AttributeOverride.class )
+ || property.isAnnotationPresent( AttributeOverrides.class );
+ if ( isEmbedded || attributeOverride ) {
+ classType = AnnotatedClassType.EMBEDDABLE;
+ }
+ }
+
+ if ( AnnotatedClassType.EMBEDDABLE.equals( classType ) ) {
+ EntityBinder entityBinder = new EntityBinder();
+ PersistentClass owner = mapValue.getOwner();
+ boolean isPropertyAnnotated;
+ //FIXME support @Access for collection of elements
+ //String accessType = access != null ? access.value() : null;
+ if ( owner.getIdentifierProperty() != null ) {
+ isPropertyAnnotated = owner.getIdentifierProperty()
+ .getPropertyAccessorName()
+ .equals( "property" );
+ }
+ else
+ if ( owner.getIdentifierMapper() != null && owner.getIdentifierMapper().getPropertySpan() > 0 ) {
+ Property prop = (Property) owner.getIdentifierMapper().getPropertyIterator().next();
+ isPropertyAnnotated = prop.getPropertyAccessorName().equals( "property" );
+ }
+ else {
+ throw new AssertionFailure( "Unable to guess collection property accessor name" );
+ }
+
+ //boolean propertyAccess = embeddable == null || AccessType.PROPERTY.equals( embeddable.access() );
+ //FIXME "index" is it right?
+ PropertyData inferredData = new PropertyPreloadedData( "property", "index", elementClass );
+ //TODO be smart with isNullable
+ Component component = AnnotationBinder.fillComponent(
+ holder, inferredData, isPropertyAnnotated, isPropertyAnnotated ? "property" : "field", true,
+ entityBinder, false, false,
+ true, mappings
+ );
+ mapValue.setIndex( component );
+ }
+ else {
+ SimpleValueBinder elementBinder = new SimpleValueBinder();
+ elementBinder.setMappings( mappings );
+ elementBinder.setReturnedClassName( mapKeyType );
+
+ Ejb3Column[] elementColumns = mapKeyColumns;
+ if ( elementColumns == null || elementColumns.length == 0 ) {
+ elementColumns = new Ejb3Column[1];
+ Ejb3Column column = new Ejb3Column();
+ column.setImplicit( false );
+ column.setNullable( true );
+ column.setLength( Ejb3Column.DEFAULT_COLUMN_LENGTH );
+ column.setLogicalColumnName( Collection.DEFAULT_KEY_COLUMN_NAME );
+ //TODO create an EMPTY_JOINS collection
+ column.setJoins( new HashMap<String, Join>() );
+ column.setMappings( mappings );
+ column.bind();
+ elementColumns[0] = column;
+ }
+ //override the table
+ for ( Ejb3Column column : elementColumns ) {
+ column.setTable( mapValue.getCollectionTable() );
+ }
+ elementBinder.setColumns( elementColumns );
+ elementBinder.setType( property, elementClass );
+ mapValue.setIndex( elementBinder.make() );
+ }
+ }
+ //FIXME pass the Index Entity JoinColumns
+ if ( ! collection.isOneToMany() ) {
+ //index column shoud not be null
+ for ( Ejb3JoinColumn col : mapKeyManyToManyColumns ) {
+ col.forceNotNull();
+ }
+ }
+ if ( isIndexOfEntities ) {
+ bindManytoManyInverseFk(
+ collectionEntity,
+ mapKeyManyToManyColumns,
+ element,
+ false, //a map key column has no unique constraint
+ mappings
+ );
+ }
+ }
+ }
+
+ protected Value createFormulatedValue(
+ Value value, Collection collection, String targetPropertyName, PersistentClass associatedClass
+ ) {
+ Value element = collection.getElement();
+ String fromAndWhere = null;
+ if ( ! ( element instanceof OneToMany ) ) {
+ String referencedPropertyName= null;
+ if ( element instanceof ToOne ) {
+ referencedPropertyName = ( (ToOne) element ).getReferencedPropertyName();
+ }
+ else if ( element instanceof DependantValue ) {
+ //TODO this never happen I think
+ if ( propertyName != null ) {
+ referencedPropertyName = collection.getReferencedPropertyName();
+ }
+ else {
+ throw new AnnotationException( "SecondaryTable JoinColumn cannot reference a non primary key" );
+ }
+ }
+ Iterator referencedEntityColumns;
+ if (referencedPropertyName == null) {
+ referencedEntityColumns = associatedClass.getIdentifier().getColumnIterator();
+ }
+ else {
+ Property referencedProperty = associatedClass.getRecursiveProperty( referencedPropertyName );
+ referencedEntityColumns = referencedProperty.getColumnIterator();
+ }
+ String alias = "$alias$";
+ StringBuilder fromAndWhereSb = new StringBuilder( " from " )
+ .append( associatedClass.getTable().getName() )
+ //.append(" as ") //Oracle doesn't support it in subqueries
+ .append(" ")
+ .append(alias).append(" where ");
+ Iterator collectionTableColumns = element.getColumnIterator();
+ while ( collectionTableColumns.hasNext() ) {
+ Column colColumn = (Column) collectionTableColumns.next();
+ Column refColumn = (Column) referencedEntityColumns.next();
+ fromAndWhereSb.append(alias).append('.').append( refColumn.getQuotedName() )
+ .append('=').append( colColumn.getQuotedName() ).append(" and ");
+ }
+ fromAndWhere = fromAndWhereSb.substring(0, fromAndWhereSb.length() - 5 );
+ }
+
+ if ( value instanceof Component ) {
+ Component component = (Component) value;
+ Iterator properties = component.getPropertyIterator();
+ Component indexComponent = new Component( collection );
+ indexComponent.setComponentClassName( component.getComponentClassName() );
+ //TODO I don't know if this is appropriate
+ indexComponent.setNodeName( "index" );
+ while ( properties.hasNext() ) {
+ Property current = (Property) properties.next();
+ Property newProperty = new Property();
+ newProperty.setCascade( current.getCascade() );
+ newProperty.setGeneration( current.getGeneration() );
+ newProperty.setInsertable( false );
+ newProperty.setUpdateable( false );
+ newProperty.setMetaAttributes( current.getMetaAttributes() );
+ newProperty.setName( current.getName() );
+ newProperty.setNodeName( current.getNodeName() );
+ newProperty.setNaturalIdentifier( false );
+ //newProperty.setOptimisticLocked( false );
+ newProperty.setOptional( false );
+ newProperty.setPersistentClass( current.getPersistentClass() );
+ newProperty.setPropertyAccessorName( current.getPropertyAccessorName() );
+ newProperty.setSelectable( current.isSelectable() );
+ newProperty.setValue( createFormulatedValue( current.getValue(), collection, targetPropertyName,
+ associatedClass
+ ) );
+ indexComponent.addProperty( newProperty );
+ }
+ return indexComponent;
+ }
+ else if ( value instanceof SimpleValue ) {
+ SimpleValue sourceValue = (SimpleValue) value;
+ SimpleValue targetValue;
+ if( value instanceof ManyToOne ) {
+ ManyToOne sourceManyToOne = (ManyToOne) sourceValue;
+ ManyToOne targetManyToOne = new ManyToOne( collection.getCollectionTable() );
+ targetManyToOne.setFetchMode( FetchMode.DEFAULT );
+ targetManyToOne.setLazy( true );
+ //targetValue.setIgnoreNotFound( ); does not make sense for a map key
+ targetManyToOne.setReferencedEntityName( sourceManyToOne.getReferencedEntityName() );
+ targetValue = targetManyToOne;
+ }
+ else {
+ targetValue = new SimpleValue( collection.getCollectionTable() );
+ targetValue.setTypeName( sourceValue.getTypeName() );
+ targetValue.setTypeParameters( sourceValue.getTypeParameters() );
+ }
+ Iterator columns = sourceValue.getColumnIterator();
+ Random random = new Random();
+ while ( columns.hasNext() ) {
+ Object current = columns.next();
+ Formula formula = new Formula();
+ String formulaString;
+ if ( current instanceof Column ) {
+ formulaString = ( (Column) current ).getQuotedName();
+ }
+ else if ( current instanceof Formula ) {
+ formulaString = ( (Formula) current ).getFormula();
+ }
+ else {
+ throw new AssertionFailure( "Unknown element in column iterator: " + current.getClass() );
+ }
+ if (fromAndWhere != null) {
+ formulaString = Template.renderWhereStringTemplate( formulaString, "$alias$", new HSQLDialect() );
+ formulaString = "(select " + formulaString + fromAndWhere + ")";
+ formulaString = StringHelper.replace(
+ formulaString,
+ "$alias$",
+ "a" + random.nextInt( 16 )
+ );
+ }
+ formula.setFormula( formulaString );
+ targetValue.addFormula( formula );
+
+ }
+ return targetValue;
+ }
+ else {
+ throw new AssertionFailure( "Unknown type encounters for map key: " + value.getClass() );
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Nullability.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Nullability.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Nullability.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-package org.hibernate.cfg.annotations;
-
-/**
- * Are the columns forced to null, not null or not forced
- *
- * @author Emmanuel Bernard
- */
-public enum Nullability {
- FORCED_NULL,
- FORCED_NOT_NULL,
- NO_CONSTRAINT
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Nullability.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Nullability.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Nullability.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Nullability.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+package org.hibernate.cfg.annotations;
+
+/**
+ * Are the columns forced to null, not null or not forced
+ *
+ * @author Emmanuel Bernard
+ */
+public enum Nullability {
+ FORCED_NULL,
+ FORCED_NOT_NULL,
+ NO_CONSTRAINT
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PrimitiveArrayBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PrimitiveArrayBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PrimitiveArrayBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id$
-package org.hibernate.cfg.annotations;
-
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.PrimitiveArray;
-
-/**
- * @author Emmanuel Bernard
- */
-public class PrimitiveArrayBinder extends ArrayBinder {
- @Override
- protected Collection createCollection(PersistentClass persistentClass) {
- return new PrimitiveArray( persistentClass );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PrimitiveArrayBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PrimitiveArrayBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PrimitiveArrayBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PrimitiveArrayBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id$
+package org.hibernate.cfg.annotations;
+
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.PrimitiveArray;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PrimitiveArrayBinder extends ArrayBinder {
+ @Override
+ protected Collection createCollection(PersistentClass persistentClass) {
+ return new PrimitiveArray( persistentClass );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PropertyBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PropertyBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PropertyBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,183 +0,0 @@
-//$Id$
-package org.hibernate.cfg.annotations;
-
-import javax.persistence.Id;
-import javax.persistence.EmbeddedId;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AnnotationException;
-import org.hibernate.annotations.Generated;
-import org.hibernate.annotations.GenerationTime;
-import org.hibernate.annotations.OptimisticLock;
-import org.hibernate.cfg.Ejb3Column;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.PropertyHolder;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.PropertyGeneration;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.Value;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class PropertyBinder {
- private static Log log = LogFactory.getLog( PropertyBinder.class );
- private String name;
- private String returnedClassName;
- private boolean lazy;
- private String propertyAccessorName;
- private Ejb3Column[] columns;
- private PropertyHolder holder;
- private ExtendedMappings mappings;
- private Value value;
- private boolean insertable = true;
- private boolean updatable = true;
- private String cascade;
- /*
- * property can be null
- * prefer propertyName to property.getName() since some are overloaded
- */
- private XProperty property;
- private XClass returnedClass;
-
- public void setInsertable(boolean insertable) {
- this.insertable = insertable;
- }
-
- public void setUpdatable(boolean updatable) {
- this.updatable = updatable;
- }
-
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setReturnedClassName(String returnedClassName) {
- this.returnedClassName = returnedClassName;
- }
-
- public void setLazy(boolean lazy) {
- this.lazy = lazy;
- }
-
- public void setPropertyAccessorName(String propertyAccessorName) {
- this.propertyAccessorName = propertyAccessorName;
- }
-
- public void setColumns(Ejb3Column[] columns) {
- insertable = columns[0].isInsertable();
- updatable = columns[0].isUpdatable();
- //concsistency is checked later when we know the proeprty name
- this.columns = columns;
- }
-
- public void setHolder(PropertyHolder holder) {
- this.holder = holder;
- }
-
- public void setValue(Value value) {
- this.value = value;
- }
-
- public void setCascade(String cascadeStrategy) {
- this.cascade = cascadeStrategy;
- }
-
- public void setMappings(ExtendedMappings mappings) {
- this.mappings = mappings;
- }
-
- private void validateBind() {
- //TODO check necessary params for a bind
- }
-
- private void validateMake() {
- //TODO check necessary params for a make
- }
-
- public Property bind() {
- validateBind();
- if ( log.isDebugEnabled() ) {
- log.debug( "binding property " + name + " with lazy=" + lazy );
- }
- String containerClassName = holder == null ?
- null :
- holder.getClassName();
- SimpleValueBinder value = new SimpleValueBinder();
- value.setMappings( mappings );
- value.setPropertyName( name );
- value.setReturnedClassName( returnedClassName );
- value.setColumns( columns );
- value.setPersistentClassName( containerClassName );
- value.setType( property, returnedClass );
- value.setMappings( mappings );
- SimpleValue propertyValue = value.make();
- setValue( propertyValue );
- Property prop = make();
- holder.addProperty( prop, columns );
- return prop;
- }
-
- public Property make() {
- validateMake();
- log.debug( "Building property " + name );
- Property prop = new Property();
- prop.setName( name );
- prop.setNodeName( name );
- prop.setValue( value );
- prop.setLazy( lazy );
- prop.setCascade( cascade );
- prop.setPropertyAccessorName( propertyAccessorName );
- Generated ann = property != null ?
- property.getAnnotation( Generated.class ) :
- null;
- GenerationTime generated = ann != null ?
- ann.value() :
- null;
- if ( generated != null ) {
- if ( !GenerationTime.NEVER.equals( generated ) ) {
- if ( property.isAnnotationPresent( javax.persistence.Version.class )
- && GenerationTime.INSERT.equals( generated ) ) {
- throw new AnnotationException( "@Generated(INSERT) on a @Version property not allowed, use ALWAYS: "
- + StringHelper.qualify( holder.getPath(), name ) );
- }
- insertable = false;
- if ( GenerationTime.ALWAYS.equals( generated ) ) {
- updatable = false;
- }
- prop.setGeneration( PropertyGeneration.parse( generated.toString().toLowerCase() ) );
- }
- }
- prop.setInsertable( insertable );
- prop.setUpdateable( updatable );
- OptimisticLock lockAnn = property != null ?
- property.getAnnotation( OptimisticLock.class ) :
- null;
- if ( lockAnn != null) {
- prop.setOptimisticLocked( ! lockAnn.excluded() );
- //TODO this should go to the core as a mapping validation checking
- if ( lockAnn.excluded() && (
- property.isAnnotationPresent( javax.persistence.Version.class )
- || property.isAnnotationPresent( Id.class )
- || property.isAnnotationPresent( EmbeddedId.class ) ) ) {
- throw new AnnotationException("@OptimisticLock.exclude=true incompatible with @Id, @EmbeddedId and @Version: "
- + StringHelper.qualify( holder.getPath(), name ) );
- }
- }
- log.trace( "Cascading " + name + " with " + cascade );
- return prop;
- }
-
- public void setProperty(XProperty property) {
- this.property = property;
- }
-
- public void setReturnedClass(XClass returnedClass) {
- this.returnedClass = returnedClass;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PropertyBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PropertyBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PropertyBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/PropertyBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,183 @@
+//$Id$
+package org.hibernate.cfg.annotations;
+
+import javax.persistence.Id;
+import javax.persistence.EmbeddedId;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AnnotationException;
+import org.hibernate.annotations.Generated;
+import org.hibernate.annotations.GenerationTime;
+import org.hibernate.annotations.OptimisticLock;
+import org.hibernate.cfg.Ejb3Column;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.PropertyHolder;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.PropertyGeneration;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.Value;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PropertyBinder {
+ private static Log log = LogFactory.getLog( PropertyBinder.class );
+ private String name;
+ private String returnedClassName;
+ private boolean lazy;
+ private String propertyAccessorName;
+ private Ejb3Column[] columns;
+ private PropertyHolder holder;
+ private ExtendedMappings mappings;
+ private Value value;
+ private boolean insertable = true;
+ private boolean updatable = true;
+ private String cascade;
+ /*
+ * property can be null
+ * prefer propertyName to property.getName() since some are overloaded
+ */
+ private XProperty property;
+ private XClass returnedClass;
+
+ public void setInsertable(boolean insertable) {
+ this.insertable = insertable;
+ }
+
+ public void setUpdatable(boolean updatable) {
+ this.updatable = updatable;
+ }
+
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setReturnedClassName(String returnedClassName) {
+ this.returnedClassName = returnedClassName;
+ }
+
+ public void setLazy(boolean lazy) {
+ this.lazy = lazy;
+ }
+
+ public void setPropertyAccessorName(String propertyAccessorName) {
+ this.propertyAccessorName = propertyAccessorName;
+ }
+
+ public void setColumns(Ejb3Column[] columns) {
+ insertable = columns[0].isInsertable();
+ updatable = columns[0].isUpdatable();
+ //concsistency is checked later when we know the proeprty name
+ this.columns = columns;
+ }
+
+ public void setHolder(PropertyHolder holder) {
+ this.holder = holder;
+ }
+
+ public void setValue(Value value) {
+ this.value = value;
+ }
+
+ public void setCascade(String cascadeStrategy) {
+ this.cascade = cascadeStrategy;
+ }
+
+ public void setMappings(ExtendedMappings mappings) {
+ this.mappings = mappings;
+ }
+
+ private void validateBind() {
+ //TODO check necessary params for a bind
+ }
+
+ private void validateMake() {
+ //TODO check necessary params for a make
+ }
+
+ public Property bind() {
+ validateBind();
+ if ( log.isDebugEnabled() ) {
+ log.debug( "binding property " + name + " with lazy=" + lazy );
+ }
+ String containerClassName = holder == null ?
+ null :
+ holder.getClassName();
+ SimpleValueBinder value = new SimpleValueBinder();
+ value.setMappings( mappings );
+ value.setPropertyName( name );
+ value.setReturnedClassName( returnedClassName );
+ value.setColumns( columns );
+ value.setPersistentClassName( containerClassName );
+ value.setType( property, returnedClass );
+ value.setMappings( mappings );
+ SimpleValue propertyValue = value.make();
+ setValue( propertyValue );
+ Property prop = make();
+ holder.addProperty( prop, columns );
+ return prop;
+ }
+
+ public Property make() {
+ validateMake();
+ log.debug( "Building property " + name );
+ Property prop = new Property();
+ prop.setName( name );
+ prop.setNodeName( name );
+ prop.setValue( value );
+ prop.setLazy( lazy );
+ prop.setCascade( cascade );
+ prop.setPropertyAccessorName( propertyAccessorName );
+ Generated ann = property != null ?
+ property.getAnnotation( Generated.class ) :
+ null;
+ GenerationTime generated = ann != null ?
+ ann.value() :
+ null;
+ if ( generated != null ) {
+ if ( !GenerationTime.NEVER.equals( generated ) ) {
+ if ( property.isAnnotationPresent( javax.persistence.Version.class )
+ && GenerationTime.INSERT.equals( generated ) ) {
+ throw new AnnotationException( "@Generated(INSERT) on a @Version property not allowed, use ALWAYS: "
+ + StringHelper.qualify( holder.getPath(), name ) );
+ }
+ insertable = false;
+ if ( GenerationTime.ALWAYS.equals( generated ) ) {
+ updatable = false;
+ }
+ prop.setGeneration( PropertyGeneration.parse( generated.toString().toLowerCase() ) );
+ }
+ }
+ prop.setInsertable( insertable );
+ prop.setUpdateable( updatable );
+ OptimisticLock lockAnn = property != null ?
+ property.getAnnotation( OptimisticLock.class ) :
+ null;
+ if ( lockAnn != null) {
+ prop.setOptimisticLocked( ! lockAnn.excluded() );
+ //TODO this should go to the core as a mapping validation checking
+ if ( lockAnn.excluded() && (
+ property.isAnnotationPresent( javax.persistence.Version.class )
+ || property.isAnnotationPresent( Id.class )
+ || property.isAnnotationPresent( EmbeddedId.class ) ) ) {
+ throw new AnnotationException("@OptimisticLock.exclude=true incompatible with @Id, @EmbeddedId and @Version: "
+ + StringHelper.qualify( holder.getPath(), name ) );
+ }
+ }
+ log.trace( "Cascading " + name + " with " + cascade );
+ return prop;
+ }
+
+ public void setProperty(XProperty property) {
+ this.property = property;
+ }
+
+ public void setReturnedClass(XClass returnedClass) {
+ this.returnedClass = returnedClass;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/QueryBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/QueryBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/QueryBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,389 +0,0 @@
-//$Id$
-package org.hibernate.cfg.annotations;
-
-import java.util.HashMap;
-import javax.persistence.NamedNativeQueries;
-import javax.persistence.NamedNativeQuery;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.QueryHint;
-import javax.persistence.SqlResultSetMapping;
-import javax.persistence.SqlResultSetMappings;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.CacheMode;
-import org.hibernate.FlushMode;
-import org.hibernate.LockMode;
-import org.hibernate.annotations.CacheModeType;
-import org.hibernate.annotations.FlushModeType;
-import org.hibernate.cfg.BinderHelper;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.NotYetImplementedException;
-import org.hibernate.engine.NamedQueryDefinition;
-import org.hibernate.engine.NamedSQLQueryDefinition;
-import org.hibernate.engine.query.sql.NativeSQLQueryReturn;
-import org.hibernate.engine.query.sql.NativeSQLQueryRootReturn;
-
-/**
- * Query binder
- *
- * @author Emmanuel Bernard
- */
-public abstract class QueryBinder {
- private static Log log = LogFactory.getLog( QueryBinder.class );
-
- public static void bindQuery(NamedQuery queryAnn, ExtendedMappings mappings, boolean isDefault) {
- if ( queryAnn == null ) return;
- if ( BinderHelper.isDefault( queryAnn.name() ) ) {
- throw new AnnotationException( "A named query must have a name when used in class or package level" );
- }
- //EJBQL Query
- QueryHint[] hints = queryAnn.hints();
- String queryName = queryAnn.query();
- NamedQueryDefinition query = new NamedQueryDefinition(
- queryName,
- getBoolean( queryName, "org.hibernate.cacheable", hints ),
- getString( queryName, "org.hibernate.cacheRegion", hints ),
- getInteger( queryName, "org.hibernate.timeout", hints ),
- getInteger( queryName, "org.hibernate.fetchSize", hints ),
- getFlushMode( queryName, hints ),
- getCacheMode( queryName, hints ),
- getBoolean( queryName, "org.hibernate.readOnly", hints ),
- getString( queryName, "org.hibernate.comment", hints ),
- null
- );
- if (isDefault) {
- mappings.addDefaultQuery( queryAnn.name(), query );
- }
- else {
- mappings.addQuery( queryAnn.name(), query );
- }
- if ( log.isInfoEnabled() ) log.info( "Binding Named query: " + queryAnn.name() + " => " + queryAnn.query() );
- }
-
-
- public static void bindNativeQuery(NamedNativeQuery queryAnn, ExtendedMappings mappings, boolean isDefault) {
- if ( queryAnn == null ) return;
- //ResultSetMappingDefinition mappingDefinition = mappings.getResultSetMapping( queryAnn.resultSetMapping() );
- if ( BinderHelper.isDefault( queryAnn.name() ) ) {
- throw new AnnotationException( "A named query must have a name when used in class or package level" );
- }
- NamedSQLQueryDefinition query;
- String resultSetMapping = queryAnn.resultSetMapping();
- QueryHint[] hints = queryAnn.hints();
- String queryName = queryAnn.query();
- if ( ! BinderHelper.isDefault( resultSetMapping ) ) {
- //sql result set usage
- query = new NamedSQLQueryDefinition(
- queryName,
- resultSetMapping,
- null,
- getBoolean( queryName, "org.hibernate.cacheable", hints ),
- getString( queryName, "org.hibernate.cacheRegion", hints ),
- getInteger( queryName, "org.hibernate.timeout", hints ),
- getInteger( queryName, "org.hibernate.fetchSize", hints ),
- getFlushMode( queryName, hints ),
- getCacheMode( queryName, hints ),
- getBoolean( queryName, "org.hibernate.readOnly", hints ),
- getString( queryName, "org.hibernate.comment", hints ),
- null,
- getBoolean( queryName, "org.hibernate.callable", hints )
- );
- }
- else if ( ! void.class.equals( queryAnn.resultClass() ) ) {
- //class mapping usage
- //FIXME should be done in a second pass due to entity name?
- final NativeSQLQueryRootReturn entityQueryReturn =
- new NativeSQLQueryRootReturn( "alias1", queryAnn.resultClass().getName(), new HashMap(), LockMode.READ );
- query = new NamedSQLQueryDefinition(
- queryName,
- new NativeSQLQueryReturn[]{entityQueryReturn},
- null,
- getBoolean( queryName, "org.hibernate.cacheable", hints ),
- getString( queryName, "org.hibernate.cacheRegion", hints ),
- getInteger( queryName, "org.hibernate.timeout", hints ),
- getInteger( queryName, "org.hibernate.fetchSize", hints ),
- getFlushMode( queryName, hints ),
- getCacheMode( queryName, hints ),
- getBoolean( queryName, "org.hibernate.readOnly", hints ),
- getString( queryName, "org.hibernate.comment", hints ),
- null,
- getBoolean( queryName, "org.hibernate.callable", hints )
- );
- }
- else {
- throw new NotYetImplementedException( "Pure native scalar queries are not yet supported" );
- }
- if (isDefault) {
- mappings.addDefaultSQLQuery( queryAnn.name(), query );
- }
- else {
- mappings.addSQLQuery( queryAnn.name(), query );
- }
- if ( log.isInfoEnabled() ) {
- log.info( "Binding named native query: " + queryAnn.name() + " => " + queryAnn.query() );
- }
- }
-
- public static void bindNativeQuery(org.hibernate.annotations.NamedNativeQuery queryAnn, ExtendedMappings mappings) {
- if ( queryAnn == null ) return;
- //ResultSetMappingDefinition mappingDefinition = mappings.getResultSetMapping( queryAnn.resultSetMapping() );
- if ( BinderHelper.isDefault( queryAnn.name() ) ) {
- throw new AnnotationException( "A named query must have a name when used in class or package level" );
- }
- NamedSQLQueryDefinition query;
- String resultSetMapping = queryAnn.resultSetMapping();
- if ( ! BinderHelper.isDefault( resultSetMapping ) ) {
- //sql result set usage
- query = new NamedSQLQueryDefinition(
- queryAnn.query(),
- resultSetMapping,
- null,
- queryAnn.cacheable(),
- BinderHelper.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
- queryAnn.timeout() < 0 ? null : queryAnn.timeout(),
- queryAnn.fetchSize() < 0 ? null : queryAnn.fetchSize(),
- getFlushMode( queryAnn.flushMode() ),
- getCacheMode( queryAnn.cacheMode() ),
- queryAnn.readOnly(),
- BinderHelper.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
- null,
- queryAnn.callable()
- );
- }
- else if ( ! void.class.equals( queryAnn.resultClass() ) ) {
- //class mapping usage
- //FIXME should be done in a second pass due to entity name?
- final NativeSQLQueryRootReturn entityQueryReturn =
- new NativeSQLQueryRootReturn( "alias1", queryAnn.resultClass().getName(), new HashMap(), LockMode.READ );
- query = new NamedSQLQueryDefinition(
- queryAnn.query(),
- new NativeSQLQueryReturn[]{entityQueryReturn},
- null,
- queryAnn.cacheable(),
- BinderHelper.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
- queryAnn.timeout() < 0 ? null : queryAnn.timeout(),
- queryAnn.fetchSize() < 0 ? null : queryAnn.fetchSize(),
- getFlushMode( queryAnn.flushMode() ),
- getCacheMode( queryAnn.cacheMode() ),
- queryAnn.readOnly(),
- BinderHelper.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
- null,
- queryAnn.callable()
- );
- }
- else {
- throw new NotYetImplementedException( "Pure native scalar queries are not yet supported" );
- }
- mappings.addSQLQuery( queryAnn.name(), query );
- if ( log.isInfoEnabled() ) {
- log.info( "Binding named native query: " + queryAnn.name() + " => " + queryAnn.query() );
- }
- }
-
- public static void bindQueries(NamedQueries queriesAnn, ExtendedMappings mappings, boolean isDefault) {
- if ( queriesAnn == null ) return;
- for ( NamedQuery q : queriesAnn.value() ) {
- bindQuery( q, mappings, isDefault );
- }
- }
-
- public static void bindNativeQueries(NamedNativeQueries queriesAnn, ExtendedMappings mappings, boolean isDefault) {
- if ( queriesAnn == null ) return;
- for ( NamedNativeQuery q : queriesAnn.value() ) {
- bindNativeQuery( q, mappings, isDefault );
- }
- }
-
- public static void bindNativeQueries(
- org.hibernate.annotations.NamedNativeQueries queriesAnn, ExtendedMappings mappings
- ) {
- if ( queriesAnn == null ) return;
- for ( org.hibernate.annotations.NamedNativeQuery q : queriesAnn.value() ) {
- bindNativeQuery( q, mappings );
- }
- }
-
- public static void bindQuery(org.hibernate.annotations.NamedQuery queryAnn, ExtendedMappings mappings) {
- if ( queryAnn == null ) return;
- if ( BinderHelper.isDefault( queryAnn.name() ) ) {
- throw new AnnotationException( "A named query must have a name when used in class or package level" );
- }
-
- FlushMode flushMode;
- flushMode = getFlushMode( queryAnn.flushMode() );
-
- NamedQueryDefinition query = new NamedQueryDefinition(
- queryAnn.query(),
- queryAnn.cacheable(),
- BinderHelper.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
- queryAnn.timeout() < 0 ? null : queryAnn.timeout(),
- queryAnn.fetchSize() < 0 ? null : queryAnn.fetchSize(),
- flushMode,
- getCacheMode( queryAnn.cacheMode() ),
- queryAnn.readOnly(),
- BinderHelper.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
- null
- );
-
- mappings.addQuery( queryAnn.name(), query );
- if ( log.isInfoEnabled() ) log.info( "Binding named query: " + queryAnn.name() + " => " + queryAnn.query() );
- }
-
- private static FlushMode getFlushMode(FlushModeType flushModeType) {
- FlushMode flushMode;
- switch ( flushModeType ) {
- case ALWAYS:
- flushMode = FlushMode.ALWAYS;
- break;
- case AUTO:
- flushMode = FlushMode.AUTO;
- break;
- case COMMIT:
- flushMode = FlushMode.COMMIT;
- break;
- case NEVER:
- flushMode = FlushMode.MANUAL;
- break;
- case MANUAL:
- flushMode = FlushMode.MANUAL;
- break;
- default:
- throw new AssertionFailure( "Unknown flushModeType: " + flushModeType );
- }
- return flushMode;
- }
-
- private static CacheMode getCacheMode(CacheModeType cacheModeType) {
- switch ( cacheModeType ) {
- case GET:
- return CacheMode.GET;
- case IGNORE:
- return CacheMode.IGNORE;
- case NORMAL:
- return CacheMode.NORMAL;
- case PUT:
- return CacheMode.PUT;
- case REFRESH:
- return CacheMode.REFRESH;
- default:
- throw new AssertionFailure( "Unknown cacheModeType: " + cacheModeType );
- }
- }
-
-
- public static void bindQueries(org.hibernate.annotations.NamedQueries queriesAnn, ExtendedMappings mappings) {
- if ( queriesAnn == null ) return;
- for ( org.hibernate.annotations.NamedQuery q : queriesAnn.value() ) {
- bindQuery( q, mappings );
- }
- }
-
- public static void bindSqlResultsetMappings(SqlResultSetMappings ann, ExtendedMappings mappings, boolean isDefault) {
- if ( ann == null ) return;
- for ( SqlResultSetMapping rs : ann.value() ) {
- //no need to handle inSecondPass
- mappings.addSecondPass( new ResultsetMappingSecondPass( rs, mappings, true ) );
- }
- }
-
- public static void bindSqlResultsetMapping(SqlResultSetMapping ann, ExtendedMappings mappings, boolean isDefault) {
- //no need to handle inSecondPass
- mappings.addSecondPass( new ResultsetMappingSecondPass( ann, mappings, isDefault ) );
- }
-
- private static CacheMode getCacheMode(String query, QueryHint[] hints) {
- for ( QueryHint hint : hints ) {
- if ( "org.hibernate.cacheMode".equals( hint.name() ) ) {
- if ( hint.value().equalsIgnoreCase( CacheMode.GET.toString() ) ) {
- return CacheMode.GET;
- }
- else if ( hint.value().equalsIgnoreCase( CacheMode.IGNORE.toString() ) ) {
- return CacheMode.IGNORE;
- }
- else if ( hint.value().equalsIgnoreCase( CacheMode.NORMAL.toString() ) ) {
- return CacheMode.NORMAL;
- }
- else if ( hint.value().equalsIgnoreCase( CacheMode.PUT.toString() ) ) {
- return CacheMode.PUT;
- }
- else if ( hint.value().equalsIgnoreCase( CacheMode.REFRESH.toString() ) ) {
- return CacheMode.REFRESH;
- }
- else {
- throw new AnnotationException( "Unknown CacheMode in hint: " + query + ":" + hint.name() );
- }
- }
- }
- return null;
- }
-
- private static FlushMode getFlushMode(String query, QueryHint[] hints) {
- for ( QueryHint hint : hints ) {
- if ( "org.hibernate.flushMode".equals( hint.name() ) ) {
- if ( hint.value().equalsIgnoreCase( FlushMode.ALWAYS.toString() ) ) {
- return FlushMode.ALWAYS;
- }
- else if ( hint.value().equalsIgnoreCase( FlushMode.AUTO.toString() ) ) {
- return FlushMode.AUTO;
- }
- else if ( hint.value().equalsIgnoreCase( FlushMode.COMMIT.toString() ) ) {
- return FlushMode.COMMIT;
- }
- else if ( hint.value().equalsIgnoreCase( FlushMode.NEVER.toString() ) ) {
- return FlushMode.MANUAL;
- }
- else if ( hint.value().equalsIgnoreCase( FlushMode.MANUAL.toString() ) ) {
- return FlushMode.MANUAL;
- }
- else {
- throw new AnnotationException( "Unknown FlushMode in hint: " + query + ":" + hint.name() );
- }
- }
- }
- return null;
- }
-
- private static boolean getBoolean(String query, String hintName, QueryHint[] hints) {
- for ( QueryHint hint : hints ) {
- if ( hintName.equals( hint.name() ) ) {
- if ( hint.value().equalsIgnoreCase( "true" ) ) {
- return true;
- }
- else if ( hint.value().equalsIgnoreCase( "false" ) ) {
- return false;
- }
- else {
- throw new AnnotationException( "Not a boolean in hint: " + query + ":" + hint.name() );
- }
- }
- }
- return false;
- }
-
- private static String getString(String query, String hintName, QueryHint[] hints) {
- for ( QueryHint hint : hints ) {
- if ( hintName.equals( hint.name() ) ) {
- return hint.value();
- }
- }
- return null;
- }
-
- private static Integer getInteger(String query, String hintName, QueryHint[] hints) {
- for ( QueryHint hint : hints ) {
- if ( hintName.equals( hint.name() ) ) {
- try {
- return Integer.decode( hint.value() );
- }
- catch (NumberFormatException nfe) {
- throw new AnnotationException( "Not an integer in hint: " + query + ":" + hint.name(), nfe );
- }
- }
- }
- return null;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/QueryBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/QueryBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/QueryBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/QueryBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,389 @@
+//$Id$
+package org.hibernate.cfg.annotations;
+
+import java.util.HashMap;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.QueryHint;
+import javax.persistence.SqlResultSetMapping;
+import javax.persistence.SqlResultSetMappings;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.CacheMode;
+import org.hibernate.FlushMode;
+import org.hibernate.LockMode;
+import org.hibernate.annotations.CacheModeType;
+import org.hibernate.annotations.FlushModeType;
+import org.hibernate.cfg.BinderHelper;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.NotYetImplementedException;
+import org.hibernate.engine.NamedQueryDefinition;
+import org.hibernate.engine.NamedSQLQueryDefinition;
+import org.hibernate.engine.query.sql.NativeSQLQueryReturn;
+import org.hibernate.engine.query.sql.NativeSQLQueryRootReturn;
+
+/**
+ * Query binder
+ *
+ * @author Emmanuel Bernard
+ */
+public abstract class QueryBinder {
+ private static Log log = LogFactory.getLog( QueryBinder.class );
+
+ public static void bindQuery(NamedQuery queryAnn, ExtendedMappings mappings, boolean isDefault) {
+ if ( queryAnn == null ) return;
+ if ( BinderHelper.isDefault( queryAnn.name() ) ) {
+ throw new AnnotationException( "A named query must have a name when used in class or package level" );
+ }
+ //EJBQL Query
+ QueryHint[] hints = queryAnn.hints();
+ String queryName = queryAnn.query();
+ NamedQueryDefinition query = new NamedQueryDefinition(
+ queryName,
+ getBoolean( queryName, "org.hibernate.cacheable", hints ),
+ getString( queryName, "org.hibernate.cacheRegion", hints ),
+ getInteger( queryName, "org.hibernate.timeout", hints ),
+ getInteger( queryName, "org.hibernate.fetchSize", hints ),
+ getFlushMode( queryName, hints ),
+ getCacheMode( queryName, hints ),
+ getBoolean( queryName, "org.hibernate.readOnly", hints ),
+ getString( queryName, "org.hibernate.comment", hints ),
+ null
+ );
+ if (isDefault) {
+ mappings.addDefaultQuery( queryAnn.name(), query );
+ }
+ else {
+ mappings.addQuery( queryAnn.name(), query );
+ }
+ if ( log.isInfoEnabled() ) log.info( "Binding Named query: " + queryAnn.name() + " => " + queryAnn.query() );
+ }
+
+
+ public static void bindNativeQuery(NamedNativeQuery queryAnn, ExtendedMappings mappings, boolean isDefault) {
+ if ( queryAnn == null ) return;
+ //ResultSetMappingDefinition mappingDefinition = mappings.getResultSetMapping( queryAnn.resultSetMapping() );
+ if ( BinderHelper.isDefault( queryAnn.name() ) ) {
+ throw new AnnotationException( "A named query must have a name when used in class or package level" );
+ }
+ NamedSQLQueryDefinition query;
+ String resultSetMapping = queryAnn.resultSetMapping();
+ QueryHint[] hints = queryAnn.hints();
+ String queryName = queryAnn.query();
+ if ( ! BinderHelper.isDefault( resultSetMapping ) ) {
+ //sql result set usage
+ query = new NamedSQLQueryDefinition(
+ queryName,
+ resultSetMapping,
+ null,
+ getBoolean( queryName, "org.hibernate.cacheable", hints ),
+ getString( queryName, "org.hibernate.cacheRegion", hints ),
+ getInteger( queryName, "org.hibernate.timeout", hints ),
+ getInteger( queryName, "org.hibernate.fetchSize", hints ),
+ getFlushMode( queryName, hints ),
+ getCacheMode( queryName, hints ),
+ getBoolean( queryName, "org.hibernate.readOnly", hints ),
+ getString( queryName, "org.hibernate.comment", hints ),
+ null,
+ getBoolean( queryName, "org.hibernate.callable", hints )
+ );
+ }
+ else if ( ! void.class.equals( queryAnn.resultClass() ) ) {
+ //class mapping usage
+ //FIXME should be done in a second pass due to entity name?
+ final NativeSQLQueryRootReturn entityQueryReturn =
+ new NativeSQLQueryRootReturn( "alias1", queryAnn.resultClass().getName(), new HashMap(), LockMode.READ );
+ query = new NamedSQLQueryDefinition(
+ queryName,
+ new NativeSQLQueryReturn[]{entityQueryReturn},
+ null,
+ getBoolean( queryName, "org.hibernate.cacheable", hints ),
+ getString( queryName, "org.hibernate.cacheRegion", hints ),
+ getInteger( queryName, "org.hibernate.timeout", hints ),
+ getInteger( queryName, "org.hibernate.fetchSize", hints ),
+ getFlushMode( queryName, hints ),
+ getCacheMode( queryName, hints ),
+ getBoolean( queryName, "org.hibernate.readOnly", hints ),
+ getString( queryName, "org.hibernate.comment", hints ),
+ null,
+ getBoolean( queryName, "org.hibernate.callable", hints )
+ );
+ }
+ else {
+ throw new NotYetImplementedException( "Pure native scalar queries are not yet supported" );
+ }
+ if (isDefault) {
+ mappings.addDefaultSQLQuery( queryAnn.name(), query );
+ }
+ else {
+ mappings.addSQLQuery( queryAnn.name(), query );
+ }
+ if ( log.isInfoEnabled() ) {
+ log.info( "Binding named native query: " + queryAnn.name() + " => " + queryAnn.query() );
+ }
+ }
+
+ public static void bindNativeQuery(org.hibernate.annotations.NamedNativeQuery queryAnn, ExtendedMappings mappings) {
+ if ( queryAnn == null ) return;
+ //ResultSetMappingDefinition mappingDefinition = mappings.getResultSetMapping( queryAnn.resultSetMapping() );
+ if ( BinderHelper.isDefault( queryAnn.name() ) ) {
+ throw new AnnotationException( "A named query must have a name when used in class or package level" );
+ }
+ NamedSQLQueryDefinition query;
+ String resultSetMapping = queryAnn.resultSetMapping();
+ if ( ! BinderHelper.isDefault( resultSetMapping ) ) {
+ //sql result set usage
+ query = new NamedSQLQueryDefinition(
+ queryAnn.query(),
+ resultSetMapping,
+ null,
+ queryAnn.cacheable(),
+ BinderHelper.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
+ queryAnn.timeout() < 0 ? null : queryAnn.timeout(),
+ queryAnn.fetchSize() < 0 ? null : queryAnn.fetchSize(),
+ getFlushMode( queryAnn.flushMode() ),
+ getCacheMode( queryAnn.cacheMode() ),
+ queryAnn.readOnly(),
+ BinderHelper.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
+ null,
+ queryAnn.callable()
+ );
+ }
+ else if ( ! void.class.equals( queryAnn.resultClass() ) ) {
+ //class mapping usage
+ //FIXME should be done in a second pass due to entity name?
+ final NativeSQLQueryRootReturn entityQueryReturn =
+ new NativeSQLQueryRootReturn( "alias1", queryAnn.resultClass().getName(), new HashMap(), LockMode.READ );
+ query = new NamedSQLQueryDefinition(
+ queryAnn.query(),
+ new NativeSQLQueryReturn[]{entityQueryReturn},
+ null,
+ queryAnn.cacheable(),
+ BinderHelper.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
+ queryAnn.timeout() < 0 ? null : queryAnn.timeout(),
+ queryAnn.fetchSize() < 0 ? null : queryAnn.fetchSize(),
+ getFlushMode( queryAnn.flushMode() ),
+ getCacheMode( queryAnn.cacheMode() ),
+ queryAnn.readOnly(),
+ BinderHelper.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
+ null,
+ queryAnn.callable()
+ );
+ }
+ else {
+ throw new NotYetImplementedException( "Pure native scalar queries are not yet supported" );
+ }
+ mappings.addSQLQuery( queryAnn.name(), query );
+ if ( log.isInfoEnabled() ) {
+ log.info( "Binding named native query: " + queryAnn.name() + " => " + queryAnn.query() );
+ }
+ }
+
+ public static void bindQueries(NamedQueries queriesAnn, ExtendedMappings mappings, boolean isDefault) {
+ if ( queriesAnn == null ) return;
+ for ( NamedQuery q : queriesAnn.value() ) {
+ bindQuery( q, mappings, isDefault );
+ }
+ }
+
+ public static void bindNativeQueries(NamedNativeQueries queriesAnn, ExtendedMappings mappings, boolean isDefault) {
+ if ( queriesAnn == null ) return;
+ for ( NamedNativeQuery q : queriesAnn.value() ) {
+ bindNativeQuery( q, mappings, isDefault );
+ }
+ }
+
+ public static void bindNativeQueries(
+ org.hibernate.annotations.NamedNativeQueries queriesAnn, ExtendedMappings mappings
+ ) {
+ if ( queriesAnn == null ) return;
+ for ( org.hibernate.annotations.NamedNativeQuery q : queriesAnn.value() ) {
+ bindNativeQuery( q, mappings );
+ }
+ }
+
+ public static void bindQuery(org.hibernate.annotations.NamedQuery queryAnn, ExtendedMappings mappings) {
+ if ( queryAnn == null ) return;
+ if ( BinderHelper.isDefault( queryAnn.name() ) ) {
+ throw new AnnotationException( "A named query must have a name when used in class or package level" );
+ }
+
+ FlushMode flushMode;
+ flushMode = getFlushMode( queryAnn.flushMode() );
+
+ NamedQueryDefinition query = new NamedQueryDefinition(
+ queryAnn.query(),
+ queryAnn.cacheable(),
+ BinderHelper.isDefault( queryAnn.cacheRegion() ) ? null : queryAnn.cacheRegion(),
+ queryAnn.timeout() < 0 ? null : queryAnn.timeout(),
+ queryAnn.fetchSize() < 0 ? null : queryAnn.fetchSize(),
+ flushMode,
+ getCacheMode( queryAnn.cacheMode() ),
+ queryAnn.readOnly(),
+ BinderHelper.isDefault( queryAnn.comment() ) ? null : queryAnn.comment(),
+ null
+ );
+
+ mappings.addQuery( queryAnn.name(), query );
+ if ( log.isInfoEnabled() ) log.info( "Binding named query: " + queryAnn.name() + " => " + queryAnn.query() );
+ }
+
+ private static FlushMode getFlushMode(FlushModeType flushModeType) {
+ FlushMode flushMode;
+ switch ( flushModeType ) {
+ case ALWAYS:
+ flushMode = FlushMode.ALWAYS;
+ break;
+ case AUTO:
+ flushMode = FlushMode.AUTO;
+ break;
+ case COMMIT:
+ flushMode = FlushMode.COMMIT;
+ break;
+ case NEVER:
+ flushMode = FlushMode.MANUAL;
+ break;
+ case MANUAL:
+ flushMode = FlushMode.MANUAL;
+ break;
+ default:
+ throw new AssertionFailure( "Unknown flushModeType: " + flushModeType );
+ }
+ return flushMode;
+ }
+
+ private static CacheMode getCacheMode(CacheModeType cacheModeType) {
+ switch ( cacheModeType ) {
+ case GET:
+ return CacheMode.GET;
+ case IGNORE:
+ return CacheMode.IGNORE;
+ case NORMAL:
+ return CacheMode.NORMAL;
+ case PUT:
+ return CacheMode.PUT;
+ case REFRESH:
+ return CacheMode.REFRESH;
+ default:
+ throw new AssertionFailure( "Unknown cacheModeType: " + cacheModeType );
+ }
+ }
+
+
+ public static void bindQueries(org.hibernate.annotations.NamedQueries queriesAnn, ExtendedMappings mappings) {
+ if ( queriesAnn == null ) return;
+ for ( org.hibernate.annotations.NamedQuery q : queriesAnn.value() ) {
+ bindQuery( q, mappings );
+ }
+ }
+
+ public static void bindSqlResultsetMappings(SqlResultSetMappings ann, ExtendedMappings mappings, boolean isDefault) {
+ if ( ann == null ) return;
+ for ( SqlResultSetMapping rs : ann.value() ) {
+ //no need to handle inSecondPass
+ mappings.addSecondPass( new ResultsetMappingSecondPass( rs, mappings, true ) );
+ }
+ }
+
+ public static void bindSqlResultsetMapping(SqlResultSetMapping ann, ExtendedMappings mappings, boolean isDefault) {
+ //no need to handle inSecondPass
+ mappings.addSecondPass( new ResultsetMappingSecondPass( ann, mappings, isDefault ) );
+ }
+
+ private static CacheMode getCacheMode(String query, QueryHint[] hints) {
+ for ( QueryHint hint : hints ) {
+ if ( "org.hibernate.cacheMode".equals( hint.name() ) ) {
+ if ( hint.value().equalsIgnoreCase( CacheMode.GET.toString() ) ) {
+ return CacheMode.GET;
+ }
+ else if ( hint.value().equalsIgnoreCase( CacheMode.IGNORE.toString() ) ) {
+ return CacheMode.IGNORE;
+ }
+ else if ( hint.value().equalsIgnoreCase( CacheMode.NORMAL.toString() ) ) {
+ return CacheMode.NORMAL;
+ }
+ else if ( hint.value().equalsIgnoreCase( CacheMode.PUT.toString() ) ) {
+ return CacheMode.PUT;
+ }
+ else if ( hint.value().equalsIgnoreCase( CacheMode.REFRESH.toString() ) ) {
+ return CacheMode.REFRESH;
+ }
+ else {
+ throw new AnnotationException( "Unknown CacheMode in hint: " + query + ":" + hint.name() );
+ }
+ }
+ }
+ return null;
+ }
+
+ private static FlushMode getFlushMode(String query, QueryHint[] hints) {
+ for ( QueryHint hint : hints ) {
+ if ( "org.hibernate.flushMode".equals( hint.name() ) ) {
+ if ( hint.value().equalsIgnoreCase( FlushMode.ALWAYS.toString() ) ) {
+ return FlushMode.ALWAYS;
+ }
+ else if ( hint.value().equalsIgnoreCase( FlushMode.AUTO.toString() ) ) {
+ return FlushMode.AUTO;
+ }
+ else if ( hint.value().equalsIgnoreCase( FlushMode.COMMIT.toString() ) ) {
+ return FlushMode.COMMIT;
+ }
+ else if ( hint.value().equalsIgnoreCase( FlushMode.NEVER.toString() ) ) {
+ return FlushMode.MANUAL;
+ }
+ else if ( hint.value().equalsIgnoreCase( FlushMode.MANUAL.toString() ) ) {
+ return FlushMode.MANUAL;
+ }
+ else {
+ throw new AnnotationException( "Unknown FlushMode in hint: " + query + ":" + hint.name() );
+ }
+ }
+ }
+ return null;
+ }
+
+ private static boolean getBoolean(String query, String hintName, QueryHint[] hints) {
+ for ( QueryHint hint : hints ) {
+ if ( hintName.equals( hint.name() ) ) {
+ if ( hint.value().equalsIgnoreCase( "true" ) ) {
+ return true;
+ }
+ else if ( hint.value().equalsIgnoreCase( "false" ) ) {
+ return false;
+ }
+ else {
+ throw new AnnotationException( "Not a boolean in hint: " + query + ":" + hint.name() );
+ }
+ }
+ }
+ return false;
+ }
+
+ private static String getString(String query, String hintName, QueryHint[] hints) {
+ for ( QueryHint hint : hints ) {
+ if ( hintName.equals( hint.name() ) ) {
+ return hint.value();
+ }
+ }
+ return null;
+ }
+
+ private static Integer getInteger(String query, String hintName, QueryHint[] hints) {
+ for ( QueryHint hint : hints ) {
+ if ( hintName.equals( hint.name() ) ) {
+ try {
+ return Integer.decode( hint.value() );
+ }
+ catch (NumberFormatException nfe) {
+ throw new AnnotationException( "Not an integer in hint: " + query + ":" + hint.name(), nfe );
+ }
+ }
+ }
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,231 +0,0 @@
-//$Id$
-package org.hibernate.cfg.annotations;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import javax.persistence.ColumnResult;
-import javax.persistence.EntityResult;
-import javax.persistence.FieldResult;
-import javax.persistence.SqlResultSetMapping;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.LockMode;
-import org.hibernate.MappingException;
-import org.hibernate.cfg.BinderHelper;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.QuerySecondPass;
-import org.hibernate.engine.ResultSetMappingDefinition;
-import org.hibernate.engine.query.sql.NativeSQLQueryRootReturn;
-import org.hibernate.engine.query.sql.NativeSQLQueryScalarReturn;
-import org.hibernate.mapping.Component;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.ToOne;
-import org.hibernate.mapping.Value;
-import org.hibernate.util.CollectionHelper;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ResultsetMappingSecondPass implements QuerySecondPass {
- private static Log log = LogFactory.getLog( ResultsetMappingSecondPass.class );
- private SqlResultSetMapping ann;
- private ExtendedMappings mappings;
- private boolean isDefault;
-
- public ResultsetMappingSecondPass(SqlResultSetMapping ann, ExtendedMappings mappings, boolean isDefault) {
- this.ann = ann;
- this.mappings = mappings;
- this.isDefault = isDefault;
- }
-
- public void doSecondPass(Map persistentClasses) throws MappingException {
- //TODO add parameters checkings
- if ( ann == null ) return;
- ResultSetMappingDefinition definition = new ResultSetMappingDefinition( ann.name() );
- if ( log.isInfoEnabled() ) log.info( "Binding resultset mapping: " + definition.getName() );
-
- int entityAliasIndex = 0;
-
- for ( EntityResult entity : ann.entities() ) {
- //TODO parameterize lock mode?
- List properties = new ArrayList();
- List propertyNames = new ArrayList();
- Map propertyresults = new HashMap();
- for ( FieldResult field : entity.fields() ) {
- //use an ArrayList cause we might have several columns per root property
- String name = field.name();
- if ( name.indexOf( '.' ) == -1 ) {
- //regular property
- properties.add( field );
- propertyNames.add( name );
- }
- else {
- /**
- * Reorder properties
- * 1. get the parent property
- * 2. list all the properties following the expected one in the parent property
- * 3. calculate the lowest index and insert the property
- */
- PersistentClass pc = mappings.getClass( entity.entityClass().getName() );
- if ( pc == null ) {
- throw new MappingException(
- "Entity not found " + entity.entityClass().getName()
- + " in SqlResultsetMapping " + ann.name()
- );
- }
- int dotIndex = name.lastIndexOf( '.' );
- String reducedName = name.substring( 0, dotIndex );
- Iterator parentPropIter = getSubPropertyIterator( pc, reducedName );
- List followers = getFollowers( parentPropIter, reducedName, name );
-
- int index = propertyNames.size();
- int followersSize = followers.size();
- for ( int loop = 0; loop < followersSize ; loop++ ) {
- String follower = (String) followers.get( loop );
- int currentIndex = getIndexOfFirstMatchingProperty( propertyNames, follower );
- index = currentIndex != -1 && currentIndex < index ? currentIndex : index;
- }
- propertyNames.add( index, name );
- properties.add( index, field );
- }
- }
-
- Set uniqueReturnProperty = new HashSet();
- Iterator iterator = properties.iterator();
- while ( iterator.hasNext() ) {
- FieldResult propertyresult = (FieldResult) iterator.next();
- String name = propertyresult.name();
- if ( "class".equals( name ) ) {
- throw new MappingException(
- "class is not a valid property name to use in a @FieldResult, use @Entity(discriminatorColumn) instead"
- );
- }
- ArrayList allResultColumns = new ArrayList();
- allResultColumns.add( propertyresult.column() );
-
- if ( uniqueReturnProperty.contains( name ) ) {
- throw new MappingException(
- "duplicate @FieldResult for property " + name +
- " on @Entity " + entity.entityClass().getName() + " in " + ann.name()
- );
- }
- uniqueReturnProperty.add( name );
- String key = StringHelper.root( name );
- ArrayList intermediateResults = (ArrayList) propertyresults.get( key );
- if ( intermediateResults == null ) {
- propertyresults.put( key, allResultColumns );
- }
- else {
- intermediateResults.addAll( allResultColumns );
- }
- }
- Iterator entries = propertyresults.entrySet().iterator();
- while ( entries.hasNext() ) {
- Map.Entry entry = (Map.Entry) entries.next();
- if ( entry.getValue() instanceof ArrayList ) {
- ArrayList list = (ArrayList) entry.getValue();
- entry.setValue( list.toArray( new String[ list.size() ] ) );
- }
- }
-
- if ( ! BinderHelper.isDefault( entity.discriminatorColumn() ) ) {
- propertyresults.put( "class", new String[]{entity.discriminatorColumn()} );
- }
-
- propertyresults = propertyresults.isEmpty() ? CollectionHelper.EMPTY_MAP : propertyresults;
- NativeSQLQueryRootReturn result =
- new NativeSQLQueryRootReturn(
- "alias" + entityAliasIndex++, entity.entityClass().getName(), propertyresults, LockMode.READ
- );
- definition.addQueryReturn( result );
- }
-
- for ( ColumnResult column : ann.columns() ) {
- definition.addQueryReturn( new NativeSQLQueryScalarReturn( column.name(), null ) );
- }
-
- if (isDefault) {
- mappings.addDefaultResultSetMapping( definition );
- }
- else {
- mappings.addResultSetMapping( definition );
- }
- }
-
- private List getFollowers(Iterator parentPropIter, String reducedName, String name) {
- boolean hasFollowers = false;
- List followers = new ArrayList();
- while ( parentPropIter.hasNext() ) {
- String currentPropertyName = ( (Property) parentPropIter.next() ).getName();
- String currentName = reducedName + '.' + currentPropertyName;
- if ( hasFollowers ) {
- followers.add( currentName );
- }
- if ( name.equals( currentName ) ) hasFollowers = true;
- }
- return followers;
- }
-
- private Iterator getSubPropertyIterator(PersistentClass pc, String reducedName) {
- Value value = pc.getRecursiveProperty( reducedName ).getValue();
- Iterator parentPropIter;
- if ( value instanceof Component ) {
- Component comp = (Component) value;
- parentPropIter = comp.getPropertyIterator();
- }
- else if ( value instanceof ToOne ) {
- ToOne toOne = (ToOne) value;
- PersistentClass referencedPc = mappings.getClass( toOne.getReferencedEntityName() );
- if ( toOne.getReferencedPropertyName() != null ) {
- try {
- parentPropIter = ( (Component) referencedPc.getRecursiveProperty(
- toOne.getReferencedPropertyName()
- ).getValue() ).getPropertyIterator();
- }
- catch (ClassCastException e) {
- throw new MappingException(
- "dotted notation reference neither a component nor a many/one to one", e
- );
- }
- }
- else {
- try {
- if ( referencedPc.getIdentifierMapper() == null ) {
- parentPropIter = ( (Component) referencedPc.getIdentifierProperty()
- .getValue() ).getPropertyIterator();
- }
- else {
- parentPropIter = referencedPc.getIdentifierMapper().getPropertyIterator();
- }
- }
- catch (ClassCastException e) {
- throw new MappingException(
- "dotted notation reference neither a component nor a many/one to one", e
- );
- }
- }
- }
- else {
- throw new MappingException( "dotted notation reference neither a component nor a many/one to one" );
- }
- return parentPropIter;
- }
-
- private static int getIndexOfFirstMatchingProperty(List propertyNames, String follower) {
- int propertySize = propertyNames.size();
- for ( int propIndex = 0; propIndex < propertySize ; propIndex++ ) {
- if ( ( (String) propertyNames.get( propIndex ) ).startsWith( follower ) ) {
- return propIndex;
- }
- }
- return -1;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/ResultsetMappingSecondPass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,231 @@
+//$Id$
+package org.hibernate.cfg.annotations;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import javax.persistence.ColumnResult;
+import javax.persistence.EntityResult;
+import javax.persistence.FieldResult;
+import javax.persistence.SqlResultSetMapping;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.LockMode;
+import org.hibernate.MappingException;
+import org.hibernate.cfg.BinderHelper;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.QuerySecondPass;
+import org.hibernate.engine.ResultSetMappingDefinition;
+import org.hibernate.engine.query.sql.NativeSQLQueryRootReturn;
+import org.hibernate.engine.query.sql.NativeSQLQueryScalarReturn;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.ToOne;
+import org.hibernate.mapping.Value;
+import org.hibernate.util.CollectionHelper;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ResultsetMappingSecondPass implements QuerySecondPass {
+ private static Log log = LogFactory.getLog( ResultsetMappingSecondPass.class );
+ private SqlResultSetMapping ann;
+ private ExtendedMappings mappings;
+ private boolean isDefault;
+
+ public ResultsetMappingSecondPass(SqlResultSetMapping ann, ExtendedMappings mappings, boolean isDefault) {
+ this.ann = ann;
+ this.mappings = mappings;
+ this.isDefault = isDefault;
+ }
+
+ public void doSecondPass(Map persistentClasses) throws MappingException {
+ //TODO add parameters checkings
+ if ( ann == null ) return;
+ ResultSetMappingDefinition definition = new ResultSetMappingDefinition( ann.name() );
+ if ( log.isInfoEnabled() ) log.info( "Binding resultset mapping: " + definition.getName() );
+
+ int entityAliasIndex = 0;
+
+ for ( EntityResult entity : ann.entities() ) {
+ //TODO parameterize lock mode?
+ List properties = new ArrayList();
+ List propertyNames = new ArrayList();
+ Map propertyresults = new HashMap();
+ for ( FieldResult field : entity.fields() ) {
+ //use an ArrayList cause we might have several columns per root property
+ String name = field.name();
+ if ( name.indexOf( '.' ) == -1 ) {
+ //regular property
+ properties.add( field );
+ propertyNames.add( name );
+ }
+ else {
+ /**
+ * Reorder properties
+ * 1. get the parent property
+ * 2. list all the properties following the expected one in the parent property
+ * 3. calculate the lowest index and insert the property
+ */
+ PersistentClass pc = mappings.getClass( entity.entityClass().getName() );
+ if ( pc == null ) {
+ throw new MappingException(
+ "Entity not found " + entity.entityClass().getName()
+ + " in SqlResultsetMapping " + ann.name()
+ );
+ }
+ int dotIndex = name.lastIndexOf( '.' );
+ String reducedName = name.substring( 0, dotIndex );
+ Iterator parentPropIter = getSubPropertyIterator( pc, reducedName );
+ List followers = getFollowers( parentPropIter, reducedName, name );
+
+ int index = propertyNames.size();
+ int followersSize = followers.size();
+ for ( int loop = 0; loop < followersSize ; loop++ ) {
+ String follower = (String) followers.get( loop );
+ int currentIndex = getIndexOfFirstMatchingProperty( propertyNames, follower );
+ index = currentIndex != -1 && currentIndex < index ? currentIndex : index;
+ }
+ propertyNames.add( index, name );
+ properties.add( index, field );
+ }
+ }
+
+ Set uniqueReturnProperty = new HashSet();
+ Iterator iterator = properties.iterator();
+ while ( iterator.hasNext() ) {
+ FieldResult propertyresult = (FieldResult) iterator.next();
+ String name = propertyresult.name();
+ if ( "class".equals( name ) ) {
+ throw new MappingException(
+ "class is not a valid property name to use in a @FieldResult, use @Entity(discriminatorColumn) instead"
+ );
+ }
+ ArrayList allResultColumns = new ArrayList();
+ allResultColumns.add( propertyresult.column() );
+
+ if ( uniqueReturnProperty.contains( name ) ) {
+ throw new MappingException(
+ "duplicate @FieldResult for property " + name +
+ " on @Entity " + entity.entityClass().getName() + " in " + ann.name()
+ );
+ }
+ uniqueReturnProperty.add( name );
+ String key = StringHelper.root( name );
+ ArrayList intermediateResults = (ArrayList) propertyresults.get( key );
+ if ( intermediateResults == null ) {
+ propertyresults.put( key, allResultColumns );
+ }
+ else {
+ intermediateResults.addAll( allResultColumns );
+ }
+ }
+ Iterator entries = propertyresults.entrySet().iterator();
+ while ( entries.hasNext() ) {
+ Map.Entry entry = (Map.Entry) entries.next();
+ if ( entry.getValue() instanceof ArrayList ) {
+ ArrayList list = (ArrayList) entry.getValue();
+ entry.setValue( list.toArray( new String[ list.size() ] ) );
+ }
+ }
+
+ if ( ! BinderHelper.isDefault( entity.discriminatorColumn() ) ) {
+ propertyresults.put( "class", new String[]{entity.discriminatorColumn()} );
+ }
+
+ propertyresults = propertyresults.isEmpty() ? CollectionHelper.EMPTY_MAP : propertyresults;
+ NativeSQLQueryRootReturn result =
+ new NativeSQLQueryRootReturn(
+ "alias" + entityAliasIndex++, entity.entityClass().getName(), propertyresults, LockMode.READ
+ );
+ definition.addQueryReturn( result );
+ }
+
+ for ( ColumnResult column : ann.columns() ) {
+ definition.addQueryReturn( new NativeSQLQueryScalarReturn( column.name(), null ) );
+ }
+
+ if (isDefault) {
+ mappings.addDefaultResultSetMapping( definition );
+ }
+ else {
+ mappings.addResultSetMapping( definition );
+ }
+ }
+
+ private List getFollowers(Iterator parentPropIter, String reducedName, String name) {
+ boolean hasFollowers = false;
+ List followers = new ArrayList();
+ while ( parentPropIter.hasNext() ) {
+ String currentPropertyName = ( (Property) parentPropIter.next() ).getName();
+ String currentName = reducedName + '.' + currentPropertyName;
+ if ( hasFollowers ) {
+ followers.add( currentName );
+ }
+ if ( name.equals( currentName ) ) hasFollowers = true;
+ }
+ return followers;
+ }
+
+ private Iterator getSubPropertyIterator(PersistentClass pc, String reducedName) {
+ Value value = pc.getRecursiveProperty( reducedName ).getValue();
+ Iterator parentPropIter;
+ if ( value instanceof Component ) {
+ Component comp = (Component) value;
+ parentPropIter = comp.getPropertyIterator();
+ }
+ else if ( value instanceof ToOne ) {
+ ToOne toOne = (ToOne) value;
+ PersistentClass referencedPc = mappings.getClass( toOne.getReferencedEntityName() );
+ if ( toOne.getReferencedPropertyName() != null ) {
+ try {
+ parentPropIter = ( (Component) referencedPc.getRecursiveProperty(
+ toOne.getReferencedPropertyName()
+ ).getValue() ).getPropertyIterator();
+ }
+ catch (ClassCastException e) {
+ throw new MappingException(
+ "dotted notation reference neither a component nor a many/one to one", e
+ );
+ }
+ }
+ else {
+ try {
+ if ( referencedPc.getIdentifierMapper() == null ) {
+ parentPropIter = ( (Component) referencedPc.getIdentifierProperty()
+ .getValue() ).getPropertyIterator();
+ }
+ else {
+ parentPropIter = referencedPc.getIdentifierMapper().getPropertyIterator();
+ }
+ }
+ catch (ClassCastException e) {
+ throw new MappingException(
+ "dotted notation reference neither a component nor a many/one to one", e
+ );
+ }
+ }
+ }
+ else {
+ throw new MappingException( "dotted notation reference neither a component nor a many/one to one" );
+ }
+ return parentPropIter;
+ }
+
+ private static int getIndexOfFirstMatchingProperty(List propertyNames, String follower) {
+ int propertySize = propertyNames.size();
+ for ( int propIndex = 0; propIndex < propertySize ; propIndex++ ) {
+ if ( ( (String) propertyNames.get( propIndex ) ).startsWith( follower ) ) {
+ return propIndex;
+ }
+ }
+ return -1;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SetBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SetBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SetBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-package org.hibernate.cfg.annotations;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.annotations.OrderBy;
-import org.hibernate.cfg.Environment;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.PersistentClass;
-
-/**
- * Bind a set.
- *
- * @author Matthew Inger
- */
-public class SetBinder extends CollectionBinder {
- private static Log log = LogFactory.getLog( SetBinder.class );
-
- public SetBinder() {
- }
-
- public SetBinder(boolean sorted) {
- super( sorted );
- }
-
- protected Collection createCollection(PersistentClass persistentClass) {
- return new org.hibernate.mapping.Set( persistentClass );
- }
-
- public void setSqlOrderBy(OrderBy orderByAnn) {
- if ( orderByAnn != null ) {
- if ( Environment.jvmSupportsLinkedHashCollections() ) {
- super.setSqlOrderBy( orderByAnn );
- }
- else {
- log.warn( "Attribute \"order-by\" ignored in JDK1.3 or less" );
- }
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SetBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SetBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SetBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SetBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+package org.hibernate.cfg.annotations;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.annotations.OrderBy;
+import org.hibernate.cfg.Environment;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.PersistentClass;
+
+/**
+ * Bind a set.
+ *
+ * @author Matthew Inger
+ */
+public class SetBinder extends CollectionBinder {
+ private static Log log = LogFactory.getLog( SetBinder.class );
+
+ public SetBinder() {
+ }
+
+ public SetBinder(boolean sorted) {
+ super( sorted );
+ }
+
+ protected Collection createCollection(PersistentClass persistentClass) {
+ return new org.hibernate.mapping.Set( persistentClass );
+ }
+
+ public void setSqlOrderBy(OrderBy orderByAnn) {
+ if ( orderByAnn != null ) {
+ if ( Environment.jvmSupportsLinkedHashCollections() ) {
+ super.setSqlOrderBy( orderByAnn );
+ }
+ else {
+ log.warn( "Attribute \"order-by\" ignored in JDK1.3 or less" );
+ }
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,248 +0,0 @@
-//$Id$
-package org.hibernate.cfg.annotations;
-
-import java.io.Serializable;
-import java.sql.Types;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Properties;
-import javax.persistence.Enumerated;
-import javax.persistence.Lob;
-import javax.persistence.Temporal;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.annotations.Parameter;
-import org.hibernate.annotations.Type;
-import org.hibernate.cfg.BinderHelper;
-import org.hibernate.cfg.Ejb3Column;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.NotYetImplementedException;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.Table;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.type.ByteArrayBlobType;
-import org.hibernate.type.CharacterArrayClobType;
-import org.hibernate.type.EnumType;
-import org.hibernate.type.PrimitiveByteArrayBlobType;
-import org.hibernate.type.PrimitiveCharacterArrayClobType;
-import org.hibernate.type.SerializableToBlobType;
-import org.hibernate.type.StringClobType;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class SimpleValueBinder {
- private static Log log = LogFactory.getLog( SimpleValueBinder.class );
- private String propertyName;
- private String returnedClassName;
- private Ejb3Column[] columns;
- private String persistentClassName;
- private String explicitType = "";
- private Properties typeParameters = new Properties();
- private ExtendedMappings mappings;
- private Table table;
-
- public void setPropertyName(String propertyName) {
- this.propertyName = propertyName;
- }
-
- public void setReturnedClassName(String returnedClassName) {
- this.returnedClassName = returnedClassName;
- }
-
- public void setTable(Table table) {
- this.table = table;
- }
-
- public void setColumns(Ejb3Column[] columns) {
- this.columns = columns;
- }
-
-
- public void setPersistentClassName(String persistentClassName) {
- this.persistentClassName = persistentClassName;
- }
-
- //TODO execute it lazily to be order safe
- public void setType(XProperty property, XClass returnedClass) {
- if ( returnedClass == null ) return; //we cannot guess anything
- XClass returnedClassOrElement = returnedClass;
- boolean isArray = false;
- if ( property.isArray() ) {
- returnedClassOrElement = property.getElementClass();
- isArray = true;
- }
- Properties typeParameters = this.typeParameters;
- typeParameters.clear();
- String type = BinderHelper.ANNOTATION_STRING_DEFAULT;
- if ( property.isAnnotationPresent( Temporal.class ) ) {
- Temporal ann = property.getAnnotation( Temporal.class );
- boolean isDate;
- if ( mappings.getReflectionManager().equals( returnedClassOrElement, Date.class ) ) {
- isDate = true;
- }
- else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Calendar.class ) ) {
- isDate = false;
- }
- else {
- throw new AnnotationException(
- "@Temporal should be set on a java.util.Date or java.util.Calendar property: "
- + StringHelper.qualify( persistentClassName, propertyName )
- );
- }
-
- switch ( ann.value() ) {
- case DATE:
- type = isDate ? "date" : "calendar_date";
- break;
- case TIME:
- type = "time";
- if ( ! isDate ) {
- throw new NotYetImplementedException(
- "Calendar cannot persist TIME only"
- + StringHelper.qualify( persistentClassName, propertyName )
- );
- }
- break;
- case TIMESTAMP:
- type = isDate ? "timestamp" : "calendar";
- break;
- default:
- throw new AssertionFailure( "Unknown temporal type: " + ann.value() );
- }
- }
- else if ( property.isAnnotationPresent( Lob.class ) ) {
-
- if ( mappings.getReflectionManager().equals( returnedClassOrElement, java.sql.Clob.class ) ) {
- type = "clob";
- }
- else if ( mappings.getReflectionManager().equals( returnedClassOrElement, java.sql.Blob.class ) ) {
- type = "blob";
- }
- else if ( mappings.getReflectionManager().equals( returnedClassOrElement, String.class ) ) {
- type = StringClobType.class.getName();
- }
- else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Character.class ) && isArray ) {
- type = CharacterArrayClobType.class.getName();
- }
- else if ( mappings.getReflectionManager().equals( returnedClassOrElement, char.class ) && isArray ) {
- type = PrimitiveCharacterArrayClobType.class.getName();
- }
- else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Byte.class ) && isArray ) {
- type = ByteArrayBlobType.class.getName();
- }
- else if ( mappings.getReflectionManager().equals( returnedClassOrElement, byte.class ) && isArray ) {
- type = PrimitiveByteArrayBlobType.class.getName();
- }
- else if ( mappings.getReflectionManager()
- .toXClass( Serializable.class )
- .isAssignableFrom( returnedClassOrElement ) ) {
- type = SerializableToBlobType.class.getName();
- //typeParameters = new Properties();
- typeParameters.setProperty(
- SerializableToBlobType.CLASS_NAME,
- returnedClassOrElement.getName()
- );
- }
- else {
- type = "blob";
- }
- }
- //implicit type will check basic types and Serializable classes
- if ( columns == null ) {
- throw new AssertionFailure( "SimpleValueBinder.setColumns should be set before SimpleValueBinder.setType" );
- }
- if ( BinderHelper.ANNOTATION_STRING_DEFAULT.equals( type ) ) {
- if ( returnedClassOrElement.isEnum() ) {
- type = EnumType.class.getName();
- typeParameters = new Properties();
- typeParameters.setProperty( EnumType.ENUM, returnedClassOrElement.getName() );
- String schema = columns[0].getTable().getSchema();
- schema = schema == null ? "" : schema;
- String catalog = columns[0].getTable().getCatalog();
- catalog = catalog == null ? "" : catalog;
- typeParameters.setProperty( EnumType.SCHEMA, schema );
- typeParameters.setProperty( EnumType.CATALOG, catalog );
- typeParameters.setProperty( EnumType.TABLE, columns[0].getTable().getName() );
- typeParameters.setProperty( EnumType.COLUMN, columns[0].getName() );
- Enumerated enumAnn = property.getAnnotation( Enumerated.class );
- if ( enumAnn != null ) {
- javax.persistence.EnumType enumType = enumAnn.value();
- if ( javax.persistence.EnumType.ORDINAL.equals( enumType ) ) {
- typeParameters.setProperty( EnumType.TYPE, String.valueOf( Types.INTEGER ) );
- }
- else if ( javax.persistence.EnumType.STRING.equals( enumType ) ) {
- typeParameters.setProperty( EnumType.TYPE, String.valueOf( Types.VARCHAR ) );
- }
- else {
- throw new AssertionFailure( "Unknown EnumType: " + enumType );
- }
- }
- }
- }
- explicitType = type;
- this.typeParameters = typeParameters;
- Type annType = (Type) property.getAnnotation( Type.class );
- setExplicitType( annType );
- }
-
- public void setExplicitType(String explicitType) {
- this.explicitType = explicitType;
- }
-
- //FIXME raise an assertion failure if setExplicitType(String) and setExplicitType(Type) are use at the same time
- public void setExplicitType(Type typeAnn) {
- if ( typeAnn != null ) {
- explicitType = typeAnn.type();
- typeParameters.clear();
- for ( Parameter param : typeAnn.parameters() ) {
- typeParameters.setProperty( param.name(), param.value() );
- }
- }
- }
-
- public void setMappings(ExtendedMappings mappings) {
- this.mappings = mappings;
- }
-
- private void validate() {
- //TODO check necessary params
- Ejb3Column.checkPropertyConsistency( columns, propertyName );
- }
-
- public SimpleValue make() {
- validate();
- log.debug( "building SimpleValue for " + propertyName );
- if (table == null) {
- table = columns[0].getTable();
- }
- SimpleValue simpleValue = new SimpleValue( table );
- return fillSimpleValue( simpleValue );
- }
-
- public SimpleValue fillSimpleValue(SimpleValue simpleValue) {
- String type = BinderHelper.isDefault( explicitType ) ? returnedClassName : explicitType;
- org.hibernate.mapping.TypeDef typeDef = mappings.getTypeDef( type );
- if ( typeDef != null ) {
- type = typeDef.getTypeClass();
- simpleValue.setTypeParameters( typeDef.getParameters() );
- }
- if ( typeParameters != null && typeParameters.size() != 0 ) {
- //explicit type params takes precedence over type def params
- simpleValue.setTypeParameters( typeParameters );
- }
- simpleValue.setTypeName( type );
- if ( persistentClassName != null ) {
- simpleValue.setTypeUsingReflection( persistentClassName, propertyName );
- }
- for ( Ejb3Column column : columns ) {
- column.linkWithValue( simpleValue );
- }
- return simpleValue;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/SimpleValueBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,248 @@
+//$Id$
+package org.hibernate.cfg.annotations;
+
+import java.io.Serializable;
+import java.sql.Types;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Properties;
+import javax.persistence.Enumerated;
+import javax.persistence.Lob;
+import javax.persistence.Temporal;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.annotations.Parameter;
+import org.hibernate.annotations.Type;
+import org.hibernate.cfg.BinderHelper;
+import org.hibernate.cfg.Ejb3Column;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.NotYetImplementedException;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.Table;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.type.ByteArrayBlobType;
+import org.hibernate.type.CharacterArrayClobType;
+import org.hibernate.type.EnumType;
+import org.hibernate.type.PrimitiveByteArrayBlobType;
+import org.hibernate.type.PrimitiveCharacterArrayClobType;
+import org.hibernate.type.SerializableToBlobType;
+import org.hibernate.type.StringClobType;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SimpleValueBinder {
+ private static Log log = LogFactory.getLog( SimpleValueBinder.class );
+ private String propertyName;
+ private String returnedClassName;
+ private Ejb3Column[] columns;
+ private String persistentClassName;
+ private String explicitType = "";
+ private Properties typeParameters = new Properties();
+ private ExtendedMappings mappings;
+ private Table table;
+
+ public void setPropertyName(String propertyName) {
+ this.propertyName = propertyName;
+ }
+
+ public void setReturnedClassName(String returnedClassName) {
+ this.returnedClassName = returnedClassName;
+ }
+
+ public void setTable(Table table) {
+ this.table = table;
+ }
+
+ public void setColumns(Ejb3Column[] columns) {
+ this.columns = columns;
+ }
+
+
+ public void setPersistentClassName(String persistentClassName) {
+ this.persistentClassName = persistentClassName;
+ }
+
+ //TODO execute it lazily to be order safe
+ public void setType(XProperty property, XClass returnedClass) {
+ if ( returnedClass == null ) return; //we cannot guess anything
+ XClass returnedClassOrElement = returnedClass;
+ boolean isArray = false;
+ if ( property.isArray() ) {
+ returnedClassOrElement = property.getElementClass();
+ isArray = true;
+ }
+ Properties typeParameters = this.typeParameters;
+ typeParameters.clear();
+ String type = BinderHelper.ANNOTATION_STRING_DEFAULT;
+ if ( property.isAnnotationPresent( Temporal.class ) ) {
+ Temporal ann = property.getAnnotation( Temporal.class );
+ boolean isDate;
+ if ( mappings.getReflectionManager().equals( returnedClassOrElement, Date.class ) ) {
+ isDate = true;
+ }
+ else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Calendar.class ) ) {
+ isDate = false;
+ }
+ else {
+ throw new AnnotationException(
+ "@Temporal should be set on a java.util.Date or java.util.Calendar property: "
+ + StringHelper.qualify( persistentClassName, propertyName )
+ );
+ }
+
+ switch ( ann.value() ) {
+ case DATE:
+ type = isDate ? "date" : "calendar_date";
+ break;
+ case TIME:
+ type = "time";
+ if ( ! isDate ) {
+ throw new NotYetImplementedException(
+ "Calendar cannot persist TIME only"
+ + StringHelper.qualify( persistentClassName, propertyName )
+ );
+ }
+ break;
+ case TIMESTAMP:
+ type = isDate ? "timestamp" : "calendar";
+ break;
+ default:
+ throw new AssertionFailure( "Unknown temporal type: " + ann.value() );
+ }
+ }
+ else if ( property.isAnnotationPresent( Lob.class ) ) {
+
+ if ( mappings.getReflectionManager().equals( returnedClassOrElement, java.sql.Clob.class ) ) {
+ type = "clob";
+ }
+ else if ( mappings.getReflectionManager().equals( returnedClassOrElement, java.sql.Blob.class ) ) {
+ type = "blob";
+ }
+ else if ( mappings.getReflectionManager().equals( returnedClassOrElement, String.class ) ) {
+ type = StringClobType.class.getName();
+ }
+ else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Character.class ) && isArray ) {
+ type = CharacterArrayClobType.class.getName();
+ }
+ else if ( mappings.getReflectionManager().equals( returnedClassOrElement, char.class ) && isArray ) {
+ type = PrimitiveCharacterArrayClobType.class.getName();
+ }
+ else if ( mappings.getReflectionManager().equals( returnedClassOrElement, Byte.class ) && isArray ) {
+ type = ByteArrayBlobType.class.getName();
+ }
+ else if ( mappings.getReflectionManager().equals( returnedClassOrElement, byte.class ) && isArray ) {
+ type = PrimitiveByteArrayBlobType.class.getName();
+ }
+ else if ( mappings.getReflectionManager()
+ .toXClass( Serializable.class )
+ .isAssignableFrom( returnedClassOrElement ) ) {
+ type = SerializableToBlobType.class.getName();
+ //typeParameters = new Properties();
+ typeParameters.setProperty(
+ SerializableToBlobType.CLASS_NAME,
+ returnedClassOrElement.getName()
+ );
+ }
+ else {
+ type = "blob";
+ }
+ }
+ //implicit type will check basic types and Serializable classes
+ if ( columns == null ) {
+ throw new AssertionFailure( "SimpleValueBinder.setColumns should be set before SimpleValueBinder.setType" );
+ }
+ if ( BinderHelper.ANNOTATION_STRING_DEFAULT.equals( type ) ) {
+ if ( returnedClassOrElement.isEnum() ) {
+ type = EnumType.class.getName();
+ typeParameters = new Properties();
+ typeParameters.setProperty( EnumType.ENUM, returnedClassOrElement.getName() );
+ String schema = columns[0].getTable().getSchema();
+ schema = schema == null ? "" : schema;
+ String catalog = columns[0].getTable().getCatalog();
+ catalog = catalog == null ? "" : catalog;
+ typeParameters.setProperty( EnumType.SCHEMA, schema );
+ typeParameters.setProperty( EnumType.CATALOG, catalog );
+ typeParameters.setProperty( EnumType.TABLE, columns[0].getTable().getName() );
+ typeParameters.setProperty( EnumType.COLUMN, columns[0].getName() );
+ Enumerated enumAnn = property.getAnnotation( Enumerated.class );
+ if ( enumAnn != null ) {
+ javax.persistence.EnumType enumType = enumAnn.value();
+ if ( javax.persistence.EnumType.ORDINAL.equals( enumType ) ) {
+ typeParameters.setProperty( EnumType.TYPE, String.valueOf( Types.INTEGER ) );
+ }
+ else if ( javax.persistence.EnumType.STRING.equals( enumType ) ) {
+ typeParameters.setProperty( EnumType.TYPE, String.valueOf( Types.VARCHAR ) );
+ }
+ else {
+ throw new AssertionFailure( "Unknown EnumType: " + enumType );
+ }
+ }
+ }
+ }
+ explicitType = type;
+ this.typeParameters = typeParameters;
+ Type annType = (Type) property.getAnnotation( Type.class );
+ setExplicitType( annType );
+ }
+
+ public void setExplicitType(String explicitType) {
+ this.explicitType = explicitType;
+ }
+
+ //FIXME raise an assertion failure if setExplicitType(String) and setExplicitType(Type) are use at the same time
+ public void setExplicitType(Type typeAnn) {
+ if ( typeAnn != null ) {
+ explicitType = typeAnn.type();
+ typeParameters.clear();
+ for ( Parameter param : typeAnn.parameters() ) {
+ typeParameters.setProperty( param.name(), param.value() );
+ }
+ }
+ }
+
+ public void setMappings(ExtendedMappings mappings) {
+ this.mappings = mappings;
+ }
+
+ private void validate() {
+ //TODO check necessary params
+ Ejb3Column.checkPropertyConsistency( columns, propertyName );
+ }
+
+ public SimpleValue make() {
+ validate();
+ log.debug( "building SimpleValue for " + propertyName );
+ if (table == null) {
+ table = columns[0].getTable();
+ }
+ SimpleValue simpleValue = new SimpleValue( table );
+ return fillSimpleValue( simpleValue );
+ }
+
+ public SimpleValue fillSimpleValue(SimpleValue simpleValue) {
+ String type = BinderHelper.isDefault( explicitType ) ? returnedClassName : explicitType;
+ org.hibernate.mapping.TypeDef typeDef = mappings.getTypeDef( type );
+ if ( typeDef != null ) {
+ type = typeDef.getTypeClass();
+ simpleValue.setTypeParameters( typeDef.getParameters() );
+ }
+ if ( typeParameters != null && typeParameters.size() != 0 ) {
+ //explicit type params takes precedence over type def params
+ simpleValue.setTypeParameters( typeParameters );
+ }
+ simpleValue.setTypeName( type );
+ if ( persistentClassName != null ) {
+ simpleValue.setTypeUsingReflection( persistentClassName, propertyName );
+ }
+ for ( Ejb3Column column : columns ) {
+ column.linkWithValue( simpleValue );
+ }
+ return simpleValue;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/TableBinder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/TableBinder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/TableBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,389 +0,0 @@
-//$Id$
-package org.hibernate.cfg.annotations;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import javax.persistence.UniqueConstraint;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AnnotationException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.annotations.Index;
-import org.hibernate.annotations.common.util.StringHelper;
-import org.hibernate.cfg.BinderHelper;
-import org.hibernate.cfg.Ejb3JoinColumn;
-import org.hibernate.cfg.ExtendedMappings;
-import org.hibernate.cfg.IndexSecondPass;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.DependantValue;
-import org.hibernate.mapping.JoinedSubclass;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.SimpleValue;
-import org.hibernate.mapping.Table;
-import org.hibernate.mapping.ToOne;
-import org.hibernate.mapping.Value;
-
-/**
- * Table related operations
- *
- * @author Emmanuel Bernard
- */
-public class TableBinder {
- //TODO move it to a getter/setter strategy
- private static Log log = LogFactory.getLog( TableBinder.class );
- private String schema;
- private String catalog;
- private String name;
- private boolean isAbstract;
- private List<String[]> uniqueConstraints;
- String constraints;
- Table denormalizedSuperTable;
- ExtendedMappings mappings;
- private String ownerEntityTable;
- private String associatedEntityTable;
- private String propertyName;
- private String ownerEntity;
- private String associatedEntity;
-
- public void setSchema(String schema) {
- this.schema = schema;
- }
-
- public void setCatalog(String catalog) {
- this.catalog = catalog;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setAbstract(boolean anAbstract) {
- isAbstract = anAbstract;
- }
-
- public void setUniqueConstraints(UniqueConstraint[] uniqueConstraints) {
- this.uniqueConstraints = TableBinder.buildUniqueConstraints( uniqueConstraints );
- }
-
- public void setConstraints(String constraints) {
- this.constraints = constraints;
- }
-
- public void setDenormalizedSuperTable(Table denormalizedSuperTable) {
- this.denormalizedSuperTable = denormalizedSuperTable;
- }
-
- public void setMappings(ExtendedMappings mappings) {
- this.mappings = mappings;
- }
-
- // only bind association table currently
- public Table bind() {
- //logicalName only accurate for assoc table...
- String unquotedOwnerTable = StringHelper.unquote( ownerEntityTable );
- String unquotedAssocTable = StringHelper.unquote( associatedEntityTable );
-
- String logicalName = mappings.getNamingStrategy()
- .logicalCollectionTableName(
- name,
- unquotedOwnerTable,
- unquotedAssocTable,
- propertyName );
- if ( StringHelper.isQuoted( ownerEntityTable ) || StringHelper.isQuoted( associatedEntityTable ) ) {
- logicalName = StringHelper.quote( logicalName );
- }
- String extendedName;
- if ( name != null ) {
- extendedName = mappings.getNamingStrategy().tableName( name );
- }
- else {
- extendedName = mappings.getNamingStrategy()
- .collectionTableName(
- ownerEntity,
- unquotedOwnerTable,
- associatedEntity,
- unquotedAssocTable,
- propertyName
- );
- if ( StringHelper.isQuoted( ownerEntityTable ) || StringHelper.isQuoted( associatedEntityTable ) ) {
- extendedName = StringHelper.quote( extendedName );
- }
- }
- return fillTable(
- schema, catalog,
- extendedName, logicalName, isAbstract, uniqueConstraints, constraints,
- denormalizedSuperTable, mappings
- );
- }
-
- public static Table fillTable(
- String schema, String catalog, String realTableName, String logicalName, boolean isAbstract,
- List uniqueConstraints, String constraints, Table denormalizedSuperTable, ExtendedMappings mappings
- ) {
- schema = BinderHelper.isDefault( schema ) ? mappings.getSchemaName() : schema;
- catalog = BinderHelper.isDefault( catalog ) ? mappings.getCatalogName() : catalog;
- Table table;
- if ( denormalizedSuperTable != null ) {
- table = mappings.addDenormalizedTable(
- schema,
- catalog,
- realTableName,
- isAbstract,
- null, //subselect
- denormalizedSuperTable
- );
- }
- else {
- table = mappings.addTable(
- schema,
- catalog,
- realTableName,
- null, //subselect
- isAbstract
- );
- }
- if ( uniqueConstraints != null && uniqueConstraints.size() > 0 ) {
- mappings.addUniqueConstraints( table, uniqueConstraints );
- }
- if ( constraints != null ) table.addCheckConstraint( constraints );
- //logicalName is null if we are in the second pass
- if ( logicalName != null ) {
- mappings.addTableBinding( schema, catalog, logicalName, realTableName, denormalizedSuperTable );
- }
- return table;
- }
-
- public static void bindFk(
- PersistentClass referencedEntity, PersistentClass destinationEntity, Ejb3JoinColumn[] columns,
- SimpleValue value,
- boolean unique, ExtendedMappings mappings
- ) {
- PersistentClass associatedClass;
- if ( destinationEntity != null ) {
- //overidden destination
- associatedClass = destinationEntity;
- }
- else {
- associatedClass = columns[0].getPropertyHolder() == null ? null : columns[0].getPropertyHolder()
- .getPersistentClass();
- }
- final String mappedByProperty = columns[0].getMappedBy();
- if ( StringHelper.isNotEmpty( mappedByProperty ) ) {
- /**
- * Get the columns of the mapped-by property
- * copy them and link the copy to the actual value
- */
- if ( log.isDebugEnabled() ) {
- log.debug(
- "Retrieving property " + associatedClass.getEntityName() + "." + mappedByProperty
- );
- }
-
- final Property property = associatedClass.getRecursiveProperty( columns[0].getMappedBy() );
- Iterator mappedByColumns;
- if ( property.getValue() instanceof Collection ) {
- Collection collection = ( (Collection) property.getValue() );
- Value element = collection.getElement();
- if ( element == null ) {
- throw new AnnotationException(
- "Illegal use of mappedBy on both sides of the relationship: "
- + associatedClass.getEntityName() + "." + mappedByProperty
- );
- }
- mappedByColumns = element.getColumnIterator();
- }
- else {
- mappedByColumns = property.getValue().getColumnIterator();
- }
- while ( mappedByColumns.hasNext() ) {
- Column column = (Column) mappedByColumns.next();
- columns[0].overrideSqlTypeIfNecessary( column );
- columns[0].linkValueUsingAColumnCopy( column, value );
- }
- }
- else if ( columns[0].isImplicit() ) {
- /**
- * if columns are implicit, then create the columns based on the
- * referenced entity id columns
- */
- Iterator idColumns;
- if ( referencedEntity instanceof JoinedSubclass ) {
- idColumns = ( (JoinedSubclass) referencedEntity ).getKey().getColumnIterator();
- }
- else {
- idColumns = referencedEntity.getIdentifier().getColumnIterator();
- }
- while ( idColumns.hasNext() ) {
- Column column = (Column) idColumns.next();
- columns[0].overrideSqlTypeIfNecessary( column );
- columns[0].linkValueUsingDefaultColumnNaming( column, referencedEntity, value );
- }
- }
- else {
- int fkEnum = Ejb3JoinColumn.checkReferencedColumnsType( columns, referencedEntity, mappings );
-
- if ( Ejb3JoinColumn.NON_PK_REFERENCE == fkEnum ) {
- String referencedPropertyName;
- if ( value instanceof ToOne ) {
- referencedPropertyName = ( (ToOne) value ).getReferencedPropertyName();
- }
- else if ( value instanceof DependantValue ) {
- String propertyName = columns[0].getPropertyName();
- if ( propertyName != null ) {
- Collection collection = (Collection) referencedEntity.getRecursiveProperty( propertyName )
- .getValue();
- referencedPropertyName = collection.getReferencedPropertyName();
- }
- else {
- throw new AnnotationException( "SecondaryTable JoinColumn cannot reference a non primary key" );
- }
-
- }
- else {
- throw new AssertionFailure(
- "Do a property ref on an unexpected Value type: "
- + value.getClass().getName()
- );
- }
- if ( referencedPropertyName == null ) {
- throw new AssertionFailure(
- "No property ref found while expected"
- );
- }
- Property synthProp = referencedEntity.getRecursiveProperty( referencedPropertyName );
- if ( synthProp == null ) {
- throw new AssertionFailure(
- "Cannot find synthProp: " + referencedEntity.getEntityName() + "." + referencedPropertyName
- );
- }
- linkJoinColumnWithValueOverridingNameIfImplicit(
- referencedEntity, synthProp.getColumnIterator(), columns, value
- );
-
- }
- else {
- if ( Ejb3JoinColumn.NO_REFERENCE == fkEnum ) {
- //implicit case, we hope PK and FK columns are in the same order
- if ( columns.length != referencedEntity.getIdentifier().getColumnSpan() ) {
- throw new AnnotationException(
- "A Foreign key refering " + referencedEntity.getEntityName()
- + " from " + associatedClass.getEntityName()
- + " has the wrong number of column. should be " + referencedEntity.getIdentifier()
- .getColumnSpan()
- );
- }
- linkJoinColumnWithValueOverridingNameIfImplicit(
- referencedEntity,
- referencedEntity.getIdentifier().getColumnIterator(),
- columns,
- value
- );
- }
- else {
- //explicit referencedColumnName
- Iterator idColItr = referencedEntity.getKey().getColumnIterator();
- org.hibernate.mapping.Column col;
- Table table = referencedEntity.getTable(); //works cause the pk has to be on the primary table
- if ( ! idColItr.hasNext() ) log.debug( "No column in the identifier!" );
- while ( idColItr.hasNext() ) {
- boolean match = false;
- //for each PK column, find the associated FK column.
- col = (org.hibernate.mapping.Column) idColItr.next();
- for ( Ejb3JoinColumn joinCol : columns ) {
- String referencedColumn = joinCol.getReferencedColumn();
- referencedColumn = mappings.getPhysicalColumnName( referencedColumn, table );
- if ( referencedColumn.equals( col.getName() ) ) {
- //proper join column
- if ( joinCol.isNameDeferred() ) {
- joinCol.linkValueUsingDefaultColumnNaming(
- col, referencedEntity, value
- );
- }
- else {
- joinCol.linkWithValue( value );
- }
- joinCol.overrideSqlTypeIfNecessary( col );
- match = true;
- break;
- }
- }
- if ( !match ) {
- throw new AnnotationException(
- "Column name " + col.getName() + " of "
- + referencedEntity.getEntityName() + " not found in JoinColumns.referencedColumnName"
- );
- }
- }
- }
- }
- }
- value.createForeignKey();
- if ( unique == true ) {
- createUniqueConstraint( value );
- }
- }
-
- private static void linkJoinColumnWithValueOverridingNameIfImplicit(
- PersistentClass referencedEntity, Iterator columnIterator, Ejb3JoinColumn[] columns, SimpleValue value
- ) {
- for ( Ejb3JoinColumn joinCol : columns ) {
- Column synthCol = (Column) columnIterator.next();
- if ( joinCol.isNameDeferred() ) {
- //this has to be the default value
- joinCol.linkValueUsingDefaultColumnNaming( synthCol, referencedEntity, value );
- }
- else {
- joinCol.linkWithValue( value );
- }
- joinCol.overrideSqlTypeIfNecessary( synthCol );
- }
- }
-
- public static void createUniqueConstraint(Value value) {
- Iterator iter = value.getColumnIterator();
- ArrayList cols = new ArrayList();
- while ( iter.hasNext() ) {
- cols.add( iter.next() );
- }
- value.getTable().createUniqueKey( cols );
- }
-
- public static void addIndexes(Table hibTable, Index[] indexes, ExtendedMappings mappings) {
- for ( Index index : indexes ) {
- //no need to handle inSecondPass here since it is only called from EntityBinder
- mappings.addSecondPass(
- new IndexSecondPass( hibTable, index.name(), index.columnNames(), mappings )
- );
- }
- }
-
- public static List<String[]> buildUniqueConstraints(UniqueConstraint[] constraintsArray) {
- List<String[]> result = new ArrayList<String[]>();
- if ( constraintsArray.length != 0 ) {
- for ( UniqueConstraint uc : constraintsArray ) {
- result.add( uc.columnNames() );
- }
- }
- return result;
- }
-
- public void setDefaultName(
- String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
- String propertyName
- ) {
- this.ownerEntity = ownerEntity;
- this.ownerEntityTable = ownerEntityTable;
- this.associatedEntity = associatedEntity;
- this.associatedEntityTable = associatedEntityTable;
- this.propertyName = propertyName;
- this.name = null;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/TableBinder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/TableBinder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/TableBinder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/TableBinder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,389 @@
+//$Id$
+package org.hibernate.cfg.annotations;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import javax.persistence.UniqueConstraint;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AnnotationException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.annotations.Index;
+import org.hibernate.annotations.common.util.StringHelper;
+import org.hibernate.cfg.BinderHelper;
+import org.hibernate.cfg.Ejb3JoinColumn;
+import org.hibernate.cfg.ExtendedMappings;
+import org.hibernate.cfg.IndexSecondPass;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.DependantValue;
+import org.hibernate.mapping.JoinedSubclass;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.SimpleValue;
+import org.hibernate.mapping.Table;
+import org.hibernate.mapping.ToOne;
+import org.hibernate.mapping.Value;
+
+/**
+ * Table related operations
+ *
+ * @author Emmanuel Bernard
+ */
+public class TableBinder {
+ //TODO move it to a getter/setter strategy
+ private static Log log = LogFactory.getLog( TableBinder.class );
+ private String schema;
+ private String catalog;
+ private String name;
+ private boolean isAbstract;
+ private List<String[]> uniqueConstraints;
+ String constraints;
+ Table denormalizedSuperTable;
+ ExtendedMappings mappings;
+ private String ownerEntityTable;
+ private String associatedEntityTable;
+ private String propertyName;
+ private String ownerEntity;
+ private String associatedEntity;
+
+ public void setSchema(String schema) {
+ this.schema = schema;
+ }
+
+ public void setCatalog(String catalog) {
+ this.catalog = catalog;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setAbstract(boolean anAbstract) {
+ isAbstract = anAbstract;
+ }
+
+ public void setUniqueConstraints(UniqueConstraint[] uniqueConstraints) {
+ this.uniqueConstraints = TableBinder.buildUniqueConstraints( uniqueConstraints );
+ }
+
+ public void setConstraints(String constraints) {
+ this.constraints = constraints;
+ }
+
+ public void setDenormalizedSuperTable(Table denormalizedSuperTable) {
+ this.denormalizedSuperTable = denormalizedSuperTable;
+ }
+
+ public void setMappings(ExtendedMappings mappings) {
+ this.mappings = mappings;
+ }
+
+ // only bind association table currently
+ public Table bind() {
+ //logicalName only accurate for assoc table...
+ String unquotedOwnerTable = StringHelper.unquote( ownerEntityTable );
+ String unquotedAssocTable = StringHelper.unquote( associatedEntityTable );
+
+ String logicalName = mappings.getNamingStrategy()
+ .logicalCollectionTableName(
+ name,
+ unquotedOwnerTable,
+ unquotedAssocTable,
+ propertyName );
+ if ( StringHelper.isQuoted( ownerEntityTable ) || StringHelper.isQuoted( associatedEntityTable ) ) {
+ logicalName = StringHelper.quote( logicalName );
+ }
+ String extendedName;
+ if ( name != null ) {
+ extendedName = mappings.getNamingStrategy().tableName( name );
+ }
+ else {
+ extendedName = mappings.getNamingStrategy()
+ .collectionTableName(
+ ownerEntity,
+ unquotedOwnerTable,
+ associatedEntity,
+ unquotedAssocTable,
+ propertyName
+ );
+ if ( StringHelper.isQuoted( ownerEntityTable ) || StringHelper.isQuoted( associatedEntityTable ) ) {
+ extendedName = StringHelper.quote( extendedName );
+ }
+ }
+ return fillTable(
+ schema, catalog,
+ extendedName, logicalName, isAbstract, uniqueConstraints, constraints,
+ denormalizedSuperTable, mappings
+ );
+ }
+
+ public static Table fillTable(
+ String schema, String catalog, String realTableName, String logicalName, boolean isAbstract,
+ List uniqueConstraints, String constraints, Table denormalizedSuperTable, ExtendedMappings mappings
+ ) {
+ schema = BinderHelper.isDefault( schema ) ? mappings.getSchemaName() : schema;
+ catalog = BinderHelper.isDefault( catalog ) ? mappings.getCatalogName() : catalog;
+ Table table;
+ if ( denormalizedSuperTable != null ) {
+ table = mappings.addDenormalizedTable(
+ schema,
+ catalog,
+ realTableName,
+ isAbstract,
+ null, //subselect
+ denormalizedSuperTable
+ );
+ }
+ else {
+ table = mappings.addTable(
+ schema,
+ catalog,
+ realTableName,
+ null, //subselect
+ isAbstract
+ );
+ }
+ if ( uniqueConstraints != null && uniqueConstraints.size() > 0 ) {
+ mappings.addUniqueConstraints( table, uniqueConstraints );
+ }
+ if ( constraints != null ) table.addCheckConstraint( constraints );
+ //logicalName is null if we are in the second pass
+ if ( logicalName != null ) {
+ mappings.addTableBinding( schema, catalog, logicalName, realTableName, denormalizedSuperTable );
+ }
+ return table;
+ }
+
+ public static void bindFk(
+ PersistentClass referencedEntity, PersistentClass destinationEntity, Ejb3JoinColumn[] columns,
+ SimpleValue value,
+ boolean unique, ExtendedMappings mappings
+ ) {
+ PersistentClass associatedClass;
+ if ( destinationEntity != null ) {
+ //overidden destination
+ associatedClass = destinationEntity;
+ }
+ else {
+ associatedClass = columns[0].getPropertyHolder() == null ? null : columns[0].getPropertyHolder()
+ .getPersistentClass();
+ }
+ final String mappedByProperty = columns[0].getMappedBy();
+ if ( StringHelper.isNotEmpty( mappedByProperty ) ) {
+ /**
+ * Get the columns of the mapped-by property
+ * copy them and link the copy to the actual value
+ */
+ if ( log.isDebugEnabled() ) {
+ log.debug(
+ "Retrieving property " + associatedClass.getEntityName() + "." + mappedByProperty
+ );
+ }
+
+ final Property property = associatedClass.getRecursiveProperty( columns[0].getMappedBy() );
+ Iterator mappedByColumns;
+ if ( property.getValue() instanceof Collection ) {
+ Collection collection = ( (Collection) property.getValue() );
+ Value element = collection.getElement();
+ if ( element == null ) {
+ throw new AnnotationException(
+ "Illegal use of mappedBy on both sides of the relationship: "
+ + associatedClass.getEntityName() + "." + mappedByProperty
+ );
+ }
+ mappedByColumns = element.getColumnIterator();
+ }
+ else {
+ mappedByColumns = property.getValue().getColumnIterator();
+ }
+ while ( mappedByColumns.hasNext() ) {
+ Column column = (Column) mappedByColumns.next();
+ columns[0].overrideSqlTypeIfNecessary( column );
+ columns[0].linkValueUsingAColumnCopy( column, value );
+ }
+ }
+ else if ( columns[0].isImplicit() ) {
+ /**
+ * if columns are implicit, then create the columns based on the
+ * referenced entity id columns
+ */
+ Iterator idColumns;
+ if ( referencedEntity instanceof JoinedSubclass ) {
+ idColumns = ( (JoinedSubclass) referencedEntity ).getKey().getColumnIterator();
+ }
+ else {
+ idColumns = referencedEntity.getIdentifier().getColumnIterator();
+ }
+ while ( idColumns.hasNext() ) {
+ Column column = (Column) idColumns.next();
+ columns[0].overrideSqlTypeIfNecessary( column );
+ columns[0].linkValueUsingDefaultColumnNaming( column, referencedEntity, value );
+ }
+ }
+ else {
+ int fkEnum = Ejb3JoinColumn.checkReferencedColumnsType( columns, referencedEntity, mappings );
+
+ if ( Ejb3JoinColumn.NON_PK_REFERENCE == fkEnum ) {
+ String referencedPropertyName;
+ if ( value instanceof ToOne ) {
+ referencedPropertyName = ( (ToOne) value ).getReferencedPropertyName();
+ }
+ else if ( value instanceof DependantValue ) {
+ String propertyName = columns[0].getPropertyName();
+ if ( propertyName != null ) {
+ Collection collection = (Collection) referencedEntity.getRecursiveProperty( propertyName )
+ .getValue();
+ referencedPropertyName = collection.getReferencedPropertyName();
+ }
+ else {
+ throw new AnnotationException( "SecondaryTable JoinColumn cannot reference a non primary key" );
+ }
+
+ }
+ else {
+ throw new AssertionFailure(
+ "Do a property ref on an unexpected Value type: "
+ + value.getClass().getName()
+ );
+ }
+ if ( referencedPropertyName == null ) {
+ throw new AssertionFailure(
+ "No property ref found while expected"
+ );
+ }
+ Property synthProp = referencedEntity.getRecursiveProperty( referencedPropertyName );
+ if ( synthProp == null ) {
+ throw new AssertionFailure(
+ "Cannot find synthProp: " + referencedEntity.getEntityName() + "." + referencedPropertyName
+ );
+ }
+ linkJoinColumnWithValueOverridingNameIfImplicit(
+ referencedEntity, synthProp.getColumnIterator(), columns, value
+ );
+
+ }
+ else {
+ if ( Ejb3JoinColumn.NO_REFERENCE == fkEnum ) {
+ //implicit case, we hope PK and FK columns are in the same order
+ if ( columns.length != referencedEntity.getIdentifier().getColumnSpan() ) {
+ throw new AnnotationException(
+ "A Foreign key refering " + referencedEntity.getEntityName()
+ + " from " + associatedClass.getEntityName()
+ + " has the wrong number of column. should be " + referencedEntity.getIdentifier()
+ .getColumnSpan()
+ );
+ }
+ linkJoinColumnWithValueOverridingNameIfImplicit(
+ referencedEntity,
+ referencedEntity.getIdentifier().getColumnIterator(),
+ columns,
+ value
+ );
+ }
+ else {
+ //explicit referencedColumnName
+ Iterator idColItr = referencedEntity.getKey().getColumnIterator();
+ org.hibernate.mapping.Column col;
+ Table table = referencedEntity.getTable(); //works cause the pk has to be on the primary table
+ if ( ! idColItr.hasNext() ) log.debug( "No column in the identifier!" );
+ while ( idColItr.hasNext() ) {
+ boolean match = false;
+ //for each PK column, find the associated FK column.
+ col = (org.hibernate.mapping.Column) idColItr.next();
+ for ( Ejb3JoinColumn joinCol : columns ) {
+ String referencedColumn = joinCol.getReferencedColumn();
+ referencedColumn = mappings.getPhysicalColumnName( referencedColumn, table );
+ if ( referencedColumn.equals( col.getName() ) ) {
+ //proper join column
+ if ( joinCol.isNameDeferred() ) {
+ joinCol.linkValueUsingDefaultColumnNaming(
+ col, referencedEntity, value
+ );
+ }
+ else {
+ joinCol.linkWithValue( value );
+ }
+ joinCol.overrideSqlTypeIfNecessary( col );
+ match = true;
+ break;
+ }
+ }
+ if ( !match ) {
+ throw new AnnotationException(
+ "Column name " + col.getName() + " of "
+ + referencedEntity.getEntityName() + " not found in JoinColumns.referencedColumnName"
+ );
+ }
+ }
+ }
+ }
+ }
+ value.createForeignKey();
+ if ( unique == true ) {
+ createUniqueConstraint( value );
+ }
+ }
+
+ private static void linkJoinColumnWithValueOverridingNameIfImplicit(
+ PersistentClass referencedEntity, Iterator columnIterator, Ejb3JoinColumn[] columns, SimpleValue value
+ ) {
+ for ( Ejb3JoinColumn joinCol : columns ) {
+ Column synthCol = (Column) columnIterator.next();
+ if ( joinCol.isNameDeferred() ) {
+ //this has to be the default value
+ joinCol.linkValueUsingDefaultColumnNaming( synthCol, referencedEntity, value );
+ }
+ else {
+ joinCol.linkWithValue( value );
+ }
+ joinCol.overrideSqlTypeIfNecessary( synthCol );
+ }
+ }
+
+ public static void createUniqueConstraint(Value value) {
+ Iterator iter = value.getColumnIterator();
+ ArrayList cols = new ArrayList();
+ while ( iter.hasNext() ) {
+ cols.add( iter.next() );
+ }
+ value.getTable().createUniqueKey( cols );
+ }
+
+ public static void addIndexes(Table hibTable, Index[] indexes, ExtendedMappings mappings) {
+ for ( Index index : indexes ) {
+ //no need to handle inSecondPass here since it is only called from EntityBinder
+ mappings.addSecondPass(
+ new IndexSecondPass( hibTable, index.name(), index.columnNames(), mappings )
+ );
+ }
+ }
+
+ public static List<String[]> buildUniqueConstraints(UniqueConstraint[] constraintsArray) {
+ List<String[]> result = new ArrayList<String[]>();
+ if ( constraintsArray.length != 0 ) {
+ for ( UniqueConstraint uc : constraintsArray ) {
+ result.add( uc.columnNames() );
+ }
+ }
+ return result;
+ }
+
+ public void setDefaultName(
+ String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
+ String propertyName
+ ) {
+ this.ownerEntity = ownerEntity;
+ this.ownerEntityTable = ownerEntityTable;
+ this.associatedEntity = associatedEntity;
+ this.associatedEntityTable = associatedEntityTable;
+ this.propertyName = propertyName;
+ this.name = null;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Version.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Version.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.cfg.annotations;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Version {
- public static final String VERSION = "3.2.1.GA";
- private static Log log = LogFactory.getLog( Version.class );
-
- static {
- log.info( "Hibernate Annotations " + VERSION );
- }
-
- public static void touch() {
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Version.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Version.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Version.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.cfg.annotations;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Version {
+ public static final String VERSION = "3.2.1.GA";
+ private static Log log = LogFactory.getLog( Version.class );
+
+ static {
+ log.info( "Hibernate Annotations " + VERSION );
+ }
+
+ public static void touch() {
+ }
+}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection)
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3OverridenAnnotationReader.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3OverridenAnnotationReader.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3OverridenAnnotationReader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,2080 +0,0 @@
-package org.hibernate.cfg.annotations.reflection;
-
-import java.beans.Introspector;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.HashSet;
-
-import javax.persistence.AssociationOverride;
-import javax.persistence.AssociationOverrides;
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.ColumnResult;
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorType;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Embeddable;
-import javax.persistence.Embedded;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.EntityResult;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.ExcludeDefaultListeners;
-import javax.persistence.ExcludeSuperclassListeners;
-import javax.persistence.FetchType;
-import javax.persistence.FieldResult;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.JoinTable;
-import javax.persistence.Lob;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-import javax.persistence.MapKey;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.NamedNativeQueries;
-import javax.persistence.NamedNativeQuery;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.OrderBy;
-import javax.persistence.PostLoad;
-import javax.persistence.PostPersist;
-import javax.persistence.PostRemove;
-import javax.persistence.PostUpdate;
-import javax.persistence.PrePersist;
-import javax.persistence.PreRemove;
-import javax.persistence.PreUpdate;
-import javax.persistence.PrimaryKeyJoinColumn;
-import javax.persistence.PrimaryKeyJoinColumns;
-import javax.persistence.QueryHint;
-import javax.persistence.SecondaryTable;
-import javax.persistence.SecondaryTables;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.SqlResultSetMapping;
-import javax.persistence.SqlResultSetMappings;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-import javax.persistence.UniqueConstraint;
-import javax.persistence.Version;
-
-import org.dom4j.Attribute;
-import org.dom4j.Element;
-import org.hibernate.AnnotationException;
-import org.hibernate.annotations.common.annotationfactory.AnnotationDescriptor;
-import org.hibernate.annotations.common.annotationfactory.AnnotationFactory;
-import org.hibernate.annotations.AccessType;
-import org.hibernate.annotations.CollectionOfElements;
-import org.hibernate.annotations.Columns;
-import org.hibernate.annotations.common.reflection.AnnotationReader;
-import org.hibernate.annotations.common.reflection.Filter;
-import org.hibernate.annotations.common.reflection.ReflectionUtil;
-import org.hibernate.annotations.common.AssertionFailure;
-import org.hibernate.util.ReflectHelper;
-import org.hibernate.util.StringHelper;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor.
- *
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- * @author Emmanuel Bernard
- */
-public class EJB3OverridenAnnotationReader implements AnnotationReader {
- private static Log log = LogFactory.getLog( EJB3OverridenAnnotationReader.class );
- private static final Map<Class, String> annotationToXml;
- private static final String SCHEMA_VALIDATION = "Activate schema validation for more informations";
- private static final Filter FILTER = new Filter() {
- public boolean returnStatic() {
- return false;
- }
-
- public boolean returnTransient() {
- return false;
- }
- };
-
- static {
- annotationToXml = new HashMap<Class, String>();
- annotationToXml.put( Entity.class, "entity" );
- annotationToXml.put( MappedSuperclass.class, "mapped-superclass" );
- annotationToXml.put( Embeddable.class, "embeddable" );
- annotationToXml.put( Table.class, "table" );
- annotationToXml.put( SecondaryTable.class, "secondary-table" );
- annotationToXml.put( SecondaryTables.class, "secondary-table" );
- annotationToXml.put( PrimaryKeyJoinColumn.class, "primary-key-join-column" );
- annotationToXml.put( PrimaryKeyJoinColumns.class, "primary-key-join-column" );
- annotationToXml.put( IdClass.class, "id-class" );
- annotationToXml.put( Inheritance.class, "inheritance" );
- annotationToXml.put( DiscriminatorValue.class, "discriminator-value" );
- annotationToXml.put( DiscriminatorColumn.class, "discriminator-column" );
- annotationToXml.put( SequenceGenerator.class, "sequence-generator" );
- annotationToXml.put( TableGenerator.class, "table-generator" );
- annotationToXml.put( NamedQuery.class, "named-query" );
- annotationToXml.put( NamedQueries.class, "named-query" );
- annotationToXml.put( NamedNativeQuery.class, "named-native-query" );
- annotationToXml.put( NamedNativeQueries.class, "named-native-query" );
- annotationToXml.put( SqlResultSetMapping.class, "sql-result-set-mapping" );
- annotationToXml.put( SqlResultSetMappings.class, "sql-result-set-mapping" );
- annotationToXml.put( ExcludeDefaultListeners.class, "exclude-default-listeners" );
- annotationToXml.put( ExcludeSuperclassListeners.class, "exclude-superclass-listeners" );
- annotationToXml.put( AccessType.class, "access" );
- annotationToXml.put( AttributeOverride.class, "attribute-override" );
- annotationToXml.put( AttributeOverrides.class, "attribute-override" );
- annotationToXml.put( AttributeOverride.class, "association-override" );
- annotationToXml.put( AttributeOverrides.class, "association-override" );
- annotationToXml.put( Id.class, "id" );
- annotationToXml.put( EmbeddedId.class, "embedded-id" );
- annotationToXml.put( GeneratedValue.class, "generated-value" );
- annotationToXml.put( Column.class, "column" );
- annotationToXml.put( Columns.class, "column" );
- annotationToXml.put( Temporal.class, "temporal" );
- annotationToXml.put( Lob.class, "lob" );
- annotationToXml.put( Enumerated.class, "enumerated" );
- annotationToXml.put( Version.class, "version" );
- annotationToXml.put( Transient.class, "transient" );
- annotationToXml.put( Basic.class, "basic" );
- annotationToXml.put( Embedded.class, "embedded" );
- annotationToXml.put( ManyToOne.class, "many-to-one" );
- annotationToXml.put( OneToOne.class, "one-to-one" );
- annotationToXml.put( OneToMany.class, "one-to-many" );
- annotationToXml.put( ManyToMany.class, "many-to-many" );
- annotationToXml.put( JoinTable.class, "join-table" );
- annotationToXml.put( JoinColumn.class, "join-column" );
- annotationToXml.put( JoinColumns.class, "join-column" );
- annotationToXml.put( MapKey.class, "map-key" );
- annotationToXml.put( OrderBy.class, "order-by" );
- annotationToXml.put( EntityListeners.class, "entity-listeners" );
- annotationToXml.put( PrePersist.class, "pre-persist" );
- annotationToXml.put( PreRemove.class, "pre-remove" );
- annotationToXml.put( PreUpdate.class, "pre-update" );
- annotationToXml.put( PostPersist.class, "post-persist" );
- annotationToXml.put( PostRemove.class, "post-remove" );
- annotationToXml.put( PostUpdate.class, "post-update" );
- annotationToXml.put( PostLoad.class, "post-load" );
- }
-
- private XMLContext xmlContext;
- private String className;
- private String propertyName;
- private PropertyType propertyType;
- private transient Annotation[] annotations;
- private transient Map<Class, Annotation> annotationsMap;
- private static final String WORD_SEPARATOR = "-";
- private transient List<Element> elementsForProperty;
- private AccessibleObject mirroredAttribute;
- private final AnnotatedElement element;
-
- private enum PropertyType {
- PROPERTY,
- FIELD,
- METHOD
- }
-
- public EJB3OverridenAnnotationReader(AnnotatedElement el, XMLContext xmlContext) {
- this.element = el;
- this.xmlContext = xmlContext;
- if ( el instanceof Class ) {
- Class clazz = (Class) el;
- className = clazz.getName();
- }
- else if ( el instanceof Field ) {
- Field field = (Field) el;
- className = field.getDeclaringClass().getName();
- propertyName = field.getName();
- propertyType = PropertyType.FIELD;
- String expectedGetter = "get" + Character.toUpperCase( propertyName.charAt( 0 ) ) + propertyName.substring(
- 1
- );
- try {
- mirroredAttribute = field.getDeclaringClass().getDeclaredMethod( expectedGetter );
- }
- catch (NoSuchMethodException e) {
- //no method
- }
- }
- else if ( el instanceof Method ) {
- Method method = (Method) el;
- className = method.getDeclaringClass().getName();
- propertyName = method.getName();
- if ( ReflectionUtil.isProperty(
- method,
- null, //this is yukky!! we'd rather get the TypeEnvironment()
- FILTER
- ) ) {
- if ( propertyName.startsWith( "get" ) ) {
- propertyName = Introspector.decapitalize( propertyName.substring( "get".length() ) );
- }
- else if ( propertyName.startsWith( "is" ) ) {
- propertyName = Introspector.decapitalize( propertyName.substring( "is".length() ) );
- }
- else {
- throw new RuntimeException( "Method " + propertyName + " is not a property getter" );
- }
- propertyType = PropertyType.PROPERTY;
- try {
- mirroredAttribute = method.getDeclaringClass().getDeclaredField( propertyName );
- }
- catch (NoSuchFieldException e) {
- //no method
- }
- }
- else {
- propertyType = PropertyType.METHOD;
- }
- }
- else {
- className = null;
- propertyName = null;
- }
- }
-
- public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
- initAnnotations();
- return (T) annotationsMap.get( annotationType );
- }
-
- public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) {
- initAnnotations();
- return (T) annotationsMap.get( annotationType ) != null;
- }
-
- public Annotation[] getAnnotations() {
- initAnnotations();
- return annotations;
- }
-
- private void initAnnotations() {
- if ( annotations == null ) {
- XMLContext.Default defaults = xmlContext.getDefault( className );
- if ( className != null && propertyName == null ) {
- //is a class
- Element tree = xmlContext.getXMLTree( className, null );
- Annotation[] annotations = getJavaAnnotations();
- List<Annotation> annotationList = new ArrayList<Annotation>( annotations.length + 5 );
- annotationsMap = new HashMap<Class, Annotation>( annotations.length + 5 );
- for ( Annotation annotation : annotations ) {
- if ( ! annotationToXml.containsKey( annotation.annotationType() ) ) {
- //unknown annotations are left over
- annotationList.add( annotation );
- }
- }
- addIfNotNull( annotationList, getEntity( tree, defaults ) );
- addIfNotNull( annotationList, getMappedSuperclass( tree, defaults ) );
- addIfNotNull( annotationList, getEmbeddable( tree, defaults ) );
- addIfNotNull( annotationList, getTable( tree, defaults ) );
- addIfNotNull( annotationList, getSecondaryTables( tree, defaults ) );
- addIfNotNull( annotationList, getPrimaryKeyJoinColumns( tree, defaults ) );
- addIfNotNull( annotationList, getIdClass( tree, defaults ) );
- addIfNotNull( annotationList, getInheritance( tree, defaults ) );
- addIfNotNull( annotationList, getDiscriminatorValue( tree, defaults ) );
- addIfNotNull( annotationList, getDiscriminatorColumn( tree, defaults ) );
- addIfNotNull( annotationList, getSequenceGenerator( tree, defaults ) );
- addIfNotNull( annotationList, getTableGenerator( tree, defaults ) );
- addIfNotNull( annotationList, getNamedQueries( tree, defaults ) );
- addIfNotNull( annotationList, getNamedNativeQueries( tree, defaults ) );
- addIfNotNull( annotationList, getSqlResultSetMappings( tree, defaults ) );
- addIfNotNull( annotationList, getExcludeDefaultListeners( tree, defaults ) );
- addIfNotNull( annotationList, getExcludeSuperclassListeners( tree, defaults ) );
- addIfNotNull( annotationList, getAccessType( tree, defaults ) );
- addIfNotNull( annotationList, getAttributeOverrides( tree, defaults ) );
- addIfNotNull( annotationList, getAssociationOverrides( tree, defaults ) );
- addIfNotNull( annotationList, getEntityListeners( tree, defaults ) );
- //FIXME use annotationsMap rather than annotationList this will be faster since the annotation type is usually known at put() time
- this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] );
- for (Annotation ann : this.annotations) {
- annotationsMap.put( ann.annotationType(), ann );
- }
- checkForOrphanProperties(tree);
- }
- else if ( className != null ) { //&& propertyName != null ) { //always true but less confusing
- Element tree = xmlContext.getXMLTree( className, propertyName );
- Annotation[] annotations = getJavaAnnotations();
- List<Annotation> annotationList = new ArrayList<Annotation>( annotations.length + 5 );
- annotationsMap = new HashMap<Class, Annotation>( annotations.length + 5 );
- for ( Annotation annotation : annotations ) {
- if ( ! annotationToXml.containsKey( annotation.annotationType() ) ) {
- //unknown annotations are left over
- annotationList.add( annotation );
- }
- }
- preCalculateElementsForProperty( tree );
- Transient transientAnn = getTransient( defaults );
- if ( transientAnn != null ) {
- annotationList.add( transientAnn );
- }
- else {
- if ( defaults.canUseJavaAnnotations() ) {
- Annotation annotation = getJavaAnnotation( AccessType.class );
- addIfNotNull(annotationList, annotation);
- }
- getId( annotationList, defaults );
- getEmbeddedId( annotationList, defaults );
- getEmbedded( annotationList, defaults );
- getBasic( annotationList, defaults );
- getVersion( annotationList, defaults );
- getAssociation( ManyToOne.class, annotationList, defaults );
- getAssociation( OneToOne.class, annotationList, defaults );
- getAssociation( OneToMany.class, annotationList, defaults );
- getAssociation( ManyToMany.class, annotationList, defaults );
- addIfNotNull(annotationList, getSequenceGenerator( elementsForProperty, defaults ));
- addIfNotNull(annotationList, getTableGenerator( elementsForProperty, defaults ));
- addIfNotNull(annotationList, getAttributeOverrides( elementsForProperty, defaults ));
-
- }
- processEventAnnotations(annotationList, defaults);
- //FIXME use annotationsMap rather than annotationList this will be faster since the annotation type is usually known at put() time
- this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] );
- for (Annotation ann : this.annotations) {
- annotationsMap.put( ann.annotationType(), ann );
- }
- }
- else {
- this.annotations = getJavaAnnotations();
- for (Annotation ann : this.annotations) {
- annotationsMap.put( ann.annotationType(), ann );
- }
- }
- }
- }
-
- private void checkForOrphanProperties(Element tree) {
- Class clazz;
- try {
- clazz = ReflectHelper.classForName( className, this.getClass() );
- }
- catch (ClassNotFoundException e) {
- return; //a primitive type most likely
- }
- Element element = tree != null ? tree.element( "attributes" ) : null;
- //put entity.attributes elements
- if ( element != null ) {
- //precompute the list of properties
- //TODO is it really useful...
- Set<String> properties = new HashSet<String>();
- for (Field field : clazz.getFields() ) {
- properties.add( field.getName() );
- }
- for (Method method : clazz.getMethods() ) {
- String name = method.getName();
- if ( name.startsWith( "get" ) ) {
- properties.add( Introspector.decapitalize( name.substring( "get".length() ) ) );
- }
- else if ( name.startsWith( "is" ) ) {
- properties.add( Introspector.decapitalize( name.substring( "is".length() ) ) );
- }
- }
- for ( Element subelement : (List<Element>) element.elements() ) {
- String propertyName = subelement.attributeValue( "name" );
- if ( ! properties.contains( propertyName ) ) {
- log.warn("Property " + StringHelper.qualify( className, propertyName ) + " not found in class"
- + " but described in <mapping-file/> (possible typo error)");
- }
- }
- }
- }
-
- /**
- * Addes the Annotation to the list (only if it's not null) and then returns it.
- */
- private Annotation addIfNotNull(List<Annotation> annotationList, Annotation element) {
- if ( element != null ) {
- annotationList.add( element );
- }
- return element;
- }
-
- //TODO mutualize the next 2 methods
- private Annotation getTableGenerator(List<Element> elementsForProperty, XMLContext.Default defaults) {
- for (Element element : elementsForProperty) {
- Element subelement = element != null ? element.element( annotationToXml.get( TableGenerator.class ) ) : null;
- if ( subelement != null ) {
- return buildTableGeneratorAnnotation( subelement, defaults );
- }
- }
- if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( TableGenerator.class );
- }
- else {
- return null;
- }
- }
-
-
- private Annotation getSequenceGenerator(List<Element> elementsForProperty, XMLContext.Default defaults) {
- for (Element element : elementsForProperty) {
- Element subelement = element != null ? element.element( annotationToXml.get( SequenceGenerator.class ) ) : null;
- if ( subelement != null ) {
- return buildSequenceGeneratorAnnotation( subelement );
- }
- }
- if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( SequenceGenerator.class );
- }
- else {
- return null;
- }
- }
-
- private void processEventAnnotations(List<Annotation> annotationList, XMLContext.Default defaults) {
- boolean eventElement = false;
- for ( Element element : elementsForProperty ) {
- String elementName = element.getName();
- if ( "pre-persist".equals( elementName ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( PrePersist.class );
- annotationList.add( AnnotationFactory.create( ad ) );
- eventElement = true;
- }
- else if ( "pre-remove".equals( elementName ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( PreRemove.class );
- annotationList.add( AnnotationFactory.create( ad ) );
- eventElement = true;
- }
- else if ( "pre-update".equals( elementName ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( PreUpdate.class );
- annotationList.add( AnnotationFactory.create( ad ) );
- eventElement = true;
- }
- else if ( "post-persist".equals( elementName ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( PostPersist.class );
- annotationList.add( AnnotationFactory.create( ad ) );
- eventElement = true;
- }
- else if ( "post-remove".equals( elementName ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( PostRemove.class );
- annotationList.add( AnnotationFactory.create( ad ) );
- eventElement = true;
- }
- else if ( "post-update".equals( elementName ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( PostUpdate.class );
- annotationList.add( AnnotationFactory.create( ad ) );
- eventElement = true;
- }
- else if ( "post-load".equals( elementName ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( PostLoad.class );
- annotationList.add( AnnotationFactory.create( ad ) );
- eventElement = true;
- }
- }
- if ( ! eventElement && defaults.canUseJavaAnnotations() ) {
- Annotation ann = getJavaAnnotation(PrePersist.class);
- addIfNotNull(annotationList, ann);
- ann = getJavaAnnotation(PreRemove.class);
- addIfNotNull(annotationList, ann);
- ann = getJavaAnnotation(PreUpdate.class);
- addIfNotNull(annotationList, ann);
- ann = getJavaAnnotation(PostPersist.class);
- addIfNotNull(annotationList, ann);
- ann = getJavaAnnotation(PostRemove.class);
- addIfNotNull(annotationList, ann);
- ann = getJavaAnnotation(PostUpdate.class);
- addIfNotNull(annotationList, ann);
- ann = getJavaAnnotation(PostLoad.class);
- addIfNotNull(annotationList, ann);
- }
- }
-
- private EntityListeners getEntityListeners(Element tree, XMLContext.Default defaults) {
- Element element = tree != null ? tree.element( "entity-listeners" ) : null;
- if ( element != null) {
- List<Class> entityListenerClasses = new ArrayList<Class>();
- for (Element subelement : (List<Element>) element.elements( "entity-listener" ) ) {
- String className = subelement.attributeValue( "class" );
- try {
- entityListenerClasses.add(
- ReflectHelper.classForName(
- XMLContext.buildSafeClassName( className, defaults ),
- this.getClass()
- )
- );
- }
- catch (ClassNotFoundException e) {
- throw new AnnotationException(
- "Unable to find " + element.getPath() + ".class: " + className, e
- );
- }
- }
- AnnotationDescriptor ad = new AnnotationDescriptor( EntityListeners.class );
- ad.setValue( "value", entityListenerClasses.toArray( new Class[ entityListenerClasses.size() ] ) );
- return AnnotationFactory.create( ad );
- }
- else if ( defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( EntityListeners.class );
- }
- else {
- return null;
- }
- }
-
- private JoinTable overridesDefaultsInJoinTable(Annotation annotation, XMLContext.Default defaults) {
- //no element but might have some default or some annotation
- boolean defaultToJoinTable = ! ( isJavaAnnotationPresent( JoinColumn.class )
- || isJavaAnnotationPresent( JoinColumns.class ) );
- final Class<? extends Annotation> annotationClass = annotation.annotationType();
- defaultToJoinTable = defaultToJoinTable &&
- ( ( annotationClass == ManyToMany.class && StringHelper.isEmpty( ( (ManyToMany) annotation).mappedBy() ) )
- || ( annotationClass == OneToMany.class && StringHelper.isEmpty( ( (OneToMany) annotation).mappedBy() ) )
- || ( annotationClass == CollectionOfElements.class )
- );
- final Class<JoinTable> annotationType = JoinTable.class;
- if ( defaultToJoinTable
- && ( StringHelper.isNotEmpty( defaults.getCatalog() )
- || StringHelper.isNotEmpty( defaults.getSchema() ) ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( annotationType );
- if ( defaults.canUseJavaAnnotations() ) {
- JoinTable table = getJavaAnnotation( annotationType );
- if ( table != null ) {
- ad.setValue( "name", table.name() );
- ad.setValue( "schema", table.schema() );
- ad.setValue( "catalog", table.catalog() );
- ad.setValue( "uniqueConstraints", table.uniqueConstraints() );
- ad.setValue( "joinColumns", table.joinColumns() );
- ad.setValue( "inverseJoinColumns", table.inverseJoinColumns() );
- }
- }
- if ( StringHelper.isEmpty( (String) ad.valueOf( "schema" ) )
- && StringHelper.isNotEmpty( defaults.getSchema() ) ) {
- ad.setValue( "schema", defaults.getSchema() );
- }
- if ( StringHelper.isEmpty( (String) ad.valueOf( "catalog" ) )
- && StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
- ad.setValue( "catalog", defaults.getCatalog() );
- }
- return AnnotationFactory.create( ad );
- }
- else if ( defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( annotationType );
- }
- else {
- return null;
- }
- }
-
- /*
- * no partial overriding possible
- */
- private void getJoinTable(List<Annotation> annotationList, Element tree, XMLContext.Default defaults) {
- Element subelement = tree == null ? null : tree.element( "join-table" );
- final Class<JoinTable> annotationType = JoinTable.class;
- if ( subelement != null ) {
- //ignore java annotation, an element is defined
- AnnotationDescriptor annotation = new AnnotationDescriptor( annotationType );
- copyStringAttribute( annotation, subelement, "name", false );
- copyStringAttribute( annotation, subelement, "catalog", false );
- if ( StringHelper.isNotEmpty( defaults.getCatalog() )
- && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) {
- annotation.setValue( "catalog", defaults.getCatalog() );
- }
- copyStringAttribute( annotation, subelement, "schema", false );
- if ( StringHelper.isNotEmpty( defaults.getSchema() )
- && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) {
- annotation.setValue( "schema", defaults.getSchema() );
- }
- buildUniqueConstraints( annotation, subelement );
- annotation.setValue( "joinColumns", getJoinColumns( subelement, false ) );
- annotation.setValue( "inverseJoinColumns", getJoinColumns( subelement, true ) );
- annotationList.add( AnnotationFactory.create( annotation ) );
- }
- }
-
- private void getAssociation(
- Class<? extends Annotation> annotationType, List<Annotation> annotationList, XMLContext.Default defaults
- ) {
- String xmlName = annotationToXml.get( annotationType );
- for ( Element element : elementsForProperty ) {
- if ( xmlName.equals( element.getName() ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( annotationType );
- String className = element.attributeValue( "target-entity" );
- if ( className != null ) {
- Class clazz;
- try {
- clazz = ReflectHelper.classForName(
- XMLContext.buildSafeClassName( className, defaults ),
- this.getClass()
- );
- }
- catch (ClassNotFoundException e) {
- throw new AnnotationException(
- "Unable to find " + element.getPath() + "target-entity: " + className, e
- );
- }
- ad.setValue( "targetEntity", clazz );
- }
- getFetchType( ad, element );
- getCascades( ad, element, defaults );
- getJoinTable( annotationList, element, defaults );
- buildJoinColumns( annotationList, element, defaults );
- Annotation annotation = getPrimaryKeyJoinColumns( element, defaults );
- addIfNotNull(annotationList, annotation);
- copyBooleanAttribute( ad, element, "optional" );
- copyStringAttribute( ad, element, "mapped-by", false );
- getOrderBy( annotationList, element, defaults );
- getMapKey( annotationList, element, defaults );
- annotationList.add( AnnotationFactory.create( ad ) );
- }
- }
- if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
- Annotation annotation = getJavaAnnotation( annotationType );
- if ( annotation != null ) {
- annotationList.add( annotation );
- annotation = overridesDefaultsInJoinTable( annotation, defaults );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( JoinColumn.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( JoinColumns.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( PrimaryKeyJoinColumn.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( PrimaryKeyJoinColumns.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( MapKey.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( OrderBy.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverrides.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverrides.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Lob.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Enumerated.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Temporal.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Column.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Columns.class );
- addIfNotNull(annotationList, annotation);
- }
- else if ( isJavaAnnotationPresent( CollectionOfElements.class ) ) {
- annotation = overridesDefaultsInJoinTable( getJavaAnnotation( CollectionOfElements.class ), defaults );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( JoinColumn.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( JoinColumns.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( PrimaryKeyJoinColumn.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( PrimaryKeyJoinColumns.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( MapKey.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( OrderBy.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverrides.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverrides.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Lob.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Enumerated.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Temporal.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Column.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Columns.class );
- addIfNotNull(annotationList, annotation);
- }
- }
- }
-
- private void getOrderBy(List<Annotation> annotationList, Element element, XMLContext.Default defaults) {
- Element subelement = element != null ? element.element( "order-by" ) : null;
- if ( subelement != null ) {
- String orderByString = subelement.getTextTrim();
- AnnotationDescriptor ad = new AnnotationDescriptor( OrderBy.class );
- if ( StringHelper.isNotEmpty( orderByString ) ) ad.setValue( "value", orderByString );
- annotationList.add( AnnotationFactory.create( ad ) );
- }
- }
-
- private void getMapKey(List<Annotation> annotationList, Element element, XMLContext.Default defaults) {
- Element subelement = element != null ? element.element( "map-key" ) : null;
- if ( subelement != null ) {
- String mapKeyString = subelement.attributeValue( "name" );
- AnnotationDescriptor ad = new AnnotationDescriptor( MapKey.class );
- if ( StringHelper.isNotEmpty( mapKeyString ) ) ad.setValue( "name", mapKeyString );
- annotationList.add( AnnotationFactory.create( ad ) );
- }
- }
-
- private void buildJoinColumns(List<Annotation> annotationList, Element element, XMLContext.Default defaults) {
- JoinColumn[] joinColumns = getJoinColumns( element, false );
- if ( joinColumns.length > 0 ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( JoinColumns.class );
- ad.setValue( "value", joinColumns );
- annotationList.add( AnnotationFactory.create( ad ) );
- }
- }
-
- private void getCascades(AnnotationDescriptor ad, Element element, XMLContext.Default defaults) {
- List<Element> elements = element != null ? element.elements( "cascade" ) : new ArrayList<Element>( 0 );
- List<CascadeType> cascades = new ArrayList<CascadeType>();
- for ( Element subelement : elements ) {
- if ( subelement.element( "cascade-all" ) != null ) cascades.add( CascadeType.ALL );
- if ( subelement.element( "cascade-persist" ) != null ) cascades.add( CascadeType.PERSIST );
- if ( subelement.element( "cascade-merge" ) != null ) cascades.add( CascadeType.MERGE );
- if ( subelement.element( "cascade-remove" ) != null ) cascades.add( CascadeType.REMOVE );
- if ( subelement.element( "cascade-refresh" ) != null ) cascades.add( CascadeType.REFRESH );
- }
- if ( Boolean.TRUE.equals( defaults.getCascadePersist() )
- && ! cascades.contains( CascadeType.ALL ) && ! cascades.contains( CascadeType.PERSIST ) ) {
- cascades.add( CascadeType.PERSIST );
- }
- if ( cascades.size() > 0 ) {
- ad.setValue( "cascade", cascades.toArray( new CascadeType[ cascades.size() ] ) );
- }
- }
-
- private void getEmbedded(List<Annotation> annotationList, XMLContext.Default defaults) {
- for ( Element element : elementsForProperty ) {
- if ( "embedded".equals( element.getName() ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( Embedded.class );
- annotationList.add( AnnotationFactory.create( ad ) );
- }
- }
- if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
- Annotation annotation = getJavaAnnotation( Embedded.class );
- if ( annotation != null ) {
- annotationList.add( annotation );
- annotation = getJavaAnnotation( AttributeOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverrides.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverrides.class );
- addIfNotNull(annotationList, annotation);
- }
- }
- }
-
- private Transient getTransient(XMLContext.Default defaults) {
- for ( Element element : elementsForProperty ) {
- if ( "transient".equals( element.getName() ) ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( Transient.class );
- return AnnotationFactory.create( ad );
- }
- }
- if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( Transient.class );
- }
- else {
- return null;
- }
- }
-
- private void getVersion(List<Annotation> annotationList, XMLContext.Default defaults) {
- for ( Element element : elementsForProperty ) {
- if ( "version".equals( element.getName() ) ) {
- Annotation annotation = buildColumns( element );
- addIfNotNull(annotationList, annotation);
- getTemporal( annotationList, element );
- AnnotationDescriptor basic = new AnnotationDescriptor( Version.class );
- annotationList.add( AnnotationFactory.create( basic ) );
- }
- }
- if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
- //we have nothing, so Java annotations might occurs
- Annotation annotation = getJavaAnnotation( Version.class );
- if ( annotation != null ) {
- annotationList.add( annotation );
- annotation = getJavaAnnotation( Column.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Columns.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Temporal.class );
- addIfNotNull(annotationList, annotation);
- }
- }
- }
-
- private void getBasic(List<Annotation> annotationList, XMLContext.Default defaults) {
- for ( Element element : elementsForProperty ) {
- if ( "basic".equals( element.getName() ) ) {
- Annotation annotation = buildColumns( element );
- addIfNotNull(annotationList, annotation);
- getTemporal( annotationList, element );
- getLob( annotationList, element );
- getEnumerated( annotationList, element );
- AnnotationDescriptor basic = new AnnotationDescriptor( Basic.class );
- getFetchType( basic, element );
- copyBooleanAttribute( basic, element, "optional" );
- annotationList.add( AnnotationFactory.create( basic ) );
- }
- }
- if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
- //no annotation presence constraint, basic is the default
- Annotation annotation = getJavaAnnotation( Basic.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Lob.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Enumerated.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Temporal.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Column.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Columns.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverrides.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverrides.class );
- addIfNotNull(annotationList, annotation);
- }
- }
-
- private void getEnumerated(List<Annotation> annotationList, Element element) {
- Element subElement = element != null ? element.element( "enumerated" ) : null;
- if ( subElement != null ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( Enumerated.class );
- String enumerated = subElement.getTextTrim();
- if ( "ORDINAL".equalsIgnoreCase( enumerated ) ) {
- ad.setValue( "value", EnumType.ORDINAL );
- }
- else if ( "STRING".equalsIgnoreCase( enumerated ) ) {
- ad.setValue( "value", EnumType.STRING );
- }
- else if ( StringHelper.isNotEmpty( enumerated ) ) {
- throw new AnnotationException( "Unknown EnumType: " + enumerated + ". " + SCHEMA_VALIDATION );
- }
- annotationList.add( AnnotationFactory.create( ad ) );
- }
- }
-
- private void getLob(List<Annotation> annotationList, Element element) {
- Element subElement = element != null ? element.element( "lob" ) : null;
- if ( subElement != null ) {
- annotationList.add( AnnotationFactory.create( new AnnotationDescriptor( Lob.class ) ) );
- }
- }
-
- private void getFetchType(AnnotationDescriptor descriptor, Element element) {
- String fetchString = element != null ? element.attributeValue( "fetch" ) : null;
- if ( fetchString != null ) {
- if ( "eager".equalsIgnoreCase( fetchString ) ) {
- descriptor.setValue( "fetch", FetchType.EAGER );
- }
- else if ( "lazy".equalsIgnoreCase( fetchString ) ) {
- descriptor.setValue( "fetch", FetchType.LAZY );
- }
- }
- }
-
- private void getEmbeddedId(List<Annotation> annotationList, XMLContext.Default defaults) {
- for ( Element element : elementsForProperty ) {
- if ( "embedded-id".equals( element.getName() ) ) {
- if ( isProcessingId( defaults ) ) {
- Annotation annotation = getAttributeOverrides( element, defaults );
- addIfNotNull(annotationList, annotation);
- annotation = getAssociationOverrides( element, defaults );
- addIfNotNull(annotationList, annotation);
- AnnotationDescriptor ad = new AnnotationDescriptor( EmbeddedId.class );
- annotationList.add( AnnotationFactory.create( ad ) );
- }
-// else {
-// if ( defaults.canUseJavaAnnotations() ) {
-// if ( ! properOverridingOnMetadataNonComplete ) {
-// //check that id exists on the other attribute
-// //TODO Id too?
-// if ( mirroredAttribute == null || ! mirroredAttribute.isAnnotationPresent(
-// EmbeddedId.class
-// ) ) {
-// throw new AnnotationException(
-// "Cannot override an property with <embedded-id> not having an @EmbeddedId already"
-// );
-// }
-// }
-// }
-// }
- }
- }
- if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
- Annotation annotation = getJavaAnnotation( EmbeddedId.class );
- if ( annotation != null ) {
- annotationList.add( annotation );
- annotation = getJavaAnnotation( Column.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Columns.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( GeneratedValue.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Temporal.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( TableGenerator.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( SequenceGenerator.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverrides.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverrides.class );
- addIfNotNull(annotationList, annotation);
- }
- }
- }
-
- private void preCalculateElementsForProperty(Element tree) {
- elementsForProperty = new ArrayList<Element>();
- Element element = tree != null ? tree.element( "attributes" ) : null;
- //put entity.attributes elements
- if ( element != null ) {
- for ( Element subelement : (List<Element>) element.elements() ) {
- if ( propertyName.equals( subelement.attributeValue( "name" ) ) ) {
- elementsForProperty.add( subelement );
- }
- }
- }
- //add pre-* etc from entity and pure entity listener classes
- if (tree != null) {
- for ( Element subelement : (List<Element>) tree.elements() ) {
- if ( propertyName.equals( subelement.attributeValue( "method-name" ) ) ) {
- elementsForProperty.add( subelement );
- }
- }
- }
- }
-
- private void getId(List<Annotation> annotationList, XMLContext.Default defaults) {
- for ( Element element : elementsForProperty ) {
- if ( "id".equals( element.getName() ) ) {
- boolean processId = isProcessingId( defaults );
- if ( processId ) {
- Annotation annotation = buildColumns( element );
- addIfNotNull(annotationList, annotation);
- annotation = buildGeneratedValue( element );
- addIfNotNull(annotationList, annotation);
- getTemporal( annotationList, element );
- //FIXME: fix the priority of xml over java for generator names
- annotation = getTableGenerator( element, defaults );
- addIfNotNull(annotationList, annotation);
- annotation = getSequenceGenerator( element, defaults );
- addIfNotNull(annotationList, annotation);
- AnnotationDescriptor id = new AnnotationDescriptor( Id.class );
- annotationList.add( AnnotationFactory.create( id ) );
- }
-// else {
-// if ( defaults.canUseJavaAnnotations() ) {
-// if ( ! properOverridingOnMetadataNonComplete ) {
-// //check that id exists on the other attribute
-// //TODO EmbeddedId too?
-// if ( mirroredAttribute == null || ! mirroredAttribute.isAnnotationPresent( Id.class ) ) {
-// throw new AnnotationException(
-// "Cannot override a property with <id> it does not have an @Id already"
-// );
-// }
-// }
-// }
-// }
- }
- }
- if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
- Annotation annotation = getJavaAnnotation( Id.class );
- if ( annotation != null ) {
- annotationList.add( annotation );
- annotation = getJavaAnnotation( Column.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Columns.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( GeneratedValue.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( Temporal.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( TableGenerator.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( SequenceGenerator.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AttributeOverrides.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverride.class );
- addIfNotNull(annotationList, annotation);
- annotation = getJavaAnnotation( AssociationOverrides.class );
- addIfNotNull(annotationList, annotation);
- }
- }
- }
-
- private boolean isProcessingId(XMLContext.Default defaults) {
- boolean isExplicit = defaults.getAccess() != null;
- boolean correctAccess =
- ( PropertyType.PROPERTY.equals( propertyType ) && "property".equals( defaults.getAccess() ) )
- || ( PropertyType.FIELD.equals( propertyType ) && "field".equals( defaults.getAccess() ) );
- boolean hasId = defaults.canUseJavaAnnotations()
- && ( isJavaAnnotationPresent( Id.class ) || isJavaAnnotationPresent( EmbeddedId.class ) );
- //if ( properAccessOnMetadataComplete || properOverridingOnMetadataNonComplete ) {
- boolean mirrorAttributeIsId = defaults.canUseJavaAnnotations() &&
- ( mirroredAttribute != null &&
- ( mirroredAttribute.isAnnotationPresent(Id.class)
- || mirroredAttribute.isAnnotationPresent( EmbeddedId.class ) ) );
- boolean propertyIsDefault = PropertyType.PROPERTY.equals( propertyType )
- && ! mirrorAttributeIsId;
- return correctAccess || ( ! isExplicit && hasId ) || ( ! isExplicit && propertyIsDefault );
- }
-
- private Columns buildColumns(Element element) {
- List<Element> subelements = element.elements( "column" );
- List<Column> columns = new ArrayList<Column>( subelements.size() );
- for ( Element subelement : subelements ) {
- columns.add( getColumn( subelement, false, element ) );
- }
- if ( columns.size() > 0 ) {
- AnnotationDescriptor columnsDescr = new AnnotationDescriptor( Columns.class );
- columnsDescr.setValue( "columns", columns.toArray( new Column[ columns.size() ] ) );
- return AnnotationFactory.create( columnsDescr );
- }
- else {
- return null;
- }
- }
-
- private GeneratedValue buildGeneratedValue(Element element) {
- Element subElement = element != null ? element.element( "generated-value" ) : null;
- if ( subElement != null ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( GeneratedValue.class );
- String strategy = subElement.attributeValue( "strategy" );
- if ( "TABLE".equalsIgnoreCase( strategy ) ) {
- ad.setValue( "strategy", GenerationType.TABLE );
- }
- else if ( "SEQUENCE".equalsIgnoreCase( strategy ) ) {
- ad.setValue( "strategy", GenerationType.SEQUENCE );
- }
- else if ( "IDENTITY".equalsIgnoreCase( strategy ) ) {
- ad.setValue( "strategy", GenerationType.IDENTITY );
- }
- else if ( "AUTO".equalsIgnoreCase( strategy ) ) {
- ad.setValue( "strategy", GenerationType.AUTO );
- }
- else if ( StringHelper.isNotEmpty( strategy ) ) {
- throw new AnnotationException( "Unknown GenerationType: " + strategy + ". " + SCHEMA_VALIDATION );
- }
- copyStringAttribute( ad, subElement, "generator", false );
- return AnnotationFactory.create( ad );
- }
- else {
- return null;
- }
- }
-
- private void getTemporal(List<Annotation> annotationList, Element element) {
- Element subElement = element != null ? element.element( "temporal" ) : null;
- if ( subElement != null ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( Temporal.class );
- String temporal = subElement.getTextTrim();
- if ( "DATE".equalsIgnoreCase( temporal ) ) {
- ad.setValue( "value", TemporalType.DATE );
- }
- else if ( "TIME".equalsIgnoreCase( temporal ) ) {
- ad.setValue( "value", TemporalType.TIME );
- }
- else if ( "TIMESTAMP".equalsIgnoreCase( temporal ) ) {
- ad.setValue( "value", TemporalType.TIMESTAMP );
- }
- else if ( StringHelper.isNotEmpty( temporal ) ) {
- throw new AnnotationException( "Unknown TemporalType: " + temporal + ". " + SCHEMA_VALIDATION );
- }
- annotationList.add( AnnotationFactory.create( ad ) );
- }
- }
-
- private AssociationOverrides getAssociationOverrides(Element tree, XMLContext.Default defaults) {
- List<AssociationOverride> attributes = (List<AssociationOverride>) buildAssociationOverrides( tree );
- if ( defaults.canUseJavaAnnotations() ) {
- AssociationOverride annotation = getJavaAnnotation( AssociationOverride.class );
- addAssociationOverrideIfNeeded( annotation, attributes );
- AssociationOverrides annotations = getJavaAnnotation( AssociationOverrides.class );
- if ( annotations != null ) {
- for ( AssociationOverride current : annotations.value() ) {
- addAssociationOverrideIfNeeded( current, attributes );
- }
- }
- }
- if ( attributes.size() > 0 ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( AssociationOverrides.class );
- ad.setValue( "value", attributes.toArray( new AssociationOverride[ attributes.size() ] ) );
- return AnnotationFactory.create( ad );
- }
- else {
- return null;
- }
- }
-
- private List<AssociationOverride> buildAssociationOverrides(Element element) {
- List<Element> subelements = element == null ? null : element.elements( "association-override" );
- List<AssociationOverride> overrides = new ArrayList<AssociationOverride>();
- if ( subelements != null && subelements.size() > 0 ) {
- for ( Element current : subelements ) {
- AnnotationDescriptor override = new AnnotationDescriptor( AssociationOverride.class );
- copyStringAttribute( override, current, "name", true );
- override.setValue( "joinColumns", getJoinColumns( current, false ) );
- overrides.add( (AssociationOverride) AnnotationFactory.create( override ) );
- }
- }
- return overrides;
- }
-
- private JoinColumn[] getJoinColumns(Element element, boolean isInverse) {
- List<Element> subelements = element != null ?
- element.elements( isInverse ? "inverse-join-column" : "join-column" ) :
- null;
- List<JoinColumn> joinColumns = new ArrayList<JoinColumn>();
- if ( subelements != null ) {
- for ( Element subelement : subelements ) {
- AnnotationDescriptor column = new AnnotationDescriptor( JoinColumn.class );
- copyStringAttribute( column, subelement, "name", false );
- copyStringAttribute( column, subelement, "referenced-column-name", false );
- copyBooleanAttribute( column, subelement, "unique" );
- copyBooleanAttribute( column, subelement, "nullable" );
- copyBooleanAttribute( column, subelement, "insertable" );
- copyBooleanAttribute( column, subelement, "updatable" );
- copyStringAttribute( column, subelement, "column-definition", false );
- copyStringAttribute( column, subelement, "table", false );
- joinColumns.add( (JoinColumn) AnnotationFactory.create( column ) );
- }
- }
- return joinColumns.toArray( new JoinColumn[ joinColumns.size() ] );
- }
-
- private void addAssociationOverrideIfNeeded(AssociationOverride annotation, List<AssociationOverride> overrides) {
- if ( annotation != null ) {
- String overrideName = annotation.name();
- boolean present = false;
- for ( AssociationOverride current : overrides ) {
- if ( current.name().equals( overrideName ) ) {
- present = true;
- break;
- }
- }
- if ( !present ) overrides.add( annotation );
- }
- }
-
- private AttributeOverrides getAttributeOverrides(Element tree, XMLContext.Default defaults) {
- List<AttributeOverride> attributes = buildAttributeOverrides( tree );
- return mergeAttributeOverrides( defaults, attributes );
- }
-
- private AttributeOverrides getAttributeOverrides(List<Element> elements, XMLContext.Default defaults) {
- List<AttributeOverride> attributes = new ArrayList<AttributeOverride>();
- for (Element element : elements) {
- attributes.addAll( buildAttributeOverrides( element ) );
- }
- return mergeAttributeOverrides( defaults, attributes );
- }
-
- private AttributeOverrides mergeAttributeOverrides(XMLContext.Default defaults,
- List<AttributeOverride> attributes) {
- if ( defaults.canUseJavaAnnotations() ) {
- AttributeOverride annotation = getJavaAnnotation( AttributeOverride.class );
- addAttributeOverrideIfNeeded( annotation, attributes );
- AttributeOverrides annotations = getJavaAnnotation( AttributeOverrides.class );
- if ( annotations != null ) {
- for ( AttributeOverride current : annotations.value() ) {
- addAttributeOverrideIfNeeded( current, attributes );
- }
- }
- }
- if ( attributes.size() > 0 ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( AttributeOverrides.class );
- ad.setValue( "value", attributes.toArray( new AttributeOverride[ attributes.size() ] ) );
- return AnnotationFactory.create( ad );
- }
- else {
- return null;
- }
- }
-
- private List<AttributeOverride> buildAttributeOverrides(Element element) {
- List<Element> subelements = element == null ? null : element.elements( "attribute-override" );
- return buildAttributeOverrides( subelements );
- }
-
- private List<AttributeOverride> buildAttributeOverrides(List<Element> subelements) {
- List<AttributeOverride> overrides = new ArrayList<AttributeOverride>();
- if ( subelements != null && subelements.size() > 0 ) {
- for ( Element current : subelements ) {
- if ( ! current.getName().equals( "attribute-override" ) ) continue;
- AnnotationDescriptor override = new AnnotationDescriptor( AttributeOverride.class );
- copyStringAttribute( override, current, "name", true );
- Element column = current != null ? current.element( "column" ) : null;
- override.setValue( "column", getColumn( column, true, current ) );
- overrides.add( (AttributeOverride) AnnotationFactory.create( override ) );
- }
- }
- return overrides;
- }
-
- private Column getColumn(Element element, boolean isMandatory, Element current) {
- //Element subelement = element != null ? element.element( "column" ) : null;
- if ( element != null ) {
- AnnotationDescriptor column = new AnnotationDescriptor( Column.class );
- copyStringAttribute( column, element, "name", false );
- copyBooleanAttribute( column, element, "unique" );
- copyBooleanAttribute( column, element, "nullable" );
- copyBooleanAttribute( column, element, "insertable" );
- copyBooleanAttribute( column, element, "updatable" );
- copyStringAttribute( column, element, "column-definition", false );
- copyStringAttribute( column, element, "table", false );
- copyIntegerAttribute( column, element, "length" );
- copyIntegerAttribute( column, element, "precision" );
- copyIntegerAttribute( column, element, "scale" );
- return (Column) AnnotationFactory.create( column );
- }
- else {
- if ( isMandatory ) {
- throw new AnnotationException( current.getPath() + ".column is mandatory. " + SCHEMA_VALIDATION );
- }
- return null;
- }
- }
-
- private void addAttributeOverrideIfNeeded(AttributeOverride annotation, List<AttributeOverride> overrides) {
- if ( annotation != null ) {
- String overrideName = annotation.name();
- boolean present = false;
- for ( AttributeOverride current : overrides ) {
- if ( current.name().equals( overrideName ) ) {
- present = true;
- break;
- }
- }
- if ( !present ) overrides.add( annotation );
- }
- }
-
- private AccessType getAccessType(Element tree, XMLContext.Default defaults) {
- String access = tree == null ? null : tree.attributeValue( "access" );
- if ( "FIELD".equals( access ) || "PROPERTY".equals( access ) ) {
- access = access.toLowerCase();
- }
- if ( access != null ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( AccessType.class );
- ad.setValue( "value", access );
- return AnnotationFactory.create( ad );
- }
- else if ( defaults.canUseJavaAnnotations() && isJavaAnnotationPresent( AccessType.class ) ) {
- AccessType annotation = getJavaAnnotation( AccessType.class );
- return annotation;
- }
- else if ( defaults.getAccess() != null ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( AccessType.class );
- ad.setValue( "value", defaults.getAccess() );
- return AnnotationFactory.create( ad );
- }
- else {
- return null;
- }
- }
-
- private ExcludeSuperclassListeners getExcludeSuperclassListeners(Element tree, XMLContext.Default defaults) {
- return (ExcludeSuperclassListeners) getMarkerAnnotation( ExcludeSuperclassListeners.class, tree, defaults );
- }
-
- private ExcludeDefaultListeners getExcludeDefaultListeners(Element tree, XMLContext.Default defaults) {
- return (ExcludeDefaultListeners) getMarkerAnnotation( ExcludeDefaultListeners.class, tree, defaults );
- }
-
- private Annotation getMarkerAnnotation(
- Class<? extends Annotation> clazz, Element element, XMLContext.Default defaults
- ) {
- Element subelement = element == null ? null : element.element( annotationToXml.get( clazz ) );
- if ( subelement != null ) {
- return AnnotationFactory.create( new AnnotationDescriptor( clazz ) );
- }
- else if ( defaults.canUseJavaAnnotations() ) {
- //TODO wonder whether it should be excluded so that user can undone it
- return getJavaAnnotation( clazz );
- }
- else {
- return null;
- }
- }
-
- private SqlResultSetMappings getSqlResultSetMappings(Element tree, XMLContext.Default defaults) {
- List<SqlResultSetMapping> results = (List<SqlResultSetMapping>) buildSqlResultsetMappings( tree, defaults );
- if ( defaults.canUseJavaAnnotations() ) {
- SqlResultSetMapping annotation = getJavaAnnotation( SqlResultSetMapping.class );
- addSqlResultsetMappingIfNeeded( annotation, results );
- SqlResultSetMappings annotations = getJavaAnnotation( SqlResultSetMappings.class );
- if ( annotations != null ) {
- for ( SqlResultSetMapping current : annotations.value() ) {
- addSqlResultsetMappingIfNeeded( current, results );
- }
- }
- }
- if ( results.size() > 0 ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( SqlResultSetMappings.class );
- ad.setValue( "value", results.toArray( new SqlResultSetMapping[ results.size() ] ) );
- return AnnotationFactory.create( ad );
- }
- else {
- return null;
- }
- }
-
- public static List<SqlResultSetMapping> buildSqlResultsetMappings(Element element, XMLContext.Default defaults) {
- if ( element == null ) return new ArrayList<SqlResultSetMapping>();
- List resultsetElementList = element.elements( "sql-result-set-mapping" );
- List<SqlResultSetMapping> resultsets = new ArrayList<SqlResultSetMapping>();
- Iterator it = resultsetElementList.listIterator();
- while ( it.hasNext() ) {
- Element subelement = (Element) it.next();
- AnnotationDescriptor ann = new AnnotationDescriptor( SqlResultSetMapping.class );
- copyStringAttribute( ann, subelement, "name", true );
- List<Element> elements = subelement.elements( "entity-result" );
- List<EntityResult> entityResults = new ArrayList<EntityResult>( elements.size() );
- for ( Element entityResult : elements ) {
- AnnotationDescriptor entityResultDescriptor = new AnnotationDescriptor( EntityResult.class );
- String clazzName = entityResult.attributeValue( "entity-class" );
- if ( clazzName == null ) {
- throw new AnnotationException( "<entity-result> without entity-class. " + SCHEMA_VALIDATION );
- }
- Class clazz = null;
- try {
- clazz = ReflectHelper.classForName(
- XMLContext.buildSafeClassName( clazzName, defaults ),
- EJB3OverridenAnnotationReader.class
- );
- }
- catch (ClassNotFoundException e) {
- throw new AnnotationException( "Unable to find entity-class: " + clazzName, e );
- }
- entityResultDescriptor.setValue( "entityClass", clazz );
- copyStringAttribute( entityResultDescriptor, entityResult, "discriminator-column", false );
- List<FieldResult> fieldResults = new ArrayList<FieldResult>();
- for ( Element fieldResult : (List<Element>) entityResult.elements( "field-result" ) ) {
- AnnotationDescriptor fieldResultDescriptor = new AnnotationDescriptor( FieldResult.class );
- copyStringAttribute( fieldResultDescriptor, fieldResult, "name", true );
- copyStringAttribute( fieldResultDescriptor, fieldResult, "column", true );
- fieldResults.add( (FieldResult) AnnotationFactory.create( fieldResultDescriptor ) );
- }
- entityResultDescriptor.setValue(
- "fields", fieldResults.toArray( new FieldResult[ fieldResults.size() ] )
- );
- entityResults.add( (EntityResult) AnnotationFactory.create( entityResultDescriptor ) );
- }
- ann.setValue( "entities", entityResults.toArray( new EntityResult[ entityResults.size() ] ) );
-
- elements = subelement.elements( "column-result" );
- List<ColumnResult> columnResults = new ArrayList<ColumnResult>( elements.size() );
- for ( Element columnResult : elements ) {
- AnnotationDescriptor columnResultDescriptor = new AnnotationDescriptor( ColumnResult.class );
- copyStringAttribute( columnResultDescriptor, columnResult, "name", true );
- columnResults.add( (ColumnResult) AnnotationFactory.create( columnResultDescriptor ) );
- }
- ann.setValue( "columns", columnResults.toArray( new ColumnResult[ columnResults.size() ] ) );
- //FIXME there is never such a result-class, get rid of it?
- String clazzName = subelement.attributeValue( "result-class" );
- if ( StringHelper.isNotEmpty( clazzName ) ) {
- Class clazz = null;
- try {
- clazz = ReflectHelper.classForName(
- XMLContext.buildSafeClassName( clazzName, defaults ),
- EJB3OverridenAnnotationReader.class
- );
- }
- catch (ClassNotFoundException e) {
- throw new AnnotationException( "Unable to find entity-class: " + clazzName, e );
- }
- ann.setValue( "resultClass", clazz );
- }
- copyStringAttribute( ann, subelement, "result-set-mapping", false );
- resultsets.add( (SqlResultSetMapping) AnnotationFactory.create( ann ) );
- }
- return resultsets;
- }
-
- private void addSqlResultsetMappingIfNeeded(SqlResultSetMapping annotation, List<SqlResultSetMapping> resultsets) {
- if ( annotation != null ) {
- String resultsetName = annotation.name();
- boolean present = false;
- for ( SqlResultSetMapping current : resultsets ) {
- if ( current.name().equals( resultsetName ) ) {
- present = true;
- break;
- }
- }
- if ( !present ) resultsets.add( annotation );
- }
- }
-
- private NamedQueries getNamedQueries(Element tree, XMLContext.Default defaults) {
- //TODO avoid the Proxy Creation (@NamedQueries) when possible
- List<NamedQuery> queries = (List<NamedQuery>) buildNamedQueries( tree, false, defaults );
- if ( defaults.canUseJavaAnnotations() ) {
- NamedQuery annotation = getJavaAnnotation( NamedQuery.class );
- addNamedQueryIfNeeded( annotation, queries );
- NamedQueries annotations = getJavaAnnotation( NamedQueries.class );
- if ( annotations != null ) {
- for ( NamedQuery current : annotations.value() ) {
- addNamedQueryIfNeeded( current, queries );
- }
- }
- }
- if ( queries.size() > 0 ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( NamedQueries.class );
- ad.setValue( "value", queries.toArray( new NamedQuery[ queries.size() ] ) );
- return AnnotationFactory.create( ad );
- }
- else {
- return null;
- }
- }
-
- private void addNamedQueryIfNeeded(NamedQuery annotation, List<NamedQuery> queries) {
- if ( annotation != null ) {
- String queryName = annotation.name();
- boolean present = false;
- for ( NamedQuery current : queries ) {
- if ( current.name().equals( queryName ) ) {
- present = true;
- break;
- }
- }
- if ( !present ) queries.add( annotation );
- }
- }
-
- private NamedNativeQueries getNamedNativeQueries(Element tree, XMLContext.Default defaults) {
- List<NamedNativeQuery> queries = (List<NamedNativeQuery>) buildNamedQueries( tree, true, defaults );
- if ( defaults.canUseJavaAnnotations() ) {
- NamedNativeQuery annotation = getJavaAnnotation( NamedNativeQuery.class );
- addNamedNativeQueryIfNeeded( annotation, queries );
- NamedNativeQueries annotations = getJavaAnnotation( NamedNativeQueries.class );
- if ( annotations != null ) {
- for ( NamedNativeQuery current : annotations.value() ) {
- addNamedNativeQueryIfNeeded( current, queries );
- }
- }
- }
- if ( queries.size() > 0 ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( NamedNativeQueries.class );
- ad.setValue( "value", queries.toArray( new NamedNativeQuery[ queries.size() ] ) );
- return AnnotationFactory.create( ad );
- }
- else {
- return null;
- }
- }
-
- private void addNamedNativeQueryIfNeeded(NamedNativeQuery annotation, List<NamedNativeQuery> queries) {
- if ( annotation != null ) {
- String queryName = annotation.name();
- boolean present = false;
- for ( NamedNativeQuery current : queries ) {
- if ( current.name().equals( queryName ) ) {
- present = true;
- break;
- }
- }
- if ( !present ) queries.add( annotation );
- }
- }
-
- public static List buildNamedQueries(Element element, boolean isNative, XMLContext.Default defaults) {
- if ( element == null ) return new ArrayList();
- List namedQueryElementList = isNative ?
- element.elements( "named-native-query" ) :
- element.elements( "named-query" );
- List namedQueries = new ArrayList();
- Iterator it = namedQueryElementList.listIterator();
- while ( it.hasNext() ) {
- Element subelement = (Element) it.next();
- AnnotationDescriptor ann = new AnnotationDescriptor(
- isNative ? NamedNativeQuery.class : NamedQuery.class
- );
- copyStringAttribute( ann, subelement, "name", false );
- Element queryElt = subelement.element( "query" );
- if ( queryElt == null ) throw new AnnotationException( "No <query> element found." + SCHEMA_VALIDATION );
- ann.setValue( "query", queryElt.getTextTrim() );
- List<Element> elements = subelement.elements( "hint" );
- List<QueryHint> queryHints = new ArrayList<QueryHint>( elements.size() );
- for ( Element hint : elements ) {
- AnnotationDescriptor hintDescriptor = new AnnotationDescriptor( QueryHint.class );
- String value = hint.attributeValue( "name" );
- if ( value == null ) throw new AnnotationException( "<hint> without name. " + SCHEMA_VALIDATION );
- hintDescriptor.setValue( "name", value );
- value = hint.attributeValue( "value" );
- if ( value == null ) throw new AnnotationException( "<hint> without value. " + SCHEMA_VALIDATION );
- hintDescriptor.setValue( "value", value );
- queryHints.add( (QueryHint) AnnotationFactory.create( hintDescriptor ) );
- }
- ann.setValue( "hints", queryHints.toArray( new QueryHint[ queryHints.size() ] ) );
- String clazzName = subelement.attributeValue( "result-class" );
- if ( StringHelper.isNotEmpty( clazzName ) ) {
- Class clazz = null;
- try {
- clazz = ReflectHelper.classForName(
- XMLContext.buildSafeClassName( clazzName, defaults ),
- EJB3OverridenAnnotationReader.class
- );
- }
- catch (ClassNotFoundException e) {
- throw new AnnotationException( "Unable to find entity-class: " + clazzName, e );
- }
- ann.setValue( "resultClass", clazz );
- }
- copyStringAttribute( ann, subelement, "result-set-mapping", false );
- namedQueries.add( AnnotationFactory.create( ann ) );
- }
- return namedQueries;
- }
-
- private TableGenerator getTableGenerator(Element tree, XMLContext.Default defaults) {
- Element element = tree != null ? tree.element( annotationToXml.get( TableGenerator.class ) ) : null;
- if ( element != null ) {
- return buildTableGeneratorAnnotation( element, defaults );
- }
- else if ( defaults.canUseJavaAnnotations() && isJavaAnnotationPresent( TableGenerator.class ) ) {
- TableGenerator tableAnn = getJavaAnnotation( TableGenerator.class );
- if ( StringHelper.isNotEmpty( defaults.getSchema() )
- || StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
- AnnotationDescriptor annotation = new AnnotationDescriptor( TableGenerator.class );
- annotation.setValue( "name", tableAnn.name() );
- annotation.setValue( "table", tableAnn.table() );
- annotation.setValue( "catalog", tableAnn.table() );
- if ( StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) )
- && StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
- annotation.setValue( "catalog", defaults.getCatalog() );
- }
- annotation.setValue( "schema", tableAnn.table() );
- if ( StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) )
- && StringHelper.isNotEmpty( defaults.getSchema() ) ) {
- annotation.setValue( "catalog", defaults.getSchema() );
- }
- annotation.setValue( "pkColumnName", tableAnn.pkColumnName() );
- annotation.setValue( "valueColumnName", tableAnn.valueColumnName() );
- annotation.setValue( "pkColumnValue", tableAnn.pkColumnValue() );
- annotation.setValue( "initialValue", tableAnn.initialValue() );
- annotation.setValue( "allocationSize", tableAnn.allocationSize() );
- annotation.setValue( "uniqueConstraints", tableAnn.uniqueConstraints() );
- return AnnotationFactory.create( annotation );
- }
- else {
- return tableAnn;
- }
- }
- else {
- return null;
- }
- }
-
- public static TableGenerator buildTableGeneratorAnnotation(Element element, XMLContext.Default defaults) {
- AnnotationDescriptor ad = new AnnotationDescriptor( TableGenerator.class );
- copyStringAttribute( ad, element, "name", false );
- copyStringAttribute( ad, element, "table", false );
- copyStringAttribute( ad, element, "catalog", false );
- copyStringAttribute( ad, element, "schema", false );
- copyStringAttribute( ad, element, "pk-column-name", false );
- copyStringAttribute( ad, element, "value-column-name", false );
- copyStringAttribute( ad, element, "pk-column-value", false );
- copyIntegerAttribute( ad, element, "initial-value" );
- copyIntegerAttribute( ad, element, "allocation-size" );
- buildUniqueConstraints( ad, element );
- if ( StringHelper.isEmpty( (String) ad.valueOf( "schema" ) )
- && StringHelper.isNotEmpty( defaults.getSchema() ) ) {
- ad.setValue( "schema", defaults.getSchema() );
- }
- if ( StringHelper.isEmpty( (String) ad.valueOf( "catalog" ) )
- && StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
- ad.setValue( "catalog", defaults.getCatalog() );
- }
- return AnnotationFactory.create( ad );
- }
-
- private SequenceGenerator getSequenceGenerator(Element tree, XMLContext.Default defaults) {
- Element element = tree != null ? tree.element( annotationToXml.get( SequenceGenerator.class ) ) : null;
- if ( element != null ) {
- return buildSequenceGeneratorAnnotation( element );
- }
- else if ( defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( SequenceGenerator.class );
- }
- else {
- return null;
- }
- }
-
- public static SequenceGenerator buildSequenceGeneratorAnnotation(Element element) {
- if (element != null) {
- AnnotationDescriptor ad = new AnnotationDescriptor( SequenceGenerator.class );
- copyStringAttribute( ad, element, "name", false );
- copyStringAttribute( ad, element, "sequence-name", false );
- copyIntegerAttribute( ad, element, "initial-value" );
- copyIntegerAttribute( ad, element, "allocation-size" );
- return AnnotationFactory.create( ad );
- }
- else {
- return null;
- }
- }
-
- private DiscriminatorColumn getDiscriminatorColumn(Element tree, XMLContext.Default defaults) {
- Element element = tree != null ? tree.element( "discriminator-column" ) : null;
- if ( element != null ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( DiscriminatorColumn.class );
- copyStringAttribute( ad, element, "name", false );
- copyStringAttribute( ad, element, "column-definition", false );
- String value = element.attributeValue( "discriminator-type" );
- DiscriminatorType type = DiscriminatorType.STRING;
- if ( value != null ) {
- if ( "STRING".equals( value ) ) {
- type = DiscriminatorType.STRING;
- }
- else if ( "CHAR".equals( value ) ) {
- type = DiscriminatorType.CHAR;
- }
- else if ( "INTEGER".equals( value ) ) {
- type = DiscriminatorType.INTEGER;
- }
- else {
- throw new AnnotationException(
- "Unknown DiscrimiatorType in XML: " + value + " (" + SCHEMA_VALIDATION + ")"
- );
- }
- }
- ad.setValue( "discriminatorType", type );
- copyIntegerAttribute( ad, element, "length" );
- return AnnotationFactory.create( ad );
- }
- else if ( defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( DiscriminatorColumn.class );
- }
- else {
- return null;
- }
- }
-
- private DiscriminatorValue getDiscriminatorValue(Element tree, XMLContext.Default defaults) {
- Element element = tree != null ? tree.element( "discriminator-value" ) : null;
- if ( element != null ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( DiscriminatorValue.class );
- copyStringElement( element, ad, "value" );
- return AnnotationFactory.create( ad );
- }
- else if ( defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( DiscriminatorValue.class );
- }
- else {
- return null;
- }
- }
-
- private Inheritance getInheritance(Element tree, XMLContext.Default defaults) {
- Element element = tree != null ? tree.element( "inheritance" ) : null;
- if ( element != null ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( Inheritance.class );
- Attribute attr = element.attribute( "strategy" );
- InheritanceType strategy = InheritanceType.SINGLE_TABLE;
- if ( attr != null ) {
- String value = attr.getValue();
- if ( "SINGLE_TABLE".equals( value ) ) {
- strategy = InheritanceType.SINGLE_TABLE;
- }
- else if ( "JOINED".equals( value ) ) {
- strategy = InheritanceType.JOINED;
- }
- else if ( "TABLE_PER_CLASS".equals( value ) ) {
- strategy = InheritanceType.TABLE_PER_CLASS;
- }
- else {
- throw new AnnotationException(
- "Unknown InheritanceType in XML: " + value + " (" + SCHEMA_VALIDATION + ")"
- );
- }
- }
- ad.setValue( "strategy", strategy );
- return AnnotationFactory.create( ad );
- }
- else if ( defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( Inheritance.class );
- }
- else {
- return null;
- }
- }
-
- private IdClass getIdClass(Element tree, XMLContext.Default defaults) {
- Element element = tree == null ? null : tree.element( "id-class" );
- if ( element != null ) {
- Attribute attr = element.attribute( "class" );
- if ( attr != null ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( IdClass.class );
- Class clazz = null;
- try {
- clazz = ReflectHelper.classForName(
- XMLContext.buildSafeClassName( attr.getValue(), defaults ),
- this.getClass()
- );
- }
- catch (ClassNotFoundException e) {
- throw new AnnotationException( "Unable to find id-class: " + attr.getValue(), e );
- }
- ad.setValue( "value", clazz );
- return AnnotationFactory.create( ad );
- }
- else {
- throw new AnnotationException( "id-class without class. " + SCHEMA_VALIDATION );
- }
- }
- else if ( defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( IdClass.class );
- }
- else {
- return null;
- }
- }
-
- private PrimaryKeyJoinColumns getPrimaryKeyJoinColumns(Element element, XMLContext.Default defaults) {
- PrimaryKeyJoinColumn[] columns = buildPrimaryKeyJoinColumns( element );
- if ( columns.length == 0 && defaults.canUseJavaAnnotations() ) {
- PrimaryKeyJoinColumn annotation = getJavaAnnotation( PrimaryKeyJoinColumn.class );
- if ( annotation != null ) {
- columns = new PrimaryKeyJoinColumn[]{annotation};
- }
- else {
- PrimaryKeyJoinColumns annotations = getJavaAnnotation( PrimaryKeyJoinColumns.class );
- columns = annotations != null ? annotations.value() : columns;
- }
- }
- if ( columns.length > 0 ) {
- AnnotationDescriptor ad = new AnnotationDescriptor( PrimaryKeyJoinColumns.class );
- ad.setValue( "value", columns );
- return AnnotationFactory.create( ad );
- }
- else {
- return null;
- }
- }
-
- private Entity getEntity(Element tree, XMLContext.Default defaults) {
- if ( tree == null ) {
- return defaults.canUseJavaAnnotations() ? getJavaAnnotation( Entity.class ) : null;
- }
- else {
- if ( "entity".equals( tree.getName() ) ) {
- AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class );
- copyStringAttribute( entity, tree, "name", false );
- if ( defaults.canUseJavaAnnotations()
- && StringHelper.isEmpty( (String) entity.valueOf( "name" ) ) ) {
- Entity javaAnn = getJavaAnnotation( Entity.class );
- if ( javaAnn != null ) entity.setValue( "name", javaAnn.name() );
- }
- return AnnotationFactory.create( entity );
- }
- else {
- return null; //this is not an entity
- }
- }
- }
-
- private MappedSuperclass getMappedSuperclass(Element tree, XMLContext.Default defaults) {
- if ( tree == null ) {
- return defaults.canUseJavaAnnotations() ? getJavaAnnotation( MappedSuperclass.class ) : null;
- }
- else {
- if ( "mapped-superclass".equals( tree.getName() ) ) {
- AnnotationDescriptor entity = new AnnotationDescriptor( MappedSuperclass.class );
- return AnnotationFactory.create( entity );
- }
- else {
- return null; //this is not an entity
- }
- }
- }
-
- private Embeddable getEmbeddable(Element tree, XMLContext.Default defaults) {
- if ( tree == null ) {
- return defaults.canUseJavaAnnotations() ? getJavaAnnotation( Embeddable.class ) : null;
- }
- else {
- if ( "embeddable".equals( tree.getName() ) ) {
- AnnotationDescriptor entity = new AnnotationDescriptor( Embeddable.class );
- return AnnotationFactory.create( entity );
- }
- else {
- return null; //this is not an entity
- }
- }
- }
-
- private Table getTable(Element tree, XMLContext.Default defaults) {
- Element subelement = tree == null ? null : tree.element( "table" );
- if ( subelement == null ) {
- //no element but might have some default or some annotation
- if ( StringHelper.isNotEmpty( defaults.getCatalog() )
- || StringHelper.isNotEmpty( defaults.getSchema() ) ) {
- AnnotationDescriptor annotation = new AnnotationDescriptor( Table.class );
- if ( defaults.canUseJavaAnnotations() ) {
- Table table = getJavaAnnotation( Table.class );
- if ( table != null ) {
- annotation.setValue( "name", table.name() );
- annotation.setValue( "schema", table.schema() );
- annotation.setValue( "catalog", table.catalog() );
- annotation.setValue( "uniqueConstraints", table.uniqueConstraints() );
- }
- }
- if ( StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) )
- && StringHelper.isNotEmpty( defaults.getSchema() ) ) {
- annotation.setValue( "schema", defaults.getSchema() );
- }
- if ( StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) )
- && StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
- annotation.setValue( "catalog", defaults.getCatalog() );
- }
- return AnnotationFactory.create( annotation );
- }
- else if ( defaults.canUseJavaAnnotations() ) {
- return getJavaAnnotation( Table.class );
- }
- else {
- return null;
- }
- }
- else {
- //ignore java annotation, an element is defined
- AnnotationDescriptor annotation = new AnnotationDescriptor( Table.class );
- copyStringAttribute( annotation, subelement, "name", false );
- copyStringAttribute( annotation, subelement, "catalog", false );
- if ( StringHelper.isNotEmpty( defaults.getCatalog() )
- && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) {
- annotation.setValue( "catalog", defaults.getCatalog() );
- }
- copyStringAttribute( annotation, subelement, "schema", false );
- if ( StringHelper.isNotEmpty( defaults.getSchema() )
- && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) {
- annotation.setValue( "schema", defaults.getSchema() );
- }
- buildUniqueConstraints( annotation, subelement );
- return AnnotationFactory.create( annotation );
- }
- }
-
- private SecondaryTables getSecondaryTables(Element tree, XMLContext.Default defaults) {
- List<Element> elements = tree == null ?
- new ArrayList<Element>() :
- (List<Element>) tree.elements( "secondary-table" );
- List<SecondaryTable> secondaryTables = new ArrayList<SecondaryTable>( 3 );
- for ( Element element : elements ) {
- AnnotationDescriptor annotation = new AnnotationDescriptor( SecondaryTable.class );
- copyStringAttribute( annotation, element, "name", false );
- copyStringAttribute( annotation, element, "catalog", false );
- if ( StringHelper.isNotEmpty( defaults.getCatalog() )
- && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) {
- annotation.setValue( "catalog", defaults.getCatalog() );
- }
- copyStringAttribute( annotation, element, "schema", false );
- if ( StringHelper.isNotEmpty( defaults.getSchema() )
- && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) {
- annotation.setValue( "schema", defaults.getSchema() );
- }
- buildUniqueConstraints( annotation, element );
- annotation.setValue( "pkJoinColumns", buildPrimaryKeyJoinColumns( element ) );
- secondaryTables.add( (SecondaryTable) AnnotationFactory.create( annotation ) );
- }
- /*
- * You can't have both secondary table in XML and Java,
- * since there would be no way to "remove" a secondary table
- */
- if ( secondaryTables.size() == 0 && defaults.canUseJavaAnnotations() ) {
- SecondaryTable secTableAnn = getJavaAnnotation( SecondaryTable.class );
- overridesDefaultInSecondaryTable( secTableAnn, defaults, secondaryTables );
- SecondaryTables secTablesAnn = getJavaAnnotation( SecondaryTables.class );
- if ( secTablesAnn != null ) {
- for ( SecondaryTable table : secTablesAnn.value() ) {
- overridesDefaultInSecondaryTable( table, defaults, secondaryTables );
- }
- }
- }
- if ( secondaryTables.size() > 0 ) {
- AnnotationDescriptor descriptor = new AnnotationDescriptor( SecondaryTables.class );
- descriptor.setValue( "value", secondaryTables.toArray( new SecondaryTable[secondaryTables.size()] ) );
- return AnnotationFactory.create( descriptor );
- }
- else {
- return null;
- }
- }
-
- private void overridesDefaultInSecondaryTable(
- SecondaryTable secTableAnn, XMLContext.Default defaults, List<SecondaryTable> secondaryTables
- ) {
- if ( secTableAnn != null ) {
- //handle default values
- if ( StringHelper.isNotEmpty( defaults.getCatalog() )
- || StringHelper.isNotEmpty( defaults.getSchema() ) ) {
- AnnotationDescriptor annotation = new AnnotationDescriptor( SecondaryTable.class );
- annotation.setValue( "name", secTableAnn.name() );
- annotation.setValue( "schema", secTableAnn.schema() );
- annotation.setValue( "catalog", secTableAnn.catalog() );
- annotation.setValue( "uniqueConstraints", secTableAnn.uniqueConstraints() );
- annotation.setValue( "pkJoinColumns", secTableAnn.pkJoinColumns() );
- if ( StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) )
- && StringHelper.isNotEmpty( defaults.getSchema() ) ) {
- annotation.setValue( "schema", defaults.getSchema() );
- }
- if ( StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) )
- && StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
- annotation.setValue( "catalog", defaults.getCatalog() );
- }
- secondaryTables.add( (SecondaryTable) AnnotationFactory.create( annotation ) );
- }
- else {
- secondaryTables.add( secTableAnn );
- }
- }
- }
-
- private static void buildUniqueConstraints(AnnotationDescriptor annotation, Element element) {
- List uniqueConstraintElementList = element.elements( "unique-constraint" );
- UniqueConstraint[] uniqueConstraints = new UniqueConstraint[ uniqueConstraintElementList.size() ];
- int ucIndex = 0;
- Iterator ucIt = uniqueConstraintElementList.listIterator();
- while ( ucIt.hasNext() ) {
- Element subelement = (Element) ucIt.next();
- List<Element> columnNamesElements = subelement.elements( "column-name" );
- String[] columnNames = new String[columnNamesElements.size()];
- int columnNameIndex = 0;
- Iterator it = columnNamesElements.listIterator();
- while ( it.hasNext() ) {
- Element columnNameElt = (Element) it.next();
- columnNames[columnNameIndex++] = columnNameElt.getTextTrim();
- }
- AnnotationDescriptor ucAnn = new AnnotationDescriptor( UniqueConstraint.class );
- ucAnn.setValue( "columnNames", columnNames );
- uniqueConstraints[ucIndex++] = AnnotationFactory.create( ucAnn );
- }
- annotation.setValue( "uniqueConstraints", uniqueConstraints );
- }
-
- private PrimaryKeyJoinColumn[] buildPrimaryKeyJoinColumns(Element element) {
- if ( element == null ) return new PrimaryKeyJoinColumn[]{};
- List pkJoinColumnElementList = element.elements( "primary-key-join-column" );
- PrimaryKeyJoinColumn[] pkJoinColumns = new PrimaryKeyJoinColumn[ pkJoinColumnElementList.size() ];
- int index = 0;
- Iterator pkIt = pkJoinColumnElementList.listIterator();
- while ( pkIt.hasNext() ) {
- Element subelement = (Element) pkIt.next();
- AnnotationDescriptor pkAnn = new AnnotationDescriptor( PrimaryKeyJoinColumn.class );
- copyStringAttribute( pkAnn, subelement, "name", false );
- copyStringAttribute( pkAnn, subelement, "referenced-column-name", false );
- copyStringAttribute( pkAnn, subelement, "column-definition", false );
- pkJoinColumns[index++] = AnnotationFactory.create( pkAnn );
- }
- return pkJoinColumns;
- }
-
- private static void copyStringAttribute(
- AnnotationDescriptor annotation, Element element, String attributeName, boolean mandatory
- ) {
- String attribute = element.attributeValue( attributeName );
- if ( attribute != null ) {
- String annotationAttributeName = getJavaAttributeNameFromXMLOne( attributeName );
- annotation.setValue( annotationAttributeName, attribute );
- }
- else {
- if ( mandatory ) {
- throw new AnnotationException(
- element.getName() + "." + attributeName + " is mandatory in XML overring. " + SCHEMA_VALIDATION
- );
- }
- }
- }
-
- private static void copyIntegerAttribute(AnnotationDescriptor annotation, Element element, String attributeName) {
- String attribute = element.attributeValue( attributeName );
- if ( attribute != null ) {
- String annotationAttributeName = getJavaAttributeNameFromXMLOne( attributeName );
- annotation.setValue( annotationAttributeName, attribute );
- try {
- int length = Integer.parseInt( attribute );
- annotation.setValue( annotationAttributeName, length );
- }
- catch (NumberFormatException e) {
- throw new AnnotationException(
- element.getPath() + attributeName + " not parseable: " + attribute + " (" + SCHEMA_VALIDATION + ")"
- );
- }
- }
- }
-
- private static String getJavaAttributeNameFromXMLOne(String attributeName) {
- StringBuilder annotationAttributeName = new StringBuilder( attributeName );
- int index = annotationAttributeName.indexOf( WORD_SEPARATOR );
- while ( index != -1 ) {
- annotationAttributeName.deleteCharAt( index );
- annotationAttributeName.setCharAt(
- index, Character.toUpperCase( annotationAttributeName.charAt( index ) )
- );
- index = annotationAttributeName.indexOf( WORD_SEPARATOR );
- }
- return annotationAttributeName.toString();
- }
-
- private static void copyStringElement(Element element, AnnotationDescriptor ad, String annotationAttribute) {
- String discr = element.getTextTrim();
- ad.setValue( annotationAttribute, discr );
- }
-
- private static void copyBooleanAttribute(AnnotationDescriptor descriptor, Element element, String attribute) {
- String attributeValue = element.attributeValue( attribute );
- if ( StringHelper.isNotEmpty( attributeValue ) ) {
- String javaAttribute = getJavaAttributeNameFromXMLOne( attribute );
- descriptor.setValue( javaAttribute, Boolean.parseBoolean( attributeValue ) );
- }
- }
-
- private <T extends Annotation> T getJavaAnnotation(Class<T> annotationType) {
- return element.getAnnotation( annotationType );
- }
-
- private <T extends Annotation> boolean isJavaAnnotationPresent(Class<T> annotationType) {
- return element.isAnnotationPresent( annotationType );
- }
-
- private Annotation[] getJavaAnnotations() {
- return element.getAnnotations();
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3OverridenAnnotationReader.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3OverridenAnnotationReader.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3OverridenAnnotationReader.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3OverridenAnnotationReader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,2080 @@
+package org.hibernate.cfg.annotations.reflection;
+
+import java.beans.Introspector;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.HashSet;
+
+import javax.persistence.AssociationOverride;
+import javax.persistence.AssociationOverrides;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.ColumnResult;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.EntityResult;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.ExcludeDefaultListeners;
+import javax.persistence.ExcludeSuperclassListeners;
+import javax.persistence.FetchType;
+import javax.persistence.FieldResult;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.JoinTable;
+import javax.persistence.Lob;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+import javax.persistence.MapKey;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.OrderBy;
+import javax.persistence.PostLoad;
+import javax.persistence.PostPersist;
+import javax.persistence.PostRemove;
+import javax.persistence.PostUpdate;
+import javax.persistence.PrePersist;
+import javax.persistence.PreRemove;
+import javax.persistence.PreUpdate;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.PrimaryKeyJoinColumns;
+import javax.persistence.QueryHint;
+import javax.persistence.SecondaryTable;
+import javax.persistence.SecondaryTables;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.SqlResultSetMapping;
+import javax.persistence.SqlResultSetMappings;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+import javax.persistence.UniqueConstraint;
+import javax.persistence.Version;
+
+import org.dom4j.Attribute;
+import org.dom4j.Element;
+import org.hibernate.AnnotationException;
+import org.hibernate.annotations.common.annotationfactory.AnnotationDescriptor;
+import org.hibernate.annotations.common.annotationfactory.AnnotationFactory;
+import org.hibernate.annotations.AccessType;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.Columns;
+import org.hibernate.annotations.common.reflection.AnnotationReader;
+import org.hibernate.annotations.common.reflection.Filter;
+import org.hibernate.annotations.common.reflection.ReflectionUtil;
+import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.util.StringHelper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Encapsulates the overriding of Java annotations from an EJB 3.0 descriptor.
+ *
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ * @author Emmanuel Bernard
+ */
+public class EJB3OverridenAnnotationReader implements AnnotationReader {
+ private static Log log = LogFactory.getLog( EJB3OverridenAnnotationReader.class );
+ private static final Map<Class, String> annotationToXml;
+ private static final String SCHEMA_VALIDATION = "Activate schema validation for more informations";
+ private static final Filter FILTER = new Filter() {
+ public boolean returnStatic() {
+ return false;
+ }
+
+ public boolean returnTransient() {
+ return false;
+ }
+ };
+
+ static {
+ annotationToXml = new HashMap<Class, String>();
+ annotationToXml.put( Entity.class, "entity" );
+ annotationToXml.put( MappedSuperclass.class, "mapped-superclass" );
+ annotationToXml.put( Embeddable.class, "embeddable" );
+ annotationToXml.put( Table.class, "table" );
+ annotationToXml.put( SecondaryTable.class, "secondary-table" );
+ annotationToXml.put( SecondaryTables.class, "secondary-table" );
+ annotationToXml.put( PrimaryKeyJoinColumn.class, "primary-key-join-column" );
+ annotationToXml.put( PrimaryKeyJoinColumns.class, "primary-key-join-column" );
+ annotationToXml.put( IdClass.class, "id-class" );
+ annotationToXml.put( Inheritance.class, "inheritance" );
+ annotationToXml.put( DiscriminatorValue.class, "discriminator-value" );
+ annotationToXml.put( DiscriminatorColumn.class, "discriminator-column" );
+ annotationToXml.put( SequenceGenerator.class, "sequence-generator" );
+ annotationToXml.put( TableGenerator.class, "table-generator" );
+ annotationToXml.put( NamedQuery.class, "named-query" );
+ annotationToXml.put( NamedQueries.class, "named-query" );
+ annotationToXml.put( NamedNativeQuery.class, "named-native-query" );
+ annotationToXml.put( NamedNativeQueries.class, "named-native-query" );
+ annotationToXml.put( SqlResultSetMapping.class, "sql-result-set-mapping" );
+ annotationToXml.put( SqlResultSetMappings.class, "sql-result-set-mapping" );
+ annotationToXml.put( ExcludeDefaultListeners.class, "exclude-default-listeners" );
+ annotationToXml.put( ExcludeSuperclassListeners.class, "exclude-superclass-listeners" );
+ annotationToXml.put( AccessType.class, "access" );
+ annotationToXml.put( AttributeOverride.class, "attribute-override" );
+ annotationToXml.put( AttributeOverrides.class, "attribute-override" );
+ annotationToXml.put( AttributeOverride.class, "association-override" );
+ annotationToXml.put( AttributeOverrides.class, "association-override" );
+ annotationToXml.put( Id.class, "id" );
+ annotationToXml.put( EmbeddedId.class, "embedded-id" );
+ annotationToXml.put( GeneratedValue.class, "generated-value" );
+ annotationToXml.put( Column.class, "column" );
+ annotationToXml.put( Columns.class, "column" );
+ annotationToXml.put( Temporal.class, "temporal" );
+ annotationToXml.put( Lob.class, "lob" );
+ annotationToXml.put( Enumerated.class, "enumerated" );
+ annotationToXml.put( Version.class, "version" );
+ annotationToXml.put( Transient.class, "transient" );
+ annotationToXml.put( Basic.class, "basic" );
+ annotationToXml.put( Embedded.class, "embedded" );
+ annotationToXml.put( ManyToOne.class, "many-to-one" );
+ annotationToXml.put( OneToOne.class, "one-to-one" );
+ annotationToXml.put( OneToMany.class, "one-to-many" );
+ annotationToXml.put( ManyToMany.class, "many-to-many" );
+ annotationToXml.put( JoinTable.class, "join-table" );
+ annotationToXml.put( JoinColumn.class, "join-column" );
+ annotationToXml.put( JoinColumns.class, "join-column" );
+ annotationToXml.put( MapKey.class, "map-key" );
+ annotationToXml.put( OrderBy.class, "order-by" );
+ annotationToXml.put( EntityListeners.class, "entity-listeners" );
+ annotationToXml.put( PrePersist.class, "pre-persist" );
+ annotationToXml.put( PreRemove.class, "pre-remove" );
+ annotationToXml.put( PreUpdate.class, "pre-update" );
+ annotationToXml.put( PostPersist.class, "post-persist" );
+ annotationToXml.put( PostRemove.class, "post-remove" );
+ annotationToXml.put( PostUpdate.class, "post-update" );
+ annotationToXml.put( PostLoad.class, "post-load" );
+ }
+
+ private XMLContext xmlContext;
+ private String className;
+ private String propertyName;
+ private PropertyType propertyType;
+ private transient Annotation[] annotations;
+ private transient Map<Class, Annotation> annotationsMap;
+ private static final String WORD_SEPARATOR = "-";
+ private transient List<Element> elementsForProperty;
+ private AccessibleObject mirroredAttribute;
+ private final AnnotatedElement element;
+
+ private enum PropertyType {
+ PROPERTY,
+ FIELD,
+ METHOD
+ }
+
+ public EJB3OverridenAnnotationReader(AnnotatedElement el, XMLContext xmlContext) {
+ this.element = el;
+ this.xmlContext = xmlContext;
+ if ( el instanceof Class ) {
+ Class clazz = (Class) el;
+ className = clazz.getName();
+ }
+ else if ( el instanceof Field ) {
+ Field field = (Field) el;
+ className = field.getDeclaringClass().getName();
+ propertyName = field.getName();
+ propertyType = PropertyType.FIELD;
+ String expectedGetter = "get" + Character.toUpperCase( propertyName.charAt( 0 ) ) + propertyName.substring(
+ 1
+ );
+ try {
+ mirroredAttribute = field.getDeclaringClass().getDeclaredMethod( expectedGetter );
+ }
+ catch (NoSuchMethodException e) {
+ //no method
+ }
+ }
+ else if ( el instanceof Method ) {
+ Method method = (Method) el;
+ className = method.getDeclaringClass().getName();
+ propertyName = method.getName();
+ if ( ReflectionUtil.isProperty(
+ method,
+ null, //this is yukky!! we'd rather get the TypeEnvironment()
+ FILTER
+ ) ) {
+ if ( propertyName.startsWith( "get" ) ) {
+ propertyName = Introspector.decapitalize( propertyName.substring( "get".length() ) );
+ }
+ else if ( propertyName.startsWith( "is" ) ) {
+ propertyName = Introspector.decapitalize( propertyName.substring( "is".length() ) );
+ }
+ else {
+ throw new RuntimeException( "Method " + propertyName + " is not a property getter" );
+ }
+ propertyType = PropertyType.PROPERTY;
+ try {
+ mirroredAttribute = method.getDeclaringClass().getDeclaredField( propertyName );
+ }
+ catch (NoSuchFieldException e) {
+ //no method
+ }
+ }
+ else {
+ propertyType = PropertyType.METHOD;
+ }
+ }
+ else {
+ className = null;
+ propertyName = null;
+ }
+ }
+
+ public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
+ initAnnotations();
+ return (T) annotationsMap.get( annotationType );
+ }
+
+ public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) {
+ initAnnotations();
+ return (T) annotationsMap.get( annotationType ) != null;
+ }
+
+ public Annotation[] getAnnotations() {
+ initAnnotations();
+ return annotations;
+ }
+
+ private void initAnnotations() {
+ if ( annotations == null ) {
+ XMLContext.Default defaults = xmlContext.getDefault( className );
+ if ( className != null && propertyName == null ) {
+ //is a class
+ Element tree = xmlContext.getXMLTree( className, null );
+ Annotation[] annotations = getJavaAnnotations();
+ List<Annotation> annotationList = new ArrayList<Annotation>( annotations.length + 5 );
+ annotationsMap = new HashMap<Class, Annotation>( annotations.length + 5 );
+ for ( Annotation annotation : annotations ) {
+ if ( ! annotationToXml.containsKey( annotation.annotationType() ) ) {
+ //unknown annotations are left over
+ annotationList.add( annotation );
+ }
+ }
+ addIfNotNull( annotationList, getEntity( tree, defaults ) );
+ addIfNotNull( annotationList, getMappedSuperclass( tree, defaults ) );
+ addIfNotNull( annotationList, getEmbeddable( tree, defaults ) );
+ addIfNotNull( annotationList, getTable( tree, defaults ) );
+ addIfNotNull( annotationList, getSecondaryTables( tree, defaults ) );
+ addIfNotNull( annotationList, getPrimaryKeyJoinColumns( tree, defaults ) );
+ addIfNotNull( annotationList, getIdClass( tree, defaults ) );
+ addIfNotNull( annotationList, getInheritance( tree, defaults ) );
+ addIfNotNull( annotationList, getDiscriminatorValue( tree, defaults ) );
+ addIfNotNull( annotationList, getDiscriminatorColumn( tree, defaults ) );
+ addIfNotNull( annotationList, getSequenceGenerator( tree, defaults ) );
+ addIfNotNull( annotationList, getTableGenerator( tree, defaults ) );
+ addIfNotNull( annotationList, getNamedQueries( tree, defaults ) );
+ addIfNotNull( annotationList, getNamedNativeQueries( tree, defaults ) );
+ addIfNotNull( annotationList, getSqlResultSetMappings( tree, defaults ) );
+ addIfNotNull( annotationList, getExcludeDefaultListeners( tree, defaults ) );
+ addIfNotNull( annotationList, getExcludeSuperclassListeners( tree, defaults ) );
+ addIfNotNull( annotationList, getAccessType( tree, defaults ) );
+ addIfNotNull( annotationList, getAttributeOverrides( tree, defaults ) );
+ addIfNotNull( annotationList, getAssociationOverrides( tree, defaults ) );
+ addIfNotNull( annotationList, getEntityListeners( tree, defaults ) );
+ //FIXME use annotationsMap rather than annotationList this will be faster since the annotation type is usually known at put() time
+ this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] );
+ for (Annotation ann : this.annotations) {
+ annotationsMap.put( ann.annotationType(), ann );
+ }
+ checkForOrphanProperties(tree);
+ }
+ else if ( className != null ) { //&& propertyName != null ) { //always true but less confusing
+ Element tree = xmlContext.getXMLTree( className, propertyName );
+ Annotation[] annotations = getJavaAnnotations();
+ List<Annotation> annotationList = new ArrayList<Annotation>( annotations.length + 5 );
+ annotationsMap = new HashMap<Class, Annotation>( annotations.length + 5 );
+ for ( Annotation annotation : annotations ) {
+ if ( ! annotationToXml.containsKey( annotation.annotationType() ) ) {
+ //unknown annotations are left over
+ annotationList.add( annotation );
+ }
+ }
+ preCalculateElementsForProperty( tree );
+ Transient transientAnn = getTransient( defaults );
+ if ( transientAnn != null ) {
+ annotationList.add( transientAnn );
+ }
+ else {
+ if ( defaults.canUseJavaAnnotations() ) {
+ Annotation annotation = getJavaAnnotation( AccessType.class );
+ addIfNotNull(annotationList, annotation);
+ }
+ getId( annotationList, defaults );
+ getEmbeddedId( annotationList, defaults );
+ getEmbedded( annotationList, defaults );
+ getBasic( annotationList, defaults );
+ getVersion( annotationList, defaults );
+ getAssociation( ManyToOne.class, annotationList, defaults );
+ getAssociation( OneToOne.class, annotationList, defaults );
+ getAssociation( OneToMany.class, annotationList, defaults );
+ getAssociation( ManyToMany.class, annotationList, defaults );
+ addIfNotNull(annotationList, getSequenceGenerator( elementsForProperty, defaults ));
+ addIfNotNull(annotationList, getTableGenerator( elementsForProperty, defaults ));
+ addIfNotNull(annotationList, getAttributeOverrides( elementsForProperty, defaults ));
+
+ }
+ processEventAnnotations(annotationList, defaults);
+ //FIXME use annotationsMap rather than annotationList this will be faster since the annotation type is usually known at put() time
+ this.annotations = annotationList.toArray( new Annotation[ annotationList.size() ] );
+ for (Annotation ann : this.annotations) {
+ annotationsMap.put( ann.annotationType(), ann );
+ }
+ }
+ else {
+ this.annotations = getJavaAnnotations();
+ for (Annotation ann : this.annotations) {
+ annotationsMap.put( ann.annotationType(), ann );
+ }
+ }
+ }
+ }
+
+ private void checkForOrphanProperties(Element tree) {
+ Class clazz;
+ try {
+ clazz = ReflectHelper.classForName( className, this.getClass() );
+ }
+ catch (ClassNotFoundException e) {
+ return; //a primitive type most likely
+ }
+ Element element = tree != null ? tree.element( "attributes" ) : null;
+ //put entity.attributes elements
+ if ( element != null ) {
+ //precompute the list of properties
+ //TODO is it really useful...
+ Set<String> properties = new HashSet<String>();
+ for (Field field : clazz.getFields() ) {
+ properties.add( field.getName() );
+ }
+ for (Method method : clazz.getMethods() ) {
+ String name = method.getName();
+ if ( name.startsWith( "get" ) ) {
+ properties.add( Introspector.decapitalize( name.substring( "get".length() ) ) );
+ }
+ else if ( name.startsWith( "is" ) ) {
+ properties.add( Introspector.decapitalize( name.substring( "is".length() ) ) );
+ }
+ }
+ for ( Element subelement : (List<Element>) element.elements() ) {
+ String propertyName = subelement.attributeValue( "name" );
+ if ( ! properties.contains( propertyName ) ) {
+ log.warn("Property " + StringHelper.qualify( className, propertyName ) + " not found in class"
+ + " but described in <mapping-file/> (possible typo error)");
+ }
+ }
+ }
+ }
+
+ /**
+ * Addes the Annotation to the list (only if it's not null) and then returns it.
+ */
+ private Annotation addIfNotNull(List<Annotation> annotationList, Annotation element) {
+ if ( element != null ) {
+ annotationList.add( element );
+ }
+ return element;
+ }
+
+ //TODO mutualize the next 2 methods
+ private Annotation getTableGenerator(List<Element> elementsForProperty, XMLContext.Default defaults) {
+ for (Element element : elementsForProperty) {
+ Element subelement = element != null ? element.element( annotationToXml.get( TableGenerator.class ) ) : null;
+ if ( subelement != null ) {
+ return buildTableGeneratorAnnotation( subelement, defaults );
+ }
+ }
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( TableGenerator.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+
+ private Annotation getSequenceGenerator(List<Element> elementsForProperty, XMLContext.Default defaults) {
+ for (Element element : elementsForProperty) {
+ Element subelement = element != null ? element.element( annotationToXml.get( SequenceGenerator.class ) ) : null;
+ if ( subelement != null ) {
+ return buildSequenceGeneratorAnnotation( subelement );
+ }
+ }
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( SequenceGenerator.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private void processEventAnnotations(List<Annotation> annotationList, XMLContext.Default defaults) {
+ boolean eventElement = false;
+ for ( Element element : elementsForProperty ) {
+ String elementName = element.getName();
+ if ( "pre-persist".equals( elementName ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( PrePersist.class );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ eventElement = true;
+ }
+ else if ( "pre-remove".equals( elementName ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( PreRemove.class );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ eventElement = true;
+ }
+ else if ( "pre-update".equals( elementName ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( PreUpdate.class );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ eventElement = true;
+ }
+ else if ( "post-persist".equals( elementName ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( PostPersist.class );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ eventElement = true;
+ }
+ else if ( "post-remove".equals( elementName ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( PostRemove.class );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ eventElement = true;
+ }
+ else if ( "post-update".equals( elementName ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( PostUpdate.class );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ eventElement = true;
+ }
+ else if ( "post-load".equals( elementName ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( PostLoad.class );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ eventElement = true;
+ }
+ }
+ if ( ! eventElement && defaults.canUseJavaAnnotations() ) {
+ Annotation ann = getJavaAnnotation(PrePersist.class);
+ addIfNotNull(annotationList, ann);
+ ann = getJavaAnnotation(PreRemove.class);
+ addIfNotNull(annotationList, ann);
+ ann = getJavaAnnotation(PreUpdate.class);
+ addIfNotNull(annotationList, ann);
+ ann = getJavaAnnotation(PostPersist.class);
+ addIfNotNull(annotationList, ann);
+ ann = getJavaAnnotation(PostRemove.class);
+ addIfNotNull(annotationList, ann);
+ ann = getJavaAnnotation(PostUpdate.class);
+ addIfNotNull(annotationList, ann);
+ ann = getJavaAnnotation(PostLoad.class);
+ addIfNotNull(annotationList, ann);
+ }
+ }
+
+ private EntityListeners getEntityListeners(Element tree, XMLContext.Default defaults) {
+ Element element = tree != null ? tree.element( "entity-listeners" ) : null;
+ if ( element != null) {
+ List<Class> entityListenerClasses = new ArrayList<Class>();
+ for (Element subelement : (List<Element>) element.elements( "entity-listener" ) ) {
+ String className = subelement.attributeValue( "class" );
+ try {
+ entityListenerClasses.add(
+ ReflectHelper.classForName(
+ XMLContext.buildSafeClassName( className, defaults ),
+ this.getClass()
+ )
+ );
+ }
+ catch (ClassNotFoundException e) {
+ throw new AnnotationException(
+ "Unable to find " + element.getPath() + ".class: " + className, e
+ );
+ }
+ }
+ AnnotationDescriptor ad = new AnnotationDescriptor( EntityListeners.class );
+ ad.setValue( "value", entityListenerClasses.toArray( new Class[ entityListenerClasses.size() ] ) );
+ return AnnotationFactory.create( ad );
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( EntityListeners.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private JoinTable overridesDefaultsInJoinTable(Annotation annotation, XMLContext.Default defaults) {
+ //no element but might have some default or some annotation
+ boolean defaultToJoinTable = ! ( isJavaAnnotationPresent( JoinColumn.class )
+ || isJavaAnnotationPresent( JoinColumns.class ) );
+ final Class<? extends Annotation> annotationClass = annotation.annotationType();
+ defaultToJoinTable = defaultToJoinTable &&
+ ( ( annotationClass == ManyToMany.class && StringHelper.isEmpty( ( (ManyToMany) annotation).mappedBy() ) )
+ || ( annotationClass == OneToMany.class && StringHelper.isEmpty( ( (OneToMany) annotation).mappedBy() ) )
+ || ( annotationClass == CollectionOfElements.class )
+ );
+ final Class<JoinTable> annotationType = JoinTable.class;
+ if ( defaultToJoinTable
+ && ( StringHelper.isNotEmpty( defaults.getCatalog() )
+ || StringHelper.isNotEmpty( defaults.getSchema() ) ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( annotationType );
+ if ( defaults.canUseJavaAnnotations() ) {
+ JoinTable table = getJavaAnnotation( annotationType );
+ if ( table != null ) {
+ ad.setValue( "name", table.name() );
+ ad.setValue( "schema", table.schema() );
+ ad.setValue( "catalog", table.catalog() );
+ ad.setValue( "uniqueConstraints", table.uniqueConstraints() );
+ ad.setValue( "joinColumns", table.joinColumns() );
+ ad.setValue( "inverseJoinColumns", table.inverseJoinColumns() );
+ }
+ }
+ if ( StringHelper.isEmpty( (String) ad.valueOf( "schema" ) )
+ && StringHelper.isNotEmpty( defaults.getSchema() ) ) {
+ ad.setValue( "schema", defaults.getSchema() );
+ }
+ if ( StringHelper.isEmpty( (String) ad.valueOf( "catalog" ) )
+ && StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
+ ad.setValue( "catalog", defaults.getCatalog() );
+ }
+ return AnnotationFactory.create( ad );
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( annotationType );
+ }
+ else {
+ return null;
+ }
+ }
+
+ /*
+ * no partial overriding possible
+ */
+ private void getJoinTable(List<Annotation> annotationList, Element tree, XMLContext.Default defaults) {
+ Element subelement = tree == null ? null : tree.element( "join-table" );
+ final Class<JoinTable> annotationType = JoinTable.class;
+ if ( subelement != null ) {
+ //ignore java annotation, an element is defined
+ AnnotationDescriptor annotation = new AnnotationDescriptor( annotationType );
+ copyStringAttribute( annotation, subelement, "name", false );
+ copyStringAttribute( annotation, subelement, "catalog", false );
+ if ( StringHelper.isNotEmpty( defaults.getCatalog() )
+ && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) {
+ annotation.setValue( "catalog", defaults.getCatalog() );
+ }
+ copyStringAttribute( annotation, subelement, "schema", false );
+ if ( StringHelper.isNotEmpty( defaults.getSchema() )
+ && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) {
+ annotation.setValue( "schema", defaults.getSchema() );
+ }
+ buildUniqueConstraints( annotation, subelement );
+ annotation.setValue( "joinColumns", getJoinColumns( subelement, false ) );
+ annotation.setValue( "inverseJoinColumns", getJoinColumns( subelement, true ) );
+ annotationList.add( AnnotationFactory.create( annotation ) );
+ }
+ }
+
+ private void getAssociation(
+ Class<? extends Annotation> annotationType, List<Annotation> annotationList, XMLContext.Default defaults
+ ) {
+ String xmlName = annotationToXml.get( annotationType );
+ for ( Element element : elementsForProperty ) {
+ if ( xmlName.equals( element.getName() ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( annotationType );
+ String className = element.attributeValue( "target-entity" );
+ if ( className != null ) {
+ Class clazz;
+ try {
+ clazz = ReflectHelper.classForName(
+ XMLContext.buildSafeClassName( className, defaults ),
+ this.getClass()
+ );
+ }
+ catch (ClassNotFoundException e) {
+ throw new AnnotationException(
+ "Unable to find " + element.getPath() + "target-entity: " + className, e
+ );
+ }
+ ad.setValue( "targetEntity", clazz );
+ }
+ getFetchType( ad, element );
+ getCascades( ad, element, defaults );
+ getJoinTable( annotationList, element, defaults );
+ buildJoinColumns( annotationList, element, defaults );
+ Annotation annotation = getPrimaryKeyJoinColumns( element, defaults );
+ addIfNotNull(annotationList, annotation);
+ copyBooleanAttribute( ad, element, "optional" );
+ copyStringAttribute( ad, element, "mapped-by", false );
+ getOrderBy( annotationList, element, defaults );
+ getMapKey( annotationList, element, defaults );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ }
+ }
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ Annotation annotation = getJavaAnnotation( annotationType );
+ if ( annotation != null ) {
+ annotationList.add( annotation );
+ annotation = overridesDefaultsInJoinTable( annotation, defaults );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( JoinColumn.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( JoinColumns.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( PrimaryKeyJoinColumn.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( PrimaryKeyJoinColumns.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( MapKey.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( OrderBy.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Lob.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Enumerated.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Temporal.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Column.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Columns.class );
+ addIfNotNull(annotationList, annotation);
+ }
+ else if ( isJavaAnnotationPresent( CollectionOfElements.class ) ) {
+ annotation = overridesDefaultsInJoinTable( getJavaAnnotation( CollectionOfElements.class ), defaults );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( JoinColumn.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( JoinColumns.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( PrimaryKeyJoinColumn.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( PrimaryKeyJoinColumns.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( MapKey.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( OrderBy.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Lob.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Enumerated.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Temporal.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Column.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Columns.class );
+ addIfNotNull(annotationList, annotation);
+ }
+ }
+ }
+
+ private void getOrderBy(List<Annotation> annotationList, Element element, XMLContext.Default defaults) {
+ Element subelement = element != null ? element.element( "order-by" ) : null;
+ if ( subelement != null ) {
+ String orderByString = subelement.getTextTrim();
+ AnnotationDescriptor ad = new AnnotationDescriptor( OrderBy.class );
+ if ( StringHelper.isNotEmpty( orderByString ) ) ad.setValue( "value", orderByString );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ }
+ }
+
+ private void getMapKey(List<Annotation> annotationList, Element element, XMLContext.Default defaults) {
+ Element subelement = element != null ? element.element( "map-key" ) : null;
+ if ( subelement != null ) {
+ String mapKeyString = subelement.attributeValue( "name" );
+ AnnotationDescriptor ad = new AnnotationDescriptor( MapKey.class );
+ if ( StringHelper.isNotEmpty( mapKeyString ) ) ad.setValue( "name", mapKeyString );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ }
+ }
+
+ private void buildJoinColumns(List<Annotation> annotationList, Element element, XMLContext.Default defaults) {
+ JoinColumn[] joinColumns = getJoinColumns( element, false );
+ if ( joinColumns.length > 0 ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( JoinColumns.class );
+ ad.setValue( "value", joinColumns );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ }
+ }
+
+ private void getCascades(AnnotationDescriptor ad, Element element, XMLContext.Default defaults) {
+ List<Element> elements = element != null ? element.elements( "cascade" ) : new ArrayList<Element>( 0 );
+ List<CascadeType> cascades = new ArrayList<CascadeType>();
+ for ( Element subelement : elements ) {
+ if ( subelement.element( "cascade-all" ) != null ) cascades.add( CascadeType.ALL );
+ if ( subelement.element( "cascade-persist" ) != null ) cascades.add( CascadeType.PERSIST );
+ if ( subelement.element( "cascade-merge" ) != null ) cascades.add( CascadeType.MERGE );
+ if ( subelement.element( "cascade-remove" ) != null ) cascades.add( CascadeType.REMOVE );
+ if ( subelement.element( "cascade-refresh" ) != null ) cascades.add( CascadeType.REFRESH );
+ }
+ if ( Boolean.TRUE.equals( defaults.getCascadePersist() )
+ && ! cascades.contains( CascadeType.ALL ) && ! cascades.contains( CascadeType.PERSIST ) ) {
+ cascades.add( CascadeType.PERSIST );
+ }
+ if ( cascades.size() > 0 ) {
+ ad.setValue( "cascade", cascades.toArray( new CascadeType[ cascades.size() ] ) );
+ }
+ }
+
+ private void getEmbedded(List<Annotation> annotationList, XMLContext.Default defaults) {
+ for ( Element element : elementsForProperty ) {
+ if ( "embedded".equals( element.getName() ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( Embedded.class );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ }
+ }
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ Annotation annotation = getJavaAnnotation( Embedded.class );
+ if ( annotation != null ) {
+ annotationList.add( annotation );
+ annotation = getJavaAnnotation( AttributeOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ }
+ }
+ }
+
+ private Transient getTransient(XMLContext.Default defaults) {
+ for ( Element element : elementsForProperty ) {
+ if ( "transient".equals( element.getName() ) ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( Transient.class );
+ return AnnotationFactory.create( ad );
+ }
+ }
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( Transient.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private void getVersion(List<Annotation> annotationList, XMLContext.Default defaults) {
+ for ( Element element : elementsForProperty ) {
+ if ( "version".equals( element.getName() ) ) {
+ Annotation annotation = buildColumns( element );
+ addIfNotNull(annotationList, annotation);
+ getTemporal( annotationList, element );
+ AnnotationDescriptor basic = new AnnotationDescriptor( Version.class );
+ annotationList.add( AnnotationFactory.create( basic ) );
+ }
+ }
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ //we have nothing, so Java annotations might occurs
+ Annotation annotation = getJavaAnnotation( Version.class );
+ if ( annotation != null ) {
+ annotationList.add( annotation );
+ annotation = getJavaAnnotation( Column.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Columns.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Temporal.class );
+ addIfNotNull(annotationList, annotation);
+ }
+ }
+ }
+
+ private void getBasic(List<Annotation> annotationList, XMLContext.Default defaults) {
+ for ( Element element : elementsForProperty ) {
+ if ( "basic".equals( element.getName() ) ) {
+ Annotation annotation = buildColumns( element );
+ addIfNotNull(annotationList, annotation);
+ getTemporal( annotationList, element );
+ getLob( annotationList, element );
+ getEnumerated( annotationList, element );
+ AnnotationDescriptor basic = new AnnotationDescriptor( Basic.class );
+ getFetchType( basic, element );
+ copyBooleanAttribute( basic, element, "optional" );
+ annotationList.add( AnnotationFactory.create( basic ) );
+ }
+ }
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ //no annotation presence constraint, basic is the default
+ Annotation annotation = getJavaAnnotation( Basic.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Lob.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Enumerated.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Temporal.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Column.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Columns.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ }
+ }
+
+ private void getEnumerated(List<Annotation> annotationList, Element element) {
+ Element subElement = element != null ? element.element( "enumerated" ) : null;
+ if ( subElement != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( Enumerated.class );
+ String enumerated = subElement.getTextTrim();
+ if ( "ORDINAL".equalsIgnoreCase( enumerated ) ) {
+ ad.setValue( "value", EnumType.ORDINAL );
+ }
+ else if ( "STRING".equalsIgnoreCase( enumerated ) ) {
+ ad.setValue( "value", EnumType.STRING );
+ }
+ else if ( StringHelper.isNotEmpty( enumerated ) ) {
+ throw new AnnotationException( "Unknown EnumType: " + enumerated + ". " + SCHEMA_VALIDATION );
+ }
+ annotationList.add( AnnotationFactory.create( ad ) );
+ }
+ }
+
+ private void getLob(List<Annotation> annotationList, Element element) {
+ Element subElement = element != null ? element.element( "lob" ) : null;
+ if ( subElement != null ) {
+ annotationList.add( AnnotationFactory.create( new AnnotationDescriptor( Lob.class ) ) );
+ }
+ }
+
+ private void getFetchType(AnnotationDescriptor descriptor, Element element) {
+ String fetchString = element != null ? element.attributeValue( "fetch" ) : null;
+ if ( fetchString != null ) {
+ if ( "eager".equalsIgnoreCase( fetchString ) ) {
+ descriptor.setValue( "fetch", FetchType.EAGER );
+ }
+ else if ( "lazy".equalsIgnoreCase( fetchString ) ) {
+ descriptor.setValue( "fetch", FetchType.LAZY );
+ }
+ }
+ }
+
+ private void getEmbeddedId(List<Annotation> annotationList, XMLContext.Default defaults) {
+ for ( Element element : elementsForProperty ) {
+ if ( "embedded-id".equals( element.getName() ) ) {
+ if ( isProcessingId( defaults ) ) {
+ Annotation annotation = getAttributeOverrides( element, defaults );
+ addIfNotNull(annotationList, annotation);
+ annotation = getAssociationOverrides( element, defaults );
+ addIfNotNull(annotationList, annotation);
+ AnnotationDescriptor ad = new AnnotationDescriptor( EmbeddedId.class );
+ annotationList.add( AnnotationFactory.create( ad ) );
+ }
+// else {
+// if ( defaults.canUseJavaAnnotations() ) {
+// if ( ! properOverridingOnMetadataNonComplete ) {
+// //check that id exists on the other attribute
+// //TODO Id too?
+// if ( mirroredAttribute == null || ! mirroredAttribute.isAnnotationPresent(
+// EmbeddedId.class
+// ) ) {
+// throw new AnnotationException(
+// "Cannot override an property with <embedded-id> not having an @EmbeddedId already"
+// );
+// }
+// }
+// }
+// }
+ }
+ }
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ Annotation annotation = getJavaAnnotation( EmbeddedId.class );
+ if ( annotation != null ) {
+ annotationList.add( annotation );
+ annotation = getJavaAnnotation( Column.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Columns.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( GeneratedValue.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Temporal.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( TableGenerator.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( SequenceGenerator.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ }
+ }
+ }
+
+ private void preCalculateElementsForProperty(Element tree) {
+ elementsForProperty = new ArrayList<Element>();
+ Element element = tree != null ? tree.element( "attributes" ) : null;
+ //put entity.attributes elements
+ if ( element != null ) {
+ for ( Element subelement : (List<Element>) element.elements() ) {
+ if ( propertyName.equals( subelement.attributeValue( "name" ) ) ) {
+ elementsForProperty.add( subelement );
+ }
+ }
+ }
+ //add pre-* etc from entity and pure entity listener classes
+ if (tree != null) {
+ for ( Element subelement : (List<Element>) tree.elements() ) {
+ if ( propertyName.equals( subelement.attributeValue( "method-name" ) ) ) {
+ elementsForProperty.add( subelement );
+ }
+ }
+ }
+ }
+
+ private void getId(List<Annotation> annotationList, XMLContext.Default defaults) {
+ for ( Element element : elementsForProperty ) {
+ if ( "id".equals( element.getName() ) ) {
+ boolean processId = isProcessingId( defaults );
+ if ( processId ) {
+ Annotation annotation = buildColumns( element );
+ addIfNotNull(annotationList, annotation);
+ annotation = buildGeneratedValue( element );
+ addIfNotNull(annotationList, annotation);
+ getTemporal( annotationList, element );
+ //FIXME: fix the priority of xml over java for generator names
+ annotation = getTableGenerator( element, defaults );
+ addIfNotNull(annotationList, annotation);
+ annotation = getSequenceGenerator( element, defaults );
+ addIfNotNull(annotationList, annotation);
+ AnnotationDescriptor id = new AnnotationDescriptor( Id.class );
+ annotationList.add( AnnotationFactory.create( id ) );
+ }
+// else {
+// if ( defaults.canUseJavaAnnotations() ) {
+// if ( ! properOverridingOnMetadataNonComplete ) {
+// //check that id exists on the other attribute
+// //TODO EmbeddedId too?
+// if ( mirroredAttribute == null || ! mirroredAttribute.isAnnotationPresent( Id.class ) ) {
+// throw new AnnotationException(
+// "Cannot override a property with <id> it does not have an @Id already"
+// );
+// }
+// }
+// }
+// }
+ }
+ }
+ if ( elementsForProperty.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ Annotation annotation = getJavaAnnotation( Id.class );
+ if ( annotation != null ) {
+ annotationList.add( annotation );
+ annotation = getJavaAnnotation( Column.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Columns.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( GeneratedValue.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( Temporal.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( TableGenerator.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( SequenceGenerator.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AttributeOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverride.class );
+ addIfNotNull(annotationList, annotation);
+ annotation = getJavaAnnotation( AssociationOverrides.class );
+ addIfNotNull(annotationList, annotation);
+ }
+ }
+ }
+
+ private boolean isProcessingId(XMLContext.Default defaults) {
+ boolean isExplicit = defaults.getAccess() != null;
+ boolean correctAccess =
+ ( PropertyType.PROPERTY.equals( propertyType ) && "property".equals( defaults.getAccess() ) )
+ || ( PropertyType.FIELD.equals( propertyType ) && "field".equals( defaults.getAccess() ) );
+ boolean hasId = defaults.canUseJavaAnnotations()
+ && ( isJavaAnnotationPresent( Id.class ) || isJavaAnnotationPresent( EmbeddedId.class ) );
+ //if ( properAccessOnMetadataComplete || properOverridingOnMetadataNonComplete ) {
+ boolean mirrorAttributeIsId = defaults.canUseJavaAnnotations() &&
+ ( mirroredAttribute != null &&
+ ( mirroredAttribute.isAnnotationPresent(Id.class)
+ || mirroredAttribute.isAnnotationPresent( EmbeddedId.class ) ) );
+ boolean propertyIsDefault = PropertyType.PROPERTY.equals( propertyType )
+ && ! mirrorAttributeIsId;
+ return correctAccess || ( ! isExplicit && hasId ) || ( ! isExplicit && propertyIsDefault );
+ }
+
+ private Columns buildColumns(Element element) {
+ List<Element> subelements = element.elements( "column" );
+ List<Column> columns = new ArrayList<Column>( subelements.size() );
+ for ( Element subelement : subelements ) {
+ columns.add( getColumn( subelement, false, element ) );
+ }
+ if ( columns.size() > 0 ) {
+ AnnotationDescriptor columnsDescr = new AnnotationDescriptor( Columns.class );
+ columnsDescr.setValue( "columns", columns.toArray( new Column[ columns.size() ] ) );
+ return AnnotationFactory.create( columnsDescr );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private GeneratedValue buildGeneratedValue(Element element) {
+ Element subElement = element != null ? element.element( "generated-value" ) : null;
+ if ( subElement != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( GeneratedValue.class );
+ String strategy = subElement.attributeValue( "strategy" );
+ if ( "TABLE".equalsIgnoreCase( strategy ) ) {
+ ad.setValue( "strategy", GenerationType.TABLE );
+ }
+ else if ( "SEQUENCE".equalsIgnoreCase( strategy ) ) {
+ ad.setValue( "strategy", GenerationType.SEQUENCE );
+ }
+ else if ( "IDENTITY".equalsIgnoreCase( strategy ) ) {
+ ad.setValue( "strategy", GenerationType.IDENTITY );
+ }
+ else if ( "AUTO".equalsIgnoreCase( strategy ) ) {
+ ad.setValue( "strategy", GenerationType.AUTO );
+ }
+ else if ( StringHelper.isNotEmpty( strategy ) ) {
+ throw new AnnotationException( "Unknown GenerationType: " + strategy + ". " + SCHEMA_VALIDATION );
+ }
+ copyStringAttribute( ad, subElement, "generator", false );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private void getTemporal(List<Annotation> annotationList, Element element) {
+ Element subElement = element != null ? element.element( "temporal" ) : null;
+ if ( subElement != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( Temporal.class );
+ String temporal = subElement.getTextTrim();
+ if ( "DATE".equalsIgnoreCase( temporal ) ) {
+ ad.setValue( "value", TemporalType.DATE );
+ }
+ else if ( "TIME".equalsIgnoreCase( temporal ) ) {
+ ad.setValue( "value", TemporalType.TIME );
+ }
+ else if ( "TIMESTAMP".equalsIgnoreCase( temporal ) ) {
+ ad.setValue( "value", TemporalType.TIMESTAMP );
+ }
+ else if ( StringHelper.isNotEmpty( temporal ) ) {
+ throw new AnnotationException( "Unknown TemporalType: " + temporal + ". " + SCHEMA_VALIDATION );
+ }
+ annotationList.add( AnnotationFactory.create( ad ) );
+ }
+ }
+
+ private AssociationOverrides getAssociationOverrides(Element tree, XMLContext.Default defaults) {
+ List<AssociationOverride> attributes = (List<AssociationOverride>) buildAssociationOverrides( tree );
+ if ( defaults.canUseJavaAnnotations() ) {
+ AssociationOverride annotation = getJavaAnnotation( AssociationOverride.class );
+ addAssociationOverrideIfNeeded( annotation, attributes );
+ AssociationOverrides annotations = getJavaAnnotation( AssociationOverrides.class );
+ if ( annotations != null ) {
+ for ( AssociationOverride current : annotations.value() ) {
+ addAssociationOverrideIfNeeded( current, attributes );
+ }
+ }
+ }
+ if ( attributes.size() > 0 ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( AssociationOverrides.class );
+ ad.setValue( "value", attributes.toArray( new AssociationOverride[ attributes.size() ] ) );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private List<AssociationOverride> buildAssociationOverrides(Element element) {
+ List<Element> subelements = element == null ? null : element.elements( "association-override" );
+ List<AssociationOverride> overrides = new ArrayList<AssociationOverride>();
+ if ( subelements != null && subelements.size() > 0 ) {
+ for ( Element current : subelements ) {
+ AnnotationDescriptor override = new AnnotationDescriptor( AssociationOverride.class );
+ copyStringAttribute( override, current, "name", true );
+ override.setValue( "joinColumns", getJoinColumns( current, false ) );
+ overrides.add( (AssociationOverride) AnnotationFactory.create( override ) );
+ }
+ }
+ return overrides;
+ }
+
+ private JoinColumn[] getJoinColumns(Element element, boolean isInverse) {
+ List<Element> subelements = element != null ?
+ element.elements( isInverse ? "inverse-join-column" : "join-column" ) :
+ null;
+ List<JoinColumn> joinColumns = new ArrayList<JoinColumn>();
+ if ( subelements != null ) {
+ for ( Element subelement : subelements ) {
+ AnnotationDescriptor column = new AnnotationDescriptor( JoinColumn.class );
+ copyStringAttribute( column, subelement, "name", false );
+ copyStringAttribute( column, subelement, "referenced-column-name", false );
+ copyBooleanAttribute( column, subelement, "unique" );
+ copyBooleanAttribute( column, subelement, "nullable" );
+ copyBooleanAttribute( column, subelement, "insertable" );
+ copyBooleanAttribute( column, subelement, "updatable" );
+ copyStringAttribute( column, subelement, "column-definition", false );
+ copyStringAttribute( column, subelement, "table", false );
+ joinColumns.add( (JoinColumn) AnnotationFactory.create( column ) );
+ }
+ }
+ return joinColumns.toArray( new JoinColumn[ joinColumns.size() ] );
+ }
+
+ private void addAssociationOverrideIfNeeded(AssociationOverride annotation, List<AssociationOverride> overrides) {
+ if ( annotation != null ) {
+ String overrideName = annotation.name();
+ boolean present = false;
+ for ( AssociationOverride current : overrides ) {
+ if ( current.name().equals( overrideName ) ) {
+ present = true;
+ break;
+ }
+ }
+ if ( !present ) overrides.add( annotation );
+ }
+ }
+
+ private AttributeOverrides getAttributeOverrides(Element tree, XMLContext.Default defaults) {
+ List<AttributeOverride> attributes = buildAttributeOverrides( tree );
+ return mergeAttributeOverrides( defaults, attributes );
+ }
+
+ private AttributeOverrides getAttributeOverrides(List<Element> elements, XMLContext.Default defaults) {
+ List<AttributeOverride> attributes = new ArrayList<AttributeOverride>();
+ for (Element element : elements) {
+ attributes.addAll( buildAttributeOverrides( element ) );
+ }
+ return mergeAttributeOverrides( defaults, attributes );
+ }
+
+ private AttributeOverrides mergeAttributeOverrides(XMLContext.Default defaults,
+ List<AttributeOverride> attributes) {
+ if ( defaults.canUseJavaAnnotations() ) {
+ AttributeOverride annotation = getJavaAnnotation( AttributeOverride.class );
+ addAttributeOverrideIfNeeded( annotation, attributes );
+ AttributeOverrides annotations = getJavaAnnotation( AttributeOverrides.class );
+ if ( annotations != null ) {
+ for ( AttributeOverride current : annotations.value() ) {
+ addAttributeOverrideIfNeeded( current, attributes );
+ }
+ }
+ }
+ if ( attributes.size() > 0 ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( AttributeOverrides.class );
+ ad.setValue( "value", attributes.toArray( new AttributeOverride[ attributes.size() ] ) );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private List<AttributeOverride> buildAttributeOverrides(Element element) {
+ List<Element> subelements = element == null ? null : element.elements( "attribute-override" );
+ return buildAttributeOverrides( subelements );
+ }
+
+ private List<AttributeOverride> buildAttributeOverrides(List<Element> subelements) {
+ List<AttributeOverride> overrides = new ArrayList<AttributeOverride>();
+ if ( subelements != null && subelements.size() > 0 ) {
+ for ( Element current : subelements ) {
+ if ( ! current.getName().equals( "attribute-override" ) ) continue;
+ AnnotationDescriptor override = new AnnotationDescriptor( AttributeOverride.class );
+ copyStringAttribute( override, current, "name", true );
+ Element column = current != null ? current.element( "column" ) : null;
+ override.setValue( "column", getColumn( column, true, current ) );
+ overrides.add( (AttributeOverride) AnnotationFactory.create( override ) );
+ }
+ }
+ return overrides;
+ }
+
+ private Column getColumn(Element element, boolean isMandatory, Element current) {
+ //Element subelement = element != null ? element.element( "column" ) : null;
+ if ( element != null ) {
+ AnnotationDescriptor column = new AnnotationDescriptor( Column.class );
+ copyStringAttribute( column, element, "name", false );
+ copyBooleanAttribute( column, element, "unique" );
+ copyBooleanAttribute( column, element, "nullable" );
+ copyBooleanAttribute( column, element, "insertable" );
+ copyBooleanAttribute( column, element, "updatable" );
+ copyStringAttribute( column, element, "column-definition", false );
+ copyStringAttribute( column, element, "table", false );
+ copyIntegerAttribute( column, element, "length" );
+ copyIntegerAttribute( column, element, "precision" );
+ copyIntegerAttribute( column, element, "scale" );
+ return (Column) AnnotationFactory.create( column );
+ }
+ else {
+ if ( isMandatory ) {
+ throw new AnnotationException( current.getPath() + ".column is mandatory. " + SCHEMA_VALIDATION );
+ }
+ return null;
+ }
+ }
+
+ private void addAttributeOverrideIfNeeded(AttributeOverride annotation, List<AttributeOverride> overrides) {
+ if ( annotation != null ) {
+ String overrideName = annotation.name();
+ boolean present = false;
+ for ( AttributeOverride current : overrides ) {
+ if ( current.name().equals( overrideName ) ) {
+ present = true;
+ break;
+ }
+ }
+ if ( !present ) overrides.add( annotation );
+ }
+ }
+
+ private AccessType getAccessType(Element tree, XMLContext.Default defaults) {
+ String access = tree == null ? null : tree.attributeValue( "access" );
+ if ( "FIELD".equals( access ) || "PROPERTY".equals( access ) ) {
+ access = access.toLowerCase();
+ }
+ if ( access != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( AccessType.class );
+ ad.setValue( "value", access );
+ return AnnotationFactory.create( ad );
+ }
+ else if ( defaults.canUseJavaAnnotations() && isJavaAnnotationPresent( AccessType.class ) ) {
+ AccessType annotation = getJavaAnnotation( AccessType.class );
+ return annotation;
+ }
+ else if ( defaults.getAccess() != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( AccessType.class );
+ ad.setValue( "value", defaults.getAccess() );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private ExcludeSuperclassListeners getExcludeSuperclassListeners(Element tree, XMLContext.Default defaults) {
+ return (ExcludeSuperclassListeners) getMarkerAnnotation( ExcludeSuperclassListeners.class, tree, defaults );
+ }
+
+ private ExcludeDefaultListeners getExcludeDefaultListeners(Element tree, XMLContext.Default defaults) {
+ return (ExcludeDefaultListeners) getMarkerAnnotation( ExcludeDefaultListeners.class, tree, defaults );
+ }
+
+ private Annotation getMarkerAnnotation(
+ Class<? extends Annotation> clazz, Element element, XMLContext.Default defaults
+ ) {
+ Element subelement = element == null ? null : element.element( annotationToXml.get( clazz ) );
+ if ( subelement != null ) {
+ return AnnotationFactory.create( new AnnotationDescriptor( clazz ) );
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ //TODO wonder whether it should be excluded so that user can undone it
+ return getJavaAnnotation( clazz );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private SqlResultSetMappings getSqlResultSetMappings(Element tree, XMLContext.Default defaults) {
+ List<SqlResultSetMapping> results = (List<SqlResultSetMapping>) buildSqlResultsetMappings( tree, defaults );
+ if ( defaults.canUseJavaAnnotations() ) {
+ SqlResultSetMapping annotation = getJavaAnnotation( SqlResultSetMapping.class );
+ addSqlResultsetMappingIfNeeded( annotation, results );
+ SqlResultSetMappings annotations = getJavaAnnotation( SqlResultSetMappings.class );
+ if ( annotations != null ) {
+ for ( SqlResultSetMapping current : annotations.value() ) {
+ addSqlResultsetMappingIfNeeded( current, results );
+ }
+ }
+ }
+ if ( results.size() > 0 ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( SqlResultSetMappings.class );
+ ad.setValue( "value", results.toArray( new SqlResultSetMapping[ results.size() ] ) );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ return null;
+ }
+ }
+
+ public static List<SqlResultSetMapping> buildSqlResultsetMappings(Element element, XMLContext.Default defaults) {
+ if ( element == null ) return new ArrayList<SqlResultSetMapping>();
+ List resultsetElementList = element.elements( "sql-result-set-mapping" );
+ List<SqlResultSetMapping> resultsets = new ArrayList<SqlResultSetMapping>();
+ Iterator it = resultsetElementList.listIterator();
+ while ( it.hasNext() ) {
+ Element subelement = (Element) it.next();
+ AnnotationDescriptor ann = new AnnotationDescriptor( SqlResultSetMapping.class );
+ copyStringAttribute( ann, subelement, "name", true );
+ List<Element> elements = subelement.elements( "entity-result" );
+ List<EntityResult> entityResults = new ArrayList<EntityResult>( elements.size() );
+ for ( Element entityResult : elements ) {
+ AnnotationDescriptor entityResultDescriptor = new AnnotationDescriptor( EntityResult.class );
+ String clazzName = entityResult.attributeValue( "entity-class" );
+ if ( clazzName == null ) {
+ throw new AnnotationException( "<entity-result> without entity-class. " + SCHEMA_VALIDATION );
+ }
+ Class clazz = null;
+ try {
+ clazz = ReflectHelper.classForName(
+ XMLContext.buildSafeClassName( clazzName, defaults ),
+ EJB3OverridenAnnotationReader.class
+ );
+ }
+ catch (ClassNotFoundException e) {
+ throw new AnnotationException( "Unable to find entity-class: " + clazzName, e );
+ }
+ entityResultDescriptor.setValue( "entityClass", clazz );
+ copyStringAttribute( entityResultDescriptor, entityResult, "discriminator-column", false );
+ List<FieldResult> fieldResults = new ArrayList<FieldResult>();
+ for ( Element fieldResult : (List<Element>) entityResult.elements( "field-result" ) ) {
+ AnnotationDescriptor fieldResultDescriptor = new AnnotationDescriptor( FieldResult.class );
+ copyStringAttribute( fieldResultDescriptor, fieldResult, "name", true );
+ copyStringAttribute( fieldResultDescriptor, fieldResult, "column", true );
+ fieldResults.add( (FieldResult) AnnotationFactory.create( fieldResultDescriptor ) );
+ }
+ entityResultDescriptor.setValue(
+ "fields", fieldResults.toArray( new FieldResult[ fieldResults.size() ] )
+ );
+ entityResults.add( (EntityResult) AnnotationFactory.create( entityResultDescriptor ) );
+ }
+ ann.setValue( "entities", entityResults.toArray( new EntityResult[ entityResults.size() ] ) );
+
+ elements = subelement.elements( "column-result" );
+ List<ColumnResult> columnResults = new ArrayList<ColumnResult>( elements.size() );
+ for ( Element columnResult : elements ) {
+ AnnotationDescriptor columnResultDescriptor = new AnnotationDescriptor( ColumnResult.class );
+ copyStringAttribute( columnResultDescriptor, columnResult, "name", true );
+ columnResults.add( (ColumnResult) AnnotationFactory.create( columnResultDescriptor ) );
+ }
+ ann.setValue( "columns", columnResults.toArray( new ColumnResult[ columnResults.size() ] ) );
+ //FIXME there is never such a result-class, get rid of it?
+ String clazzName = subelement.attributeValue( "result-class" );
+ if ( StringHelper.isNotEmpty( clazzName ) ) {
+ Class clazz = null;
+ try {
+ clazz = ReflectHelper.classForName(
+ XMLContext.buildSafeClassName( clazzName, defaults ),
+ EJB3OverridenAnnotationReader.class
+ );
+ }
+ catch (ClassNotFoundException e) {
+ throw new AnnotationException( "Unable to find entity-class: " + clazzName, e );
+ }
+ ann.setValue( "resultClass", clazz );
+ }
+ copyStringAttribute( ann, subelement, "result-set-mapping", false );
+ resultsets.add( (SqlResultSetMapping) AnnotationFactory.create( ann ) );
+ }
+ return resultsets;
+ }
+
+ private void addSqlResultsetMappingIfNeeded(SqlResultSetMapping annotation, List<SqlResultSetMapping> resultsets) {
+ if ( annotation != null ) {
+ String resultsetName = annotation.name();
+ boolean present = false;
+ for ( SqlResultSetMapping current : resultsets ) {
+ if ( current.name().equals( resultsetName ) ) {
+ present = true;
+ break;
+ }
+ }
+ if ( !present ) resultsets.add( annotation );
+ }
+ }
+
+ private NamedQueries getNamedQueries(Element tree, XMLContext.Default defaults) {
+ //TODO avoid the Proxy Creation (@NamedQueries) when possible
+ List<NamedQuery> queries = (List<NamedQuery>) buildNamedQueries( tree, false, defaults );
+ if ( defaults.canUseJavaAnnotations() ) {
+ NamedQuery annotation = getJavaAnnotation( NamedQuery.class );
+ addNamedQueryIfNeeded( annotation, queries );
+ NamedQueries annotations = getJavaAnnotation( NamedQueries.class );
+ if ( annotations != null ) {
+ for ( NamedQuery current : annotations.value() ) {
+ addNamedQueryIfNeeded( current, queries );
+ }
+ }
+ }
+ if ( queries.size() > 0 ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( NamedQueries.class );
+ ad.setValue( "value", queries.toArray( new NamedQuery[ queries.size() ] ) );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private void addNamedQueryIfNeeded(NamedQuery annotation, List<NamedQuery> queries) {
+ if ( annotation != null ) {
+ String queryName = annotation.name();
+ boolean present = false;
+ for ( NamedQuery current : queries ) {
+ if ( current.name().equals( queryName ) ) {
+ present = true;
+ break;
+ }
+ }
+ if ( !present ) queries.add( annotation );
+ }
+ }
+
+ private NamedNativeQueries getNamedNativeQueries(Element tree, XMLContext.Default defaults) {
+ List<NamedNativeQuery> queries = (List<NamedNativeQuery>) buildNamedQueries( tree, true, defaults );
+ if ( defaults.canUseJavaAnnotations() ) {
+ NamedNativeQuery annotation = getJavaAnnotation( NamedNativeQuery.class );
+ addNamedNativeQueryIfNeeded( annotation, queries );
+ NamedNativeQueries annotations = getJavaAnnotation( NamedNativeQueries.class );
+ if ( annotations != null ) {
+ for ( NamedNativeQuery current : annotations.value() ) {
+ addNamedNativeQueryIfNeeded( current, queries );
+ }
+ }
+ }
+ if ( queries.size() > 0 ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( NamedNativeQueries.class );
+ ad.setValue( "value", queries.toArray( new NamedNativeQuery[ queries.size() ] ) );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private void addNamedNativeQueryIfNeeded(NamedNativeQuery annotation, List<NamedNativeQuery> queries) {
+ if ( annotation != null ) {
+ String queryName = annotation.name();
+ boolean present = false;
+ for ( NamedNativeQuery current : queries ) {
+ if ( current.name().equals( queryName ) ) {
+ present = true;
+ break;
+ }
+ }
+ if ( !present ) queries.add( annotation );
+ }
+ }
+
+ public static List buildNamedQueries(Element element, boolean isNative, XMLContext.Default defaults) {
+ if ( element == null ) return new ArrayList();
+ List namedQueryElementList = isNative ?
+ element.elements( "named-native-query" ) :
+ element.elements( "named-query" );
+ List namedQueries = new ArrayList();
+ Iterator it = namedQueryElementList.listIterator();
+ while ( it.hasNext() ) {
+ Element subelement = (Element) it.next();
+ AnnotationDescriptor ann = new AnnotationDescriptor(
+ isNative ? NamedNativeQuery.class : NamedQuery.class
+ );
+ copyStringAttribute( ann, subelement, "name", false );
+ Element queryElt = subelement.element( "query" );
+ if ( queryElt == null ) throw new AnnotationException( "No <query> element found." + SCHEMA_VALIDATION );
+ ann.setValue( "query", queryElt.getTextTrim() );
+ List<Element> elements = subelement.elements( "hint" );
+ List<QueryHint> queryHints = new ArrayList<QueryHint>( elements.size() );
+ for ( Element hint : elements ) {
+ AnnotationDescriptor hintDescriptor = new AnnotationDescriptor( QueryHint.class );
+ String value = hint.attributeValue( "name" );
+ if ( value == null ) throw new AnnotationException( "<hint> without name. " + SCHEMA_VALIDATION );
+ hintDescriptor.setValue( "name", value );
+ value = hint.attributeValue( "value" );
+ if ( value == null ) throw new AnnotationException( "<hint> without value. " + SCHEMA_VALIDATION );
+ hintDescriptor.setValue( "value", value );
+ queryHints.add( (QueryHint) AnnotationFactory.create( hintDescriptor ) );
+ }
+ ann.setValue( "hints", queryHints.toArray( new QueryHint[ queryHints.size() ] ) );
+ String clazzName = subelement.attributeValue( "result-class" );
+ if ( StringHelper.isNotEmpty( clazzName ) ) {
+ Class clazz = null;
+ try {
+ clazz = ReflectHelper.classForName(
+ XMLContext.buildSafeClassName( clazzName, defaults ),
+ EJB3OverridenAnnotationReader.class
+ );
+ }
+ catch (ClassNotFoundException e) {
+ throw new AnnotationException( "Unable to find entity-class: " + clazzName, e );
+ }
+ ann.setValue( "resultClass", clazz );
+ }
+ copyStringAttribute( ann, subelement, "result-set-mapping", false );
+ namedQueries.add( AnnotationFactory.create( ann ) );
+ }
+ return namedQueries;
+ }
+
+ private TableGenerator getTableGenerator(Element tree, XMLContext.Default defaults) {
+ Element element = tree != null ? tree.element( annotationToXml.get( TableGenerator.class ) ) : null;
+ if ( element != null ) {
+ return buildTableGeneratorAnnotation( element, defaults );
+ }
+ else if ( defaults.canUseJavaAnnotations() && isJavaAnnotationPresent( TableGenerator.class ) ) {
+ TableGenerator tableAnn = getJavaAnnotation( TableGenerator.class );
+ if ( StringHelper.isNotEmpty( defaults.getSchema() )
+ || StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
+ AnnotationDescriptor annotation = new AnnotationDescriptor( TableGenerator.class );
+ annotation.setValue( "name", tableAnn.name() );
+ annotation.setValue( "table", tableAnn.table() );
+ annotation.setValue( "catalog", tableAnn.table() );
+ if ( StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) )
+ && StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
+ annotation.setValue( "catalog", defaults.getCatalog() );
+ }
+ annotation.setValue( "schema", tableAnn.table() );
+ if ( StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) )
+ && StringHelper.isNotEmpty( defaults.getSchema() ) ) {
+ annotation.setValue( "catalog", defaults.getSchema() );
+ }
+ annotation.setValue( "pkColumnName", tableAnn.pkColumnName() );
+ annotation.setValue( "valueColumnName", tableAnn.valueColumnName() );
+ annotation.setValue( "pkColumnValue", tableAnn.pkColumnValue() );
+ annotation.setValue( "initialValue", tableAnn.initialValue() );
+ annotation.setValue( "allocationSize", tableAnn.allocationSize() );
+ annotation.setValue( "uniqueConstraints", tableAnn.uniqueConstraints() );
+ return AnnotationFactory.create( annotation );
+ }
+ else {
+ return tableAnn;
+ }
+ }
+ else {
+ return null;
+ }
+ }
+
+ public static TableGenerator buildTableGeneratorAnnotation(Element element, XMLContext.Default defaults) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( TableGenerator.class );
+ copyStringAttribute( ad, element, "name", false );
+ copyStringAttribute( ad, element, "table", false );
+ copyStringAttribute( ad, element, "catalog", false );
+ copyStringAttribute( ad, element, "schema", false );
+ copyStringAttribute( ad, element, "pk-column-name", false );
+ copyStringAttribute( ad, element, "value-column-name", false );
+ copyStringAttribute( ad, element, "pk-column-value", false );
+ copyIntegerAttribute( ad, element, "initial-value" );
+ copyIntegerAttribute( ad, element, "allocation-size" );
+ buildUniqueConstraints( ad, element );
+ if ( StringHelper.isEmpty( (String) ad.valueOf( "schema" ) )
+ && StringHelper.isNotEmpty( defaults.getSchema() ) ) {
+ ad.setValue( "schema", defaults.getSchema() );
+ }
+ if ( StringHelper.isEmpty( (String) ad.valueOf( "catalog" ) )
+ && StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
+ ad.setValue( "catalog", defaults.getCatalog() );
+ }
+ return AnnotationFactory.create( ad );
+ }
+
+ private SequenceGenerator getSequenceGenerator(Element tree, XMLContext.Default defaults) {
+ Element element = tree != null ? tree.element( annotationToXml.get( SequenceGenerator.class ) ) : null;
+ if ( element != null ) {
+ return buildSequenceGeneratorAnnotation( element );
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( SequenceGenerator.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+ public static SequenceGenerator buildSequenceGeneratorAnnotation(Element element) {
+ if (element != null) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( SequenceGenerator.class );
+ copyStringAttribute( ad, element, "name", false );
+ copyStringAttribute( ad, element, "sequence-name", false );
+ copyIntegerAttribute( ad, element, "initial-value" );
+ copyIntegerAttribute( ad, element, "allocation-size" );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private DiscriminatorColumn getDiscriminatorColumn(Element tree, XMLContext.Default defaults) {
+ Element element = tree != null ? tree.element( "discriminator-column" ) : null;
+ if ( element != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( DiscriminatorColumn.class );
+ copyStringAttribute( ad, element, "name", false );
+ copyStringAttribute( ad, element, "column-definition", false );
+ String value = element.attributeValue( "discriminator-type" );
+ DiscriminatorType type = DiscriminatorType.STRING;
+ if ( value != null ) {
+ if ( "STRING".equals( value ) ) {
+ type = DiscriminatorType.STRING;
+ }
+ else if ( "CHAR".equals( value ) ) {
+ type = DiscriminatorType.CHAR;
+ }
+ else if ( "INTEGER".equals( value ) ) {
+ type = DiscriminatorType.INTEGER;
+ }
+ else {
+ throw new AnnotationException(
+ "Unknown DiscrimiatorType in XML: " + value + " (" + SCHEMA_VALIDATION + ")"
+ );
+ }
+ }
+ ad.setValue( "discriminatorType", type );
+ copyIntegerAttribute( ad, element, "length" );
+ return AnnotationFactory.create( ad );
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( DiscriminatorColumn.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private DiscriminatorValue getDiscriminatorValue(Element tree, XMLContext.Default defaults) {
+ Element element = tree != null ? tree.element( "discriminator-value" ) : null;
+ if ( element != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( DiscriminatorValue.class );
+ copyStringElement( element, ad, "value" );
+ return AnnotationFactory.create( ad );
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( DiscriminatorValue.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private Inheritance getInheritance(Element tree, XMLContext.Default defaults) {
+ Element element = tree != null ? tree.element( "inheritance" ) : null;
+ if ( element != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( Inheritance.class );
+ Attribute attr = element.attribute( "strategy" );
+ InheritanceType strategy = InheritanceType.SINGLE_TABLE;
+ if ( attr != null ) {
+ String value = attr.getValue();
+ if ( "SINGLE_TABLE".equals( value ) ) {
+ strategy = InheritanceType.SINGLE_TABLE;
+ }
+ else if ( "JOINED".equals( value ) ) {
+ strategy = InheritanceType.JOINED;
+ }
+ else if ( "TABLE_PER_CLASS".equals( value ) ) {
+ strategy = InheritanceType.TABLE_PER_CLASS;
+ }
+ else {
+ throw new AnnotationException(
+ "Unknown InheritanceType in XML: " + value + " (" + SCHEMA_VALIDATION + ")"
+ );
+ }
+ }
+ ad.setValue( "strategy", strategy );
+ return AnnotationFactory.create( ad );
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( Inheritance.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private IdClass getIdClass(Element tree, XMLContext.Default defaults) {
+ Element element = tree == null ? null : tree.element( "id-class" );
+ if ( element != null ) {
+ Attribute attr = element.attribute( "class" );
+ if ( attr != null ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( IdClass.class );
+ Class clazz = null;
+ try {
+ clazz = ReflectHelper.classForName(
+ XMLContext.buildSafeClassName( attr.getValue(), defaults ),
+ this.getClass()
+ );
+ }
+ catch (ClassNotFoundException e) {
+ throw new AnnotationException( "Unable to find id-class: " + attr.getValue(), e );
+ }
+ ad.setValue( "value", clazz );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ throw new AnnotationException( "id-class without class. " + SCHEMA_VALIDATION );
+ }
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( IdClass.class );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private PrimaryKeyJoinColumns getPrimaryKeyJoinColumns(Element element, XMLContext.Default defaults) {
+ PrimaryKeyJoinColumn[] columns = buildPrimaryKeyJoinColumns( element );
+ if ( columns.length == 0 && defaults.canUseJavaAnnotations() ) {
+ PrimaryKeyJoinColumn annotation = getJavaAnnotation( PrimaryKeyJoinColumn.class );
+ if ( annotation != null ) {
+ columns = new PrimaryKeyJoinColumn[]{annotation};
+ }
+ else {
+ PrimaryKeyJoinColumns annotations = getJavaAnnotation( PrimaryKeyJoinColumns.class );
+ columns = annotations != null ? annotations.value() : columns;
+ }
+ }
+ if ( columns.length > 0 ) {
+ AnnotationDescriptor ad = new AnnotationDescriptor( PrimaryKeyJoinColumns.class );
+ ad.setValue( "value", columns );
+ return AnnotationFactory.create( ad );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private Entity getEntity(Element tree, XMLContext.Default defaults) {
+ if ( tree == null ) {
+ return defaults.canUseJavaAnnotations() ? getJavaAnnotation( Entity.class ) : null;
+ }
+ else {
+ if ( "entity".equals( tree.getName() ) ) {
+ AnnotationDescriptor entity = new AnnotationDescriptor( Entity.class );
+ copyStringAttribute( entity, tree, "name", false );
+ if ( defaults.canUseJavaAnnotations()
+ && StringHelper.isEmpty( (String) entity.valueOf( "name" ) ) ) {
+ Entity javaAnn = getJavaAnnotation( Entity.class );
+ if ( javaAnn != null ) entity.setValue( "name", javaAnn.name() );
+ }
+ return AnnotationFactory.create( entity );
+ }
+ else {
+ return null; //this is not an entity
+ }
+ }
+ }
+
+ private MappedSuperclass getMappedSuperclass(Element tree, XMLContext.Default defaults) {
+ if ( tree == null ) {
+ return defaults.canUseJavaAnnotations() ? getJavaAnnotation( MappedSuperclass.class ) : null;
+ }
+ else {
+ if ( "mapped-superclass".equals( tree.getName() ) ) {
+ AnnotationDescriptor entity = new AnnotationDescriptor( MappedSuperclass.class );
+ return AnnotationFactory.create( entity );
+ }
+ else {
+ return null; //this is not an entity
+ }
+ }
+ }
+
+ private Embeddable getEmbeddable(Element tree, XMLContext.Default defaults) {
+ if ( tree == null ) {
+ return defaults.canUseJavaAnnotations() ? getJavaAnnotation( Embeddable.class ) : null;
+ }
+ else {
+ if ( "embeddable".equals( tree.getName() ) ) {
+ AnnotationDescriptor entity = new AnnotationDescriptor( Embeddable.class );
+ return AnnotationFactory.create( entity );
+ }
+ else {
+ return null; //this is not an entity
+ }
+ }
+ }
+
+ private Table getTable(Element tree, XMLContext.Default defaults) {
+ Element subelement = tree == null ? null : tree.element( "table" );
+ if ( subelement == null ) {
+ //no element but might have some default or some annotation
+ if ( StringHelper.isNotEmpty( defaults.getCatalog() )
+ || StringHelper.isNotEmpty( defaults.getSchema() ) ) {
+ AnnotationDescriptor annotation = new AnnotationDescriptor( Table.class );
+ if ( defaults.canUseJavaAnnotations() ) {
+ Table table = getJavaAnnotation( Table.class );
+ if ( table != null ) {
+ annotation.setValue( "name", table.name() );
+ annotation.setValue( "schema", table.schema() );
+ annotation.setValue( "catalog", table.catalog() );
+ annotation.setValue( "uniqueConstraints", table.uniqueConstraints() );
+ }
+ }
+ if ( StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) )
+ && StringHelper.isNotEmpty( defaults.getSchema() ) ) {
+ annotation.setValue( "schema", defaults.getSchema() );
+ }
+ if ( StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) )
+ && StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
+ annotation.setValue( "catalog", defaults.getCatalog() );
+ }
+ return AnnotationFactory.create( annotation );
+ }
+ else if ( defaults.canUseJavaAnnotations() ) {
+ return getJavaAnnotation( Table.class );
+ }
+ else {
+ return null;
+ }
+ }
+ else {
+ //ignore java annotation, an element is defined
+ AnnotationDescriptor annotation = new AnnotationDescriptor( Table.class );
+ copyStringAttribute( annotation, subelement, "name", false );
+ copyStringAttribute( annotation, subelement, "catalog", false );
+ if ( StringHelper.isNotEmpty( defaults.getCatalog() )
+ && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) {
+ annotation.setValue( "catalog", defaults.getCatalog() );
+ }
+ copyStringAttribute( annotation, subelement, "schema", false );
+ if ( StringHelper.isNotEmpty( defaults.getSchema() )
+ && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) {
+ annotation.setValue( "schema", defaults.getSchema() );
+ }
+ buildUniqueConstraints( annotation, subelement );
+ return AnnotationFactory.create( annotation );
+ }
+ }
+
+ private SecondaryTables getSecondaryTables(Element tree, XMLContext.Default defaults) {
+ List<Element> elements = tree == null ?
+ new ArrayList<Element>() :
+ (List<Element>) tree.elements( "secondary-table" );
+ List<SecondaryTable> secondaryTables = new ArrayList<SecondaryTable>( 3 );
+ for ( Element element : elements ) {
+ AnnotationDescriptor annotation = new AnnotationDescriptor( SecondaryTable.class );
+ copyStringAttribute( annotation, element, "name", false );
+ copyStringAttribute( annotation, element, "catalog", false );
+ if ( StringHelper.isNotEmpty( defaults.getCatalog() )
+ && StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) ) ) {
+ annotation.setValue( "catalog", defaults.getCatalog() );
+ }
+ copyStringAttribute( annotation, element, "schema", false );
+ if ( StringHelper.isNotEmpty( defaults.getSchema() )
+ && StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) ) ) {
+ annotation.setValue( "schema", defaults.getSchema() );
+ }
+ buildUniqueConstraints( annotation, element );
+ annotation.setValue( "pkJoinColumns", buildPrimaryKeyJoinColumns( element ) );
+ secondaryTables.add( (SecondaryTable) AnnotationFactory.create( annotation ) );
+ }
+ /*
+ * You can't have both secondary table in XML and Java,
+ * since there would be no way to "remove" a secondary table
+ */
+ if ( secondaryTables.size() == 0 && defaults.canUseJavaAnnotations() ) {
+ SecondaryTable secTableAnn = getJavaAnnotation( SecondaryTable.class );
+ overridesDefaultInSecondaryTable( secTableAnn, defaults, secondaryTables );
+ SecondaryTables secTablesAnn = getJavaAnnotation( SecondaryTables.class );
+ if ( secTablesAnn != null ) {
+ for ( SecondaryTable table : secTablesAnn.value() ) {
+ overridesDefaultInSecondaryTable( table, defaults, secondaryTables );
+ }
+ }
+ }
+ if ( secondaryTables.size() > 0 ) {
+ AnnotationDescriptor descriptor = new AnnotationDescriptor( SecondaryTables.class );
+ descriptor.setValue( "value", secondaryTables.toArray( new SecondaryTable[secondaryTables.size()] ) );
+ return AnnotationFactory.create( descriptor );
+ }
+ else {
+ return null;
+ }
+ }
+
+ private void overridesDefaultInSecondaryTable(
+ SecondaryTable secTableAnn, XMLContext.Default defaults, List<SecondaryTable> secondaryTables
+ ) {
+ if ( secTableAnn != null ) {
+ //handle default values
+ if ( StringHelper.isNotEmpty( defaults.getCatalog() )
+ || StringHelper.isNotEmpty( defaults.getSchema() ) ) {
+ AnnotationDescriptor annotation = new AnnotationDescriptor( SecondaryTable.class );
+ annotation.setValue( "name", secTableAnn.name() );
+ annotation.setValue( "schema", secTableAnn.schema() );
+ annotation.setValue( "catalog", secTableAnn.catalog() );
+ annotation.setValue( "uniqueConstraints", secTableAnn.uniqueConstraints() );
+ annotation.setValue( "pkJoinColumns", secTableAnn.pkJoinColumns() );
+ if ( StringHelper.isEmpty( (String) annotation.valueOf( "schema" ) )
+ && StringHelper.isNotEmpty( defaults.getSchema() ) ) {
+ annotation.setValue( "schema", defaults.getSchema() );
+ }
+ if ( StringHelper.isEmpty( (String) annotation.valueOf( "catalog" ) )
+ && StringHelper.isNotEmpty( defaults.getCatalog() ) ) {
+ annotation.setValue( "catalog", defaults.getCatalog() );
+ }
+ secondaryTables.add( (SecondaryTable) AnnotationFactory.create( annotation ) );
+ }
+ else {
+ secondaryTables.add( secTableAnn );
+ }
+ }
+ }
+
+ private static void buildUniqueConstraints(AnnotationDescriptor annotation, Element element) {
+ List uniqueConstraintElementList = element.elements( "unique-constraint" );
+ UniqueConstraint[] uniqueConstraints = new UniqueConstraint[ uniqueConstraintElementList.size() ];
+ int ucIndex = 0;
+ Iterator ucIt = uniqueConstraintElementList.listIterator();
+ while ( ucIt.hasNext() ) {
+ Element subelement = (Element) ucIt.next();
+ List<Element> columnNamesElements = subelement.elements( "column-name" );
+ String[] columnNames = new String[columnNamesElements.size()];
+ int columnNameIndex = 0;
+ Iterator it = columnNamesElements.listIterator();
+ while ( it.hasNext() ) {
+ Element columnNameElt = (Element) it.next();
+ columnNames[columnNameIndex++] = columnNameElt.getTextTrim();
+ }
+ AnnotationDescriptor ucAnn = new AnnotationDescriptor( UniqueConstraint.class );
+ ucAnn.setValue( "columnNames", columnNames );
+ uniqueConstraints[ucIndex++] = AnnotationFactory.create( ucAnn );
+ }
+ annotation.setValue( "uniqueConstraints", uniqueConstraints );
+ }
+
+ private PrimaryKeyJoinColumn[] buildPrimaryKeyJoinColumns(Element element) {
+ if ( element == null ) return new PrimaryKeyJoinColumn[]{};
+ List pkJoinColumnElementList = element.elements( "primary-key-join-column" );
+ PrimaryKeyJoinColumn[] pkJoinColumns = new PrimaryKeyJoinColumn[ pkJoinColumnElementList.size() ];
+ int index = 0;
+ Iterator pkIt = pkJoinColumnElementList.listIterator();
+ while ( pkIt.hasNext() ) {
+ Element subelement = (Element) pkIt.next();
+ AnnotationDescriptor pkAnn = new AnnotationDescriptor( PrimaryKeyJoinColumn.class );
+ copyStringAttribute( pkAnn, subelement, "name", false );
+ copyStringAttribute( pkAnn, subelement, "referenced-column-name", false );
+ copyStringAttribute( pkAnn, subelement, "column-definition", false );
+ pkJoinColumns[index++] = AnnotationFactory.create( pkAnn );
+ }
+ return pkJoinColumns;
+ }
+
+ private static void copyStringAttribute(
+ AnnotationDescriptor annotation, Element element, String attributeName, boolean mandatory
+ ) {
+ String attribute = element.attributeValue( attributeName );
+ if ( attribute != null ) {
+ String annotationAttributeName = getJavaAttributeNameFromXMLOne( attributeName );
+ annotation.setValue( annotationAttributeName, attribute );
+ }
+ else {
+ if ( mandatory ) {
+ throw new AnnotationException(
+ element.getName() + "." + attributeName + " is mandatory in XML overring. " + SCHEMA_VALIDATION
+ );
+ }
+ }
+ }
+
+ private static void copyIntegerAttribute(AnnotationDescriptor annotation, Element element, String attributeName) {
+ String attribute = element.attributeValue( attributeName );
+ if ( attribute != null ) {
+ String annotationAttributeName = getJavaAttributeNameFromXMLOne( attributeName );
+ annotation.setValue( annotationAttributeName, attribute );
+ try {
+ int length = Integer.parseInt( attribute );
+ annotation.setValue( annotationAttributeName, length );
+ }
+ catch (NumberFormatException e) {
+ throw new AnnotationException(
+ element.getPath() + attributeName + " not parseable: " + attribute + " (" + SCHEMA_VALIDATION + ")"
+ );
+ }
+ }
+ }
+
+ private static String getJavaAttributeNameFromXMLOne(String attributeName) {
+ StringBuilder annotationAttributeName = new StringBuilder( attributeName );
+ int index = annotationAttributeName.indexOf( WORD_SEPARATOR );
+ while ( index != -1 ) {
+ annotationAttributeName.deleteCharAt( index );
+ annotationAttributeName.setCharAt(
+ index, Character.toUpperCase( annotationAttributeName.charAt( index ) )
+ );
+ index = annotationAttributeName.indexOf( WORD_SEPARATOR );
+ }
+ return annotationAttributeName.toString();
+ }
+
+ private static void copyStringElement(Element element, AnnotationDescriptor ad, String annotationAttribute) {
+ String discr = element.getTextTrim();
+ ad.setValue( annotationAttribute, discr );
+ }
+
+ private static void copyBooleanAttribute(AnnotationDescriptor descriptor, Element element, String attribute) {
+ String attributeValue = element.attributeValue( attribute );
+ if ( StringHelper.isNotEmpty( attributeValue ) ) {
+ String javaAttribute = getJavaAttributeNameFromXMLOne( attribute );
+ descriptor.setValue( javaAttribute, Boolean.parseBoolean( attributeValue ) );
+ }
+ }
+
+ private <T extends Annotation> T getJavaAnnotation(Class<T> annotationType) {
+ return element.getAnnotation( annotationType );
+ }
+
+ private <T extends Annotation> boolean isJavaAnnotationPresent(Class<T> annotationType) {
+ return element.isAnnotationPresent( annotationType );
+ }
+
+ private Annotation[] getJavaAnnotations() {
+ return element.getAnnotations();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3ReflectionManager.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3ReflectionManager.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3ReflectionManager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,102 +0,0 @@
-package org.hibernate.cfg.annotations.reflection;
-
-import java.lang.reflect.AnnotatedElement;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.persistence.EntityListeners;
-import javax.persistence.NamedNativeQuery;
-import javax.persistence.NamedQuery;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.SqlResultSetMapping;
-import javax.persistence.TableGenerator;
-
-import org.dom4j.Element;
-import org.hibernate.annotations.common.reflection.AnnotationReader;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-import org.hibernate.util.ReflectHelper;
-
-public class EJB3ReflectionManager extends JavaReflectionManager {
-
- private XMLContext xmlContext = new XMLContext();
- private HashMap defaults = null;
-
- public AnnotationReader buildAnnotationReader(AnnotatedElement annotatedElement) {
- if ( xmlContext.hasContext() ) {
- return new EJB3OverridenAnnotationReader(annotatedElement, xmlContext);
- }
- else {
- return super.buildAnnotationReader(annotatedElement);
- }
- }
-
- public Map getDefaults() {
- if (defaults == null) {
- defaults = new HashMap();
- XMLContext.Default xmlDefaults = xmlContext.getDefault( null );
- List<Class> entityListeners = new ArrayList<Class>();
- for ( String className : xmlContext.getDefaultEntityListeners() ) {
- try {
- entityListeners.add( ReflectHelper.classForName( className, this.getClass() ) );
- }
- catch (ClassNotFoundException e) {
- throw new IllegalStateException( "Default entity listener class not found: " + className );
- }
- }
- defaults.put( EntityListeners.class, entityListeners );
- for( Element element : xmlContext.getAllDocuments() ) {
-
- List<Element> elements = element.elements( "sequence-generator" );
- List<SequenceGenerator> sequenceGenerators = (List<SequenceGenerator>) defaults.get(SequenceGenerator.class);
- if (sequenceGenerators == null) {
- sequenceGenerators = new ArrayList<SequenceGenerator>();
- defaults.put( SequenceGenerator.class, sequenceGenerators );
- }
- for (Element subelement : elements) {
- sequenceGenerators.add( EJB3OverridenAnnotationReader.buildSequenceGeneratorAnnotation( subelement ) );
- }
-
- elements = element.elements( "table-generator" );
- List<TableGenerator> tableGenerators = (List<TableGenerator>) defaults.get(TableGenerator.class);
- if (tableGenerators == null) {
- tableGenerators = new ArrayList<TableGenerator>();
- defaults.put( TableGenerator.class, tableGenerators );
- }
- for (Element subelement : elements) {
- tableGenerators.add( EJB3OverridenAnnotationReader.buildTableGeneratorAnnotation( subelement, xmlDefaults ) );
- }
-
- List<NamedQuery> namedQueries = (List<NamedQuery>) defaults.get(NamedQuery.class);
- if (namedQueries == null) {
- namedQueries = new ArrayList<NamedQuery>();
- defaults.put( NamedQuery.class, namedQueries );
- }
- List<NamedQuery> currentNamedQueries = EJB3OverridenAnnotationReader.buildNamedQueries(element, false, xmlDefaults);
- namedQueries.addAll( currentNamedQueries );
-
- List<NamedNativeQuery> namedNativeQueries = (List<NamedNativeQuery>) defaults.get(NamedNativeQuery.class);
- if (namedNativeQueries == null) {
- namedNativeQueries = new ArrayList<NamedNativeQuery>();
- defaults.put( NamedNativeQuery.class, namedNativeQueries );
- }
- List<NamedNativeQuery> currentNamedNativeQueries = EJB3OverridenAnnotationReader.buildNamedQueries(element, true, xmlDefaults);
- namedNativeQueries.addAll( currentNamedNativeQueries );
-
- List<SqlResultSetMapping> sqlResultSetMappings = (List<SqlResultSetMapping>) defaults.get(SqlResultSetMapping.class);
- if (sqlResultSetMappings == null) {
- sqlResultSetMappings = new ArrayList<SqlResultSetMapping>();
- defaults.put( SqlResultSetMapping.class, sqlResultSetMappings );
- }
- List<SqlResultSetMapping> currentSqlResultSetMappings = EJB3OverridenAnnotationReader.buildSqlResultsetMappings(element, xmlDefaults);
- sqlResultSetMappings.addAll( currentSqlResultSetMappings );
- }
- }
- return defaults;
- }
-
- public XMLContext getXMLContext() {
- return xmlContext;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3ReflectionManager.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3ReflectionManager.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3ReflectionManager.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/EJB3ReflectionManager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,102 @@
+package org.hibernate.cfg.annotations.reflection;
+
+import java.lang.reflect.AnnotatedElement;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.EntityListeners;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.NamedQuery;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.SqlResultSetMapping;
+import javax.persistence.TableGenerator;
+
+import org.dom4j.Element;
+import org.hibernate.annotations.common.reflection.AnnotationReader;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+import org.hibernate.util.ReflectHelper;
+
+public class EJB3ReflectionManager extends JavaReflectionManager {
+
+ private XMLContext xmlContext = new XMLContext();
+ private HashMap defaults = null;
+
+ public AnnotationReader buildAnnotationReader(AnnotatedElement annotatedElement) {
+ if ( xmlContext.hasContext() ) {
+ return new EJB3OverridenAnnotationReader(annotatedElement, xmlContext);
+ }
+ else {
+ return super.buildAnnotationReader(annotatedElement);
+ }
+ }
+
+ public Map getDefaults() {
+ if (defaults == null) {
+ defaults = new HashMap();
+ XMLContext.Default xmlDefaults = xmlContext.getDefault( null );
+ List<Class> entityListeners = new ArrayList<Class>();
+ for ( String className : xmlContext.getDefaultEntityListeners() ) {
+ try {
+ entityListeners.add( ReflectHelper.classForName( className, this.getClass() ) );
+ }
+ catch (ClassNotFoundException e) {
+ throw new IllegalStateException( "Default entity listener class not found: " + className );
+ }
+ }
+ defaults.put( EntityListeners.class, entityListeners );
+ for( Element element : xmlContext.getAllDocuments() ) {
+
+ List<Element> elements = element.elements( "sequence-generator" );
+ List<SequenceGenerator> sequenceGenerators = (List<SequenceGenerator>) defaults.get(SequenceGenerator.class);
+ if (sequenceGenerators == null) {
+ sequenceGenerators = new ArrayList<SequenceGenerator>();
+ defaults.put( SequenceGenerator.class, sequenceGenerators );
+ }
+ for (Element subelement : elements) {
+ sequenceGenerators.add( EJB3OverridenAnnotationReader.buildSequenceGeneratorAnnotation( subelement ) );
+ }
+
+ elements = element.elements( "table-generator" );
+ List<TableGenerator> tableGenerators = (List<TableGenerator>) defaults.get(TableGenerator.class);
+ if (tableGenerators == null) {
+ tableGenerators = new ArrayList<TableGenerator>();
+ defaults.put( TableGenerator.class, tableGenerators );
+ }
+ for (Element subelement : elements) {
+ tableGenerators.add( EJB3OverridenAnnotationReader.buildTableGeneratorAnnotation( subelement, xmlDefaults ) );
+ }
+
+ List<NamedQuery> namedQueries = (List<NamedQuery>) defaults.get(NamedQuery.class);
+ if (namedQueries == null) {
+ namedQueries = new ArrayList<NamedQuery>();
+ defaults.put( NamedQuery.class, namedQueries );
+ }
+ List<NamedQuery> currentNamedQueries = EJB3OverridenAnnotationReader.buildNamedQueries(element, false, xmlDefaults);
+ namedQueries.addAll( currentNamedQueries );
+
+ List<NamedNativeQuery> namedNativeQueries = (List<NamedNativeQuery>) defaults.get(NamedNativeQuery.class);
+ if (namedNativeQueries == null) {
+ namedNativeQueries = new ArrayList<NamedNativeQuery>();
+ defaults.put( NamedNativeQuery.class, namedNativeQueries );
+ }
+ List<NamedNativeQuery> currentNamedNativeQueries = EJB3OverridenAnnotationReader.buildNamedQueries(element, true, xmlDefaults);
+ namedNativeQueries.addAll( currentNamedNativeQueries );
+
+ List<SqlResultSetMapping> sqlResultSetMappings = (List<SqlResultSetMapping>) defaults.get(SqlResultSetMapping.class);
+ if (sqlResultSetMappings == null) {
+ sqlResultSetMappings = new ArrayList<SqlResultSetMapping>();
+ defaults.put( SqlResultSetMapping.class, sqlResultSetMappings );
+ }
+ List<SqlResultSetMapping> currentSqlResultSetMappings = EJB3OverridenAnnotationReader.buildSqlResultsetMappings(element, xmlDefaults);
+ sqlResultSetMappings.addAll( currentSqlResultSetMappings );
+ }
+ }
+ return defaults;
+ }
+
+ public XMLContext getXMLContext() {
+ return xmlContext;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/XMLContext.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/XMLContext.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/XMLContext.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,255 +0,0 @@
-//$Id: $
-package org.hibernate.cfg.annotations.reflection;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.ArrayList;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.dom4j.Document;
-import org.dom4j.Element;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class XMLContext {
- private static Log log = LogFactory.getLog( XMLContext.class );
- private Default globalDefaults;
- private Map<String, Element> classOverriding = new HashMap<String, Element>();
- private Map<String, Default> defaultsOverriding = new HashMap<String, Default>();
- private List<Element> defaultElements = new ArrayList<Element>();
- private List<String> defaultEntityListeners = new ArrayList<String>();
- private boolean hasContext = false;
-
- /**
- * Add a document and return the list of added classes names
- */
- public List<String> addDocument(Document doc) {
- hasContext = true;
- List<String> addedClasses = new ArrayList<String>();
- Element root = doc.getRootElement();
- //global defaults
- Element metadata = root.element( "persistence-unit-metadata" );
- if ( metadata != null ) {
- if ( globalDefaults == null ) {
- globalDefaults = new Default();
- globalDefaults.setMetadataComplete(
- metadata.element( "xml-mapping-metadata-complete" ) != null ?
- Boolean.TRUE :
- null
- );
- Element defaultElement = metadata.element( "persistence-unit-defaults" );
- if ( defaultElement != null ) {
- Element unitElement = defaultElement.element( "schema" );
- globalDefaults.setSchema( unitElement != null ? unitElement.getTextTrim() : null );
- unitElement = defaultElement.element( "catalog" );
- globalDefaults.setCatalog( unitElement != null ? unitElement.getTextTrim() : null );
- unitElement = defaultElement.element( "access" );
- globalDefaults.setAccess( unitElement != null ? unitElement.getTextTrim() : null );
- unitElement = defaultElement.element( "cascade-persist" );
- globalDefaults.setCascadePersist( unitElement != null ? Boolean.TRUE : null );
- defaultEntityListeners.addAll( addEntityListenerClasses( defaultElement, null, addedClasses ) );
- }
- }
- else {
- log.warn( "Found more than one <persistence-unit-metadata>, subsequent ignored" );
- }
- }
-
- //entity mapping default
- Default entityMappingDefault = new Default();
- Element unitElement = root.element( "package" );
- String packageName = unitElement != null ? unitElement.getTextTrim() : null;
- entityMappingDefault.setPackageName( packageName );
- unitElement = root.element( "schema" );
- entityMappingDefault.setSchema( unitElement != null ? unitElement.getTextTrim() : null );
- unitElement = root.element( "catalog" );
- entityMappingDefault.setCatalog( unitElement != null ? unitElement.getTextTrim() : null );
- unitElement = root.element( "access" );
- entityMappingDefault.setAccess( unitElement != null ? unitElement.getTextTrim() : null );
- defaultElements.add(root);
-
- List<Element> entities = (List<Element>) root.elements( "entity" );
- addClass( entities, packageName, entityMappingDefault, addedClasses );
-
- entities = (List<Element>) root.elements( "mapped-superclass" );
- addClass( entities, packageName, entityMappingDefault, addedClasses );
-
- entities = (List<Element>) root.elements( "embeddable" );
- addClass( entities, packageName, entityMappingDefault, addedClasses );
- return addedClasses;
- }
-
- private void addClass(List<Element> entities, String packageName, Default defaults, List<String> addedClasses) {
- for ( Element element : entities ) {
- String className = buildSafeClassName( element.attributeValue( "class" ), packageName );
- if ( classOverriding.containsKey( className ) ) {
- //maybe switch it to warn?
- throw new IllegalStateException( "Duplicate XML entry for " + className );
- }
- addedClasses.add( className );
- classOverriding.put( className, element );
- Default localDefault = new Default();
- localDefault.override( defaults );
- String metadataCompleteString = element.attributeValue( "metadata-complete" );
- if ( metadataCompleteString != null ) {
- localDefault.setMetadataComplete( Boolean.parseBoolean( metadataCompleteString ) );
- }
- String access = element.attributeValue( "access" );
- if ( access != null ) localDefault.setAccess( access );
- defaultsOverriding.put( className, localDefault );
-
- log.debug( "Adding XML overriding information for " + className );
- addEntityListenerClasses( element, packageName, addedClasses );
- }
- }
-
- private List<String> addEntityListenerClasses(Element element, String packageName, List<String> addedClasses) {
- List<String> localAddedClasses = new ArrayList<String>();
- Element listeners = element.element( "entity-listeners" );
- if (listeners != null) {
- List<Element> elements = (List<Element>) listeners.elements( "entity-listener" );
- for ( Element listener : elements ) {
- String listenerClassName = buildSafeClassName( listener.attributeValue( "class" ), packageName );
- if ( classOverriding.containsKey( listenerClassName ) ) {
- //maybe switch it to warn?
- if ( "entity-listener".equals( classOverriding.get( listenerClassName).getName() ) ) {
- log.info(
- "entity-listener duplication, first event definition will be used: "
- + listenerClassName
- );
- continue;
- }
- else {
- throw new IllegalStateException( "Duplicate XML entry for " + listenerClassName );
- }
- }
- localAddedClasses.add( listenerClassName );
- classOverriding.put( listenerClassName, listener );
- }
- }
- log.debug( "Adding XML overriding information for listener: " + listeners );
- addedClasses.addAll( localAddedClasses );
- return localAddedClasses;
- }
-
- public static String buildSafeClassName(String className, String defaultPackageName) {
- if ( className.indexOf( '.' ) < 0 && StringHelper.isNotEmpty( defaultPackageName ) ) {
- className = StringHelper.qualify( defaultPackageName, className );
- }
- return className;
- }
-
- public static String buildSafeClassName(String className, XMLContext.Default defaults) {
- return buildSafeClassName( className, defaults.getPackageName() );
- }
-
- public Default getDefault(String className) {
- Default xmlDefault = new Default();
- xmlDefault.override( globalDefaults );
- if (className != null) {
- Default entityMappingOverriding = defaultsOverriding.get( className );
- xmlDefault.override( entityMappingOverriding );
- }
- return xmlDefault;
- }
-
- public Element getXMLTree(String className, String methodName) {
- return classOverriding.get( className );
- }
-
- public List<Element> getAllDocuments() {
- return defaultElements;
- }
-
- public boolean hasContext() {
- return hasContext;
- }
-
- public static class Default {
- private String access;
- private String packageName;
- private String schema;
- private String catalog;
- private Boolean metadataComplete;
- private Boolean cascadePersist;
-
- public String getAccess() {
- return access;
- }
-
- protected void setAccess(String access) {
- if ( "FIELD".equals( access ) || "PROPERTY".equals( access ) ) {
- this.access = access.toLowerCase();
- }
- else {
- this.access = access;
- }
- }
-
- public String getCatalog() {
- return catalog;
- }
-
- protected void setCatalog(String catalog) {
- this.catalog = catalog;
- }
-
- public String getPackageName() {
- return packageName;
- }
-
- protected void setPackageName(String packageName) {
- this.packageName = packageName;
- }
-
- public String getSchema() {
- return schema;
- }
-
- protected void setSchema(String schema) {
- this.schema = schema;
- }
-
- public Boolean getMetadataComplete() {
- return metadataComplete;
- }
-
- public boolean canUseJavaAnnotations() {
- return metadataComplete == null || ! metadataComplete.booleanValue();
- }
-
- protected void setMetadataComplete(Boolean metadataComplete) {
- this.metadataComplete = metadataComplete;
- }
-
- public Boolean getCascadePersist() {
- return cascadePersist;
- }
-
- void setCascadePersist(Boolean cascadePersist) {
- this.cascadePersist = cascadePersist;
- }
-
- public void override(Default globalDefault) {
- if ( globalDefault != null ) {
- if ( globalDefault.getAccess() != null ) access = globalDefault.getAccess();
- if ( globalDefault.getPackageName() != null ) packageName = globalDefault.getPackageName();
- if ( globalDefault.getSchema() != null ) schema = globalDefault.getSchema();
- if ( globalDefault.getCatalog() != null ) catalog = globalDefault.getCatalog();
- if ( globalDefault.getMetadataComplete() != null ) {
- metadataComplete = globalDefault.getMetadataComplete();
- }
- //TODO fix that in stone if cascade-persist is set already?
- if ( globalDefault.getCascadePersist() != null ) cascadePersist = globalDefault.getCascadePersist();
- }
- }
- }
-
- public List<String> getDefaultEntityListeners() {
- return defaultEntityListeners;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/XMLContext.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/XMLContext.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/XMLContext.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/cfg/annotations/reflection/XMLContext.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,255 @@
+//$Id: $
+package org.hibernate.cfg.annotations.reflection;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.ArrayList;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.dom4j.Document;
+import org.dom4j.Element;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class XMLContext {
+ private static Log log = LogFactory.getLog( XMLContext.class );
+ private Default globalDefaults;
+ private Map<String, Element> classOverriding = new HashMap<String, Element>();
+ private Map<String, Default> defaultsOverriding = new HashMap<String, Default>();
+ private List<Element> defaultElements = new ArrayList<Element>();
+ private List<String> defaultEntityListeners = new ArrayList<String>();
+ private boolean hasContext = false;
+
+ /**
+ * Add a document and return the list of added classes names
+ */
+ public List<String> addDocument(Document doc) {
+ hasContext = true;
+ List<String> addedClasses = new ArrayList<String>();
+ Element root = doc.getRootElement();
+ //global defaults
+ Element metadata = root.element( "persistence-unit-metadata" );
+ if ( metadata != null ) {
+ if ( globalDefaults == null ) {
+ globalDefaults = new Default();
+ globalDefaults.setMetadataComplete(
+ metadata.element( "xml-mapping-metadata-complete" ) != null ?
+ Boolean.TRUE :
+ null
+ );
+ Element defaultElement = metadata.element( "persistence-unit-defaults" );
+ if ( defaultElement != null ) {
+ Element unitElement = defaultElement.element( "schema" );
+ globalDefaults.setSchema( unitElement != null ? unitElement.getTextTrim() : null );
+ unitElement = defaultElement.element( "catalog" );
+ globalDefaults.setCatalog( unitElement != null ? unitElement.getTextTrim() : null );
+ unitElement = defaultElement.element( "access" );
+ globalDefaults.setAccess( unitElement != null ? unitElement.getTextTrim() : null );
+ unitElement = defaultElement.element( "cascade-persist" );
+ globalDefaults.setCascadePersist( unitElement != null ? Boolean.TRUE : null );
+ defaultEntityListeners.addAll( addEntityListenerClasses( defaultElement, null, addedClasses ) );
+ }
+ }
+ else {
+ log.warn( "Found more than one <persistence-unit-metadata>, subsequent ignored" );
+ }
+ }
+
+ //entity mapping default
+ Default entityMappingDefault = new Default();
+ Element unitElement = root.element( "package" );
+ String packageName = unitElement != null ? unitElement.getTextTrim() : null;
+ entityMappingDefault.setPackageName( packageName );
+ unitElement = root.element( "schema" );
+ entityMappingDefault.setSchema( unitElement != null ? unitElement.getTextTrim() : null );
+ unitElement = root.element( "catalog" );
+ entityMappingDefault.setCatalog( unitElement != null ? unitElement.getTextTrim() : null );
+ unitElement = root.element( "access" );
+ entityMappingDefault.setAccess( unitElement != null ? unitElement.getTextTrim() : null );
+ defaultElements.add(root);
+
+ List<Element> entities = (List<Element>) root.elements( "entity" );
+ addClass( entities, packageName, entityMappingDefault, addedClasses );
+
+ entities = (List<Element>) root.elements( "mapped-superclass" );
+ addClass( entities, packageName, entityMappingDefault, addedClasses );
+
+ entities = (List<Element>) root.elements( "embeddable" );
+ addClass( entities, packageName, entityMappingDefault, addedClasses );
+ return addedClasses;
+ }
+
+ private void addClass(List<Element> entities, String packageName, Default defaults, List<String> addedClasses) {
+ for ( Element element : entities ) {
+ String className = buildSafeClassName( element.attributeValue( "class" ), packageName );
+ if ( classOverriding.containsKey( className ) ) {
+ //maybe switch it to warn?
+ throw new IllegalStateException( "Duplicate XML entry for " + className );
+ }
+ addedClasses.add( className );
+ classOverriding.put( className, element );
+ Default localDefault = new Default();
+ localDefault.override( defaults );
+ String metadataCompleteString = element.attributeValue( "metadata-complete" );
+ if ( metadataCompleteString != null ) {
+ localDefault.setMetadataComplete( Boolean.parseBoolean( metadataCompleteString ) );
+ }
+ String access = element.attributeValue( "access" );
+ if ( access != null ) localDefault.setAccess( access );
+ defaultsOverriding.put( className, localDefault );
+
+ log.debug( "Adding XML overriding information for " + className );
+ addEntityListenerClasses( element, packageName, addedClasses );
+ }
+ }
+
+ private List<String> addEntityListenerClasses(Element element, String packageName, List<String> addedClasses) {
+ List<String> localAddedClasses = new ArrayList<String>();
+ Element listeners = element.element( "entity-listeners" );
+ if (listeners != null) {
+ List<Element> elements = (List<Element>) listeners.elements( "entity-listener" );
+ for ( Element listener : elements ) {
+ String listenerClassName = buildSafeClassName( listener.attributeValue( "class" ), packageName );
+ if ( classOverriding.containsKey( listenerClassName ) ) {
+ //maybe switch it to warn?
+ if ( "entity-listener".equals( classOverriding.get( listenerClassName).getName() ) ) {
+ log.info(
+ "entity-listener duplication, first event definition will be used: "
+ + listenerClassName
+ );
+ continue;
+ }
+ else {
+ throw new IllegalStateException( "Duplicate XML entry for " + listenerClassName );
+ }
+ }
+ localAddedClasses.add( listenerClassName );
+ classOverriding.put( listenerClassName, listener );
+ }
+ }
+ log.debug( "Adding XML overriding information for listener: " + listeners );
+ addedClasses.addAll( localAddedClasses );
+ return localAddedClasses;
+ }
+
+ public static String buildSafeClassName(String className, String defaultPackageName) {
+ if ( className.indexOf( '.' ) < 0 && StringHelper.isNotEmpty( defaultPackageName ) ) {
+ className = StringHelper.qualify( defaultPackageName, className );
+ }
+ return className;
+ }
+
+ public static String buildSafeClassName(String className, XMLContext.Default defaults) {
+ return buildSafeClassName( className, defaults.getPackageName() );
+ }
+
+ public Default getDefault(String className) {
+ Default xmlDefault = new Default();
+ xmlDefault.override( globalDefaults );
+ if (className != null) {
+ Default entityMappingOverriding = defaultsOverriding.get( className );
+ xmlDefault.override( entityMappingOverriding );
+ }
+ return xmlDefault;
+ }
+
+ public Element getXMLTree(String className, String methodName) {
+ return classOverriding.get( className );
+ }
+
+ public List<Element> getAllDocuments() {
+ return defaultElements;
+ }
+
+ public boolean hasContext() {
+ return hasContext;
+ }
+
+ public static class Default {
+ private String access;
+ private String packageName;
+ private String schema;
+ private String catalog;
+ private Boolean metadataComplete;
+ private Boolean cascadePersist;
+
+ public String getAccess() {
+ return access;
+ }
+
+ protected void setAccess(String access) {
+ if ( "FIELD".equals( access ) || "PROPERTY".equals( access ) ) {
+ this.access = access.toLowerCase();
+ }
+ else {
+ this.access = access;
+ }
+ }
+
+ public String getCatalog() {
+ return catalog;
+ }
+
+ protected void setCatalog(String catalog) {
+ this.catalog = catalog;
+ }
+
+ public String getPackageName() {
+ return packageName;
+ }
+
+ protected void setPackageName(String packageName) {
+ this.packageName = packageName;
+ }
+
+ public String getSchema() {
+ return schema;
+ }
+
+ protected void setSchema(String schema) {
+ this.schema = schema;
+ }
+
+ public Boolean getMetadataComplete() {
+ return metadataComplete;
+ }
+
+ public boolean canUseJavaAnnotations() {
+ return metadataComplete == null || ! metadataComplete.booleanValue();
+ }
+
+ protected void setMetadataComplete(Boolean metadataComplete) {
+ this.metadataComplete = metadataComplete;
+ }
+
+ public Boolean getCascadePersist() {
+ return cascadePersist;
+ }
+
+ void setCascadePersist(Boolean cascadePersist) {
+ this.cascadePersist = cascadePersist;
+ }
+
+ public void override(Default globalDefault) {
+ if ( globalDefault != null ) {
+ if ( globalDefault.getAccess() != null ) access = globalDefault.getAccess();
+ if ( globalDefault.getPackageName() != null ) packageName = globalDefault.getPackageName();
+ if ( globalDefault.getSchema() != null ) schema = globalDefault.getSchema();
+ if ( globalDefault.getCatalog() != null ) catalog = globalDefault.getCatalog();
+ if ( globalDefault.getMetadataComplete() != null ) {
+ metadataComplete = globalDefault.getMetadataComplete();
+ }
+ //TODO fix that in stone if cascade-persist is set already?
+ if ( globalDefault.getCascadePersist() != null ) cascadePersist = globalDefault.getCascadePersist();
+ }
+ }
+ }
+
+ public List<String> getDefaultEntityListeners() {
+ return defaultEntityListeners;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/ejb (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/ejb)
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/ejb/orm_1_0.xsd
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/ejb/orm_1_0.xsd 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/ejb/orm_1_0.xsd 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,1516 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- Java Persistence API object-relational mapping file schema -->
-<xsd:schema targetNamespace="http://java.sun.com/xml/ns/persistence/orm"
- xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
- xmlns:xsd="http://www.w3.org/2001/XMLSchema"
- elementFormDefault="qualified"
- attributeFormDefault="unqualified"
- version="1.0">
-
- <xsd:annotation>
- <xsd:documentation>
- @(#)orm_1_0.xsd 1.0 Feb 14 2006
- </xsd:documentation>
- </xsd:annotation>
- <xsd:annotation>
- <xsd:documentation><![CDATA[
-
- This is the XML Schema for the persistence object-relational
- mapping file.
- The file may be named "META-INF/orm.xml" in the persistence
- archive or it may be named some other name which would be
- used to locate the file as resource on the classpath.
-
- ]]></xsd:documentation>
- </xsd:annotation>
-
- <xsd:complexType name="emptyType"/>
-
- <xsd:simpleType name="versionType">
- <xsd:restriction base="xsd:token">
- <xsd:pattern value="[0-9]+(\.[0-9]+)*"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:element name="entity-mappings">
- <xsd:complexType>
- <xsd:annotation>
- <xsd:documentation>
-
- The entity-mappings element is the root element of an mapping
- file. It contains the following four types of elements:
-
- 1. The persistence-unit-metadata element contains metadata
- for the entire persistence unit. It is undefined if this element
- occurs in multiple mapping files within the same persistence unit.
-
- 2. The package, schema, catalog and access elements apply to all of
- the entity, mapped-superclass and embeddable elements defined in
- the same file in which they occur.
-
- 3. The sequence-generator, table-generator, named-query,
- named-native-query and sql-result-set-mapping elements are global
- to the persistence unit. It is undefined to have more than one
- sequence-generator or table-generator of the same name in the same
- or different mapping files in a persistence unit. It is also
- undefined to have more than one named-query or named-native-query
- of the same name in the same or different mapping files in a
- persistence unit.
-
- 4. The entity, mapped-superclass and embeddable elements each define
- the mapping information for a managed persistent class. The mapping
- information contained in these elements may be complete or it may
- be partial.
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="description" type="xsd:string"
- minOccurs="0"/>
- <xsd:element name="persistence-unit-metadata"
- type="orm:persistence-unit-metadata"
- minOccurs="0"/>
- <xsd:element name="package" type="xsd:string"
- minOccurs="0"/>
- <xsd:element name="schema" type="xsd:string"
- minOccurs="0"/>
- <xsd:element name="catalog" type="xsd:string"
- minOccurs="0"/>
- <xsd:element name="access" type="orm:access-type"
- minOccurs="0"/>
- <xsd:element name="sequence-generator" type="orm:sequence-generator"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="table-generator" type="orm:table-generator"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="named-query" type="orm:named-query"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="named-native-query" type="orm:named-native-query"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="sql-result-set-mapping"
- type="orm:sql-result-set-mapping"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="mapped-superclass" type="orm:mapped-superclass"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="entity" type="orm:entity"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="embeddable" type="orm:embeddable"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="version" type="orm:versionType"
- fixed="1.0" use="required"/>
- </xsd:complexType>
- </xsd:element>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="persistence-unit-metadata">
- <xsd:annotation>
- <xsd:documentation>
-
- Metadata that applies to the persistence unit and not just to
- the mapping file in which it is contained.
-
- If the xml-mapping-metadata-complete element is specified then
- the complete set of mapping metadata for the persistence unit
- is contained in the XML mapping files for the persistence unit.
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="xml-mapping-metadata-complete" type="orm:emptyType"
- minOccurs="0"/>
- <xsd:element name="persistence-unit-defaults"
- type="orm:persistence-unit-defaults"
- minOccurs="0"/>
- </xsd:sequence>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="persistence-unit-defaults">
- <xsd:annotation>
- <xsd:documentation>
-
- These defaults are applied to the persistence unit as a whole
- unless they are overridden by local annotation or XML
- element settings.
-
- schema - Used as the schema for all tables or secondary tables
- that apply to the persistence unit
- catalog - Used as the catalog for all tables or secondary tables
- that apply to the persistence unit
- access - Used as the access type for all managed classes in
- the persistence unit
- cascade-persist - Adds cascade-persist to the set of cascade options
- in entity relationships of the persistence unit
- entity-listeners - List of default entity listeners to be invoked
- on each entity in the persistence unit.
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="schema" type="xsd:string"
- minOccurs="0"/>
- <xsd:element name="catalog" type="xsd:string"
- minOccurs="0"/>
- <xsd:element name="access" type="orm:access-type"
- minOccurs="0"/>
- <xsd:element name="cascade-persist" type="orm:emptyType"
- minOccurs="0"/>
- <xsd:element name="entity-listeners" type="orm:entity-listeners"
- minOccurs="0"/>
- </xsd:sequence>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="entity">
- <xsd:annotation>
- <xsd:documentation>
-
- Defines the settings and mappings for an entity. Is allowed to be
- sparsely populated and used in conjunction with the annotations.
- Alternatively, the metadata-complete attribute can be used to
- indicate that no annotations on the entity class (and its fields
- or properties) are to be processed. If this is the case then
- the defaulting rules for the entity and its subelements will
- be recursively applied.
-
- @Target(TYPE) @Retention(RUNTIME)
- public @interface Entity {
- String name() default "";
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="description" type="xsd:string" minOccurs="0"/>
- <xsd:element name="table" type="orm:table"
- minOccurs="0"/>
- <xsd:element name="secondary-table" type="orm:secondary-table"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="primary-key-join-column"
- type="orm:primary-key-join-column"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="id-class" type="orm:id-class" minOccurs="0"/>
- <xsd:element name="inheritance" type="orm:inheritance" minOccurs="0"/>
- <xsd:element name="discriminator-value" type="orm:discriminator-value"
- minOccurs="0"/>
- <xsd:element name="discriminator-column"
- type="orm:discriminator-column"
- minOccurs="0"/>
- <xsd:element name="sequence-generator" type="orm:sequence-generator"
- minOccurs="0"/>
- <xsd:element name="table-generator" type="orm:table-generator"
- minOccurs="0"/>
- <xsd:element name="named-query" type="orm:named-query"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="named-native-query" type="orm:named-native-query"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="sql-result-set-mapping"
- type="orm:sql-result-set-mapping"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="exclude-default-listeners" type="orm:emptyType"
- minOccurs="0"/>
- <xsd:element name="exclude-superclass-listeners" type="orm:emptyType"
- minOccurs="0"/>
- <xsd:element name="entity-listeners" type="orm:entity-listeners"
- minOccurs="0"/>
- <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/>
- <xsd:element name="post-persist" type="orm:post-persist"
- minOccurs="0"/>
- <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/>
- <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/>
- <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/>
- <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/>
- <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/>
- <xsd:element name="attribute-override" type="orm:attribute-override"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="association-override"
- type="orm:association-override"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="attributes" type="orm:attributes" minOccurs="0"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string"/>
- <xsd:attribute name="class" type="xsd:string" use="required"/>
- <xsd:attribute name="access" type="orm:access-type"/>
- <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="attributes">
- <xsd:annotation>
- <xsd:documentation>
-
- This element contains the entity field or property mappings.
- It may be sparsely populated to include only a subset of the
- fields or properties. If metadata-complete for the entity is true
- then the remainder of the attributes will be defaulted according
- to the default rules.
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:choice>
- <xsd:element name="id" type="orm:id"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="embedded-id" type="orm:embedded-id"
- minOccurs="0"/>
- </xsd:choice>
- <xsd:element name="basic" type="orm:basic"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="version" type="orm:version"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="many-to-one" type="orm:many-to-one"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="one-to-many" type="orm:one-to-many"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="one-to-one" type="orm:one-to-one"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="many-to-many" type="orm:many-to-many"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="embedded" type="orm:embedded"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="transient" type="orm:transient"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="access-type">
- <xsd:annotation>
- <xsd:documentation>
-
- This element determines how the persistence provider accesses the
- state of an entity or embedded object.
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="PROPERTY"/>
- <xsd:enumeration value="FIELD"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="entity-listeners">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface EntityListeners {
- Class[] value();
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="entity-listener" type="orm:entity-listener"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="entity-listener">
- <xsd:annotation>
- <xsd:documentation>
-
- Defines an entity listener to be invoked at lifecycle events
- for the entities that list this listener.
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/>
- <xsd:element name="post-persist" type="orm:post-persist"
- minOccurs="0"/>
- <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/>
- <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/>
- <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/>
- <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/>
- <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/>
- </xsd:sequence>
- <xsd:attribute name="class" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="pre-persist">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD}) @Retention(RUNTIME)
- public @interface PrePersist {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="method-name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="post-persist">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD}) @Retention(RUNTIME)
- public @interface PostPersist {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="method-name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="pre-remove">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD}) @Retention(RUNTIME)
- public @interface PreRemove {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="method-name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="post-remove">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD}) @Retention(RUNTIME)
- public @interface PostRemove {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="method-name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="pre-update">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD}) @Retention(RUNTIME)
- public @interface PreUpdate {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="method-name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="post-update">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD}) @Retention(RUNTIME)
- public @interface PostUpdate {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="method-name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="post-load">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD}) @Retention(RUNTIME)
- public @interface PostLoad {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="method-name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="query-hint">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({}) @Retention(RUNTIME)
- public @interface QueryHint {
- String name();
- String value();
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="value" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="named-query">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface NamedQuery {
- String name();
- String query();
- QueryHint[] hints() default {};
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="query" type="xsd:string"/>
- <xsd:element name="hint" type="orm:query-hint"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="named-native-query">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface NamedNativeQuery {
- String name();
- String query();
- QueryHint[] hints() default {};
- Class resultClass() default void.class;
- String resultSetMapping() default ""; //named SqlResultSetMapping
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="query" type="xsd:string"/>
- <xsd:element name="hint" type="orm:query-hint"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="result-class" type="xsd:string"/>
- <xsd:attribute name="result-set-mapping" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="sql-result-set-mapping">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface SqlResultSetMapping {
- String name();
- EntityResult[] entities() default {};
- ColumnResult[] columns() default {};
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="entity-result" type="orm:entity-result"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="column-result" type="orm:column-result"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="entity-result">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({}) @Retention(RUNTIME)
- public @interface EntityResult {
- Class entityClass();
- FieldResult[] fields() default {};
- String discriminatorColumn() default "";
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="field-result" type="orm:field-result"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="entity-class" type="xsd:string" use="required"/>
- <xsd:attribute name="discriminator-column" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="field-result">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({}) @Retention(RUNTIME)
- public @interface FieldResult {
- String name();
- String column();
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="column" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="column-result">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({}) @Retention(RUNTIME)
- public @interface ColumnResult {
- String name();
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="table">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface Table {
- String name() default "";
- String catalog() default "";
- String schema() default "";
- UniqueConstraint[] uniqueConstraints() default {};
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="unique-constraint" type="orm:unique-constraint"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string"/>
- <xsd:attribute name="catalog" type="xsd:string"/>
- <xsd:attribute name="schema" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="secondary-table">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface SecondaryTable {
- String name();
- String catalog() default "";
- String schema() default "";
- PrimaryKeyJoinColumn[] pkJoinColumns() default {};
- UniqueConstraint[] uniqueConstraints() default {};
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="primary-key-join-column"
- type="orm:primary-key-join-column"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="unique-constraint" type="orm:unique-constraint"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="catalog" type="xsd:string"/>
- <xsd:attribute name="schema" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="unique-constraint">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({}) @Retention(RUNTIME)
- public @interface UniqueConstraint {
- String[] columnNames();
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="column-name" type="xsd:string"
- maxOccurs="unbounded"/>
- </xsd:sequence>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="column">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface Column {
- String name() default "";
- boolean unique() default false;
- boolean nullable() default true;
- boolean insertable() default true;
- boolean updatable() default true;
- String columnDefinition() default "";
- String table() default "";
- int length() default 255;
- int precision() default 0; // decimal precision
- int scale() default 0; // decimal scale
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="name" type="xsd:string"/>
- <xsd:attribute name="unique" type="xsd:boolean"/>
- <xsd:attribute name="nullable" type="xsd:boolean"/>
- <xsd:attribute name="insertable" type="xsd:boolean"/>
- <xsd:attribute name="updatable" type="xsd:boolean"/>
- <xsd:attribute name="column-definition" type="xsd:string"/>
- <xsd:attribute name="table" type="xsd:string"/>
- <xsd:attribute name="length" type="xsd:int"/>
- <xsd:attribute name="precision" type="xsd:int"/>
- <xsd:attribute name="scale" type="xsd:int"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="join-column">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface JoinColumn {
- String name() default "";
- String referencedColumnName() default "";
- boolean unique() default false;
- boolean nullable() default true;
- boolean insertable() default true;
- boolean updatable() default true;
- String columnDefinition() default "";
- String table() default "";
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="name" type="xsd:string"/>
- <xsd:attribute name="referenced-column-name" type="xsd:string"/>
- <xsd:attribute name="unique" type="xsd:boolean"/>
- <xsd:attribute name="nullable" type="xsd:boolean"/>
- <xsd:attribute name="insertable" type="xsd:boolean"/>
- <xsd:attribute name="updatable" type="xsd:boolean"/>
- <xsd:attribute name="column-definition" type="xsd:string"/>
- <xsd:attribute name="table" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="generation-type">
- <xsd:annotation>
- <xsd:documentation>
-
- public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="TABLE"/>
- <xsd:enumeration value="SEQUENCE"/>
- <xsd:enumeration value="IDENTITY"/>
- <xsd:enumeration value="AUTO"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="attribute-override">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
- public @interface AttributeOverride {
- String name();
- Column column();
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="column" type="orm:column"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="association-override">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
- public @interface AssociationOverride {
- String name();
- JoinColumn[] joinColumns();
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="join-column" type="orm:join-column"
- maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="id-class">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface IdClass {
- Class value();
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="class" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="id">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface Id {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="column" type="orm:column"
- minOccurs="0"/>
- <xsd:element name="generated-value" type="orm:generated-value"
- minOccurs="0"/>
- <xsd:element name="temporal" type="orm:temporal"
- minOccurs="0"/>
- <xsd:element name="table-generator" type="orm:table-generator"
- minOccurs="0"/>
- <xsd:element name="sequence-generator" type="orm:sequence-generator"
- minOccurs="0"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="embedded-id">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface EmbeddedId {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="attribute-override" type="orm:attribute-override"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="transient">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface Transient {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="version">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface Version {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="column" type="orm:column" minOccurs="0"/>
- <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="basic">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface Basic {
- FetchType fetch() default EAGER;
- boolean optional() default true;
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="column" type="orm:column" minOccurs="0"/>
- <xsd:choice>
- <xsd:element name="lob" type="orm:lob" minOccurs="0"/>
- <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/>
- <xsd:element name="enumerated" type="orm:enumerated" minOccurs="0"/>
- </xsd:choice>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="fetch" type="orm:fetch-type"/>
- <xsd:attribute name="optional" type="xsd:boolean"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="fetch-type">
- <xsd:annotation>
- <xsd:documentation>
-
- public enum FetchType { LAZY, EAGER };
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="LAZY"/>
- <xsd:enumeration value="EAGER"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="lob">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface Lob {}
-
- </xsd:documentation>
- </xsd:annotation>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="temporal">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface Temporal {
- TemporalType value();
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="orm:temporal-type"/>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="temporal-type">
- <xsd:annotation>
- <xsd:documentation>
-
- public enum TemporalType {
- DATE, // java.sql.Date
- TIME, // java.sql.Time
- TIMESTAMP // java.sql.Timestamp
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="DATE"/>
- <xsd:enumeration value="TIME"/>
- <xsd:enumeration value="TIMESTAMP"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="enumerated">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface Enumerated {
- EnumType value() default ORDINAL;
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="orm:enum-type"/>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="enum-type">
- <xsd:annotation>
- <xsd:documentation>
-
- public enum EnumType {
- ORDINAL,
- STRING
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="ORDINAL"/>
- <xsd:enumeration value="STRING"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="many-to-one">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface ManyToOne {
- Class targetEntity() default void.class;
- CascadeType[] cascade() default {};
- FetchType fetch() default EAGER;
- boolean optional() default true;
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:choice>
- <xsd:element name="join-column" type="orm:join-column"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="join-table" type="orm:join-table"
- minOccurs="0"/>
- </xsd:choice>
- <xsd:element name="cascade" type="orm:cascade-type"
- minOccurs="0"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="target-entity" type="xsd:string"/>
- <xsd:attribute name="fetch" type="orm:fetch-type"/>
- <xsd:attribute name="optional" type="xsd:boolean"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="cascade-type">
- <xsd:annotation>
- <xsd:documentation>
-
- public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH};
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="cascade-all" type="orm:emptyType"
- minOccurs="0"/>
- <xsd:element name="cascade-persist" type="orm:emptyType"
- minOccurs="0"/>
- <xsd:element name="cascade-merge" type="orm:emptyType"
- minOccurs="0"/>
- <xsd:element name="cascade-remove" type="orm:emptyType"
- minOccurs="0"/>
- <xsd:element name="cascade-refresh" type="orm:emptyType"
- minOccurs="0"/>
- </xsd:sequence>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="one-to-one">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface OneToOne {
- Class targetEntity() default void.class;
- CascadeType[] cascade() default {};
- FetchType fetch() default EAGER;
- boolean optional() default true;
- String mappedBy() default "";
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:choice>
- <xsd:element name="primary-key-join-column"
- type="orm:primary-key-join-column"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="join-column" type="orm:join-column"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="join-table" type="orm:join-table"
- minOccurs="0"/>
- </xsd:choice>
- <xsd:element name="cascade" type="orm:cascade-type"
- minOccurs="0"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="target-entity" type="xsd:string"/>
- <xsd:attribute name="fetch" type="orm:fetch-type"/>
- <xsd:attribute name="optional" type="xsd:boolean"/>
- <xsd:attribute name="mapped-by" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="one-to-many">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface OneToMany {
- Class targetEntity() default void.class;
- CascadeType[] cascade() default {};
- FetchType fetch() default LAZY;
- String mappedBy() default "";
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="order-by" type="orm:order-by"
- minOccurs="0"/>
- <xsd:element name="map-key" type="orm:map-key"
- minOccurs="0"/>
- <xsd:choice>
- <xsd:element name="join-table" type="orm:join-table"
- minOccurs="0"/>
- <xsd:element name="join-column" type="orm:join-column"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:choice>
- <xsd:element name="cascade" type="orm:cascade-type"
- minOccurs="0"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="target-entity" type="xsd:string"/>
- <xsd:attribute name="fetch" type="orm:fetch-type"/>
- <xsd:attribute name="mapped-by" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="join-table">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface JoinTable {
- String name() default "";
- String catalog() default "";
- String schema() default "";
- JoinColumn[] joinColumns() default {};
- JoinColumn[] inverseJoinColumns() default {};
- UniqueConstraint[] uniqueConstraints() default {};
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="join-column" type="orm:join-column"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="inverse-join-column" type="orm:join-column"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="unique-constraint" type="orm:unique-constraint"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string"/>
- <xsd:attribute name="catalog" type="xsd:string"/>
- <xsd:attribute name="schema" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="many-to-many">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface ManyToMany {
- Class targetEntity() default void.class;
- CascadeType[] cascade() default {};
- FetchType fetch() default LAZY;
- String mappedBy() default "";
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="order-by" type="orm:order-by"
- minOccurs="0"/>
- <xsd:element name="map-key" type="orm:map-key"
- minOccurs="0"/>
- <xsd:element name="join-table" type="orm:join-table"
- minOccurs="0"/>
- <xsd:element name="cascade" type="orm:cascade-type"
- minOccurs="0"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="target-entity" type="xsd:string"/>
- <xsd:attribute name="fetch" type="orm:fetch-type"/>
- <xsd:attribute name="mapped-by" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="generated-value">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface GeneratedValue {
- GenerationType strategy() default AUTO;
- String generator() default "";
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="strategy" type="orm:generation-type"/>
- <xsd:attribute name="generator" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="map-key">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface MapKey {
- String name() default "";
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="name" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="order-by">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface OrderBy {
- String value() default "";
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string"/>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="inheritance">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface Inheritance {
- InheritanceType strategy() default SINGLE_TABLE;
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="strategy" type="orm:inheritance-type"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="inheritance-type">
- <xsd:annotation>
- <xsd:documentation>
-
- public enum InheritanceType
- { SINGLE_TABLE, JOINED, TABLE_PER_CLASS};
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="SINGLE_TABLE"/>
- <xsd:enumeration value="JOINED"/>
- <xsd:enumeration value="TABLE_PER_CLASS"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="discriminator-value">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface DiscriminatorValue {
- String value();
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:string"/>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:simpleType name="discriminator-type">
- <xsd:annotation>
- <xsd:documentation>
-
- public enum DiscriminatorType { STRING, CHAR, INTEGER };
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:restriction base="xsd:token">
- <xsd:enumeration value="STRING"/>
- <xsd:enumeration value="CHAR"/>
- <xsd:enumeration value="INTEGER"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="primary-key-join-column">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
- public @interface PrimaryKeyJoinColumn {
- String name() default "";
- String referencedColumnName() default "";
- String columnDefinition() default "";
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="name" type="xsd:string"/>
- <xsd:attribute name="referenced-column-name" type="xsd:string"/>
- <xsd:attribute name="column-definition" type="xsd:string"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="discriminator-column">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface DiscriminatorColumn {
- String name() default "DTYPE";
- DiscriminatorType discriminatorType() default STRING;
- String columnDefinition() default "";
- int length() default 31;
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="name" type="xsd:string"/>
- <xsd:attribute name="discriminator-type" type="orm:discriminator-type"/>
- <xsd:attribute name="column-definition" type="xsd:string"/>
- <xsd:attribute name="length" type="xsd:int"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="embeddable">
- <xsd:annotation>
- <xsd:documentation>
-
- Defines the settings and mappings for embeddable objects. Is
- allowed to be sparsely populated and used in conjunction with
- the annotations. Alternatively, the metadata-complete attribute
- can be used to indicate that no annotations are to be processed
- in the class. If this is the case then the defaulting rules will
- be recursively applied.
-
- @Target({TYPE}) @Retention(RUNTIME)
- public @interface Embeddable {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="description" type="xsd:string" minOccurs="0"/>
- <xsd:element name="attributes" type="orm:embeddable-attributes"
- minOccurs="0"/>
- </xsd:sequence>
- <xsd:attribute name="class" type="xsd:string" use="required"/>
- <xsd:attribute name="access" type="orm:access-type"/>
- <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="embeddable-attributes">
- <xsd:sequence>
- <xsd:element name="basic" type="orm:basic"
- minOccurs="0" maxOccurs="unbounded"/>
- <xsd:element name="transient" type="orm:transient"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="embedded">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({METHOD, FIELD}) @Retention(RUNTIME)
- public @interface Embedded {}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="attribute-override" type="orm:attribute-override"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="mapped-superclass">
- <xsd:annotation>
- <xsd:documentation>
-
- Defines the settings and mappings for a mapped superclass. Is
- allowed to be sparsely populated and used in conjunction with
- the annotations. Alternatively, the metadata-complete attribute
- can be used to indicate that no annotations are to be processed
- If this is the case then the defaulting rules will be recursively
- applied.
-
- @Target(TYPE) @Retention(RUNTIME)
- public @interface MappedSuperclass{}
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="description" type="xsd:string" minOccurs="0"/>
- <xsd:element name="id-class" type="orm:id-class" minOccurs="0"/>
- <xsd:element name="exclude-default-listeners" type="orm:emptyType"
- minOccurs="0"/>
- <xsd:element name="exclude-superclass-listeners" type="orm:emptyType"
- minOccurs="0"/>
- <xsd:element name="entity-listeners" type="orm:entity-listeners"
- minOccurs="0"/>
- <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/>
- <xsd:element name="post-persist" type="orm:post-persist"
- minOccurs="0"/>
- <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/>
- <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/>
- <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/>
- <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/>
- <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/>
- <xsd:element name="attributes" type="orm:attributes" minOccurs="0"/>
- </xsd:sequence>
- <xsd:attribute name="class" type="xsd:string" use="required"/>
- <xsd:attribute name="access" type="orm:access-type"/>
- <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="sequence-generator">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
- public @interface SequenceGenerator {
- String name();
- String sequenceName() default "";
- int initialValue() default 1;
- int allocationSize() default 50;
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="sequence-name" type="xsd:string"/>
- <xsd:attribute name="initial-value" type="xsd:int"/>
- <xsd:attribute name="allocation-size" type="xsd:int"/>
- </xsd:complexType>
-
- <!-- **************************************************** -->
-
- <xsd:complexType name="table-generator">
- <xsd:annotation>
- <xsd:documentation>
-
- @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
- public @interface TableGenerator {
- String name();
- String table() default "";
- String catalog() default "";
- String schema() default "";
- String pkColumnName() default "";
- String valueColumnName() default "";
- String pkColumnValue() default "";
- int initialValue() default 0;
- int allocationSize() default 50;
- UniqueConstraint[] uniqueConstraints() default {};
- }
-
- </xsd:documentation>
- </xsd:annotation>
- <xsd:sequence>
- <xsd:element name="unique-constraint" type="orm:unique-constraint"
- minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="name" type="xsd:string" use="required"/>
- <xsd:attribute name="table" type="xsd:string"/>
- <xsd:attribute name="catalog" type="xsd:string"/>
- <xsd:attribute name="schema" type="xsd:string"/>
- <xsd:attribute name="pk-column-name" type="xsd:string"/>
- <xsd:attribute name="value-column-name" type="xsd:string"/>
- <xsd:attribute name="pk-column-value" type="xsd:string"/>
- <xsd:attribute name="initial-value" type="xsd:int"/>
- <xsd:attribute name="allocation-size" type="xsd:int"/>
- </xsd:complexType>
-
-</xsd:schema>
-
-
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/ejb/orm_1_0.xsd (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/ejb/orm_1_0.xsd)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/ejb/orm_1_0.xsd (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/ejb/orm_1_0.xsd 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,1516 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Java Persistence API object-relational mapping file schema -->
+<xsd:schema targetNamespace="http://java.sun.com/xml/ns/persistence/orm"
+ xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+ elementFormDefault="qualified"
+ attributeFormDefault="unqualified"
+ version="1.0">
+
+ <xsd:annotation>
+ <xsd:documentation>
+ @(#)orm_1_0.xsd 1.0 Feb 14 2006
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:annotation>
+ <xsd:documentation><![CDATA[
+
+ This is the XML Schema for the persistence object-relational
+ mapping file.
+ The file may be named "META-INF/orm.xml" in the persistence
+ archive or it may be named some other name which would be
+ used to locate the file as resource on the classpath.
+
+ ]]></xsd:documentation>
+ </xsd:annotation>
+
+ <xsd:complexType name="emptyType"/>
+
+ <xsd:simpleType name="versionType">
+ <xsd:restriction base="xsd:token">
+ <xsd:pattern value="[0-9]+(\.[0-9]+)*"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:element name="entity-mappings">
+ <xsd:complexType>
+ <xsd:annotation>
+ <xsd:documentation>
+
+ The entity-mappings element is the root element of an mapping
+ file. It contains the following four types of elements:
+
+ 1. The persistence-unit-metadata element contains metadata
+ for the entire persistence unit. It is undefined if this element
+ occurs in multiple mapping files within the same persistence unit.
+
+ 2. The package, schema, catalog and access elements apply to all of
+ the entity, mapped-superclass and embeddable elements defined in
+ the same file in which they occur.
+
+ 3. The sequence-generator, table-generator, named-query,
+ named-native-query and sql-result-set-mapping elements are global
+ to the persistence unit. It is undefined to have more than one
+ sequence-generator or table-generator of the same name in the same
+ or different mapping files in a persistence unit. It is also
+ undefined to have more than one named-query or named-native-query
+ of the same name in the same or different mapping files in a
+ persistence unit.
+
+ 4. The entity, mapped-superclass and embeddable elements each define
+ the mapping information for a managed persistent class. The mapping
+ information contained in these elements may be complete or it may
+ be partial.
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="description" type="xsd:string"
+ minOccurs="0"/>
+ <xsd:element name="persistence-unit-metadata"
+ type="orm:persistence-unit-metadata"
+ minOccurs="0"/>
+ <xsd:element name="package" type="xsd:string"
+ minOccurs="0"/>
+ <xsd:element name="schema" type="xsd:string"
+ minOccurs="0"/>
+ <xsd:element name="catalog" type="xsd:string"
+ minOccurs="0"/>
+ <xsd:element name="access" type="orm:access-type"
+ minOccurs="0"/>
+ <xsd:element name="sequence-generator" type="orm:sequence-generator"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="table-generator" type="orm:table-generator"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="named-query" type="orm:named-query"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="named-native-query" type="orm:named-native-query"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="sql-result-set-mapping"
+ type="orm:sql-result-set-mapping"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="mapped-superclass" type="orm:mapped-superclass"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="entity" type="orm:entity"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="embeddable" type="orm:embeddable"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="version" type="orm:versionType"
+ fixed="1.0" use="required"/>
+ </xsd:complexType>
+ </xsd:element>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="persistence-unit-metadata">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ Metadata that applies to the persistence unit and not just to
+ the mapping file in which it is contained.
+
+ If the xml-mapping-metadata-complete element is specified then
+ the complete set of mapping metadata for the persistence unit
+ is contained in the XML mapping files for the persistence unit.
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="xml-mapping-metadata-complete" type="orm:emptyType"
+ minOccurs="0"/>
+ <xsd:element name="persistence-unit-defaults"
+ type="orm:persistence-unit-defaults"
+ minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="persistence-unit-defaults">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ These defaults are applied to the persistence unit as a whole
+ unless they are overridden by local annotation or XML
+ element settings.
+
+ schema - Used as the schema for all tables or secondary tables
+ that apply to the persistence unit
+ catalog - Used as the catalog for all tables or secondary tables
+ that apply to the persistence unit
+ access - Used as the access type for all managed classes in
+ the persistence unit
+ cascade-persist - Adds cascade-persist to the set of cascade options
+ in entity relationships of the persistence unit
+ entity-listeners - List of default entity listeners to be invoked
+ on each entity in the persistence unit.
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="schema" type="xsd:string"
+ minOccurs="0"/>
+ <xsd:element name="catalog" type="xsd:string"
+ minOccurs="0"/>
+ <xsd:element name="access" type="orm:access-type"
+ minOccurs="0"/>
+ <xsd:element name="cascade-persist" type="orm:emptyType"
+ minOccurs="0"/>
+ <xsd:element name="entity-listeners" type="orm:entity-listeners"
+ minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="entity">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ Defines the settings and mappings for an entity. Is allowed to be
+ sparsely populated and used in conjunction with the annotations.
+ Alternatively, the metadata-complete attribute can be used to
+ indicate that no annotations on the entity class (and its fields
+ or properties) are to be processed. If this is the case then
+ the defaulting rules for the entity and its subelements will
+ be recursively applied.
+
+ @Target(TYPE) @Retention(RUNTIME)
+ public @interface Entity {
+ String name() default "";
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="table" type="orm:table"
+ minOccurs="0"/>
+ <xsd:element name="secondary-table" type="orm:secondary-table"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="primary-key-join-column"
+ type="orm:primary-key-join-column"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="id-class" type="orm:id-class" minOccurs="0"/>
+ <xsd:element name="inheritance" type="orm:inheritance" minOccurs="0"/>
+ <xsd:element name="discriminator-value" type="orm:discriminator-value"
+ minOccurs="0"/>
+ <xsd:element name="discriminator-column"
+ type="orm:discriminator-column"
+ minOccurs="0"/>
+ <xsd:element name="sequence-generator" type="orm:sequence-generator"
+ minOccurs="0"/>
+ <xsd:element name="table-generator" type="orm:table-generator"
+ minOccurs="0"/>
+ <xsd:element name="named-query" type="orm:named-query"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="named-native-query" type="orm:named-native-query"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="sql-result-set-mapping"
+ type="orm:sql-result-set-mapping"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="exclude-default-listeners" type="orm:emptyType"
+ minOccurs="0"/>
+ <xsd:element name="exclude-superclass-listeners" type="orm:emptyType"
+ minOccurs="0"/>
+ <xsd:element name="entity-listeners" type="orm:entity-listeners"
+ minOccurs="0"/>
+ <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/>
+ <xsd:element name="post-persist" type="orm:post-persist"
+ minOccurs="0"/>
+ <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/>
+ <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/>
+ <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/>
+ <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/>
+ <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/>
+ <xsd:element name="attribute-override" type="orm:attribute-override"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="association-override"
+ type="orm:association-override"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="attributes" type="orm:attributes" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="class" type="xsd:string" use="required"/>
+ <xsd:attribute name="access" type="orm:access-type"/>
+ <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="attributes">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ This element contains the entity field or property mappings.
+ It may be sparsely populated to include only a subset of the
+ fields or properties. If metadata-complete for the entity is true
+ then the remainder of the attributes will be defaulted according
+ to the default rules.
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:element name="id" type="orm:id"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="embedded-id" type="orm:embedded-id"
+ minOccurs="0"/>
+ </xsd:choice>
+ <xsd:element name="basic" type="orm:basic"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="version" type="orm:version"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="many-to-one" type="orm:many-to-one"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="one-to-many" type="orm:one-to-many"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="one-to-one" type="orm:one-to-one"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="many-to-many" type="orm:many-to-many"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="embedded" type="orm:embedded"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="transient" type="orm:transient"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="access-type">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ This element determines how the persistence provider accesses the
+ state of an entity or embedded object.
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="PROPERTY"/>
+ <xsd:enumeration value="FIELD"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="entity-listeners">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface EntityListeners {
+ Class[] value();
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="entity-listener" type="orm:entity-listener"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="entity-listener">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ Defines an entity listener to be invoked at lifecycle events
+ for the entities that list this listener.
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/>
+ <xsd:element name="post-persist" type="orm:post-persist"
+ minOccurs="0"/>
+ <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/>
+ <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/>
+ <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/>
+ <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/>
+ <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="class" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="pre-persist">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD}) @Retention(RUNTIME)
+ public @interface PrePersist {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="method-name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="post-persist">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD}) @Retention(RUNTIME)
+ public @interface PostPersist {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="method-name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="pre-remove">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD}) @Retention(RUNTIME)
+ public @interface PreRemove {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="method-name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="post-remove">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD}) @Retention(RUNTIME)
+ public @interface PostRemove {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="method-name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="pre-update">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD}) @Retention(RUNTIME)
+ public @interface PreUpdate {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="method-name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="post-update">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD}) @Retention(RUNTIME)
+ public @interface PostUpdate {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="method-name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="post-load">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD}) @Retention(RUNTIME)
+ public @interface PostLoad {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="method-name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="query-hint">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({}) @Retention(RUNTIME)
+ public @interface QueryHint {
+ String name();
+ String value();
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="value" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="named-query">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface NamedQuery {
+ String name();
+ String query();
+ QueryHint[] hints() default {};
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="query" type="xsd:string"/>
+ <xsd:element name="hint" type="orm:query-hint"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="named-native-query">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface NamedNativeQuery {
+ String name();
+ String query();
+ QueryHint[] hints() default {};
+ Class resultClass() default void.class;
+ String resultSetMapping() default ""; //named SqlResultSetMapping
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="query" type="xsd:string"/>
+ <xsd:element name="hint" type="orm:query-hint"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="result-class" type="xsd:string"/>
+ <xsd:attribute name="result-set-mapping" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="sql-result-set-mapping">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface SqlResultSetMapping {
+ String name();
+ EntityResult[] entities() default {};
+ ColumnResult[] columns() default {};
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="entity-result" type="orm:entity-result"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="column-result" type="orm:column-result"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="entity-result">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({}) @Retention(RUNTIME)
+ public @interface EntityResult {
+ Class entityClass();
+ FieldResult[] fields() default {};
+ String discriminatorColumn() default "";
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="field-result" type="orm:field-result"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="entity-class" type="xsd:string" use="required"/>
+ <xsd:attribute name="discriminator-column" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="field-result">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({}) @Retention(RUNTIME)
+ public @interface FieldResult {
+ String name();
+ String column();
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="column" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="column-result">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({}) @Retention(RUNTIME)
+ public @interface ColumnResult {
+ String name();
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="table">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface Table {
+ String name() default "";
+ String catalog() default "";
+ String schema() default "";
+ UniqueConstraint[] uniqueConstraints() default {};
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="unique-constraint" type="orm:unique-constraint"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="catalog" type="xsd:string"/>
+ <xsd:attribute name="schema" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="secondary-table">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface SecondaryTable {
+ String name();
+ String catalog() default "";
+ String schema() default "";
+ PrimaryKeyJoinColumn[] pkJoinColumns() default {};
+ UniqueConstraint[] uniqueConstraints() default {};
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="primary-key-join-column"
+ type="orm:primary-key-join-column"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="unique-constraint" type="orm:unique-constraint"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="catalog" type="xsd:string"/>
+ <xsd:attribute name="schema" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="unique-constraint">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({}) @Retention(RUNTIME)
+ public @interface UniqueConstraint {
+ String[] columnNames();
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="column-name" type="xsd:string"
+ maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="column">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface Column {
+ String name() default "";
+ boolean unique() default false;
+ boolean nullable() default true;
+ boolean insertable() default true;
+ boolean updatable() default true;
+ String columnDefinition() default "";
+ String table() default "";
+ int length() default 255;
+ int precision() default 0; // decimal precision
+ int scale() default 0; // decimal scale
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="unique" type="xsd:boolean"/>
+ <xsd:attribute name="nullable" type="xsd:boolean"/>
+ <xsd:attribute name="insertable" type="xsd:boolean"/>
+ <xsd:attribute name="updatable" type="xsd:boolean"/>
+ <xsd:attribute name="column-definition" type="xsd:string"/>
+ <xsd:attribute name="table" type="xsd:string"/>
+ <xsd:attribute name="length" type="xsd:int"/>
+ <xsd:attribute name="precision" type="xsd:int"/>
+ <xsd:attribute name="scale" type="xsd:int"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="join-column">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface JoinColumn {
+ String name() default "";
+ String referencedColumnName() default "";
+ boolean unique() default false;
+ boolean nullable() default true;
+ boolean insertable() default true;
+ boolean updatable() default true;
+ String columnDefinition() default "";
+ String table() default "";
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="referenced-column-name" type="xsd:string"/>
+ <xsd:attribute name="unique" type="xsd:boolean"/>
+ <xsd:attribute name="nullable" type="xsd:boolean"/>
+ <xsd:attribute name="insertable" type="xsd:boolean"/>
+ <xsd:attribute name="updatable" type="xsd:boolean"/>
+ <xsd:attribute name="column-definition" type="xsd:string"/>
+ <xsd:attribute name="table" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="generation-type">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ public enum GenerationType { TABLE, SEQUENCE, IDENTITY, AUTO };
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="TABLE"/>
+ <xsd:enumeration value="SEQUENCE"/>
+ <xsd:enumeration value="IDENTITY"/>
+ <xsd:enumeration value="AUTO"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="attribute-override">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface AttributeOverride {
+ String name();
+ Column column();
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="column" type="orm:column"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="association-override">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface AssociationOverride {
+ String name();
+ JoinColumn[] joinColumns();
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="join-column" type="orm:join-column"
+ maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="id-class">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface IdClass {
+ Class value();
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="class" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="id">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface Id {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="column" type="orm:column"
+ minOccurs="0"/>
+ <xsd:element name="generated-value" type="orm:generated-value"
+ minOccurs="0"/>
+ <xsd:element name="temporal" type="orm:temporal"
+ minOccurs="0"/>
+ <xsd:element name="table-generator" type="orm:table-generator"
+ minOccurs="0"/>
+ <xsd:element name="sequence-generator" type="orm:sequence-generator"
+ minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="embedded-id">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface EmbeddedId {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="attribute-override" type="orm:attribute-override"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="transient">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface Transient {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="version">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface Version {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="column" type="orm:column" minOccurs="0"/>
+ <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="basic">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface Basic {
+ FetchType fetch() default EAGER;
+ boolean optional() default true;
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="column" type="orm:column" minOccurs="0"/>
+ <xsd:choice>
+ <xsd:element name="lob" type="orm:lob" minOccurs="0"/>
+ <xsd:element name="temporal" type="orm:temporal" minOccurs="0"/>
+ <xsd:element name="enumerated" type="orm:enumerated" minOccurs="0"/>
+ </xsd:choice>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="fetch" type="orm:fetch-type"/>
+ <xsd:attribute name="optional" type="xsd:boolean"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="fetch-type">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ public enum FetchType { LAZY, EAGER };
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="LAZY"/>
+ <xsd:enumeration value="EAGER"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="lob">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface Lob {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="temporal">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface Temporal {
+ TemporalType value();
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="orm:temporal-type"/>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="temporal-type">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ public enum TemporalType {
+ DATE, // java.sql.Date
+ TIME, // java.sql.Time
+ TIMESTAMP // java.sql.Timestamp
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="DATE"/>
+ <xsd:enumeration value="TIME"/>
+ <xsd:enumeration value="TIMESTAMP"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="enumerated">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface Enumerated {
+ EnumType value() default ORDINAL;
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="orm:enum-type"/>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="enum-type">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ public enum EnumType {
+ ORDINAL,
+ STRING
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="ORDINAL"/>
+ <xsd:enumeration value="STRING"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="many-to-one">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface ManyToOne {
+ Class targetEntity() default void.class;
+ CascadeType[] cascade() default {};
+ FetchType fetch() default EAGER;
+ boolean optional() default true;
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:element name="join-column" type="orm:join-column"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="join-table" type="orm:join-table"
+ minOccurs="0"/>
+ </xsd:choice>
+ <xsd:element name="cascade" type="orm:cascade-type"
+ minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="target-entity" type="xsd:string"/>
+ <xsd:attribute name="fetch" type="orm:fetch-type"/>
+ <xsd:attribute name="optional" type="xsd:boolean"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="cascade-type">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ public enum CascadeType { ALL, PERSIST, MERGE, REMOVE, REFRESH};
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="cascade-all" type="orm:emptyType"
+ minOccurs="0"/>
+ <xsd:element name="cascade-persist" type="orm:emptyType"
+ minOccurs="0"/>
+ <xsd:element name="cascade-merge" type="orm:emptyType"
+ minOccurs="0"/>
+ <xsd:element name="cascade-remove" type="orm:emptyType"
+ minOccurs="0"/>
+ <xsd:element name="cascade-refresh" type="orm:emptyType"
+ minOccurs="0"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="one-to-one">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface OneToOne {
+ Class targetEntity() default void.class;
+ CascadeType[] cascade() default {};
+ FetchType fetch() default EAGER;
+ boolean optional() default true;
+ String mappedBy() default "";
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:choice>
+ <xsd:element name="primary-key-join-column"
+ type="orm:primary-key-join-column"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="join-column" type="orm:join-column"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="join-table" type="orm:join-table"
+ minOccurs="0"/>
+ </xsd:choice>
+ <xsd:element name="cascade" type="orm:cascade-type"
+ minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="target-entity" type="xsd:string"/>
+ <xsd:attribute name="fetch" type="orm:fetch-type"/>
+ <xsd:attribute name="optional" type="xsd:boolean"/>
+ <xsd:attribute name="mapped-by" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="one-to-many">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface OneToMany {
+ Class targetEntity() default void.class;
+ CascadeType[] cascade() default {};
+ FetchType fetch() default LAZY;
+ String mappedBy() default "";
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="order-by" type="orm:order-by"
+ minOccurs="0"/>
+ <xsd:element name="map-key" type="orm:map-key"
+ minOccurs="0"/>
+ <xsd:choice>
+ <xsd:element name="join-table" type="orm:join-table"
+ minOccurs="0"/>
+ <xsd:element name="join-column" type="orm:join-column"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:choice>
+ <xsd:element name="cascade" type="orm:cascade-type"
+ minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="target-entity" type="xsd:string"/>
+ <xsd:attribute name="fetch" type="orm:fetch-type"/>
+ <xsd:attribute name="mapped-by" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="join-table">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface JoinTable {
+ String name() default "";
+ String catalog() default "";
+ String schema() default "";
+ JoinColumn[] joinColumns() default {};
+ JoinColumn[] inverseJoinColumns() default {};
+ UniqueConstraint[] uniqueConstraints() default {};
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="join-column" type="orm:join-column"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="inverse-join-column" type="orm:join-column"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="unique-constraint" type="orm:unique-constraint"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="catalog" type="xsd:string"/>
+ <xsd:attribute name="schema" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="many-to-many">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface ManyToMany {
+ Class targetEntity() default void.class;
+ CascadeType[] cascade() default {};
+ FetchType fetch() default LAZY;
+ String mappedBy() default "";
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="order-by" type="orm:order-by"
+ minOccurs="0"/>
+ <xsd:element name="map-key" type="orm:map-key"
+ minOccurs="0"/>
+ <xsd:element name="join-table" type="orm:join-table"
+ minOccurs="0"/>
+ <xsd:element name="cascade" type="orm:cascade-type"
+ minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="target-entity" type="xsd:string"/>
+ <xsd:attribute name="fetch" type="orm:fetch-type"/>
+ <xsd:attribute name="mapped-by" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="generated-value">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface GeneratedValue {
+ GenerationType strategy() default AUTO;
+ String generator() default "";
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="strategy" type="orm:generation-type"/>
+ <xsd:attribute name="generator" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="map-key">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface MapKey {
+ String name() default "";
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="order-by">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface OrderBy {
+ String value() default "";
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="inheritance">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface Inheritance {
+ InheritanceType strategy() default SINGLE_TABLE;
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="strategy" type="orm:inheritance-type"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="inheritance-type">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ public enum InheritanceType
+ { SINGLE_TABLE, JOINED, TABLE_PER_CLASS};
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="SINGLE_TABLE"/>
+ <xsd:enumeration value="JOINED"/>
+ <xsd:enumeration value="TABLE_PER_CLASS"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="discriminator-value">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface DiscriminatorValue {
+ String value();
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:string"/>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:simpleType name="discriminator-type">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ public enum DiscriminatorType { STRING, CHAR, INTEGER };
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:restriction base="xsd:token">
+ <xsd:enumeration value="STRING"/>
+ <xsd:enumeration value="CHAR"/>
+ <xsd:enumeration value="INTEGER"/>
+ </xsd:restriction>
+ </xsd:simpleType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="primary-key-join-column">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface PrimaryKeyJoinColumn {
+ String name() default "";
+ String referencedColumnName() default "";
+ String columnDefinition() default "";
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="referenced-column-name" type="xsd:string"/>
+ <xsd:attribute name="column-definition" type="xsd:string"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="discriminator-column">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface DiscriminatorColumn {
+ String name() default "DTYPE";
+ DiscriminatorType discriminatorType() default STRING;
+ String columnDefinition() default "";
+ int length() default 31;
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string"/>
+ <xsd:attribute name="discriminator-type" type="orm:discriminator-type"/>
+ <xsd:attribute name="column-definition" type="xsd:string"/>
+ <xsd:attribute name="length" type="xsd:int"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="embeddable">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ Defines the settings and mappings for embeddable objects. Is
+ allowed to be sparsely populated and used in conjunction with
+ the annotations. Alternatively, the metadata-complete attribute
+ can be used to indicate that no annotations are to be processed
+ in the class. If this is the case then the defaulting rules will
+ be recursively applied.
+
+ @Target({TYPE}) @Retention(RUNTIME)
+ public @interface Embeddable {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="attributes" type="orm:embeddable-attributes"
+ minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="class" type="xsd:string" use="required"/>
+ <xsd:attribute name="access" type="orm:access-type"/>
+ <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="embeddable-attributes">
+ <xsd:sequence>
+ <xsd:element name="basic" type="orm:basic"
+ minOccurs="0" maxOccurs="unbounded"/>
+ <xsd:element name="transient" type="orm:transient"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="embedded">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface Embedded {}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="attribute-override" type="orm:attribute-override"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="mapped-superclass">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ Defines the settings and mappings for a mapped superclass. Is
+ allowed to be sparsely populated and used in conjunction with
+ the annotations. Alternatively, the metadata-complete attribute
+ can be used to indicate that no annotations are to be processed
+ If this is the case then the defaulting rules will be recursively
+ applied.
+
+ @Target(TYPE) @Retention(RUNTIME)
+ public @interface MappedSuperclass{}
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="description" type="xsd:string" minOccurs="0"/>
+ <xsd:element name="id-class" type="orm:id-class" minOccurs="0"/>
+ <xsd:element name="exclude-default-listeners" type="orm:emptyType"
+ minOccurs="0"/>
+ <xsd:element name="exclude-superclass-listeners" type="orm:emptyType"
+ minOccurs="0"/>
+ <xsd:element name="entity-listeners" type="orm:entity-listeners"
+ minOccurs="0"/>
+ <xsd:element name="pre-persist" type="orm:pre-persist" minOccurs="0"/>
+ <xsd:element name="post-persist" type="orm:post-persist"
+ minOccurs="0"/>
+ <xsd:element name="pre-remove" type="orm:pre-remove" minOccurs="0"/>
+ <xsd:element name="post-remove" type="orm:post-remove" minOccurs="0"/>
+ <xsd:element name="pre-update" type="orm:pre-update" minOccurs="0"/>
+ <xsd:element name="post-update" type="orm:post-update" minOccurs="0"/>
+ <xsd:element name="post-load" type="orm:post-load" minOccurs="0"/>
+ <xsd:element name="attributes" type="orm:attributes" minOccurs="0"/>
+ </xsd:sequence>
+ <xsd:attribute name="class" type="xsd:string" use="required"/>
+ <xsd:attribute name="access" type="orm:access-type"/>
+ <xsd:attribute name="metadata-complete" type="xsd:boolean"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="sequence-generator">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface SequenceGenerator {
+ String name();
+ String sequenceName() default "";
+ int initialValue() default 1;
+ int allocationSize() default 50;
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="sequence-name" type="xsd:string"/>
+ <xsd:attribute name="initial-value" type="xsd:int"/>
+ <xsd:attribute name="allocation-size" type="xsd:int"/>
+ </xsd:complexType>
+
+ <!-- **************************************************** -->
+
+ <xsd:complexType name="table-generator">
+ <xsd:annotation>
+ <xsd:documentation>
+
+ @Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+ public @interface TableGenerator {
+ String name();
+ String table() default "";
+ String catalog() default "";
+ String schema() default "";
+ String pkColumnName() default "";
+ String valueColumnName() default "";
+ String pkColumnValue() default "";
+ int initialValue() default 0;
+ int allocationSize() default 50;
+ UniqueConstraint[] uniqueConstraints() default {};
+ }
+
+ </xsd:documentation>
+ </xsd:annotation>
+ <xsd:sequence>
+ <xsd:element name="unique-constraint" type="orm:unique-constraint"
+ minOccurs="0" maxOccurs="unbounded"/>
+ </xsd:sequence>
+ <xsd:attribute name="name" type="xsd:string" use="required"/>
+ <xsd:attribute name="table" type="xsd:string"/>
+ <xsd:attribute name="catalog" type="xsd:string"/>
+ <xsd:attribute name="schema" type="xsd:string"/>
+ <xsd:attribute name="pk-column-name" type="xsd:string"/>
+ <xsd:attribute name="value-column-name" type="xsd:string"/>
+ <xsd:attribute name="pk-column-value" type="xsd:string"/>
+ <xsd:attribute name="initial-value" type="xsd:int"/>
+ <xsd:attribute name="allocation-size" type="xsd:int"/>
+ </xsd:complexType>
+
+</xsd:schema>
+
+
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/mapping (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/mapping)
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/mapping/IdGenerator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/mapping/IdGenerator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/mapping/IdGenerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-//$Id$
-package org.hibernate.mapping;
-
-import java.io.Serializable;
-import java.util.Properties;
-
-/**
- * Identifier generator container,
- * Useful to keep named generator in annotations
- *
- * @author Emmanuel Bernard
- */
-public class IdGenerator implements Serializable {
- private String name;
- private String identifierGeneratorStrategy;
- private Properties params = new Properties();
-
-
- /**
- * @return identifier generator strategy
- */
- public String getIdentifierGeneratorStrategy() {
- return identifierGeneratorStrategy;
- }
-
- /**
- * @return generator name
- */
- public String getName() {
- return name;
- }
-
- /**
- * @return generator configuration parameters
- */
- public Properties getParams() {
- return params;
- }
-
- public void setIdentifierGeneratorStrategy(String string) {
- identifierGeneratorStrategy = string;
- }
-
- public void setName(String string) {
- name = string;
- }
-
- public void addParam(String key, String value) {
- params.setProperty( key, value );
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/mapping/IdGenerator.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/mapping/IdGenerator.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/mapping/IdGenerator.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/mapping/IdGenerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+//$Id$
+package org.hibernate.mapping;
+
+import java.io.Serializable;
+import java.util.Properties;
+
+/**
+ * Identifier generator container,
+ * Useful to keep named generator in annotations
+ *
+ * @author Emmanuel Bernard
+ */
+public class IdGenerator implements Serializable {
+ private String name;
+ private String identifierGeneratorStrategy;
+ private Properties params = new Properties();
+
+
+ /**
+ * @return identifier generator strategy
+ */
+ public String getIdentifierGeneratorStrategy() {
+ return identifierGeneratorStrategy;
+ }
+
+ /**
+ * @return generator name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @return generator configuration parameters
+ */
+ public Properties getParams() {
+ return params;
+ }
+
+ public void setIdentifierGeneratorStrategy(String string) {
+ identifierGeneratorStrategy = string;
+ }
+
+ public void setName(String string) {
+ name = string;
+ }
+
+ public void addParam(String key, String value) {
+ params.setProperty( key, value );
+ }
+
+}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/type (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type)
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/type/AbstractLobType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/AbstractLobType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/AbstractLobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,67 +0,0 @@
-//$Id$
-package org.hibernate.type;
-
-import java.io.Serializable;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-import org.hibernate.EntityMode;
-import org.hibernate.HibernateException;
-import org.hibernate.MappingException;
-import org.hibernate.engine.Mapping;
-import org.hibernate.engine.SessionImplementor;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class AbstractLobType extends AbstractType implements Serializable {
- public boolean isDirty(Object old, Object current, boolean[] checkable, SessionImplementor session)
- throws HibernateException {
- return checkable[0] ? ! isEqual( old, current, session.getEntityMode() ) : false;
- }
-
- @Override
- public boolean isEqual(Object x, Object y, EntityMode entityMode) {
- return isEqual( x, y, entityMode, null );
- }
-
- @Override
- public int getHashCode(Object x, EntityMode entityMode) {
- return getHashCode( x, entityMode, null );
- }
-
- public String getName() {
- return this.getClass().getName();
- }
-
- public int getColumnSpan(Mapping mapping) throws MappingException {
- return 1;
- }
-
- protected abstract Object get(ResultSet rs, String name) throws SQLException;
-
- public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
- throws HibernateException, SQLException {
- return get( rs, names[0] );
- }
-
- public Object nullSafeGet(ResultSet rs, String name, SessionImplementor session, Object owner)
- throws HibernateException, SQLException {
- return get( rs, name );
- }
-
- public void nullSafeSet(
- PreparedStatement st, Object value, int index, boolean[] settable, SessionImplementor session
- ) throws HibernateException, SQLException {
- if ( settable[0] ) set( st, value, index, session );
- }
-
- protected abstract void set(PreparedStatement st, Object value, int index, SessionImplementor session)
- throws SQLException;
-
- public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session)
- throws HibernateException, SQLException {
- set( st, value, index, session );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/type/AbstractLobType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/AbstractLobType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/type/AbstractLobType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/AbstractLobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,67 @@
+//$Id$
+package org.hibernate.type;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.hibernate.EntityMode;
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.engine.Mapping;
+import org.hibernate.engine.SessionImplementor;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class AbstractLobType extends AbstractType implements Serializable {
+ public boolean isDirty(Object old, Object current, boolean[] checkable, SessionImplementor session)
+ throws HibernateException {
+ return checkable[0] ? ! isEqual( old, current, session.getEntityMode() ) : false;
+ }
+
+ @Override
+ public boolean isEqual(Object x, Object y, EntityMode entityMode) {
+ return isEqual( x, y, entityMode, null );
+ }
+
+ @Override
+ public int getHashCode(Object x, EntityMode entityMode) {
+ return getHashCode( x, entityMode, null );
+ }
+
+ public String getName() {
+ return this.getClass().getName();
+ }
+
+ public int getColumnSpan(Mapping mapping) throws MappingException {
+ return 1;
+ }
+
+ protected abstract Object get(ResultSet rs, String name) throws SQLException;
+
+ public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
+ throws HibernateException, SQLException {
+ return get( rs, names[0] );
+ }
+
+ public Object nullSafeGet(ResultSet rs, String name, SessionImplementor session, Object owner)
+ throws HibernateException, SQLException {
+ return get( rs, name );
+ }
+
+ public void nullSafeSet(
+ PreparedStatement st, Object value, int index, boolean[] settable, SessionImplementor session
+ ) throws HibernateException, SQLException {
+ if ( settable[0] ) set( st, value, index, session );
+ }
+
+ protected abstract void set(PreparedStatement st, Object value, int index, SessionImplementor session)
+ throws SQLException;
+
+ public void nullSafeSet(PreparedStatement st, Object value, int index, SessionImplementor session)
+ throws HibernateException, SQLException {
+ set( st, value, index, session );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/type/ByteArrayBlobType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/ByteArrayBlobType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/ByteArrayBlobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,195 +0,0 @@
-//$Id$
-package org.hibernate.type;
-
-import java.io.ByteArrayInputStream;
-import java.sql.Blob;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Map;
-
-import org.dom4j.Node;
-import org.hibernate.EntityMode;
-import org.hibernate.HibernateException;
-import org.hibernate.MappingException;
-import org.hibernate.engine.Mapping;
-import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.lob.BlobImpl;
-import org.hibernate.util.ArrayHelper;
-
-/**
- * Map a Byte[] into a Blob
- * Experimental
- *
- * @author Emmanuel Bernard
- */
-public class ByteArrayBlobType extends AbstractLobType {
-
- public int[] sqlTypes(Mapping mapping) throws MappingException {
- return new int[]{Types.BLOB};
- }
-
- @Override
- public boolean isEqual(Object x, Object y, EntityMode entityMode, SessionFactoryImplementor factory) {
- if ( x == y ) return true;
- if ( x == null || y == null ) return false;
- if ( x instanceof Byte[] ) {
- Object[] o1 = (Object[]) x;
- Object[] o2 = (Object[]) y;
- return ArrayHelper.isEquals( o1, o2 );
- }
- else {
- byte[] c1 = (byte[]) x;
- byte[] c2 = (byte[]) y;
- return ArrayHelper.isEquals( c1, c2 );
- }
- }
-
- public int getHashCode(Object x, EntityMode entityMode, SessionFactoryImplementor factory) {
- if ( x instanceof Character[] ) {
- Object[] o = (Object[]) x;
- return ArrayHelper.hash( o );
- }
- else {
- byte[] c = (byte[]) x;
- return ArrayHelper.hash( c );
- }
- }
-
- public Object deepCopy(Object value, EntityMode entityMode, SessionFactoryImplementor factory)
- throws HibernateException {
- if ( value == null ) return null;
- if ( value instanceof Byte[] ) {
- Byte[] array = (Byte[]) value;
- int length = array.length;
- Byte[] copy = new Byte[length];
- for ( int index = 0; index < length ; index++ ) {
- copy[index] = Byte.valueOf( array[index].byteValue() );
- }
- return copy;
- }
- else {
- byte[] array = (byte[]) value;
- int length = array.length;
- byte[] copy = new byte[length];
- System.arraycopy( array, 0, copy, 0, length );
- return copy;
- }
- }
-
- public Class getReturnedClass() {
- return Byte[].class;
- }
-
- protected Object get(ResultSet rs, String name) throws SQLException {
- Blob blob = rs.getBlob( name );
- if ( rs.wasNull() ) return null;
- int length = (int) blob.length();
- byte[] primaryResult = blob.getBytes( 1, length );
- return wrap( primaryResult );
- }
-
- protected void set(PreparedStatement st, Object value, int index, SessionImplementor session) throws SQLException {
- if ( value == null ) {
- st.setNull( index, sqlTypes( null )[0] );
- }
- else {
- byte[] toSet = unWrap( value );
- final boolean useInputStream = session.getFactory().getDialect().useInputStreamToInsertBlob();
-
- if ( useInputStream ) {
- st.setBinaryStream( index, new ByteArrayInputStream( toSet ), toSet.length );
- }
- else {
- st.setBlob( index, new BlobImpl( toSet ) );
- }
- }
- }
-
- public void setToXMLNode(Node node, Object value, SessionFactoryImplementor factory) throws HibernateException {
- node.setText( toString( value ) );
- }
-
- public String toString(Object val) {
- byte[] bytes = unWrap( val );
- StringBuilder buf = new StringBuilder( 2 * bytes.length );
- for ( int i = 0; i < bytes.length ; i++ ) {
- String hexStr = Integer.toHexString( bytes[i] - Byte.MIN_VALUE );
- if ( hexStr.length() == 1 ) buf.append( '0' );
- buf.append( hexStr );
- }
- return buf.toString();
- }
-
- public String toLoggableString(Object value, SessionFactoryImplementor factory) {
- return value == null ? "null" : toString( value );
- }
-
- public Object fromXMLNode(Node xml, Mapping factory) throws HibernateException {
- String xmlText = xml.getText();
- return xmlText == null || xmlText.length() == 0 ? null : fromString( xmlText );
- }
-
- private Object fromString(String xmlText) {
- if ( xmlText == null ) {
- return null;
- }
- if ( xmlText.length() % 2 != 0 ) {
- throw new IllegalArgumentException( "The string is not a valid xml representation of a binary content." );
- }
- byte[] bytes = new byte[xmlText.length() / 2];
- for ( int i = 0; i < bytes.length ; i++ ) {
- String hexStr = xmlText.substring( i * 2, ( i + 1 ) * 2 );
- bytes[i] = (byte) ( Integer.parseInt( hexStr, 16 ) + Byte.MIN_VALUE );
- }
- return wrap( bytes );
- }
-
- protected Object wrap(byte[] bytes) {
- return wrapPrimitive( bytes );
- }
-
- protected byte[] unWrap(Object bytes) {
- return unwrapNonPrimitive( (Byte[]) bytes );
- }
-
- private byte[] unwrapNonPrimitive(Byte[] bytes) {
- int length = bytes.length;
- byte[] result = new byte[length];
- for ( int i = 0; i < length ; i++ ) {
- result[i] = bytes[i].byteValue();
- }
- return result;
- }
-
- private Byte[] wrapPrimitive(byte[] bytes) {
- int length = bytes.length;
- Byte[] result = new Byte[length];
- for ( int index = 0; index < length ; index++ ) {
- result[index] = Byte.valueOf( bytes[index] );
- }
- return result;
- }
-
- public boolean isMutable() {
- return true;
- }
-
- public Object replace(
- Object original,
- Object target,
- SessionImplementor session,
- Object owner,
- Map copyCache
- )
- throws HibernateException {
- if ( isEqual( original, target, session.getEntityMode() ) ) return original;
- return deepCopy( original, session.getEntityMode(), session.getFactory() );
- }
-
- public boolean[] toColumnNullness(Object value, Mapping mapping) {
- return value == null ? ArrayHelper.FALSE : ArrayHelper.TRUE;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/type/ByteArrayBlobType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/ByteArrayBlobType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/type/ByteArrayBlobType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/ByteArrayBlobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,195 @@
+//$Id$
+package org.hibernate.type;
+
+import java.io.ByteArrayInputStream;
+import java.sql.Blob;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Map;
+
+import org.dom4j.Node;
+import org.hibernate.EntityMode;
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.engine.Mapping;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.lob.BlobImpl;
+import org.hibernate.util.ArrayHelper;
+
+/**
+ * Map a Byte[] into a Blob
+ * Experimental
+ *
+ * @author Emmanuel Bernard
+ */
+public class ByteArrayBlobType extends AbstractLobType {
+
+ public int[] sqlTypes(Mapping mapping) throws MappingException {
+ return new int[]{Types.BLOB};
+ }
+
+ @Override
+ public boolean isEqual(Object x, Object y, EntityMode entityMode, SessionFactoryImplementor factory) {
+ if ( x == y ) return true;
+ if ( x == null || y == null ) return false;
+ if ( x instanceof Byte[] ) {
+ Object[] o1 = (Object[]) x;
+ Object[] o2 = (Object[]) y;
+ return ArrayHelper.isEquals( o1, o2 );
+ }
+ else {
+ byte[] c1 = (byte[]) x;
+ byte[] c2 = (byte[]) y;
+ return ArrayHelper.isEquals( c1, c2 );
+ }
+ }
+
+ public int getHashCode(Object x, EntityMode entityMode, SessionFactoryImplementor factory) {
+ if ( x instanceof Character[] ) {
+ Object[] o = (Object[]) x;
+ return ArrayHelper.hash( o );
+ }
+ else {
+ byte[] c = (byte[]) x;
+ return ArrayHelper.hash( c );
+ }
+ }
+
+ public Object deepCopy(Object value, EntityMode entityMode, SessionFactoryImplementor factory)
+ throws HibernateException {
+ if ( value == null ) return null;
+ if ( value instanceof Byte[] ) {
+ Byte[] array = (Byte[]) value;
+ int length = array.length;
+ Byte[] copy = new Byte[length];
+ for ( int index = 0; index < length ; index++ ) {
+ copy[index] = Byte.valueOf( array[index].byteValue() );
+ }
+ return copy;
+ }
+ else {
+ byte[] array = (byte[]) value;
+ int length = array.length;
+ byte[] copy = new byte[length];
+ System.arraycopy( array, 0, copy, 0, length );
+ return copy;
+ }
+ }
+
+ public Class getReturnedClass() {
+ return Byte[].class;
+ }
+
+ protected Object get(ResultSet rs, String name) throws SQLException {
+ Blob blob = rs.getBlob( name );
+ if ( rs.wasNull() ) return null;
+ int length = (int) blob.length();
+ byte[] primaryResult = blob.getBytes( 1, length );
+ return wrap( primaryResult );
+ }
+
+ protected void set(PreparedStatement st, Object value, int index, SessionImplementor session) throws SQLException {
+ if ( value == null ) {
+ st.setNull( index, sqlTypes( null )[0] );
+ }
+ else {
+ byte[] toSet = unWrap( value );
+ final boolean useInputStream = session.getFactory().getDialect().useInputStreamToInsertBlob();
+
+ if ( useInputStream ) {
+ st.setBinaryStream( index, new ByteArrayInputStream( toSet ), toSet.length );
+ }
+ else {
+ st.setBlob( index, new BlobImpl( toSet ) );
+ }
+ }
+ }
+
+ public void setToXMLNode(Node node, Object value, SessionFactoryImplementor factory) throws HibernateException {
+ node.setText( toString( value ) );
+ }
+
+ public String toString(Object val) {
+ byte[] bytes = unWrap( val );
+ StringBuilder buf = new StringBuilder( 2 * bytes.length );
+ for ( int i = 0; i < bytes.length ; i++ ) {
+ String hexStr = Integer.toHexString( bytes[i] - Byte.MIN_VALUE );
+ if ( hexStr.length() == 1 ) buf.append( '0' );
+ buf.append( hexStr );
+ }
+ return buf.toString();
+ }
+
+ public String toLoggableString(Object value, SessionFactoryImplementor factory) {
+ return value == null ? "null" : toString( value );
+ }
+
+ public Object fromXMLNode(Node xml, Mapping factory) throws HibernateException {
+ String xmlText = xml.getText();
+ return xmlText == null || xmlText.length() == 0 ? null : fromString( xmlText );
+ }
+
+ private Object fromString(String xmlText) {
+ if ( xmlText == null ) {
+ return null;
+ }
+ if ( xmlText.length() % 2 != 0 ) {
+ throw new IllegalArgumentException( "The string is not a valid xml representation of a binary content." );
+ }
+ byte[] bytes = new byte[xmlText.length() / 2];
+ for ( int i = 0; i < bytes.length ; i++ ) {
+ String hexStr = xmlText.substring( i * 2, ( i + 1 ) * 2 );
+ bytes[i] = (byte) ( Integer.parseInt( hexStr, 16 ) + Byte.MIN_VALUE );
+ }
+ return wrap( bytes );
+ }
+
+ protected Object wrap(byte[] bytes) {
+ return wrapPrimitive( bytes );
+ }
+
+ protected byte[] unWrap(Object bytes) {
+ return unwrapNonPrimitive( (Byte[]) bytes );
+ }
+
+ private byte[] unwrapNonPrimitive(Byte[] bytes) {
+ int length = bytes.length;
+ byte[] result = new byte[length];
+ for ( int i = 0; i < length ; i++ ) {
+ result[i] = bytes[i].byteValue();
+ }
+ return result;
+ }
+
+ private Byte[] wrapPrimitive(byte[] bytes) {
+ int length = bytes.length;
+ Byte[] result = new Byte[length];
+ for ( int index = 0; index < length ; index++ ) {
+ result[index] = Byte.valueOf( bytes[index] );
+ }
+ return result;
+ }
+
+ public boolean isMutable() {
+ return true;
+ }
+
+ public Object replace(
+ Object original,
+ Object target,
+ SessionImplementor session,
+ Object owner,
+ Map copyCache
+ )
+ throws HibernateException {
+ if ( isEqual( original, target, session.getEntityMode() ) ) return original;
+ return deepCopy( original, session.getEntityMode(), session.getFactory() );
+ }
+
+ public boolean[] toColumnNullness(Object value, Mapping mapping) {
+ return value == null ? ArrayHelper.FALSE : ArrayHelper.TRUE;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/type/CharacterArrayClobType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/CharacterArrayClobType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/CharacterArrayClobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,148 +0,0 @@
-//$Id$
-package org.hibernate.type;
-
-import java.io.CharArrayReader;
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Serializable;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.ArrayList;
-
-import org.hibernate.HibernateException;
-import org.hibernate.usertype.UserType;
-import org.hibernate.util.ArrayHelper;
-
-/**
- * Map a Character[] to a Clob
- * Experimental
- *
- * @author Emmanuel Bernard
- */
-public class CharacterArrayClobType implements UserType, Serializable {
- public static final int BUFFER_SIZE = 4096;
-
- public int[] sqlTypes() {
- return new int[]{Types.CLOB};
- }
-
- public Class returnedClass() {
- return Character[].class;
- }
-
- public boolean equals(Object x, Object y) throws HibernateException {
- if ( x == y ) return true;
- if ( x == null || y == null ) return false;
- if ( x instanceof Character[] ) {
- Object[] o1 = (Object[]) x;
- Object[] o2 = (Object[]) y;
- return ArrayHelper.isEquals( o1, o2 );
- }
- else {
- char[] c1 = (char[]) x;
- char[] c2 = (char[]) y;
- return ArrayHelper.isEquals( c1, c2 );
- }
- }
-
- public int hashCode(Object x) throws HibernateException {
- if ( x instanceof Character[] ) {
- Object[] o = (Object[]) x;
- return ArrayHelper.hash( o );
- }
- else {
- char[] c = (char[]) x;
- return ArrayHelper.hash( c );
- }
- }
-
- public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
- Reader reader = rs.getCharacterStream( names[0] );
- if ( reader == null ) return null;
- ArrayList result = new ArrayList();
- try {
- char[] charbuf = new char[BUFFER_SIZE];
- for ( int i = reader.read( charbuf ); i > 0 ; i = reader.read( charbuf ) ) {
- result.ensureCapacity( result.size() + BUFFER_SIZE );
- for ( int charIndex = 0; charIndex < i ; charIndex++ ) {
- result.add( Character.valueOf( charbuf[charIndex] ) );
- }
- }
- }
- catch (IOException e) {
- throw new SQLException( e.getMessage() );
- }
- if ( returnedClass().equals( Character[].class ) ) {
- return result.toArray( new Character[ result.size() ] );
- }
- else {
- //very suboptimal
- int length = result.size();
- char[] chars = new char[length];
- for ( int index = 0; index < length ; index++ ) {
- chars[index] = ( (Character) result.get( index ) ).charValue();
- }
- return chars;
- }
- }
-
- public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
- if ( value != null ) {
- char[] chars;
- if ( value instanceof Character[] ) {
- Character[] character = (Character[]) value;
- int length = character.length;
- chars = new char[length];
- for ( int i = 0; i < length ; i++ ) {
- chars[i] = character[i].charValue();
- }
- }
- else {
- chars = (char[]) value;
- }
- CharArrayReader reader = new CharArrayReader( chars );
- st.setCharacterStream( index, reader, chars.length );
- }
- else {
- st.setNull( index, sqlTypes()[0] );
- }
- }
-
- public Object deepCopy(Object value) throws HibernateException {
- if ( value == null ) return null;
- if ( value instanceof Character[] ) {
- Character[] array = (Character[]) value;
- int length = array.length;
- Character[] copy = new Character[length];
- for ( int index = 0; index < length ; index++ ) {
- copy[index] = Character.valueOf( array[index].charValue() );
- }
- return copy;
- }
- else {
- char[] array = (char[]) value;
- int length = array.length;
- char[] copy = new char[length];
- System.arraycopy( array, 0, copy, 0, length );
- return copy;
- }
- }
-
- public boolean isMutable() {
- return true;
- }
-
- public Serializable disassemble(Object value) throws HibernateException {
- return (Serializable) deepCopy( value );
- }
-
- public Object assemble(Serializable cached, Object owner) throws HibernateException {
- return deepCopy( cached );
- }
-
- public Object replace(Object original, Object target, Object owner) throws HibernateException {
- return deepCopy( original );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/type/CharacterArrayClobType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/CharacterArrayClobType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/type/CharacterArrayClobType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/CharacterArrayClobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,148 @@
+//$Id$
+package org.hibernate.type;
+
+import java.io.CharArrayReader;
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.ArrayList;
+
+import org.hibernate.HibernateException;
+import org.hibernate.usertype.UserType;
+import org.hibernate.util.ArrayHelper;
+
+/**
+ * Map a Character[] to a Clob
+ * Experimental
+ *
+ * @author Emmanuel Bernard
+ */
+public class CharacterArrayClobType implements UserType, Serializable {
+ public static final int BUFFER_SIZE = 4096;
+
+ public int[] sqlTypes() {
+ return new int[]{Types.CLOB};
+ }
+
+ public Class returnedClass() {
+ return Character[].class;
+ }
+
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if ( x == y ) return true;
+ if ( x == null || y == null ) return false;
+ if ( x instanceof Character[] ) {
+ Object[] o1 = (Object[]) x;
+ Object[] o2 = (Object[]) y;
+ return ArrayHelper.isEquals( o1, o2 );
+ }
+ else {
+ char[] c1 = (char[]) x;
+ char[] c2 = (char[]) y;
+ return ArrayHelper.isEquals( c1, c2 );
+ }
+ }
+
+ public int hashCode(Object x) throws HibernateException {
+ if ( x instanceof Character[] ) {
+ Object[] o = (Object[]) x;
+ return ArrayHelper.hash( o );
+ }
+ else {
+ char[] c = (char[]) x;
+ return ArrayHelper.hash( c );
+ }
+ }
+
+ public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
+ Reader reader = rs.getCharacterStream( names[0] );
+ if ( reader == null ) return null;
+ ArrayList result = new ArrayList();
+ try {
+ char[] charbuf = new char[BUFFER_SIZE];
+ for ( int i = reader.read( charbuf ); i > 0 ; i = reader.read( charbuf ) ) {
+ result.ensureCapacity( result.size() + BUFFER_SIZE );
+ for ( int charIndex = 0; charIndex < i ; charIndex++ ) {
+ result.add( Character.valueOf( charbuf[charIndex] ) );
+ }
+ }
+ }
+ catch (IOException e) {
+ throw new SQLException( e.getMessage() );
+ }
+ if ( returnedClass().equals( Character[].class ) ) {
+ return result.toArray( new Character[ result.size() ] );
+ }
+ else {
+ //very suboptimal
+ int length = result.size();
+ char[] chars = new char[length];
+ for ( int index = 0; index < length ; index++ ) {
+ chars[index] = ( (Character) result.get( index ) ).charValue();
+ }
+ return chars;
+ }
+ }
+
+ public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
+ if ( value != null ) {
+ char[] chars;
+ if ( value instanceof Character[] ) {
+ Character[] character = (Character[]) value;
+ int length = character.length;
+ chars = new char[length];
+ for ( int i = 0; i < length ; i++ ) {
+ chars[i] = character[i].charValue();
+ }
+ }
+ else {
+ chars = (char[]) value;
+ }
+ CharArrayReader reader = new CharArrayReader( chars );
+ st.setCharacterStream( index, reader, chars.length );
+ }
+ else {
+ st.setNull( index, sqlTypes()[0] );
+ }
+ }
+
+ public Object deepCopy(Object value) throws HibernateException {
+ if ( value == null ) return null;
+ if ( value instanceof Character[] ) {
+ Character[] array = (Character[]) value;
+ int length = array.length;
+ Character[] copy = new Character[length];
+ for ( int index = 0; index < length ; index++ ) {
+ copy[index] = Character.valueOf( array[index].charValue() );
+ }
+ return copy;
+ }
+ else {
+ char[] array = (char[]) value;
+ int length = array.length;
+ char[] copy = new char[length];
+ System.arraycopy( array, 0, copy, 0, length );
+ return copy;
+ }
+ }
+
+ public boolean isMutable() {
+ return true;
+ }
+
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) deepCopy( value );
+ }
+
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return deepCopy( cached );
+ }
+
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return deepCopy( original );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/type/EnumType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/EnumType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/EnumType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,369 +0,0 @@
-//$Id$
-package org.hibernate.type;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.Serializable;
-import java.lang.reflect.Method;
-import java.sql.DatabaseMetaData;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AssertionFailure;
-import org.hibernate.HibernateException;
-import org.hibernate.usertype.EnhancedUserType;
-import org.hibernate.usertype.ParameterizedType;
-import org.hibernate.util.ReflectHelper;
-import org.hibernate.util.StringHelper;
-
-/**
- * Enum type mapper
- * Try and find the appropriate SQL type depending on column metadata
- *
- * @author Emmanuel Bernard
- */
-//TODO implements readobject/writeobject to recalculate the enumclasses
-public class EnumType implements EnhancedUserType, ParameterizedType, Serializable {
- private static Log log = LogFactory.getLog( EnumType.class );
- private static final boolean IS_TRACE_ENABLED;
-
- static {
- //cache this, because it was a significant performance cost
- IS_TRACE_ENABLED = LogFactory.getLog( StringHelper.qualifier( Type.class.getName() ) ).isTraceEnabled();
- }
-
- public static final String ENUM = "enumClass";
- public static final String SCHEMA = "schema";
- public static final String CATALOG = "catalog";
- public static final String TABLE = "table";
- public static final String COLUMN = "column";
- public static final String TYPE = "type";
-
- private static Map<Class, Object[]> enumValues = new HashMap<Class, Object[]>();
-
- private Class<? extends Enum> enumClass;
- private String column;
- private String table;
- private String catalog;
- private String schema;
- private boolean guessed = false;
- private int sqlType = Types.INTEGER; //before any guessing
-
- public int[] sqlTypes() {
- return new int[]{sqlType};
- }
-
- public Class returnedClass() {
- return enumClass;
- }
-
- public boolean equals(Object x, Object y) throws HibernateException {
- return x == y;
- }
-
- public int hashCode(Object x) throws HibernateException {
- return x == null ? 0 : x.hashCode();
- }
-
- public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
- Object object = rs.getObject( names[0] );
- if ( rs.wasNull() ) {
- if ( IS_TRACE_ENABLED ) {
- log.debug( "Returning null as column " + names[0] );
- }
- return null;
- }
- if ( object instanceof Number ) {
- Object[] values = enumValues.get( enumClass );
- if ( values == null ) throw new AssertionFailure( "enumValues not preprocessed: " + enumClass );
- int ordinal = ( (Number) object ).intValue();
- if ( ordinal < 0 || ordinal >= values.length ) {
- throw new IllegalArgumentException( "Unknown ordinal value for enum " + enumClass + ": " + ordinal );
- }
- if ( IS_TRACE_ENABLED ) {
- log.debug( "Returning '" + ordinal + "' as column " + names[0] );
- }
- return values[ordinal];
- }
- else {
- String name = (String) object;
- if ( IS_TRACE_ENABLED ) {
- log.debug( "Returning '" + name + "' as column " + names[0] );
- }
- try {
- return Enum.valueOf( enumClass, name );
- }
- catch (IllegalArgumentException iae) {
- throw new IllegalArgumentException( "Unknown name value for enum " + enumClass + ": " + name, iae );
- }
- }
- }
-
- public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
- //if (!guessed) guessType( st, index );
- if ( value == null ) {
- if ( IS_TRACE_ENABLED ) log.debug( "Binding null to parameter: " + index );
- st.setNull( index, sqlType );
- }
- else {
- boolean isOrdinal = isOrdinal( sqlType );
- if ( isOrdinal ) {
- int ordinal = ( (Enum) value ).ordinal();
- if ( IS_TRACE_ENABLED ) {
- log.debug( "Binding '" + ordinal + "' to parameter: " + index );
- }
- st.setObject( index, Integer.valueOf( ordinal ), sqlType );
- }
- else {
- String enumString = ( (Enum) value ).name();
- if ( IS_TRACE_ENABLED ) {
- log.debug( "Binding '" + enumString + "' to parameter: " + index );
- }
- st.setObject( index, enumString, sqlType );
- }
- }
- }
-
- //TODO remove
- private void guessType(PreparedStatement statement, int index) {
- //TODO use SQLException wrapper?
- if ( ! guessed ) {
- try {
- sqlType = guessTypeFromMetaData( statement.getConnection().getMetaData() );
- }
- catch (SQLException e) {
- sqlType = guessTypeByParameter( statement, index, e );
- }
- catch (HibernateException e) {
- sqlType = guessTypeByParameter( statement, index, e );
- }
- guessed = true;
- }
- }
-
- //TODO remove
- private int guessTypeFromMetaData(DatabaseMetaData metadata) throws SQLException {
- ResultSet rs = null;
- try {
- String username = metadata.getUserName();
- int guessedType = Types.NULL;
- int numResults = 0;
- boolean nonNullType = false;
-
- // Try to find the column information up to three times. First with values as is in case
- // the database ever stores mixed case identifiers, or the supplied identifiers match
- // perfectly. Then if the metadata is not found, try using lower and upper case
- // identifiers - but only if the datbaase reports it would use them.
- rs = metadata.getColumns( catalog, schema, table, column );
-
- boolean isValid;
-
- isValid = rs.next();
-
- if ( ! isValid && metadata.storesLowerCaseIdentifiers() ) {
- rs.close();
- rs = metadata.getColumns(
- catalog == null ? catalog : catalog.toLowerCase(),
- schema == null ? schema : schema.toLowerCase(),
- table.toLowerCase(), column.toLowerCase()
- );
- isValid = rs.next();
- }
-
- if ( ! isValid && metadata.storesUpperCaseIdentifiers() ) {
- rs.close();
- rs = metadata.getColumns(
- catalog == null ? catalog : catalog.toUpperCase(),
- schema == null ? schema : schema.toUpperCase(),
- table.toUpperCase(), column.toUpperCase()
- );
- isValid = rs.next();
- }
-
- // try to find
- while ( isValid ) {
- guessedType = rs.getInt( "DATA_TYPE" );
- if ( rs.wasNull() ) {
- continue; // TODO throw exception?
- }
- else {
- nonNullType = true;
- }
-
- numResults++;
- if ( username != null ) {
- String schema = rs.getString( "TABLE_SCHEM" );
- // if the username matches the schema, there's no better guess available...
- if ( username.equalsIgnoreCase( schema ) ) return guessedType;
- }
- else if ( numResults > 1 ) {
- // if there's no username and multiple results, there's no point in continuing
- throw new HibernateException( "Several columns matching in metadata: " + column );
- }
- isValid = rs.next();
- }
- if ( numResults == 0 ) throw new HibernateException( "Enum type column not found in metadata: " + column );
- if ( numResults > 1 ) throw new HibernateException( "Several columns matching in metadata: " + column );
- if ( !nonNullType ) throw new HibernateException( "Column without type in metadata!: " + column );
- log.trace( "Enum type guessed from metadata: " + guessedType );
- return guessedType;
- }
- finally {
- try {
- if ( rs != null ) rs.close();
- }
- catch (SQLException e) {
- //swallow in purpose
- }
- }
- }
-
- //TODO remove
- private int guessTypeByParameter(PreparedStatement statement, int index, Exception e) {
- log.debug(
- "Unable to guess the column type for enum through conn.getMetadata(): "
- + e.getMessage()
- );
- try {
- return statement.getParameterMetaData().getParameterType( index );
- }
- catch (SQLException ee) {
- log.warn( "Unable to guess enum type, default to INTEGER", ee );
- return Types.INTEGER;
- }
- }
-
- private boolean isOrdinal(int paramType) {
- switch ( paramType ) {
- case Types.INTEGER:
- case Types.NUMERIC:
- case Types.SMALLINT:
- case Types.TINYINT:
- case Types.BIGINT:
- case Types.DECIMAL: //for Oracle Driver
- case Types.DOUBLE: //for Oracle Driver
- case Types.FLOAT: //for Oracle Driver
- return true;
- case Types.CHAR:
- case Types.LONGVARCHAR:
- case Types.VARCHAR:
- return false;
- default:
- throw new HibernateException( "Unable to persist an Enum in a column of SQL Type: " + paramType );
- }
- }
-
- public Object deepCopy(Object value) throws HibernateException {
- return value;
- }
-
- public boolean isMutable() {
- return false;
- }
-
- public Serializable disassemble(Object value) throws HibernateException {
- return (Serializable) value;
- }
-
- public Object assemble(Serializable cached, Object owner) throws HibernateException {
- return cached;
- }
-
- public Object replace(Object original, Object target, Object owner) throws HibernateException {
- return original;
- }
-
- public void setParameterValues(Properties parameters) {
- String enumClassName = parameters.getProperty( ENUM );
- try {
- enumClass = ReflectHelper.classForName( enumClassName, this.getClass() ).asSubclass( Enum.class );
- }
- catch (ClassNotFoundException exception) {
- throw new HibernateException( "Enum class not found", exception );
- }
- //this is threadsafe to do it here, setParameterValues() is called sequencially
- initEnumValue();
- //nullify unnullified properties yuck!
- schema = parameters.getProperty( SCHEMA );
- if ( "".equals( schema ) ) schema = null;
- catalog = parameters.getProperty( CATALOG );
- if ( "".equals( catalog ) ) catalog = null;
- table = parameters.getProperty( TABLE );
- column = parameters.getProperty( COLUMN );
- String type = parameters.getProperty( TYPE );
- if ( type != null ) {
- sqlType = Integer.decode( type ).intValue();
- guessed = true;
- }
- }
-
- private void initEnumValue() {
- Object[] values = enumValues.get( enumClass );
- if ( values == null ) {
- try {
- Method method = null;
- method = enumClass.getDeclaredMethod( "values", new Class[0] );
- values = (Object[]) method.invoke( null, new Object[0] );
- enumValues.put( enumClass, values );
- }
- catch (Exception e) {
- throw new HibernateException( "Error while accessing enum.values(): " + enumClass, e );
- }
- }
- }
-
- private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
- //FIXME Hum, I think I break the thread safety here
- ois.defaultReadObject();
- initEnumValue();
- }
-
- public String objectToSQLString(Object value) {
- boolean isOrdinal = isOrdinal( sqlType );
- if ( isOrdinal ) {
- int ordinal = ( (Enum) value ).ordinal();
- return Integer.toString( ordinal );
- }
- else {
- return '\'' + ( (Enum) value ).name() + '\'';
- }
- }
-
- public String toXMLString(Object value) {
- boolean isOrdinal = isOrdinal( sqlType );
- if ( isOrdinal ) {
- int ordinal = ( (Enum) value ).ordinal();
- return Integer.toString( ordinal );
- }
- else {
- return ( (Enum) value ).name();
- }
- }
-
- public Object fromXMLString(String xmlValue) {
- try {
- int ordinal = Integer.parseInt( xmlValue );
- Object[] values = enumValues.get( enumClass );
- if ( values == null ) throw new AssertionFailure( "enumValues not preprocessed: " + enumClass );
- if ( ordinal < 0 || ordinal >= values.length ) {
- throw new IllegalArgumentException( "Unknown ordinal value for enum " + enumClass + ": " + ordinal );
- }
- return values[ordinal];
- }
- catch(NumberFormatException e) {
- try {
- return Enum.valueOf( enumClass, xmlValue );
- }
- catch (IllegalArgumentException iae) {
- throw new IllegalArgumentException( "Unknown name value for enum " + enumClass + ": " + xmlValue, iae );
- }
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/type/EnumType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/EnumType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/type/EnumType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/EnumType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,369 @@
+//$Id$
+package org.hibernate.type;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.sql.DatabaseMetaData;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AssertionFailure;
+import org.hibernate.HibernateException;
+import org.hibernate.usertype.EnhancedUserType;
+import org.hibernate.usertype.ParameterizedType;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.util.StringHelper;
+
+/**
+ * Enum type mapper
+ * Try and find the appropriate SQL type depending on column metadata
+ *
+ * @author Emmanuel Bernard
+ */
+//TODO implements readobject/writeobject to recalculate the enumclasses
+public class EnumType implements EnhancedUserType, ParameterizedType, Serializable {
+ private static Log log = LogFactory.getLog( EnumType.class );
+ private static final boolean IS_TRACE_ENABLED;
+
+ static {
+ //cache this, because it was a significant performance cost
+ IS_TRACE_ENABLED = LogFactory.getLog( StringHelper.qualifier( Type.class.getName() ) ).isTraceEnabled();
+ }
+
+ public static final String ENUM = "enumClass";
+ public static final String SCHEMA = "schema";
+ public static final String CATALOG = "catalog";
+ public static final String TABLE = "table";
+ public static final String COLUMN = "column";
+ public static final String TYPE = "type";
+
+ private static Map<Class, Object[]> enumValues = new HashMap<Class, Object[]>();
+
+ private Class<? extends Enum> enumClass;
+ private String column;
+ private String table;
+ private String catalog;
+ private String schema;
+ private boolean guessed = false;
+ private int sqlType = Types.INTEGER; //before any guessing
+
+ public int[] sqlTypes() {
+ return new int[]{sqlType};
+ }
+
+ public Class returnedClass() {
+ return enumClass;
+ }
+
+ public boolean equals(Object x, Object y) throws HibernateException {
+ return x == y;
+ }
+
+ public int hashCode(Object x) throws HibernateException {
+ return x == null ? 0 : x.hashCode();
+ }
+
+ public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
+ Object object = rs.getObject( names[0] );
+ if ( rs.wasNull() ) {
+ if ( IS_TRACE_ENABLED ) {
+ log.debug( "Returning null as column " + names[0] );
+ }
+ return null;
+ }
+ if ( object instanceof Number ) {
+ Object[] values = enumValues.get( enumClass );
+ if ( values == null ) throw new AssertionFailure( "enumValues not preprocessed: " + enumClass );
+ int ordinal = ( (Number) object ).intValue();
+ if ( ordinal < 0 || ordinal >= values.length ) {
+ throw new IllegalArgumentException( "Unknown ordinal value for enum " + enumClass + ": " + ordinal );
+ }
+ if ( IS_TRACE_ENABLED ) {
+ log.debug( "Returning '" + ordinal + "' as column " + names[0] );
+ }
+ return values[ordinal];
+ }
+ else {
+ String name = (String) object;
+ if ( IS_TRACE_ENABLED ) {
+ log.debug( "Returning '" + name + "' as column " + names[0] );
+ }
+ try {
+ return Enum.valueOf( enumClass, name );
+ }
+ catch (IllegalArgumentException iae) {
+ throw new IllegalArgumentException( "Unknown name value for enum " + enumClass + ": " + name, iae );
+ }
+ }
+ }
+
+ public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
+ //if (!guessed) guessType( st, index );
+ if ( value == null ) {
+ if ( IS_TRACE_ENABLED ) log.debug( "Binding null to parameter: " + index );
+ st.setNull( index, sqlType );
+ }
+ else {
+ boolean isOrdinal = isOrdinal( sqlType );
+ if ( isOrdinal ) {
+ int ordinal = ( (Enum) value ).ordinal();
+ if ( IS_TRACE_ENABLED ) {
+ log.debug( "Binding '" + ordinal + "' to parameter: " + index );
+ }
+ st.setObject( index, Integer.valueOf( ordinal ), sqlType );
+ }
+ else {
+ String enumString = ( (Enum) value ).name();
+ if ( IS_TRACE_ENABLED ) {
+ log.debug( "Binding '" + enumString + "' to parameter: " + index );
+ }
+ st.setObject( index, enumString, sqlType );
+ }
+ }
+ }
+
+ //TODO remove
+ private void guessType(PreparedStatement statement, int index) {
+ //TODO use SQLException wrapper?
+ if ( ! guessed ) {
+ try {
+ sqlType = guessTypeFromMetaData( statement.getConnection().getMetaData() );
+ }
+ catch (SQLException e) {
+ sqlType = guessTypeByParameter( statement, index, e );
+ }
+ catch (HibernateException e) {
+ sqlType = guessTypeByParameter( statement, index, e );
+ }
+ guessed = true;
+ }
+ }
+
+ //TODO remove
+ private int guessTypeFromMetaData(DatabaseMetaData metadata) throws SQLException {
+ ResultSet rs = null;
+ try {
+ String username = metadata.getUserName();
+ int guessedType = Types.NULL;
+ int numResults = 0;
+ boolean nonNullType = false;
+
+ // Try to find the column information up to three times. First with values as is in case
+ // the database ever stores mixed case identifiers, or the supplied identifiers match
+ // perfectly. Then if the metadata is not found, try using lower and upper case
+ // identifiers - but only if the datbaase reports it would use them.
+ rs = metadata.getColumns( catalog, schema, table, column );
+
+ boolean isValid;
+
+ isValid = rs.next();
+
+ if ( ! isValid && metadata.storesLowerCaseIdentifiers() ) {
+ rs.close();
+ rs = metadata.getColumns(
+ catalog == null ? catalog : catalog.toLowerCase(),
+ schema == null ? schema : schema.toLowerCase(),
+ table.toLowerCase(), column.toLowerCase()
+ );
+ isValid = rs.next();
+ }
+
+ if ( ! isValid && metadata.storesUpperCaseIdentifiers() ) {
+ rs.close();
+ rs = metadata.getColumns(
+ catalog == null ? catalog : catalog.toUpperCase(),
+ schema == null ? schema : schema.toUpperCase(),
+ table.toUpperCase(), column.toUpperCase()
+ );
+ isValid = rs.next();
+ }
+
+ // try to find
+ while ( isValid ) {
+ guessedType = rs.getInt( "DATA_TYPE" );
+ if ( rs.wasNull() ) {
+ continue; // TODO throw exception?
+ }
+ else {
+ nonNullType = true;
+ }
+
+ numResults++;
+ if ( username != null ) {
+ String schema = rs.getString( "TABLE_SCHEM" );
+ // if the username matches the schema, there's no better guess available...
+ if ( username.equalsIgnoreCase( schema ) ) return guessedType;
+ }
+ else if ( numResults > 1 ) {
+ // if there's no username and multiple results, there's no point in continuing
+ throw new HibernateException( "Several columns matching in metadata: " + column );
+ }
+ isValid = rs.next();
+ }
+ if ( numResults == 0 ) throw new HibernateException( "Enum type column not found in metadata: " + column );
+ if ( numResults > 1 ) throw new HibernateException( "Several columns matching in metadata: " + column );
+ if ( !nonNullType ) throw new HibernateException( "Column without type in metadata!: " + column );
+ log.trace( "Enum type guessed from metadata: " + guessedType );
+ return guessedType;
+ }
+ finally {
+ try {
+ if ( rs != null ) rs.close();
+ }
+ catch (SQLException e) {
+ //swallow in purpose
+ }
+ }
+ }
+
+ //TODO remove
+ private int guessTypeByParameter(PreparedStatement statement, int index, Exception e) {
+ log.debug(
+ "Unable to guess the column type for enum through conn.getMetadata(): "
+ + e.getMessage()
+ );
+ try {
+ return statement.getParameterMetaData().getParameterType( index );
+ }
+ catch (SQLException ee) {
+ log.warn( "Unable to guess enum type, default to INTEGER", ee );
+ return Types.INTEGER;
+ }
+ }
+
+ private boolean isOrdinal(int paramType) {
+ switch ( paramType ) {
+ case Types.INTEGER:
+ case Types.NUMERIC:
+ case Types.SMALLINT:
+ case Types.TINYINT:
+ case Types.BIGINT:
+ case Types.DECIMAL: //for Oracle Driver
+ case Types.DOUBLE: //for Oracle Driver
+ case Types.FLOAT: //for Oracle Driver
+ return true;
+ case Types.CHAR:
+ case Types.LONGVARCHAR:
+ case Types.VARCHAR:
+ return false;
+ default:
+ throw new HibernateException( "Unable to persist an Enum in a column of SQL Type: " + paramType );
+ }
+ }
+
+ public Object deepCopy(Object value) throws HibernateException {
+ return value;
+ }
+
+ public boolean isMutable() {
+ return false;
+ }
+
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+
+ public void setParameterValues(Properties parameters) {
+ String enumClassName = parameters.getProperty( ENUM );
+ try {
+ enumClass = ReflectHelper.classForName( enumClassName, this.getClass() ).asSubclass( Enum.class );
+ }
+ catch (ClassNotFoundException exception) {
+ throw new HibernateException( "Enum class not found", exception );
+ }
+ //this is threadsafe to do it here, setParameterValues() is called sequencially
+ initEnumValue();
+ //nullify unnullified properties yuck!
+ schema = parameters.getProperty( SCHEMA );
+ if ( "".equals( schema ) ) schema = null;
+ catalog = parameters.getProperty( CATALOG );
+ if ( "".equals( catalog ) ) catalog = null;
+ table = parameters.getProperty( TABLE );
+ column = parameters.getProperty( COLUMN );
+ String type = parameters.getProperty( TYPE );
+ if ( type != null ) {
+ sqlType = Integer.decode( type ).intValue();
+ guessed = true;
+ }
+ }
+
+ private void initEnumValue() {
+ Object[] values = enumValues.get( enumClass );
+ if ( values == null ) {
+ try {
+ Method method = null;
+ method = enumClass.getDeclaredMethod( "values", new Class[0] );
+ values = (Object[]) method.invoke( null, new Object[0] );
+ enumValues.put( enumClass, values );
+ }
+ catch (Exception e) {
+ throw new HibernateException( "Error while accessing enum.values(): " + enumClass, e );
+ }
+ }
+ }
+
+ private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+ //FIXME Hum, I think I break the thread safety here
+ ois.defaultReadObject();
+ initEnumValue();
+ }
+
+ public String objectToSQLString(Object value) {
+ boolean isOrdinal = isOrdinal( sqlType );
+ if ( isOrdinal ) {
+ int ordinal = ( (Enum) value ).ordinal();
+ return Integer.toString( ordinal );
+ }
+ else {
+ return '\'' + ( (Enum) value ).name() + '\'';
+ }
+ }
+
+ public String toXMLString(Object value) {
+ boolean isOrdinal = isOrdinal( sqlType );
+ if ( isOrdinal ) {
+ int ordinal = ( (Enum) value ).ordinal();
+ return Integer.toString( ordinal );
+ }
+ else {
+ return ( (Enum) value ).name();
+ }
+ }
+
+ public Object fromXMLString(String xmlValue) {
+ try {
+ int ordinal = Integer.parseInt( xmlValue );
+ Object[] values = enumValues.get( enumClass );
+ if ( values == null ) throw new AssertionFailure( "enumValues not preprocessed: " + enumClass );
+ if ( ordinal < 0 || ordinal >= values.length ) {
+ throw new IllegalArgumentException( "Unknown ordinal value for enum " + enumClass + ": " + ordinal );
+ }
+ return values[ordinal];
+ }
+ catch(NumberFormatException e) {
+ try {
+ return Enum.valueOf( enumClass, xmlValue );
+ }
+ catch (IllegalArgumentException iae) {
+ throw new IllegalArgumentException( "Unknown name value for enum " + enumClass + ": " + xmlValue, iae );
+ }
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveByteArrayBlobType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveByteArrayBlobType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveByteArrayBlobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.type;
-
-/**
- * Map a byte[] to a Blob
- *
- * @author Emmanuel Bernard
- */
-public class PrimitiveByteArrayBlobType extends ByteArrayBlobType {
- public Class getReturnedClass() {
- return byte[].class;
- }
-
- protected Object wrap(byte[] bytes) {
- return bytes;
- }
-
- protected byte[] unWrap(Object bytes) {
- return (byte[]) bytes;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveByteArrayBlobType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveByteArrayBlobType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveByteArrayBlobType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveByteArrayBlobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.type;
+
+/**
+ * Map a byte[] to a Blob
+ *
+ * @author Emmanuel Bernard
+ */
+public class PrimitiveByteArrayBlobType extends ByteArrayBlobType {
+ public Class getReturnedClass() {
+ return byte[].class;
+ }
+
+ protected Object wrap(byte[] bytes) {
+ return bytes;
+ }
+
+ protected byte[] unWrap(Object bytes) {
+ return (byte[]) bytes;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveCharacterArrayClobType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveCharacterArrayClobType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveCharacterArrayClobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id$
-package org.hibernate.type;
-
-
-/**
- * Map a char[] to a Clob
- *
- * @author Emmanuel Bernard
- */
-public class PrimitiveCharacterArrayClobType extends CharacterArrayClobType {
- public Class returnedClass() {
- return char[].class;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveCharacterArrayClobType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveCharacterArrayClobType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveCharacterArrayClobType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/PrimitiveCharacterArrayClobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id$
+package org.hibernate.type;
+
+
+/**
+ * Map a char[] to a Clob
+ *
+ * @author Emmanuel Bernard
+ */
+public class PrimitiveCharacterArrayClobType extends CharacterArrayClobType {
+ public Class returnedClass() {
+ return char[].class;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/type/SerializableToBlobType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/SerializableToBlobType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/SerializableToBlobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,135 +0,0 @@
-//$Id$
-package org.hibernate.type;
-
-import java.io.ByteArrayInputStream;
-import java.io.Serializable;
-import java.sql.Blob;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Map;
-import java.util.Properties;
-
-import org.dom4j.Node;
-import org.hibernate.EntityMode;
-import org.hibernate.HibernateException;
-import org.hibernate.MappingException;
-import org.hibernate.engine.Mapping;
-import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.lob.BlobImpl;
-import org.hibernate.usertype.ParameterizedType;
-import org.hibernate.util.ReflectHelper;
-import org.hibernate.util.SerializationHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class SerializableToBlobType extends AbstractLobType implements ParameterizedType {
- /**
- * class name of the serialisable class
- */
- public static final String CLASS_NAME = "classname";
- private Class serializableClass;
- private SerializableType type;
-
- public int[] sqlTypes(Mapping mapping) throws MappingException {
- return new int[]{Types.BLOB};
- }
-
- public Class getReturnedClass() {
- return serializableClass;
- }
-
- @Override
- public boolean isEqual(Object x, Object y, EntityMode entityMode, SessionFactoryImplementor factory) {
- return type.isEqual( x, y );
- }
-
-
- @Override
- public int getHashCode(Object x, EntityMode entityMode, SessionFactoryImplementor session) {
- return type.getHashCode( x, null );
- }
-
- public Object get(ResultSet rs, String name) throws SQLException {
- Blob blob = rs.getBlob( name );
- if ( rs.wasNull() ) return null;
- int length = (int) blob.length();
- byte[] primaryResult = blob.getBytes( 1, length );
- return fromBytes( primaryResult );
- }
-
- private static byte[] toBytes(Object object) throws SerializationException {
- return SerializationHelper.serialize( (Serializable) object );
- }
-
- private static Object fromBytes(byte[] bytes) throws SerializationException {
- return SerializationHelper.deserialize( bytes );
- }
-
- public void set(PreparedStatement st, Object value, int index, SessionImplementor session) throws SQLException {
- if ( value != null ) {
- byte[] toSet;
- toSet = toBytes( value );
- if ( session.getFactory().getDialect().useInputStreamToInsertBlob() ) {
- st.setBinaryStream( index, new ByteArrayInputStream( toSet ), toSet.length );
- }
- else {
- st.setBlob( index, new BlobImpl( toSet ) );
- }
- }
- else {
- st.setNull( index, sqlTypes( null )[0] );
- }
- }
-
- public void setToXMLNode(Node node, Object value, SessionFactoryImplementor factory) throws HibernateException {
- type.setToXMLNode( node, value, factory );
- }
-
- public String toLoggableString(Object value, SessionFactoryImplementor factory) throws HibernateException {
- return type.toLoggableString( value, factory );
- }
-
- public Object fromXMLNode(Node xml, Mapping factory) throws HibernateException {
- return type.fromXMLNode( xml, factory );
- }
-
- public Object deepCopy(Object value, EntityMode entityMode, SessionFactoryImplementor factory)
- throws HibernateException {
- return type.deepCopy( value, null, null );
- }
-
- public boolean isMutable() {
- return type.isMutable();
- }
-
- public Object replace(Object original, Object target, SessionImplementor session, Object owner, Map copyCache)
- throws HibernateException {
- return type.replace( original, target, session, owner, copyCache );
- }
-
- public boolean[] toColumnNullness(Object value, Mapping mapping) {
- return type.toColumnNullness( value, mapping );
- }
-
- public void setParameterValues(Properties parameters) {
- if ( parameters != null ) {
- String className = parameters.getProperty( CLASS_NAME );
- if ( className == null ) {
- throw new MappingException(
- "No class name defined for type: " + SerializableToBlobType.class.getName()
- );
- }
- try {
- serializableClass = ReflectHelper.classForName( className );
- }
- catch (ClassNotFoundException e) {
- throw new MappingException( "Unable to load class from " + CLASS_NAME + " parameter", e );
- }
- }
- type = new SerializableType( serializableClass );
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/type/SerializableToBlobType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/SerializableToBlobType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/type/SerializableToBlobType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/SerializableToBlobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,135 @@
+//$Id$
+package org.hibernate.type;
+
+import java.io.ByteArrayInputStream;
+import java.io.Serializable;
+import java.sql.Blob;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Map;
+import java.util.Properties;
+
+import org.dom4j.Node;
+import org.hibernate.EntityMode;
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.engine.Mapping;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.lob.BlobImpl;
+import org.hibernate.usertype.ParameterizedType;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.util.SerializationHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SerializableToBlobType extends AbstractLobType implements ParameterizedType {
+ /**
+ * class name of the serialisable class
+ */
+ public static final String CLASS_NAME = "classname";
+ private Class serializableClass;
+ private SerializableType type;
+
+ public int[] sqlTypes(Mapping mapping) throws MappingException {
+ return new int[]{Types.BLOB};
+ }
+
+ public Class getReturnedClass() {
+ return serializableClass;
+ }
+
+ @Override
+ public boolean isEqual(Object x, Object y, EntityMode entityMode, SessionFactoryImplementor factory) {
+ return type.isEqual( x, y );
+ }
+
+
+ @Override
+ public int getHashCode(Object x, EntityMode entityMode, SessionFactoryImplementor session) {
+ return type.getHashCode( x, null );
+ }
+
+ public Object get(ResultSet rs, String name) throws SQLException {
+ Blob blob = rs.getBlob( name );
+ if ( rs.wasNull() ) return null;
+ int length = (int) blob.length();
+ byte[] primaryResult = blob.getBytes( 1, length );
+ return fromBytes( primaryResult );
+ }
+
+ private static byte[] toBytes(Object object) throws SerializationException {
+ return SerializationHelper.serialize( (Serializable) object );
+ }
+
+ private static Object fromBytes(byte[] bytes) throws SerializationException {
+ return SerializationHelper.deserialize( bytes );
+ }
+
+ public void set(PreparedStatement st, Object value, int index, SessionImplementor session) throws SQLException {
+ if ( value != null ) {
+ byte[] toSet;
+ toSet = toBytes( value );
+ if ( session.getFactory().getDialect().useInputStreamToInsertBlob() ) {
+ st.setBinaryStream( index, new ByteArrayInputStream( toSet ), toSet.length );
+ }
+ else {
+ st.setBlob( index, new BlobImpl( toSet ) );
+ }
+ }
+ else {
+ st.setNull( index, sqlTypes( null )[0] );
+ }
+ }
+
+ public void setToXMLNode(Node node, Object value, SessionFactoryImplementor factory) throws HibernateException {
+ type.setToXMLNode( node, value, factory );
+ }
+
+ public String toLoggableString(Object value, SessionFactoryImplementor factory) throws HibernateException {
+ return type.toLoggableString( value, factory );
+ }
+
+ public Object fromXMLNode(Node xml, Mapping factory) throws HibernateException {
+ return type.fromXMLNode( xml, factory );
+ }
+
+ public Object deepCopy(Object value, EntityMode entityMode, SessionFactoryImplementor factory)
+ throws HibernateException {
+ return type.deepCopy( value, null, null );
+ }
+
+ public boolean isMutable() {
+ return type.isMutable();
+ }
+
+ public Object replace(Object original, Object target, SessionImplementor session, Object owner, Map copyCache)
+ throws HibernateException {
+ return type.replace( original, target, session, owner, copyCache );
+ }
+
+ public boolean[] toColumnNullness(Object value, Mapping mapping) {
+ return type.toColumnNullness( value, mapping );
+ }
+
+ public void setParameterValues(Properties parameters) {
+ if ( parameters != null ) {
+ String className = parameters.getProperty( CLASS_NAME );
+ if ( className == null ) {
+ throw new MappingException(
+ "No class name defined for type: " + SerializableToBlobType.class.getName()
+ );
+ }
+ try {
+ serializableClass = ReflectHelper.classForName( className );
+ }
+ catch (ClassNotFoundException e) {
+ throw new MappingException( "Unable to load class from " + CLASS_NAME + " parameter", e );
+ }
+ }
+ type = new SerializableType( serializableClass );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/java/org/hibernate/type/StringClobType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/StringClobType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/StringClobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,85 +0,0 @@
-//$Id$
-package org.hibernate.type;
-
-import java.io.IOException;
-import java.io.Reader;
-import java.io.Serializable;
-import java.io.StringReader;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-
-import org.hibernate.HibernateException;
-import org.hibernate.usertype.UserType;
-
-/**
- * Map a String to a Clob
- *
- * @author Emmanuel Bernard
- */
-public class StringClobType implements UserType, Serializable {
- public int[] sqlTypes() {
- return new int[]{Types.CLOB};
- }
-
- public Class returnedClass() {
- return String.class;
- }
-
- public boolean equals(Object x, Object y) throws HibernateException {
- return ( x == y ) || ( x != null && x.equals( y ) );
- }
-
- public int hashCode(Object x) throws HibernateException {
- return x.hashCode();
- }
-
- public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
- Reader reader = rs.getCharacterStream( names[0] );
- if ( reader == null ) return null;
- StringBuilder result = new StringBuilder( 4096 );
- try {
- char[] charbuf = new char[4096];
- for ( int i = reader.read( charbuf ); i > 0 ; i = reader.read( charbuf ) ) {
- result.append( charbuf, 0, i );
- }
- }
- catch (IOException e) {
- throw new SQLException( e.getMessage() );
- }
- return result.toString();
- }
-
- public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
- if ( value != null ) {
- String string = (String) value;
- StringReader reader = new StringReader( string );
- st.setCharacterStream( index, reader, string.length() );
- }
- else {
- st.setNull( index, sqlTypes()[0] );
- }
- }
-
- public Object deepCopy(Object value) throws HibernateException {
- //returning value should be OK since String are immutable
- return value;
- }
-
- public boolean isMutable() {
- return false;
- }
-
- public Serializable disassemble(Object value) throws HibernateException {
- return (Serializable) value;
- }
-
- public Object assemble(Serializable cached, Object owner) throws HibernateException {
- return cached;
- }
-
- public Object replace(Object original, Object target, Object owner) throws HibernateException {
- return original;
- }
-}
Copied: trunk/HibernateExt/annotations/src/java/org/hibernate/type/StringClobType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/java/org/hibernate/type/StringClobType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/java/org/hibernate/type/StringClobType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/java/org/hibernate/type/StringClobType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,85 @@
+//$Id$
+package org.hibernate.type;
+
+import java.io.IOException;
+import java.io.Reader;
+import java.io.Serializable;
+import java.io.StringReader;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+
+import org.hibernate.HibernateException;
+import org.hibernate.usertype.UserType;
+
+/**
+ * Map a String to a Clob
+ *
+ * @author Emmanuel Bernard
+ */
+public class StringClobType implements UserType, Serializable {
+ public int[] sqlTypes() {
+ return new int[]{Types.CLOB};
+ }
+
+ public Class returnedClass() {
+ return String.class;
+ }
+
+ public boolean equals(Object x, Object y) throws HibernateException {
+ return ( x == y ) || ( x != null && x.equals( y ) );
+ }
+
+ public int hashCode(Object x) throws HibernateException {
+ return x.hashCode();
+ }
+
+ public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
+ Reader reader = rs.getCharacterStream( names[0] );
+ if ( reader == null ) return null;
+ StringBuilder result = new StringBuilder( 4096 );
+ try {
+ char[] charbuf = new char[4096];
+ for ( int i = reader.read( charbuf ); i > 0 ; i = reader.read( charbuf ) ) {
+ result.append( charbuf, 0, i );
+ }
+ }
+ catch (IOException e) {
+ throw new SQLException( e.getMessage() );
+ }
+ return result.toString();
+ }
+
+ public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
+ if ( value != null ) {
+ String string = (String) value;
+ StringReader reader = new StringReader( string );
+ st.setCharacterStream( index, reader, string.length() );
+ }
+ else {
+ st.setNull( index, sqlTypes()[0] );
+ }
+ }
+
+ public Object deepCopy(Object value) throws HibernateException {
+ //returning value should be OK since String are immutable
+ return value;
+ }
+
+ public boolean isMutable() {
+ return false;
+ }
+
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test)
Deleted: trunk/HibernateExt/annotations/src/test/ehcache.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/ehcache.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/ehcache.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,80 +0,0 @@
-<ehcache>
- <!-- Sets the path to the directory where cache .data files are created.
- If the path is a Java System Property it is replaced by
- its value in the running VM.
-
- The following properties are translated:
- user.home - User's home directory
- user.dir - User's current working directory
- java.io.tmpdir - Default temp file path -->
-
- <diskStore path="java.io.tmpdir"/>
- <!--Default Cache configuration. These will applied to caches programmatically created through
- the CacheManager.
- The following attributes are required for defaultCache:
- maxInMemory - Sets the maximum number of objects that will be created in memory
- eternal - Sets whether elements are eternal. If eternal, timeouts are ignored and the element
- is never expired.
- timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
- if the element is not eternal. Idle time is now - last accessed time
- timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
- if the element is not eternal. TTL is now - creation time
- overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache
- has reached the maxInMemory limit.
-
- -->
-
- <defaultCache
- maxElementsInMemory="10000"
- eternal="false"
- timeToIdleSeconds="120"
- timeToLiveSeconds="120"
- overflowToDisk="true"
- />
- <!--Predefined caches. Add your cache configuration settings here.
- If you do not have a configuration for your cache a WARNING will be issued when the
- CacheManager starts
- The following attributes are required for defaultCache:
- name - Sets the name of the cache. This is used to identify the cache. It must be unique.
- maxInMemory - Sets the maximum number of objects that will be created in memory
- eternal - Sets whether elements are eternal. If eternal, timeouts are ignored and the element
- is never expired.
- timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
- if the element is not eternal. Idle time is now - last accessed time
- timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
- if the element is not eternal. TTL is now - creation time
- overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache
- has reached the maxInMemory limit.
- -->
-
- <!-- Sample cache named sampleCache1
- This cache contains a maximum in memory of 10000 elements, and will expire
- an element if it is idle for more than 5 minutes and lives for more than
- 10 minutes.
-
- If there are more than 10000 elements it will overflow to the
- disk cache, which in this configuration will go to wherever java.io.tmp is
- defined on your system. On a standard Linux system this will be /tmp"
- -->
-
- <cache name="sampleCache1"
- maxElementsInMemory="10000"
- eternal="false"
- timeToIdleSeconds="300"
- timeToLiveSeconds="600"
- overflowToDisk="true"
- />
-
- <!-- Sample cache named sampleCache2
- This cache contains 1000 elements. Elements will always be held in memory.
- They are not expired. -->
- <cache name="sampleCache2"
- maxElementsInMemory="1000"
- eternal="true"
- timeToIdleSeconds="0"
- timeToLiveSeconds="0"
- overflowToDisk="false"
- />
-
- <!-- Place configuration for your caches following -->
-</ehcache>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/ehcache.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/ehcache.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/ehcache.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/ehcache.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,80 @@
+<ehcache>
+ <!-- Sets the path to the directory where cache .data files are created.
+ If the path is a Java System Property it is replaced by
+ its value in the running VM.
+
+ The following properties are translated:
+ user.home - User's home directory
+ user.dir - User's current working directory
+ java.io.tmpdir - Default temp file path -->
+
+ <diskStore path="java.io.tmpdir"/>
+ <!--Default Cache configuration. These will applied to caches programmatically created through
+ the CacheManager.
+ The following attributes are required for defaultCache:
+ maxInMemory - Sets the maximum number of objects that will be created in memory
+ eternal - Sets whether elements are eternal. If eternal, timeouts are ignored and the element
+ is never expired.
+ timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
+ if the element is not eternal. Idle time is now - last accessed time
+ timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
+ if the element is not eternal. TTL is now - creation time
+ overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache
+ has reached the maxInMemory limit.
+
+ -->
+
+ <defaultCache
+ maxElementsInMemory="10000"
+ eternal="false"
+ timeToIdleSeconds="120"
+ timeToLiveSeconds="120"
+ overflowToDisk="true"
+ />
+ <!--Predefined caches. Add your cache configuration settings here.
+ If you do not have a configuration for your cache a WARNING will be issued when the
+ CacheManager starts
+ The following attributes are required for defaultCache:
+ name - Sets the name of the cache. This is used to identify the cache. It must be unique.
+ maxInMemory - Sets the maximum number of objects that will be created in memory
+ eternal - Sets whether elements are eternal. If eternal, timeouts are ignored and the element
+ is never expired.
+ timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
+ if the element is not eternal. Idle time is now - last accessed time
+ timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
+ if the element is not eternal. TTL is now - creation time
+ overflowToDisk - Sets whether elements can overflow to disk when the in-memory cache
+ has reached the maxInMemory limit.
+ -->
+
+ <!-- Sample cache named sampleCache1
+ This cache contains a maximum in memory of 10000 elements, and will expire
+ an element if it is idle for more than 5 minutes and lives for more than
+ 10 minutes.
+
+ If there are more than 10000 elements it will overflow to the
+ disk cache, which in this configuration will go to wherever java.io.tmp is
+ defined on your system. On a standard Linux system this will be /tmp"
+ -->
+
+ <cache name="sampleCache1"
+ maxElementsInMemory="10000"
+ eternal="false"
+ timeToIdleSeconds="300"
+ timeToLiveSeconds="600"
+ overflowToDisk="true"
+ />
+
+ <!-- Sample cache named sampleCache2
+ This cache contains 1000 elements. Elements will always be held in memory.
+ They are not expired. -->
+ <cache name="sampleCache2"
+ maxElementsInMemory="1000"
+ eternal="true"
+ timeToIdleSeconds="0"
+ timeToLiveSeconds="0"
+ overflowToDisk="false"
+ />
+
+ <!-- Place configuration for your caches following -->
+</ehcache>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/hibernate.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/hibernate.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/hibernate.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,472 +0,0 @@
-######################
-### Query Language ###
-######################
-
-## define query language constants / function names
-
-hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
-
-
-## select the classic query parser
-
-#hibernate.query.factory_class org.hibernate.hql.classic.ClassicQueryTranslatorFactory
-
-hibernate.format_sql true
-
-
-
-#################
-### Platforms ###
-#################
-
-## JNDI Datasource
-
-#hibernate.connection.datasource jdbc/test
-#hibernate.connection.username db2
-#hibernate.connection.password db2
-
-
-## HypersonicSQL
-
-hibernate.dialect org.hibernate.dialect.HSQLDialect
-hibernate.connection.driver_class org.hsqldb.jdbcDriver
-hibernate.connection.username sa
-hibernate.connection.password
-hibernate.connection.url jdbc:hsqldb:hsql://localhost
-hibernate.connection.url jdbc:hsqldb:test
-hibernate.connection.url jdbc:hsqldb:.
-
-
-## MySQL
-
-#hibernate.dialect org.hibernate.dialect.MySQLDialect
-#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
-#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
-#hibernate.connection.driver_class com.mysql.jdbc.Driver
-#hibernate.connection.url jdbc:mysql:///test
-#hibernate.connection.username emmanuel
-#hibernate.connection.password hibernate
-
-
-## Oracle
-
-#hibernate.dialect org.hibernate.dialect.OracleDialect
-#hibernate.dialect org.hibernate.dialect.Oracle9Dialect
-#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
-#hibernate.connection.username ora
-#hibernate.connection.password ora
-#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:test
-
-
-## PostgreSQL
-
-#hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
-#hibernate.connection.driver_class org.postgresql.Driver
-#hibernate.connection.url jdbc:postgresql:annotations
-#hibernate.connection.username postgres
-#hibernate.connection.password hibernate
-#hibernate.query.substitutions yes 'Y', no 'N'
-
-
-## DB2
-
-#hibernate.dialect org.hibernate.dialect.DB2Dialect
-#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
-#hibernate.connection.url jdbc:db2:test
-#hibernate.connection.username db2
-#hibernate.connection.password db2
-
-## TimesTen (not supported yet)
-
-#hibernate.dialect org.hibernate.dialect.TimesTenDialect
-#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
-#hibernate.connection.url jdbc:timesten:direct:test
-#hibernate.connection.username
-#hibernate.connection.password
-
-## DB2/400
-
-#hibernate.dialect org.hibernate.dialect.DB2400Dialect
-#hibernate.connection.username user
-#hibernate.connection.password password
-
-## Native driver
-#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
-#hibernate.connection.url jdbc:db2://systemname
-
-## Toolbox driver
-#hibernate.connection.driver_class com.ibm.as400.access.AS400JDBCDriver
-#hibernate.connection.url jdbc:as400://systemname
-
-
-## Derby (Not supported!)
-
-#hibernate.dialect org.hibernate.dialect.DerbyDialect
-#hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver
-#hibernate.connection.username
-#hibernate.connection.password
-#hibernate.connection.url jdbc:derby:/test;create=true
-
-
-## Sybase
-
-#hibernate.dialect org.hibernate.dialect.SybaseDialect
-#hibernate.connection.driver_class com.sybase.jdbc2.jdbc.SybDriver
-#hibernate.connection.username sa
-#hibernate.connection.password sasasa
-#hibernate.connection.url jdbc:sybase:Tds:co3061835-a:5000/tempdb
-
-
-## Mckoi SQL
-
-#hibernate.dialect org.hibernate.dialect.MckoiDialect
-#hibernate.connection.driver_class com.mckoi.JDBCDriver
-#hibernate.connection.url jdbc:mckoi:///
-#hibernate.connection.url jdbc:mckoi:local://C:/mckoi1.00/db.conf
-#hibernate.connection.username admin
-#hibernate.connection.password nimda
-
-
-## SAP DB
-
-#hibernate.dialect org.hibernate.dialect.SAPDBDialect
-#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
-#hibernate.connection.url jdbc:sapdb://localhost/TST
-#hibernate.connection.username TEST
-#hibernate.connection.password TEST
-#hibernate.query.substitutions yes 'Y', no 'N'
-
-
-## MS SQL Server
-
-#hibernate.dialect org.hibernate.dialect.SQLServerDialect
-#hibernate.connection.username sa
-#hibernate.connection.password sa
-
-## JSQL Driver
-#hibernate.connection.driver_class com.jnetdirect.jsql.JSQLDriver
-#hibernate.connection.url jdbc:JSQLConnect://1E1/test
-
-## JTURBO Driver
-#hibernate.connection.driver_class com.newatlanta.jturbo.driver.Driver
-#hibernate.connection.url jdbc:JTurbo://1E1:1433/test
-
-## WebLogic Driver
-#hibernate.connection.driver_class weblogic.jdbc.mssqlserver4.Driver
-#hibernate.connection.url jdbc:weblogic:mssqlserver4:1E1:1433
-
-## Microsoft Driver (not recommended!)
-#hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
-#hibernate.connection.url jdbc:microsoft:sqlserver://1E1;DatabaseName=test;SelectMethod=cursor
-
-## jTDS (since version 0.9)
-#hibernate.connection.driver_class net.sourceforge.jtds.jdbc.Driver
-#hibernate.connection.url jdbc:jtds:sqlserver://1E1/test
-
-## Interbase
-
-#hibernate.dialect org.hibernate.dialect.InterbaseDialect
-#hibernate.connection.username sysdba
-#hibernate.connection.password masterkey
-
-## DO NOT specify hibernate.connection.sqlDialect
-
-## InterClient
-
-#hibernate.connection.driver_class interbase.interclient.Driver
-#hibernate.connection.url jdbc:interbase://localhost:3060/C:/firebird/test.gdb
-
-## Pure Java
-
-#hibernate.connection.driver_class org.firebirdsql.jdbc.FBDriver
-#hibernate.connection.url jdbc:firebirdsql:localhost/3050:/firebird/test.gdb
-
-
-## Pointbase
-
-#hibernate.dialect org.hibernate.dialect.PointbaseDialect
-#hibernate.connection.driver_class com.pointbase.jdbc.jdbcUniversalDriver
-#hibernate.connection.url jdbc:pointbase:embedded:sample
-#hibernate.connection.username PBPUBLIC
-#hibernate.connection.password PBPUBLIC
-
-
-
-#################################
-### Hibernate Connection Pool ###
-#################################
-
-hibernate.connection.pool_size 1
-
-
-
-###########################
-### C3P0 Connection Pool###
-###########################
-
-#hibernate.c3p0.max_size 2
-#hibernate.c3p0.min_size 2
-#hibernate.c3p0.timeout 5000
-#hibernate.c3p0.max_statements 100
-#hibernate.c3p0.idle_test_period 3000
-#hibernate.c3p0.acquire_increment 2
-#hibernate.c3p0.validate false
-
-
-
-##############################
-### Proxool Connection Pool###
-##############################
-
-## Properties for external configuration of Proxool
-
-hibernate.proxool.pool_alias pool1
-
-## Only need one of the following
-
-#hibernate.proxool.existing_pool true
-#hibernate.proxool.xml proxool.xml
-#hibernate.proxool.properties proxool.properties
-
-
-
-#################################
-### Plugin ConnectionProvider ###
-#################################
-
-## use a custom ConnectionProvider (if not set, Hibernate will choose a built-in ConnectionProvider using hueristics)
-
-#hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.ProxoolConnectionProvider
-
-
-
-#######################
-### Transaction API ###
-#######################
-
-## Enable automatic flush during the JTA beforeCompletion() callback
-## (This setting is relevant with or without the Transaction API)
-
-#hibernate.transaction.flush_before_completion
-
-
-## Enable automatic session close at the end of transaction
-## (This setting is relevant with or without the Transaction API)
-
-#hibernate.transaction.auto_close_session
-
-
-## the Transaction API abstracts application code from the underlying JTA or JDBC transactions
-
-#hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
-#hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
-
-
-## to use JTATransactionFactory, Hibernate must be able to locate the UserTransaction in JNDI
-## default is java:comp/UserTransaction
-## you do NOT need this setting if you specify hibernate.transaction.manager_lookup_class
-
-#jta.UserTransaction jta/usertransaction
-#jta.UserTransaction javax.transaction.UserTransaction
-#jta.UserTransaction UserTransaction
-
-
-## to use the second-level cache with JTA, Hibernate must be able to obtain the JTA TransactionManager
-
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.JBossTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WeblogicTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WebSphereTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.OrionTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.ResinTransactionManagerLookup
-
-
-
-##############################
-### Miscellaneous Settings ###
-##############################
-
-## print all generated SQL to the console
-
-#hibernate.show_sql true
-
-
-## add comments to the generated SQL
-
-#hibernate.use_sql_comments true
-
-
-## generate statistics
-
-#hibernate.generate_statistics true
-
-
-## auto schema export
-
-#hibernate.hbm2ddl.auto create-drop
-#hibernate.hbm2ddl.auto create
-#hibernate.hbm2ddl.auto update
-
-
-## specify a default schema and catalog for unqualified tablenames
-
-#hibernate.default_schema test
-#hibernate.default_catalog test
-
-
-## enable ordering of SQL UPDATEs by primary key
-
-hibernate.order_updates true
-
-
-## set the maximum depth of the outer join fetch tree
-
-hibernate.max_fetch_depth 1
-
-
-## set the default batch size for batch fetching
-
-hibernate.default_batch_fetch_size 100
-
-
-## rollback generated identifier values of deleted entities to default values
-
-#hibernate.use_identifer_rollback true
-
-
-## enable CGLIB reflection optimizer (enabled by default)
-
-#hibernate.cglib.use_reflection_optimizer false
-
-
-
-#####################
-### JDBC Settings ###
-#####################
-
-## specify a JDBC isolation level
-
-#hibernate.connection.isolation 4
-
-
-## enable JDBC autocommit (not recommended!)
-
-#hibernate.connection.autocommit true
-
-
-## set the JDBC fetch size
-
-#hibernate.jdbc.fetch_size 25
-
-
-## set the maximum JDBC 2 batch size (a nonzero value enables batching)
-
-#hibernate.jdbc.batch_size 0
-
-
-## enable batch updates even for versioned data
-
-hibernate.jdbc.batch_versioned_data true
-
-
-## enable use of JDBC 2 scrollable ResultSets (specifying a Dialect will cause Hibernate to use a sensible default)
-
-#hibernate.jdbc.use_scrollable_resultset true
-
-
-## use streams when writing binary types to / from JDBC
-
-hibernate.jdbc.use_streams_for_binary true
-
-
-## use JDBC 3 PreparedStatement.getGeneratedKeys() to get the identifier of an inserted row
-
-#hibernate.jdbc.use_get_generated_keys false
-
-
-## choose a custom JDBC batcher
-
-# hibernate.jdbc.factory_class
-
-
-## enable JDBC result set column alias caching
-## (minor performance enhancement for broken JDBC drivers)
-
-# hibernate.jdbc.wrap_result_sets
-
-
-## choose a custom SQL exception converter
-
-#hibernate.jdbc.sql_exception_converter
-
-
-
-##########################
-### Second-level Cache ###
-##########################
-
-## optimize chache for minimal "puts" instead of minimal "gets" (good for clustered cache)
-
-#hibernate.cache.use_minimal_puts true
-
-
-## set a prefix for cache region names
-
-hibernate.cache.region_prefix hibernate.test
-
-
-## disable the second-level cache
-
-#hibernate.cache.use_second_level_cache false
-
-
-## enable the query cache
-
-hibernate.cache.use_query_cache true
-
-
-## store the second-level cache entries in a more human-friendly format
-
-#hibernate.cache.use_structured_entries true
-
-
-## choose a cache implementation
-
-#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
-hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
-
-
-## choose a custom query cache implementation
-
-#hibernate.cache.query_cache_factory
-
-
-
-############
-### JNDI ###
-############
-
-## specify a JNDI name for the SessionFactory
-
-#hibernate.session_factory_name hibernate/session_factory
-
-
-## Hibernate uses JNDI to bind a name to a SessionFactory and to look up the JTA UserTransaction;
-## if hibernate.jndi.* are not specified, Hibernate will use the default InitialContext() which
-## is the best approach in an application server
-
-#file system
-#hibernate.jndi.class com.sun.jndi.fscontext.RefFSContextFactory
-#hibernate.jndi.url file:/
-
-#WebSphere
-#hibernate.jndi.class com.ibm.websphere.naming.WsnInitialContextFactory
-#hibernate.jndi.url iiop://localhost:900/
-
Copied: trunk/HibernateExt/annotations/src/test/hibernate.properties (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/hibernate.properties)
===================================================================
--- trunk/HibernateExt/annotations/src/test/hibernate.properties (rev 0)
+++ trunk/HibernateExt/annotations/src/test/hibernate.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,472 @@
+######################
+### Query Language ###
+######################
+
+## define query language constants / function names
+
+hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
+
+
+## select the classic query parser
+
+#hibernate.query.factory_class org.hibernate.hql.classic.ClassicQueryTranslatorFactory
+
+hibernate.format_sql true
+
+
+
+#################
+### Platforms ###
+#################
+
+## JNDI Datasource
+
+#hibernate.connection.datasource jdbc/test
+#hibernate.connection.username db2
+#hibernate.connection.password db2
+
+
+## HypersonicSQL
+
+hibernate.dialect org.hibernate.dialect.HSQLDialect
+hibernate.connection.driver_class org.hsqldb.jdbcDriver
+hibernate.connection.username sa
+hibernate.connection.password
+hibernate.connection.url jdbc:hsqldb:hsql://localhost
+hibernate.connection.url jdbc:hsqldb:test
+hibernate.connection.url jdbc:hsqldb:.
+
+
+## MySQL
+
+#hibernate.dialect org.hibernate.dialect.MySQLDialect
+#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
+#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
+#hibernate.connection.driver_class com.mysql.jdbc.Driver
+#hibernate.connection.url jdbc:mysql:///test
+#hibernate.connection.username emmanuel
+#hibernate.connection.password hibernate
+
+
+## Oracle
+
+#hibernate.dialect org.hibernate.dialect.OracleDialect
+#hibernate.dialect org.hibernate.dialect.Oracle9Dialect
+#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
+#hibernate.connection.username ora
+#hibernate.connection.password ora
+#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:test
+
+
+## PostgreSQL
+
+#hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
+#hibernate.connection.driver_class org.postgresql.Driver
+#hibernate.connection.url jdbc:postgresql:annotations
+#hibernate.connection.username postgres
+#hibernate.connection.password hibernate
+#hibernate.query.substitutions yes 'Y', no 'N'
+
+
+## DB2
+
+#hibernate.dialect org.hibernate.dialect.DB2Dialect
+#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
+#hibernate.connection.url jdbc:db2:test
+#hibernate.connection.username db2
+#hibernate.connection.password db2
+
+## TimesTen (not supported yet)
+
+#hibernate.dialect org.hibernate.dialect.TimesTenDialect
+#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
+#hibernate.connection.url jdbc:timesten:direct:test
+#hibernate.connection.username
+#hibernate.connection.password
+
+## DB2/400
+
+#hibernate.dialect org.hibernate.dialect.DB2400Dialect
+#hibernate.connection.username user
+#hibernate.connection.password password
+
+## Native driver
+#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
+#hibernate.connection.url jdbc:db2://systemname
+
+## Toolbox driver
+#hibernate.connection.driver_class com.ibm.as400.access.AS400JDBCDriver
+#hibernate.connection.url jdbc:as400://systemname
+
+
+## Derby (Not supported!)
+
+#hibernate.dialect org.hibernate.dialect.DerbyDialect
+#hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver
+#hibernate.connection.username
+#hibernate.connection.password
+#hibernate.connection.url jdbc:derby:/test;create=true
+
+
+## Sybase
+
+#hibernate.dialect org.hibernate.dialect.SybaseDialect
+#hibernate.connection.driver_class com.sybase.jdbc2.jdbc.SybDriver
+#hibernate.connection.username sa
+#hibernate.connection.password sasasa
+#hibernate.connection.url jdbc:sybase:Tds:co3061835-a:5000/tempdb
+
+
+## Mckoi SQL
+
+#hibernate.dialect org.hibernate.dialect.MckoiDialect
+#hibernate.connection.driver_class com.mckoi.JDBCDriver
+#hibernate.connection.url jdbc:mckoi:///
+#hibernate.connection.url jdbc:mckoi:local://C:/mckoi1.00/db.conf
+#hibernate.connection.username admin
+#hibernate.connection.password nimda
+
+
+## SAP DB
+
+#hibernate.dialect org.hibernate.dialect.SAPDBDialect
+#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
+#hibernate.connection.url jdbc:sapdb://localhost/TST
+#hibernate.connection.username TEST
+#hibernate.connection.password TEST
+#hibernate.query.substitutions yes 'Y', no 'N'
+
+
+## MS SQL Server
+
+#hibernate.dialect org.hibernate.dialect.SQLServerDialect
+#hibernate.connection.username sa
+#hibernate.connection.password sa
+
+## JSQL Driver
+#hibernate.connection.driver_class com.jnetdirect.jsql.JSQLDriver
+#hibernate.connection.url jdbc:JSQLConnect://1E1/test
+
+## JTURBO Driver
+#hibernate.connection.driver_class com.newatlanta.jturbo.driver.Driver
+#hibernate.connection.url jdbc:JTurbo://1E1:1433/test
+
+## WebLogic Driver
+#hibernate.connection.driver_class weblogic.jdbc.mssqlserver4.Driver
+#hibernate.connection.url jdbc:weblogic:mssqlserver4:1E1:1433
+
+## Microsoft Driver (not recommended!)
+#hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
+#hibernate.connection.url jdbc:microsoft:sqlserver://1E1;DatabaseName=test;SelectMethod=cursor
+
+## jTDS (since version 0.9)
+#hibernate.connection.driver_class net.sourceforge.jtds.jdbc.Driver
+#hibernate.connection.url jdbc:jtds:sqlserver://1E1/test
+
+## Interbase
+
+#hibernate.dialect org.hibernate.dialect.InterbaseDialect
+#hibernate.connection.username sysdba
+#hibernate.connection.password masterkey
+
+## DO NOT specify hibernate.connection.sqlDialect
+
+## InterClient
+
+#hibernate.connection.driver_class interbase.interclient.Driver
+#hibernate.connection.url jdbc:interbase://localhost:3060/C:/firebird/test.gdb
+
+## Pure Java
+
+#hibernate.connection.driver_class org.firebirdsql.jdbc.FBDriver
+#hibernate.connection.url jdbc:firebirdsql:localhost/3050:/firebird/test.gdb
+
+
+## Pointbase
+
+#hibernate.dialect org.hibernate.dialect.PointbaseDialect
+#hibernate.connection.driver_class com.pointbase.jdbc.jdbcUniversalDriver
+#hibernate.connection.url jdbc:pointbase:embedded:sample
+#hibernate.connection.username PBPUBLIC
+#hibernate.connection.password PBPUBLIC
+
+
+
+#################################
+### Hibernate Connection Pool ###
+#################################
+
+hibernate.connection.pool_size 1
+
+
+
+###########################
+### C3P0 Connection Pool###
+###########################
+
+#hibernate.c3p0.max_size 2
+#hibernate.c3p0.min_size 2
+#hibernate.c3p0.timeout 5000
+#hibernate.c3p0.max_statements 100
+#hibernate.c3p0.idle_test_period 3000
+#hibernate.c3p0.acquire_increment 2
+#hibernate.c3p0.validate false
+
+
+
+##############################
+### Proxool Connection Pool###
+##############################
+
+## Properties for external configuration of Proxool
+
+hibernate.proxool.pool_alias pool1
+
+## Only need one of the following
+
+#hibernate.proxool.existing_pool true
+#hibernate.proxool.xml proxool.xml
+#hibernate.proxool.properties proxool.properties
+
+
+
+#################################
+### Plugin ConnectionProvider ###
+#################################
+
+## use a custom ConnectionProvider (if not set, Hibernate will choose a built-in ConnectionProvider using hueristics)
+
+#hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.ProxoolConnectionProvider
+
+
+
+#######################
+### Transaction API ###
+#######################
+
+## Enable automatic flush during the JTA beforeCompletion() callback
+## (This setting is relevant with or without the Transaction API)
+
+#hibernate.transaction.flush_before_completion
+
+
+## Enable automatic session close at the end of transaction
+## (This setting is relevant with or without the Transaction API)
+
+#hibernate.transaction.auto_close_session
+
+
+## the Transaction API abstracts application code from the underlying JTA or JDBC transactions
+
+#hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
+#hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
+
+
+## to use JTATransactionFactory, Hibernate must be able to locate the UserTransaction in JNDI
+## default is java:comp/UserTransaction
+## you do NOT need this setting if you specify hibernate.transaction.manager_lookup_class
+
+#jta.UserTransaction jta/usertransaction
+#jta.UserTransaction javax.transaction.UserTransaction
+#jta.UserTransaction UserTransaction
+
+
+## to use the second-level cache with JTA, Hibernate must be able to obtain the JTA TransactionManager
+
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.JBossTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WeblogicTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WebSphereTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.OrionTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.ResinTransactionManagerLookup
+
+
+
+##############################
+### Miscellaneous Settings ###
+##############################
+
+## print all generated SQL to the console
+
+#hibernate.show_sql true
+
+
+## add comments to the generated SQL
+
+#hibernate.use_sql_comments true
+
+
+## generate statistics
+
+#hibernate.generate_statistics true
+
+
+## auto schema export
+
+#hibernate.hbm2ddl.auto create-drop
+#hibernate.hbm2ddl.auto create
+#hibernate.hbm2ddl.auto update
+
+
+## specify a default schema and catalog for unqualified tablenames
+
+#hibernate.default_schema test
+#hibernate.default_catalog test
+
+
+## enable ordering of SQL UPDATEs by primary key
+
+hibernate.order_updates true
+
+
+## set the maximum depth of the outer join fetch tree
+
+hibernate.max_fetch_depth 1
+
+
+## set the default batch size for batch fetching
+
+hibernate.default_batch_fetch_size 100
+
+
+## rollback generated identifier values of deleted entities to default values
+
+#hibernate.use_identifer_rollback true
+
+
+## enable CGLIB reflection optimizer (enabled by default)
+
+#hibernate.cglib.use_reflection_optimizer false
+
+
+
+#####################
+### JDBC Settings ###
+#####################
+
+## specify a JDBC isolation level
+
+#hibernate.connection.isolation 4
+
+
+## enable JDBC autocommit (not recommended!)
+
+#hibernate.connection.autocommit true
+
+
+## set the JDBC fetch size
+
+#hibernate.jdbc.fetch_size 25
+
+
+## set the maximum JDBC 2 batch size (a nonzero value enables batching)
+
+#hibernate.jdbc.batch_size 0
+
+
+## enable batch updates even for versioned data
+
+hibernate.jdbc.batch_versioned_data true
+
+
+## enable use of JDBC 2 scrollable ResultSets (specifying a Dialect will cause Hibernate to use a sensible default)
+
+#hibernate.jdbc.use_scrollable_resultset true
+
+
+## use streams when writing binary types to / from JDBC
+
+hibernate.jdbc.use_streams_for_binary true
+
+
+## use JDBC 3 PreparedStatement.getGeneratedKeys() to get the identifier of an inserted row
+
+#hibernate.jdbc.use_get_generated_keys false
+
+
+## choose a custom JDBC batcher
+
+# hibernate.jdbc.factory_class
+
+
+## enable JDBC result set column alias caching
+## (minor performance enhancement for broken JDBC drivers)
+
+# hibernate.jdbc.wrap_result_sets
+
+
+## choose a custom SQL exception converter
+
+#hibernate.jdbc.sql_exception_converter
+
+
+
+##########################
+### Second-level Cache ###
+##########################
+
+## optimize chache for minimal "puts" instead of minimal "gets" (good for clustered cache)
+
+#hibernate.cache.use_minimal_puts true
+
+
+## set a prefix for cache region names
+
+hibernate.cache.region_prefix hibernate.test
+
+
+## disable the second-level cache
+
+#hibernate.cache.use_second_level_cache false
+
+
+## enable the query cache
+
+hibernate.cache.use_query_cache true
+
+
+## store the second-level cache entries in a more human-friendly format
+
+#hibernate.cache.use_structured_entries true
+
+
+## choose a cache implementation
+
+#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
+hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
+
+
+## choose a custom query cache implementation
+
+#hibernate.cache.query_cache_factory
+
+
+
+############
+### JNDI ###
+############
+
+## specify a JNDI name for the SessionFactory
+
+#hibernate.session_factory_name hibernate/session_factory
+
+
+## Hibernate uses JNDI to bind a name to a SessionFactory and to look up the JTA UserTransaction;
+## if hibernate.jndi.* are not specified, Hibernate will use the default InitialContext() which
+## is the best approach in an application server
+
+#file system
+#hibernate.jndi.class com.sun.jndi.fscontext.RefFSContextFactory
+#hibernate.jndi.url file:/
+
+#WebSphere
+#hibernate.jndi.class com.ibm.websphere.naming.WsnInitialContextFactory
+#hibernate.jndi.url iiop://localhost:900/
+
Deleted: trunk/HibernateExt/annotations/src/test/log4j.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/log4j.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/log4j.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-### direct log messages to stdout ###
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
-
-### direct messages to file hibernate.log ###
-#log4j.appender.file=org.apache.log4j.FileAppender
-#log4j.appender.file.File=hibernate.log
-#log4j.appender.file.layout=org.apache.log4j.PatternLayout
-#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
-
-### set log levels - for more verbose logging change 'info' to 'debug' ###
-
-log4j.rootLogger=warn, stdout
-
-log4j.logger.org.hibernate=info
-
-
-### log just the SQL
-log4j.logger.org.hibernate.SQL=debug
-
-#log4j.logger.org.hibernate.engine.CascadingAction=debug
-
-### log JDBC bind parameters ###
-#log4j.logger.org.hibernate.type=debug
-
-### log schema export/update ###
-log4j.logger.org.hibernate.tool.hbm2ddl=debug
-
-### log cache activity ###
-#log4j.logger.org.hibernate.cache=debug
-
-### enable the following line if you want to track down connection ###
-### leakages when using DriverManagerConnectionProvider ###
-#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
-
-### annotation logs
-#log4j.logger.org.hibernate.annotation=info
-#log4j.logger.org.hibernate.cfg=info
-#log4j.logger.org.hibernate.cfg.SettingsFactory=info
-#log4j.logger.org.hibernate.cfg.AnnotationBinder=info
-#log4j.logger.org.hibernate.cfg.AnnotationConfiguration=info
-#log4j.logger.org.hibernate.cfg.Ejb3Column=info
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/log4j.properties (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/log4j.properties)
===================================================================
--- trunk/HibernateExt/annotations/src/test/log4j.properties (rev 0)
+++ trunk/HibernateExt/annotations/src/test/log4j.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+### direct log messages to stdout ###
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+
+### direct messages to file hibernate.log ###
+#log4j.appender.file=org.apache.log4j.FileAppender
+#log4j.appender.file.File=hibernate.log
+#log4j.appender.file.layout=org.apache.log4j.PatternLayout
+#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+
+### set log levels - for more verbose logging change 'info' to 'debug' ###
+
+log4j.rootLogger=warn, stdout
+
+log4j.logger.org.hibernate=info
+
+
+### log just the SQL
+log4j.logger.org.hibernate.SQL=debug
+
+#log4j.logger.org.hibernate.engine.CascadingAction=debug
+
+### log JDBC bind parameters ###
+#log4j.logger.org.hibernate.type=debug
+
+### log schema export/update ###
+log4j.logger.org.hibernate.tool.hbm2ddl=debug
+
+### log cache activity ###
+#log4j.logger.org.hibernate.cache=debug
+
+### enable the following line if you want to track down connection ###
+### leakages when using DriverManagerConnectionProvider ###
+#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
+
+### annotation logs
+#log4j.logger.org.hibernate.annotation=info
+#log4j.logger.org.hibernate.cfg=info
+#log4j.logger.org.hibernate.cfg.SettingsFactory=info
+#log4j.logger.org.hibernate.cfg.AnnotationBinder=info
+#log4j.logger.org.hibernate.cfg.AnnotationConfiguration=info
+#log4j.logger.org.hibernate.cfg.Ejb3Column=info
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org)
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate)
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/annotations (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/annotations)
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test)
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at DiscriminatorValue("A320")
- at Entity()
-public class A320 extends Plane {
- private String javaEmbeddedVersion;
-
- public String getJavaEmbeddedVersion() {
- return javaEmbeddedVersion;
- }
-
- public void setJavaEmbeddedVersion(String string) {
- javaEmbeddedVersion = string;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at DiscriminatorValue("A320")
+ at Entity()
+public class A320 extends Plane {
+ private String javaEmbeddedVersion;
+
+ public String getJavaEmbeddedVersion() {
+ return javaEmbeddedVersion;
+ }
+
+ public void setJavaEmbeddedVersion(String string) {
+ javaEmbeddedVersion = string;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320b.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320b.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320b.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity()
-public class A320b extends A320 {
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320b.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320b.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320b.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/A320b.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class A320b extends A320 {
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AlternativeNamingStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AlternativeNamingStrategy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AlternativeNamingStrategy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,73 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import org.hibernate.cfg.EJB3NamingStrategy;
-import org.hibernate.cfg.NamingStrategy;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class AlternativeNamingStrategy extends EJB3NamingStrategy {
- public static NamingStrategy INSTANCE = new AlternativeNamingStrategy();
-
- public String classToTableName(String className) {
- return tableName( StringHelper.unqualify( className ) );
- }
-
- public String propertyToColumnName(String propertyName) {
- return columnName( StringHelper.unqualify( propertyName ) );
- }
-
- public String tableName(String tableName) {
- return "table_" + tableName;
- }
-
- public String columnName(String columnName) {
- return "f_" + columnName;
- }
-
- public String propertyToTableName(String className, String propertyName) {
- return tableName( StringHelper.unqualify( className ) + "_" + StringHelper.unqualify( propertyName ) );
- }
-
- public String logicalColumnName(String columnName, String propertyName) {
- return StringHelper.isNotEmpty( columnName ) ? columnName : propertyName;
- }
-
- public String collectionTableName(
- String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
- String propertyName
- ) {
- return tableName(
- new StringBuilder( ownerEntityTable ).append( "_" )
- .append(
- associatedEntityTable != null ?
- associatedEntityTable :
- StringHelper.unqualify( propertyName )
- ).toString()
- );
- }
-
- public String logicalCollectionTablelName(
- String tableName,
- String ownerEntityTable, String associatedEntityTable, String propertyName
- ) {
- if ( tableName != null ) {
- return tableName;
- }
- else {
- //use of a stringbuffer to workaround a JDK bug
- return new StringBuffer( ownerEntityTable ).append( "_" )
- .append(
- associatedEntityTable != null ?
- associatedEntityTable :
- StringHelper.unqualify( propertyName )
- ).toString();
- }
- }
-
- public String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn) {
- return StringHelper.isNotEmpty( columnName ) ? columnName : propertyName + "_" + referencedColumn;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AlternativeNamingStrategy.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AlternativeNamingStrategy.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AlternativeNamingStrategy.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AlternativeNamingStrategy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,73 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import org.hibernate.cfg.EJB3NamingStrategy;
+import org.hibernate.cfg.NamingStrategy;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AlternativeNamingStrategy extends EJB3NamingStrategy {
+ public static NamingStrategy INSTANCE = new AlternativeNamingStrategy();
+
+ public String classToTableName(String className) {
+ return tableName( StringHelper.unqualify( className ) );
+ }
+
+ public String propertyToColumnName(String propertyName) {
+ return columnName( StringHelper.unqualify( propertyName ) );
+ }
+
+ public String tableName(String tableName) {
+ return "table_" + tableName;
+ }
+
+ public String columnName(String columnName) {
+ return "f_" + columnName;
+ }
+
+ public String propertyToTableName(String className, String propertyName) {
+ return tableName( StringHelper.unqualify( className ) + "_" + StringHelper.unqualify( propertyName ) );
+ }
+
+ public String logicalColumnName(String columnName, String propertyName) {
+ return StringHelper.isNotEmpty( columnName ) ? columnName : propertyName;
+ }
+
+ public String collectionTableName(
+ String ownerEntity, String ownerEntityTable, String associatedEntity, String associatedEntityTable,
+ String propertyName
+ ) {
+ return tableName(
+ new StringBuilder( ownerEntityTable ).append( "_" )
+ .append(
+ associatedEntityTable != null ?
+ associatedEntityTable :
+ StringHelper.unqualify( propertyName )
+ ).toString()
+ );
+ }
+
+ public String logicalCollectionTablelName(
+ String tableName,
+ String ownerEntityTable, String associatedEntityTable, String propertyName
+ ) {
+ if ( tableName != null ) {
+ return tableName;
+ }
+ else {
+ //use of a stringbuffer to workaround a JDK bug
+ return new StringBuffer( ownerEntityTable ).append( "_" )
+ .append(
+ associatedEntityTable != null ?
+ associatedEntityTable :
+ StringHelper.unqualify( propertyName )
+ ).toString();
+ }
+ }
+
+ public String logicalCollectionColumnName(String columnName, String propertyName, String referencedColumn) {
+ return StringHelper.isNotEmpty( columnName ) ? columnName : propertyName + "_" + referencedColumn;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AmericaCupClass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AmericaCupClass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AmericaCupClass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.PrimaryKeyJoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at PrimaryKeyJoinColumn(name = "BOAT_ID")
-public class AmericaCupClass extends Boat {
- private Country country;
-
- @ManyToOne()
- @JoinColumn(name = "COUNTRY_ID")
- public Country getCountry() {
- return country;
- }
-
- public void setCountry(Country country) {
- this.country = country;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AmericaCupClass.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AmericaCupClass.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AmericaCupClass.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/AmericaCupClass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at PrimaryKeyJoinColumn(name = "BOAT_ID")
+public class AmericaCupClass extends Boat {
+ private Country country;
+
+ @ManyToOne()
+ @JoinColumn(name = "COUNTRY_ID")
+ public Country getCountry() {
+ return country;
+ }
+
+ public void setCountry(Country country) {
+ this.country = country;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<!--
-
- Used to demonstrate the declarative configuration
- of both hbm files and annotated classes
- See hibernate.cfg.xml and ConfigurationTest
-
--->
-
-<hibernate-mapping package="org.hibernate.test.annotations">
-
- <class name="Boat" table="BoatInXml">
-
- <id name="id">
- <generator class="native"/>
- </id>
-
- <property name="size" column="boat_size"/>
-
- </class>
-
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.hbm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.hbm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+ Used to demonstrate the declarative configuration
+ of both hbm files and annotated classes
+ See hibernate.cfg.xml and ConfigurationTest
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.annotations">
+
+ <class name="Boat" table="BoatInXml">
+
+ <id name="id">
+ <generator class="native"/>
+ </id>
+
+ <property name="size" column="boat_size"/>
+
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-
-/**
- * Boat class. Mapped in a Joined manner
- *
- * @author Emmanuel Bernard
- */
- at Entity()
- at Inheritance(
- strategy = InheritanceType.JOINED
-)
-public class Boat implements Serializable {
- private Integer id;
- private int size;
- private int weight;
-
- public Boat() {
- super();
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- @Column(name = "boat_size")
- public int getSize() {
- return size;
- }
-
- public void setId(Integer integer) {
- id = integer;
- }
-
- public void setSize(int i) {
- size = i;
- }
-
- public int getWeight() {
- return weight;
- }
-
- public void setWeight(int weight) {
- this.weight = weight;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Boat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+
+/**
+ * Boat class. Mapped in a Joined manner
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Inheritance(
+ strategy = InheritanceType.JOINED
+)
+public class Boat implements Serializable {
+ private Integer id;
+ private int size;
+ private int weight;
+
+ public Boat() {
+ super();
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ @Column(name = "boat_size")
+ public int getSize() {
+ return size;
+ }
+
+ public void setId(Integer integer) {
+ id = integer;
+ }
+
+ public void setSize(int i) {
+ size = i;
+ }
+
+ public int getWeight() {
+ return weight;
+ }
+
+ public void setWeight(int weight) {
+ this.weight = weight;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Company.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Company.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Company.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,46 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.io.Serializable;
-import java.util.Date;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-
-/**
- * Corporate like Air France
- *
- * @author Emmanuel Bernard
- */
- at Entity(name = "Corporation")
-public class Company implements Serializable {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
-
- public void setId(Integer integer) {
- id = integer;
- }
-
-
- public void setName(String string) {
- name = string;
- }
-
- //should be treated as getter
- private int[] getWorkingHoursPerWeek(Set<Date> holidayDays) {
- return null;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Company.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Company.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Company.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Company.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,46 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+
+/**
+ * Corporate like Air France
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity(name = "Corporation")
+public class Company implements Serializable {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+
+ public void setId(Integer integer) {
+ id = integer;
+ }
+
+
+ public void setName(String string) {
+ name = string;
+ }
+
+ //should be treated as getter
+ private int[] getWorkingHoursPerWeek(Set<Date> holidayDays) {
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/ConfigurationTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/ConfigurationTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/ConfigurationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,155 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import org.hibernate.HibernateException;
-import org.hibernate.MappingException;
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ConfigurationTest extends junit.framework.TestCase {
- public void testDeclarativeMix() throws Exception {
- AnnotationConfiguration cfg = new AnnotationConfiguration();
- cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- SessionFactory sf = cfg.buildSessionFactory();
- assertNotNull( sf );
- Session s = sf.openSession();
- Transaction tx = s.beginTransaction();
- Query q = s.createQuery( "from Boat" );
- assertEquals( 0, q.list().size() );
- q = s.createQuery( "from Plane" );
- assertEquals( 0, q.list().size() );
- tx.commit();
- s.close();
- sf.close();
- }
-
- public void testIgnoringHbm() throws Exception {
- AnnotationConfiguration cfg = new AnnotationConfiguration();
- cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- cfg.setProperty( AnnotationConfiguration.ARTEFACT, "class, whatever" );
- SessionFactory sf = cfg.buildSessionFactory();
- assertNotNull( sf );
- Session s = sf.openSession();
- Transaction tx = s.beginTransaction();
- Query q;
- try {
- s.createQuery( "from Boat" ).list();
- fail( "Boat should not be mapped" );
- }
- catch (HibernateException e) {
- //all good
- }
- q = s.createQuery( "from Plane" );
- assertEquals( 0, q.list().size() );
- tx.commit();
- s.close();
- sf.close();
- }
-
- public void testPrecedenceHbm() throws Exception {
- AnnotationConfiguration cfg = new AnnotationConfiguration();
- cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- cfg.addAnnotatedClass( Boat.class );
- SessionFactory sf = cfg.buildSessionFactory();
- assertNotNull( sf );
- Session s = sf.openSession();
- s.getTransaction().begin();
- Boat boat = new Boat();
- boat.setSize( 12 );
- boat.setWeight( 34 );
- s.persist( boat );
- s.getTransaction().commit();
- s.clear();
- Transaction tx = s.beginTransaction();
- boat = (Boat) s.get( Boat.class, boat.getId() );
- assertTrue( "Annotation has precedence", 34 != boat.getWeight() );
- s.delete( boat );
- //s.getTransaction().commit();
- tx.commit();
- s.close();
- sf.close();
- }
-
- public void testPrecedenceAnnotation() throws Exception {
- AnnotationConfiguration cfg = new AnnotationConfiguration();
- cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- cfg.setProperty( AnnotationConfiguration.ARTEFACT, "class, hbm" );
- cfg.addAnnotatedClass( Boat.class );
- SessionFactory sf = cfg.buildSessionFactory();
- assertNotNull( sf );
- Session s = sf.openSession();
- s.getTransaction().begin();
- Boat boat = new Boat();
- boat.setSize( 12 );
- boat.setWeight( 34 );
- s.persist( boat );
- s.getTransaction().commit();
- s.clear();
- Transaction tx = s.beginTransaction();
- boat = (Boat) s.get( Boat.class, boat.getId() );
- assertTrue( "Annotation has precedence", 34 == boat.getWeight() );
- s.delete( boat );
- tx.commit();
- s.close();
- sf.close();
- }
-
- public void testDeclarativeAnnWoAnnConfig() throws Exception {
- Configuration cfg = new Configuration();
- try {
- cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
- fail( "Configuration object should fail when finding annotated elements declarations" );
- }
- catch (MappingException e) {
- //success
- }
- }
-
- public void testHbmWithSubclassExtends() throws Exception {
- AnnotationConfiguration cfg = new AnnotationConfiguration();
- cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
- cfg.addClass( Ferry.class );
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- SessionFactory sf = cfg.buildSessionFactory();
- assertNotNull( sf );
- Session s = sf.openSession();
- Transaction tx = s.beginTransaction();
- Query q = s.createQuery( "from Ferry" );
- assertEquals( 0, q.list().size() );
- q = s.createQuery( "from Plane" );
- assertEquals( 0, q.list().size() );
- tx.commit();
- s.close();
- sf.close();
- }
-
- public void testAnnReferencesHbm() throws Exception {
- AnnotationConfiguration cfg = new AnnotationConfiguration();
- cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
- cfg.addAnnotatedClass( Port.class );
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- SessionFactory sf = cfg.buildSessionFactory();
- assertNotNull( sf );
- Session s = sf.openSession();
- Transaction tx = s.beginTransaction();
- Query q = s.createQuery( "from Boat" );
- assertEquals( 0, q.list().size() );
- q = s.createQuery( "from Port" );
- assertEquals( 0, q.list().size() );
- tx.commit();
- s.close();
- sf.close();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/ConfigurationTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/ConfigurationTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/ConfigurationTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/ConfigurationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,155 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ConfigurationTest extends junit.framework.TestCase {
+ public void testDeclarativeMix() throws Exception {
+ AnnotationConfiguration cfg = new AnnotationConfiguration();
+ cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ SessionFactory sf = cfg.buildSessionFactory();
+ assertNotNull( sf );
+ Session s = sf.openSession();
+ Transaction tx = s.beginTransaction();
+ Query q = s.createQuery( "from Boat" );
+ assertEquals( 0, q.list().size() );
+ q = s.createQuery( "from Plane" );
+ assertEquals( 0, q.list().size() );
+ tx.commit();
+ s.close();
+ sf.close();
+ }
+
+ public void testIgnoringHbm() throws Exception {
+ AnnotationConfiguration cfg = new AnnotationConfiguration();
+ cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ cfg.setProperty( AnnotationConfiguration.ARTEFACT, "class, whatever" );
+ SessionFactory sf = cfg.buildSessionFactory();
+ assertNotNull( sf );
+ Session s = sf.openSession();
+ Transaction tx = s.beginTransaction();
+ Query q;
+ try {
+ s.createQuery( "from Boat" ).list();
+ fail( "Boat should not be mapped" );
+ }
+ catch (HibernateException e) {
+ //all good
+ }
+ q = s.createQuery( "from Plane" );
+ assertEquals( 0, q.list().size() );
+ tx.commit();
+ s.close();
+ sf.close();
+ }
+
+ public void testPrecedenceHbm() throws Exception {
+ AnnotationConfiguration cfg = new AnnotationConfiguration();
+ cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ cfg.addAnnotatedClass( Boat.class );
+ SessionFactory sf = cfg.buildSessionFactory();
+ assertNotNull( sf );
+ Session s = sf.openSession();
+ s.getTransaction().begin();
+ Boat boat = new Boat();
+ boat.setSize( 12 );
+ boat.setWeight( 34 );
+ s.persist( boat );
+ s.getTransaction().commit();
+ s.clear();
+ Transaction tx = s.beginTransaction();
+ boat = (Boat) s.get( Boat.class, boat.getId() );
+ assertTrue( "Annotation has precedence", 34 != boat.getWeight() );
+ s.delete( boat );
+ //s.getTransaction().commit();
+ tx.commit();
+ s.close();
+ sf.close();
+ }
+
+ public void testPrecedenceAnnotation() throws Exception {
+ AnnotationConfiguration cfg = new AnnotationConfiguration();
+ cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ cfg.setProperty( AnnotationConfiguration.ARTEFACT, "class, hbm" );
+ cfg.addAnnotatedClass( Boat.class );
+ SessionFactory sf = cfg.buildSessionFactory();
+ assertNotNull( sf );
+ Session s = sf.openSession();
+ s.getTransaction().begin();
+ Boat boat = new Boat();
+ boat.setSize( 12 );
+ boat.setWeight( 34 );
+ s.persist( boat );
+ s.getTransaction().commit();
+ s.clear();
+ Transaction tx = s.beginTransaction();
+ boat = (Boat) s.get( Boat.class, boat.getId() );
+ assertTrue( "Annotation has precedence", 34 == boat.getWeight() );
+ s.delete( boat );
+ tx.commit();
+ s.close();
+ sf.close();
+ }
+
+ public void testDeclarativeAnnWoAnnConfig() throws Exception {
+ Configuration cfg = new Configuration();
+ try {
+ cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+ fail( "Configuration object should fail when finding annotated elements declarations" );
+ }
+ catch (MappingException e) {
+ //success
+ }
+ }
+
+ public void testHbmWithSubclassExtends() throws Exception {
+ AnnotationConfiguration cfg = new AnnotationConfiguration();
+ cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+ cfg.addClass( Ferry.class );
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ SessionFactory sf = cfg.buildSessionFactory();
+ assertNotNull( sf );
+ Session s = sf.openSession();
+ Transaction tx = s.beginTransaction();
+ Query q = s.createQuery( "from Ferry" );
+ assertEquals( 0, q.list().size() );
+ q = s.createQuery( "from Plane" );
+ assertEquals( 0, q.list().size() );
+ tx.commit();
+ s.close();
+ sf.close();
+ }
+
+ public void testAnnReferencesHbm() throws Exception {
+ AnnotationConfiguration cfg = new AnnotationConfiguration();
+ cfg.configure( "org/hibernate/test/annotations/hibernate.cfg.xml" );
+ cfg.addAnnotatedClass( Port.class );
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ SessionFactory sf = cfg.buildSessionFactory();
+ assertNotNull( sf );
+ Session s = sf.openSession();
+ Transaction tx = s.beginTransaction();
+ Query q = s.createQuery( "from Boat" );
+ assertEquals( 0, q.list().size() );
+ q = s.createQuery( "from Port" );
+ assertEquals( 0, q.list().size() );
+ tx.commit();
+ s.close();
+ sf.close();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Country.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Country.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Country.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-/**
- * @author Emmanuel Bernard
- */
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
- at Entity()
-public class Country implements Serializable {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setId(Integer integer) {
- id = integer;
- }
-
- public void setName(String string) {
- name = string;
- }
-
- public int hashCode() {
- return name == null ? 0 : name.hashCode();
- }
-
- public boolean equals(Object obj) {
- if ( obj == this ) return true;
- if ( ! ( obj instanceof Country ) ) return false;
- Country that = (Country) obj;
- if ( this.name == null ) return false;
- return this.name.equals( that.name );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Country.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Country.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Country.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Country.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+ at Entity()
+public class Country implements Serializable {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setId(Integer integer) {
+ id = integer;
+ }
+
+ public void setName(String string) {
+ name = string;
+ }
+
+ public int hashCode() {
+ return name == null ? 0 : name.hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ if ( obj == this ) return true;
+ if ( ! ( obj instanceof Country ) ) return false;
+ Country that = (Country) obj;
+ if ( this.name == null ) return false;
+ return this.name.equals( that.name );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Customer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Customer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Customer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,88 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.SortedSet;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-
-import org.hibernate.annotations.Cascade;
-import static org.hibernate.annotations.CascadeType.ALL;
-import org.hibernate.annotations.Sort;
-import org.hibernate.annotations.SortType;
-
-
-/**
- * Company customer
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Customer implements Serializable {
- Long id;
- String name;
- SortedSet<Ticket> tickets;
- Collection discountTickets;
- Passport passport;
-
- public Customer() {
- }
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-
- public void setName(String string) {
- name = string;
- }
-
- @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
- @JoinColumn(name = "CUST_ID")
- @Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
- public SortedSet<Ticket> getTickets() {
- return tickets;
- }
-
- public void setTickets(SortedSet<Ticket> tickets) {
- this.tickets = tickets;
- }
-
- @OneToMany(targetEntity = org.hibernate.test.annotations.Discount.class,
- cascade = CascadeType.ALL, mappedBy = "owner")
- @Cascade({ALL})
- public Collection getDiscountTickets() {
- return discountTickets;
- }
-
- public void setDiscountTickets(Collection collection) {
- discountTickets = collection;
- }
-
- @OneToOne(cascade = CascadeType.ALL)
- public Passport getPassport() {
- return passport;
- }
-
- public void setPassport(Passport passport) {
- this.passport = passport;
- }
-
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Customer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Customer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Customer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Customer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,88 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.SortedSet;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+
+import org.hibernate.annotations.Cascade;
+import static org.hibernate.annotations.CascadeType.ALL;
+import org.hibernate.annotations.Sort;
+import org.hibernate.annotations.SortType;
+
+
+/**
+ * Company customer
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Customer implements Serializable {
+ Long id;
+ String name;
+ SortedSet<Ticket> tickets;
+ Collection discountTickets;
+ Passport passport;
+
+ public Customer() {
+ }
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+
+ public void setName(String string) {
+ name = string;
+ }
+
+ @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
+ @JoinColumn(name = "CUST_ID")
+ @Sort(type = SortType.COMPARATOR, comparator = TicketComparator.class)
+ public SortedSet<Ticket> getTickets() {
+ return tickets;
+ }
+
+ public void setTickets(SortedSet<Ticket> tickets) {
+ this.tickets = tickets;
+ }
+
+ @OneToMany(targetEntity = org.hibernate.test.annotations.Discount.class,
+ cascade = CascadeType.ALL, mappedBy = "owner")
+ @Cascade({ALL})
+ public Collection getDiscountTickets() {
+ return discountTickets;
+ }
+
+ public void setDiscountTickets(Collection collection) {
+ discountTickets = collection;
+ }
+
+ @OneToOne(cascade = CascadeType.ALL)
+ public Passport getPassport() {
+ return passport;
+ }
+
+ public void setPassport(Passport passport) {
+ this.passport = passport;
+ }
+
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Discount.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Discount.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Discount.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.io.Serializable;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-
-/**
- * Discount ticket a client can use when buying tickets
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Discount implements Serializable {
-
- private Long id;
- private double discount;
- private Customer owner;
-
-
- @Column(precision = 5, scale = 2)
- public double getDiscount() {
- return discount;
- }
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setDiscount(double i) {
- discount = i;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-
- @ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
- @JoinColumn(name = "CUSTOMER_ID")
- public Customer getOwner() {
- return owner;
- }
-
- public void setOwner(Customer customer) {
- owner = customer;
- }
-
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Discount.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Discount.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Discount.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Discount.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+
+/**
+ * Discount ticket a client can use when buying tickets
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Discount implements Serializable {
+
+ private Long id;
+ private double discount;
+ private Customer owner;
+
+
+ @Column(precision = 5, scale = 2)
+ public double getDiscount() {
+ return discount;
+ }
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setDiscount(double i) {
+ discount = i;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+
+ @ManyToOne(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
+ @JoinColumn(name = "CUSTOMER_ID")
+ public Customer getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Customer customer) {
+ owner = customer;
+ }
+
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/EntityTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/EntityTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/EntityTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,369 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.List;
-import java.util.TimeZone;
-
-import org.hibernate.Hibernate;
-import org.hibernate.HibernateException;
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.StaleStateException;
-import org.hibernate.Transaction;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EntityTest extends TestCase {
-
- public EntityTest(String x) {
- super( x );
- }
-
- public void testLoad() throws Exception {
- //put an object in DB
- assertEquals( "Flight", getCfg().getClassMapping( Flight.class.getName() ).getTable().getName() );
-
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Flight firstOne = new Flight();
- firstOne.setId( new Long( 1 ) );
- firstOne.setName( "AF3202" );
- firstOne.setDuration( new Long( 1000000 ) );
- firstOne.setDurationInSec( 2000 );
- s.save( firstOne );
- s.flush();
- tx.commit();
- s.close();
-
- //read it
- s = openSession();
- tx = s.beginTransaction();
- firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
- assertNotNull( firstOne );
- assertEquals( new Long( 1 ), firstOne.getId() );
- assertEquals( "AF3202", firstOne.getName() );
- assertEquals( new Long( 1000000 ), firstOne.getDuration() );
- assertFalse( "Transient is not working", 2000l == firstOne.getDurationInSec() );
- tx.commit();
- s.close();
- }
-
- public void testColumn() throws Exception {
- //put an object in DB
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Flight firstOne = new Flight();
- firstOne.setId( new Long( 1 ) );
- firstOne.setName( null );
-
- try {
- s.save( firstOne );
- tx.commit();
- fail( "Name column should be not null" );
- }
- catch (HibernateException e) {
- //fine
- }
- finally {
- s.close();
- }
-
- //insert an object and check that name is not updatable
- s = openSession();
- tx = s.beginTransaction();
- firstOne = new Flight();
- firstOne.setId( new Long( 1 ) );
- firstOne.setName( "AF3202" );
- firstOne.setTriggeredData( "should not be insertable" );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
- assertNotNull( firstOne );
- assertEquals( new Long( 1 ), firstOne.getId() );
- assertEquals( "AF3202", firstOne.getName() );
- assertFalse( "should not be insertable".equals( firstOne.getTriggeredData() ) );
- firstOne.setName( "BA1234" );
- firstOne.setTriggeredData( "should not be updatable" );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
- assertNotNull( firstOne );
- assertEquals( new Long( 1 ), firstOne.getId() );
- assertEquals( "AF3202", firstOne.getName() );
- assertFalse( "should not be updatable".equals( firstOne.getTriggeredData() ) );
- tx.commit();
- s.close();
- }
-
- public void testColumnUnique() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Sky sky = new Sky();
- sky.id = new Long( 2 );
- sky.color = "blue";
- sky.day = "monday";
- sky.month = "January";
-
- Sky sameSky = new Sky();
- sameSky.id = new Long( 3 );
- sameSky.color = "blue";
- sky.day = "tuesday";
- sky.month = "January";
-
- try {
- s.save( sky );
- s.flush();
- s.save( sameSky );
- tx.commit();
- fail( "unique constraints not respected" );
- }
- catch (HibernateException e) {
- //success
- }
- finally {
- if ( tx != null ) tx.rollback();
- s.close();
- }
- }
-
- public void testUniqueConstraint() throws Exception {
- int id = 5;
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Sky sky = new Sky();
- sky.id = new Long( id++ );
- sky.color = "green";
- sky.day = "monday";
- sky.month = "March";
-
- Sky otherSky = new Sky();
- otherSky.id = new Long( id++ );
- otherSky.color = "red";
- otherSky.day = "friday";
- otherSky.month = "March";
-
- Sky sameSky = new Sky();
- sameSky.id = new Long( id++ );
- sameSky.color = "green";
- sameSky.day = "monday";
- sameSky.month = "March";
-
- s.save( sky );
- s.flush();
-
- s.save( otherSky );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- try {
- s.save( sameSky );
- tx.commit();
- fail( "unique constraints not respected" );
- }
- catch (HibernateException e) {
- //success
- }
- finally {
- if ( tx != null ) tx.rollback();
- s.close();
- }
- }
-
- public void testVersion() throws Exception {
-// put an object in DB
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Flight firstOne = new Flight();
- firstOne.setId( new Long( 2 ) );
- firstOne.setName( "AF3202" );
- firstOne.setDuration( new Long( 500 ) );
- s.save( firstOne );
- s.flush();
- tx.commit();
- s.close();
-
- //read it
- s = openSession();
- tx = s.beginTransaction();
- firstOne = (Flight) s.get( Flight.class, new Long( 2 ) );
- tx.commit();
- s.close();
-
- //read it again
- s = openSession();
- tx = s.beginTransaction();
- Flight concurrentOne = (Flight) s.get( Flight.class, new Long( 2 ) );
- concurrentOne.setDuration( new Long( 1000 ) );
- s.update( concurrentOne );
- tx.commit();
- s.close();
- assertFalse( firstOne == concurrentOne );
- assertFalse( firstOne.getVersion().equals( concurrentOne.getVersion() ) );
-
- //reattach the first one
- s = openSession();
- tx = s.beginTransaction();
- firstOne.setName( "Second access" );
- s.update( firstOne );
- try {
- tx.commit();
- fail( "Optimistic locking should work" );
- }
- catch (StaleStateException e) {
- //fine
- }
- finally {
- if ( tx != null ) tx.rollback();
- s.close();
- }
-
- }
-
- public void testFieldAccess() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Sky sky = new Sky();
- sky.id = new Long( 1 );
- sky.color = "black";
- Sky.area = "Paris";
- s.save( sky );
- tx.commit();
- s.close();
- Sky.area = "London";
-
- s = openSession();
- tx = s.beginTransaction();
- sky = (Sky) s.get( Sky.class, sky.id );
- assertNotNull( sky );
- assertEquals( "black", sky.color );
- assertFalse( "Paris".equals( Sky.area ) );
- tx.commit();
- s.close();
- }
-
- public void testEntityName() throws Exception {
- assertEquals( "Corporation", getCfg().getClassMapping( Company.class.getName() ).getTable().getName() );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Company comp = new Company();
- s.persist( comp );
- comp.setName( "JBoss Inc" );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- List result = s.createQuery( "from Corporation" ).list();
- assertNotNull( result );
- assertEquals( 1, result.size() );
- tx.commit();
- s.close();
-
- }
-
- public void testNonGetter() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Flight airFrance = new Flight();
- airFrance.setId( new Long( 747 ) );
- airFrance.setName( "Paris-Amsterdam" );
- airFrance.setDuration( new Long( 10 ) );
- airFrance.setFactor( 25 );
- s.persist( airFrance );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- airFrance = (Flight) s.get( Flight.class, airFrance.getId() );
- assertNotNull( airFrance );
- assertEquals( new Long( 10 ), airFrance.getDuration() );
- assertFalse( 25 == airFrance.getFactor( false ) );
- s.delete( airFrance );
- tx.commit();
- s.close();
- }
-
- public void testTemporalType() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Flight airFrance = new Flight();
- airFrance.setId( new Long( 747 ) );
- airFrance.setName( "Paris-Amsterdam" );
- airFrance.setDuration( new Long( 10 ) );
- airFrance.setDepartureDate( new Date( 05, 06, 21, 10, 0, 0 ) );
- airFrance.setAlternativeDepartureDate( new GregorianCalendar( 2006, 02, 03, 10, 00 ) );
- airFrance.getAlternativeDepartureDate().setTimeZone( TimeZone.getTimeZone( "GMT" ) );
- airFrance.setBuyDate( new java.sql.Timestamp(122367443) );
- airFrance.setFactor( 25 );
- s.persist( airFrance );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.createQuery( "from Flight f where f.departureDate = :departureDate" );
- q.setParameter( "departureDate", airFrance.getDepartureDate(), Hibernate.DATE );
- Flight copyAirFrance = (Flight) q.uniqueResult();
- assertNotNull( airFrance );
- assertEquals(
- new Date( 05, 06, 21 ),
- copyAirFrance.getDepartureDate()
- );
- assertEquals( airFrance.getBuyDate().getTime() / 1000 , airFrance.getBuyDate().getTime() / 1000 );
- s.delete( copyAirFrance );
- tx.commit();
- s.close();
- }
-
- public void testBasic() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Flight airFrance = new Flight();
- airFrance.setId( new Long( 747 ) );
- airFrance.setName( "Paris-Amsterdam" );
- airFrance.setDuration( null );
- try {
- s.persist( airFrance );
- tx.commit();
- fail( "Basic(optional=false) fails" );
- }
- catch (Exception e) {
- //success
- if ( tx != null ) tx.rollback();
- }
- finally {
- s.close();
- }
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- Flight.class,
- Company.class,
- Sky.class
- };
- }
-
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/EntityTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/EntityTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/EntityTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/EntityTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,369 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+import java.util.TimeZone;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.StaleStateException;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EntityTest extends TestCase {
+
+ public EntityTest(String x) {
+ super( x );
+ }
+
+ public void testLoad() throws Exception {
+ //put an object in DB
+ assertEquals( "Flight", getCfg().getClassMapping( Flight.class.getName() ).getTable().getName() );
+
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Flight firstOne = new Flight();
+ firstOne.setId( new Long( 1 ) );
+ firstOne.setName( "AF3202" );
+ firstOne.setDuration( new Long( 1000000 ) );
+ firstOne.setDurationInSec( 2000 );
+ s.save( firstOne );
+ s.flush();
+ tx.commit();
+ s.close();
+
+ //read it
+ s = openSession();
+ tx = s.beginTransaction();
+ firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
+ assertNotNull( firstOne );
+ assertEquals( new Long( 1 ), firstOne.getId() );
+ assertEquals( "AF3202", firstOne.getName() );
+ assertEquals( new Long( 1000000 ), firstOne.getDuration() );
+ assertFalse( "Transient is not working", 2000l == firstOne.getDurationInSec() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testColumn() throws Exception {
+ //put an object in DB
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Flight firstOne = new Flight();
+ firstOne.setId( new Long( 1 ) );
+ firstOne.setName( null );
+
+ try {
+ s.save( firstOne );
+ tx.commit();
+ fail( "Name column should be not null" );
+ }
+ catch (HibernateException e) {
+ //fine
+ }
+ finally {
+ s.close();
+ }
+
+ //insert an object and check that name is not updatable
+ s = openSession();
+ tx = s.beginTransaction();
+ firstOne = new Flight();
+ firstOne.setId( new Long( 1 ) );
+ firstOne.setName( "AF3202" );
+ firstOne.setTriggeredData( "should not be insertable" );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
+ assertNotNull( firstOne );
+ assertEquals( new Long( 1 ), firstOne.getId() );
+ assertEquals( "AF3202", firstOne.getName() );
+ assertFalse( "should not be insertable".equals( firstOne.getTriggeredData() ) );
+ firstOne.setName( "BA1234" );
+ firstOne.setTriggeredData( "should not be updatable" );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
+ assertNotNull( firstOne );
+ assertEquals( new Long( 1 ), firstOne.getId() );
+ assertEquals( "AF3202", firstOne.getName() );
+ assertFalse( "should not be updatable".equals( firstOne.getTriggeredData() ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testColumnUnique() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Sky sky = new Sky();
+ sky.id = new Long( 2 );
+ sky.color = "blue";
+ sky.day = "monday";
+ sky.month = "January";
+
+ Sky sameSky = new Sky();
+ sameSky.id = new Long( 3 );
+ sameSky.color = "blue";
+ sky.day = "tuesday";
+ sky.month = "January";
+
+ try {
+ s.save( sky );
+ s.flush();
+ s.save( sameSky );
+ tx.commit();
+ fail( "unique constraints not respected" );
+ }
+ catch (HibernateException e) {
+ //success
+ }
+ finally {
+ if ( tx != null ) tx.rollback();
+ s.close();
+ }
+ }
+
+ public void testUniqueConstraint() throws Exception {
+ int id = 5;
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Sky sky = new Sky();
+ sky.id = new Long( id++ );
+ sky.color = "green";
+ sky.day = "monday";
+ sky.month = "March";
+
+ Sky otherSky = new Sky();
+ otherSky.id = new Long( id++ );
+ otherSky.color = "red";
+ otherSky.day = "friday";
+ otherSky.month = "March";
+
+ Sky sameSky = new Sky();
+ sameSky.id = new Long( id++ );
+ sameSky.color = "green";
+ sameSky.day = "monday";
+ sameSky.month = "March";
+
+ s.save( sky );
+ s.flush();
+
+ s.save( otherSky );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ try {
+ s.save( sameSky );
+ tx.commit();
+ fail( "unique constraints not respected" );
+ }
+ catch (HibernateException e) {
+ //success
+ }
+ finally {
+ if ( tx != null ) tx.rollback();
+ s.close();
+ }
+ }
+
+ public void testVersion() throws Exception {
+// put an object in DB
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Flight firstOne = new Flight();
+ firstOne.setId( new Long( 2 ) );
+ firstOne.setName( "AF3202" );
+ firstOne.setDuration( new Long( 500 ) );
+ s.save( firstOne );
+ s.flush();
+ tx.commit();
+ s.close();
+
+ //read it
+ s = openSession();
+ tx = s.beginTransaction();
+ firstOne = (Flight) s.get( Flight.class, new Long( 2 ) );
+ tx.commit();
+ s.close();
+
+ //read it again
+ s = openSession();
+ tx = s.beginTransaction();
+ Flight concurrentOne = (Flight) s.get( Flight.class, new Long( 2 ) );
+ concurrentOne.setDuration( new Long( 1000 ) );
+ s.update( concurrentOne );
+ tx.commit();
+ s.close();
+ assertFalse( firstOne == concurrentOne );
+ assertFalse( firstOne.getVersion().equals( concurrentOne.getVersion() ) );
+
+ //reattach the first one
+ s = openSession();
+ tx = s.beginTransaction();
+ firstOne.setName( "Second access" );
+ s.update( firstOne );
+ try {
+ tx.commit();
+ fail( "Optimistic locking should work" );
+ }
+ catch (StaleStateException e) {
+ //fine
+ }
+ finally {
+ if ( tx != null ) tx.rollback();
+ s.close();
+ }
+
+ }
+
+ public void testFieldAccess() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Sky sky = new Sky();
+ sky.id = new Long( 1 );
+ sky.color = "black";
+ Sky.area = "Paris";
+ s.save( sky );
+ tx.commit();
+ s.close();
+ Sky.area = "London";
+
+ s = openSession();
+ tx = s.beginTransaction();
+ sky = (Sky) s.get( Sky.class, sky.id );
+ assertNotNull( sky );
+ assertEquals( "black", sky.color );
+ assertFalse( "Paris".equals( Sky.area ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testEntityName() throws Exception {
+ assertEquals( "Corporation", getCfg().getClassMapping( Company.class.getName() ).getTable().getName() );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Company comp = new Company();
+ s.persist( comp );
+ comp.setName( "JBoss Inc" );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ List result = s.createQuery( "from Corporation" ).list();
+ assertNotNull( result );
+ assertEquals( 1, result.size() );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testNonGetter() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Flight airFrance = new Flight();
+ airFrance.setId( new Long( 747 ) );
+ airFrance.setName( "Paris-Amsterdam" );
+ airFrance.setDuration( new Long( 10 ) );
+ airFrance.setFactor( 25 );
+ s.persist( airFrance );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ airFrance = (Flight) s.get( Flight.class, airFrance.getId() );
+ assertNotNull( airFrance );
+ assertEquals( new Long( 10 ), airFrance.getDuration() );
+ assertFalse( 25 == airFrance.getFactor( false ) );
+ s.delete( airFrance );
+ tx.commit();
+ s.close();
+ }
+
+ public void testTemporalType() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Flight airFrance = new Flight();
+ airFrance.setId( new Long( 747 ) );
+ airFrance.setName( "Paris-Amsterdam" );
+ airFrance.setDuration( new Long( 10 ) );
+ airFrance.setDepartureDate( new Date( 05, 06, 21, 10, 0, 0 ) );
+ airFrance.setAlternativeDepartureDate( new GregorianCalendar( 2006, 02, 03, 10, 00 ) );
+ airFrance.getAlternativeDepartureDate().setTimeZone( TimeZone.getTimeZone( "GMT" ) );
+ airFrance.setBuyDate( new java.sql.Timestamp(122367443) );
+ airFrance.setFactor( 25 );
+ s.persist( airFrance );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.createQuery( "from Flight f where f.departureDate = :departureDate" );
+ q.setParameter( "departureDate", airFrance.getDepartureDate(), Hibernate.DATE );
+ Flight copyAirFrance = (Flight) q.uniqueResult();
+ assertNotNull( airFrance );
+ assertEquals(
+ new Date( 05, 06, 21 ),
+ copyAirFrance.getDepartureDate()
+ );
+ assertEquals( airFrance.getBuyDate().getTime() / 1000 , airFrance.getBuyDate().getTime() / 1000 );
+ s.delete( copyAirFrance );
+ tx.commit();
+ s.close();
+ }
+
+ public void testBasic() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Flight airFrance = new Flight();
+ airFrance.setId( new Long( 747 ) );
+ airFrance.setName( "Paris-Amsterdam" );
+ airFrance.setDuration( null );
+ try {
+ s.persist( airFrance );
+ tx.commit();
+ fail( "Basic(optional=false) fails" );
+ }
+ catch (Exception e) {
+ //success
+ if ( tx != null ) tx.rollback();
+ }
+ finally {
+ s.close();
+ }
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ Flight.class,
+ Company.class,
+ Sky.class
+ };
+ }
+
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<!--
-
- Used to test the interaction of hbm files with a subclass
- extends attribute and annotated classes.
-
- See ConfigurationTest
-
--->
-
-<hibernate-mapping package="org.hibernate.test.annotations">
-
- <joined-subclass name="Ferry" table="FerryJoined" extends="org.hibernate.test.annotations.Boat">
- <key column="id"/>
- <property name="sea"/>
-
- </joined-subclass>
-
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.hbm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.hbm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+ Used to test the interaction of hbm files with a subclass
+ extends attribute and annotated classes.
+
+ See ConfigurationTest
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.annotations">
+
+ <joined-subclass name="Ferry" table="FerryJoined" extends="org.hibernate.test.annotations.Boat">
+ <key column="id"/>
+ <property name="sea"/>
+
+ </joined-subclass>
+
+</hibernate-mapping>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import javax.persistence.Entity;
-
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity()
-public class Ferry extends Boat {
- private String sea;
-
- public String getSea() {
- return sea;
- }
-
- public void setSea(String string) {
- sea = string;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ferry.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import javax.persistence.Entity;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Ferry extends Boat {
+ private String sea;
+
+ public String getSea() {
+ return sea;
+ }
+
+ public void setSea(String string) {
+ sea = string;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Flight.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Flight.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Flight.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,149 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.io.Serializable;
-import java.util.Calendar;
-import java.util.Date;
-import javax.persistence.Basic;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-import javax.persistence.Version;
-
-/**
- * Flight
- *
- * @author Emmanuel Bernard
- */
- at Entity()
- at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public class Flight implements Serializable {
- Long id;
- String name;
- transient Long duration;
- long durationInSec;
- Integer version;
- Company company;
- String triggeredData;
- long factor;
- Date departureDate;
- java.sql.Timestamp buyDate;
- Calendar alternativeDepartureDate;
-
- @Id
- public Long getId() {
- return id;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-
- @Column(name = "flight_name", nullable = false, updatable = false, length = 50)
- public String getName() {
- return name;
- }
-
- public void setName(String string) {
- name = string;
- }
-
- @Basic(fetch = FetchType.LAZY, optional = false)
- public Long getDuration() {
- return duration;
- }
-
- @Basic
- @Temporal(TemporalType.DATE)
- public Date getDepartureDate() {
- return departureDate;
- }
-
- public void setDepartureDate(Date departureDate) {
- this.departureDate = departureDate;
- }
-
-
- public void setDuration(Long l) {
- duration = l;
- //durationInSec = duration / 1000;
- }
-
- @Transient
- public long getDurationInSec() {
- return durationInSec;
- }
-
- public void setDurationInSec(long l) {
- durationInSec = l;
- }
-
- @Version
- @Column(name = "OPTLOCK")
- public Integer getVersion() {
- return version;
- }
-
- public void setVersion(Integer i) {
- version = i;
- }
-
- @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
- @JoinColumn(name = "COMP_ID")
- public Company getCompany() {
- return company;
- }
-
- public void setCompany(Company company) {
- this.company = company;
- }
-
- @Column(insertable = false, updatable = false)
- public String getTriggeredData() {
- return triggeredData;
- }
-
- public void setTriggeredData(String string) {
- triggeredData = string;
- }
-
- public void getIsNotAGetter() {
- //do nothing
- }
-
- public long getFactor(boolean x10) {
- //this is not a getter should not be persisted
- return factor * ( 1 + ( x10 == true ? 9 : 0 ) );
- }
-
- public void setFactor(long factor) {
- this.factor = factor;
- }
-
- @Temporal(TemporalType.TIMESTAMP)
- public Calendar getAlternativeDepartureDate() {
- return alternativeDepartureDate;
- }
-
- public void setAlternativeDepartureDate(Calendar alternativeDepartureDate) {
- this.alternativeDepartureDate = alternativeDepartureDate;
- }
-
- public java.sql.Timestamp getBuyDate() {
- return buyDate;
- }
-
- public void setBuyDate(java.sql.Timestamp buyDate) {
- this.buyDate = buyDate;
- }
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Flight.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Flight.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Flight.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Flight.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,149 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import java.util.Calendar;
+import java.util.Date;
+import javax.persistence.Basic;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+
+/**
+ * Flight
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Flight implements Serializable {
+ Long id;
+ String name;
+ transient Long duration;
+ long durationInSec;
+ Integer version;
+ Company company;
+ String triggeredData;
+ long factor;
+ Date departureDate;
+ java.sql.Timestamp buyDate;
+ Calendar alternativeDepartureDate;
+
+ @Id
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+
+ @Column(name = "flight_name", nullable = false, updatable = false, length = 50)
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String string) {
+ name = string;
+ }
+
+ @Basic(fetch = FetchType.LAZY, optional = false)
+ public Long getDuration() {
+ return duration;
+ }
+
+ @Basic
+ @Temporal(TemporalType.DATE)
+ public Date getDepartureDate() {
+ return departureDate;
+ }
+
+ public void setDepartureDate(Date departureDate) {
+ this.departureDate = departureDate;
+ }
+
+
+ public void setDuration(Long l) {
+ duration = l;
+ //durationInSec = duration / 1000;
+ }
+
+ @Transient
+ public long getDurationInSec() {
+ return durationInSec;
+ }
+
+ public void setDurationInSec(long l) {
+ durationInSec = l;
+ }
+
+ @Version
+ @Column(name = "OPTLOCK")
+ public Integer getVersion() {
+ return version;
+ }
+
+ public void setVersion(Integer i) {
+ version = i;
+ }
+
+ @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+ @JoinColumn(name = "COMP_ID")
+ public Company getCompany() {
+ return company;
+ }
+
+ public void setCompany(Company company) {
+ this.company = company;
+ }
+
+ @Column(insertable = false, updatable = false)
+ public String getTriggeredData() {
+ return triggeredData;
+ }
+
+ public void setTriggeredData(String string) {
+ triggeredData = string;
+ }
+
+ public void getIsNotAGetter() {
+ //do nothing
+ }
+
+ public long getFactor(boolean x10) {
+ //this is not a getter should not be persisted
+ return factor * ( 1 + ( x10 == true ? 9 : 0 ) );
+ }
+
+ public void setFactor(long factor) {
+ this.factor = factor;
+ }
+
+ @Temporal(TemporalType.TIMESTAMP)
+ public Calendar getAlternativeDepartureDate() {
+ return alternativeDepartureDate;
+ }
+
+ public void setAlternativeDepartureDate(Calendar alternativeDepartureDate) {
+ this.alternativeDepartureDate = alternativeDepartureDate;
+ }
+
+ public java.sql.Timestamp getBuyDate() {
+ return buyDate;
+ }
+
+ public void setBuyDate(java.sql.Timestamp buyDate) {
+ this.buyDate = buyDate;
+ }
+
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/FlyingObject.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/FlyingObject.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/FlyingObject.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,54 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.Transient;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public abstract class FlyingObject extends Thing implements Serializable {
- private String serial;
- private int altitude;
- private int metricAltitude;
- private String color = "white";
-
-
- public int getAltitude() {
- return altitude;
- }
-
- public void setAltitude(int i) {
- altitude = i;
- }
-
- @Transient
- public int getMetricAltitude() {
- return metricAltitude;
- }
-
- public void setMetricAltitude(int i) {
- metricAltitude = i;
- }
-
- @Column(name = "serialnbr")
- public String getSerial() {
- return serial;
- }
-
- public void setSerial(String serial) {
- this.serial = serial;
- }
-
- @Column(nullable = false)
- public String getColor() {
- return color;
- }
-
- public void setColor(String color) {
- this.color = color;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/FlyingObject.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/FlyingObject.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/FlyingObject.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/FlyingObject.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,54 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Transient;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public abstract class FlyingObject extends Thing implements Serializable {
+ private String serial;
+ private int altitude;
+ private int metricAltitude;
+ private String color = "white";
+
+
+ public int getAltitude() {
+ return altitude;
+ }
+
+ public void setAltitude(int i) {
+ altitude = i;
+ }
+
+ @Transient
+ public int getMetricAltitude() {
+ return metricAltitude;
+ }
+
+ public void setMetricAltitude(int i) {
+ metricAltitude = i;
+ }
+
+ @Column(name = "serialnbr")
+ public String getSerial() {
+ return serial;
+ }
+
+ public void setSerial(String serial) {
+ this.serial = serial;
+ }
+
+ @Column(nullable = false)
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/IncorrectEntity.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/IncorrectEntity.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/IncorrectEntity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class IncorrectEntity {
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/IncorrectEntity.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/IncorrectEntity.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/IncorrectEntity.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/IncorrectEntity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class IncorrectEntity {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/JoinedSubclassTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/JoinedSubclassTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/JoinedSubclassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,110 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.inheritance.Carrot;
-import org.hibernate.test.annotations.inheritance.Tomato;
-import org.hibernate.test.annotations.inheritance.Vegetable;
-import org.hibernate.test.annotations.inheritance.VegetablePk;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JoinedSubclassTest extends TestCase {
-
- public JoinedSubclassTest(String x) {
- super( x );
- }
-
- public void testDefaultValues() {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Ferry f = new Ferry();
- f.setSize( 2 );
- f.setSea( "Channel" );
- s.persist( f );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- f = (Ferry) s.get( Ferry.class, f.getId() );
- assertNotNull( f );
- assertEquals( "Channel", f.getSea() );
- assertEquals( 2, f.getSize() );
- s.delete( f );
- tx.commit();
- s.close();
- }
-
- public void testDeclaredValues() {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Country c = new Country();
- c.setName( "France" );
- AmericaCupClass f = new AmericaCupClass();
- f.setSize( 2 );
- f.setCountry( c );
- s.persist( c );
- s.persist( f );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- f = (AmericaCupClass) s.get( AmericaCupClass.class, f.getId() );
- assertNotNull( f );
- assertEquals( c, f.getCountry() );
- assertEquals( 2, f.getSize() );
- s.delete( f );
- s.delete( f.getCountry() );
- tx.commit();
- s.close();
- }
-
- public void testCompositePk() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Carrot c = new Carrot();
- VegetablePk pk = new VegetablePk();
- pk.setFarmer( "Bill" );
- pk.setHarvestDate( "2004-08-15" );
- c.setId( pk );
- c.setLength( 23 );
- s.persist( c );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Vegetable v = (Vegetable) s.createCriteria( Vegetable.class ).uniqueResult();
- assertTrue( v instanceof Carrot );
- Carrot result = (Carrot) v;
- assertEquals( 23, result.getLength() );
- tx.commit();
- s.close();
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- Boat.class,
- Ferry.class,
- AmericaCupClass.class,
- Country.class,
- Vegetable.class,
- Carrot.class,
- Tomato.class
- };
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/JoinedSubclassTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/JoinedSubclassTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/JoinedSubclassTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/JoinedSubclassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,110 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.inheritance.Carrot;
+import org.hibernate.test.annotations.inheritance.Tomato;
+import org.hibernate.test.annotations.inheritance.Vegetable;
+import org.hibernate.test.annotations.inheritance.VegetablePk;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JoinedSubclassTest extends TestCase {
+
+ public JoinedSubclassTest(String x) {
+ super( x );
+ }
+
+ public void testDefaultValues() {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Ferry f = new Ferry();
+ f.setSize( 2 );
+ f.setSea( "Channel" );
+ s.persist( f );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ f = (Ferry) s.get( Ferry.class, f.getId() );
+ assertNotNull( f );
+ assertEquals( "Channel", f.getSea() );
+ assertEquals( 2, f.getSize() );
+ s.delete( f );
+ tx.commit();
+ s.close();
+ }
+
+ public void testDeclaredValues() {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Country c = new Country();
+ c.setName( "France" );
+ AmericaCupClass f = new AmericaCupClass();
+ f.setSize( 2 );
+ f.setCountry( c );
+ s.persist( c );
+ s.persist( f );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ f = (AmericaCupClass) s.get( AmericaCupClass.class, f.getId() );
+ assertNotNull( f );
+ assertEquals( c, f.getCountry() );
+ assertEquals( 2, f.getSize() );
+ s.delete( f );
+ s.delete( f.getCountry() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCompositePk() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Carrot c = new Carrot();
+ VegetablePk pk = new VegetablePk();
+ pk.setFarmer( "Bill" );
+ pk.setHarvestDate( "2004-08-15" );
+ c.setId( pk );
+ c.setLength( 23 );
+ s.persist( c );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Vegetable v = (Vegetable) s.createCriteria( Vegetable.class ).uniqueResult();
+ assertTrue( v instanceof Carrot );
+ Carrot result = (Carrot) v;
+ assertEquals( 23, result.getLength() );
+ tx.commit();
+ s.close();
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ Boat.class,
+ Ferry.class,
+ AmericaCupClass.class,
+ Country.class,
+ Vegetable.class,
+ Carrot.class,
+ Tomato.class
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Passport.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Passport.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Passport.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-
-/**
- * International passport
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Passport implements Serializable {
-
- private Long id;
- private String number;
- private Customer owner;
-
- @Id
- public Long getId() {
- return id;
- }
-
- @Column(name = "passport_number")
- public String getNumber() {
- return number;
- }
-
- @OneToOne(mappedBy = "passport")
- public Customer getOwner() {
- return owner;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-
- public void setNumber(String string) {
- number = string;
- }
-
- public void setOwner(Customer customer) {
- owner = customer;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Passport.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Passport.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Passport.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Passport.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+/**
+ * International passport
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Passport implements Serializable {
+
+ private Long id;
+ private String number;
+ private Customer owner;
+
+ @Id
+ public Long getId() {
+ return id;
+ }
+
+ @Column(name = "passport_number")
+ public String getNumber() {
+ return number;
+ }
+
+ @OneToOne(mappedBy = "passport")
+ public Customer getOwner() {
+ return owner;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+
+ public void setNumber(String string) {
+ number = string;
+ }
+
+ public void setOwner(Customer customer) {
+ owner = customer;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Plane.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Plane.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Plane.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorType;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.NamedQuery;
-import javax.persistence.QueryHint;
-
-/**
- * Plane class
- *
- * @author Emmanuel Bernard
- */
- at Entity()
- at Inheritance(strategy = InheritanceType.SINGLE_TABLE)
- at DiscriminatorColumn(name = "planetype", length = 100, discriminatorType = DiscriminatorType.STRING)
- at DiscriminatorValue("Plane")
- at AttributeOverride(name = "altitude", column = @Column(name = "fld_altitude"))
- at NamedQuery(name = "plane.byId", query = "from Plane where id = :id",
- hints = {@QueryHint(name = "org.hibernate.cacheable", value = "true"),
- @QueryHint(name = "org.hibernate.cacheRegion", value = "testedCacheRegion"),
- @QueryHint(name = "org.hibernate.timeout", value = "100"),
- @QueryHint(name = "org.hibernate.fetchSize", value = "1"),
- @QueryHint(name = "org.hibernate.flushMode", value = "Commit"),
- @QueryHint(name = "org.hibernate.cacheMode", value = "NORMAL"),
- @QueryHint(name = "org.hibernate.comment", value = "Plane by id")})
-public class Plane extends FlyingObject {
-
- private Long id;
- private int nbrofSeats;
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public int getNbrOfSeats() {
- return nbrofSeats;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-
- public void setNbrOfSeats(int i) {
- nbrofSeats = i;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Plane.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Plane.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Plane.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Plane.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.NamedQuery;
+import javax.persistence.QueryHint;
+
+/**
+ * Plane class
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+ at DiscriminatorColumn(name = "planetype", length = 100, discriminatorType = DiscriminatorType.STRING)
+ at DiscriminatorValue("Plane")
+ at AttributeOverride(name = "altitude", column = @Column(name = "fld_altitude"))
+ at NamedQuery(name = "plane.byId", query = "from Plane where id = :id",
+ hints = {@QueryHint(name = "org.hibernate.cacheable", value = "true"),
+ @QueryHint(name = "org.hibernate.cacheRegion", value = "testedCacheRegion"),
+ @QueryHint(name = "org.hibernate.timeout", value = "100"),
+ @QueryHint(name = "org.hibernate.fetchSize", value = "1"),
+ @QueryHint(name = "org.hibernate.flushMode", value = "Commit"),
+ @QueryHint(name = "org.hibernate.cacheMode", value = "NORMAL"),
+ @QueryHint(name = "org.hibernate.comment", value = "Plane by id")})
+public class Plane extends FlyingObject {
+
+ private Long id;
+ private int nbrofSeats;
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public int getNbrOfSeats() {
+ return nbrofSeats;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+
+ public void setNbrOfSeats(int i) {
+ nbrofSeats = i;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Port.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Port.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Port.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,37 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-/**
- * Used to test that annotated classes can have one-to-many
- * relationships with hbm loaded classes.
- */
- at Entity()
-public class Port {
- private Long id;
- private Set<Boat> boats;
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-
- @OneToMany
- public Set<Boat> getBoats() {
- return boats;
- }
-
- public void setBoats(Set<Boat> boats) {
- this.boats = boats;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Port.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Port.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Port.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Port.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,37 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+/**
+ * Used to test that annotated classes can have one-to-many
+ * relationships with hbm loaded classes.
+ */
+ at Entity()
+public class Port {
+ private Long id;
+ private Set<Boat> boats;
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+
+ @OneToMany
+ public Set<Boat> getBoats() {
+ return boats;
+ }
+
+ public void setBoats(Set<Boat> boats) {
+ this.boats = boats;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SafeMappingTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SafeMappingTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SafeMappingTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import org.hibernate.AnnotationException;
-import org.hibernate.SessionFactory;
-import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Environment;
-
-/**
- * @author Emmanuel Bernard
- */
-public class SafeMappingTest extends junit.framework.TestCase {
- public void testDeclarativeMix() throws Exception {
- AnnotationConfiguration cfg = new AnnotationConfiguration();
- cfg.addAnnotatedClass( IncorrectEntity.class );
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- try {
- SessionFactory sf = cfg.buildSessionFactory();
- fail( "Entity wo id should fail" );
- }
- catch (AnnotationException e) {
- //success
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SafeMappingTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SafeMappingTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SafeMappingTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SafeMappingTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import org.hibernate.AnnotationException;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SafeMappingTest extends junit.framework.TestCase {
+ public void testDeclarativeMix() throws Exception {
+ AnnotationConfiguration cfg = new AnnotationConfiguration();
+ cfg.addAnnotatedClass( IncorrectEntity.class );
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ try {
+ SessionFactory sf = cfg.buildSessionFactory();
+ fail( "Entity wo id should fail" );
+ }
+ catch (AnnotationException e) {
+ //success
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SecuredBindingTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SecuredBindingTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SecuredBindingTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.util.Properties;
-
-import junit.framework.TestCase;
-import org.hibernate.HibernateException;
-import org.hibernate.SessionFactory;
-import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Environment;
-
-/**
- * @author Emmanuel Bernard
- */
-public class SecuredBindingTest extends TestCase {
-
- public SecuredBindingTest(String x) {
- super( x );
- }
-
- public void testConfigurationMethods() throws Exception {
- AnnotationConfiguration ac = new AnnotationConfiguration();
- Properties p = new Properties();
- p.put( Environment.DIALECT, "org.hibernate.dialect.HSQLDialect" );
- p.put( "hibernate.connection.driver_class", "org.hsqldb.jdbcDrive" );
- p.put( "hibernate.connection.url", "jdbc:hsqldb:." );
- p.put( "hibernate.connection.username", "sa" );
- p.put( "hibernate.connection.password", "" );
- p.put( "hibernate.show_sql", "true" );
- ac.setProperties( p );
- ac.addAnnotatedClass( Plane.class );
- SessionFactory sf;
- try {
- sf = ac.buildSessionFactory();
- fail( "Driver property overriding should work" );
- sf.close();
- }
- catch (HibernateException he) {
- //success
- }
-
- }
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SecuredBindingTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SecuredBindingTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SecuredBindingTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/SecuredBindingTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.util.Properties;
+
+import junit.framework.TestCase;
+import org.hibernate.HibernateException;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SecuredBindingTest extends TestCase {
+
+ public SecuredBindingTest(String x) {
+ super( x );
+ }
+
+ public void testConfigurationMethods() throws Exception {
+ AnnotationConfiguration ac = new AnnotationConfiguration();
+ Properties p = new Properties();
+ p.put( Environment.DIALECT, "org.hibernate.dialect.HSQLDialect" );
+ p.put( "hibernate.connection.driver_class", "org.hsqldb.jdbcDrive" );
+ p.put( "hibernate.connection.url", "jdbc:hsqldb:." );
+ p.put( "hibernate.connection.username", "sa" );
+ p.put( "hibernate.connection.password", "" );
+ p.put( "hibernate.show_sql", "true" );
+ ac.setProperties( p );
+ ac.addAnnotatedClass( Plane.class );
+ SessionFactory sf;
+ try {
+ sf = ac.buildSessionFactory();
+ fail( "Driver property overriding should work" );
+ sf.close();
+ }
+ catch (HibernateException he) {
+ //success
+ }
+
+ }
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Sky.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Sky.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Sky.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "tbl_sky",
- uniqueConstraints = {@UniqueConstraint(columnNames = {"month", "day"})}
-)
-public class Sky implements Serializable {
- @Id
- protected Long id;
- @Column(unique = true, columnDefinition = "varchar(250)")
- protected String color;
- protected String day;
- @Column(name = "MONTH")
- protected String month;
- static protected String area;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Sky.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Sky.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Sky.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Sky.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_sky",
+ uniqueConstraints = {@UniqueConstraint(columnNames = {"month", "day"})}
+)
+public class Sky implements Serializable {
+ @Id
+ protected Long id;
+ @Column(unique = true, columnDefinition = "varchar(250)")
+ protected String color;
+ protected String day;
+ @Column(name = "MONTH")
+ protected String month;
+ static protected String area;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,154 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.io.InputStream;
-
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.Interceptor;
-import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.dialect.Dialect;
-
-public abstract class TestCase extends junit.framework.TestCase {
-
- private static SessionFactory sessions;
- private static AnnotationConfiguration cfg;
- private static Dialect dialect;
- private static Class lastTestClass;
- private Session session;
-
- public TestCase() {
- super();
- }
-
- public TestCase(String x) {
- super( x );
- }
-
- protected void buildSessionFactory(Class[] classes, String[] packages, String[] xmlFiles) throws Exception {
-
- if ( getSessions() != null ) getSessions().close();
- try {
- setCfg( new AnnotationConfiguration() );
- configure( cfg );
- if ( recreateSchema() ) {
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- }
- for ( int i = 0; i < packages.length ; i++ ) {
- getCfg().addPackage( packages[i] );
- }
- for ( int i = 0; i < classes.length ; i++ ) {
- getCfg().addAnnotatedClass( classes[i] );
- }
- for ( int i = 0; i < xmlFiles.length ; i++ ) {
- InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFiles[i] );
- getCfg().addInputStream( is );
- }
- setDialect( Dialect.getDialect() );
- setSessions( getCfg().buildSessionFactory( /*new TestInterceptor()*/ ) );
- }
- catch (Exception e) {
- e.printStackTrace();
- throw e;
- }
- }
-
- protected void setUp() throws Exception {
- if ( getSessions() == null || lastTestClass != getClass() ) {
- buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
- lastTestClass = getClass();
- }
- }
-
- protected void runTest() throws Throwable {
- try {
- super.runTest();
- if ( session != null && session.isOpen() ) {
- if ( session.isConnected() ) session.connection().rollback();
- session.close();
- session = null;
- fail( "unclosed session" );
- }
- else {
- session = null;
- }
- }
- catch (Throwable e) {
- try {
- if ( session != null && session.isOpen() ) {
- if ( session.isConnected() ) session.connection().rollback();
- session.close();
- }
- }
- catch (Exception ignore) {
- }
- try {
- if ( sessions != null ) {
- sessions.close();
- sessions = null;
- }
- }
- catch (Exception ignore) {
- }
- throw e;
- }
- }
-
- public Session openSession() throws HibernateException {
- session = getSessions().openSession();
- return session;
- }
-
- public Session openSession(Interceptor interceptor) throws HibernateException {
- session = getSessions().openSession(interceptor);
- return session;
- }
-
- protected abstract Class[] getMappings();
-
- protected String[] getAnnotatedPackages() {
- return new String[]{};
- }
-
- protected String[] getXmlFiles() {
- return new String[]{};
- }
-
- private void setSessions(SessionFactory sessions) {
- TestCase.sessions = sessions;
- }
-
- protected SessionFactory getSessions() {
- return sessions;
- }
-
- private void setDialect(Dialect dialect) {
- TestCase.dialect = dialect;
- }
-
- protected Dialect getDialect() {
- return dialect;
- }
-
- protected static void setCfg(AnnotationConfiguration cfg) {
- TestCase.cfg = cfg;
- }
-
- protected static AnnotationConfiguration getCfg() {
- return cfg;
- }
-
- protected void configure(Configuration cfg) {
- //cfg.setNamingStrategy( AlternativeNamingStrategy.INSTANCE );
- //cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
- //cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
- }
-
- protected boolean recreateSchema() {
- return true;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TestCase.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TestCase.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,154 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.io.InputStream;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Interceptor;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.Dialect;
+
+public abstract class TestCase extends junit.framework.TestCase {
+
+ private static SessionFactory sessions;
+ private static AnnotationConfiguration cfg;
+ private static Dialect dialect;
+ private static Class lastTestClass;
+ private Session session;
+
+ public TestCase() {
+ super();
+ }
+
+ public TestCase(String x) {
+ super( x );
+ }
+
+ protected void buildSessionFactory(Class[] classes, String[] packages, String[] xmlFiles) throws Exception {
+
+ if ( getSessions() != null ) getSessions().close();
+ try {
+ setCfg( new AnnotationConfiguration() );
+ configure( cfg );
+ if ( recreateSchema() ) {
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ }
+ for ( int i = 0; i < packages.length ; i++ ) {
+ getCfg().addPackage( packages[i] );
+ }
+ for ( int i = 0; i < classes.length ; i++ ) {
+ getCfg().addAnnotatedClass( classes[i] );
+ }
+ for ( int i = 0; i < xmlFiles.length ; i++ ) {
+ InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFiles[i] );
+ getCfg().addInputStream( is );
+ }
+ setDialect( Dialect.getDialect() );
+ setSessions( getCfg().buildSessionFactory( /*new TestInterceptor()*/ ) );
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ protected void setUp() throws Exception {
+ if ( getSessions() == null || lastTestClass != getClass() ) {
+ buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
+ lastTestClass = getClass();
+ }
+ }
+
+ protected void runTest() throws Throwable {
+ try {
+ super.runTest();
+ if ( session != null && session.isOpen() ) {
+ if ( session.isConnected() ) session.connection().rollback();
+ session.close();
+ session = null;
+ fail( "unclosed session" );
+ }
+ else {
+ session = null;
+ }
+ }
+ catch (Throwable e) {
+ try {
+ if ( session != null && session.isOpen() ) {
+ if ( session.isConnected() ) session.connection().rollback();
+ session.close();
+ }
+ }
+ catch (Exception ignore) {
+ }
+ try {
+ if ( sessions != null ) {
+ sessions.close();
+ sessions = null;
+ }
+ }
+ catch (Exception ignore) {
+ }
+ throw e;
+ }
+ }
+
+ public Session openSession() throws HibernateException {
+ session = getSessions().openSession();
+ return session;
+ }
+
+ public Session openSession(Interceptor interceptor) throws HibernateException {
+ session = getSessions().openSession(interceptor);
+ return session;
+ }
+
+ protected abstract Class[] getMappings();
+
+ protected String[] getAnnotatedPackages() {
+ return new String[]{};
+ }
+
+ protected String[] getXmlFiles() {
+ return new String[]{};
+ }
+
+ private void setSessions(SessionFactory sessions) {
+ TestCase.sessions = sessions;
+ }
+
+ protected SessionFactory getSessions() {
+ return sessions;
+ }
+
+ private void setDialect(Dialect dialect) {
+ TestCase.dialect = dialect;
+ }
+
+ protected Dialect getDialect() {
+ return dialect;
+ }
+
+ protected static void setCfg(AnnotationConfiguration cfg) {
+ TestCase.cfg = cfg;
+ }
+
+ protected static AnnotationConfiguration getCfg() {
+ return cfg;
+ }
+
+ protected void configure(Configuration cfg) {
+ //cfg.setNamingStrategy( AlternativeNamingStrategy.INSTANCE );
+ //cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
+ //cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
+ }
+
+ protected boolean recreateSchema() {
+ return true;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Thing.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Thing.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Thing.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Thing {
- private boolean isAlive;
-
- public boolean isAlive() {
- return isAlive;
- }
-
- public void setAlive(boolean alive) {
- isAlive = alive;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Thing.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Thing.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Thing.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Thing.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Thing {
+ private boolean isAlive;
+
+ public boolean isAlive() {
+ return isAlive;
+ }
+
+ public void setAlive(boolean alive) {
+ isAlive = alive;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ticket.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ticket.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ticket.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * Flight ticket
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Ticket implements Serializable {
- Long id;
- String number;
-
- public Ticket() {
- }
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- @Column(name = "ticket_number")
- public String getNumber() {
- return number;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-
- public void setNumber(String string) {
- number = string;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Ticket ) ) return false;
-
- final Ticket ticket = (Ticket) o;
-
- if ( !number.equals( ticket.number ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return number.hashCode();
- }
-
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ticket.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ticket.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ticket.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/Ticket.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Flight ticket
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Ticket implements Serializable {
+ Long id;
+ String number;
+
+ public Ticket() {
+ }
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ @Column(name = "ticket_number")
+ public String getNumber() {
+ return number;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+
+ public void setNumber(String string) {
+ number = string;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Ticket ) ) return false;
+
+ final Ticket ticket = (Ticket) o;
+
+ if ( !number.equals( ticket.number ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return number.hashCode();
+ }
+
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TicketComparator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TicketComparator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TicketComparator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations;
-
-import java.util.Comparator;
-
-/**
- * Ticket comparator ordering longest first
- *
- * @author Emmanuel Bernard
- */
-public class TicketComparator implements Comparator<Ticket> {
-
- public int compare(Ticket ticket, Ticket ticket1) {
- if ( ticket == null || ticket1 == null ) {
- throw new IllegalStateException( "Ticket comparison only available through non null tickets" );
- }
- return ticket1.getNumber().length() - ticket.getNumber().length();
-
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TicketComparator.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TicketComparator.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TicketComparator.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/TicketComparator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.test.annotations;
+
+import java.util.Comparator;
+
+/**
+ * Ticket comparator ordering longest first
+ *
+ * @author Emmanuel Bernard
+ */
+public class TicketComparator implements Comparator<Ticket> {
+
+ public int compare(Ticket ticket, Ticket ticket1) {
+ if ( ticket == null || ticket1 == null ) {
+ throw new IllegalStateException( "Ticket comparison only available through non null tickets" );
+ }
+ return ticket1.getNumber().length() - ticket.getNumber().length();
+
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/AccessTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/AccessTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/AccessTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,109 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.access;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class AccessTest extends TestCase {
-
- public void testSuperclassOverriding() throws Exception {
- Furniture fur = new Furniture();
- fur.setColor( "Black" );
- fur.setName( "Beech" );
- fur.isAlive = true;
- Session s = openSession();
- s.persist( fur );
- Transaction tx = s.beginTransaction();
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- fur = (Furniture) s.get( Furniture.class, fur.getId() );
- assertFalse( fur.isAlive );
- assertNotNull( fur.getColor() );
- s.delete( fur );
- tx.commit();
- s.close();
- }
-
- public void testSuperclassNonOverriding() throws Exception {
- Furniture fur = new Furniture();
- fur.setGod( "Buddha" );
- Session s = openSession();
- s.persist( fur );
- Transaction tx = s.beginTransaction();
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- fur = (Furniture) s.get( Furniture.class, fur.getId() );
- assertNotNull( fur.getGod() );
- s.delete( fur );
- tx.commit();
- s.close();
- }
-
- public void testPropertyOverriding() throws Exception {
- Furniture fur = new Furniture();
- fur.weight = 3;
- Session s = openSession();
- s.persist( fur );
- Transaction tx = s.beginTransaction();
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- fur = (Furniture) s.get( Furniture.class, fur.getId() );
- assertEquals( 5, fur.weight );
- s.delete( fur );
- tx.commit();
- s.close();
-
- }
-
- public void testNonOverridenSubclass() throws Exception {
- Chair chair = new Chair();
- chair.setPillow( "Blue" );
- Session s = openSession();
- s.persist( chair );
- Transaction tx = s.beginTransaction();
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- chair = (Chair) s.get( Chair.class, chair.getId() );
- assertNull( chair.getPillow() );
- s.delete( chair );
- tx.commit();
- s.close();
-
- }
-
- public void testOverridenSubclass() throws Exception {
- BigBed bed = new BigBed();
- bed.size = 5;
- bed.setQuality( "good" );
- Session s = openSession();
- s.persist( bed );
- Transaction tx = s.beginTransaction();
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- bed = (BigBed) s.get( BigBed.class, bed.getId() );
- assertEquals( 5, bed.size );
- assertNull( bed.getQuality() );
- s.delete( bed );
- tx.commit();
- s.close();
-
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Bed.class,
- Chair.class,
- Furniture.class,
- BigBed.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/AccessTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/AccessTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/AccessTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/AccessTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,109 @@
+//$Id$
+package org.hibernate.test.annotations.access;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AccessTest extends TestCase {
+
+ public void testSuperclassOverriding() throws Exception {
+ Furniture fur = new Furniture();
+ fur.setColor( "Black" );
+ fur.setName( "Beech" );
+ fur.isAlive = true;
+ Session s = openSession();
+ s.persist( fur );
+ Transaction tx = s.beginTransaction();
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ fur = (Furniture) s.get( Furniture.class, fur.getId() );
+ assertFalse( fur.isAlive );
+ assertNotNull( fur.getColor() );
+ s.delete( fur );
+ tx.commit();
+ s.close();
+ }
+
+ public void testSuperclassNonOverriding() throws Exception {
+ Furniture fur = new Furniture();
+ fur.setGod( "Buddha" );
+ Session s = openSession();
+ s.persist( fur );
+ Transaction tx = s.beginTransaction();
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ fur = (Furniture) s.get( Furniture.class, fur.getId() );
+ assertNotNull( fur.getGod() );
+ s.delete( fur );
+ tx.commit();
+ s.close();
+ }
+
+ public void testPropertyOverriding() throws Exception {
+ Furniture fur = new Furniture();
+ fur.weight = 3;
+ Session s = openSession();
+ s.persist( fur );
+ Transaction tx = s.beginTransaction();
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ fur = (Furniture) s.get( Furniture.class, fur.getId() );
+ assertEquals( 5, fur.weight );
+ s.delete( fur );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testNonOverridenSubclass() throws Exception {
+ Chair chair = new Chair();
+ chair.setPillow( "Blue" );
+ Session s = openSession();
+ s.persist( chair );
+ Transaction tx = s.beginTransaction();
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ chair = (Chair) s.get( Chair.class, chair.getId() );
+ assertNull( chair.getPillow() );
+ s.delete( chair );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testOverridenSubclass() throws Exception {
+ BigBed bed = new BigBed();
+ bed.size = 5;
+ bed.setQuality( "good" );
+ Session s = openSession();
+ s.persist( bed );
+ Transaction tx = s.beginTransaction();
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ bed = (BigBed) s.get( BigBed.class, bed.getId() );
+ assertEquals( 5, bed.size );
+ assertNull( bed.getQuality() );
+ s.delete( bed );
+ tx.commit();
+ s.close();
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Bed.class,
+ Chair.class,
+ Furniture.class,
+ BigBed.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Bed.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Bed.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Bed.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.access;
-
-import javax.persistence.Entity;
-import javax.persistence.Transient;
-
-import org.hibernate.annotations.AccessType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at AccessType("property")
-public class Bed extends Furniture {
- String quality;
-
- @Transient
- public String getQuality() {
- return quality;
- }
-
- public void setQuality(String quality) {
- this.quality = quality;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Bed.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Bed.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Bed.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Bed.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id$
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AccessType("property")
+public class Bed extends Furniture {
+ String quality;
+
+ @Transient
+ public String getQuality() {
+ return quality;
+ }
+
+ public void setQuality(String quality) {
+ this.quality = quality;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/BigBed.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/BigBed.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/BigBed.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.access;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class BigBed extends Bed {
- public int size;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/BigBed.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/BigBed.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/BigBed.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/BigBed.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id$
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BigBed extends Bed {
+ public int size;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Chair.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Chair.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Chair.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.access;
-
-import javax.persistence.Entity;
-import javax.persistence.Transient;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Chair extends Furniture {
-
- @Transient
- private String pillow;
-
- public String getPillow() {
- return pillow;
- }
-
- public void setPillow(String pillow) {
- this.pillow = pillow;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Chair.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Chair.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Chair.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Chair.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id$
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.Entity;
+import javax.persistence.Transient;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Chair extends Furniture {
+
+ @Transient
+ private String pillow;
+
+ public String getPillow() {
+ return pillow;
+ }
+
+ public void setPillow(String pillow) {
+ this.pillow = pillow;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Furniture.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Furniture.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Furniture.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.access;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Transient;
-
-import org.hibernate.annotations.AccessType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at AccessType("field")
-public class Furniture extends Woody {
- @Id
- @GeneratedValue
- private Integer id;
-
- private String brand;
-
- @Transient
- public String getBrand() {
- return brand;
- }
-
- public void setBrand(String brand) {
- this.brand = brand;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
-
- @AccessType("property")
- public long weight;
-
- public long getWeight() {
- return weight + 1;
- }
-
- public void setWeight(long weight) {
- this.weight = weight + 1;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Furniture.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Furniture.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Furniture.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Furniture.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+//$Id$
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Transient;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AccessType("field")
+public class Furniture extends Woody {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ private String brand;
+
+ @Transient
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+
+ @AccessType("property")
+ public long weight;
+
+ public long getWeight() {
+ return weight + 1;
+ }
+
+ public void setWeight(long weight) {
+ this.weight = weight + 1;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Thingy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Thingy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Thingy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.access;
-
-import javax.persistence.MappedSuperclass;
-import javax.persistence.Transient;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Thingy {
- private String god;
-
- @Transient
- public String getGod() {
- return god;
- }
-
- public void setGod(String god) {
- this.god = god;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Thingy.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Thingy.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Thingy.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Thingy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Transient;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Thingy {
+ private String god;
+
+ @Transient
+ public String getGod() {
+ return god;
+ }
+
+ public void setGod(String god) {
+ this.god = god;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Woody.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Woody.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Woody.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.access;
-
-import javax.persistence.MappedSuperclass;
-
-import org.hibernate.annotations.AccessType;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
- at AccessType("property")
-public class Woody extends Thingy {
- private String color;
- private String name;
- public boolean isAlive; //shouldn't be persistent
-
- public String getColor() {
- return color;
- }
-
- public void setColor(String color) {
- this.color = color;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Woody.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Woody.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Woody.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/access/Woody.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.access;
+
+import javax.persistence.MappedSuperclass;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+ at AccessType("property")
+public class Woody extends Thingy {
+ private String color;
+ private String name;
+ public boolean isAlive; //shouldn't be persistent
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/ArrayTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/ArrayTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/ArrayTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.array;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ArrayTest extends TestCase {
-
- public void testOneToMany() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Competitor c1 = new Competitor();
- c1.setName( "Renault" );
- Competitor c2 = new Competitor();
- c2.setName( "Ferrari" );
- Contest contest = new Contest();
- contest.setResults( new Competitor[]{c1, c2} );
- s.persist( contest );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- contest = (Contest) s.get( Contest.class, contest.getId() );
- assertNotNull( contest );
- assertNotNull( contest.getResults() );
- assertEquals( 2, contest.getResults().length );
- assertEquals( c2.getName(), contest.getResults()[1].getName() );
- tx.commit();
- s.close();
- }
-
- public ArrayTest(String x) {
- super( x );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Competitor.class,
- Contest.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/ArrayTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/ArrayTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/ArrayTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/ArrayTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.test.annotations.array;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ArrayTest extends TestCase {
+
+ public void testOneToMany() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Competitor c1 = new Competitor();
+ c1.setName( "Renault" );
+ Competitor c2 = new Competitor();
+ c2.setName( "Ferrari" );
+ Contest contest = new Contest();
+ contest.setResults( new Competitor[]{c1, c2} );
+ s.persist( contest );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ contest = (Contest) s.get( Contest.class, contest.getId() );
+ assertNotNull( contest );
+ assertNotNull( contest.getResults() );
+ assertEquals( 2, contest.getResults().length );
+ assertEquals( c2.getName(), contest.getResults()[1].getName() );
+ tx.commit();
+ s.close();
+ }
+
+ public ArrayTest(String x) {
+ super( x );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Competitor.class,
+ Contest.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Competitor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Competitor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Competitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.array;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Competitor {
- private int id;
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Id
- @GeneratedValue
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Competitor.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Competitor.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Competitor.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Competitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.array;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Competitor {
+ private int id;
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Id
+ @GeneratedValue
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Contest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Contest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Contest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.array;
-
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-import org.hibernate.annotations.IndexColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Contest {
- private int id;
- private Competitor[] results;
-
- @Id
- @GeneratedValue
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- @OneToMany(cascade = CascadeType.ALL)
- @IndexColumn(name = "pos")
- public Competitor[] getResults() {
- return results;
- }
-
- public void setResults(Competitor[] results) {
- this.results = results;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Contest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Contest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Contest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/array/Contest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id$
+package org.hibernate.test.annotations.array;
+
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.IndexColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Contest {
+ private int id;
+ private Competitor[] results;
+
+ @Id
+ @GeneratedValue
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @OneToMany(cascade = CascadeType.ALL)
+ @IndexColumn(name = "pos")
+ public Competitor[] getResults() {
+ return results;
+ }
+
+ public void setResults(Competitor[] results) {
+ this.results = results;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Hammer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Hammer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Hammer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.bytecode;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Hammer implements Tool {
- private Long id;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Integer usage() {
- return 0;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Hammer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Hammer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Hammer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Hammer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.test.annotations.bytecode;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Hammer implements Tool {
+ private Long id;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Integer usage() {
+ return 0;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.bytecode;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.Hibernate;
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.cfg.Configuration;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ProxyBreakingTest extends TestCase {
-
- static {
- System.setProperty( "hibernate.bytecode.provider", "javassist" );
- }
-
- public void testProxiedBridgeMethod() throws Exception {
- //bridge methods should not be proxied
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Hammer h = new Hammer();
- s.save(h);
- s.flush();
- s.clear();
- assertNotNull( "The proxy creation failure is breaking things", h.getId() );
- h = (Hammer) s.load( Hammer.class, h.getId() );
- assertFalse( Hibernate.isInitialized( h ) );
- tx.rollback();
- s.close();
- }
-
- public ProxyBreakingTest(String name) {
- super( name );
- }
-
- protected Class[] getMappings() {
- return new Class[0];
- }
-
- protected String[] getXmlFiles() {
- return new String[] {
- "org/hibernate/test/annotations/bytecode/Hammer.hbm.xml"
- };
- }
-
- @Override
- protected void configure(Configuration cfg) {
- super.configure( cfg.setProperty( "hibernate.bytecode.provider", "javassist" ) );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/ProxyBreakingTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+//$Id: $
+package org.hibernate.test.annotations.bytecode;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.cfg.Configuration;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ProxyBreakingTest extends TestCase {
+
+ static {
+ System.setProperty( "hibernate.bytecode.provider", "javassist" );
+ }
+
+ public void testProxiedBridgeMethod() throws Exception {
+ //bridge methods should not be proxied
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Hammer h = new Hammer();
+ s.save(h);
+ s.flush();
+ s.clear();
+ assertNotNull( "The proxy creation failure is breaking things", h.getId() );
+ h = (Hammer) s.load( Hammer.class, h.getId() );
+ assertFalse( Hibernate.isInitialized( h ) );
+ tx.rollback();
+ s.close();
+ }
+
+ public ProxyBreakingTest(String name) {
+ super( name );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[0];
+ }
+
+ protected String[] getXmlFiles() {
+ return new String[] {
+ "org/hibernate/test/annotations/bytecode/Hammer.hbm.xml"
+ };
+ }
+
+ @Override
+ protected void configure(Configuration cfg) {
+ super.configure( cfg.setProperty( "hibernate.bytecode.provider", "javassist" ) );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Tool.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Tool.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Tool.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.bytecode;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Tool {
- public Long getId();
-
- public void setId(Long id);
-
- public Number usage();
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Tool.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Tool.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Tool.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/Tool.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id: $
+package org.hibernate.test.annotations.bytecode;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Tool {
+ public Long getId();
+
+ public void setId(Long id);
+
+ public Number usage();
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/hammer.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/hammer.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/hammer.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping package="org.hibernate.test.annotations.bytecode">
- <class name="Hammer">
- <id name="id" type="java.lang.Long">
- <generator class="increment"/>
- </id>
- </class>
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/hammer.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/hammer.hbm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/hammer.hbm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/bytecode/hammer.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.annotations.bytecode">
+ <class name="Hammer">
+ <id name="id" type="java.lang.Long">
+ <generator class="increment"/>
+ </id>
+ </class>
+</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/CascadeTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/CascadeTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/CascadeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,115 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.cascade;
-
-import java.util.ArrayList;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * Check some of the individual cascade styles
- *
- * @author Emmanuel Bernard
- */
-//FIXME do somthing for refresh
-public class CascadeTest extends TestCase {
- public void testPersist() {
- Session s;
- Transaction tx;
- s = openSession();
- Tooth tooth = new Tooth();
- Tooth leftTooth = new Tooth();
- tooth.leftNeighbour = leftTooth;
- s.persist( tooth );
- tx = s.beginTransaction();
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- leftTooth = (Tooth) s.get( Tooth.class, leftTooth.id );
- assertNotNull( leftTooth );
- tx.commit();
- s.close();
- }
-
- public void testMerge() {
- Session s;
- Transaction tx;
- s = openSession();
- Tooth tooth = new Tooth();
- Tooth rightTooth = new Tooth();
- tooth.type = "canine";
- tooth.rightNeighbour = rightTooth;
- rightTooth.type = "incisive";
- s.persist( rightTooth );
- s.persist( tooth );
- tx = s.beginTransaction();
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- tooth = (Tooth) s.get( Tooth.class, tooth.id );
- assertEquals( "incisive", tooth.rightNeighbour.type );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- tooth.rightNeighbour.type = "premolars";
- s.merge( tooth );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- rightTooth = (Tooth) s.get( Tooth.class, rightTooth.id );
- assertEquals( "premolars", rightTooth.type );
- tx.commit();
- s.close();
- }
-
- public void testRemove() {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Tooth tooth = new Tooth();
- Mouth mouth = new Mouth();
- s.persist( mouth );
- s.persist( tooth );
- tooth.mouth = mouth;
- mouth.teeth = new ArrayList<Tooth>();
- mouth.teeth.add( tooth );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- tooth = (Tooth) s.get( Tooth.class, tooth.id );
- assertNotNull( tooth );
- s.delete( tooth.mouth );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- tooth = (Tooth) s.get( Tooth.class, tooth.id );
- assertNull( tooth );
- tx.commit();
- s.close();
- }
-
- public CascadeTest(String x) {
- super( x );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Mouth.class,
- Tooth.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/CascadeTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/CascadeTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/CascadeTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/CascadeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,115 @@
+//$Id$
+package org.hibernate.test.annotations.cascade;
+
+import java.util.ArrayList;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * Check some of the individual cascade styles
+ *
+ * @author Emmanuel Bernard
+ */
+//FIXME do somthing for refresh
+public class CascadeTest extends TestCase {
+ public void testPersist() {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ Tooth tooth = new Tooth();
+ Tooth leftTooth = new Tooth();
+ tooth.leftNeighbour = leftTooth;
+ s.persist( tooth );
+ tx = s.beginTransaction();
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ leftTooth = (Tooth) s.get( Tooth.class, leftTooth.id );
+ assertNotNull( leftTooth );
+ tx.commit();
+ s.close();
+ }
+
+ public void testMerge() {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ Tooth tooth = new Tooth();
+ Tooth rightTooth = new Tooth();
+ tooth.type = "canine";
+ tooth.rightNeighbour = rightTooth;
+ rightTooth.type = "incisive";
+ s.persist( rightTooth );
+ s.persist( tooth );
+ tx = s.beginTransaction();
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ tooth = (Tooth) s.get( Tooth.class, tooth.id );
+ assertEquals( "incisive", tooth.rightNeighbour.type );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ tooth.rightNeighbour.type = "premolars";
+ s.merge( tooth );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ rightTooth = (Tooth) s.get( Tooth.class, rightTooth.id );
+ assertEquals( "premolars", rightTooth.type );
+ tx.commit();
+ s.close();
+ }
+
+ public void testRemove() {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Tooth tooth = new Tooth();
+ Mouth mouth = new Mouth();
+ s.persist( mouth );
+ s.persist( tooth );
+ tooth.mouth = mouth;
+ mouth.teeth = new ArrayList<Tooth>();
+ mouth.teeth.add( tooth );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ tooth = (Tooth) s.get( Tooth.class, tooth.id );
+ assertNotNull( tooth );
+ s.delete( tooth.mouth );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ tooth = (Tooth) s.get( Tooth.class, tooth.id );
+ assertNull( tooth );
+ tx.commit();
+ s.close();
+ }
+
+ public CascadeTest(String x) {
+ super( x );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Mouth.class,
+ Tooth.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Mouth.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Mouth.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Mouth.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.cascade;
-
-import java.util.Collection;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Mouth {
- @Id
- @GeneratedValue
- public Integer id;
- public int size;
- @OneToMany(mappedBy = "mouth", cascade = CascadeType.REMOVE)
- public Collection<Tooth> teeth;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Mouth.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Mouth.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Mouth.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Mouth.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.test.annotations.cascade;
+
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Mouth {
+ @Id
+ @GeneratedValue
+ public Integer id;
+ public int size;
+ @OneToMany(mappedBy = "mouth", cascade = CascadeType.REMOVE)
+ public Collection<Tooth> teeth;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Tooth.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Tooth.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Tooth.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.cascade;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Tooth {
- @Id
- @GeneratedValue
- public Integer id;
- public String type;
- @ManyToOne(cascade = CascadeType.PERSIST)
- public Tooth leftNeighbour;
- @ManyToOne(cascade = CascadeType.MERGE)
- public Tooth rightNeighbour;
- @ManyToOne
- public Mouth mouth;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Tooth.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Tooth.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Tooth.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cascade/Tooth.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id$
+package org.hibernate.test.annotations.cascade;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Tooth {
+ @Id
+ @GeneratedValue
+ public Integer id;
+ public String type;
+ @ManyToOne(cascade = CascadeType.PERSIST)
+ public Tooth leftNeighbour;
+ @ManyToOne(cascade = CascadeType.MERGE)
+ public Tooth rightNeighbour;
+ @ManyToOne
+ public Mouth mouth;
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Channel.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Channel.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Channel.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.cid;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Channel {
- @Id
- @GeneratedValue
- public Integer id;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Channel.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Channel.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Channel.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Channel.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Channel {
+ @Id
+ @GeneratedValue
+ public Integer id;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Child.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Child.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Child.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.cid;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-
-/**
- * Entity having a many to one in its pk
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Child {
- @EmbeddedId
- @AttributeOverride(name = "nthChild", column = @Column(name = "nth"))
- public ChildPk id;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Child.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Child.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Child.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Child.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+/**
+ * Entity having a many to one in its pk
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Child {
+ @EmbeddedId
+ @AttributeOverride(name = "nthChild", column = @Column(name = "nth"))
+ public ChildPk id;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ChildPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ChildPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ChildPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.cid;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.ManyToOne;
-
-/**
- * Child Pk with many to one inside
- *
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class ChildPk implements Serializable {
- public int nthChild;
- @ManyToOne()
- @JoinColumns({
- @JoinColumn(name = "parentLastName", referencedColumnName = "p_lname"),
- @JoinColumn(name = "parentFirstName", referencedColumnName = "firstName")
- })
- public Parent parent;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof ChildPk ) ) return false;
-
- final ChildPk childPk = (ChildPk) o;
-
- if ( nthChild != childPk.nthChild ) return false;
- if ( !parent.equals( childPk.parent ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = nthChild;
- result = 29 * result + parent.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ChildPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ChildPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ChildPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ChildPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id$
+package org.hibernate.test.annotations.cid;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+
+/**
+ * Child Pk with many to one inside
+ *
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class ChildPk implements Serializable {
+ public int nthChild;
+ @ManyToOne()
+ @JoinColumns({
+ @JoinColumn(name = "parentLastName", referencedColumnName = "p_lname"),
+ @JoinColumn(name = "parentFirstName", referencedColumnName = "firstName")
+ })
+ public Parent parent;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof ChildPk ) ) return false;
+
+ final ChildPk childPk = (ChildPk) o;
+
+ if ( nthChild != childPk.nthChild ) return false;
+ if ( !parent.equals( childPk.parent ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = nthChild;
+ result = 29 * result + parent.hashCode();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,139 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.cid;
-
-import java.util.Date;
-import java.util.List;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.test.annotations.cid.OrderLine;
-import org.hibernate.test.annotations.cid.Order;
-import org.hibernate.test.annotations.cid.Product;
-import org.hibernate.test.annotations.cid.OrderLinePk;
-
-/**
- * test some composite id functionalities
- *
- * @author Emmanuel Bernard
- */
-public class CompositeIdTest extends TestCase {
- public CompositeIdTest(String x) {
- super( x );
- }
-
- /**
- * This feature is not supported by the EJB3
- * this is an hibernate extension
- */
- public void testManyToOneInCompositePk() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- ParentPk ppk = new ParentPk();
- ppk.setFirstName( "Emmanuel" );
- ppk.setLastName( "Bernard" );
- Parent p = new Parent();
- p.id = ppk;
- s.persist( p );
- ChildPk cpk = new ChildPk();
- cpk.parent = p;
- cpk.nthChild = 1;
- Child c = new Child();
- c.id = cpk;
- s.persist( c );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.createQuery( "select c from Child c where c.id.nthChild = :nth" );
- q.setInteger( "nth", 1 );
- List results = q.list();
- assertEquals( 1, results.size() );
- c = (Child) results.get( 0 );
- assertNotNull( c );
- assertNotNull( c.id.parent );
- //FIXME mke it work in unambigious cases
-// assertNotNull(c.id.parent.id);
-// assertEquals(p.id.getFirstName(), c.id.parent.id.getFirstName());
- tx.commit();
- s.close();
- }
-
- public void testManyToOneInCompositeId() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Channel channel = new Channel();
- s.persist( channel );
- Presenter pres = new Presenter();
- pres.name = "Casimir";
- s.persist( pres );
- TvMagazinPk pk = new TvMagazinPk();
- TvMagazin mag = new TvMagazin();
- mag.time = new Date();
- mag.id = pk;
- //pk.name = "Trax";
- pk.channel = channel;
- pk.presenter = pres;
- s.persist( mag );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- mag = (TvMagazin) s.createQuery( "from TvMagazin mag" ) // where mag.id.name = :name")
- //.setParameter( "name", "Trax" )
- .uniqueResult();
- assertNotNull( mag.id );
- assertNotNull( mag.id.channel );
- assertEquals( channel.id, mag.id.channel.id );
- assertNotNull( mag.id.presenter );
- assertEquals( pres.name, mag.id.presenter.name );
- s.delete( mag );
- s.delete( mag.id.channel );
- s.delete( mag.id.presenter );
- tx.commit();
- s.close();
- }
-
- public void testManyToOneInCompositeIdClass() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Order order = new Order();
- s.persist( order );
- Product product = new Product();
- product.name = "small car";
- s.persist( product );
- OrderLinePk pk = new OrderLinePk();
- OrderLine orderLine = new OrderLine();
- orderLine.order = order;
- orderLine.product = product;
- s.persist(orderLine);
- s.flush();
- s.clear();
-
- orderLine = (OrderLine) s.createQuery( "select ol from OrderLine ol" ).uniqueResult();
- assertNotNull( orderLine.order );
- assertEquals( order.id, orderLine.order.id );
- assertNotNull( orderLine.product );
- assertEquals( product.name, orderLine.product.name );
-
- tx.rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Parent.class,
- Child.class,
- Channel.class,
- TvMagazin.class,
- Presenter.class,
- Order.class,
- Product.class,
- OrderLine.class,
- OrderLinePk.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/CompositeIdTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,139 @@
+//$Id$
+package org.hibernate.test.annotations.cid;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.cid.OrderLine;
+import org.hibernate.test.annotations.cid.Order;
+import org.hibernate.test.annotations.cid.Product;
+import org.hibernate.test.annotations.cid.OrderLinePk;
+
+/**
+ * test some composite id functionalities
+ *
+ * @author Emmanuel Bernard
+ */
+public class CompositeIdTest extends TestCase {
+ public CompositeIdTest(String x) {
+ super( x );
+ }
+
+ /**
+ * This feature is not supported by the EJB3
+ * this is an hibernate extension
+ */
+ public void testManyToOneInCompositePk() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ ParentPk ppk = new ParentPk();
+ ppk.setFirstName( "Emmanuel" );
+ ppk.setLastName( "Bernard" );
+ Parent p = new Parent();
+ p.id = ppk;
+ s.persist( p );
+ ChildPk cpk = new ChildPk();
+ cpk.parent = p;
+ cpk.nthChild = 1;
+ Child c = new Child();
+ c.id = cpk;
+ s.persist( c );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.createQuery( "select c from Child c where c.id.nthChild = :nth" );
+ q.setInteger( "nth", 1 );
+ List results = q.list();
+ assertEquals( 1, results.size() );
+ c = (Child) results.get( 0 );
+ assertNotNull( c );
+ assertNotNull( c.id.parent );
+ //FIXME mke it work in unambigious cases
+// assertNotNull(c.id.parent.id);
+// assertEquals(p.id.getFirstName(), c.id.parent.id.getFirstName());
+ tx.commit();
+ s.close();
+ }
+
+ public void testManyToOneInCompositeId() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Channel channel = new Channel();
+ s.persist( channel );
+ Presenter pres = new Presenter();
+ pres.name = "Casimir";
+ s.persist( pres );
+ TvMagazinPk pk = new TvMagazinPk();
+ TvMagazin mag = new TvMagazin();
+ mag.time = new Date();
+ mag.id = pk;
+ //pk.name = "Trax";
+ pk.channel = channel;
+ pk.presenter = pres;
+ s.persist( mag );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ mag = (TvMagazin) s.createQuery( "from TvMagazin mag" ) // where mag.id.name = :name")
+ //.setParameter( "name", "Trax" )
+ .uniqueResult();
+ assertNotNull( mag.id );
+ assertNotNull( mag.id.channel );
+ assertEquals( channel.id, mag.id.channel.id );
+ assertNotNull( mag.id.presenter );
+ assertEquals( pres.name, mag.id.presenter.name );
+ s.delete( mag );
+ s.delete( mag.id.channel );
+ s.delete( mag.id.presenter );
+ tx.commit();
+ s.close();
+ }
+
+ public void testManyToOneInCompositeIdClass() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Order order = new Order();
+ s.persist( order );
+ Product product = new Product();
+ product.name = "small car";
+ s.persist( product );
+ OrderLinePk pk = new OrderLinePk();
+ OrderLine orderLine = new OrderLine();
+ orderLine.order = order;
+ orderLine.product = product;
+ s.persist(orderLine);
+ s.flush();
+ s.clear();
+
+ orderLine = (OrderLine) s.createQuery( "select ol from OrderLine ol" ).uniqueResult();
+ assertNotNull( orderLine.order );
+ assertEquals( order.id, orderLine.order.id );
+ assertNotNull( orderLine.product );
+ assertEquals( product.name, orderLine.product.name );
+
+ tx.rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Parent.class,
+ Child.class,
+ Channel.class,
+ TvMagazin.class,
+ Presenter.class,
+ Order.class,
+ Product.class,
+ OrderLine.class,
+ OrderLinePk.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Order.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Order.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Order.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-package org.hibernate.test.annotations.cid;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "OrderTableFoobar")
-public class Order {
- @Id
- @GeneratedValue
- public Integer id;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Order.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Order.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Order.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Order.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "OrderTableFoobar")
+public class Order {
+ @Id
+ @GeneratedValue
+ public Integer id;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLine.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLine.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-package org.hibernate.test.annotations.cid;
-
-import javax.persistence.Entity;
-import javax.persistence.IdClass;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at IdClass(OrderLinePk.class)
-public class OrderLine {
- @Id
- public Order order;
- @Id
- public Product product;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLine.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLine.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLine.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.IdClass;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(OrderLinePk.class)
+public class OrderLine {
+ @Id
+ public Order order;
+ @Id
+ public Product product;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLinePk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLinePk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLinePk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-package org.hibernate.test.annotations.cid;
-
-
-import javax.persistence.ManyToOne;
-import javax.persistence.JoinColumn;
-import java.io.Serializable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class OrderLinePk implements Serializable {
- @ManyToOne
- @JoinColumn(name = "foo", nullable = false)
- public Order order;
- @ManyToOne
- @JoinColumn(name = "bar", nullable = false)
- public Product product;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLinePk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLinePk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLinePk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/OrderLinePk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+package org.hibernate.test.annotations.cid;
+
+
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OrderLinePk implements Serializable {
+ @ManyToOne
+ @JoinColumn(name = "foo", nullable = false)
+ public Order order;
+ @ManyToOne
+ @JoinColumn(name = "bar", nullable = false)
+ public Product product;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Parent.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Parent.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.cid;
-
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-
-/**
- * Entity with composite id
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Parent {
- @EmbeddedId
- public ParentPk id;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Parent ) ) return false;
-
- final Parent parent = (Parent) o;
-
- if ( !id.equals( parent.id ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return id.hashCode();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Parent.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Parent.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Parent.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+/**
+ * Entity with composite id
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Parent {
+ @EmbeddedId
+ public ParentPk id;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Parent ) ) return false;
+
+ final Parent parent = (Parent) o;
+
+ if ( !id.equals( parent.id ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return id.hashCode();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ParentPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ParentPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ParentPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.cid;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-
-/**
- * @author Emmanuel Bernard
- */
-
-public class ParentPk implements Serializable {
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
-
- private String firstName;
- @Column(name = "p_lname")
- private String lastName;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof ParentPk ) ) return false;
-
- final ParentPk parentPk = (ParentPk) o;
-
- if ( !firstName.equals( parentPk.firstName ) ) return false;
- if ( !lastName.equals( parentPk.lastName ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = firstName.hashCode();
- result = 29 * result + lastName.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ParentPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ParentPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ParentPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/ParentPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+//$Id$
+package org.hibernate.test.annotations.cid;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+public class ParentPk implements Serializable {
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+
+ private String firstName;
+ @Column(name = "p_lname")
+ private String lastName;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof ParentPk ) ) return false;
+
+ final ParentPk parentPk = (ParentPk) o;
+
+ if ( !firstName.equals( parentPk.firstName ) ) return false;
+ if ( !lastName.equals( parentPk.lastName ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = firstName.hashCode();
+ result = 29 * result + lastName.hashCode();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Presenter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Presenter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Presenter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.cid;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Presenter {
- @Id
- public String name;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Presenter.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Presenter.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Presenter.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Presenter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id: $
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Presenter {
+ @Id
+ public String name;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Product.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Product.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Product.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-package org.hibernate.test.annotations.cid;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Product {
- @Id
- public String name;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Product.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Product.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Product.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/Product.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+package org.hibernate.test.annotations.cid;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Product {
+ @Id
+ public String name;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazin.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazin.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazin.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.cid;
-
-import java.util.Date;
-import javax.persistence.AssociationOverride;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at AssociationOverride(name = "id.channel", joinColumns = @JoinColumn(name = "chan_id"))
-public class TvMagazin {
- @EmbeddedId
- public TvMagazinPk id;
- @Temporal(TemporalType.TIME)
- Date time;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazin.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazin.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazin.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazin.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.test.annotations.cid;
+
+import java.util.Date;
+import javax.persistence.AssociationOverride;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AssociationOverride(name = "id.channel", joinColumns = @JoinColumn(name = "chan_id"))
+public class TvMagazin {
+ @EmbeddedId
+ public TvMagazinPk id;
+ @Temporal(TemporalType.TIME)
+ Date time;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.cid;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class TvMagazinPk implements Serializable {
- @ManyToOne
- public Channel channel;
- //public String name;
- @ManyToOne
- public Presenter presenter;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/cid/TvMagazinPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.test.annotations.cid;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class TvMagazinPk implements Serializable {
+ @ManyToOne
+ public Channel channel;
+ //public String name;
+ @ManyToOne
+ public Presenter presenter;
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Boy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Boy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Boy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,134 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.collectionelement;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-
-import org.hibernate.annotations.CollectionOfElements;
-import org.hibernate.annotations.IndexColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at AttributeOverrides({
- @AttributeOverride( name="characters.element", column = @Column(name="fld_character") ),
- @AttributeOverride( name="scorePerNickName.element", column = @Column(name="fld_score") ),
- @AttributeOverride( name="favoriteToys.element.brand.surname", column = @Column(name = "fld_surname"))}
-)
-public class Boy {
- private Integer id;
- private String firstName;
- private String lastName;
- private Set<String> nickNames = new HashSet<String>();
- private Map<String, Integer> scorePerNickName = new HashMap<String, Integer>();
- private int[] favoriteNumbers;
- private Set<Toy> favoriteToys = new HashSet<Toy>();
- private Set<Character> characters = new HashSet<Character>();
- private Set<CountryAttitude> countryAttitudes = new HashSet<CountryAttitude>();
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- @CollectionOfElements
- public Set<String> getNickNames() {
- return nickNames;
- }
-
- public void setNickNames(Set<String> nickName) {
- this.nickNames = nickName;
- }
-
- @CollectionOfElements
- @JoinTable(name = "ScorePerNickName", joinColumns = @JoinColumn(name = "BoyId"))
- @Column(name = "score", nullable = false)
- public Map<String, Integer> getScorePerNickName() {
- return scorePerNickName;
- }
-
- public void setScorePerNickName(Map<String, Integer> scorePerNickName) {
- this.scorePerNickName = scorePerNickName;
- }
-
- @CollectionOfElements
- @JoinTable(
- name = "BoyFavoriteNumbers",
- joinColumns = @JoinColumn(name = "BoyId")
- )
- @Column(name = "favoriteNumber", nullable = false)
- @IndexColumn(name = "nbr_index")
- public int[] getFavoriteNumbers() {
- return favoriteNumbers;
- }
-
- public void setFavoriteNumbers(int[] favoriteNumbers) {
- this.favoriteNumbers = favoriteNumbers;
- }
-
- @CollectionOfElements
- @AttributeOverride(name = "element.serial", column = @Column(name = "serial_nbr"))
- public Set<Toy> getFavoriteToys() {
- return favoriteToys;
- }
-
- public void setFavoriteToys(Set<Toy> favoriteToys) {
- this.favoriteToys = favoriteToys;
- }
-
- @CollectionOfElements
- @Enumerated(EnumType.STRING)
- public Set<Character> getCharacters() {
- return characters;
- }
-
- public void setCharacters(Set<Character> characters) {
- this.characters = characters;
- }
-
- @CollectionOfElements(fetch = FetchType.EAGER)
- //@Where(clause = "b_likes=false")
- public Set<CountryAttitude> getCountryAttitudes() {
- return countryAttitudes;
- }
-
- public void setCountryAttitudes(Set<CountryAttitude> countryAttitudes) {
- this.countryAttitudes = countryAttitudes;
- }
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Boy.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Boy.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Boy.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Boy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,134 @@
+//$Id$
+package org.hibernate.test.annotations.collectionelement;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.IndexColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AttributeOverrides({
+ @AttributeOverride( name="characters.element", column = @Column(name="fld_character") ),
+ @AttributeOverride( name="scorePerNickName.element", column = @Column(name="fld_score") ),
+ @AttributeOverride( name="favoriteToys.element.brand.surname", column = @Column(name = "fld_surname"))}
+)
+public class Boy {
+ private Integer id;
+ private String firstName;
+ private String lastName;
+ private Set<String> nickNames = new HashSet<String>();
+ private Map<String, Integer> scorePerNickName = new HashMap<String, Integer>();
+ private int[] favoriteNumbers;
+ private Set<Toy> favoriteToys = new HashSet<Toy>();
+ private Set<Character> characters = new HashSet<Character>();
+ private Set<CountryAttitude> countryAttitudes = new HashSet<CountryAttitude>();
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ @CollectionOfElements
+ public Set<String> getNickNames() {
+ return nickNames;
+ }
+
+ public void setNickNames(Set<String> nickName) {
+ this.nickNames = nickName;
+ }
+
+ @CollectionOfElements
+ @JoinTable(name = "ScorePerNickName", joinColumns = @JoinColumn(name = "BoyId"))
+ @Column(name = "score", nullable = false)
+ public Map<String, Integer> getScorePerNickName() {
+ return scorePerNickName;
+ }
+
+ public void setScorePerNickName(Map<String, Integer> scorePerNickName) {
+ this.scorePerNickName = scorePerNickName;
+ }
+
+ @CollectionOfElements
+ @JoinTable(
+ name = "BoyFavoriteNumbers",
+ joinColumns = @JoinColumn(name = "BoyId")
+ )
+ @Column(name = "favoriteNumber", nullable = false)
+ @IndexColumn(name = "nbr_index")
+ public int[] getFavoriteNumbers() {
+ return favoriteNumbers;
+ }
+
+ public void setFavoriteNumbers(int[] favoriteNumbers) {
+ this.favoriteNumbers = favoriteNumbers;
+ }
+
+ @CollectionOfElements
+ @AttributeOverride(name = "element.serial", column = @Column(name = "serial_nbr"))
+ public Set<Toy> getFavoriteToys() {
+ return favoriteToys;
+ }
+
+ public void setFavoriteToys(Set<Toy> favoriteToys) {
+ this.favoriteToys = favoriteToys;
+ }
+
+ @CollectionOfElements
+ @Enumerated(EnumType.STRING)
+ public Set<Character> getCharacters() {
+ return characters;
+ }
+
+ public void setCharacters(Set<Character> characters) {
+ this.characters = characters;
+ }
+
+ @CollectionOfElements(fetch = FetchType.EAGER)
+ //@Where(clause = "b_likes=false")
+ public Set<CountryAttitude> getCountryAttitudes() {
+ return countryAttitudes;
+ }
+
+ public void setCountryAttitudes(Set<CountryAttitude> countryAttitudes) {
+ this.countryAttitudes = countryAttitudes;
+ }
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Brand.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Brand.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Brand.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.collectionelement;
-
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class Brand {
- private String name;
- private String surname;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getSurname() {
- return surname;
- }
-
- public void setSurname(String surname) {
- this.surname = surname;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final Brand brand = (Brand) o;
-
- if ( !name.equals( brand.name ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return name.hashCode();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Brand.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Brand.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Brand.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Brand.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id$
+package org.hibernate.test.annotations.collectionelement;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Brand {
+ private String name;
+ private String surname;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSurname() {
+ return surname;
+ }
+
+ public void setSurname(String surname) {
+ this.surname = surname;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final Brand brand = (Brand) o;
+
+ if ( !name.equals( brand.name ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Character.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Character.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Character.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-package org.hibernate.test.annotations.collectionelement;
-
-/**
- * @author Emmanuel Bernard
- */
-public enum Character {
- GENTLE,
- NORMAL,
- AGGRESSIVE,
- ATTENTIVE,
- VIOLENT,
- CRAFTY
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Character.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Character.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Character.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Character.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+package org.hibernate.test.annotations.collectionelement;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum Character {
+ GENTLE,
+ NORMAL,
+ AGGRESSIVE,
+ ATTENTIVE,
+ VIOLENT,
+ CRAFTY
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,164 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.collectionelement;
-
-import java.util.List;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.Country;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CollectionElementTest extends TestCase {
-
- public void testSimpleElement() throws Exception {
- assertEquals(
- "BoyFavoriteNumbers",
- getCfg().getCollectionMapping( Boy.class.getName() + '.' + "favoriteNumbers" )
- .getCollectionTable().getName()
- );
- Session s = openSession();
- s.getTransaction().begin();
- Boy boy = new Boy();
- boy.setFirstName( "John" );
- boy.setLastName( "Doe" );
- boy.getNickNames().add( "Johnny" );
- boy.getNickNames().add( "Thing" );
- boy.getScorePerNickName().put( "Johnny", new Integer( 3 ) );
- boy.getScorePerNickName().put( "Thing", new Integer( 5 ) );
- int[] favNbrs = new int[4];
- for ( int index = 0; index < favNbrs.length - 1; index++ ) {
- favNbrs[index] = index * 3;
- }
- boy.setFavoriteNumbers( favNbrs );
- boy.getCharacters().add( Character.GENTLE );
- boy.getCharacters().add( Character.CRAFTY );
- s.persist( boy );
- s.getTransaction().commit();
- s.clear();
- Transaction tx = s.beginTransaction();
- boy = (Boy) s.get( Boy.class, boy.getId() );
- assertNotNull( boy.getNickNames() );
- assertTrue( boy.getNickNames().contains( "Thing" ) );
- assertNotNull( boy.getScorePerNickName() );
- assertTrue( boy.getScorePerNickName().containsKey( "Thing" ) );
- assertEquals( new Integer( 5 ), boy.getScorePerNickName().get( "Thing" ) );
- assertNotNull( boy.getFavoriteNumbers() );
- assertEquals( 3, boy.getFavoriteNumbers()[1] );
- assertTrue( boy.getCharacters().contains( Character.CRAFTY ) );
- List result = s.createQuery( "select boy from Boy boy join boy.nickNames names where names = :name" )
- .setParameter( "name", "Thing" ).list();
- assertEquals( 1, result.size() );
- s.delete( boy );
- tx.commit();
- s.close();
- }
-
- public void testCompositeElement() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Boy boy = new Boy();
- boy.setFirstName( "John" );
- boy.setLastName( "Doe" );
- Toy toy = new Toy();
- toy.setName( "Balloon" );
- toy.setSerial( "serial001" );
- toy.setBrand( new Brand() );
- toy.getBrand().setName( "Bandai" );
- boy.getFavoriteToys().add( toy );
- s.persist( boy );
- s.getTransaction().commit();
- s.clear();
- Transaction tx = s.beginTransaction();
- boy = (Boy) s.get( Boy.class, boy.getId() );
- assertNotNull( boy.getFavoriteToys() );
- assertTrue( boy.getFavoriteToys().contains( toy ) );
- assertEquals( "@Parent is failing", boy, boy.getFavoriteToys().iterator().next().getOwner() );
- s.delete( boy );
- tx.commit();
- s.close();
- }
-
- public void testAttributedJoin() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Country country = new Country();
- country.setName( "Australia" );
- s.persist( country );
-
- Boy boy = new Boy();
- boy.setFirstName( "John" );
- boy.setLastName( "Doe" );
- CountryAttitude attitude = new CountryAttitude();
- // TODO: doesn't work
- attitude.setBoy( boy );
- attitude.setCountry( country );
- attitude.setLikes( true );
- boy.getCountryAttitudes().add( attitude );
- s.persist( boy );
- s.getTransaction().commit();
- s.clear();
-
- Transaction tx = s.beginTransaction();
- boy = (Boy) s.get( Boy.class, boy.getId() );
- assertTrue( boy.getCountryAttitudes().contains( attitude ) );
- s.delete( boy );
- s.delete( s.get( Country.class, country.getId() ) );
- tx.commit();
- s.close();
-
- }
-
- public void testLazyCollectionofElements() throws Exception {
- assertEquals(
- "BoyFavoriteNumbers",
- getCfg().getCollectionMapping( Boy.class.getName() + '.' + "favoriteNumbers" )
- .getCollectionTable().getName()
- );
- Session s = openSession();
- s.getTransaction().begin();
- Boy boy = new Boy();
- boy.setFirstName( "John" );
- boy.setLastName( "Doe" );
- boy.getNickNames().add( "Johnny" );
- boy.getNickNames().add( "Thing" );
- boy.getScorePerNickName().put( "Johnny", new Integer( 3 ) );
- boy.getScorePerNickName().put( "Thing", new Integer( 5 ) );
- int[] favNbrs = new int[4];
- for ( int index = 0; index < favNbrs.length - 1; index++ ) {
- favNbrs[index] = index * 3;
- }
- boy.setFavoriteNumbers( favNbrs );
- boy.getCharacters().add( Character.GENTLE );
- boy.getCharacters().add( Character.CRAFTY );
- s.persist( boy );
- s.getTransaction().commit();
- s.clear();
- Transaction tx = s.beginTransaction();
- boy = (Boy) s.get( Boy.class, boy.getId() );
- assertNotNull( boy.getNickNames() );
- assertTrue( boy.getNickNames().contains( "Thing" ) );
- assertNotNull( boy.getScorePerNickName() );
- assertTrue( boy.getScorePerNickName().containsKey( "Thing" ) );
- assertEquals( new Integer( 5 ), boy.getScorePerNickName().get( "Thing" ) );
- assertNotNull( boy.getFavoriteNumbers() );
- assertEquals( 3, boy.getFavoriteNumbers()[1] );
- assertTrue( boy.getCharacters().contains( Character.CRAFTY ) );
- List result = s.createQuery( "select boy from Boy boy join boy.nickNames names where names = :name" )
- .setParameter( "name", "Thing" ).list();
- assertEquals( 1, result.size() );
- s.delete( boy );
- tx.commit();
- s.close();
- }
-
-
- protected Class[] getMappings() {
- return new Class[]{
- Boy.class,
- Country.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CollectionElementTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,164 @@
+//$Id$
+package org.hibernate.test.annotations.collectionelement;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.Country;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CollectionElementTest extends TestCase {
+
+ public void testSimpleElement() throws Exception {
+ assertEquals(
+ "BoyFavoriteNumbers",
+ getCfg().getCollectionMapping( Boy.class.getName() + '.' + "favoriteNumbers" )
+ .getCollectionTable().getName()
+ );
+ Session s = openSession();
+ s.getTransaction().begin();
+ Boy boy = new Boy();
+ boy.setFirstName( "John" );
+ boy.setLastName( "Doe" );
+ boy.getNickNames().add( "Johnny" );
+ boy.getNickNames().add( "Thing" );
+ boy.getScorePerNickName().put( "Johnny", new Integer( 3 ) );
+ boy.getScorePerNickName().put( "Thing", new Integer( 5 ) );
+ int[] favNbrs = new int[4];
+ for ( int index = 0; index < favNbrs.length - 1; index++ ) {
+ favNbrs[index] = index * 3;
+ }
+ boy.setFavoriteNumbers( favNbrs );
+ boy.getCharacters().add( Character.GENTLE );
+ boy.getCharacters().add( Character.CRAFTY );
+ s.persist( boy );
+ s.getTransaction().commit();
+ s.clear();
+ Transaction tx = s.beginTransaction();
+ boy = (Boy) s.get( Boy.class, boy.getId() );
+ assertNotNull( boy.getNickNames() );
+ assertTrue( boy.getNickNames().contains( "Thing" ) );
+ assertNotNull( boy.getScorePerNickName() );
+ assertTrue( boy.getScorePerNickName().containsKey( "Thing" ) );
+ assertEquals( new Integer( 5 ), boy.getScorePerNickName().get( "Thing" ) );
+ assertNotNull( boy.getFavoriteNumbers() );
+ assertEquals( 3, boy.getFavoriteNumbers()[1] );
+ assertTrue( boy.getCharacters().contains( Character.CRAFTY ) );
+ List result = s.createQuery( "select boy from Boy boy join boy.nickNames names where names = :name" )
+ .setParameter( "name", "Thing" ).list();
+ assertEquals( 1, result.size() );
+ s.delete( boy );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCompositeElement() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Boy boy = new Boy();
+ boy.setFirstName( "John" );
+ boy.setLastName( "Doe" );
+ Toy toy = new Toy();
+ toy.setName( "Balloon" );
+ toy.setSerial( "serial001" );
+ toy.setBrand( new Brand() );
+ toy.getBrand().setName( "Bandai" );
+ boy.getFavoriteToys().add( toy );
+ s.persist( boy );
+ s.getTransaction().commit();
+ s.clear();
+ Transaction tx = s.beginTransaction();
+ boy = (Boy) s.get( Boy.class, boy.getId() );
+ assertNotNull( boy.getFavoriteToys() );
+ assertTrue( boy.getFavoriteToys().contains( toy ) );
+ assertEquals( "@Parent is failing", boy, boy.getFavoriteToys().iterator().next().getOwner() );
+ s.delete( boy );
+ tx.commit();
+ s.close();
+ }
+
+ public void testAttributedJoin() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Country country = new Country();
+ country.setName( "Australia" );
+ s.persist( country );
+
+ Boy boy = new Boy();
+ boy.setFirstName( "John" );
+ boy.setLastName( "Doe" );
+ CountryAttitude attitude = new CountryAttitude();
+ // TODO: doesn't work
+ attitude.setBoy( boy );
+ attitude.setCountry( country );
+ attitude.setLikes( true );
+ boy.getCountryAttitudes().add( attitude );
+ s.persist( boy );
+ s.getTransaction().commit();
+ s.clear();
+
+ Transaction tx = s.beginTransaction();
+ boy = (Boy) s.get( Boy.class, boy.getId() );
+ assertTrue( boy.getCountryAttitudes().contains( attitude ) );
+ s.delete( boy );
+ s.delete( s.get( Country.class, country.getId() ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testLazyCollectionofElements() throws Exception {
+ assertEquals(
+ "BoyFavoriteNumbers",
+ getCfg().getCollectionMapping( Boy.class.getName() + '.' + "favoriteNumbers" )
+ .getCollectionTable().getName()
+ );
+ Session s = openSession();
+ s.getTransaction().begin();
+ Boy boy = new Boy();
+ boy.setFirstName( "John" );
+ boy.setLastName( "Doe" );
+ boy.getNickNames().add( "Johnny" );
+ boy.getNickNames().add( "Thing" );
+ boy.getScorePerNickName().put( "Johnny", new Integer( 3 ) );
+ boy.getScorePerNickName().put( "Thing", new Integer( 5 ) );
+ int[] favNbrs = new int[4];
+ for ( int index = 0; index < favNbrs.length - 1; index++ ) {
+ favNbrs[index] = index * 3;
+ }
+ boy.setFavoriteNumbers( favNbrs );
+ boy.getCharacters().add( Character.GENTLE );
+ boy.getCharacters().add( Character.CRAFTY );
+ s.persist( boy );
+ s.getTransaction().commit();
+ s.clear();
+ Transaction tx = s.beginTransaction();
+ boy = (Boy) s.get( Boy.class, boy.getId() );
+ assertNotNull( boy.getNickNames() );
+ assertTrue( boy.getNickNames().contains( "Thing" ) );
+ assertNotNull( boy.getScorePerNickName() );
+ assertTrue( boy.getScorePerNickName().containsKey( "Thing" ) );
+ assertEquals( new Integer( 5 ), boy.getScorePerNickName().get( "Thing" ) );
+ assertNotNull( boy.getFavoriteNumbers() );
+ assertEquals( 3, boy.getFavoriteNumbers()[1] );
+ assertTrue( boy.getCharacters().contains( Character.CRAFTY ) );
+ List result = s.createQuery( "select boy from Boy boy join boy.nickNames names where names = :name" )
+ .setParameter( "name", "Thing" ).list();
+ assertEquals( 1, result.size() );
+ s.delete( boy );
+ tx.commit();
+ s.close();
+ }
+
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Boy.class,
+ Country.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CountryAttitude.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CountryAttitude.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CountryAttitude.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,59 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.collectionelement;
-
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.ManyToOne;
-
-import org.hibernate.test.annotations.Country;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class CountryAttitude {
- private Boy boy;
- private Country country;
- private boolean likes;
-
- // TODO: This currently does not work
- //@ManyToOne(optional = false)
-// public Boy getBoy() {
-// return boy;
-// }
-
- public void setBoy(Boy boy) {
- this.boy = boy;
- }
-
- @ManyToOne(optional = false)
- public Country getCountry() {
- return country;
- }
-
- public void setCountry(Country country) {
- this.country = country;
- }
-
- @Column(name = "b_likes")
- public boolean isLikes() {
- return likes;
- }
-
- public void setLikes(boolean likes) {
- this.likes = likes;
- }
-
- @Override
- public int hashCode() {
- return country.hashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- if ( !( obj instanceof CountryAttitude ) ) {
- return false;
- }
- return country.equals( ( (CountryAttitude) obj ).country );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CountryAttitude.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CountryAttitude.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CountryAttitude.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/CountryAttitude.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,59 @@
+//$Id$
+package org.hibernate.test.annotations.collectionelement;
+
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.test.annotations.Country;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class CountryAttitude {
+ private Boy boy;
+ private Country country;
+ private boolean likes;
+
+ // TODO: This currently does not work
+ //@ManyToOne(optional = false)
+// public Boy getBoy() {
+// return boy;
+// }
+
+ public void setBoy(Boy boy) {
+ this.boy = boy;
+ }
+
+ @ManyToOne(optional = false)
+ public Country getCountry() {
+ return country;
+ }
+
+ public void setCountry(Country country) {
+ this.country = country;
+ }
+
+ @Column(name = "b_likes")
+ public boolean isLikes() {
+ return likes;
+ }
+
+ public void setLikes(boolean likes) {
+ this.likes = likes;
+ }
+
+ @Override
+ public int hashCode() {
+ return country.hashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if ( !( obj instanceof CountryAttitude ) ) {
+ return false;
+ }
+ return country.equals( ( (CountryAttitude) obj ).country );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Toy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Toy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Toy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,73 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.collectionelement;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-
-import org.hibernate.annotations.Parent;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class Toy {
- private String name;
- private Brand brand;
- private String serial;
- private Boy owner;
-
- @AttributeOverride(name = "name", column = @Column(name = "brand_name"))
- public Brand getBrand() {
- return brand;
- }
-
- public void setBrand(Brand brand) {
- this.brand = brand;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getSerial() {
- return serial;
- }
-
- public void setSerial(String serial) {
- this.serial = serial;
- }
-
- @Parent
- public Boy getOwner() {
- return owner;
- }
-
- public void setOwner(Boy owner) {
- this.owner = owner;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final Toy toy = (Toy) o;
-
- if ( !brand.equals( toy.brand ) ) return false;
- if ( !name.equals( toy.name ) ) return false;
- if ( !serial.equals( toy.serial ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = name.hashCode();
- result = 29 * result + brand.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Toy.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Toy.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Toy.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/collectionelement/Toy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,73 @@
+//$Id$
+package org.hibernate.test.annotations.collectionelement;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+import org.hibernate.annotations.Parent;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Toy {
+ private String name;
+ private Brand brand;
+ private String serial;
+ private Boy owner;
+
+ @AttributeOverride(name = "name", column = @Column(name = "brand_name"))
+ public Brand getBrand() {
+ return brand;
+ }
+
+ public void setBrand(Brand brand) {
+ this.brand = brand;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getSerial() {
+ return serial;
+ }
+
+ public void setSerial(String serial) {
+ this.serial = serial;
+ }
+
+ @Parent
+ public Boy getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Boy owner) {
+ this.owner = owner;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final Toy toy = (Toy) o;
+
+ if ( !brand.equals( toy.brand ) ) return false;
+ if ( !name.equals( toy.name ) ) return false;
+ if ( !serial.equals( toy.serial ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = name.hashCode();
+ result = 29 * result + brand.hashCode();
+ return result;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.duplicatedgenerator;
-
-import junit.framework.TestCase;
-import org.hibernate.AnnotationException;
-import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Environment;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DuplicateTest extends TestCase {
- public void testDuplicateEntityName() throws Exception {
- AnnotationConfiguration cfg = new AnnotationConfiguration();
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- try {
- cfg.addAnnotatedClass( Flight.class );
- cfg.addAnnotatedClass( org.hibernate.test.annotations.Flight.class );
- cfg.addResource( "org/hibernate/test/annotations/orm.xml");
- cfg.addResource( "org/hibernate/test/annotations/duplicatedgenerator/orm.xml");
- cfg.buildSessionFactory();
- fail( "Should not be able to map the same entity name twice" );
- }
- catch (AnnotationException ae) {
- //success
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/DuplicateTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id$
+package org.hibernate.test.annotations.duplicatedgenerator;
+
+import junit.framework.TestCase;
+import org.hibernate.AnnotationException;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Environment;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DuplicateTest extends TestCase {
+ public void testDuplicateEntityName() throws Exception {
+ AnnotationConfiguration cfg = new AnnotationConfiguration();
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ try {
+ cfg.addAnnotatedClass( Flight.class );
+ cfg.addAnnotatedClass( org.hibernate.test.annotations.Flight.class );
+ cfg.addResource( "org/hibernate/test/annotations/orm.xml");
+ cfg.addResource( "org/hibernate/test/annotations/duplicatedgenerator/orm.xml");
+ cfg.buildSessionFactory();
+ fail( "Should not be able to map the same entity name twice" );
+ }
+ catch (AnnotationException ae) {
+ //success
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/Flight.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/Flight.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/Flight.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.duplicatedgenerator;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-/**
- * Here to test duplicate import
- *
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "tbl_flight")
-public class Flight {
- @Id
- public String id;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/Flight.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/Flight.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/Flight.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/Flight.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id$
+package org.hibernate.test.annotations.duplicatedgenerator;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * Here to test duplicate import
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_flight")
+public class Flight {
+ @Id
+ public String id;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/orm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/orm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-<?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"
- version="1.0"
- >
- <table-generator name="EMP_GEN" table="GENERATOR_TABLE"
- pk-column-name="pkey" pk-column-value="EMP"
- value-column-name="hi" allocation-size="20"/>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/orm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/orm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/orm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/duplicatedgenerator/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+<?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"
+ version="1.0"
+ >
+ <table-generator name="EMP_GEN" table="GENERATOR_TABLE"
+ pk-column-name="pkey" pk-column-value="EMP"
+ value-column-name="hi" allocation-size="20"/>
+</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Address.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Address.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class Address implements Serializable {
- String address1;
- @Column(name = "fld_city")
- String city;
- Country country;
- @ManyToOne
- AddressType type;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Address.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Address.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Address.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Address implements Serializable {
+ String address1;
+ @Column(name = "fld_city")
+ String city;
+ Country country;
+ @ManyToOne
+ AddressType type;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/AddressType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/AddressType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/AddressType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * Kind of address (home, professional etc)
- *
- * @author Emmanuel Bernard
- */
- at Entity()
-public class AddressType {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/AddressType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/AddressType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/AddressType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/AddressType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Kind of address (home, professional etc)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class AddressType {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Book.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Book.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Book.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.SecondaryTable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at SecondaryTable(name = "BookSummary")
-public class Book {
- private String isbn;
- private String name;
- private Summary summary;
-
- @Id
- public String getIsbn() {
- return isbn;
- }
-
- public void setIsbn(String isbn) {
- this.isbn = isbn;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @AttributeOverrides({
- @AttributeOverride(name = "size", column = @Column(table = "BookSummary")),
- @AttributeOverride(name = "text", column = @Column(table = "BookSummary"))
- })
- public Summary getSummary() {
- return summary;
- }
-
- public void setSummary(Summary summary) {
- this.summary = summary;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Book.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Book.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Book.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Book.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.SecondaryTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SecondaryTable(name = "BookSummary")
+public class Book {
+ private String isbn;
+ private String name;
+ private Summary summary;
+
+ @Id
+ public String getIsbn() {
+ return isbn;
+ }
+
+ public void setIsbn(String isbn) {
+ this.isbn = isbn;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @AttributeOverrides({
+ @AttributeOverride(name = "size", column = @Column(table = "BookSummary")),
+ @AttributeOverride(name = "text", column = @Column(table = "BookSummary"))
+ })
+ public Summary getSummary() {
+ return summary;
+ }
+
+ public void setSummary(Summary summary) {
+ this.summary = summary;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/CorpType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/CorpType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/CorpType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class CorpType {
- private Integer id;
- private String type;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getType() {
- return type;
- }
-
- public void setType(String type) {
- this.type = type;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/CorpType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/CorpType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/CorpType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/CorpType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CorpType {
+ private Integer id;
+ private String type;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Country.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Country.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Country.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-
-import org.hibernate.annotations.AccessType;
-
-/**
- * Non realistic embedded dependent object
- *
- * @author Emmanuel Bernard
- */
- at Embeddable
-//access = AccessType.PROPERTY)
- at AccessType("property")
-public class Country implements Serializable {
- private String iso2;
- private String name;
-
- public String getIso2() {
- return iso2;
- }
-
- public void setIso2(String iso2) {
- this.iso2 = iso2;
- }
-
- @Column(name = "countryName")
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Country.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Country.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Country.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Country.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * Non realistic embedded dependent object
+ *
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+//access = AccessType.PROPERTY)
+ at AccessType("property")
+public class Country implements Serializable {
+ private String iso2;
+ private String name;
+
+ public String getIso2() {
+ return iso2;
+ }
+
+ public void setIso2(String iso2) {
+ this.iso2 = iso2;
+ }
+
+ @Column(name = "countryName")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Deal.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Deal.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Deal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.Embedded;
-import javax.persistence.Id;
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Deal {
- /**
- * Deal ID.
- */
- private String id;
-
- @Id
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- /**
- * Swap with the tenor.
- */
- private Swap swap;
-
- @Embedded
- public Swap getSwap() {
- return swap;
- }
-
- public void setSwap(Swap swap) {
- this.swap = swap;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Deal.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Deal.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Deal.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Deal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Embedded;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Deal {
+ /**
+ * Deal ID.
+ */
+ private String id;
+
+ @Id
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ /**
+ * Swap with the tenor.
+ */
+ private Swap swap;
+
+ @Embedded
+ public Swap getSwap() {
+ return swap;
+ }
+
+ public void setSwap(Swap swap) {
+ this.swap = swap;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/EmbeddedTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/EmbeddedTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/EmbeddedTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,386 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import java.io.Serializable;
-import java.util.List;
-import java.util.Set;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.test.annotations.embedded.FloatLeg.RateIndex;
-import org.hibernate.test.annotations.embedded.Leg.Frequency;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EmbeddedTest extends TestCase {
-
- public void testSimple() throws Exception {
- Session s;
- Transaction tx;
- Person p = new Person();
- Address a = new Address();
- Country c = new Country();
- Country bornCountry = new Country();
- c.setIso2( "DM" );
- c.setName( "Matt Damon Land" );
- bornCountry.setIso2( "US" );
- bornCountry.setName( "United States of America" );
-
- a.address1 = "colorado street";
- a.city = "Springfield";
- a.country = c;
- p.address = a;
- p.bornIn = bornCountry;
- p.name = "Homer";
- s = openSession();
- tx = s.beginTransaction();
- s.persist( p );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- p = (Person) s.get( Person.class, p.id );
- assertNotNull( p );
- assertNotNull( p.address );
- assertEquals( "Springfield", p.address.city );
- assertNotNull( p.address.country );
- assertEquals( "DM", p.address.country.getIso2() );
- assertNotNull( p.bornIn );
- assertEquals( "US", p.bornIn.getIso2() );
- tx.commit();
- s.close();
- }
-
- public void testCompositeId() throws Exception {
- Session s;
- Transaction tx;
- RegionalArticlePk pk = new RegionalArticlePk();
- pk.iso2 = "FR";
- pk.localUniqueKey = "1234567890123";
- RegionalArticle reg = new RegionalArticle();
- reg.setName( "Je ne veux pes rester sage - Dolly" );
- reg.setPk( pk );
- s = openSession();
- tx = s.beginTransaction();
- s.persist( reg );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- reg = (RegionalArticle) s.get( RegionalArticle.class, (Serializable) reg.getPk() );
- assertNotNull( reg );
- assertNotNull( reg.getPk() );
- assertEquals( "Je ne veux pes rester sage - Dolly", reg.getName() );
- assertEquals( "FR", reg.getPk().iso2 );
- tx.commit();
- s.close();
- }
-
- public void testManyToOneInsideComponent() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Person p = new Person();
- Country bornIn = new Country();
- bornIn.setIso2( "FR" );
- bornIn.setName( "France" );
- p.bornIn = bornIn;
- p.name = "Emmanuel";
- AddressType type = new AddressType();
- type.setName( "Primary Home" );
- s.persist( type );
- Country currentCountry = new Country();
- currentCountry.setIso2( "US" );
- currentCountry.setName( "USA" );
- Address add = new Address();
- add.address1 = "4 square street";
- add.city = "San diego";
- add.country = currentCountry;
- add.type = type;
- p.address = add;
- s.persist( p );
- tx.commit();
-
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.createQuery( "select p from Person p where p.address.city = :city" );
- q.setString( "city", add.city );
- List result = q.list();
- Person samePerson = (Person) result.get( 0 );
- assertNotNull( samePerson.address.type );
- assertEquals( type.getName(), samePerson.address.type.getName() );
- tx.commit();
- s.close();
- }
-
- public void testEmbeddedSuperclass() {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- VanillaSwap swap = new VanillaSwap();
- swap.setInstrumentId( "US345421" );
- swap.setCurrency( VanillaSwap.Currency.EUR );
- FixedLeg fixed = new FixedLeg();
- fixed.setPaymentFrequency( Leg.Frequency.SEMIANNUALLY );
- fixed.setRate( 5.6 );
- FloatLeg floating = new FloatLeg();
- floating.setPaymentFrequency( Leg.Frequency.QUARTERLY );
- floating.setRateIndex( FloatLeg.RateIndex.LIBOR );
- floating.setRateSpread( 1.1 );
- swap.setFixedLeg( fixed );
- swap.setFloatLeg( floating );
- s.persist( swap );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- swap = (VanillaSwap) s.get( VanillaSwap.class, swap.getInstrumentId() );
- // All fields must be filled with non-default values
- fixed = swap.getFixedLeg();
- assertNotNull( "Fixed leg retrieved as null", fixed );
- floating = swap.getFloatLeg();
- assertNotNull( "Floating leg retrieved as null", floating );
- assertEquals( Leg.Frequency.SEMIANNUALLY, fixed.getPaymentFrequency() );
- assertEquals( Leg.Frequency.QUARTERLY, floating.getPaymentFrequency() );
- s.delete( swap );
- tx.commit();
- s.close();
- }
-
- public void testDottedProperty() {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- // Create short swap
- Swap shortSwap = new Swap();
- shortSwap.setTenor( 2 );
- FixedLeg shortFixed = new FixedLeg();
- shortFixed.setPaymentFrequency( Frequency.SEMIANNUALLY );
- shortFixed.setRate( 5.6 );
- FloatLeg shortFloating = new FloatLeg();
- shortFloating.setPaymentFrequency( Frequency.QUARTERLY );
- shortFloating.setRateIndex( RateIndex.LIBOR );
- shortFloating.setRateSpread( 1.1 );
- shortSwap.setFixedLeg( shortFixed );
- shortSwap.setFloatLeg( shortFloating );
- // Create medium swap
- Swap swap = new Swap();
- swap.setTenor( 7 );
- FixedLeg fixed = new FixedLeg();
- fixed.setPaymentFrequency( Frequency.MONTHLY );
- fixed.setRate( 7.6 );
- FloatLeg floating = new FloatLeg();
- floating.setPaymentFrequency( Frequency.MONTHLY );
- floating.setRateIndex( RateIndex.TIBOR );
- floating.setRateSpread( 0.8 );
- swap.setFixedLeg( fixed );
- swap.setFloatLeg( floating );
- // Create long swap
- Swap longSwap = new Swap();
- longSwap.setTenor( 7 );
- FixedLeg longFixed = new FixedLeg();
- longFixed.setPaymentFrequency( Frequency.MONTHLY );
- longFixed.setRate( 7.6 );
- FloatLeg longFloating = new FloatLeg();
- longFloating.setPaymentFrequency( Frequency.MONTHLY );
- longFloating.setRateIndex( RateIndex.TIBOR );
- longFloating.setRateSpread( 0.8 );
- longSwap.setFixedLeg( longFixed );
- longSwap.setFloatLeg( longFloating );
- // Compose a curve spread deal
- SpreadDeal deal = new SpreadDeal();
- deal.setId( "FX45632" );
- deal.setNotional( 450000.0 );
- deal.setShortSwap( shortSwap );
- deal.setSwap( swap );
- deal.setLongSwap( longSwap );
- s.persist( deal );
-
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- deal = (SpreadDeal) s.get( SpreadDeal.class, deal.getId() );
- // All fields must be filled with non-default values
- assertNotNull( "Short swap is null.", deal.getShortSwap() );
- assertNotNull( "Swap is null.", deal.getSwap() );
- assertNotNull( "Long swap is null.", deal.getLongSwap() );
- assertEquals( 2, deal.getShortSwap().getTenor() );
- assertEquals( 7, deal.getSwap().getTenor() );
- assertEquals( 7, deal.getLongSwap().getTenor() );
- assertNotNull( "Short fixed leg is null.", deal.getShortSwap().getFixedLeg() );
- assertNotNull( "Short floating leg is null.", deal.getShortSwap().getFloatLeg() );
- assertNotNull( "Fixed leg is null.", deal.getSwap().getFixedLeg() );
- assertNotNull( "Floating leg is null.", deal.getSwap().getFloatLeg() );
- assertNotNull( "Long fixed leg is null.", deal.getLongSwap().getFixedLeg() );
- assertNotNull( "Long floating leg is null.", deal.getLongSwap().getFloatLeg() );
- assertEquals( Frequency.SEMIANNUALLY, deal.getShortSwap().getFixedLeg().getPaymentFrequency() );
- assertEquals( Frequency.QUARTERLY, deal.getShortSwap().getFloatLeg().getPaymentFrequency() );
- assertEquals( Frequency.MONTHLY, deal.getSwap().getFixedLeg().getPaymentFrequency() );
- assertEquals( Frequency.MONTHLY, deal.getSwap().getFloatLeg().getPaymentFrequency() );
- assertEquals( Frequency.MONTHLY, deal.getLongSwap().getFixedLeg().getPaymentFrequency() );
- assertEquals( Frequency.MONTHLY, deal.getLongSwap().getFloatLeg().getPaymentFrequency() );
- assertEquals( 5.6, deal.getShortSwap().getFixedLeg().getRate() );
- assertEquals( 7.6, deal.getSwap().getFixedLeg().getRate() );
- assertEquals( 7.6, deal.getLongSwap().getFixedLeg().getRate() );
- assertEquals( RateIndex.LIBOR, deal.getShortSwap().getFloatLeg().getRateIndex() );
- assertEquals( RateIndex.TIBOR, deal.getSwap().getFloatLeg().getRateIndex() );
- assertEquals( RateIndex.TIBOR, deal.getLongSwap().getFloatLeg().getRateIndex() );
- assertEquals( 1.1, deal.getShortSwap().getFloatLeg().getRateSpread() );
- assertEquals( 0.8, deal.getSwap().getFloatLeg().getRateSpread() );
- assertEquals( 0.8, deal.getLongSwap().getFloatLeg().getRateSpread() );
- s.delete( deal );
- tx.commit();
- s.close();
- }
-
- public void testEmbeddedInSecdondaryTable() throws Exception {
- Session s;
- s = openSession();
- s.getTransaction().begin();
- Book book = new Book();
- book.setIsbn( "1234" );
- book.setName( "HiA Second Edition" );
- Summary summary = new Summary();
- summary.setText( "This is a HiA SE summary" );
- summary.setSize( summary.getText().length() );
- book.setSummary( summary );
- s.persist( book );
- s.getTransaction().commit();
-
- s.clear();
-
- Transaction tx = s.beginTransaction();
- Book loadedBook = (Book) s.get( Book.class, book.getIsbn() );
- assertNotNull( loadedBook.getSummary() );
- assertEquals( book.getSummary().getText(), loadedBook.getSummary().getText() );
- s.delete( loadedBook );
- tx.commit();
- s.close();
- }
-
- public void testParent() throws Exception {
- Session s;
- s = openSession();
- s.getTransaction().begin();
- Book book = new Book();
- book.setIsbn( "1234" );
- book.setName( "HiA Second Edition" );
- Summary summary = new Summary();
- summary.setText( "This is a HiA SE summary" );
- summary.setSize( summary.getText().length() );
- book.setSummary( summary );
- s.persist( book );
- s.getTransaction().commit();
-
- s.clear();
-
- Transaction tx = s.beginTransaction();
- Book loadedBook = (Book) s.get( Book.class, book.getIsbn() );
- assertNotNull( loadedBook.getSummary() );
- assertEquals( loadedBook, loadedBook.getSummary().getSummarizedBook() );
- s.delete( loadedBook );
- tx.commit();
- s.close();
- }
-
- public void testEmbeddedAndMultipleManyToOne() throws Exception {
- Session s;
- s = openSession();
- Transaction tx = s.beginTransaction();
- CorpType type = new CorpType();
- type.setType( "National" );
- s.persist( type );
- Nationality nat = new Nationality();
- nat.setName( "Canadian" );
- s.persist( nat );
- InternetProvider provider = new InternetProvider();
- provider.setBrandName( "Fido" );
- LegalStructure structure = new LegalStructure();
- structure.setCorporationType( type );
- structure.setCountry( "Canada" );
- structure.setName( "Rogers" );
- provider.setOwner( structure );
- structure.setOrigin( nat );
- s.persist( provider );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- provider = (InternetProvider) s.get( InternetProvider.class, provider.getId() );
- assertNotNull( provider.getOwner() );
- assertNotNull( "Many to one not set", provider.getOwner().getCorporationType() );
- assertEquals( "Wrong link", type.getType(), provider.getOwner().getCorporationType().getType() );
- assertNotNull( "2nd Many to one not set", provider.getOwner().getOrigin() );
- assertEquals( "Wrong 2nd link", nat.getName(), provider.getOwner().getOrigin().getName() );
- s.delete( provider );
- s.delete( provider.getOwner().getCorporationType() );
- s.delete( provider.getOwner().getOrigin() );
- tx.commit();
- s.close();
- }
-
- public void testEmbeddedAndOneToMany() throws Exception {
- Session s;
- s = openSession();
- Transaction tx = s.beginTransaction();
- InternetProvider provider = new InternetProvider();
- provider.setBrandName( "Fido" );
- LegalStructure structure = new LegalStructure();
- structure.setCountry( "Canada" );
- structure.setName( "Rogers" );
- provider.setOwner( structure );
- s.persist( provider );
- Manager manager = new Manager();
- manager.setName( "Bill" );
- manager.setEmployer( provider );
- structure.getTopManagement().add( manager );
- s.persist( manager );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- provider = (InternetProvider) s.get( InternetProvider.class, provider.getId() );
- assertNotNull( provider.getOwner() );
- Set<Manager> topManagement = provider.getOwner().getTopManagement();
- assertNotNull( "OneToMany not set", topManagement );
- assertEquals( "Wrong number of elements", 1, topManagement.size() );
- manager = (Manager) topManagement.iterator().next();
- assertEquals( "Wrong element", "Bill", manager.getName() );
- s.delete( manager );
- s.delete( provider );
- tx.commit();
- s.close();
- }
-
- public EmbeddedTest(String x) {
- super( x );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Person.class,
- RegionalArticle.class,
- AddressType.class,
- VanillaSwap.class,
- SpreadDeal.class,
- Book.class,
- InternetProvider.class,
- CorpType.class,
- Nationality.class,
- Manager.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/EmbeddedTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/EmbeddedTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/EmbeddedTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/EmbeddedTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,386 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import java.util.List;
+import java.util.Set;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.embedded.FloatLeg.RateIndex;
+import org.hibernate.test.annotations.embedded.Leg.Frequency;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EmbeddedTest extends TestCase {
+
+ public void testSimple() throws Exception {
+ Session s;
+ Transaction tx;
+ Person p = new Person();
+ Address a = new Address();
+ Country c = new Country();
+ Country bornCountry = new Country();
+ c.setIso2( "DM" );
+ c.setName( "Matt Damon Land" );
+ bornCountry.setIso2( "US" );
+ bornCountry.setName( "United States of America" );
+
+ a.address1 = "colorado street";
+ a.city = "Springfield";
+ a.country = c;
+ p.address = a;
+ p.bornIn = bornCountry;
+ p.name = "Homer";
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( p );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ p = (Person) s.get( Person.class, p.id );
+ assertNotNull( p );
+ assertNotNull( p.address );
+ assertEquals( "Springfield", p.address.city );
+ assertNotNull( p.address.country );
+ assertEquals( "DM", p.address.country.getIso2() );
+ assertNotNull( p.bornIn );
+ assertEquals( "US", p.bornIn.getIso2() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCompositeId() throws Exception {
+ Session s;
+ Transaction tx;
+ RegionalArticlePk pk = new RegionalArticlePk();
+ pk.iso2 = "FR";
+ pk.localUniqueKey = "1234567890123";
+ RegionalArticle reg = new RegionalArticle();
+ reg.setName( "Je ne veux pes rester sage - Dolly" );
+ reg.setPk( pk );
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( reg );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ reg = (RegionalArticle) s.get( RegionalArticle.class, (Serializable) reg.getPk() );
+ assertNotNull( reg );
+ assertNotNull( reg.getPk() );
+ assertEquals( "Je ne veux pes rester sage - Dolly", reg.getName() );
+ assertEquals( "FR", reg.getPk().iso2 );
+ tx.commit();
+ s.close();
+ }
+
+ public void testManyToOneInsideComponent() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Person p = new Person();
+ Country bornIn = new Country();
+ bornIn.setIso2( "FR" );
+ bornIn.setName( "France" );
+ p.bornIn = bornIn;
+ p.name = "Emmanuel";
+ AddressType type = new AddressType();
+ type.setName( "Primary Home" );
+ s.persist( type );
+ Country currentCountry = new Country();
+ currentCountry.setIso2( "US" );
+ currentCountry.setName( "USA" );
+ Address add = new Address();
+ add.address1 = "4 square street";
+ add.city = "San diego";
+ add.country = currentCountry;
+ add.type = type;
+ p.address = add;
+ s.persist( p );
+ tx.commit();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.createQuery( "select p from Person p where p.address.city = :city" );
+ q.setString( "city", add.city );
+ List result = q.list();
+ Person samePerson = (Person) result.get( 0 );
+ assertNotNull( samePerson.address.type );
+ assertEquals( type.getName(), samePerson.address.type.getName() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testEmbeddedSuperclass() {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ VanillaSwap swap = new VanillaSwap();
+ swap.setInstrumentId( "US345421" );
+ swap.setCurrency( VanillaSwap.Currency.EUR );
+ FixedLeg fixed = new FixedLeg();
+ fixed.setPaymentFrequency( Leg.Frequency.SEMIANNUALLY );
+ fixed.setRate( 5.6 );
+ FloatLeg floating = new FloatLeg();
+ floating.setPaymentFrequency( Leg.Frequency.QUARTERLY );
+ floating.setRateIndex( FloatLeg.RateIndex.LIBOR );
+ floating.setRateSpread( 1.1 );
+ swap.setFixedLeg( fixed );
+ swap.setFloatLeg( floating );
+ s.persist( swap );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ swap = (VanillaSwap) s.get( VanillaSwap.class, swap.getInstrumentId() );
+ // All fields must be filled with non-default values
+ fixed = swap.getFixedLeg();
+ assertNotNull( "Fixed leg retrieved as null", fixed );
+ floating = swap.getFloatLeg();
+ assertNotNull( "Floating leg retrieved as null", floating );
+ assertEquals( Leg.Frequency.SEMIANNUALLY, fixed.getPaymentFrequency() );
+ assertEquals( Leg.Frequency.QUARTERLY, floating.getPaymentFrequency() );
+ s.delete( swap );
+ tx.commit();
+ s.close();
+ }
+
+ public void testDottedProperty() {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ // Create short swap
+ Swap shortSwap = new Swap();
+ shortSwap.setTenor( 2 );
+ FixedLeg shortFixed = new FixedLeg();
+ shortFixed.setPaymentFrequency( Frequency.SEMIANNUALLY );
+ shortFixed.setRate( 5.6 );
+ FloatLeg shortFloating = new FloatLeg();
+ shortFloating.setPaymentFrequency( Frequency.QUARTERLY );
+ shortFloating.setRateIndex( RateIndex.LIBOR );
+ shortFloating.setRateSpread( 1.1 );
+ shortSwap.setFixedLeg( shortFixed );
+ shortSwap.setFloatLeg( shortFloating );
+ // Create medium swap
+ Swap swap = new Swap();
+ swap.setTenor( 7 );
+ FixedLeg fixed = new FixedLeg();
+ fixed.setPaymentFrequency( Frequency.MONTHLY );
+ fixed.setRate( 7.6 );
+ FloatLeg floating = new FloatLeg();
+ floating.setPaymentFrequency( Frequency.MONTHLY );
+ floating.setRateIndex( RateIndex.TIBOR );
+ floating.setRateSpread( 0.8 );
+ swap.setFixedLeg( fixed );
+ swap.setFloatLeg( floating );
+ // Create long swap
+ Swap longSwap = new Swap();
+ longSwap.setTenor( 7 );
+ FixedLeg longFixed = new FixedLeg();
+ longFixed.setPaymentFrequency( Frequency.MONTHLY );
+ longFixed.setRate( 7.6 );
+ FloatLeg longFloating = new FloatLeg();
+ longFloating.setPaymentFrequency( Frequency.MONTHLY );
+ longFloating.setRateIndex( RateIndex.TIBOR );
+ longFloating.setRateSpread( 0.8 );
+ longSwap.setFixedLeg( longFixed );
+ longSwap.setFloatLeg( longFloating );
+ // Compose a curve spread deal
+ SpreadDeal deal = new SpreadDeal();
+ deal.setId( "FX45632" );
+ deal.setNotional( 450000.0 );
+ deal.setShortSwap( shortSwap );
+ deal.setSwap( swap );
+ deal.setLongSwap( longSwap );
+ s.persist( deal );
+
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ deal = (SpreadDeal) s.get( SpreadDeal.class, deal.getId() );
+ // All fields must be filled with non-default values
+ assertNotNull( "Short swap is null.", deal.getShortSwap() );
+ assertNotNull( "Swap is null.", deal.getSwap() );
+ assertNotNull( "Long swap is null.", deal.getLongSwap() );
+ assertEquals( 2, deal.getShortSwap().getTenor() );
+ assertEquals( 7, deal.getSwap().getTenor() );
+ assertEquals( 7, deal.getLongSwap().getTenor() );
+ assertNotNull( "Short fixed leg is null.", deal.getShortSwap().getFixedLeg() );
+ assertNotNull( "Short floating leg is null.", deal.getShortSwap().getFloatLeg() );
+ assertNotNull( "Fixed leg is null.", deal.getSwap().getFixedLeg() );
+ assertNotNull( "Floating leg is null.", deal.getSwap().getFloatLeg() );
+ assertNotNull( "Long fixed leg is null.", deal.getLongSwap().getFixedLeg() );
+ assertNotNull( "Long floating leg is null.", deal.getLongSwap().getFloatLeg() );
+ assertEquals( Frequency.SEMIANNUALLY, deal.getShortSwap().getFixedLeg().getPaymentFrequency() );
+ assertEquals( Frequency.QUARTERLY, deal.getShortSwap().getFloatLeg().getPaymentFrequency() );
+ assertEquals( Frequency.MONTHLY, deal.getSwap().getFixedLeg().getPaymentFrequency() );
+ assertEquals( Frequency.MONTHLY, deal.getSwap().getFloatLeg().getPaymentFrequency() );
+ assertEquals( Frequency.MONTHLY, deal.getLongSwap().getFixedLeg().getPaymentFrequency() );
+ assertEquals( Frequency.MONTHLY, deal.getLongSwap().getFloatLeg().getPaymentFrequency() );
+ assertEquals( 5.6, deal.getShortSwap().getFixedLeg().getRate() );
+ assertEquals( 7.6, deal.getSwap().getFixedLeg().getRate() );
+ assertEquals( 7.6, deal.getLongSwap().getFixedLeg().getRate() );
+ assertEquals( RateIndex.LIBOR, deal.getShortSwap().getFloatLeg().getRateIndex() );
+ assertEquals( RateIndex.TIBOR, deal.getSwap().getFloatLeg().getRateIndex() );
+ assertEquals( RateIndex.TIBOR, deal.getLongSwap().getFloatLeg().getRateIndex() );
+ assertEquals( 1.1, deal.getShortSwap().getFloatLeg().getRateSpread() );
+ assertEquals( 0.8, deal.getSwap().getFloatLeg().getRateSpread() );
+ assertEquals( 0.8, deal.getLongSwap().getFloatLeg().getRateSpread() );
+ s.delete( deal );
+ tx.commit();
+ s.close();
+ }
+
+ public void testEmbeddedInSecdondaryTable() throws Exception {
+ Session s;
+ s = openSession();
+ s.getTransaction().begin();
+ Book book = new Book();
+ book.setIsbn( "1234" );
+ book.setName( "HiA Second Edition" );
+ Summary summary = new Summary();
+ summary.setText( "This is a HiA SE summary" );
+ summary.setSize( summary.getText().length() );
+ book.setSummary( summary );
+ s.persist( book );
+ s.getTransaction().commit();
+
+ s.clear();
+
+ Transaction tx = s.beginTransaction();
+ Book loadedBook = (Book) s.get( Book.class, book.getIsbn() );
+ assertNotNull( loadedBook.getSummary() );
+ assertEquals( book.getSummary().getText(), loadedBook.getSummary().getText() );
+ s.delete( loadedBook );
+ tx.commit();
+ s.close();
+ }
+
+ public void testParent() throws Exception {
+ Session s;
+ s = openSession();
+ s.getTransaction().begin();
+ Book book = new Book();
+ book.setIsbn( "1234" );
+ book.setName( "HiA Second Edition" );
+ Summary summary = new Summary();
+ summary.setText( "This is a HiA SE summary" );
+ summary.setSize( summary.getText().length() );
+ book.setSummary( summary );
+ s.persist( book );
+ s.getTransaction().commit();
+
+ s.clear();
+
+ Transaction tx = s.beginTransaction();
+ Book loadedBook = (Book) s.get( Book.class, book.getIsbn() );
+ assertNotNull( loadedBook.getSummary() );
+ assertEquals( loadedBook, loadedBook.getSummary().getSummarizedBook() );
+ s.delete( loadedBook );
+ tx.commit();
+ s.close();
+ }
+
+ public void testEmbeddedAndMultipleManyToOne() throws Exception {
+ Session s;
+ s = openSession();
+ Transaction tx = s.beginTransaction();
+ CorpType type = new CorpType();
+ type.setType( "National" );
+ s.persist( type );
+ Nationality nat = new Nationality();
+ nat.setName( "Canadian" );
+ s.persist( nat );
+ InternetProvider provider = new InternetProvider();
+ provider.setBrandName( "Fido" );
+ LegalStructure structure = new LegalStructure();
+ structure.setCorporationType( type );
+ structure.setCountry( "Canada" );
+ structure.setName( "Rogers" );
+ provider.setOwner( structure );
+ structure.setOrigin( nat );
+ s.persist( provider );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ provider = (InternetProvider) s.get( InternetProvider.class, provider.getId() );
+ assertNotNull( provider.getOwner() );
+ assertNotNull( "Many to one not set", provider.getOwner().getCorporationType() );
+ assertEquals( "Wrong link", type.getType(), provider.getOwner().getCorporationType().getType() );
+ assertNotNull( "2nd Many to one not set", provider.getOwner().getOrigin() );
+ assertEquals( "Wrong 2nd link", nat.getName(), provider.getOwner().getOrigin().getName() );
+ s.delete( provider );
+ s.delete( provider.getOwner().getCorporationType() );
+ s.delete( provider.getOwner().getOrigin() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testEmbeddedAndOneToMany() throws Exception {
+ Session s;
+ s = openSession();
+ Transaction tx = s.beginTransaction();
+ InternetProvider provider = new InternetProvider();
+ provider.setBrandName( "Fido" );
+ LegalStructure structure = new LegalStructure();
+ structure.setCountry( "Canada" );
+ structure.setName( "Rogers" );
+ provider.setOwner( structure );
+ s.persist( provider );
+ Manager manager = new Manager();
+ manager.setName( "Bill" );
+ manager.setEmployer( provider );
+ structure.getTopManagement().add( manager );
+ s.persist( manager );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ provider = (InternetProvider) s.get( InternetProvider.class, provider.getId() );
+ assertNotNull( provider.getOwner() );
+ Set<Manager> topManagement = provider.getOwner().getTopManagement();
+ assertNotNull( "OneToMany not set", topManagement );
+ assertEquals( "Wrong number of elements", 1, topManagement.size() );
+ manager = (Manager) topManagement.iterator().next();
+ assertEquals( "Wrong element", "Bill", manager.getName() );
+ s.delete( manager );
+ s.delete( provider );
+ tx.commit();
+ s.close();
+ }
+
+ public EmbeddedTest(String x) {
+ super( x );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Person.class,
+ RegionalArticle.class,
+ AddressType.class,
+ VanillaSwap.class,
+ SpreadDeal.class,
+ Book.class,
+ InternetProvider.class,
+ CorpType.class,
+ Nationality.class,
+ Manager.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FixedLeg.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FixedLeg.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FixedLeg.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-package org.hibernate.test.annotations.embedded;
-
-import java.text.NumberFormat;
-import javax.persistence.Embeddable;
-
-/**
- * Represents fixed part of Interest Rate Swap cash flows.
- */
- at Embeddable
-public class FixedLeg extends Leg {
-
- /**
- * Fixed rate.
- */
- private double rate;
-
- public double getRate() {
- return rate;
- }
-
- public void setRate(double rate) {
- this.rate = rate;
- }
-
- public String toString() {
- NumberFormat format = NumberFormat.getNumberInstance();
- format.setMinimumFractionDigits( 4 );
- format.setMaximumFractionDigits( 4 );
- return format.format( getRate() ) + "%";
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FixedLeg.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FixedLeg.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FixedLeg.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FixedLeg.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+package org.hibernate.test.annotations.embedded;
+
+import java.text.NumberFormat;
+import javax.persistence.Embeddable;
+
+/**
+ * Represents fixed part of Interest Rate Swap cash flows.
+ */
+ at Embeddable
+public class FixedLeg extends Leg {
+
+ /**
+ * Fixed rate.
+ */
+ private double rate;
+
+ public double getRate() {
+ return rate;
+ }
+
+ public void setRate(double rate) {
+ this.rate = rate;
+ }
+
+ public String toString() {
+ NumberFormat format = NumberFormat.getNumberInstance();
+ format.setMinimumFractionDigits( 4 );
+ format.setMaximumFractionDigits( 4 );
+ return format.format( getRate() ) + "%";
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FloatLeg.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FloatLeg.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FloatLeg.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-package org.hibernate.test.annotations.embedded;
-
-import java.text.NumberFormat;
-import javax.persistence.Embeddable;
-
-/**
- * Represents floating part of Interest Rate Swap cash flows.
- */
- at Embeddable
-public class FloatLeg extends Leg {
-
- /**
- * Possible values for the rate index.
- */
- public enum RateIndex {
- LIBOR, EURIBOR, TIBOR}
-
- ;
-
- private RateIndex rateIndex;
-
- /**
- * Spread over the selected rate index (in basis points).
- */
- private double rateSpread;
-
- public RateIndex getRateIndex() {
- return rateIndex;
- }
-
- public void setRateIndex(RateIndex rateIndex) {
- this.rateIndex = rateIndex;
- }
-
- public double getRateSpread() {
- return rateSpread;
- }
-
- public void setRateSpread(double rateSpread) {
- this.rateSpread = rateSpread;
- }
-
- public String toString() {
- NumberFormat format = NumberFormat.getNumberInstance();
- format.setMinimumFractionDigits( 1 );
- format.setMaximumFractionDigits( 1 );
- return "[" + getRateIndex().toString() + "+" + format.format( getRateSpread() ) + "]";
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FloatLeg.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FloatLeg.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FloatLeg.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/FloatLeg.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+package org.hibernate.test.annotations.embedded;
+
+import java.text.NumberFormat;
+import javax.persistence.Embeddable;
+
+/**
+ * Represents floating part of Interest Rate Swap cash flows.
+ */
+ at Embeddable
+public class FloatLeg extends Leg {
+
+ /**
+ * Possible values for the rate index.
+ */
+ public enum RateIndex {
+ LIBOR, EURIBOR, TIBOR}
+
+ ;
+
+ private RateIndex rateIndex;
+
+ /**
+ * Spread over the selected rate index (in basis points).
+ */
+ private double rateSpread;
+
+ public RateIndex getRateIndex() {
+ return rateIndex;
+ }
+
+ public void setRateIndex(RateIndex rateIndex) {
+ this.rateIndex = rateIndex;
+ }
+
+ public double getRateSpread() {
+ return rateSpread;
+ }
+
+ public void setRateSpread(double rateSpread) {
+ this.rateSpread = rateSpread;
+ }
+
+ public String toString() {
+ NumberFormat format = NumberFormat.getNumberInstance();
+ format.setMinimumFractionDigits( 1 );
+ format.setMaximumFractionDigits( 1 );
+ return "[" + getRateIndex().toString() + "+" + format.format( getRateSpread() ) + "]";
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/InternetProvider.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/InternetProvider.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/InternetProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class InternetProvider {
- private Integer id;
- private String brandName;
- private LegalStructure owner;
-
- public String getBrandName() {
- return brandName;
- }
-
- public void setBrandName(String brandName) {
- this.brandName = brandName;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public LegalStructure getOwner() {
- return owner;
- }
-
- public void setOwner(LegalStructure owner) {
- this.owner = owner;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/InternetProvider.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/InternetProvider.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/InternetProvider.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/InternetProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class InternetProvider {
+ private Integer id;
+ private String brandName;
+ private LegalStructure owner;
+
+ public String getBrandName() {
+ return brandName;
+ }
+
+ public void setBrandName(String brandName) {
+ this.brandName = brandName;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public LegalStructure getOwner() {
+ return owner;
+ }
+
+ public void setOwner(LegalStructure owner) {
+ this.owner = owner;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Leg.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Leg.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Leg.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.MappedSuperclass;
-
-/**
- * Represents a leg of a vanilla interest rate swap.
- */
- at MappedSuperclass
-public class Leg {
- /**
- * Possible values of the payment frequency field.
- */
- public enum Frequency {
- ANNUALY, SEMIANNUALLY, QUARTERLY, MONTHLY }
-
- ;
-
- /**
- * Shows how frequent payments according to this leg should be made.
- */
- private Frequency paymentFrequency;
-
- public Frequency getPaymentFrequency() {
- return paymentFrequency;
- }
-
- public void setPaymentFrequency(Frequency paymentFrequency) {
- this.paymentFrequency = paymentFrequency;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Leg.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Leg.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Leg.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Leg.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * Represents a leg of a vanilla interest rate swap.
+ */
+ at MappedSuperclass
+public class Leg {
+ /**
+ * Possible values of the payment frequency field.
+ */
+ public enum Frequency {
+ ANNUALY, SEMIANNUALLY, QUARTERLY, MONTHLY }
+
+ ;
+
+ /**
+ * Shows how frequent payments according to this leg should be made.
+ */
+ private Frequency paymentFrequency;
+
+ public Frequency getPaymentFrequency() {
+ return paymentFrequency;
+ }
+
+ public void setPaymentFrequency(Frequency paymentFrequency) {
+ this.paymentFrequency = paymentFrequency;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/LegalStructure.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/LegalStructure.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/LegalStructure.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,66 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.Embeddable;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class LegalStructure {
- private String name;
- private String country;
- private CorpType corporationType;
- private Nationality origin;
- private Set<Manager> topManagement = new HashSet<Manager>();
-
- @ManyToOne
- @JoinColumn(name = "CORP_ID")
- public CorpType getCorporationType() {
- return corporationType;
- }
-
- public void setCorporationType(CorpType corporationType) {
- this.corporationType = corporationType;
- }
-
- public String getCountry() {
- return country;
- }
-
- public void setCountry(String country) {
- this.country = country;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne
- @JoinColumn(name = "origin_fk")
- public Nationality getOrigin() {
- return origin;
- }
-
- public void setOrigin(Nationality origin) {
- this.origin = origin;
- }
-
- @OneToMany(mappedBy = "employer")
- public Set<Manager> getTopManagement() {
- return topManagement;
- }
-
- public void setTopManagement(Set<Manager> topManagement) {
- this.topManagement = topManagement;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/LegalStructure.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/LegalStructure.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/LegalStructure.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/LegalStructure.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,66 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Embeddable;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class LegalStructure {
+ private String name;
+ private String country;
+ private CorpType corporationType;
+ private Nationality origin;
+ private Set<Manager> topManagement = new HashSet<Manager>();
+
+ @ManyToOne
+ @JoinColumn(name = "CORP_ID")
+ public CorpType getCorporationType() {
+ return corporationType;
+ }
+
+ public void setCorporationType(CorpType corporationType) {
+ this.corporationType = corporationType;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne
+ @JoinColumn(name = "origin_fk")
+ public Nationality getOrigin() {
+ return origin;
+ }
+
+ public void setOrigin(Nationality origin) {
+ this.origin = origin;
+ }
+
+ @OneToMany(mappedBy = "employer")
+ public Set<Manager> getTopManagement() {
+ return topManagement;
+ }
+
+ public void setTopManagement(Set<Manager> topManagement) {
+ this.topManagement = topManagement;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Manager.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Manager.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Manager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Manager {
- private Integer id;
- private String name;
- private InternetProvider employer;
-
- @ManyToOne
- public InternetProvider getEmployer() {
- return employer;
- }
-
- public void setEmployer(InternetProvider employer) {
- this.employer = employer;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Manager.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Manager.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Manager.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Manager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Manager {
+ private Integer id;
+ private String name;
+ private InternetProvider employer;
+
+ @ManyToOne
+ public InternetProvider getEmployer() {
+ return employer;
+ }
+
+ public void setEmployer(InternetProvider employer) {
+ this.employer = employer;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Nationality.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Nationality.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Nationality.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Nationality {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Nationality.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Nationality.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Nationality.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Nationality.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Nationality {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/NotonialDeal.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/NotonialDeal.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/NotonialDeal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.Column;
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at AttributeOverrides(value = {
- at AttributeOverride(name = "swap.tenor", column = @Column(name = "TENOR")), //should be ovvriden by deal
- at AttributeOverride(name = "id", column = @Column(name = "NOTONIALDEAL_ID"))
- })
- at MappedSuperclass
-public class NotonialDeal extends Deal {
- /**
- * Notional amount of both IRSs.
- */
- private double notional;
-
- public double getNotional() {
- return notional;
- }
-
- public void setNotional(double notional) {
- this.notional = notional;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/NotonialDeal.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/NotonialDeal.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/NotonialDeal.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/NotonialDeal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at AttributeOverrides(value = {
+ at AttributeOverride(name = "swap.tenor", column = @Column(name = "TENOR")), //should be ovvriden by deal
+ at AttributeOverride(name = "id", column = @Column(name = "NOTONIALDEAL_ID"))
+ })
+ at MappedSuperclass
+public class NotonialDeal extends Deal {
+ /**
+ * Notional amount of both IRSs.
+ */
+ private double notional;
+
+ public double getNotional() {
+ return notional;
+ }
+
+ public void setNotional(double notional) {
+ this.notional = notional;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Person.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Person.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Person.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import java.io.Serializable;
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "PersonEmbed")
-public class Person implements Serializable {
- @Id
- @GeneratedValue
- Integer id;
-
- String name;
-
- @Embedded
- Address address;
-
- @Embedded
- @AttributeOverrides({
- @AttributeOverride(name = "iso2", column = @Column(name = "bornIso2")),
- @AttributeOverride(name = "name", column = @Column(name = "bornCountryName"))
- })
- Country bornIn;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Person.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Person.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Person.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Person.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "PersonEmbed")
+public class Person implements Serializable {
+ @Id
+ @GeneratedValue
+ Integer id;
+
+ String name;
+
+ @Embedded
+ Address address;
+
+ @Embedded
+ @AttributeOverrides({
+ @AttributeOverride(name = "iso2", column = @Column(name = "bornIso2")),
+ @AttributeOverride(name = "name", column = @Column(name = "bornCountryName"))
+ })
+ Country bornIn;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticle.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticle.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticle.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * A regional article is typically a bad design, it keep the country iso2 and a business key as
- * (composite) primary key
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class RegionalArticle implements Serializable {
- private RegionalArticlePk pk;
- private String name;
-
- @Id
- public RegionalArticlePk getPk() {
- return pk;
- }
-
- public void setPk(RegionalArticlePk pk) {
- this.pk = pk;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int hashCode() {
- //a NPE can occurs, but I don't expect hashcode to be used before pk is set
- return getPk().hashCode();
- }
-
- public boolean equals(Object obj) {
- //a NPE can occurs, but I don't expect equals to be used before pk is set
- if ( obj != null && obj instanceof RegionalArticle ) {
- return getPk().equals( ( (RegionalArticle) obj ).getPk() );
- }
- else {
- return false;
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticle.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticle.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticle.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticle.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * A regional article is typically a bad design, it keep the country iso2 and a business key as
+ * (composite) primary key
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class RegionalArticle implements Serializable {
+ private RegionalArticlePk pk;
+ private String name;
+
+ @Id
+ public RegionalArticlePk getPk() {
+ return pk;
+ }
+
+ public void setPk(RegionalArticlePk pk) {
+ this.pk = pk;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int hashCode() {
+ //a NPE can occurs, but I don't expect hashcode to be used before pk is set
+ return getPk().hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ //a NPE can occurs, but I don't expect equals to be used before pk is set
+ if ( obj != null && obj instanceof RegionalArticle ) {
+ return getPk().equals( ( (RegionalArticle) obj ).getPk() );
+ }
+ else {
+ return false;
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticlePk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticlePk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticlePk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-import org.hibernate.annotations.AccessType;
-
-/**
- * Regional article pk
- *
- * @author Emmanuel Bernard
- */
- at Embeddable
- at AccessType("field")
-public class RegionalArticlePk implements Serializable {
- /**
- * country iso2 code
- */
- public String iso2;
- public String localUniqueKey;
-
- public int hashCode() {
- //this implem sucks
- return ( iso2 + localUniqueKey ).hashCode();
- }
-
- public boolean equals(Object obj) {
- //iso2 and localUniqueKey are expected to be set in this implem
- if ( obj != null && obj instanceof RegionalArticlePk ) {
- RegionalArticlePk other = (RegionalArticlePk) obj;
- return iso2.equals( other.iso2 ) && localUniqueKey.equals( other.localUniqueKey );
- }
- else {
- return false;
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticlePk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticlePk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticlePk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/RegionalArticlePk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+import org.hibernate.annotations.AccessType;
+
+/**
+ * Regional article pk
+ *
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+ at AccessType("field")
+public class RegionalArticlePk implements Serializable {
+ /**
+ * country iso2 code
+ */
+ public String iso2;
+ public String localUniqueKey;
+
+ public int hashCode() {
+ //this implem sucks
+ return ( iso2 + localUniqueKey ).hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ //iso2 and localUniqueKey are expected to be set in this implem
+ if ( obj != null && obj instanceof RegionalArticlePk ) {
+ RegionalArticlePk other = (RegionalArticlePk) obj;
+ return iso2.equals( other.iso2 ) && localUniqueKey.equals( other.localUniqueKey );
+ }
+ else {
+ return false;
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/SpreadDeal.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/SpreadDeal.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/SpreadDeal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,62 +0,0 @@
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-
-/**
- * Represents a "curve spread" deal that consists of
- * two Interest Rate Swaps with different tenors (short and long).
- * For simplicity, tenors are not considered here.
- */
- at Entity
- at AttributeOverrides(value = {
- at AttributeOverride(name = "swap.tenor", column = @Column(name = "MEDIUM_TENOR")),
- at AttributeOverride(name = "swap.fixedLeg.paymentFrequency", column = @Column(name = "MEDIUM_FIXED_FREQUENCY")),
- at AttributeOverride(name = "swap.fixedLeg.rate", column = @Column(name = "MEDIUM_FIXED_RATE")),
- at AttributeOverride(name = "swap.floatLeg.paymentFrequency", column = @Column(name = "MEDIUM_FLOAT_FREQUENCY")),
- at AttributeOverride(name = "swap.floatLeg.rateIndex", column = @Column(name = "MEDIUM_FLOAT_RATEINDEX")),
- at AttributeOverride(name = "swap.floatLeg.rateSpread", column = @Column(name = "MEDIUM_FLOAT_RATESPREAD"))
- })
-public class SpreadDeal extends NotonialDeal {
-
- /**
- * Swap with the tenor.
- */
- private Swap longSwap;
-
- @Embedded
- public Swap getLongSwap() {
- return longSwap;
- }
-
- public void setLongSwap(Swap swap) {
- this.longSwap = swap;
- }
-
-
- /**
- * Swap with the longer tenor.
- */
- private Swap shortSwap;
-
-
- @Embedded
- @AttributeOverrides(value = {
- @AttributeOverride(name = "tenor", column = @Column(name = "SHORT_TENOR")),
- @AttributeOverride(name = "fixedLeg.paymentFrequency", column = @Column(name = "SHORT_FIXED_FREQUENCY")),
- @AttributeOverride(name = "fixedLeg.rate", column = @Column(name = "SHORT_FIXED_RATE")),
- @AttributeOverride(name = "floatLeg.paymentFrequency", column = @Column(name = "SHORT_FLOAT_FREQUENCY")),
- @AttributeOverride(name = "floatLeg.rateIndex", column = @Column(name = "SHORT_FLOAT_RATEINDEX")),
- @AttributeOverride(name = "floatLeg.rateSpread", column = @Column(name = "SHORT_FLOAT_RATESPREAD"))
- })
- public Swap getShortSwap() {
- return shortSwap;
- }
-
- public void setShortSwap(Swap shortSwap) {
- this.shortSwap = shortSwap;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/SpreadDeal.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/SpreadDeal.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/SpreadDeal.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/SpreadDeal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,62 @@
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+
+/**
+ * Represents a "curve spread" deal that consists of
+ * two Interest Rate Swaps with different tenors (short and long).
+ * For simplicity, tenors are not considered here.
+ */
+ at Entity
+ at AttributeOverrides(value = {
+ at AttributeOverride(name = "swap.tenor", column = @Column(name = "MEDIUM_TENOR")),
+ at AttributeOverride(name = "swap.fixedLeg.paymentFrequency", column = @Column(name = "MEDIUM_FIXED_FREQUENCY")),
+ at AttributeOverride(name = "swap.fixedLeg.rate", column = @Column(name = "MEDIUM_FIXED_RATE")),
+ at AttributeOverride(name = "swap.floatLeg.paymentFrequency", column = @Column(name = "MEDIUM_FLOAT_FREQUENCY")),
+ at AttributeOverride(name = "swap.floatLeg.rateIndex", column = @Column(name = "MEDIUM_FLOAT_RATEINDEX")),
+ at AttributeOverride(name = "swap.floatLeg.rateSpread", column = @Column(name = "MEDIUM_FLOAT_RATESPREAD"))
+ })
+public class SpreadDeal extends NotonialDeal {
+
+ /**
+ * Swap with the tenor.
+ */
+ private Swap longSwap;
+
+ @Embedded
+ public Swap getLongSwap() {
+ return longSwap;
+ }
+
+ public void setLongSwap(Swap swap) {
+ this.longSwap = swap;
+ }
+
+
+ /**
+ * Swap with the longer tenor.
+ */
+ private Swap shortSwap;
+
+
+ @Embedded
+ @AttributeOverrides(value = {
+ @AttributeOverride(name = "tenor", column = @Column(name = "SHORT_TENOR")),
+ @AttributeOverride(name = "fixedLeg.paymentFrequency", column = @Column(name = "SHORT_FIXED_FREQUENCY")),
+ @AttributeOverride(name = "fixedLeg.rate", column = @Column(name = "SHORT_FIXED_RATE")),
+ @AttributeOverride(name = "floatLeg.paymentFrequency", column = @Column(name = "SHORT_FLOAT_FREQUENCY")),
+ @AttributeOverride(name = "floatLeg.rateIndex", column = @Column(name = "SHORT_FLOAT_RATEINDEX")),
+ @AttributeOverride(name = "floatLeg.rateSpread", column = @Column(name = "SHORT_FLOAT_RATESPREAD"))
+ })
+ public Swap getShortSwap() {
+ return shortSwap;
+ }
+
+ public void setShortSwap(Swap shortSwap) {
+ this.shortSwap = shortSwap;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Summary.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Summary.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Summary.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.Embeddable;
-
-import org.hibernate.annotations.Parent;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class Summary {
- private int size;
- private String text;
- private Book summarizedBook;
-
- public int getSize() {
- return size;
- }
-
- public void setSize(int size) {
- this.size = size;
- }
-
- public String getText() {
- return text;
- }
-
- public void setText(String text) {
- this.text = text;
- }
-
- @Parent
- public Book getSummarizedBook() {
- return summarizedBook;
- }
-
- public void setSummarizedBook(Book summarizedBook) {
- this.summarizedBook = summarizedBook;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Summary.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Summary.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Summary.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Summary.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id$
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.Embeddable;
+
+import org.hibernate.annotations.Parent;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Summary {
+ private int size;
+ private String text;
+ private Book summarizedBook;
+
+ public int getSize() {
+ return size;
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ @Parent
+ public Book getSummarizedBook() {
+ return summarizedBook;
+ }
+
+ public void setSummarizedBook(Book summarizedBook) {
+ this.summarizedBook = summarizedBook;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Swap.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Swap.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Swap.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-import javax.persistence.Embedded;
-
-/**
- * Interest Rate Swap with Tenor. Used here to compose
- * a swap spread deal.
- */
- at Embeddable
-public class Swap {
-
- /**
- * Tenor (duration) of the swap (in years).
- */
- private int tenor;
-
- public int getTenor() {
- return tenor;
- }
-
- public void setTenor(int tenor) {
- this.tenor = tenor;
- }
-
- /**
- * Fixed leg (cash flows with the fixed rate).
- */
- private FixedLeg fixedLeg;
-
- /**
- * Floating leg (cash flows bound to a financial index).
- */
- private FloatLeg floatLeg;
-
- @Embedded
- // We retain this annotation to test the precedence of @AttributeOverride
- // Outermost override annotation should win
- @AttributeOverride(name = "paymentFrequency", column = @Column(name = "FIXED_FREQENCY"))
- public FixedLeg getFixedLeg() {
- return fixedLeg;
- }
-
- public void setFixedLeg(FixedLeg fixedLeg) {
- this.fixedLeg = fixedLeg;
- }
-
- @Embedded
- public FloatLeg getFloatLeg() {
- return floatLeg;
- }
-
- public void setFloatLeg(FloatLeg floatLeg) {
- this.floatLeg = floatLeg;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Swap.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Swap.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Swap.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/Swap.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+
+/**
+ * Interest Rate Swap with Tenor. Used here to compose
+ * a swap spread deal.
+ */
+ at Embeddable
+public class Swap {
+
+ /**
+ * Tenor (duration) of the swap (in years).
+ */
+ private int tenor;
+
+ public int getTenor() {
+ return tenor;
+ }
+
+ public void setTenor(int tenor) {
+ this.tenor = tenor;
+ }
+
+ /**
+ * Fixed leg (cash flows with the fixed rate).
+ */
+ private FixedLeg fixedLeg;
+
+ /**
+ * Floating leg (cash flows bound to a financial index).
+ */
+ private FloatLeg floatLeg;
+
+ @Embedded
+ // We retain this annotation to test the precedence of @AttributeOverride
+ // Outermost override annotation should win
+ @AttributeOverride(name = "paymentFrequency", column = @Column(name = "FIXED_FREQENCY"))
+ public FixedLeg getFixedLeg() {
+ return fixedLeg;
+ }
+
+ public void setFixedLeg(FixedLeg fixedLeg) {
+ this.fixedLeg = fixedLeg;
+ }
+
+ @Embedded
+ public FloatLeg getFloatLeg() {
+ return floatLeg;
+ }
+
+ public void setFloatLeg(FloatLeg floatLeg) {
+ this.floatLeg = floatLeg;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/VanillaSwap.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/VanillaSwap.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/VanillaSwap.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,77 +0,0 @@
-package org.hibernate.test.annotations.embedded;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * Represents an Interest Rate Swap.
- */
- at Entity
-public class VanillaSwap {
-
- /**
- * Possible values for the currency field.
- */
- public enum Currency {
- USD, GBP, EUR, JPY }
-
- /**
- * Identifier of the Interest Rate Swap
- */
- private String instrumentId;
-
- /**
- * Currency of the swap (and of both legs).
- */
- private Currency currency;
-
- /**
- * Fixed leg (cash flows with the fixed rate).
- */
- private FixedLeg fixedLeg;
-
- /**
- * Floating leg (cash flows bound to a financial index).
- */
- private FloatLeg floatLeg;
-
- @Embedded
- @AttributeOverride(name = "paymentFrequency", column = @Column(name = "FIXED_FREQENCY"))
- public FixedLeg getFixedLeg() {
- return fixedLeg;
- }
-
- public void setFixedLeg(FixedLeg fixedLeg) {
- this.fixedLeg = fixedLeg;
- }
-
- @Embedded
- @AttributeOverride(name = "paymentFrequency", column = @Column(name = "FLOAT_FREQUENCY"))
- public FloatLeg getFloatLeg() {
- return floatLeg;
- }
-
- public void setFloatLeg(FloatLeg floatLeg) {
- this.floatLeg = floatLeg;
- }
-
- public Currency getCurrency() {
- return currency;
- }
-
- public void setCurrency(Currency currency) {
- this.currency = currency;
- }
-
- @Id
- public String getInstrumentId() {
- return instrumentId;
- }
-
- public void setInstrumentId(String instrumentId) {
- this.instrumentId = instrumentId;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/VanillaSwap.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/VanillaSwap.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/VanillaSwap.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/embedded/VanillaSwap.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,77 @@
+package org.hibernate.test.annotations.embedded;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * Represents an Interest Rate Swap.
+ */
+ at Entity
+public class VanillaSwap {
+
+ /**
+ * Possible values for the currency field.
+ */
+ public enum Currency {
+ USD, GBP, EUR, JPY }
+
+ /**
+ * Identifier of the Interest Rate Swap
+ */
+ private String instrumentId;
+
+ /**
+ * Currency of the swap (and of both legs).
+ */
+ private Currency currency;
+
+ /**
+ * Fixed leg (cash flows with the fixed rate).
+ */
+ private FixedLeg fixedLeg;
+
+ /**
+ * Floating leg (cash flows bound to a financial index).
+ */
+ private FloatLeg floatLeg;
+
+ @Embedded
+ @AttributeOverride(name = "paymentFrequency", column = @Column(name = "FIXED_FREQENCY"))
+ public FixedLeg getFixedLeg() {
+ return fixedLeg;
+ }
+
+ public void setFixedLeg(FixedLeg fixedLeg) {
+ this.fixedLeg = fixedLeg;
+ }
+
+ @Embedded
+ @AttributeOverride(name = "paymentFrequency", column = @Column(name = "FLOAT_FREQUENCY"))
+ public FloatLeg getFloatLeg() {
+ return floatLeg;
+ }
+
+ public void setFloatLeg(FloatLeg floatLeg) {
+ this.floatLeg = floatLeg;
+ }
+
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(Currency currency) {
+ this.currency = currency;
+ }
+
+ @Id
+ public String getInstrumentId() {
+ return instrumentId;
+ }
+
+ public void setInstrumentId(String instrumentId) {
+ this.instrumentId = instrumentId;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Address.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Address.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-/**
- * Has a serializable class as a property
- *
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "serial_address")
-public class Address {
- private Integer id;
- private String city;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- 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;
- }
-
- private Country country;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Address.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Address.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Address.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * Has a serializable class as a property
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "serial_address")
+public class Address {
+ private Integer id;
+ private String city;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ 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;
+ }
+
+ private Country country;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,339 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import java.math.BigDecimal;
-import java.util.Currency;
-import java.util.Date;
-
-import org.hibernate.Hibernate;
-import org.hibernate.HibernateException;
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class BasicHibernateAnnotationsTest extends TestCase {
-
- public void testEntity() throws Exception {
- Forest forest = new Forest();
- forest.setName( "Fontainebleau" );
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( forest );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- forest = (Forest) s.get( Forest.class, forest.getId() );
- assertNotNull( forest );
- forest.setName( "Fontainebleau" );
- //should not execute SQL update
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- forest = (Forest) s.get( Forest.class, forest.getId() );
- assertNotNull( forest );
- forest.setLength( 23 );
- //should execute dynamic SQL update
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- s.delete( s.get( Forest.class, forest.getId() ) );
- tx.commit();
- s.close();
- }
-
- public void testVersioning() throws Exception {
- Forest forest = new Forest();
- forest.setName( "Fontainebleau" );
- forest.setLength( 33 );
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( forest );
- tx.commit();
- s.close();
-
- Session parallelSession = openSession();
- Transaction parallelTx = parallelSession.beginTransaction();
- s = openSession();
- tx = s.beginTransaction();
-
- forest = (Forest) parallelSession.get( Forest.class, forest.getId() );
- Forest reloadedForest = (Forest) s.get( Forest.class, forest.getId() );
- reloadedForest.setLength( 11 );
- assertNotSame( forest, reloadedForest );
- tx.commit();
- s.close();
-
- forest.setLength( 22 );
- try {
- parallelTx.commit();
- fail( "All optimistic locking should have make it fail" );
- }
- catch (HibernateException e) {
- if ( parallelTx != null ) parallelTx.rollback();
- }
- finally {
- parallelSession.close();
- }
-
- s = openSession();
- tx = s.beginTransaction();
- s.delete( s.get( Forest.class, forest.getId() ) );
- tx.commit();
- s.close();
-
- }
-
- public void testPolymorphism() throws Exception {
- Forest forest = new Forest();
- forest.setName( "Fontainebleau" );
- forest.setLength( 33 );
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( forest );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Query query = s.createQuery( "from java.lang.Object" );
- assertEquals( 0, query.list().size() );
- query = s.createQuery( "from Forest" );
- assertTrue( 0 < query.list().size() );
- tx.commit();
- s.close();
- }
-
- public void testType() throws Exception {
- Forest f = new Forest();
- f.setName( "Broceliande" );
- String description = "C'est une enorme foret enchantee ou vivais Merlin et toute la clique";
- f.setLongDescription( description );
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( f );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- f = (Forest) s.get( Forest.class, f.getId() );
- assertNotNull( f );
- assertEquals( description, f.getLongDescription() );
- s.delete( f );
- tx.commit();
- s.close();
-
- }
-
- public void testNonLazy() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Forest f = new Forest();
- Tree t = new Tree();
- t.setName( "Basic one" );
- s.persist( f );
- s.persist( t );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- f = (Forest) s.load( Forest.class, f.getId() );
- t = (Tree) s.load( Tree.class, t.getId() );
- assertFalse( "Default should be lazy", Hibernate.isInitialized( f ) );
- assertTrue( "Tree is not lazy", Hibernate.isInitialized( t ) );
- tx.commit();
- s.close();
- }
-
- public void testCache() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- ZipCode zc = new ZipCode();
- zc.code = "92400";
- s.persist( zc );
- tx.commit();
- s.close();
- getSessions().getStatistics().clear();
- getSessions().getStatistics().setStatisticsEnabled( true );
- getSessions().evict( ZipCode.class );
- s = openSession();
- tx = s.beginTransaction();
- s.get( ZipCode.class, zc.code );
- assertEquals( 1, getSessions().getStatistics().getSecondLevelCachePutCount() );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- s.get( ZipCode.class, zc.code );
- assertEquals( 1, getSessions().getStatistics().getSecondLevelCacheHitCount() );
- tx.commit();
- s.close();
- }
-
- public void testFilter() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.createQuery( "delete Forest" ).executeUpdate();
- Forest f1 = new Forest();
- f1.setLength( 2 );
- s.persist( f1 );
- Forest f2 = new Forest();
- f2.setLength( 20 );
- s.persist( f2 );
- Forest f3 = new Forest();
- f3.setLength( 200 );
- s.persist( f3 );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- s.enableFilter( "betweenLength" ).setParameter( "minLength", 5 ).setParameter( "maxLength", 50 );
- long count = ( (Long) s.createQuery( "select count(*) from Forest" ).iterate().next() ).intValue();
- assertEquals( 1, count );
- s.disableFilter( "betweenLength" );
- s.enableFilter( "minLength" ).setParameter( "minLength", 5 );
- count = ( (Long) s.createQuery( "select count(*) from Forest" ).iterate().next() ).longValue();
- assertEquals( 2l, count );
- s.disableFilter( "minLength" );
- tx.rollback();
- s.close();
- }
-
- public void testParameterizedType() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Forest f = new Forest();
- f.setSmallText( "ThisIsASmallText" );
- f.setBigText( "ThisIsABigText" );
- s.persist( f );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- Forest f2 = (Forest) s.get( Forest.class, f.getId() );
- assertEquals( f.getSmallText().toLowerCase(), f2.getSmallText() );
- assertEquals( f.getBigText().toUpperCase(), f2.getBigText() );
- tx.commit();
- s.close();
- }
-
- public void testSerialized() throws Exception {
- Forest forest = new Forest();
- forest.setName( "Shire" );
- Country country = new Country();
- country.setName( "Middle Earth" );
- forest.setCountry( country );
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( forest );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- forest = (Forest) s.get( Forest.class, forest.getId() );
- assertNotNull( forest );
- assertNotNull( forest.getCountry() );
- assertEquals( country.getName(), forest.getCountry().getName() );
- tx.commit();
- s.close();
- }
-
- public void testCompositeType() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Ransom r = new Ransom();
- r.setKidnapperName( "Se7en" );
- r.setDate( new Date() );
- MonetaryAmount amount = new MonetaryAmount(
- new BigDecimal( 100000 ),
- Currency.getInstance( "EUR" )
- );
- r.setAmount( amount );
- s.persist( r );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- r = (Ransom) s.get( Ransom.class, r.getId() );
- assertNotNull( r );
- assertNotNull( r.getAmount() );
- assertTrue( 0 == new BigDecimal( 100000 ).compareTo( r.getAmount().getAmount() ) );
- assertEquals( Currency.getInstance( "EUR" ), r.getAmount().getCurrency() );
- tx.commit();
- s.close();
- }
-
- public void testFormula() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- org.hibernate.test.annotations.entity.Flight airFrance = new Flight();
- airFrance.setId( new Long( 747 ) );
- airFrance.setMaxAltitude( 10000 );
- s.persist( airFrance );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- airFrance = (Flight) s.get( Flight.class, airFrance.getId() );
- assertNotNull( airFrance );
- assertEquals( 10000000, airFrance.getMaxAltitudeInMilimeter() );
- s.delete( airFrance );
- tx.commit();
- s.close();
- }
-
- public BasicHibernateAnnotationsTest(String x) {
- super( x );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Forest.class,
- Tree.class,
- Ransom.class,
- ZipCode.class,
- Flight.class
- };
- }
-
- protected String[] getAnnotatedPackages() {
- return new String[]{
- "org.hibernate.test.annotations.entity"
- };
- }
-
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/BasicHibernateAnnotationsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,339 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import java.math.BigDecimal;
+import java.util.Currency;
+import java.util.Date;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BasicHibernateAnnotationsTest extends TestCase {
+
+ public void testEntity() throws Exception {
+ Forest forest = new Forest();
+ forest.setName( "Fontainebleau" );
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( forest );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ forest = (Forest) s.get( Forest.class, forest.getId() );
+ assertNotNull( forest );
+ forest.setName( "Fontainebleau" );
+ //should not execute SQL update
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ forest = (Forest) s.get( Forest.class, forest.getId() );
+ assertNotNull( forest );
+ forest.setLength( 23 );
+ //should execute dynamic SQL update
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.delete( s.get( Forest.class, forest.getId() ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testVersioning() throws Exception {
+ Forest forest = new Forest();
+ forest.setName( "Fontainebleau" );
+ forest.setLength( 33 );
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( forest );
+ tx.commit();
+ s.close();
+
+ Session parallelSession = openSession();
+ Transaction parallelTx = parallelSession.beginTransaction();
+ s = openSession();
+ tx = s.beginTransaction();
+
+ forest = (Forest) parallelSession.get( Forest.class, forest.getId() );
+ Forest reloadedForest = (Forest) s.get( Forest.class, forest.getId() );
+ reloadedForest.setLength( 11 );
+ assertNotSame( forest, reloadedForest );
+ tx.commit();
+ s.close();
+
+ forest.setLength( 22 );
+ try {
+ parallelTx.commit();
+ fail( "All optimistic locking should have make it fail" );
+ }
+ catch (HibernateException e) {
+ if ( parallelTx != null ) parallelTx.rollback();
+ }
+ finally {
+ parallelSession.close();
+ }
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.delete( s.get( Forest.class, forest.getId() ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testPolymorphism() throws Exception {
+ Forest forest = new Forest();
+ forest.setName( "Fontainebleau" );
+ forest.setLength( 33 );
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( forest );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Query query = s.createQuery( "from java.lang.Object" );
+ assertEquals( 0, query.list().size() );
+ query = s.createQuery( "from Forest" );
+ assertTrue( 0 < query.list().size() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testType() throws Exception {
+ Forest f = new Forest();
+ f.setName( "Broceliande" );
+ String description = "C'est une enorme foret enchantee ou vivais Merlin et toute la clique";
+ f.setLongDescription( description );
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( f );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ f = (Forest) s.get( Forest.class, f.getId() );
+ assertNotNull( f );
+ assertEquals( description, f.getLongDescription() );
+ s.delete( f );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testNonLazy() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Forest f = new Forest();
+ Tree t = new Tree();
+ t.setName( "Basic one" );
+ s.persist( f );
+ s.persist( t );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ f = (Forest) s.load( Forest.class, f.getId() );
+ t = (Tree) s.load( Tree.class, t.getId() );
+ assertFalse( "Default should be lazy", Hibernate.isInitialized( f ) );
+ assertTrue( "Tree is not lazy", Hibernate.isInitialized( t ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCache() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ ZipCode zc = new ZipCode();
+ zc.code = "92400";
+ s.persist( zc );
+ tx.commit();
+ s.close();
+ getSessions().getStatistics().clear();
+ getSessions().getStatistics().setStatisticsEnabled( true );
+ getSessions().evict( ZipCode.class );
+ s = openSession();
+ tx = s.beginTransaction();
+ s.get( ZipCode.class, zc.code );
+ assertEquals( 1, getSessions().getStatistics().getSecondLevelCachePutCount() );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.get( ZipCode.class, zc.code );
+ assertEquals( 1, getSessions().getStatistics().getSecondLevelCacheHitCount() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testFilter() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.createQuery( "delete Forest" ).executeUpdate();
+ Forest f1 = new Forest();
+ f1.setLength( 2 );
+ s.persist( f1 );
+ Forest f2 = new Forest();
+ f2.setLength( 20 );
+ s.persist( f2 );
+ Forest f3 = new Forest();
+ f3.setLength( 200 );
+ s.persist( f3 );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ s.enableFilter( "betweenLength" ).setParameter( "minLength", 5 ).setParameter( "maxLength", 50 );
+ long count = ( (Long) s.createQuery( "select count(*) from Forest" ).iterate().next() ).intValue();
+ assertEquals( 1, count );
+ s.disableFilter( "betweenLength" );
+ s.enableFilter( "minLength" ).setParameter( "minLength", 5 );
+ count = ( (Long) s.createQuery( "select count(*) from Forest" ).iterate().next() ).longValue();
+ assertEquals( 2l, count );
+ s.disableFilter( "minLength" );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testParameterizedType() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Forest f = new Forest();
+ f.setSmallText( "ThisIsASmallText" );
+ f.setBigText( "ThisIsABigText" );
+ s.persist( f );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ Forest f2 = (Forest) s.get( Forest.class, f.getId() );
+ assertEquals( f.getSmallText().toLowerCase(), f2.getSmallText() );
+ assertEquals( f.getBigText().toUpperCase(), f2.getBigText() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testSerialized() throws Exception {
+ Forest forest = new Forest();
+ forest.setName( "Shire" );
+ Country country = new Country();
+ country.setName( "Middle Earth" );
+ forest.setCountry( country );
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( forest );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ forest = (Forest) s.get( Forest.class, forest.getId() );
+ assertNotNull( forest );
+ assertNotNull( forest.getCountry() );
+ assertEquals( country.getName(), forest.getCountry().getName() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCompositeType() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Ransom r = new Ransom();
+ r.setKidnapperName( "Se7en" );
+ r.setDate( new Date() );
+ MonetaryAmount amount = new MonetaryAmount(
+ new BigDecimal( 100000 ),
+ Currency.getInstance( "EUR" )
+ );
+ r.setAmount( amount );
+ s.persist( r );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ r = (Ransom) s.get( Ransom.class, r.getId() );
+ assertNotNull( r );
+ assertNotNull( r.getAmount() );
+ assertTrue( 0 == new BigDecimal( 100000 ).compareTo( r.getAmount().getAmount() ) );
+ assertEquals( Currency.getInstance( "EUR" ), r.getAmount().getCurrency() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testFormula() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ org.hibernate.test.annotations.entity.Flight airFrance = new Flight();
+ airFrance.setId( new Long( 747 ) );
+ airFrance.setMaxAltitude( 10000 );
+ s.persist( airFrance );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ airFrance = (Flight) s.get( Flight.class, airFrance.getId() );
+ assertNotNull( airFrance );
+ assertEquals( 10000000, airFrance.getMaxAltitudeInMilimeter() );
+ s.delete( airFrance );
+ tx.commit();
+ s.close();
+ }
+
+ public BasicHibernateAnnotationsTest(String x) {
+ super( x );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Forest.class,
+ Tree.class,
+ Ransom.class,
+ ZipCode.class,
+ Flight.class
+ };
+ }
+
+ protected String[] getAnnotatedPackages() {
+ return new String[]{
+ "org.hibernate.test.annotations.entity"
+ };
+ }
+
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Bid.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Bid.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Bid.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,63 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Bid {
- private Integer id;
- private String description;
- private Starred note;
- private Starred editorsNote;
- private Boolean approved;
-
- @Enumerated(EnumType.STRING)
- //@Column(columnDefinition = "VARCHAR(10)")
- public Starred getEditorsNote() {
- return editorsNote;
- }
-
- public void setEditorsNote(Starred editorsNote) {
- this.editorsNote = editorsNote;
- }
-
- @Id
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public Starred getNote() {
- return note;
- }
-
- public void setNote(Starred note) {
- this.note = note;
- }
-
- public Boolean getApproved() {
- return approved;
- }
-
- public void setApproved(Boolean approved) {
- this.approved = approved;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Bid.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Bid.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Bid.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Bid.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,63 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Bid {
+ private Integer id;
+ private String description;
+ private Starred note;
+ private Starred editorsNote;
+ private Boolean approved;
+
+ @Enumerated(EnumType.STRING)
+ //@Column(columnDefinition = "VARCHAR(10)")
+ public Starred getEditorsNote() {
+ return editorsNote;
+ }
+
+ public void setEditorsNote(Starred editorsNote) {
+ this.editorsNote = editorsNote;
+ }
+
+ @Id
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ public Starred getNote() {
+ return note;
+ }
+
+ public void setNote(Starred note) {
+ this.note = note;
+ }
+
+ public Boolean getApproved() {
+ return approved;
+ }
+
+ public void setApproved(Boolean approved) {
+ this.approved = approved;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CasterStringType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CasterStringType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CasterStringType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,90 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import java.io.Serializable;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Types;
-import java.util.Properties;
-
-import org.hibernate.HibernateException;
-import org.hibernate.usertype.ParameterizedType;
-import org.hibernate.usertype.UserType;
-
-/**
- * Sample of parameter type
- *
- * @author Emmanuel Bernard
- */
-public class CasterStringType implements UserType, ParameterizedType {
- private static final String CAST = "cast";
- private Properties parameters;
-
- public int[] sqlTypes() {
- return new int[]{Types.VARCHAR};
- }
-
- public Class returnedClass() {
- return String.class;
- }
-
- public boolean equals(Object x, Object y) throws HibernateException {
- return ( x == y ) || ( x != null && x.equals( y ) );
- }
-
- public int hashCode(Object x) throws HibernateException {
- return x.hashCode();
- }
-
- public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
- String result = rs.getString( names[0] );
- if ( rs.wasNull() ) return null;
- if ( parameters.getProperty( CAST ).equals( "lower" ) ) {
- return result.toLowerCase();
- }
- else {
- return result.toUpperCase();
- }
- }
-
- public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
- if ( value == null ) {
- st.setNull( index, sqlTypes()[0] );
- }
- else {
- String string = (String) value;
- if ( parameters.getProperty( CAST ).equals( "lower" ) ) {
- string = string.toLowerCase();
- }
- else {
- string = string.toUpperCase();
- }
- st.setString( index, string );
- }
- }
-
- public Object deepCopy(Object value) throws HibernateException {
- return value;
- }
-
- public boolean isMutable() {
- return false;
- }
-
- public Serializable disassemble(Object value) throws HibernateException {
- return (Serializable) value;
- }
-
- public Object assemble(Serializable cached, Object owner) throws HibernateException {
- return cached;
- }
-
- public Object replace(Object original, Object target, Object owner) throws HibernateException {
- return original;
- }
-
- public void setParameterValues(Properties parameters) {
- this.parameters = parameters;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CasterStringType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CasterStringType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CasterStringType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CasterStringType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,90 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Types;
+import java.util.Properties;
+
+import org.hibernate.HibernateException;
+import org.hibernate.usertype.ParameterizedType;
+import org.hibernate.usertype.UserType;
+
+/**
+ * Sample of parameter type
+ *
+ * @author Emmanuel Bernard
+ */
+public class CasterStringType implements UserType, ParameterizedType {
+ private static final String CAST = "cast";
+ private Properties parameters;
+
+ public int[] sqlTypes() {
+ return new int[]{Types.VARCHAR};
+ }
+
+ public Class returnedClass() {
+ return String.class;
+ }
+
+ public boolean equals(Object x, Object y) throws HibernateException {
+ return ( x == y ) || ( x != null && x.equals( y ) );
+ }
+
+ public int hashCode(Object x) throws HibernateException {
+ return x.hashCode();
+ }
+
+ public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
+ String result = rs.getString( names[0] );
+ if ( rs.wasNull() ) return null;
+ if ( parameters.getProperty( CAST ).equals( "lower" ) ) {
+ return result.toLowerCase();
+ }
+ else {
+ return result.toUpperCase();
+ }
+ }
+
+ public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
+ if ( value == null ) {
+ st.setNull( index, sqlTypes()[0] );
+ }
+ else {
+ String string = (String) value;
+ if ( parameters.getProperty( CAST ).equals( "lower" ) ) {
+ string = string.toLowerCase();
+ }
+ else {
+ string = string.toUpperCase();
+ }
+ st.setString( index, string );
+ }
+ }
+
+ public Object deepCopy(Object value) throws HibernateException {
+ return value;
+ }
+
+ public boolean isMutable() {
+ return false;
+ }
+
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+
+ public void setParameterValues(Properties parameters) {
+ this.parameters = parameters;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CommunityBid.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CommunityBid.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CommunityBid.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class CommunityBid extends Bid {
- private Starred communityNote;
-
- public Starred getCommunityNote() {
- return communityNote;
- }
-
- public void setCommunityNote(Starred communityNote) {
- this.communityNote = communityNote;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CommunityBid.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CommunityBid.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CommunityBid.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/CommunityBid.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CommunityBid extends Bid {
+ private Starred communityNote;
+
+ public Starred getCommunityNote() {
+ return communityNote;
+ }
+
+ public void setCommunityNote(Starred communityNote) {
+ this.communityNote = communityNote;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Country.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Country.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Country.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import java.io.Serializable;
-
-/**
- * Serializable object to be serialized in DB as is
- *
- * @author Emmanuel Bernard
- */
-public class Country implements Serializable {
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Country.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Country.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Country.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Country.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import java.io.Serializable;
+
+/**
+ * Serializable object to be serialized in DB as is
+ *
+ * @author Emmanuel Bernard
+ */
+public class Country implements Serializable {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Flight.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Flight.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Flight.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.Table;
-
-import org.hibernate.annotations.Formula;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity()
- at Table(name = "Formula_flight")
- at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public class Flight implements Serializable {
- Long id;
- long maxAltitudeInMilimeter;
- long maxAltitude;
-
- @Id
- public Long getId() {
- return id;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-
- public long getMaxAltitude() {
- return maxAltitude;
- }
-
- public void setMaxAltitude(long maxAltitude) {
- this.maxAltitude = maxAltitude;
- }
-
- @Formula("maxAltitude * 1000")
- public long getMaxAltitudeInMilimeter() {
- return maxAltitudeInMilimeter;
- }
-
- public void setMaxAltitudeInMilimeter(long maxAltitudeInMilimeter) {
- this.maxAltitudeInMilimeter = maxAltitudeInMilimeter;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Flight.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Flight.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Flight.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Flight.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Formula;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Table(name = "Formula_flight")
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Flight implements Serializable {
+ Long id;
+ long maxAltitudeInMilimeter;
+ long maxAltitude;
+
+ @Id
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+
+ public long getMaxAltitude() {
+ return maxAltitude;
+ }
+
+ public void setMaxAltitude(long maxAltitude) {
+ this.maxAltitude = maxAltitude;
+ }
+
+ @Formula("maxAltitude * 1000")
+ public long getMaxAltitudeInMilimeter() {
+ return maxAltitudeInMilimeter;
+ }
+
+ public void setMaxAltitudeInMilimeter(long maxAltitudeInMilimeter) {
+ this.maxAltitudeInMilimeter = maxAltitudeInMilimeter;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Forest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Forest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Forest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,111 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-
-import org.hibernate.annotations.BatchSize;
-import org.hibernate.annotations.Filter;
-import org.hibernate.annotations.FilterDef;
-import org.hibernate.annotations.Filters;
-import org.hibernate.annotations.Index;
-import org.hibernate.annotations.OptimisticLockType;
-import org.hibernate.annotations.ParamDef;
-import org.hibernate.annotations.Parameter;
-import org.hibernate.annotations.PolymorphismType;
-import org.hibernate.annotations.Type;
-import org.hibernate.annotations.Where;
-
-/**
- * Use hibernate specific annotations
- *
- * @author Emmanuel Bernard
- */
- at Entity
- at BatchSize(size = 5)
- at org.hibernate.annotations.Entity(
- selectBeforeUpdate = true,
- dynamicInsert = true, dynamicUpdate = true,
- optimisticLock = OptimisticLockType.ALL,
- polymorphism = PolymorphismType.EXPLICIT)
- at Where(clause = "1=1")
- at FilterDef(name = "minLength", parameters = {@ParamDef(name = "minLength", type = "integer")})
- at Filters({
- at Filter(name = "betweenLength"),
- at Filter(name = "minLength", condition = ":minLength <= length")
- })
- at org.hibernate.annotations.Table(appliesTo = "Forest",
- indexes = {@Index(name = "idx", columnNames = {"name", "length"})})
-public class Forest {
- private Integer id;
- private String name;
- private long length;
- private String longDescription;
- private String smallText;
- private String bigText;
- private Country country;
-
- @Type(type = "text")
- public String getLongDescription() {
- return longDescription;
- }
-
- public void setLongDescription(String longDescription) {
- this.longDescription = longDescription;
- }
-
- public long getLength() {
- return length;
- }
-
- public void setLength(long length) {
- this.length = length;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Type(type = "caster")
- public String getSmallText() {
- return smallText;
- }
-
- @Type(type = "caster", parameters = {@Parameter(name = "cast", value = "upper")})
- public String getBigText() {
- return bigText;
- }
-
- public void setSmallText(String smallText) {
- this.smallText = smallText;
- }
-
- public void setBigText(String bigText) {
- this.bigText = bigText;
- }
-
- @Lob
- public Country getCountry() {
- return country;
- }
-
- public void setCountry(Country country) {
- this.country = country;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Forest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Forest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Forest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Forest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,111 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+import org.hibernate.annotations.BatchSize;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.Filters;
+import org.hibernate.annotations.Index;
+import org.hibernate.annotations.OptimisticLockType;
+import org.hibernate.annotations.ParamDef;
+import org.hibernate.annotations.Parameter;
+import org.hibernate.annotations.PolymorphismType;
+import org.hibernate.annotations.Type;
+import org.hibernate.annotations.Where;
+
+/**
+ * Use hibernate specific annotations
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at BatchSize(size = 5)
+ at org.hibernate.annotations.Entity(
+ selectBeforeUpdate = true,
+ dynamicInsert = true, dynamicUpdate = true,
+ optimisticLock = OptimisticLockType.ALL,
+ polymorphism = PolymorphismType.EXPLICIT)
+ at Where(clause = "1=1")
+ at FilterDef(name = "minLength", parameters = {@ParamDef(name = "minLength", type = "integer")})
+ at Filters({
+ at Filter(name = "betweenLength"),
+ at Filter(name = "minLength", condition = ":minLength <= length")
+ })
+ at org.hibernate.annotations.Table(appliesTo = "Forest",
+ indexes = {@Index(name = "idx", columnNames = {"name", "length"})})
+public class Forest {
+ private Integer id;
+ private String name;
+ private long length;
+ private String longDescription;
+ private String smallText;
+ private String bigText;
+ private Country country;
+
+ @Type(type = "text")
+ public String getLongDescription() {
+ return longDescription;
+ }
+
+ public void setLongDescription(String longDescription) {
+ this.longDescription = longDescription;
+ }
+
+ public long getLength() {
+ return length;
+ }
+
+ public void setLength(long length) {
+ this.length = length;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Type(type = "caster")
+ public String getSmallText() {
+ return smallText;
+ }
+
+ @Type(type = "caster", parameters = {@Parameter(name = "cast", value = "upper")})
+ public String getBigText() {
+ return bigText;
+ }
+
+ public void setSmallText(String smallText) {
+ this.smallText = smallText;
+ }
+
+ public void setBigText(String bigText) {
+ this.bigText = bigText;
+ }
+
+ @Lob
+ public Country getCountry() {
+ return country;
+ }
+
+ public void setCountry(Country country) {
+ this.country = country;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Java5FeaturesTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Java5FeaturesTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Java5FeaturesTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,115 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Java5FeaturesTest extends TestCase {
- public void testInterface() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Race r = new Race();
- r.setId( new Integer( 1 ) );
- r.setLength( new Long( 3 ) );
- s.persist( r );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- r = (Race) s.get( Race.class, r.getId() );
- assertEquals( new Long( 3 ), r.getLength() );
- tx.commit();
- s.close();
-
- }
-
- public void testEnums() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- CommunityBid communityBid = new CommunityBid();
- communityBid.setId( new Integer( 2 ) );
- communityBid.setCommunityNote( Starred.OK );
- Bid bid = new Bid();
- bid.setId( new Integer( 1 ) );
- bid.setDescription( "My best one" );
- bid.setNote( Starred.OK );
- bid.setEditorsNote( Starred.GOOD );
- s.persist( bid );
- s.persist( communityBid );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- //bid = (Bid) s.get( Bid.class, bid.getId() );
- bid = (Bid)s.createQuery( "select b from Bid b where b.note = " +
- Starred.class.getName() + ".OK and b.editorsNote = " +
- Starred.class.getName() + ".GOOD and b.id = :id")
- .setParameter( "id", bid.getId() ).uniqueResult();
- //testing constant value
- assertEquals( Starred.OK, bid.getNote() );
- assertEquals( Starred.GOOD, bid.getEditorsNote() );
- bid.setNote( null );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- bid = (Bid) s.get( Bid.class, bid.getId() );
- communityBid = (CommunityBid) s.get( CommunityBid.class, communityBid.getId() );
- assertNull( bid.getNote() );
- assertEquals( Starred.OK, communityBid.getCommunityNote() );
- s.delete( bid );
- s.clear();
- communityBid = (CommunityBid) s.createSQLQuery( "select {b.*} from Bid b where b.id = ?" )
- .addEntity( "b", CommunityBid.class )
- .setInteger( 0, communityBid.getId() ).uniqueResult();
- assertEquals( Starred.OK, communityBid.getCommunityNote() );
- s.delete( communityBid );
- tx.commit();
- s.close();
- }
-
- public void testAutoboxing() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Bid bid = new Bid();
- bid.setId( new Integer( 2 ) );
- bid.setDescription( "My best one" );
- bid.setNote( Starred.OK );
- bid.setEditorsNote( Starred.GOOD );
- bid.setApproved( null );
- s.persist( bid );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- bid = (Bid) s.get( Bid.class, bid.getId() );
- assertEquals( null, bid.getApproved() );
- s.delete( bid );
- tx.commit();
- s.close();
- }
-
- public Java5FeaturesTest(String x) {
- super( x );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Race.class,
- Bid.class,
- CommunityBid.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Java5FeaturesTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Java5FeaturesTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Java5FeaturesTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Java5FeaturesTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,115 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Java5FeaturesTest extends TestCase {
+ public void testInterface() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Race r = new Race();
+ r.setId( new Integer( 1 ) );
+ r.setLength( new Long( 3 ) );
+ s.persist( r );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ r = (Race) s.get( Race.class, r.getId() );
+ assertEquals( new Long( 3 ), r.getLength() );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testEnums() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ CommunityBid communityBid = new CommunityBid();
+ communityBid.setId( new Integer( 2 ) );
+ communityBid.setCommunityNote( Starred.OK );
+ Bid bid = new Bid();
+ bid.setId( new Integer( 1 ) );
+ bid.setDescription( "My best one" );
+ bid.setNote( Starred.OK );
+ bid.setEditorsNote( Starred.GOOD );
+ s.persist( bid );
+ s.persist( communityBid );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ //bid = (Bid) s.get( Bid.class, bid.getId() );
+ bid = (Bid)s.createQuery( "select b from Bid b where b.note = " +
+ Starred.class.getName() + ".OK and b.editorsNote = " +
+ Starred.class.getName() + ".GOOD and b.id = :id")
+ .setParameter( "id", bid.getId() ).uniqueResult();
+ //testing constant value
+ assertEquals( Starred.OK, bid.getNote() );
+ assertEquals( Starred.GOOD, bid.getEditorsNote() );
+ bid.setNote( null );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ bid = (Bid) s.get( Bid.class, bid.getId() );
+ communityBid = (CommunityBid) s.get( CommunityBid.class, communityBid.getId() );
+ assertNull( bid.getNote() );
+ assertEquals( Starred.OK, communityBid.getCommunityNote() );
+ s.delete( bid );
+ s.clear();
+ communityBid = (CommunityBid) s.createSQLQuery( "select {b.*} from Bid b where b.id = ?" )
+ .addEntity( "b", CommunityBid.class )
+ .setInteger( 0, communityBid.getId() ).uniqueResult();
+ assertEquals( Starred.OK, communityBid.getCommunityNote() );
+ s.delete( communityBid );
+ tx.commit();
+ s.close();
+ }
+
+ public void testAutoboxing() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Bid bid = new Bid();
+ bid.setId( new Integer( 2 ) );
+ bid.setDescription( "My best one" );
+ bid.setNote( Starred.OK );
+ bid.setEditorsNote( Starred.GOOD );
+ bid.setApproved( null );
+ s.persist( bid );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ bid = (Bid) s.get( Bid.class, bid.getId() );
+ assertEquals( null, bid.getApproved() );
+ s.delete( bid );
+ tx.commit();
+ s.close();
+ }
+
+ public Java5FeaturesTest(String x) {
+ super( x );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Race.class,
+ Bid.class,
+ CommunityBid.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Length.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Length.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Length.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,9 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Length<Type> {
- Type getLength();
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Length.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Length.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Length.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Length.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,9 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Length<Type> {
+ Type getLength();
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmount.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmount.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmount.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.Currency;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MonetaryAmount implements Serializable {
-
- private BigDecimal amount;
- private Currency currency;
-
- public MonetaryAmount(BigDecimal amount, Currency currency) {
- this.amount = amount;
- this.currency = currency;
- }
-
- public BigDecimal getAmount() {
- return amount;
- }
-
- public void setAmount(BigDecimal amount) {
- this.amount = amount;
- }
-
- public Currency getCurrency() {
- return currency;
- }
-
- public void setCurrency(Currency currency) {
- this.currency = currency;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmount.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmount.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmount.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmount.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Currency;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MonetaryAmount implements Serializable {
+
+ private BigDecimal amount;
+ private Currency currency;
+
+ public MonetaryAmount(BigDecimal amount, Currency currency) {
+ this.amount = amount;
+ this.currency = currency;
+ }
+
+ public BigDecimal getAmount() {
+ return amount;
+ }
+
+ public void setAmount(BigDecimal amount) {
+ this.amount = amount;
+ }
+
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(Currency currency) {
+ this.currency = currency;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,106 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.util.Currency;
-
-import org.hibernate.Hibernate;
-import org.hibernate.HibernateException;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.type.Type;
-import org.hibernate.usertype.CompositeUserType;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MonetaryAmountUserType implements CompositeUserType {
-
- public String[] getPropertyNames() {
- return new String[]{"amount", "currency"};
- }
-
- public Type[] getPropertyTypes() {
- return new Type[]{Hibernate.BIG_DECIMAL, Hibernate.CURRENCY};
- }
-
- public Object getPropertyValue(Object component, int property) throws HibernateException {
- MonetaryAmount ma = (MonetaryAmount) component;
- return property == 0 ? (Object) ma.getAmount() : (Object) ma.getCurrency();
- }
-
- public void setPropertyValue(Object component, int property, Object value)
- throws HibernateException {
- MonetaryAmount ma = (MonetaryAmount) component;
- if ( property == 0 ) {
- ma.setAmount( (BigDecimal) value );
- }
- else {
- ma.setCurrency( (Currency) value );
- }
- }
-
- public Class returnedClass() {
- return MonetaryAmount.class;
- }
-
- public boolean equals(Object x, Object y) throws HibernateException {
- if ( x == y ) return true;
- if ( x == null || y == null ) return false;
- MonetaryAmount mx = (MonetaryAmount) x;
- MonetaryAmount my = (MonetaryAmount) y;
- return mx.getAmount().equals( my.getAmount() ) &&
- mx.getCurrency().equals( my.getCurrency() );
- }
-
- public int hashCode(Object x) throws HibernateException {
- return ( (MonetaryAmount) x ).getAmount().hashCode();
- }
-
- public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
- throws HibernateException, SQLException {
- BigDecimal amt = (BigDecimal) Hibernate.BIG_DECIMAL.nullSafeGet( rs, names[0] );
- Currency cur = (Currency) Hibernate.CURRENCY.nullSafeGet( rs, names[1] );
- if ( amt == null ) return null;
- return new MonetaryAmount( amt, cur );
- }
-
- public void nullSafeSet(
- PreparedStatement st, Object value, int index,
- SessionImplementor session
- ) throws HibernateException, SQLException {
- MonetaryAmount ma = (MonetaryAmount) value;
- BigDecimal amt = ma == null ? null : ma.getAmount();
- Currency cur = ma == null ? null : ma.getCurrency();
- Hibernate.BIG_DECIMAL.nullSafeSet( st, amt, index );
- Hibernate.CURRENCY.nullSafeSet( st, cur, index + 1 );
- }
-
- public Object deepCopy(Object value) throws HibernateException {
- MonetaryAmount ma = (MonetaryAmount) value;
- return new MonetaryAmount( ma.getAmount(), ma.getCurrency() );
- }
-
- public boolean isMutable() {
- return true;
- }
-
- public Serializable disassemble(Object value, SessionImplementor session)
- throws HibernateException {
- return (Serializable) deepCopy( value );
- }
-
- public Object assemble(Serializable cached, SessionImplementor session, Object owner)
- throws HibernateException {
- return deepCopy( cached );
- }
-
- public Object replace(Object original, Object target, SessionImplementor session, Object owner)
- throws HibernateException {
- return deepCopy( original ); //TODO: improve
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/MonetaryAmountUserType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,106 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.Currency;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.type.Type;
+import org.hibernate.usertype.CompositeUserType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MonetaryAmountUserType implements CompositeUserType {
+
+ public String[] getPropertyNames() {
+ return new String[]{"amount", "currency"};
+ }
+
+ public Type[] getPropertyTypes() {
+ return new Type[]{Hibernate.BIG_DECIMAL, Hibernate.CURRENCY};
+ }
+
+ public Object getPropertyValue(Object component, int property) throws HibernateException {
+ MonetaryAmount ma = (MonetaryAmount) component;
+ return property == 0 ? (Object) ma.getAmount() : (Object) ma.getCurrency();
+ }
+
+ public void setPropertyValue(Object component, int property, Object value)
+ throws HibernateException {
+ MonetaryAmount ma = (MonetaryAmount) component;
+ if ( property == 0 ) {
+ ma.setAmount( (BigDecimal) value );
+ }
+ else {
+ ma.setCurrency( (Currency) value );
+ }
+ }
+
+ public Class returnedClass() {
+ return MonetaryAmount.class;
+ }
+
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if ( x == y ) return true;
+ if ( x == null || y == null ) return false;
+ MonetaryAmount mx = (MonetaryAmount) x;
+ MonetaryAmount my = (MonetaryAmount) y;
+ return mx.getAmount().equals( my.getAmount() ) &&
+ mx.getCurrency().equals( my.getCurrency() );
+ }
+
+ public int hashCode(Object x) throws HibernateException {
+ return ( (MonetaryAmount) x ).getAmount().hashCode();
+ }
+
+ public Object nullSafeGet(ResultSet rs, String[] names, SessionImplementor session, Object owner)
+ throws HibernateException, SQLException {
+ BigDecimal amt = (BigDecimal) Hibernate.BIG_DECIMAL.nullSafeGet( rs, names[0] );
+ Currency cur = (Currency) Hibernate.CURRENCY.nullSafeGet( rs, names[1] );
+ if ( amt == null ) return null;
+ return new MonetaryAmount( amt, cur );
+ }
+
+ public void nullSafeSet(
+ PreparedStatement st, Object value, int index,
+ SessionImplementor session
+ ) throws HibernateException, SQLException {
+ MonetaryAmount ma = (MonetaryAmount) value;
+ BigDecimal amt = ma == null ? null : ma.getAmount();
+ Currency cur = ma == null ? null : ma.getCurrency();
+ Hibernate.BIG_DECIMAL.nullSafeSet( st, amt, index );
+ Hibernate.CURRENCY.nullSafeSet( st, cur, index + 1 );
+ }
+
+ public Object deepCopy(Object value) throws HibernateException {
+ MonetaryAmount ma = (MonetaryAmount) value;
+ return new MonetaryAmount( ma.getAmount(), ma.getCurrency() );
+ }
+
+ public boolean isMutable() {
+ return true;
+ }
+
+ public Serializable disassemble(Object value, SessionImplementor session)
+ throws HibernateException {
+ return (Serializable) deepCopy( value );
+ }
+
+ public Object assemble(Serializable cached, SessionImplementor session, Object owner)
+ throws HibernateException {
+ return deepCopy( cached );
+ }
+
+ public Object replace(Object original, Object target, SessionImplementor session, Object owner)
+ throws HibernateException {
+ return deepCopy( original ); //TODO: improve
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,62 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class PropertyDefaultMappingsTest extends TestCase {
- public PropertyDefaultMappingsTest(String x) {
- super( x );
- }
-
- public void testSerializableObject() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Country c = new Country();
- c.setName( "France" );
- Address a = new Address();
- a.setCity( "Paris" );
- a.setCountry( c );
- s.persist( a );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Address reloadedAddress = (Address) s.get( Address.class, a.getId() );
- assertNotNull( reloadedAddress );
- assertNotNull( reloadedAddress.getCountry() );
- assertEquals( a.getCountry().getName(), reloadedAddress.getCountry().getName() );
- tx.rollback();
- s.close();
- }
-
- public void testTransientField() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- WashingMachine wm = new WashingMachine();
- wm.setActive( true );
- s.persist( wm );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- wm = (WashingMachine) s.get( WashingMachine.class, wm.getId() );
- assertFalse( "transient should not be persistent", wm.isActive() );
- s.delete( wm );
- tx.commit();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Address.class,
- WashingMachine.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/PropertyDefaultMappingsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,62 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PropertyDefaultMappingsTest extends TestCase {
+ public PropertyDefaultMappingsTest(String x) {
+ super( x );
+ }
+
+ public void testSerializableObject() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Country c = new Country();
+ c.setName( "France" );
+ Address a = new Address();
+ a.setCity( "Paris" );
+ a.setCountry( c );
+ s.persist( a );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Address reloadedAddress = (Address) s.get( Address.class, a.getId() );
+ assertNotNull( reloadedAddress );
+ assertNotNull( reloadedAddress.getCountry() );
+ assertEquals( a.getCountry().getName(), reloadedAddress.getCountry().getName() );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testTransientField() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ WashingMachine wm = new WashingMachine();
+ wm.setActive( true );
+ s.persist( wm );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ wm = (WashingMachine) s.get( WashingMachine.class, wm.getId() );
+ assertFalse( "transient should not be persistent", wm.isActive() );
+ s.delete( wm );
+ tx.commit();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Address.class,
+ WashingMachine.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Race.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Race.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Race.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Race implements Length<Long> {
- private Long length;
- private Integer id;
-
- @Id
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public Long getLength() {
- return length;
- }
-
- public void setLength(Long length) {
- this.length = length;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Race.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Race.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Race.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Race.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Race implements Length<Long> {
+ private Long length;
+ private Integer id;
+
+ @Id
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Long getLength() {
+ return length;
+ }
+
+ public void setLength(Long length) {
+ this.length = length;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Ransom.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Ransom.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Ransom.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,61 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import org.hibernate.annotations.Columns;
-import org.hibernate.annotations.Type;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Ransom {
- private Integer id;
- private String kidnapperName;
- private MonetaryAmount amount;
- private Date date;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getKidnapperName() {
- return kidnapperName;
- }
-
- public void setKidnapperName(String kidnapperName) {
- this.kidnapperName = kidnapperName;
- }
-
- @Type(type = "org.hibernate.test.annotations.entity.MonetaryAmountUserType")
- @Columns(columns = {
- @Column(name = "r_amount"),
- @Column(name = "r_currency")
- })
- public MonetaryAmount getAmount() {
- return amount;
- }
-
- public void setAmount(MonetaryAmount amount) {
- this.amount = amount;
- }
-
- public Date getDate() {
- return date;
- }
-
- public void setDate(Date date) {
- this.date = date;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Ransom.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Ransom.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Ransom.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Ransom.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,61 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Columns;
+import org.hibernate.annotations.Type;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Ransom {
+ private Integer id;
+ private String kidnapperName;
+ private MonetaryAmount amount;
+ private Date date;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getKidnapperName() {
+ return kidnapperName;
+ }
+
+ public void setKidnapperName(String kidnapperName) {
+ this.kidnapperName = kidnapperName;
+ }
+
+ @Type(type = "org.hibernate.test.annotations.entity.MonetaryAmountUserType")
+ @Columns(columns = {
+ @Column(name = "r_amount"),
+ @Column(name = "r_currency")
+ })
+ public MonetaryAmount getAmount() {
+ return amount;
+ }
+
+ public void setAmount(MonetaryAmount amount) {
+ this.amount = amount;
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Starred.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Starred.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Starred.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-package org.hibernate.test.annotations.entity;
-
-/**
- * @author Emmanuel Bernard
- */
-public enum Starred {
- BAD,
- OK,
- GOOD
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Starred.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Starred.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Starred.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Starred.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+package org.hibernate.test.annotations.entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum Starred {
+ BAD,
+ OK,
+ GOOD
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Tree.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Tree.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Tree.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import org.hibernate.annotations.Proxy;
-
-/**
- * Non lazy entity
- *
- * @author Emmanuel Bernard
- */
- at Entity
- at Proxy(lazy = false)
-public class Tree {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Tree.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Tree.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Tree.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/Tree.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Proxy;
+
+/**
+ * Non lazy entity
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Proxy(lazy = false)
+public class Tree {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/WashingMachine.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/WashingMachine.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/WashingMachine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class WashingMachine {
- @Id
- @GeneratedValue
- private Integer id;
- private transient boolean isActive;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public boolean isActive() {
- return isActive;
- }
-
- public void setActive(boolean active) {
- isActive = active;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/WashingMachine.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/WashingMachine.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/WashingMachine.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/WashingMachine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class WashingMachine {
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private transient boolean isActive;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public boolean isActive() {
+ return isActive;
+ }
+
+ public void setActive(boolean active) {
+ isActive = active;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/ZipCode.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/ZipCode.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/ZipCode.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entity;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-import org.hibernate.annotations.Cache;
-import org.hibernate.annotations.CacheConcurrencyStrategy;
-
-/**
- * @author Emmanuel Bernard
- */
- at Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
- at Entity
- at org.hibernate.annotations.Entity(mutable = false)
-public class ZipCode {
- @Id
- public String code;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/ZipCode.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/ZipCode.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/ZipCode.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/ZipCode.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.test.annotations.entity;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Cache;
+import org.hibernate.annotations.CacheConcurrencyStrategy;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
+ at Entity
+ at org.hibernate.annotations.Entity(mutable = false)
+public class ZipCode {
+ @Id
+ public String code;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/package-info.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/package-info.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-/**
- * Test package for metatata facilities
- * It contains an example of filter metadata
- */
- at FilterDefs(
- {
- @FilterDef(
- name = "betweenLength",
- defaultCondition = ":minLength <= length and :maxLength >= length",
- parameters = {
- @ParamDef(name = "minLength", type = "integer"),
- @ParamDef(name = "maxLength", type = "integer")
- }
- )
- }
-)
- at TypeDefs(
- {
- @TypeDef(
- name = "caster",
- typeClass = CasterStringType.class,
- parameters = {
- @Parameter(name = "cast", value = "lower")
- }
- )
- }
-) package org.hibernate.test.annotations.entity;
-
-import org.hibernate.annotations.FilterDef;
-import org.hibernate.annotations.FilterDefs;
-import org.hibernate.annotations.ParamDef;
-import org.hibernate.annotations.Parameter;
-import org.hibernate.annotations.TypeDef;
-import org.hibernate.annotations.TypeDefs;
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/package-info.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/package-info.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/package-info.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entity/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+/**
+ * Test package for metatata facilities
+ * It contains an example of filter metadata
+ */
+ at FilterDefs(
+ {
+ @FilterDef(
+ name = "betweenLength",
+ defaultCondition = ":minLength <= length and :maxLength >= length",
+ parameters = {
+ @ParamDef(name = "minLength", type = "integer"),
+ @ParamDef(name = "maxLength", type = "integer")
+ }
+ )
+ }
+)
+ at TypeDefs(
+ {
+ @TypeDef(
+ name = "caster",
+ typeClass = CasterStringType.class,
+ parameters = {
+ @Parameter(name = "cast", value = "lower")
+ }
+ )
+ }
+) package org.hibernate.test.annotations.entity;
+
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.FilterDefs;
+import org.hibernate.annotations.ParamDef;
+import org.hibernate.annotations.Parameter;
+import org.hibernate.annotations.TypeDef;
+import org.hibernate.annotations.TypeDefs;
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Cellular.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Cellular.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Cellular.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,9 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entitynonentity;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Cellular extends Phone {
- String brand;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Cellular.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Cellular.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Cellular.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Cellular.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,9 @@
+//$Id$
+package org.hibernate.test.annotations.entitynonentity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Cellular extends Phone {
+ String brand;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Communication.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Communication.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Communication.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,9 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entitynonentity;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Communication extends Interaction {
- String species;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Communication.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Communication.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Communication.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Communication.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,9 @@
+//$Id$
+package org.hibernate.test.annotations.entitynonentity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Communication extends Interaction {
+ String species;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entitynonentity;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EntityNonEntityTest extends TestCase {
- public void testMix() throws Exception {
- GSM gsm = new GSM();
- gsm.brand = "Sony";
- gsm.frequency = 900;
- gsm.isNumeric = true;
- gsm.number = 2;
- gsm.species = "human";
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist( gsm );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- gsm = (GSM) s.get( GSM.class, gsm.id );
- assertEquals( "top mapped superclass", 2, gsm.number );
- assertNull( "non entity between mapped superclass and entity", gsm.species );
- assertTrue( "mapped superclass under entity", gsm.isNumeric );
- assertNull( "non entity under entity", gsm.brand );
- assertEquals( "leaf entity", 900, gsm.frequency );
- s.delete( gsm );
- tx.commit();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Phone.class,
- Voice.class,
- GSM.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/EntityNonEntityTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id$
+package org.hibernate.test.annotations.entitynonentity;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EntityNonEntityTest extends TestCase {
+ public void testMix() throws Exception {
+ GSM gsm = new GSM();
+ gsm.brand = "Sony";
+ gsm.frequency = 900;
+ gsm.isNumeric = true;
+ gsm.number = 2;
+ gsm.species = "human";
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( gsm );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ gsm = (GSM) s.get( GSM.class, gsm.id );
+ assertEquals( "top mapped superclass", 2, gsm.number );
+ assertNull( "non entity between mapped superclass and entity", gsm.species );
+ assertTrue( "mapped superclass under entity", gsm.isNumeric );
+ assertNull( "non entity under entity", gsm.brand );
+ assertEquals( "leaf entity", 900, gsm.frequency );
+ s.delete( gsm );
+ tx.commit();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Phone.class,
+ Voice.class,
+ GSM.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/GSM.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/GSM.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/GSM.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entitynonentity;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class GSM extends Cellular {
- int frequency;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/GSM.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/GSM.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/GSM.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/GSM.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id$
+package org.hibernate.test.annotations.entitynonentity;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GSM extends Cellular {
+ int frequency;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Interaction.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Interaction.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Interaction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entitynonentity;
-
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Interaction {
- public int number;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Interaction.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Interaction.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Interaction.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Interaction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id$
+package org.hibernate.test.annotations.entitynonentity;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Interaction {
+ public int number;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Phone.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Phone.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Phone.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entitynonentity;
-
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Phone extends Voice {
- boolean isNumeric;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Phone.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Phone.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Phone.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Phone.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id$
+package org.hibernate.test.annotations.entitynonentity;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Phone extends Voice {
+ boolean isNumeric;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Voice.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Voice.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Voice.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.entitynonentity;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.JOINED)
-public class Voice extends Communication {
- @Id
- @GeneratedValue
- public Integer id;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Voice.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Voice.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Voice.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/entitynonentity/Voice.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.test.annotations.entitynonentity;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+public class Voice extends Communication {
+ @Id
+ @GeneratedValue
+ public Integer id;
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/FetchingTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/FetchingTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/FetchingTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,104 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.fetch;
-
-import java.util.Date;
-
-import org.hibernate.Hibernate;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FetchingTest extends TestCase {
- public void testLazy() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Person p = new Person( "Gavin", "King", "JBoss Inc" );
- Stay stay = new Stay( p, new Date(), new Date(), "A380", "Blah", "Blah" );
- p.addStay( stay );
- s.persist( p );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- p = (Person) s.createQuery( "from Person p where p.firstName = :name" )
- .setParameter( "name", "Gavin" ).uniqueResult();
- assertFalse( Hibernate.isInitialized( p.getStays() ) );
- s.delete( p );
- tx.commit();
- s.close();
- }
-
- public void testExtraLazy() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Person p = new Person( "Gavin", "King", "JBoss Inc" );
- Stay stay = new Stay( p, new Date(), new Date(), "A380", "Blah", "Blah" );
- p.getOrderedStay().add( stay );
- s.persist( p );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- p = (Person) s.createQuery( "from Person p where p.firstName = :name" )
- .setParameter( "name", "Gavin" ).uniqueResult();
- assertFalse( Hibernate.isInitialized( p.getOrderedStay() ) );
- assertEquals( 1, p.getOrderedStay().size() );
- assertFalse( Hibernate.isInitialized( p.getOrderedStay() ) );
- assertEquals( "A380", p.getOrderedStay().get(0).getVessel() );
- assertFalse( Hibernate.isInitialized( p.getOrderedStay() ) );
- s.delete( p );
- tx.commit();
- s.close();
- }
-
- public void testHibernateFetchingLazy() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Person p = new Person( "Gavin", "King", "JBoss Inc" );
- Stay stay = new Stay( null, new Date(), new Date(), "A380", "Blah", "Blah" );
- Stay stay2 = new Stay( null, new Date(), new Date(), "A320", "Blah", "Blah" );
- Stay stay3 = new Stay( null, new Date(), new Date(), "A340", "Blah", "Blah" );
- stay.setOldPerson( p );
- stay2.setVeryOldPerson( p );
- stay3.setVeryOldPerson( p );
- p.addOldStay( stay );
- p.addVeryOldStay( stay2 );
- p.addVeryOldStay( stay3 );
- s.persist( p );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- p = (Person) s.createQuery( "from Person p where p.firstName = :name" )
- .setParameter( "name", "Gavin" ).uniqueResult();
- assertFalse( Hibernate.isInitialized( p.getOldStays() ) );
- assertEquals( 1, p.getOldStays().size() );
- assertFalse( "lazy extra is failing", Hibernate.isInitialized( p.getOldStays() ) );
- s.clear();
- stay = (Stay) s.get( Stay.class, stay.getId() );
- assertTrue( ! Hibernate.isInitialized( stay.getOldPerson() ) );
- s.clear();
- stay3 = (Stay) s.get( Stay.class, stay3.getId() );
- assertTrue( "FetchMode.JOIN should overrides lazy options", Hibernate.isInitialized( stay3.getVeryOldPerson() ) );
- s.delete( stay3.getVeryOldPerson() );
- tx.commit();
- s.close();
- }
-
- public FetchingTest(String x) {
- super( x );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Person.class,
- Stay.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/FetchingTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/FetchingTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/FetchingTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/FetchingTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,104 @@
+//$Id$
+package org.hibernate.test.annotations.fetch;
+
+import java.util.Date;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FetchingTest extends TestCase {
+ public void testLazy() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Person p = new Person( "Gavin", "King", "JBoss Inc" );
+ Stay stay = new Stay( p, new Date(), new Date(), "A380", "Blah", "Blah" );
+ p.addStay( stay );
+ s.persist( p );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ p = (Person) s.createQuery( "from Person p where p.firstName = :name" )
+ .setParameter( "name", "Gavin" ).uniqueResult();
+ assertFalse( Hibernate.isInitialized( p.getStays() ) );
+ s.delete( p );
+ tx.commit();
+ s.close();
+ }
+
+ public void testExtraLazy() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Person p = new Person( "Gavin", "King", "JBoss Inc" );
+ Stay stay = new Stay( p, new Date(), new Date(), "A380", "Blah", "Blah" );
+ p.getOrderedStay().add( stay );
+ s.persist( p );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ p = (Person) s.createQuery( "from Person p where p.firstName = :name" )
+ .setParameter( "name", "Gavin" ).uniqueResult();
+ assertFalse( Hibernate.isInitialized( p.getOrderedStay() ) );
+ assertEquals( 1, p.getOrderedStay().size() );
+ assertFalse( Hibernate.isInitialized( p.getOrderedStay() ) );
+ assertEquals( "A380", p.getOrderedStay().get(0).getVessel() );
+ assertFalse( Hibernate.isInitialized( p.getOrderedStay() ) );
+ s.delete( p );
+ tx.commit();
+ s.close();
+ }
+
+ public void testHibernateFetchingLazy() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Person p = new Person( "Gavin", "King", "JBoss Inc" );
+ Stay stay = new Stay( null, new Date(), new Date(), "A380", "Blah", "Blah" );
+ Stay stay2 = new Stay( null, new Date(), new Date(), "A320", "Blah", "Blah" );
+ Stay stay3 = new Stay( null, new Date(), new Date(), "A340", "Blah", "Blah" );
+ stay.setOldPerson( p );
+ stay2.setVeryOldPerson( p );
+ stay3.setVeryOldPerson( p );
+ p.addOldStay( stay );
+ p.addVeryOldStay( stay2 );
+ p.addVeryOldStay( stay3 );
+ s.persist( p );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ p = (Person) s.createQuery( "from Person p where p.firstName = :name" )
+ .setParameter( "name", "Gavin" ).uniqueResult();
+ assertFalse( Hibernate.isInitialized( p.getOldStays() ) );
+ assertEquals( 1, p.getOldStays().size() );
+ assertFalse( "lazy extra is failing", Hibernate.isInitialized( p.getOldStays() ) );
+ s.clear();
+ stay = (Stay) s.get( Stay.class, stay.getId() );
+ assertTrue( ! Hibernate.isInitialized( stay.getOldPerson() ) );
+ s.clear();
+ stay3 = (Stay) s.get( Stay.class, stay3.getId() );
+ assertTrue( "FetchMode.JOIN should overrides lazy options", Hibernate.isInitialized( stay3.getVeryOldPerson() ) );
+ s.delete( stay3.getVeryOldPerson() );
+ tx.commit();
+ s.close();
+ }
+
+ public FetchingTest(String x) {
+ super( x );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Person.class,
+ Stay.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Person.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Person.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Person.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,176 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.fetch;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-
-import org.hibernate.annotations.Fetch;
-import org.hibernate.annotations.FetchMode;
-import org.hibernate.annotations.LazyCollection;
-import org.hibernate.annotations.LazyCollectionOption;
-import org.hibernate.annotations.IndexColumn;
-
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "Person")
-public class Person implements Serializable {
-
- // member declaration
- private int id;
- private String firstName;
- private String lastName;
- private String companyName;
- private Collection<Stay> stays;
- private Collection<Stay> oldStays;
- private Collection<Stay> veryOldStays;
- private List<Stay> orderedStay = new ArrayList<Stay>();
-
- // constructors
- public Person() {
- }
-
- public Person(String firstName, String lastName, String companyName) {
- this.firstName = firstName;
- this.lastName = lastName;
- this.companyName = companyName;
- }
-
- // properties
- public String getCompanyName() {
- return companyName;
- }
-
- public void setCompanyName(String companyName) {
- this.companyName = companyName;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- @Id
- @GeneratedValue
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getLastName() {
- return lastName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- // relationships
-
- @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "person")
- public Collection<Stay> getStays() {
- return this.stays;
- }
-
- public void setStays(List<Stay> stays) {
- this.stays = stays;
- }
-
- @OneToMany(cascade=CascadeType.ALL, mappedBy = "oldPerson")
- @LazyCollection(LazyCollectionOption.EXTRA)
- @Fetch(FetchMode.SUBSELECT)
- public Collection<Stay> getOldStays() {
- return oldStays;
- }
-
- public void setOldStays(Collection<Stay> oldStays) {
- this.oldStays = oldStays;
- }
-
- @OneToMany(cascade=CascadeType.ALL, mappedBy = "veryOldPerson")
- @Fetch(FetchMode.SELECT)
- public Collection<Stay> getVeryOldStays() {
- return veryOldStays;
- }
-
- public void setVeryOldStays(Collection<Stay> veryOldStays) {
- this.veryOldStays = veryOldStays;
- }
-
- @OneToMany(cascade=CascadeType.ALL)
- @LazyCollection(LazyCollectionOption.EXTRA)
- @Fetch(FetchMode.SUBSELECT)
- @IndexColumn(name="orderedStayIndex")
- public List<Stay> getOrderedStay() {
- return orderedStay;
- }
-
- public void setOrderedStay(List<Stay> orderedStay) {
- this.orderedStay = orderedStay;
- }
-
-
- // business logic
- public void addStay(Date startDate, Date endDate, String vessel, String authoriser, String comments) {
- Stay stay = new Stay( this, startDate, endDate, vessel, authoriser, comments );
- addStay( stay );
- }
-
- public void addStay(Stay stay) {
- Collection<Stay> stays = getStays();
- if ( stays == null ) {
- stays = new ArrayList<Stay>();
- }
- stays.add( stay );
-
- this.stays = stays;
- }
-
- public void addOldStay(Date startDate, Date endDate, String vessel, String authoriser, String comments) {
- Stay stay = new Stay( this, startDate, endDate, vessel, authoriser, comments );
- addOldStay( stay );
- }
-
- public void addOldStay(Stay stay) {
- Collection<Stay> stays = getOldStays();
- if ( stays == null ) {
- stays = new ArrayList<Stay>();
- }
- stays.add( stay );
-
- this.oldStays = stays;
- }
-
- public void addVeryOldStay(Date startDate, Date endDate, String vessel, String authoriser, String comments) {
- Stay stay = new Stay( this, startDate, endDate, vessel, authoriser, comments );
- addVeryOldStay( stay );
- }
-
- public void addVeryOldStay(Stay stay) {
- Collection<Stay> stays = getVeryOldStays();
- if ( stays == null ) {
- stays = new ArrayList<Stay>();
- }
- stays.add( stay );
-
- this.veryOldStays = stays;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Person.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Person.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Person.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Person.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,176 @@
+//$Id$
+package org.hibernate.test.annotations.fetch;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.FetchMode;
+import org.hibernate.annotations.LazyCollection;
+import org.hibernate.annotations.LazyCollectionOption;
+import org.hibernate.annotations.IndexColumn;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "Person")
+public class Person implements Serializable {
+
+ // member declaration
+ private int id;
+ private String firstName;
+ private String lastName;
+ private String companyName;
+ private Collection<Stay> stays;
+ private Collection<Stay> oldStays;
+ private Collection<Stay> veryOldStays;
+ private List<Stay> orderedStay = new ArrayList<Stay>();
+
+ // constructors
+ public Person() {
+ }
+
+ public Person(String firstName, String lastName, String companyName) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.companyName = companyName;
+ }
+
+ // properties
+ public String getCompanyName() {
+ return companyName;
+ }
+
+ public void setCompanyName(String companyName) {
+ this.companyName = companyName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ @Id
+ @GeneratedValue
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ // relationships
+
+ @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy = "person")
+ public Collection<Stay> getStays() {
+ return this.stays;
+ }
+
+ public void setStays(List<Stay> stays) {
+ this.stays = stays;
+ }
+
+ @OneToMany(cascade=CascadeType.ALL, mappedBy = "oldPerson")
+ @LazyCollection(LazyCollectionOption.EXTRA)
+ @Fetch(FetchMode.SUBSELECT)
+ public Collection<Stay> getOldStays() {
+ return oldStays;
+ }
+
+ public void setOldStays(Collection<Stay> oldStays) {
+ this.oldStays = oldStays;
+ }
+
+ @OneToMany(cascade=CascadeType.ALL, mappedBy = "veryOldPerson")
+ @Fetch(FetchMode.SELECT)
+ public Collection<Stay> getVeryOldStays() {
+ return veryOldStays;
+ }
+
+ public void setVeryOldStays(Collection<Stay> veryOldStays) {
+ this.veryOldStays = veryOldStays;
+ }
+
+ @OneToMany(cascade=CascadeType.ALL)
+ @LazyCollection(LazyCollectionOption.EXTRA)
+ @Fetch(FetchMode.SUBSELECT)
+ @IndexColumn(name="orderedStayIndex")
+ public List<Stay> getOrderedStay() {
+ return orderedStay;
+ }
+
+ public void setOrderedStay(List<Stay> orderedStay) {
+ this.orderedStay = orderedStay;
+ }
+
+
+ // business logic
+ public void addStay(Date startDate, Date endDate, String vessel, String authoriser, String comments) {
+ Stay stay = new Stay( this, startDate, endDate, vessel, authoriser, comments );
+ addStay( stay );
+ }
+
+ public void addStay(Stay stay) {
+ Collection<Stay> stays = getStays();
+ if ( stays == null ) {
+ stays = new ArrayList<Stay>();
+ }
+ stays.add( stay );
+
+ this.stays = stays;
+ }
+
+ public void addOldStay(Date startDate, Date endDate, String vessel, String authoriser, String comments) {
+ Stay stay = new Stay( this, startDate, endDate, vessel, authoriser, comments );
+ addOldStay( stay );
+ }
+
+ public void addOldStay(Stay stay) {
+ Collection<Stay> stays = getOldStays();
+ if ( stays == null ) {
+ stays = new ArrayList<Stay>();
+ }
+ stays.add( stay );
+
+ this.oldStays = stays;
+ }
+
+ public void addVeryOldStay(Date startDate, Date endDate, String vessel, String authoriser, String comments) {
+ Stay stay = new Stay( this, startDate, endDate, vessel, authoriser, comments );
+ addVeryOldStay( stay );
+ }
+
+ public void addVeryOldStay(Stay stay) {
+ Collection<Stay> stays = getVeryOldStays();
+ if ( stays == null ) {
+ stays = new ArrayList<Stay>();
+ }
+ stays.add( stay );
+
+ this.veryOldStays = stays;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Stay.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Stay.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Stay.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,143 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.fetch;
-
-import java.io.Serializable;
-import java.util.Date;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
-import org.hibernate.annotations.LazyToOne;
-import org.hibernate.annotations.LazyToOneOption;
-import org.hibernate.annotations.Fetch;
-import org.hibernate.annotations.FetchMode;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "Stay")
-public class Stay implements Serializable {
-
- // member declaration
- private int id;
- private Person person;
- private Person oldPerson;
- private Person veryOldPerson;
- private Date startDate;
- private Date endDate;
- private String vessel;
- private String authoriser;
- private String comments;
-
-
- // constructors
- public Stay() {
- }
-
- public Stay(int id) {
- this.id = id;
- }
-
- public Stay(Person person, Date startDate, Date endDate, String vessel, String authoriser, String comments) {
- this.authoriser = authoriser;
- this.endDate = endDate;
- this.person = person;
- this.startDate = startDate;
- this.vessel = vessel;
- this.comments = comments;
- }
-
-
- // properties
- public String getAuthoriser() {
- return authoriser;
- }
-
- public void setAuthoriser(String authoriser) {
- this.authoriser = authoriser;
- }
-
- public String getComments() {
- return comments;
- }
-
- public void setComments(String comments) {
- this.comments = comments;
- }
-
- public Date getEndDate() {
- return endDate;
- }
-
- public void setEndDate(Date endDate) {
- this.endDate = endDate;
- }
-
- @Id
- @GeneratedValue
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
- @JoinColumn(name = "person")
- public Person getPerson() {
- return person;
- }
-
- public void setPerson(Person person) {
- this.person = person;
- }
-
- @ManyToOne(cascade = CascadeType.ALL)
- @LazyToOne(LazyToOneOption.PROXY)
- @Fetch(FetchMode.SELECT)
- @JoinColumn(name = "oldperson")
- public Person getOldPerson() {
- return oldPerson;
- }
-
- public void setOldPerson(Person oldPerson) {
- this.oldPerson = oldPerson;
- }
-
- @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
- @LazyToOne(LazyToOneOption.PROXY)
- @Fetch(FetchMode.JOIN)
- @JoinColumn(name = "veryoldperson")
- public Person getVeryOldPerson() {
- return veryOldPerson;
- }
-
- public void setVeryOldPerson(Person veryOldPerson) {
- this.veryOldPerson = veryOldPerson;
- }
-
- public Date getStartDate() {
- return startDate;
- }
-
- public void setStartDate(Date startDate) {
- this.startDate = startDate;
- }
-
- public String getVessel() {
- return vessel;
- }
-
- public void setVessel(String vessel) {
- this.vessel = vessel;
- }
-
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Stay.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Stay.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Stay.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/fetch/Stay.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,143 @@
+//$Id$
+package org.hibernate.test.annotations.fetch;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.LazyToOne;
+import org.hibernate.annotations.LazyToOneOption;
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.FetchMode;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "Stay")
+public class Stay implements Serializable {
+
+ // member declaration
+ private int id;
+ private Person person;
+ private Person oldPerson;
+ private Person veryOldPerson;
+ private Date startDate;
+ private Date endDate;
+ private String vessel;
+ private String authoriser;
+ private String comments;
+
+
+ // constructors
+ public Stay() {
+ }
+
+ public Stay(int id) {
+ this.id = id;
+ }
+
+ public Stay(Person person, Date startDate, Date endDate, String vessel, String authoriser, String comments) {
+ this.authoriser = authoriser;
+ this.endDate = endDate;
+ this.person = person;
+ this.startDate = startDate;
+ this.vessel = vessel;
+ this.comments = comments;
+ }
+
+
+ // properties
+ public String getAuthoriser() {
+ return authoriser;
+ }
+
+ public void setAuthoriser(String authoriser) {
+ this.authoriser = authoriser;
+ }
+
+ public String getComments() {
+ return comments;
+ }
+
+ public void setComments(String comments) {
+ this.comments = comments;
+ }
+
+ public Date getEndDate() {
+ return endDate;
+ }
+
+ public void setEndDate(Date endDate) {
+ this.endDate = endDate;
+ }
+
+ @Id
+ @GeneratedValue
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+ @JoinColumn(name = "person")
+ public Person getPerson() {
+ return person;
+ }
+
+ public void setPerson(Person person) {
+ this.person = person;
+ }
+
+ @ManyToOne(cascade = CascadeType.ALL)
+ @LazyToOne(LazyToOneOption.PROXY)
+ @Fetch(FetchMode.SELECT)
+ @JoinColumn(name = "oldperson")
+ public Person getOldPerson() {
+ return oldPerson;
+ }
+
+ public void setOldPerson(Person oldPerson) {
+ this.oldPerson = oldPerson;
+ }
+
+ @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+ @LazyToOne(LazyToOneOption.PROXY)
+ @Fetch(FetchMode.JOIN)
+ @JoinColumn(name = "veryoldperson")
+ public Person getVeryOldPerson() {
+ return veryOldPerson;
+ }
+
+ public void setVeryOldPerson(Person veryOldPerson) {
+ this.veryOldPerson = veryOldPerson;
+ }
+
+ public Date getStartDate() {
+ return startDate;
+ }
+
+ public void setStartDate(Date startDate) {
+ this.startDate = startDate;
+ }
+
+ public String getVessel() {
+ return vessel;
+ }
+
+ public void setVessel(String vessel) {
+ this.vessel = vessel;
+ }
+
+
+}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/DNA.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/DNA.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/DNA.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: Address.java 8967 2006-01-03 12:27:34Z epbernard $
-package org.hibernate.test.annotations.generics;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Paolo Perrotta
- */
- at Entity
-public class DNA {
-
- private Integer id;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/DNA.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/DNA.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/DNA.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/DNA.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: Address.java 8967 2006-01-03 12:27:34Z epbernard $
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Paolo Perrotta
+ */
+ at Entity
+public class DNA {
+
+ private Integer id;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,111 +0,0 @@
-package org.hibernate.test.annotations.generics;
-
-/**
- * A test case for ANN-494.
- *
- * @author Edward Costello
- * @author Paolo Perrotta
- */
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.Embeddable;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.annotations.CollectionOfElements;
-import org.hibernate.test.annotations.TestCase;
-
-public class EmbeddedGenericsTest extends TestCase {
-
- Session session;
- Edition<String> edition;
-
- public void setUp() throws Exception {
- super.setUp();
- session = getSessions().openSession();
- session.getTransaction().begin();
- edition = new Edition<String>();
- edition.name = "Second";
- }
-
- public void tearDown() throws Exception {
- session.close();
- super.tearDown();
- }
-
- public void testWorksWithGenericEmbedded() {
- Book b = new Book();
- b.edition = edition;
- persist( b );
-
- Book retrieved = (Book)find( Book.class, b.id );
- assertEquals( "Second", retrieved.edition.name );
-
- clean( Book.class, b.id );
- }
-
- public void testWorksWithGenericCollectionOfElements() {
- PopularBook b = new PopularBook();
- b.editions.add( edition );
- persist( b );
-
- PopularBook retrieved = (PopularBook)find( PopularBook.class, b.id );
- assertEquals( "Second", retrieved.editions.iterator().next().name );
-
- clean( PopularBook.class, b.id );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Book.class,
- PopularBook.class
- };
- }
-
- private void persist(Object data) {
- session.persist( data );
- session.getTransaction().commit();
- session.clear();
- }
-
- private Object find(Class clazz, Long id) {
- return session.get( clazz, id );
- }
-
- private void clean(Class<?> clazz, Long id) {
- Transaction tx = session.beginTransaction();
- session.delete( find( clazz, id ) );
- tx.commit();
- }
-
- @Embeddable
- public static class Edition<T> {
- T name;
- }
-
- @Entity
- public static class Book {
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- Long id;
-
- @Embedded
- Edition<String> edition;
- }
-
- @Entity
- public static class PopularBook {
- @Id
- @GeneratedValue(strategy=GenerationType.AUTO)
- Long id;
-
- @CollectionOfElements
- Set<Edition<String>> editions = new HashSet<Edition<String>>();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/EmbeddedGenericsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,111 @@
+package org.hibernate.test.annotations.generics;
+
+/**
+ * A test case for ANN-494.
+ *
+ * @author Edward Costello
+ * @author Paolo Perrotta
+ */
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Embeddable;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.test.annotations.TestCase;
+
+public class EmbeddedGenericsTest extends TestCase {
+
+ Session session;
+ Edition<String> edition;
+
+ public void setUp() throws Exception {
+ super.setUp();
+ session = getSessions().openSession();
+ session.getTransaction().begin();
+ edition = new Edition<String>();
+ edition.name = "Second";
+ }
+
+ public void tearDown() throws Exception {
+ session.close();
+ super.tearDown();
+ }
+
+ public void testWorksWithGenericEmbedded() {
+ Book b = new Book();
+ b.edition = edition;
+ persist( b );
+
+ Book retrieved = (Book)find( Book.class, b.id );
+ assertEquals( "Second", retrieved.edition.name );
+
+ clean( Book.class, b.id );
+ }
+
+ public void testWorksWithGenericCollectionOfElements() {
+ PopularBook b = new PopularBook();
+ b.editions.add( edition );
+ persist( b );
+
+ PopularBook retrieved = (PopularBook)find( PopularBook.class, b.id );
+ assertEquals( "Second", retrieved.editions.iterator().next().name );
+
+ clean( PopularBook.class, b.id );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Book.class,
+ PopularBook.class
+ };
+ }
+
+ private void persist(Object data) {
+ session.persist( data );
+ session.getTransaction().commit();
+ session.clear();
+ }
+
+ private Object find(Class clazz, Long id) {
+ return session.get( clazz, id );
+ }
+
+ private void clean(Class<?> clazz, Long id) {
+ Transaction tx = session.beginTransaction();
+ session.delete( find( clazz, id ) );
+ tx.commit();
+ }
+
+ @Embeddable
+ public static class Edition<T> {
+ T name;
+ }
+
+ @Entity
+ public static class Book {
+ @Id
+ @GeneratedValue(strategy=GenerationType.AUTO)
+ Long id;
+
+ @Embedded
+ Edition<String> edition;
+ }
+
+ @Entity
+ public static class PopularBook {
+ @Id
+ @GeneratedValue(strategy=GenerationType.AUTO)
+ Long id;
+
+ @CollectionOfElements
+ Set<Edition<String>> editions = new HashSet<Edition<String>>();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Gene.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Gene.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Gene.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-package org.hibernate.test.annotations.generics;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-
-import org.hibernate.annotations.Type;
-
-/**
- * @author Paolo Perrotta
- */
- at Entity
-public class Gene<T, STE extends Enum> {
-
- private Integer id;
- private STE state;
-
- @Type(type="org.hibernate.test.annotations.generics.StateType")
- public STE getState() {
- return state;
- }
-
- public void setState(STE state) {
- this.state = state;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @ManyToOne(targetEntity = DNA.class)
- public T getGeneticCode() {
- return null;
- }
-
- public void setGeneticCode(T gene) {
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Gene.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Gene.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Gene.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Gene.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.Type;
+
+/**
+ * @author Paolo Perrotta
+ */
+ at Entity
+public class Gene<T, STE extends Enum> {
+
+ private Integer id;
+ private STE state;
+
+ @Type(type="org.hibernate.test.annotations.generics.StateType")
+ public STE getState() {
+ return state;
+ }
+
+ public void setState(STE state) {
+ this.state = state;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @ManyToOne(targetEntity = DNA.class)
+ public T getGeneticCode() {
+ return null;
+ }
+
+ public void setGeneticCode(T gene) {
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/GenericsTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/GenericsTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/GenericsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,60 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.generics;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class GenericsTest extends TestCase {
- public void testManyToOneGenerics() throws Exception {
- Paper white = new Paper();
- white.setName( "WhiteA4" );
- PaperType type = new PaperType();
- type.setName( "A4" );
- SomeGuy me = new SomeGuy();
- white.setType( type );
- white.setOwner( me );
- Price price = new Price();
- price.setAmount( new Double( 1 ) );
- price.setCurrency( "Euro" );
- white.setValue( price );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist( type );
- s.persist( price );
- s.persist( me );
- s.persist( white );
- tx.commit();
- //s.close();
- s = openSession();
- tx = s.beginTransaction();
- white = (Paper) s.get( Paper.class, white.getId() );
- s.delete( white.getType() );
- s.delete( white.getOwner() );
- s.delete( white.getValue() );
- s.delete( white );
- tx.commit();
- //s.close();
- }
-
- @Override
- protected void configure(Configuration cfg) {
- cfg.setProperty( Environment.AUTO_CLOSE_SESSION, "true" );
- super.configure( cfg );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Paper.class,
- PaperType.class,
- SomeGuy.class,
- Price.class,
- WildEntity.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/GenericsTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/GenericsTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/GenericsTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/GenericsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,60 @@
+//$Id$
+package org.hibernate.test.annotations.generics;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class GenericsTest extends TestCase {
+ public void testManyToOneGenerics() throws Exception {
+ Paper white = new Paper();
+ white.setName( "WhiteA4" );
+ PaperType type = new PaperType();
+ type.setName( "A4" );
+ SomeGuy me = new SomeGuy();
+ white.setType( type );
+ white.setOwner( me );
+ Price price = new Price();
+ price.setAmount( new Double( 1 ) );
+ price.setCurrency( "Euro" );
+ white.setValue( price );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( type );
+ s.persist( price );
+ s.persist( me );
+ s.persist( white );
+ tx.commit();
+ //s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ white = (Paper) s.get( Paper.class, white.getId() );
+ s.delete( white.getType() );
+ s.delete( white.getOwner() );
+ s.delete( white.getValue() );
+ s.delete( white );
+ tx.commit();
+ //s.close();
+ }
+
+ @Override
+ protected void configure(Configuration cfg) {
+ cfg.setProperty( Environment.AUTO_CLOSE_SESSION, "true" );
+ super.configure( cfg );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Paper.class,
+ PaperType.class,
+ SomeGuy.class,
+ Price.class,
+ WildEntity.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Item.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Item.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Item.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,54 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.generics;
-
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Item<Type, Owner> extends PricedStuff {
- private Integer id;
- private String name;
- private Type type;
- private Owner owner;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne
- public Type getType() {
- return type;
- }
-
- public void setType(Type type) {
- this.type = type;
- }
-
- @ManyToOne
- public Owner getOwner() {
- return owner;
- }
-
- public void setOwner(Owner owner) {
- this.owner = owner;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Item.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Item.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Item.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Item.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,54 @@
+//$Id$
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Item<Type, Owner> extends PricedStuff {
+ private Integer id;
+ private String name;
+ private Type type;
+ private Owner owner;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne
+ public Type getType() {
+ return type;
+ }
+
+ public void setType(Type type) {
+ this.type = type;
+ }
+
+ @ManyToOne
+ public Owner getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Owner owner) {
+ this.owner = owner;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Paper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Paper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Paper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.generics;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Paper extends Item<PaperType, SomeGuy> {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Paper.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Paper.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Paper.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Paper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id$
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Paper extends Item<PaperType, SomeGuy> {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PaperType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PaperType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PaperType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.generics;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class PaperType {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PaperType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PaperType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PaperType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PaperType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id$
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PaperType {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Price.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Price.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Price.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.generics;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Price {
- private Integer id;
- private Double amount;
- private String currency;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public Double getAmount() {
- return amount;
- }
-
- public void setAmount(Double amount) {
- this.amount = amount;
- }
-
- public String getCurrency() {
- return currency;
- }
-
- public void setCurrency(String currency) {
- this.currency = currency;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Price.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Price.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Price.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Price.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id$
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Price {
+ private Integer id;
+ private Double amount;
+ private String currency;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Double getAmount() {
+ return amount;
+ }
+
+ public void setAmount(Double amount) {
+ this.amount = amount;
+ }
+
+ public String getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(String currency) {
+ this.currency = currency;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PricedStuff.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PricedStuff.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PricedStuff.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.generics;
-
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class PricedStuff extends Stuff<Price> {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PricedStuff.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PricedStuff.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PricedStuff.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/PricedStuff.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id$
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class PricedStuff extends Stuff<Price> {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/SomeGuy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/SomeGuy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/SomeGuy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.generics;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class SomeGuy {
- private Integer id;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/SomeGuy.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/SomeGuy.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/SomeGuy.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/SomeGuy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id$
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SomeGuy {
+ private Integer id;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/State.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/State.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/State.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.generics;
-
-/**
- * @author Emmanuel Bernard
- */
-public enum State {
- ACTIVE,
- DORMANT
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/State.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/State.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/State.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/State.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.test.annotations.generics;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum State {
+ ACTIVE,
+ DORMANT
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/StateType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/StateType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/StateType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,69 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.generics;
-
-import java.io.Serializable;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.PreparedStatement;
-import java.sql.Types;
-
-import org.hibernate.usertype.UserType;
-import org.hibernate.HibernateException;
-
-/**
- * @author Emmanuel Bernard
- */
-public class StateType implements UserType {
- public int[] sqlTypes() {
- return new int[] {
- Types.INTEGER
- };
- }
-
- public Class returnedClass() {
- return State.class;
- }
-
- public boolean equals(Object x, Object y) throws HibernateException {
- return x == y;
- }
-
- public int hashCode(Object x) throws HibernateException {
- return x.hashCode();
- }
-
- public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
- int result = rs.getInt( names[0] );
- if ( rs.wasNull() ) return null;
- return State.values()[result];
- }
-
- public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
- if (value == null) {
- st.setNull( index, Types.INTEGER );
- }
- else {
- st.setInt( index, ( (State) value ).ordinal() );
- }
- }
-
- public Object deepCopy(Object value) throws HibernateException {
- return value;
- }
-
- public boolean isMutable() {
- return false;
- }
-
- public Serializable disassemble(Object value) throws HibernateException {
- return (Serializable) value;
- }
-
- public Object assemble(Serializable cached, Object owner) throws HibernateException {
- return cached;
- }
-
- public Object replace(Object original, Object target, Object owner) throws HibernateException {
- return original;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/StateType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/StateType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/StateType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/StateType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,69 @@
+//$Id: $
+package org.hibernate.test.annotations.generics;
+
+import java.io.Serializable;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.PreparedStatement;
+import java.sql.Types;
+
+import org.hibernate.usertype.UserType;
+import org.hibernate.HibernateException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class StateType implements UserType {
+ public int[] sqlTypes() {
+ return new int[] {
+ Types.INTEGER
+ };
+ }
+
+ public Class returnedClass() {
+ return State.class;
+ }
+
+ public boolean equals(Object x, Object y) throws HibernateException {
+ return x == y;
+ }
+
+ public int hashCode(Object x) throws HibernateException {
+ return x.hashCode();
+ }
+
+ public Object nullSafeGet(ResultSet rs, String[] names, Object owner) throws HibernateException, SQLException {
+ int result = rs.getInt( names[0] );
+ if ( rs.wasNull() ) return null;
+ return State.values()[result];
+ }
+
+ public void nullSafeSet(PreparedStatement st, Object value, int index) throws HibernateException, SQLException {
+ if (value == null) {
+ st.setNull( index, Types.INTEGER );
+ }
+ else {
+ st.setInt( index, ( (State) value ).ordinal() );
+ }
+ }
+
+ public Object deepCopy(Object value) throws HibernateException {
+ return value;
+ }
+
+ public boolean isMutable() {
+ return false;
+ }
+
+ public Serializable disassemble(Object value) throws HibernateException {
+ return (Serializable) value;
+ }
+
+ public Object assemble(Serializable cached, Object owner) throws HibernateException {
+ return cached;
+ }
+
+ public Object replace(Object original, Object target, Object owner) throws HibernateException {
+ return original;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Stuff.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Stuff.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Stuff.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.generics;
-
-import javax.persistence.ManyToOne;
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Stuff<Value> {
- private Value value;
-
- @ManyToOne
- public Value getValue() {
- return value;
- }
-
- public void setValue(Value value) {
- this.value = value;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Stuff.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Stuff.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Stuff.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/Stuff.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.test.annotations.generics;
+
+import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Stuff<Value> {
+ private Value value;
+
+ @ManyToOne
+ public Value getValue() {
+ return value;
+ }
+
+ public void setValue(Value value) {
+ this.value = value;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-package org.hibernate.test.annotations.generics;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Paolo Perrotta
- */
-public class UnresolvedTypeTest extends TestCase {
-
- public void testAcceptsUnresolvedPropertyTypesIfATargetEntityIsExplicitlySet() {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Gene item = new Gene();
- s.persist( item );
- s.flush();
- tx.rollback();
- s.close();
- }
-
- public void testAcceptsUnresolvedPropertyTypesIfATypeExplicitlySet() {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Gene item = new Gene();
- item.setState( State.DORMANT );
- s.persist( item );
- s.flush();
- s.clear();
- item = (Gene) s.get( Gene.class, item.getId() );
- assertEquals( State.DORMANT, item.getState() );
- tx.rollback();
- s.close();
- }
-
- @Override
- protected Class[] getMappings() {
- return new Class[]{
- Gene.class,
- DNA.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/UnresolvedTypeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+package org.hibernate.test.annotations.generics;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Paolo Perrotta
+ */
+public class UnresolvedTypeTest extends TestCase {
+
+ public void testAcceptsUnresolvedPropertyTypesIfATargetEntityIsExplicitlySet() {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Gene item = new Gene();
+ s.persist( item );
+ s.flush();
+ tx.rollback();
+ s.close();
+ }
+
+ public void testAcceptsUnresolvedPropertyTypesIfATypeExplicitlySet() {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Gene item = new Gene();
+ item.setState( State.DORMANT );
+ s.persist( item );
+ s.flush();
+ s.clear();
+ item = (Gene) s.get( Gene.class, item.getId() );
+ assertEquals( State.DORMANT, item.getState() );
+ tx.rollback();
+ s.close();
+ }
+
+ @Override
+ protected Class[] getMappings() {
+ return new Class[]{
+ Gene.class,
+ DNA.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/WildEntity.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/WildEntity.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/WildEntity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.generics;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Transient;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class WildEntity implements Serializable {
-
- private static final long serialVersionUID = -1171578628576139205L;
-
- private int id;
-
- private String property;
-
- @Id
- @GeneratedValue
- public int getId() {
- return id;
- }
-
- @Transient
- public <T extends Object> T someMethod() {
- return null;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getProperty() {
- return property;
- }
-
- public void setProperty(String property) {
- this.property = property;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/WildEntity.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/WildEntity.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/WildEntity.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/generics/WildEntity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id$
+package org.hibernate.test.annotations.generics;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Transient;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class WildEntity implements Serializable {
+
+ private static final long serialVersionUID = -1171578628576139205L;
+
+ private int id;
+
+ private String property;
+
+ @Id
+ @GeneratedValue
+ public int getId() {
+ return id;
+ }
+
+ @Transient
+ public <T extends Object> T someMethod() {
+ return null;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getProperty() {
+ return property;
+ }
+
+ public void setProperty(String property) {
+ this.property = property;
+ }
+}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Child.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Child.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Child.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-package org.hibernate.test.annotations.genericsinheritance;
-
-import javax.persistence.MappedSuperclass;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-
- at MappedSuperclass
-public abstract class Child<P extends Parent> {
-
- @Id Long id;
- @ManyToOne P parent;
-
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
- public P getParent() {
- return parent;
- }
- public void setParent(P parent) {
- this.parent = parent;
- }
-
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Child.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Child.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Child.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Child.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+ at MappedSuperclass
+public abstract class Child<P extends Parent> {
+
+ @Id Long id;
+ @ManyToOne P parent;
+
+ public Long getId() {
+ return id;
+ }
+ public void setId(Long id) {
+ this.id = id;
+ }
+ public P getParent() {
+ return parent;
+ }
+ public void setParent(P parent) {
+ this.parent = parent;
+ }
+
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,8 +0,0 @@
-package org.hibernate.test.annotations.genericsinheritance;
-
-import javax.persistence.Entity;
-
- at Entity
-public class ChildHierarchy1 extends Child<ParentHierarchy1> {
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.Entity;
+
+ at Entity
+public class ChildHierarchy1 extends Child<ParentHierarchy1> {
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,8 +0,0 @@
-package org.hibernate.test.annotations.genericsinheritance;
-
-import javax.persistence.MappedSuperclass;
-
- at MappedSuperclass
-public class ChildHierarchy2<P extends ParentHierarchy2> extends Child<P> {
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.MappedSuperclass;
+
+ at MappedSuperclass
+public class ChildHierarchy2<P extends ParentHierarchy2> extends Child<P> {
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,8 +0,0 @@
-package org.hibernate.test.annotations.genericsinheritance;
-
-import javax.persistence.Entity;
-
- at Entity
-public class ChildHierarchy22 extends ChildHierarchy2<ParentHierarchy22> {
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ChildHierarchy22.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.Entity;
+
+ at Entity
+public class ChildHierarchy22 extends ChildHierarchy2<ParentHierarchy22> {
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.genericsinheritance;
-
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.Session;
-
-/**
- * @author Emmanuel Bernard
- */
-public class GenericsInheritanceTest extends TestCase {
- public void testMapping() throws Exception {
- Session s = openSession();
- s.close();
- //mapping is tested
- }
- protected Class[] getMappings() {
- return new Class[] {
- ChildHierarchy1.class,
- ParentHierarchy1.class,
- ChildHierarchy22.class,
- ParentHierarchy22.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/GenericsInheritanceTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.test.annotations.genericsinheritance;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class GenericsInheritanceTest extends TestCase {
+ public void testMapping() throws Exception {
+ Session s = openSession();
+ s.close();
+ //mapping is tested
+ }
+ protected Class[] getMappings() {
+ return new Class[] {
+ ChildHierarchy1.class,
+ ParentHierarchy1.class,
+ ChildHierarchy22.class,
+ ParentHierarchy22.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Parent.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Parent.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-package org.hibernate.test.annotations.genericsinheritance;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.MapKey;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.OneToMany;
-
- at MappedSuperclass
-public abstract class Parent<C extends Child> {
-
- @Id @GeneratedValue Long id;
- @MapKey @OneToMany(mappedBy="parent") Map<Long,C> children = new HashMap<Long,C>();
-
-
- public Long getId() {
- return id;
- }
- public void setId(Long id) {
- this.id = id;
- }
-
-
- public Map<Long,C> getChildren() {
- return children;
- }
- public void setChildren(Map<Long,C> children) {
- this.children = children;
- }
-
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Parent.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Parent.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Parent.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MapKey;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.OneToMany;
+
+ at MappedSuperclass
+public abstract class Parent<C extends Child> {
+
+ @Id @GeneratedValue Long id;
+ @MapKey @OneToMany(mappedBy="parent") Map<Long,C> children = new HashMap<Long,C>();
+
+
+ public Long getId() {
+ return id;
+ }
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+ public Map<Long,C> getChildren() {
+ return children;
+ }
+ public void setChildren(Map<Long,C> children) {
+ this.children = children;
+ }
+
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,8 +0,0 @@
-package org.hibernate.test.annotations.genericsinheritance;
-
-import javax.persistence.Entity;
-
- at Entity
-public class ParentHierarchy1 extends Parent<ChildHierarchy1> {
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.Entity;
+
+ at Entity
+public class ParentHierarchy1 extends Parent<ChildHierarchy1> {
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,8 +0,0 @@
-package org.hibernate.test.annotations.genericsinheritance;
-
-import javax.persistence.MappedSuperclass;
-
- at MappedSuperclass
-public class ParentHierarchy2<C extends ChildHierarchy2> extends Parent<C> {
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.MappedSuperclass;
+
+ at MappedSuperclass
+public class ParentHierarchy2<C extends ChildHierarchy2> extends Parent<C> {
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,8 +0,0 @@
-package org.hibernate.test.annotations.genericsinheritance;
-
-import javax.persistence.Entity;
-
- at Entity
-public class ParentHierarchy22 extends ParentHierarchy2<ChildHierarchy22> {
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/genericsinheritance/ParentHierarchy22.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,8 @@
+package org.hibernate.test.annotations.genericsinheritance;
+
+import javax.persistence.Entity;
+
+ at Entity
+public class ParentHierarchy22 extends ParentHierarchy2<ChildHierarchy22> {
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/hibernate.cfg.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/hibernate.cfg.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/hibernate.cfg.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-<!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
-
-<hibernate-configuration>
- <session-factory>
- <mapping resource="org/hibernate/test/annotations/Boat.hbm.xml"/>
- <mapping package="org.hibernate.test.annotations"/>
- <mapping class="org.hibernate.test.annotations.Plane"/>
- </session-factory>
-</hibernate-configuration>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/hibernate.cfg.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/hibernate.cfg.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/hibernate.cfg.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/hibernate.cfg.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+<!DOCTYPE hibernate-configuration PUBLIC
+ "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+ <session-factory>
+ <mapping resource="org/hibernate/test/annotations/Boat.hbm.xml"/>
+ <mapping package="org.hibernate.test.annotations"/>
+ <mapping class="org.hibernate.test.annotations.Plane"/>
+ </session-factory>
+</hibernate-configuration>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Ball.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Ball.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Ball.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.TableGenerator;
-
-/**
- * Sample of table generator
- *
- * @author Emmanuel Bernard
- */
- at TableGenerator(name = "EMP_GEN", table = "GENERATOR_TABLE", pkColumnName = "pkey",
- valueColumnName = "hi", pkColumnValue = "Ball", allocationSize = 10)
- at Entity
-public class Ball implements Serializable {
- private Integer id;
-
- @Id
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "EMP_GEN")
- @Column(name = "ball_id")
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Ball.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Ball.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Ball.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Ball.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.TableGenerator;
+
+/**
+ * Sample of table generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at TableGenerator(name = "EMP_GEN", table = "GENERATOR_TABLE", pkColumnName = "pkey",
+ valueColumnName = "hi", pkColumnValue = "Ball", allocationSize = 10)
+ at Entity
+public class Ball implements Serializable {
+ private Integer id;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "EMP_GEN")
+ @Column(name = "ball_id")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/BreakDance.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/BreakDance.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/BreakDance.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.TableGenerator;
-import javax.persistence.GenerationType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class BreakDance {
- @Id
- @GeneratedValue(generator = "memencoIdGen", strategy = GenerationType.TABLE)
- @TableGenerator(
- name = "memencoIdGen",
- table = "hi_id_key",
- pkColumnName = "id_key",
- valueColumnName = "next_hi",
- pkColumnValue = "issue",
- allocationSize = 1
- )
- public Integer id;
- public String name;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/BreakDance.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/BreakDance.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/BreakDance.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/BreakDance.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id: $
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.TableGenerator;
+import javax.persistence.GenerationType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BreakDance {
+ @Id
+ @GeneratedValue(generator = "memencoIdGen", strategy = GenerationType.TABLE)
+ @TableGenerator(
+ name = "memencoIdGen",
+ table = "hi_id_key",
+ pkColumnName = "id_key",
+ valueColumnName = "next_hi",
+ pkColumnValue = "issue",
+ allocationSize = 1
+ )
+ public Integer id;
+ public String name;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Computer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Computer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Computer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity()
-public class Computer {
- private Long id;
- private String serialNumber;
-
- @Id
- @GeneratedValue(strategy = GenerationType.TABLE)
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getSerialNumber() {
- return serialNumber;
- }
-
- public void setSerialNumber(String serialNumber) {
- this.serialNumber = serialNumber;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Computer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Computer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Computer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Computer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Computer {
+ private Long id;
+ private String serialNumber;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.TABLE)
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getSerialNumber() {
+ return serialNumber;
+ }
+
+ public void setSerialNumber(String serialNumber) {
+ this.serialNumber = serialNumber;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Department.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Department.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Department.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-/**
- * Sample of method generator
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Department implements Serializable {
- private Long id;
-
- @Id
- @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_DEPT")
- @javax.persistence.SequenceGenerator(
- name = "SEQ_DEPT",
- sequenceName = "my_sequence"
- )
- public Long getId() {
- return id;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Department.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Department.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Department.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Department.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * Sample of method generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Department implements Serializable {
+ private Long id;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_DEPT")
+ @javax.persistence.SequenceGenerator(
+ name = "SEQ_DEPT",
+ sequenceName = "my_sequence"
+ )
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Dog.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Dog.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Dog.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
-/**
- * Share the generator table decribed by the GEN_TABLE GeneratedIdTable
- * using the Dog key as discriminator
- *
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "tbl_dog")
- at TableGenerator(name = "DogGen", table = "GENERATOR_TABLE", pkColumnName = "pkey",
- valueColumnName = "hi", pkColumnValue = "Dog", allocationSize = 10)
-public class Dog {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue(strategy = GenerationType.TABLE, generator = "DogGen")
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Dog.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Dog.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Dog.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Dog.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+
+/**
+ * Share the generator table decribed by the GEN_TABLE GeneratedIdTable
+ * using the Dog key as discriminator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_dog")
+ at TableGenerator(name = "DogGen", table = "GENERATOR_TABLE", pkColumnName = "pkey",
+ valueColumnName = "hi", pkColumnValue = "Dog", allocationSize = 10)
+public class Dog {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.TABLE, generator = "DogGen")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FirTree.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FirTree.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FirTree.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class FirTree extends Tree {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FirTree.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FirTree.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FirTree.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FirTree.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class FirTree extends Tree {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Footballer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Footballer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Footballer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,73 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at IdClass(FootballerPk.class)
- at DiscriminatorColumn(name = "bibi")
-public class Footballer {
- private String firstname;
- private String lastname;
- private String club;
-
- public Footballer() {
- }
-
- public Footballer(String firstname, String lastname, String club) {
- this.firstname = firstname;
- this.lastname = lastname;
- this.club = club;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Footballer ) ) return false;
-
- final Footballer footballer = (Footballer) o;
-
- if ( !firstname.equals( footballer.firstname ) ) return false;
- if ( !lastname.equals( footballer.lastname ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = firstname.hashCode();
- result = 29 * result + lastname.hashCode();
- return result;
- }
-
- @Id
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- @Id
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- public String getClub() {
- return club;
- }
-
- public void setClub(String club) {
- this.club = club;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Footballer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Footballer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Footballer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Footballer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,73 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(FootballerPk.class)
+ at DiscriminatorColumn(name = "bibi")
+public class Footballer {
+ private String firstname;
+ private String lastname;
+ private String club;
+
+ public Footballer() {
+ }
+
+ public Footballer(String firstname, String lastname, String club) {
+ this.firstname = firstname;
+ this.lastname = lastname;
+ this.club = club;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Footballer ) ) return false;
+
+ final Footballer footballer = (Footballer) o;
+
+ if ( !firstname.equals( footballer.firstname ) ) return false;
+ if ( !lastname.equals( footballer.lastname ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = firstname.hashCode();
+ result = 29 * result + lastname.hashCode();
+ return result;
+ }
+
+ @Id
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ @Id
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public String getClub() {
+ return club;
+ }
+
+ public void setClub(String club) {
+ this.club = club;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FootballerPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FootballerPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FootballerPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,61 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class FootballerPk implements Serializable {
- private String firstname;
- private String lastname;
-
- @Column(name = "fb_fname")
- public String getFirstname() {
- return firstname;
- }
-
- public String getLastname() {
- return lastname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- public FootballerPk() {
- }
-
- public FootballerPk(String firstname, String lastname) {
- this.firstname = firstname;
- this.lastname = lastname;
-
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof FootballerPk ) ) return false;
-
- final FootballerPk footballerPk = (FootballerPk) o;
-
- if ( !firstname.equals( footballerPk.firstname ) ) return false;
- if ( !lastname.equals( footballerPk.lastname ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = firstname.hashCode();
- result = 29 * result + lastname.hashCode();
- return result;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FootballerPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FootballerPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FootballerPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/FootballerPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,61 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class FootballerPk implements Serializable {
+ private String firstname;
+ private String lastname;
+
+ @Column(name = "fb_fname")
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public FootballerPk() {
+ }
+
+ public FootballerPk(String firstname, String lastname) {
+ this.firstname = firstname;
+ this.lastname = lastname;
+
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof FootballerPk ) ) return false;
+
+ final FootballerPk footballerPk = (FootballerPk) o;
+
+ if ( !firstname.equals( footballerPk.firstname ) ) return false;
+ if ( !lastname.equals( footballerPk.lastname ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = firstname.hashCode();
+ result = 29 * result + lastname.hashCode();
+ return result;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Furniture.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Furniture.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Furniture.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import org.hibernate.annotations.GenericGenerator;
-import org.hibernate.annotations.Parameter;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Furniture {
- private Integer id;
-
- @Id
- @GeneratedValue(generator = "hibseq")
- @GenericGenerator(name = "hibseq", strategy = "seqhilo",
- parameters = {
- @Parameter(name = "max_lo", value = "5"),
- @Parameter(name = "sequence", value = "heybabyhey")
- }
- )
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Furniture.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Furniture.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Furniture.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Furniture.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Parameter;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Furniture {
+ private Integer id;
+
+ @Id
+ @GeneratedValue(generator = "hibseq")
+ @GenericGenerator(name = "hibseq", strategy = "seqhilo",
+ parameters = {
+ @Parameter(name = "max_lo", value = "5"),
+ @Parameter(name = "sequence", value = "heybabyhey")
+ }
+ )
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/GoalKeeper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/GoalKeeper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/GoalKeeper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class GoalKeeper extends Footballer {
- public GoalKeeper() {
- }
-
- public GoalKeeper(String firstname, String lastname, String club) {
- super( firstname, lastname, club );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/GoalKeeper.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/GoalKeeper.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/GoalKeeper.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/GoalKeeper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GoalKeeper extends Footballer {
+ public GoalKeeper() {
+ }
+
+ public GoalKeeper(String firstname, String lastname, String club) {
+ super( firstname, lastname, club );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Home.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Home.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Home.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * Default sequence generation usage
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Home {
- private Long id;
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Home.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Home.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Home.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Home.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Default sequence generation usage
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Home {
+ private Long id;
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdClassTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdClassTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdClassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class IdClassTest extends TestCase {
-
- public void testIdClassInSuperclass() throws Exception {
- Tower tower = new Tower();
- tower.latitude = 10.3;
- tower.longitude = 45.4;
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist( tower );
- s.flush();
- s.clear();
- Location loc = new Location();
- loc.latitude = tower.latitude;
- loc.longitude = tower.longitude;
- assertNotNull( s.get( Tower.class, loc ) );
- tx.rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Tower.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdClassTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdClassTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdClassTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdClassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IdClassTest extends TestCase {
+
+ public void testIdClassInSuperclass() throws Exception {
+ Tower tower = new Tower();
+ tower.latitude = 10.3;
+ tower.longitude = 45.4;
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( tower );
+ s.flush();
+ s.clear();
+ Location loc = new Location();
+ loc.latitude = tower.latitude;
+ loc.longitude = tower.longitude;
+ assertNotNull( s.get( Tower.class, loc ) );
+ tx.rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Tower.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,288 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.mapping.Column;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class IdTest extends TestCase {
- //FIXME split Sequence and Id tests to explicit the run failure on Oracle etc
-
- public IdTest(String x) {
- super( x );
- }
-
- public void testGenericGenerator() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- SoundSystem system = new SoundSystem();
- system.setBrand( "Genelec" );
- system.setModel( "T234" );
- Furniture fur = new Furniture();
- s.persist( system );
- s.persist( fur );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- system = (SoundSystem) s.get( SoundSystem.class, system.getId() );
- fur = (Furniture) s.get( Furniture.class, fur.getId() );
- assertNotNull( system );
- assertNotNull( fur );
- s.delete( system );
- s.delete( fur );
- tx.commit();
- s.close();
-
- }
-
- public void testTableGenerator() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
-
- Ball b = new Ball();
- Dog d = new Dog();
- Computer c = new Computer();
- s.persist( b );
- s.persist( d );
- s.persist( c );
- tx.commit();
- s.close();
- assertEquals( "table id not generated", new Integer( 1 ), b.getId() );
- assertEquals( "generator should not be shared", new Integer( 1 ), d.getId() );
- assertEquals( "default value should work", new Long( 1 ), c.getId() );
-
- s = openSession();
- tx = s.beginTransaction();
- s.delete( s.get( Ball.class, new Integer( 1 ) ) );
- s.delete( s.get( Dog.class, new Integer( 1 ) ) );
- s.delete( s.get( Computer.class, new Long( 1 ) ) );
- tx.commit();
- s.close();
- }
-
- public void testSequenceGenerator() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Shoe b = new Shoe();
- s.persist( b );
- tx.commit();
- s.close();
- assertNotNull( b.getId() );
-
- s = openSession();
- tx = s.beginTransaction();
- s.delete( s.get( Shoe.class, b.getId() ) );
- tx.commit();
- s.close();
- }
-
- public void testClassLevelGenerator() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Store b = new Store();
- s.persist( b );
- tx.commit();
- s.close();
- assertNotNull( b.getId() );
-
- s = openSession();
- tx = s.beginTransaction();
- s.delete( s.get( Store.class, b.getId() ) );
- tx.commit();
- s.close();
- }
-
- public void testMethodLevelGenerator() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Department b = new Department();
- s.persist( b );
- tx.commit();
- s.close();
- assertNotNull( b.getId() );
-
- s = openSession();
- tx = s.beginTransaction();
- s.delete( s.get( Department.class, b.getId() ) );
- tx.commit();
- s.close();
- }
-
- public void testDefaultSequence() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Home h = new Home();
- s.persist( h );
- tx.commit();
- s.close();
- assertNotNull( h.getId() );
-
- s = openSession();
- tx = s.beginTransaction();
- Home reloadedHome = (Home) s.get( Home.class, h.getId() );
- assertEquals( h.getId(), reloadedHome.getId() );
- s.delete( reloadedHome );
- tx.commit();
- s.close();
- }
-
- public void testParameterizedAuto() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Home h = new Home();
- s.persist( h );
- tx.commit();
- s.close();
- assertNotNull( h.getId() );
-
- s = openSession();
- tx = s.beginTransaction();
- Home reloadedHome = (Home) s.get( Home.class, h.getId() );
- assertEquals( h.getId(), reloadedHome.getId() );
- s.delete( reloadedHome );
- tx.commit();
- s.close();
- }
-
- public void testIdInEmbeddableSuperclass() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- FirTree chrismasTree = new FirTree();
- s.persist( chrismasTree );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- chrismasTree = (FirTree) s.get( FirTree.class, chrismasTree.getId() );
- assertNotNull( chrismasTree );
- s.delete( chrismasTree );
- tx.commit();
- s.close();
- }
-
- public void testIdClass() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Footballer fb = new Footballer( "David", "Beckam", "Arsenal" );
- GoalKeeper keeper = new GoalKeeper( "Fabien", "Bartez", "OM" );
- s.persist( fb );
- s.persist( keeper );
- tx.commit();
- s.clear();
-
- //lookup by id
- tx = s.beginTransaction();
- FootballerPk fpk = new FootballerPk( "David", "Beckam" );
- fb = (Footballer) s.get( Footballer.class, fpk );
- FootballerPk fpk2 = new FootballerPk( "Fabien", "Bartez" );
- keeper = (GoalKeeper) s.get( GoalKeeper.class, fpk2 );
- assertNotNull( fb );
- assertNotNull( keeper );
- assertEquals( "Beckam", fb.getLastname() );
- assertEquals( "Arsenal", fb.getClub() );
- assertEquals( 1, s.createQuery( "from Footballer f where f.firstname = 'David'" ).list().size() );
- tx.commit();
-
- //reattach by merge
- tx = s.beginTransaction();
- fb.setClub( "Bimbo FC" );
- s.merge( fb );
- tx.commit();
-
- //reattach by saveOrUpdate
- tx = s.beginTransaction();
- fb.setClub( "Bimbo FC SA" );
- s.saveOrUpdate( fb );
- tx.commit();
-
- //clean up
- s.clear();
- tx = s.beginTransaction();
- fpk = new FootballerPk( "David", "Beckam" );
- fb = (Footballer) s.get( Footballer.class, fpk );
- assertEquals( "Bimbo FC SA", fb.getClub() );
- s.delete( fb );
- s.delete( keeper );
- tx.commit();
- s.close();
- }
-
- public void testColumnDefinition() {
- Column idCol = (Column) getCfg().getClassMapping( Ball.class.getName() ).getIdentifierProperty().getValue()
- .getColumnIterator().next();
- assertEquals( "ball_id", idCol.getName() );
- }
-
- public void testLowAllocationSize() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- int size = 4;
- BreakDance[] bds = new BreakDance[size];
- for (int i = 0 ; i < size ; i++) {
- bds[i] = new BreakDance();
- s.persist( bds[i] );
- }
- s.flush();
- for (int i = 0 ; i < size ; i++) {
- assertEquals(i + 1, bds[i].id.intValue() );
- }
- tx.rollback();
- s.close();
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- Ball.class,
- Shoe.class,
- Store.class,
- Department.class,
- Dog.class,
- Computer.class,
- Home.class,
- Phone.class,
- Tree.class,
- FirTree.class,
- Footballer.class,
- SoundSystem.class,
- Furniture.class,
- GoalKeeper.class,
- BreakDance.class
- };
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getAnnotatedPackages()
- */
- protected String[] getAnnotatedPackages() {
- return new String[]{
- "org.hibernate.test.annotations",
- "org.hibernate.test.annotations.id"
- };
- }
-
- @Override
- protected String[] getXmlFiles() {
- return new String[] {
- "org/hibernate/test/annotations/orm.xml"
- };
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/IdTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,288 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.mapping.Column;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IdTest extends TestCase {
+ //FIXME split Sequence and Id tests to explicit the run failure on Oracle etc
+
+ public IdTest(String x) {
+ super( x );
+ }
+
+ public void testGenericGenerator() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ SoundSystem system = new SoundSystem();
+ system.setBrand( "Genelec" );
+ system.setModel( "T234" );
+ Furniture fur = new Furniture();
+ s.persist( system );
+ s.persist( fur );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ system = (SoundSystem) s.get( SoundSystem.class, system.getId() );
+ fur = (Furniture) s.get( Furniture.class, fur.getId() );
+ assertNotNull( system );
+ assertNotNull( fur );
+ s.delete( system );
+ s.delete( fur );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testTableGenerator() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+
+ Ball b = new Ball();
+ Dog d = new Dog();
+ Computer c = new Computer();
+ s.persist( b );
+ s.persist( d );
+ s.persist( c );
+ tx.commit();
+ s.close();
+ assertEquals( "table id not generated", new Integer( 1 ), b.getId() );
+ assertEquals( "generator should not be shared", new Integer( 1 ), d.getId() );
+ assertEquals( "default value should work", new Long( 1 ), c.getId() );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.delete( s.get( Ball.class, new Integer( 1 ) ) );
+ s.delete( s.get( Dog.class, new Integer( 1 ) ) );
+ s.delete( s.get( Computer.class, new Long( 1 ) ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testSequenceGenerator() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Shoe b = new Shoe();
+ s.persist( b );
+ tx.commit();
+ s.close();
+ assertNotNull( b.getId() );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.delete( s.get( Shoe.class, b.getId() ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testClassLevelGenerator() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Store b = new Store();
+ s.persist( b );
+ tx.commit();
+ s.close();
+ assertNotNull( b.getId() );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.delete( s.get( Store.class, b.getId() ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testMethodLevelGenerator() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Department b = new Department();
+ s.persist( b );
+ tx.commit();
+ s.close();
+ assertNotNull( b.getId() );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.delete( s.get( Department.class, b.getId() ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testDefaultSequence() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Home h = new Home();
+ s.persist( h );
+ tx.commit();
+ s.close();
+ assertNotNull( h.getId() );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Home reloadedHome = (Home) s.get( Home.class, h.getId() );
+ assertEquals( h.getId(), reloadedHome.getId() );
+ s.delete( reloadedHome );
+ tx.commit();
+ s.close();
+ }
+
+ public void testParameterizedAuto() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Home h = new Home();
+ s.persist( h );
+ tx.commit();
+ s.close();
+ assertNotNull( h.getId() );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Home reloadedHome = (Home) s.get( Home.class, h.getId() );
+ assertEquals( h.getId(), reloadedHome.getId() );
+ s.delete( reloadedHome );
+ tx.commit();
+ s.close();
+ }
+
+ public void testIdInEmbeddableSuperclass() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ FirTree chrismasTree = new FirTree();
+ s.persist( chrismasTree );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ chrismasTree = (FirTree) s.get( FirTree.class, chrismasTree.getId() );
+ assertNotNull( chrismasTree );
+ s.delete( chrismasTree );
+ tx.commit();
+ s.close();
+ }
+
+ public void testIdClass() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Footballer fb = new Footballer( "David", "Beckam", "Arsenal" );
+ GoalKeeper keeper = new GoalKeeper( "Fabien", "Bartez", "OM" );
+ s.persist( fb );
+ s.persist( keeper );
+ tx.commit();
+ s.clear();
+
+ //lookup by id
+ tx = s.beginTransaction();
+ FootballerPk fpk = new FootballerPk( "David", "Beckam" );
+ fb = (Footballer) s.get( Footballer.class, fpk );
+ FootballerPk fpk2 = new FootballerPk( "Fabien", "Bartez" );
+ keeper = (GoalKeeper) s.get( GoalKeeper.class, fpk2 );
+ assertNotNull( fb );
+ assertNotNull( keeper );
+ assertEquals( "Beckam", fb.getLastname() );
+ assertEquals( "Arsenal", fb.getClub() );
+ assertEquals( 1, s.createQuery( "from Footballer f where f.firstname = 'David'" ).list().size() );
+ tx.commit();
+
+ //reattach by merge
+ tx = s.beginTransaction();
+ fb.setClub( "Bimbo FC" );
+ s.merge( fb );
+ tx.commit();
+
+ //reattach by saveOrUpdate
+ tx = s.beginTransaction();
+ fb.setClub( "Bimbo FC SA" );
+ s.saveOrUpdate( fb );
+ tx.commit();
+
+ //clean up
+ s.clear();
+ tx = s.beginTransaction();
+ fpk = new FootballerPk( "David", "Beckam" );
+ fb = (Footballer) s.get( Footballer.class, fpk );
+ assertEquals( "Bimbo FC SA", fb.getClub() );
+ s.delete( fb );
+ s.delete( keeper );
+ tx.commit();
+ s.close();
+ }
+
+ public void testColumnDefinition() {
+ Column idCol = (Column) getCfg().getClassMapping( Ball.class.getName() ).getIdentifierProperty().getValue()
+ .getColumnIterator().next();
+ assertEquals( "ball_id", idCol.getName() );
+ }
+
+ public void testLowAllocationSize() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ int size = 4;
+ BreakDance[] bds = new BreakDance[size];
+ for (int i = 0 ; i < size ; i++) {
+ bds[i] = new BreakDance();
+ s.persist( bds[i] );
+ }
+ s.flush();
+ for (int i = 0 ; i < size ; i++) {
+ assertEquals(i + 1, bds[i].id.intValue() );
+ }
+ tx.rollback();
+ s.close();
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ Ball.class,
+ Shoe.class,
+ Store.class,
+ Department.class,
+ Dog.class,
+ Computer.class,
+ Home.class,
+ Phone.class,
+ Tree.class,
+ FirTree.class,
+ Footballer.class,
+ SoundSystem.class,
+ Furniture.class,
+ GoalKeeper.class,
+ BreakDance.class
+ };
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getAnnotatedPackages()
+ */
+ protected String[] getAnnotatedPackages() {
+ return new String[]{
+ "org.hibernate.test.annotations",
+ "org.hibernate.test.annotations.id"
+ };
+ }
+
+ @Override
+ protected String[] getXmlFiles() {
+ return new String[] {
+ "org/hibernate/test/annotations/orm.xml"
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Location.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Location.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Location.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import java.io.Serializable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Location implements Serializable {
- public double longitude;
- public double latitude;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final Location location = (Location) o;
-
- if ( Double.compare( location.latitude, latitude ) != 0 ) return false;
- if ( Double.compare( location.longitude, longitude ) != 0 ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- long temp;
- temp = longitude != +0.0d ? Double.doubleToLongBits( longitude ) : 0L;
- result = (int) ( temp ^ ( temp >>> 32 ) );
- temp = latitude != +0.0d ? Double.doubleToLongBits( latitude ) : 0L;
- result = 29 * result + (int) ( temp ^ ( temp >>> 32 ) );
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Location.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Location.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Location.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Location.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Location implements Serializable {
+ public double longitude;
+ public double latitude;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final Location location = (Location) o;
+
+ if ( Double.compare( location.latitude, latitude ) != 0 ) return false;
+ if ( Double.compare( location.longitude, longitude ) != 0 ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ long temp;
+ temp = longitude != +0.0d ? Double.doubleToLongBits( longitude ) : 0L;
+ result = (int) ( temp ^ ( temp >>> 32 ) );
+ temp = latitude != +0.0d ? Double.doubleToLongBits( latitude ) : 0L;
+ result = 29 * result + (int) ( temp ^ ( temp >>> 32 ) );
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/MilitaryBuilding.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/MilitaryBuilding.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/MilitaryBuilding.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
- at IdClass(Location.class)
-public class MilitaryBuilding {
- @Id
- public double longitude;
- @Id
- public double latitude;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/MilitaryBuilding.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/MilitaryBuilding.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/MilitaryBuilding.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/MilitaryBuilding.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+ at IdClass(Location.class)
+public class MilitaryBuilding {
+ @Id
+ public double longitude;
+ @Id
+ public double latitude;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Phone.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Phone.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Phone.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity()
-public class Phone {
- private Integer id;
-
- @Id
- @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Phone_Gen")
- @javax.persistence.SequenceGenerator(
- name = "Phone_Gen",
- sequenceName = "phone_seq"
- )
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Phone.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Phone.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Phone.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Phone.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Phone {
+ private Integer id;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "Phone_Gen")
+ @javax.persistence.SequenceGenerator(
+ name = "Phone_Gen",
+ sequenceName = "phone_seq"
+ )
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Shoe.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Shoe.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Shoe.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-/**
- * sample of Sequance generator
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Shoe implements Serializable {
- private Long id;
-
- @Id
- @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
- public Long getId() {
- return id;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Shoe.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Shoe.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Shoe.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Shoe.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * sample of Sequance generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Shoe implements Serializable {
+ private Long id;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_GEN")
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/SoundSystem.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/SoundSystem.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/SoundSystem.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class SoundSystem {
- private String id;
- private String brand;
- private String model;
-
- @Id
- @GeneratedValue(generator = "system-uuid")
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getBrand() {
- return brand;
- }
-
- public void setBrand(String brand) {
- this.brand = brand;
- }
-
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/SoundSystem.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/SoundSystem.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/SoundSystem.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/SoundSystem.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SoundSystem {
+ private String id;
+ private String brand;
+ private String model;
+
+ @Id
+ @GeneratedValue(generator = "system-uuid")
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Store.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Store.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Store.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-/**
- * Sample of class generator
- *
- * @author Emmanuel Bernard
- */
- at Entity
- at javax.persistence.SequenceGenerator(
- name = "SEQ_STORE",
- sequenceName = "my_sequence"
-)
-public class Store implements Serializable {
- private Long id;
-
- @Id
- @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_STORE")
- public Long getId() {
- return id;
- }
-
- public void setId(Long long1) {
- id = long1;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Store.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Store.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Store.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Store.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * Sample of class generator
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at javax.persistence.SequenceGenerator(
+ name = "SEQ_STORE",
+ sequenceName = "my_sequence"
+)
+public class Store implements Serializable {
+ private Long id;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_STORE")
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long long1) {
+ id = long1;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tower.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tower.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tower.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at AttributeOverride(name = "longitude", column = @Column(name = "fld_longitude"))
-public class Tower extends MilitaryBuilding {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tower.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tower.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tower.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tower.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AttributeOverride(name = "longitude", column = @Column(name = "fld_longitude"))
+public class Tower extends MilitaryBuilding {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tree.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tree.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tree.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.id;
-
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Tree {
- private Integer id;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tree.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tree.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tree.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/Tree.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id$
+package org.hibernate.test.annotations.id;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Tree {
+ private Integer id;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/package-info.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/package-info.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,9 +0,0 @@
-//$Id$
-/**
- * Test package for metatata facilities
- * It contains an example of package level metadata
- */
-
- at org.hibernate.annotations.GenericGenerator(name = "system-uuid",
- strategy = "uuid") package org.hibernate.test.annotations.id;
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/package-info.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/package-info.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/package-info.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/id/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,9 @@
+//$Id$
+/**
+ * Test package for metatata facilities
+ * It contains an example of package level metadata
+ */
+
+ at org.hibernate.annotations.GenericGenerator(name = "system-uuid",
+ strategy = "uuid") package org.hibernate.test.annotations.id;
+
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.identifiercollection;
-
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-
-
-/**
- * @author Emmanuel Bernard
- */
-public class IdentifierCollectionTest extends TestCase {
- public void testIdBag() throws Exception {
- Passport passport = new Passport();
- passport.setName( "Emmanuel Bernard" );
- Stamp canada = new Stamp();
- canada.setCountry( "Canada" );
- passport.getStamps().add( canada );
- passport.getVisaStamp().add( canada );
- Stamp norway = new Stamp();
- norway.setCountry( "Norway" );
- passport.getStamps().add( norway );
- passport.getStamps().add(canada);
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist( passport );
- s.flush();
- //s.clear();
- passport = (Passport) s.get( Passport.class, passport.getId() );
- int canadaCount = 0;
- for ( Stamp stamp : passport.getStamps() ) {
- if ( "Canada".equals( stamp.getCountry() ) ) canadaCount++;
- }
- assertEquals( 2, canadaCount );
- assertEquals( 1, passport.getVisaStamp().size() );
- tx.rollback();
- s.close();
- }
- protected Class[] getMappings() {
- return new Class[] {
- Passport.class,
- Stamp.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/IdentifierCollectionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+//$Id: $
+package org.hibernate.test.annotations.identifiercollection;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IdentifierCollectionTest extends TestCase {
+ public void testIdBag() throws Exception {
+ Passport passport = new Passport();
+ passport.setName( "Emmanuel Bernard" );
+ Stamp canada = new Stamp();
+ canada.setCountry( "Canada" );
+ passport.getStamps().add( canada );
+ passport.getVisaStamp().add( canada );
+ Stamp norway = new Stamp();
+ norway.setCountry( "Norway" );
+ passport.getStamps().add( norway );
+ passport.getStamps().add(canada);
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( passport );
+ s.flush();
+ //s.clear();
+ passport = (Passport) s.get( Passport.class, passport.getId() );
+ int canadaCount = 0;
+ for ( Stamp stamp : passport.getStamps() ) {
+ if ( "Canada".equals( stamp.getCountry() ) ) canadaCount++;
+ }
+ assertEquals( 2, canadaCount );
+ assertEquals( 1, passport.getVisaStamp().size() );
+ tx.rollback();
+ s.close();
+ }
+ protected Class[] getMappings() {
+ return new Class[] {
+ Passport.class,
+ Stamp.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,70 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.identifiercollection;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.TableGenerator;
-
-import org.hibernate.annotations.CollectionId;
-import org.hibernate.annotations.Type;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at TableGenerator(name="ids_generator", table="IDS")
-public class Passport {
- @Id @GeneratedValue @Column(name="passport_id") private Long id;
- private String name;
-
- @ManyToMany(cascade = CascadeType.ALL)
- @JoinTable(name="PASSPORT_STAMP")
- @CollectionId(columns = @Column(name="COLLECTION_ID"), type=@Type(type="long"), generator = "generator")
- @TableGenerator(name="generator", table="IDSTAMP")
- private Collection<Stamp> stamps = new ArrayList();
-
- @ManyToMany(cascade = CascadeType.ALL)
- @JoinTable(name="PASSPORT_VISASTAMP")
- @CollectionId(columns = @Column(name="COLLECTION_ID"), type=@Type(type="long"), generator = "ids_generator")
- //TODO test identity generator
- private Collection<Stamp> visaStamp = new ArrayList();
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Collection<Stamp> getStamps() {
- return stamps;
- }
-
- public void setStamps(Collection<Stamp> stamps) {
- this.stamps = stamps;
- }
-
- public Collection<Stamp> getVisaStamp() {
- return visaStamp;
- }
-
- public void setVisaStamp(Collection<Stamp> visaStamp) {
- this.visaStamp = visaStamp;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Passport.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,70 @@
+//$Id: $
+package org.hibernate.test.annotations.identifiercollection;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.TableGenerator;
+
+import org.hibernate.annotations.CollectionId;
+import org.hibernate.annotations.Type;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at TableGenerator(name="ids_generator", table="IDS")
+public class Passport {
+ @Id @GeneratedValue @Column(name="passport_id") private Long id;
+ private String name;
+
+ @ManyToMany(cascade = CascadeType.ALL)
+ @JoinTable(name="PASSPORT_STAMP")
+ @CollectionId(columns = @Column(name="COLLECTION_ID"), type=@Type(type="long"), generator = "generator")
+ @TableGenerator(name="generator", table="IDSTAMP")
+ private Collection<Stamp> stamps = new ArrayList();
+
+ @ManyToMany(cascade = CascadeType.ALL)
+ @JoinTable(name="PASSPORT_VISASTAMP")
+ @CollectionId(columns = @Column(name="COLLECTION_ID"), type=@Type(type="long"), generator = "ids_generator")
+ //TODO test identity generator
+ private Collection<Stamp> visaStamp = new ArrayList();
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Collection<Stamp> getStamps() {
+ return stamps;
+ }
+
+ public void setStamps(Collection<Stamp> stamps) {
+ this.stamps = stamps;
+ }
+
+ public Collection<Stamp> getVisaStamp() {
+ return visaStamp;
+ }
+
+ public void setVisaStamp(Collection<Stamp> visaStamp) {
+ this.visaStamp = visaStamp;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.identifiercollection;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Stamp {
- @Id @GeneratedValue private Long id;
- private String country;
-
- public String getCountry() {
- return country;
- }
-
- public void setCountry(String country) {
- this.country = country;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/identifiercollection/Stamp.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id: $
+package org.hibernate.test.annotations.identifiercollection;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Stamp {
+ @Id @GeneratedValue private Long id;
+ private String country;
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Card.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Card.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Card.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,70 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.idmanytoone;
-
-import java.io.Serializable;
-import java.util.Set;
-import javax.persistence.Embeddable;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.CascadeType;
-import javax.persistence.FetchType;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Card {
-
- @Id
- private CardPrimaryKey primaryKey = new CardPrimaryKey();
-
- @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "primaryKey.card")
- private Set<CardField> fields;
-
- @ManyToOne
- private CardField mainCardField;
-
- @Embeddable
- public static class CardPrimaryKey implements Serializable {
-
- public CardPrimaryKey() {}
-
- @ManyToOne(optional = false)
- private Project project;
-
- public Project getProject() {
- return project;
- }
-
- public void setProject(Project project) {
- this.project = project;
- }
-
- }
-
- public Set<CardField> getFields() {
- return fields;
- }
-
- public void setFields(Set<CardField> fields) {
- this.fields = fields;
- }
-
- public CardPrimaryKey getPrimaryKey() {
- return primaryKey;
- }
-
- public void setPrimaryKey(CardPrimaryKey primaryKey) {
- this.primaryKey = primaryKey;
- }
-
- public CardField getMainCardField() {
- return mainCardField;
- }
-
- public void setMainCardField(CardField mainCardField) {
- this.mainCardField = mainCardField;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Card.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Card.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Card.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Card.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,70 @@
+//$Id: $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Embeddable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.CascadeType;
+import javax.persistence.FetchType;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Card {
+
+ @Id
+ private CardPrimaryKey primaryKey = new CardPrimaryKey();
+
+ @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "primaryKey.card")
+ private Set<CardField> fields;
+
+ @ManyToOne
+ private CardField mainCardField;
+
+ @Embeddable
+ public static class CardPrimaryKey implements Serializable {
+
+ public CardPrimaryKey() {}
+
+ @ManyToOne(optional = false)
+ private Project project;
+
+ public Project getProject() {
+ return project;
+ }
+
+ public void setProject(Project project) {
+ this.project = project;
+ }
+
+ }
+
+ public Set<CardField> getFields() {
+ return fields;
+ }
+
+ public void setFields(Set<CardField> fields) {
+ this.fields = fields;
+ }
+
+ public CardPrimaryKey getPrimaryKey() {
+ return primaryKey;
+ }
+
+ public void setPrimaryKey(CardPrimaryKey primaryKey) {
+ this.primaryKey = primaryKey;
+ }
+
+ public CardField getMainCardField() {
+ return mainCardField;
+ }
+
+ public void setMainCardField(CardField mainCardField) {
+ this.mainCardField = mainCardField;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardField.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardField.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardField.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,64 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.idmanytoone;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class CardField {
-
- @Id
- private PrimaryKey primaryKey = new PrimaryKey();
-
- @ManyToOne
- private Card cardtmp;
-
- @Embeddable
- public static class PrimaryKey implements Serializable {
-
- @ManyToOne(optional = false)
- private Card card;
-
- @ManyToOne(optional = false)
- private CardKey key;
-
- public Card getCard() {
- return card;
- }
-
- public void setCard(Card card) {
- this.card = card;
- }
-
- public CardKey getKey() {
- return key;
- }
-
- public void setKey(CardKey key) {
- this.key = key;
- }
- }
-
- public Card getCardtmp() {
- return cardtmp;
- }
-
- public void setCardtmp(Card cardtmp) {
- this.cardtmp = cardtmp;
- }
-
- public PrimaryKey getPrimaryKey() {
- return primaryKey;
- }
-
- public void setPrimaryKey(PrimaryKey primaryKey) {
- this.primaryKey = primaryKey;
- }
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardField.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardField.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardField.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardField.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,64 @@
+//$Id: $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CardField {
+
+ @Id
+ private PrimaryKey primaryKey = new PrimaryKey();
+
+ @ManyToOne
+ private Card cardtmp;
+
+ @Embeddable
+ public static class PrimaryKey implements Serializable {
+
+ @ManyToOne(optional = false)
+ private Card card;
+
+ @ManyToOne(optional = false)
+ private CardKey key;
+
+ public Card getCard() {
+ return card;
+ }
+
+ public void setCard(Card card) {
+ this.card = card;
+ }
+
+ public CardKey getKey() {
+ return key;
+ }
+
+ public void setKey(CardKey key) {
+ this.key = key;
+ }
+ }
+
+ public Card getCardtmp() {
+ return cardtmp;
+ }
+
+ public void setCardtmp(Card cardtmp) {
+ this.cardtmp = cardtmp;
+ }
+
+ public PrimaryKey getPrimaryKey() {
+ return primaryKey;
+ }
+
+ public void setPrimaryKey(PrimaryKey primaryKey) {
+ this.primaryKey = primaryKey;
+ }
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardKey.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardKey.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardKey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.idmanytoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class CardKey {
- @Id
- @GeneratedValue
- private int id;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardKey.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardKey.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardKey.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/CardKey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.test.annotations.idmanytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CardKey {
+ @Id
+ @GeneratedValue
+ private int id;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Customer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Customer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Customer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.idmanytoone;
-
-import java.io.Serializable;
-import java.util.Set;
-import javax.persistence.Table;
-import javax.persistence.Entity;
-import javax.persistence.OneToMany;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
-
-
-
- at Entity
- at Table(name = "Bs")
-public class Customer implements Serializable {
- @Id @GeneratedValue
- public Integer id;
-
- @OneToMany(mappedBy = "customer")
- public Set<StoreCustomer> stores;
-
- private static final long serialVersionUID = 3818501706063039923L;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Customer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Customer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Customer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Customer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id: $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Table;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+
+
+ at Entity
+ at Table(name = "Bs")
+public class Customer implements Serializable {
+ @Id @GeneratedValue
+ public Integer id;
+
+ @OneToMany(mappedBy = "customer")
+ public Set<StoreCustomer> stores;
+
+ private static final long serialVersionUID = 3818501706063039923L;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/IdManyToOne.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/IdManyToOne.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/IdManyToOne.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,72 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.idmanytoone;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class IdManyToOne extends TestCase {
- public void testFkCreationOrdering() throws Exception {
- //no real test case, the sessionFactory building is tested
- Session s = openSession();
- s.close();
- }
-
- public void getBiDirOneToManyInId() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- CardKey key = new CardKey();
- s.persist( key );
- Project project = new Project();
- s.persist( project );
- Card card = new Card();
- card.getPrimaryKey().setProject( project );
- s.persist( card );
- CardField field = new CardField();
- field.getPrimaryKey().setKey( key );
- field.getPrimaryKey().setCard( card );
- s.persist( field );
- card.setMainCardField( field );
- s.flush();
- s.clear();
- card = (Card) s.createQuery( "from Card c").list().get(0);
- assertEquals( 1, card.getFields().size() );
- assertEquals( card.getMainCardField(), card.getFields().iterator().next() );
- tx.rollback();
- s.close();
- }
-
- public void testIdClassManyToOne() {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Store store = new Store();
- Customer customer = new Customer();
- s.persist( store );
- s.persist( customer );
- StoreCustomer sc = new StoreCustomer( store, customer );
- s.persist( sc );
- s.flush();
- s.clear();
-
- store = (Store) s.get(Store.class, store.id );
- assertEquals( 1, store.customers.size() );
- assertEquals( customer.id, store.customers.iterator().next().customer.id );
- tx.rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- Store.class,
- Customer.class,
- StoreCustomer.class,
- CardKey.class,
- CardField.class,
- Card.class,
- Project.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/IdManyToOne.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/IdManyToOne.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/IdManyToOne.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/IdManyToOne.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,72 @@
+//$Id: $
+package org.hibernate.test.annotations.idmanytoone;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IdManyToOne extends TestCase {
+ public void testFkCreationOrdering() throws Exception {
+ //no real test case, the sessionFactory building is tested
+ Session s = openSession();
+ s.close();
+ }
+
+ public void getBiDirOneToManyInId() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ CardKey key = new CardKey();
+ s.persist( key );
+ Project project = new Project();
+ s.persist( project );
+ Card card = new Card();
+ card.getPrimaryKey().setProject( project );
+ s.persist( card );
+ CardField field = new CardField();
+ field.getPrimaryKey().setKey( key );
+ field.getPrimaryKey().setCard( card );
+ s.persist( field );
+ card.setMainCardField( field );
+ s.flush();
+ s.clear();
+ card = (Card) s.createQuery( "from Card c").list().get(0);
+ assertEquals( 1, card.getFields().size() );
+ assertEquals( card.getMainCardField(), card.getFields().iterator().next() );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testIdClassManyToOne() {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Store store = new Store();
+ Customer customer = new Customer();
+ s.persist( store );
+ s.persist( customer );
+ StoreCustomer sc = new StoreCustomer( store, customer );
+ s.persist( sc );
+ s.flush();
+ s.clear();
+
+ store = (Store) s.get(Store.class, store.id );
+ assertEquals( 1, store.customers.size() );
+ assertEquals( customer.id, store.customers.iterator().next().customer.id );
+ tx.rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Store.class,
+ Customer.class,
+ StoreCustomer.class,
+ CardKey.class,
+ CardField.class,
+ Card.class,
+ Project.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Project.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Project.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Project.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.idmanytoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Project {
-
- @Id
- @GeneratedValue
- private int id;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Project.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Project.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Project.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Project.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.test.annotations.idmanytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Project {
+
+ @Id
+ @GeneratedValue
+ private int id;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Store.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Store.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Store.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.idmanytoone;
-
-import java.io.Serializable;
-import java.util.Set;
-import javax.persistence.Table;
-import javax.persistence.Entity;
-import javax.persistence.OneToMany;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "`As`")
-public class Store implements Serializable {
- @Id @GeneratedValue
- public Integer id;
-
- @OneToMany(mappedBy = "store")
- public Set<StoreCustomer> customers;
-
-
- private static final long serialVersionUID = 1748046699322502790L;
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Store.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Store.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Store.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/Store.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id: $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Table;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "`As`")
+public class Store implements Serializable {
+ @Id @GeneratedValue
+ public Integer id;
+
+ @OneToMany(mappedBy = "store")
+ public Set<StoreCustomer> customers;
+
+
+ private static final long serialVersionUID = 1748046699322502790L;
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.idmanytoone;
-
-import java.io.Serializable;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.IdClass;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "ABs")
- at IdClass( StoreCustomerPK.class)
-public class StoreCustomer implements Serializable {
- StoreCustomer() {}
- @Id
- @ManyToOne(optional = false)
- @JoinColumn(name = "idA")
- public Store store;
-
- @Id
- @ManyToOne(optional = false)
- @JoinColumn(name = "idB")
- public Customer customer;
-
-
- public StoreCustomer(Store store, Customer customer) {
- this.store = store;
- this.customer = customer;
- }
-
-
- private static final long serialVersionUID = -8295955012787627232L;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id: $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.IdClass;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "ABs")
+ at IdClass( StoreCustomerPK.class)
+public class StoreCustomer implements Serializable {
+ StoreCustomer() {}
+ @Id
+ @ManyToOne(optional = false)
+ @JoinColumn(name = "idA")
+ public Store store;
+
+ @Id
+ @ManyToOne(optional = false)
+ @JoinColumn(name = "idB")
+ public Customer customer;
+
+
+ public StoreCustomer(Store store, Customer customer) {
+ this.store = store;
+ this.customer = customer;
+ }
+
+
+ private static final long serialVersionUID = -8295955012787627232L;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.idmanytoone;
-
-import java.io.Serializable;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
-public class StoreCustomerPK implements Serializable {
- StoreCustomerPK() {}
- @Id
- @ManyToOne(optional = false)
- @JoinColumn(name = "idA")
- public Store store;
-
- @Id
- @ManyToOne(optional = false)
- @JoinColumn(name = "idB")
- public Customer customer;
-
-
- public StoreCustomerPK(Store store, Customer customer) {
- this.store = store;
- this.customer = customer;
- }
-
-
- private static final long serialVersionUID = -1102111921432271459L;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/idmanytoone/StoreCustomerPK.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id: $
+package org.hibernate.test.annotations.idmanytoone;
+
+import java.io.Serializable;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class StoreCustomerPK implements Serializable {
+ StoreCustomerPK() {}
+ @Id
+ @ManyToOne(optional = false)
+ @JoinColumn(name = "idA")
+ public Store store;
+
+ @Id
+ @ManyToOne(optional = false)
+ @JoinColumn(name = "idB")
+ public Customer customer;
+
+
+ public StoreCustomerPK(Store store, Customer customer) {
+ this.store = store;
+ this.customer = customer;
+ }
+
+
+ private static final long serialVersionUID = -1102111921432271459L;
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressBook.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressBook.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressBook.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,75 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.MapKey;
-import javax.persistence.OneToMany;
-import javax.persistence.JoinTable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class AddressBook {
- private Integer id;
- private String owner;
- private Map<AddressEntryPk, AddressEntry> entries = new HashMap<AddressEntryPk, AddressEntry>();
- private Map<String, AddressEntry> lastNameEntries = new HashMap<String, AddressEntry>();
- private Map<AlphabeticalDirectory, AddressEntry> directoryEntries = new HashMap<AlphabeticalDirectory, AddressEntry>();
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getOwner() {
- return owner;
- }
-
- public void setOwner(String owner) {
- this.owner = owner;
- }
-
- @MapKey
- @OneToMany(mappedBy = "book", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
- @JoinTable(name="AddRegEntry")
- public Map<AddressEntryPk, AddressEntry> getEntries() {
- return entries;
- }
-
- public void setEntries(Map<AddressEntryPk, AddressEntry> entries) {
- this.entries = entries;
- }
-
- @MapKey(name = "person.lastname")
- @OneToMany(mappedBy = "book")
- public Map<String, AddressEntry> getLastNameEntries() {
- return lastNameEntries;
- }
-
- public void setLastNameEntries(Map<String, AddressEntry> lastNameEntries) {
- this.lastNameEntries = lastNameEntries;
- }
-
- @MapKey(name = "directory")
- @OneToMany(mappedBy = "book")
- @JoinTable(name="Dir_Entry")
- public Map<AlphabeticalDirectory, AddressEntry> getDirectoryEntries() {
- return directoryEntries;
- }
-
- public void setDirectoryEntries(Map<AlphabeticalDirectory, AddressEntry> directoryEntries) {
- this.directoryEntries = directoryEntries;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressBook.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressBook.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressBook.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressBook.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,75 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MapKey;
+import javax.persistence.OneToMany;
+import javax.persistence.JoinTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class AddressBook {
+ private Integer id;
+ private String owner;
+ private Map<AddressEntryPk, AddressEntry> entries = new HashMap<AddressEntryPk, AddressEntry>();
+ private Map<String, AddressEntry> lastNameEntries = new HashMap<String, AddressEntry>();
+ private Map<AlphabeticalDirectory, AddressEntry> directoryEntries = new HashMap<AlphabeticalDirectory, AddressEntry>();
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ @MapKey
+ @OneToMany(mappedBy = "book", cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REMOVE})
+ @JoinTable(name="AddRegEntry")
+ public Map<AddressEntryPk, AddressEntry> getEntries() {
+ return entries;
+ }
+
+ public void setEntries(Map<AddressEntryPk, AddressEntry> entries) {
+ this.entries = entries;
+ }
+
+ @MapKey(name = "person.lastname")
+ @OneToMany(mappedBy = "book")
+ public Map<String, AddressEntry> getLastNameEntries() {
+ return lastNameEntries;
+ }
+
+ public void setLastNameEntries(Map<String, AddressEntry> lastNameEntries) {
+ this.lastNameEntries = lastNameEntries;
+ }
+
+ @MapKey(name = "directory")
+ @OneToMany(mappedBy = "book")
+ @JoinTable(name="Dir_Entry")
+ public Map<AlphabeticalDirectory, AddressEntry> getDirectoryEntries() {
+ return directoryEntries;
+ }
+
+ public void setDirectoryEntries(Map<AlphabeticalDirectory, AddressEntry> directoryEntries) {
+ this.directoryEntries = directoryEntries;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntry.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntry.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntry.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,76 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class AddressEntry {
- private AddressEntryPk person;
- private String street;
- private String city;
- private AddressBook book;
- private AlphabeticalDirectory directory;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof AddressEntry ) ) return false;
-
- final AddressEntry addressEntry = (AddressEntry) o;
-
- if ( !person.equals( addressEntry.person ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return person.hashCode();
- }
-
- @EmbeddedId
- public AddressEntryPk getPerson() {
- return person;
- }
-
- public void setPerson(AddressEntryPk person) {
- this.person = person;
- }
-
- public String getStreet() {
- return street;
- }
-
- public void setStreet(String street) {
- this.street = street;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- @ManyToOne
- public AddressBook getBook() {
- return book;
- }
-
- public void setBook(AddressBook book) {
- this.book = book;
- }
-
- @ManyToOne
- public AlphabeticalDirectory getDirectory() {
- return directory;
- }
-
- public void setDirectory(AlphabeticalDirectory directory) {
- this.directory = directory;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntry.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntry.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntry.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntry.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,76 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class AddressEntry {
+ private AddressEntryPk person;
+ private String street;
+ private String city;
+ private AddressBook book;
+ private AlphabeticalDirectory directory;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof AddressEntry ) ) return false;
+
+ final AddressEntry addressEntry = (AddressEntry) o;
+
+ if ( !person.equals( addressEntry.person ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return person.hashCode();
+ }
+
+ @EmbeddedId
+ public AddressEntryPk getPerson() {
+ return person;
+ }
+
+ public void setPerson(AddressEntryPk person) {
+ this.person = person;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ @ManyToOne
+ public AddressBook getBook() {
+ return book;
+ }
+
+ public void setBook(AddressBook book) {
+ this.book = book;
+ }
+
+ @ManyToOne
+ public AlphabeticalDirectory getDirectory() {
+ return directory;
+ }
+
+ public void setDirectory(AlphabeticalDirectory directory) {
+ this.directory = directory;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class AddressEntryPk implements Serializable {
- private String firstname;
- private String lastname;
-
- public AddressEntryPk() {
- }
-
- public AddressEntryPk(String firstname, String lastname) {
- this.firstname = firstname;
- this.lastname = lastname;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof AddressEntryPk ) ) return false;
-
- final AddressEntryPk addressEntryPk = (AddressEntryPk) o;
-
- if ( !firstname.equals( addressEntryPk.firstname ) ) return false;
- if ( !lastname.equals( addressEntryPk.lastname ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = firstname.hashCode();
- result = 29 * result + lastname.hashCode();
- return result;
- }
-
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AddressEntryPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class AddressEntryPk implements Serializable {
+ private String firstname;
+ private String lastname;
+
+ public AddressEntryPk() {
+ }
+
+ public AddressEntryPk(String firstname, String lastname) {
+ this.firstname = firstname;
+ this.lastname = lastname;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof AddressEntryPk ) ) return false;
+
+ final AddressEntryPk addressEntryPk = (AddressEntryPk) o;
+
+ if ( !firstname.equals( addressEntryPk.firstname ) ) return false;
+ if ( !lastname.equals( addressEntryPk.lastname ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = firstname.hashCode();
+ result = 29 * result + lastname.hashCode();
+ return result;
+ }
+
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class AlphabeticalDirectory {
- @Id @GeneratedValue private Integer id;
- private String name;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/AlphabeticalDirectory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class AlphabeticalDirectory {
+ @Id @GeneratedValue private Integer id;
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-import javax.persistence.Column;
-import javax.persistence.JoinTable;
-import javax.persistence.JoinColumn;
-
-import org.hibernate.annotations.MapKey;
-import org.hibernate.annotations.CollectionOfElements;
-import org.hibernate.annotations.MapKeyManyToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Atmosphere {
- @Id
- @GeneratedValue
- public Integer id;
-
- @ManyToMany(cascade = CascadeType.ALL)
- @MapKey(columns = {@Column(name="gas_name")})
- public Map<String, Gas> gases = new HashMap<String, Gas>();
-
- @ManyToMany(cascade = CascadeType.ALL)
- @MapKeyManyToMany(joinColumns = @JoinColumn(name="gas_id") )
- @JoinTable(name = "Gas_per_key")
- public Map<GasKey, Gas> gasesPerKey = new HashMap<GasKey, Gas>();
-
- @CollectionOfElements
- @Column(name="composition_rate")
- @MapKeyManyToMany(joinColumns = @JoinColumn(name="gas_id"))
- @JoinTable(name = "Composition", joinColumns = @JoinColumn(name = "atmosphere_id"))
- public Map<Gas, Double> composition = new HashMap<Gas, Double>();
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Atmosphere.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.Column;
+import javax.persistence.JoinTable;
+import javax.persistence.JoinColumn;
+
+import org.hibernate.annotations.MapKey;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.MapKeyManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Atmosphere {
+ @Id
+ @GeneratedValue
+ public Integer id;
+
+ @ManyToMany(cascade = CascadeType.ALL)
+ @MapKey(columns = {@Column(name="gas_name")})
+ public Map<String, Gas> gases = new HashMap<String, Gas>();
+
+ @ManyToMany(cascade = CascadeType.ALL)
+ @MapKeyManyToMany(joinColumns = @JoinColumn(name="gas_id") )
+ @JoinTable(name = "Gas_per_key")
+ public Map<GasKey, Gas> gasesPerKey = new HashMap<GasKey, Gas>();
+
+ @CollectionOfElements
+ @Column(name="composition_rate")
+ @MapKeyManyToMany(joinColumns = @JoinColumn(name="gas_id"))
+ @JoinTable(name = "Composition", joinColumns = @JoinColumn(name = "atmosphere_id"))
+ public Map<Gas, Double> composition = new HashMap<Gas, Double>();
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Drawer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Drawer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Drawer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,59 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.List;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-import org.hibernate.annotations.IndexColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Drawer {
- private Long id;
- private List<Dress> dresses;
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- /**
- * Unidirectional one to many list
- *
- * @return
- */
- @OneToMany
- @IndexColumn(name = "from_bottom_position")
- public List<Dress> getDresses() {
- return dresses;
- }
-
- public void setDresses(List<Dress> dresses) {
- this.dresses = dresses;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Drawer ) ) return false;
-
- final Drawer drawer = (Drawer) o;
-
- if ( !getId().equals( drawer.getId() ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return getId().hashCode();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Drawer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Drawer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Drawer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Drawer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,59 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.IndexColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Drawer {
+ private Long id;
+ private List<Dress> dresses;
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ /**
+ * Unidirectional one to many list
+ *
+ * @return
+ */
+ @OneToMany
+ @IndexColumn(name = "from_bottom_position")
+ public List<Dress> getDresses() {
+ return dresses;
+ }
+
+ public void setDresses(List<Dress> dresses) {
+ this.dresses = dresses;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Drawer ) ) return false;
+
+ final Drawer drawer = (Drawer) o;
+
+ if ( !getId().equals( drawer.getId() ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return getId().hashCode();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Dress.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Dress.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Dress.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Dress {
- private Integer id;
-
- @Id
- @GeneratedValue
- @Column(name = "dress_id")
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Dress ) ) return false;
-
- final Dress dress = (Dress) o;
-
- if ( !getId().equals( dress.getId() ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return getId().hashCode();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Dress.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Dress.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Dress.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Dress.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Dress {
+ private Integer id;
+
+ @Id
+ @GeneratedValue
+ @Column(name = "dress_id")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Dress ) ) return false;
+
+ final Dress dress = (Dress) o;
+
+ if ( !getId().equals( dress.getId() ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return getId().hashCode();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Gas.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Gas.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Gas.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Gas {
- @Id
- @GeneratedValue
- public Integer id;
- public String name;
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Gas.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Gas.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Gas.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Gas.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Gas {
+ @Id
+ @GeneratedValue
+ public Integer id;
+ public String name;
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class GasKey {
- @Id private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GasKey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GasKey {
+ @Id private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Generation.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Generation.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Generation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class Generation {
-
- private String age;
- private String culture;
-
- public String getAge() {
- return age;
- }
- public void setAge(String age) {
- this.age = age;
- }
- public String getCulture() {
- return culture;
- }
- public void setCulture(String culture) {
- this.culture = culture;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Generation.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Generation.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Generation.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Generation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Generation {
+
+ private String age;
+ private String culture;
+
+ public String getAge() {
+ return age;
+ }
+ public void setAge(String age) {
+ this.age = age;
+ }
+ public String getCulture() {
+ return culture;
+ }
+ public void setCulture(String culture) {
+ this.culture = culture;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationGroup.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationGroup.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationGroup.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,37 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class GenerationGroup {
-
- @Id
- @GeneratedValue
- private int id;
-
- private Generation generation;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public Generation getGeneration() {
- return generation;
- }
-
- public void setGeneration(Generation generation) {
- this.generation = generation;
- }
-
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationGroup.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationGroup.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationGroup.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationGroup.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,37 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GenerationGroup {
+
+ @Id
+ @GeneratedValue
+ private int id;
+
+ private Generation generation;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public Generation getGeneration() {
+ return generation;
+ }
+
+ public void setGeneration(Generation generation) {
+ this.generation = generation;
+ }
+
+
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationUser.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationUser.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationUser.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.Map;
-import java.util.HashMap;
-import javax.persistence.OneToMany;
-import javax.persistence.Id;
-import javax.persistence.Entity;
-import javax.persistence.MapKey;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class GenerationUser {
-
- @Id
- @GeneratedValue
- private int id;
-
- @OneToMany
- @MapKey(name="generation")
- private Map<Generation, GenerationGroup> ref = new HashMap<Generation, GenerationGroup>();
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public Map<Generation, GenerationGroup> getRef() {
- return ref;
- }
-
- public void setRef(Map<Generation, GenerationGroup> ref) {
- this.ref = ref;
- }
-
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationUser.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationUser.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationUser.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/GenerationUser.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.OneToMany;
+import javax.persistence.Id;
+import javax.persistence.Entity;
+import javax.persistence.MapKey;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class GenerationUser {
+
+ @Id
+ @GeneratedValue
+ private int id;
+
+ @OneToMany
+ @MapKey(name="generation")
+ private Map<Generation, GenerationGroup> ref = new HashMap<Generation, GenerationGroup>();
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public Map<Generation, GenerationGroup> getRef() {
+ return ref;
+ }
+
+ public void setRef(Map<Generation, GenerationGroup> ref) {
+ this.ref = ref;
+ }
+
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,546 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.Hibernate;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * Test index collections
- *
- * @author Emmanuel Bernard
- */
-public class IndexedCollectionTest extends TestCase {
- public void testFkList() throws Exception {
- Wardrobe w = new Wardrobe();
- Drawer d1 = new Drawer();
- Drawer d2 = new Drawer();
- w.setDrawers( new ArrayList<Drawer>() );
- w.getDrawers().add( d1 );
- w.getDrawers().add( d2 );
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( w );
-
- s.flush();
- s.clear();
-
- w = (Wardrobe) s.get( Wardrobe.class, w.getId() );
- assertNotNull( w );
- assertNotNull( w.getDrawers() );
- List<Drawer> result = w.getDrawers();
- assertEquals( 2, result.size() );
- assertEquals( d2.getId(), result.get( 1 ).getId() );
- result.remove( d1 );
- s.flush();
- d1 = (Drawer) s.merge( d1 );
- result.add( d1 );
-
- s.flush();
- s.clear();
-
- w = (Wardrobe) s.get( Wardrobe.class, w.getId() );
- assertNotNull( w );
- assertNotNull( w.getDrawers() );
- result = w.getDrawers();
- assertEquals( 2, result.size() );
- assertEquals( d1.getId(), result.get( 1 ).getId() );
- s.delete( result.get( 0 ) );
- s.delete( result.get( 1 ) );
- s.delete( w );
- s.flush();
- tx.rollback();
- s.close();
- }
-
- public void testJoinedTableList() throws Exception {
- Wardrobe w = new Wardrobe();
- w.setDrawers( new ArrayList<Drawer>() );
- Drawer d = new Drawer();
- w.getDrawers().add( d );
- Dress d1 = new Dress();
- Dress d2 = new Dress();
- d.setDresses( new ArrayList<Dress>() );
- d.getDresses().add( d1 );
- d.getDresses().add( d2 );
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( d1 );
- s.persist( d2 );
- s.persist( w );
-
- s.flush();
- s.clear();
-
- d = (Drawer) s.get( Drawer.class, d.getId() );
- assertNotNull( d );
- assertNotNull( d.getDresses() );
- List<Dress> result = d.getDresses();
- assertEquals( 2, result.size() );
- assertEquals( d2.getId(), result.get( 1 ).getId() );
- result.remove( d1 );
- s.flush();
- d1 = (Dress) s.merge( d1 );
- result.add( d1 );
-
- s.flush();
- s.clear();
-
- d = (Drawer) s.get( Drawer.class, d.getId() );
- assertNotNull( d );
- assertNotNull( d.getDresses() );
- result = d.getDresses();
- assertEquals( 2, result.size() );
- assertEquals( d1.getId(), result.get( 1 ).getId() );
- s.delete( result.get( 0 ) );
- s.delete( result.get( 1 ) );
- s.delete( d );
- s.flush();
- tx.rollback();
- s.close();
- }
-
- public void testMapKey() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Software hibernate = new Software();
- hibernate.setName( "Hibernate" );
- Version v1 = new Version();
- v1.setCodeName( "HumbaHumba" );
- v1.setNumber( "1.0" );
- v1.setSoftware( hibernate );
- Version v2 = new Version();
- v2.setCodeName( "Copacabana" );
- v2.setNumber( "2.0" );
- v2.setSoftware( hibernate );
- Version v4 = new Version();
- v4.setCodeName( "Dreamland" );
- v4.setNumber( "4.0" );
- v4.setSoftware( hibernate );
- Map<String, Version> link = new HashMap<String, Version>();
- link.put( v1.getCodeName(), v1 );
- link.put( v2.getCodeName(), v2 );
- link.put( v4.getCodeName(), v4 );
- hibernate.setVersions( link );
- s.persist( hibernate );
- s.persist( v1 );
- s.persist( v2 );
- s.persist( v4 );
-
- s.flush();
- s.clear();
-
- hibernate = (Software) s.get( Software.class, "Hibernate" );
- assertEquals( 3, hibernate.getVersions().size() );
- assertEquals( "1.0", hibernate.getVersions().get( "HumbaHumba" ).getNumber() );
- assertEquals( "2.0", hibernate.getVersions().get( "Copacabana" ).getNumber() );
- hibernate.getVersions().remove( v4.getCodeName() );
-
- s.flush();
- s.clear();
-
- hibernate = (Software) s.get( Software.class, "Hibernate" );
- assertEquals( "So effect on collection changes", 3, hibernate.getVersions().size() );
- for ( Version v : hibernate.getVersions().values() ) {
- s.delete( v );
- }
- s.delete( hibernate );
-
- s.flush();
-
- tx.rollback();
- s.close();
- }
-
- public void testDefaultMapKey() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- AddressBook book = new AddressBook();
- book.setOwner( "Emmanuel" );
- AddressEntryPk helene = new AddressEntryPk( "Helene", "Michau" );
- AddressEntry heleneEntry = new AddressEntry();
- heleneEntry.setBook( book );
- heleneEntry.setCity( "Levallois" );
- heleneEntry.setStreet( "Louis Blanc" );
- heleneEntry.setPerson( helene );
- AddressEntryPk primeMinister = new AddressEntryPk( "Dominique", "Villepin" );
- AddressEntry primeMinisterEntry = new AddressEntry();
- primeMinisterEntry.setBook( book );
- primeMinisterEntry.setCity( "Paris" );
- primeMinisterEntry.setStreet( "Hotel Matignon" );
- primeMinisterEntry.setPerson( primeMinister );
- book.getEntries().put( helene, heleneEntry );
- book.getEntries().put( primeMinister, primeMinisterEntry );
- s.persist( book );
-
- s.flush();
- s.clear();
-
- book = (AddressBook) s.get( AddressBook.class, book.getId() );
- assertEquals( 2, book.getEntries().size() );
- assertEquals( heleneEntry.getCity(), book.getEntries().get( helene ).getCity() );
- AddressEntryPk fake = new AddressEntryPk( "Fake", "Fake" );
- book.getEntries().put( fake, primeMinisterEntry );
-
- s.flush();
- s.clear();
-
- book = (AddressBook) s.get( AddressBook.class, book.getId() );
- assertEquals( 2, book.getEntries().size() );
- assertNull( book.getEntries().get( fake ) );
- s.delete( book );
-
- s.flush();
- tx.rollback();
- s.close();
- }
-
- public void testMapKeyToEntity() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- AlphabeticalDirectory m = new AlphabeticalDirectory();
- m.setName( "M" );
- AlphabeticalDirectory v = new AlphabeticalDirectory();
- v.setName( "V" );
- s.persist( m );
- s.persist( v );
-
- AddressBook book = new AddressBook();
- book.setOwner( "Emmanuel" );
- AddressEntryPk helene = new AddressEntryPk( "Helene", "Michau" );
- AddressEntry heleneEntry = new AddressEntry();
- heleneEntry.setBook( book );
- heleneEntry.setCity( "Levallois" );
- heleneEntry.setStreet( "Louis Blanc" );
- heleneEntry.setPerson( helene );
- heleneEntry.setDirectory( m );
- AddressEntryPk primeMinister = new AddressEntryPk( "Dominique", "Villepin" );
- AddressEntry primeMinisterEntry = new AddressEntry();
- primeMinisterEntry.setBook( book );
- primeMinisterEntry.setCity( "Paris" );
- primeMinisterEntry.setStreet( "Hotel Matignon" );
- primeMinisterEntry.setPerson( primeMinister );
- primeMinisterEntry.setDirectory( v );
- book.getEntries().put( helene, heleneEntry );
- book.getEntries().put( primeMinister, primeMinisterEntry );
- s.persist( book );
-
- s.flush();
- s.clear();
-
- book = (AddressBook) s.get( AddressBook.class, book.getId() );
- assertEquals( 2, book.getEntries().size() );
- assertEquals( heleneEntry.getCity(), book.getEntries().get( helene ).getCity() );
- assertEquals( "M", book.getEntries().get( helene ).getDirectory().getName() );
-
- s.delete( book );
- tx.rollback();
- s.close();
- }
-
- public void testComponentSubPropertyMapKey() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- AddressBook book = new AddressBook();
- book.setOwner( "Emmanuel" );
- AddressEntryPk helene = new AddressEntryPk( "Helene", "Michau" );
- AddressEntry heleneEntry = new AddressEntry();
- heleneEntry.setBook( book );
- heleneEntry.setCity( "Levallois" );
- heleneEntry.setStreet( "Louis Blanc" );
- heleneEntry.setPerson( helene );
- AddressEntryPk primeMinister = new AddressEntryPk( "Dominique", "Villepin" );
- AddressEntry primeMinisterEntry = new AddressEntry();
- primeMinisterEntry.setBook( book );
- primeMinisterEntry.setCity( "Paris" );
- primeMinisterEntry.setStreet( "Hotel Matignon" );
- primeMinisterEntry.setPerson( primeMinister );
- book.getEntries().put( helene, heleneEntry );
- book.getEntries().put( primeMinister, primeMinisterEntry );
- s.persist( book );
-
- s.flush();
- s.clear();
-
- book = (AddressBook) s.get( AddressBook.class, book.getId() );
- assertEquals( 2, book.getLastNameEntries().size() );
- assertEquals( heleneEntry.getCity(), book.getLastNameEntries().get( "Michau" ).getCity() );
- AddressEntryPk fake = new AddressEntryPk( "Fake", "Fake" );
- book.getEntries().put( fake, primeMinisterEntry );
-
- s.flush();
- s.clear();
-
- book = (AddressBook) s.get( AddressBook.class, book.getId() );
- assertEquals( 2, book.getEntries().size() );
- assertNull( book.getEntries().get( fake ) );
- s.delete( book );
- tx.rollback();
- s.close();
- }
-
- public void testMapKeyOnManyToMany() throws Exception {
- Session s;
- s = openSession();
- s.getTransaction().begin();
- News airplane = new News();
- airplane.setTitle( "Crash!" );
- airplane.setDetail( "An airplaned crashed." );
- s.persist( airplane );
- Newspaper lemonde = new Newspaper();
- lemonde.setName( "Lemonde" );
- lemonde.getNews().put( airplane.getTitle(), airplane );
- s.persist( lemonde );
-
- s.flush();
- s.clear();
-
- lemonde = (Newspaper) s.get( Newspaper.class, lemonde.getId() );
- assertEquals( 1, lemonde.getNews().size() );
- News news = lemonde.getNews().get( airplane.getTitle() );
- assertNotNull( news );
- assertEquals( airplane.getTitle(), news.getTitle() );
- s.delete( lemonde );
- s.delete( news );
-
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testMapKeyOnManyToManyOnId() throws Exception {
- Session s;
- s = openSession();
- s.getTransaction().begin();
- News hibernate1 = new News();
- hibernate1.setTitle( "#1 ORM solution in the Java world" );
- hibernate1.setDetail( "Well, that's no news ;-)" );
- s.persist( hibernate1 );
- PressReleaseAgency schwartz = new PressReleaseAgency();
- schwartz.setName( "Schwartz" );
- schwartz.getProvidedNews().put( hibernate1.getId(), hibernate1 );
- s.persist( schwartz );
-
- s.flush();
- s.clear();
-
- schwartz = (PressReleaseAgency) s.get( PressReleaseAgency.class, schwartz.getId() );
- assertEquals( 1, schwartz.getProvidedNews().size() );
- News news = schwartz.getProvidedNews().get( hibernate1.getId() );
- assertNotNull( news );
- assertEquals( hibernate1.getTitle(), news.getTitle() );
- s.delete( schwartz );
- s.delete( news );
-
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testMapKeyAndIdClass() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Painter picasso = new Painter();
- Painting laVie = new Painting( "La Vie", "Picasso", 50, 20 );
- picasso.getPaintings().put( "La Vie", laVie );
- Painting famille = new Painting( "La Famille du Saltimbanque", "Picasso", 50, 20 );
- picasso.getPaintings().put( "La Famille du Saltimbanque", famille );
- s.persist( picasso );
-
- s.flush();
- s.clear();
-
- picasso = (Painter) s.get( Painter.class, picasso.getId() );
- Painting painting = picasso.getPaintings().get( famille.getName() );
- assertNotNull( painting );
- assertEquals( painting.getName(), famille.getName() );
- s.delete( picasso );
- tx.rollback();
- s.close();
- }
-
- public void testRealMap() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Atmosphere atm = new Atmosphere();
- Atmosphere atm2 = new Atmosphere();
- GasKey key = new GasKey();
- key.setName( "O2" );
- Gas o2 = new Gas();
- o2.name = "oxygen";
- atm.gases.put( "100%", o2 );
- atm.gasesPerKey.put( key, o2 );
- atm2.gases.put( "100%", o2 );
- atm2.gasesPerKey.put( key, o2 );
- s.persist( key );
- s.persist( atm );
- s.persist( atm2 );
-
- s.flush();
- s.clear();
-
- atm = (Atmosphere) s.get( Atmosphere.class, atm.id );
- key = (GasKey) s.get( GasKey.class, key.getName() );
- assertEquals( 1, atm.gases.size() );
- assertEquals( o2.name, atm.gases.get( "100%" ).name );
- assertEquals( o2.name, atm.gasesPerKey.get( key ).name );
- tx.rollback();
- s.close();
- }
-
- public void testMapKeyEntityEntity() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- AddressBook book = new AddressBook();
- s.persist( book );
- AddressEntry entry = new AddressEntry();
- entry.setCity( "Atlanta");
- AddressEntryPk pk = new AddressEntryPk("Coca", "Cola" );
- entry.setPerson( pk );
- entry.setBook( book );
- AlphabeticalDirectory ad = new AlphabeticalDirectory();
- ad.setName( "C");
- s.persist( ad );
- entry.setDirectory( ad );
- s.persist( entry );
- book.getDirectoryEntries().put( ad, entry );
-
- s.flush();
- s.clear();
-
- book = (AddressBook) s.get( AddressBook.class, book.getId() );
- assertEquals( 1, book.getDirectoryEntries().size() );
- assertEquals( "C", book.getDirectoryEntries().keySet().iterator().next().getName() );
- tx.rollback();
- s.close();
- }
-
- public void testEntityKeyElementTarget() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Atmosphere atm = new Atmosphere();
- Gas o2 = new Gas();
- o2.name = "oxygen";
- atm.composition.put( o2, 94.3 );
- s.persist( o2 );
- s.persist( atm );
-
- s.flush();
- s.clear();
-
- atm = (Atmosphere) s.get( Atmosphere.class, atm.id );
- assertTrue( ! Hibernate.isInitialized( atm.composition ) );
- assertEquals( 1, atm.composition.size() );
- assertEquals( o2.name, atm.composition.keySet().iterator().next().name );
- tx.rollback();
- s.close();
- }
-
- public void testSortedMap() {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Training training = new Training();
- Trainee trainee = new Trainee();
- trainee.setName( "Jim" );
- Trainee trainee2 = new Trainee();
- trainee2.setName( "Emmanuel" );
- s.persist( trainee );
- s.persist( trainee2 );
- training.getTrainees().put( "Jim", trainee );
- training.getTrainees().put( "Emmanuel", trainee2 );
- s.persist( training );
-
- s.flush();
- s.clear();
-
- training = (Training) s.get( Training.class, training.getId() );
- assertEquals( "Emmanuel", training.getTrainees().firstKey() );
- assertEquals( "Jim", training.getTrainees().lastKey() );
- tx.rollback();
- s.close();
- }
-
- public void testMapKeyLoad() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Software hibernate = new Software();
- hibernate.setName( "Hibernate" );
- Version v1 = new Version();
- v1.setCodeName( "HumbaHumba" );
- v1.setNumber( "1.0" );
- v1.setSoftware( hibernate );
- hibernate.addVersion( v1 );
- s.persist( hibernate );
- s.persist( v1 );
-
- s.flush();
- s.clear();
-
- hibernate = (Software) s.get( Software.class, "Hibernate" );
- assertEquals(1, hibernate.getVersions().size() );
- Version v2 = new Version();
- v2.setCodeName( "HumbaHumba2" );
- v2.setNumber( "2.0" );
- v2.setSoftware( hibernate );
- hibernate.addVersion( v2 );
- assertEquals( "One loaded persisted version, and one just added", 2, hibernate.getVersions().size() );
-
- s.flush();
- s.clear();
-
- hibernate = (Software) s.get( Software.class, "Hibernate" );
- for ( Version v : hibernate.getVersions().values() ) {
- s.delete( v );
- }
- s.delete( hibernate );
- tx.rollback();
- s.close();
- }
-
-
- public IndexedCollectionTest(String x) {
- super( x );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Wardrobe.class,
- Drawer.class,
- Dress.class,
- Software.class,
- Version.class,
- AddressBook.class,
- AddressEntry.class,
- AddressEntryPk.class, //should be silently ignored
- Newspaper.class,
- News.class,
- PressReleaseAgency.class,
- Painter.class,
- Painting.class,
- Atmosphere.class,
- Gas.class,
- AlphabeticalDirectory.class,
- GasKey.class,
- Trainee.class,
- Training.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/IndexedCollectionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,546 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * Test index collections
+ *
+ * @author Emmanuel Bernard
+ */
+public class IndexedCollectionTest extends TestCase {
+ public void testFkList() throws Exception {
+ Wardrobe w = new Wardrobe();
+ Drawer d1 = new Drawer();
+ Drawer d2 = new Drawer();
+ w.setDrawers( new ArrayList<Drawer>() );
+ w.getDrawers().add( d1 );
+ w.getDrawers().add( d2 );
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( w );
+
+ s.flush();
+ s.clear();
+
+ w = (Wardrobe) s.get( Wardrobe.class, w.getId() );
+ assertNotNull( w );
+ assertNotNull( w.getDrawers() );
+ List<Drawer> result = w.getDrawers();
+ assertEquals( 2, result.size() );
+ assertEquals( d2.getId(), result.get( 1 ).getId() );
+ result.remove( d1 );
+ s.flush();
+ d1 = (Drawer) s.merge( d1 );
+ result.add( d1 );
+
+ s.flush();
+ s.clear();
+
+ w = (Wardrobe) s.get( Wardrobe.class, w.getId() );
+ assertNotNull( w );
+ assertNotNull( w.getDrawers() );
+ result = w.getDrawers();
+ assertEquals( 2, result.size() );
+ assertEquals( d1.getId(), result.get( 1 ).getId() );
+ s.delete( result.get( 0 ) );
+ s.delete( result.get( 1 ) );
+ s.delete( w );
+ s.flush();
+ tx.rollback();
+ s.close();
+ }
+
+ public void testJoinedTableList() throws Exception {
+ Wardrobe w = new Wardrobe();
+ w.setDrawers( new ArrayList<Drawer>() );
+ Drawer d = new Drawer();
+ w.getDrawers().add( d );
+ Dress d1 = new Dress();
+ Dress d2 = new Dress();
+ d.setDresses( new ArrayList<Dress>() );
+ d.getDresses().add( d1 );
+ d.getDresses().add( d2 );
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( d1 );
+ s.persist( d2 );
+ s.persist( w );
+
+ s.flush();
+ s.clear();
+
+ d = (Drawer) s.get( Drawer.class, d.getId() );
+ assertNotNull( d );
+ assertNotNull( d.getDresses() );
+ List<Dress> result = d.getDresses();
+ assertEquals( 2, result.size() );
+ assertEquals( d2.getId(), result.get( 1 ).getId() );
+ result.remove( d1 );
+ s.flush();
+ d1 = (Dress) s.merge( d1 );
+ result.add( d1 );
+
+ s.flush();
+ s.clear();
+
+ d = (Drawer) s.get( Drawer.class, d.getId() );
+ assertNotNull( d );
+ assertNotNull( d.getDresses() );
+ result = d.getDresses();
+ assertEquals( 2, result.size() );
+ assertEquals( d1.getId(), result.get( 1 ).getId() );
+ s.delete( result.get( 0 ) );
+ s.delete( result.get( 1 ) );
+ s.delete( d );
+ s.flush();
+ tx.rollback();
+ s.close();
+ }
+
+ public void testMapKey() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Software hibernate = new Software();
+ hibernate.setName( "Hibernate" );
+ Version v1 = new Version();
+ v1.setCodeName( "HumbaHumba" );
+ v1.setNumber( "1.0" );
+ v1.setSoftware( hibernate );
+ Version v2 = new Version();
+ v2.setCodeName( "Copacabana" );
+ v2.setNumber( "2.0" );
+ v2.setSoftware( hibernate );
+ Version v4 = new Version();
+ v4.setCodeName( "Dreamland" );
+ v4.setNumber( "4.0" );
+ v4.setSoftware( hibernate );
+ Map<String, Version> link = new HashMap<String, Version>();
+ link.put( v1.getCodeName(), v1 );
+ link.put( v2.getCodeName(), v2 );
+ link.put( v4.getCodeName(), v4 );
+ hibernate.setVersions( link );
+ s.persist( hibernate );
+ s.persist( v1 );
+ s.persist( v2 );
+ s.persist( v4 );
+
+ s.flush();
+ s.clear();
+
+ hibernate = (Software) s.get( Software.class, "Hibernate" );
+ assertEquals( 3, hibernate.getVersions().size() );
+ assertEquals( "1.0", hibernate.getVersions().get( "HumbaHumba" ).getNumber() );
+ assertEquals( "2.0", hibernate.getVersions().get( "Copacabana" ).getNumber() );
+ hibernate.getVersions().remove( v4.getCodeName() );
+
+ s.flush();
+ s.clear();
+
+ hibernate = (Software) s.get( Software.class, "Hibernate" );
+ assertEquals( "So effect on collection changes", 3, hibernate.getVersions().size() );
+ for ( Version v : hibernate.getVersions().values() ) {
+ s.delete( v );
+ }
+ s.delete( hibernate );
+
+ s.flush();
+
+ tx.rollback();
+ s.close();
+ }
+
+ public void testDefaultMapKey() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ AddressBook book = new AddressBook();
+ book.setOwner( "Emmanuel" );
+ AddressEntryPk helene = new AddressEntryPk( "Helene", "Michau" );
+ AddressEntry heleneEntry = new AddressEntry();
+ heleneEntry.setBook( book );
+ heleneEntry.setCity( "Levallois" );
+ heleneEntry.setStreet( "Louis Blanc" );
+ heleneEntry.setPerson( helene );
+ AddressEntryPk primeMinister = new AddressEntryPk( "Dominique", "Villepin" );
+ AddressEntry primeMinisterEntry = new AddressEntry();
+ primeMinisterEntry.setBook( book );
+ primeMinisterEntry.setCity( "Paris" );
+ primeMinisterEntry.setStreet( "Hotel Matignon" );
+ primeMinisterEntry.setPerson( primeMinister );
+ book.getEntries().put( helene, heleneEntry );
+ book.getEntries().put( primeMinister, primeMinisterEntry );
+ s.persist( book );
+
+ s.flush();
+ s.clear();
+
+ book = (AddressBook) s.get( AddressBook.class, book.getId() );
+ assertEquals( 2, book.getEntries().size() );
+ assertEquals( heleneEntry.getCity(), book.getEntries().get( helene ).getCity() );
+ AddressEntryPk fake = new AddressEntryPk( "Fake", "Fake" );
+ book.getEntries().put( fake, primeMinisterEntry );
+
+ s.flush();
+ s.clear();
+
+ book = (AddressBook) s.get( AddressBook.class, book.getId() );
+ assertEquals( 2, book.getEntries().size() );
+ assertNull( book.getEntries().get( fake ) );
+ s.delete( book );
+
+ s.flush();
+ tx.rollback();
+ s.close();
+ }
+
+ public void testMapKeyToEntity() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ AlphabeticalDirectory m = new AlphabeticalDirectory();
+ m.setName( "M" );
+ AlphabeticalDirectory v = new AlphabeticalDirectory();
+ v.setName( "V" );
+ s.persist( m );
+ s.persist( v );
+
+ AddressBook book = new AddressBook();
+ book.setOwner( "Emmanuel" );
+ AddressEntryPk helene = new AddressEntryPk( "Helene", "Michau" );
+ AddressEntry heleneEntry = new AddressEntry();
+ heleneEntry.setBook( book );
+ heleneEntry.setCity( "Levallois" );
+ heleneEntry.setStreet( "Louis Blanc" );
+ heleneEntry.setPerson( helene );
+ heleneEntry.setDirectory( m );
+ AddressEntryPk primeMinister = new AddressEntryPk( "Dominique", "Villepin" );
+ AddressEntry primeMinisterEntry = new AddressEntry();
+ primeMinisterEntry.setBook( book );
+ primeMinisterEntry.setCity( "Paris" );
+ primeMinisterEntry.setStreet( "Hotel Matignon" );
+ primeMinisterEntry.setPerson( primeMinister );
+ primeMinisterEntry.setDirectory( v );
+ book.getEntries().put( helene, heleneEntry );
+ book.getEntries().put( primeMinister, primeMinisterEntry );
+ s.persist( book );
+
+ s.flush();
+ s.clear();
+
+ book = (AddressBook) s.get( AddressBook.class, book.getId() );
+ assertEquals( 2, book.getEntries().size() );
+ assertEquals( heleneEntry.getCity(), book.getEntries().get( helene ).getCity() );
+ assertEquals( "M", book.getEntries().get( helene ).getDirectory().getName() );
+
+ s.delete( book );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testComponentSubPropertyMapKey() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ AddressBook book = new AddressBook();
+ book.setOwner( "Emmanuel" );
+ AddressEntryPk helene = new AddressEntryPk( "Helene", "Michau" );
+ AddressEntry heleneEntry = new AddressEntry();
+ heleneEntry.setBook( book );
+ heleneEntry.setCity( "Levallois" );
+ heleneEntry.setStreet( "Louis Blanc" );
+ heleneEntry.setPerson( helene );
+ AddressEntryPk primeMinister = new AddressEntryPk( "Dominique", "Villepin" );
+ AddressEntry primeMinisterEntry = new AddressEntry();
+ primeMinisterEntry.setBook( book );
+ primeMinisterEntry.setCity( "Paris" );
+ primeMinisterEntry.setStreet( "Hotel Matignon" );
+ primeMinisterEntry.setPerson( primeMinister );
+ book.getEntries().put( helene, heleneEntry );
+ book.getEntries().put( primeMinister, primeMinisterEntry );
+ s.persist( book );
+
+ s.flush();
+ s.clear();
+
+ book = (AddressBook) s.get( AddressBook.class, book.getId() );
+ assertEquals( 2, book.getLastNameEntries().size() );
+ assertEquals( heleneEntry.getCity(), book.getLastNameEntries().get( "Michau" ).getCity() );
+ AddressEntryPk fake = new AddressEntryPk( "Fake", "Fake" );
+ book.getEntries().put( fake, primeMinisterEntry );
+
+ s.flush();
+ s.clear();
+
+ book = (AddressBook) s.get( AddressBook.class, book.getId() );
+ assertEquals( 2, book.getEntries().size() );
+ assertNull( book.getEntries().get( fake ) );
+ s.delete( book );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testMapKeyOnManyToMany() throws Exception {
+ Session s;
+ s = openSession();
+ s.getTransaction().begin();
+ News airplane = new News();
+ airplane.setTitle( "Crash!" );
+ airplane.setDetail( "An airplaned crashed." );
+ s.persist( airplane );
+ Newspaper lemonde = new Newspaper();
+ lemonde.setName( "Lemonde" );
+ lemonde.getNews().put( airplane.getTitle(), airplane );
+ s.persist( lemonde );
+
+ s.flush();
+ s.clear();
+
+ lemonde = (Newspaper) s.get( Newspaper.class, lemonde.getId() );
+ assertEquals( 1, lemonde.getNews().size() );
+ News news = lemonde.getNews().get( airplane.getTitle() );
+ assertNotNull( news );
+ assertEquals( airplane.getTitle(), news.getTitle() );
+ s.delete( lemonde );
+ s.delete( news );
+
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testMapKeyOnManyToManyOnId() throws Exception {
+ Session s;
+ s = openSession();
+ s.getTransaction().begin();
+ News hibernate1 = new News();
+ hibernate1.setTitle( "#1 ORM solution in the Java world" );
+ hibernate1.setDetail( "Well, that's no news ;-)" );
+ s.persist( hibernate1 );
+ PressReleaseAgency schwartz = new PressReleaseAgency();
+ schwartz.setName( "Schwartz" );
+ schwartz.getProvidedNews().put( hibernate1.getId(), hibernate1 );
+ s.persist( schwartz );
+
+ s.flush();
+ s.clear();
+
+ schwartz = (PressReleaseAgency) s.get( PressReleaseAgency.class, schwartz.getId() );
+ assertEquals( 1, schwartz.getProvidedNews().size() );
+ News news = schwartz.getProvidedNews().get( hibernate1.getId() );
+ assertNotNull( news );
+ assertEquals( hibernate1.getTitle(), news.getTitle() );
+ s.delete( schwartz );
+ s.delete( news );
+
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testMapKeyAndIdClass() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Painter picasso = new Painter();
+ Painting laVie = new Painting( "La Vie", "Picasso", 50, 20 );
+ picasso.getPaintings().put( "La Vie", laVie );
+ Painting famille = new Painting( "La Famille du Saltimbanque", "Picasso", 50, 20 );
+ picasso.getPaintings().put( "La Famille du Saltimbanque", famille );
+ s.persist( picasso );
+
+ s.flush();
+ s.clear();
+
+ picasso = (Painter) s.get( Painter.class, picasso.getId() );
+ Painting painting = picasso.getPaintings().get( famille.getName() );
+ assertNotNull( painting );
+ assertEquals( painting.getName(), famille.getName() );
+ s.delete( picasso );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testRealMap() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Atmosphere atm = new Atmosphere();
+ Atmosphere atm2 = new Atmosphere();
+ GasKey key = new GasKey();
+ key.setName( "O2" );
+ Gas o2 = new Gas();
+ o2.name = "oxygen";
+ atm.gases.put( "100%", o2 );
+ atm.gasesPerKey.put( key, o2 );
+ atm2.gases.put( "100%", o2 );
+ atm2.gasesPerKey.put( key, o2 );
+ s.persist( key );
+ s.persist( atm );
+ s.persist( atm2 );
+
+ s.flush();
+ s.clear();
+
+ atm = (Atmosphere) s.get( Atmosphere.class, atm.id );
+ key = (GasKey) s.get( GasKey.class, key.getName() );
+ assertEquals( 1, atm.gases.size() );
+ assertEquals( o2.name, atm.gases.get( "100%" ).name );
+ assertEquals( o2.name, atm.gasesPerKey.get( key ).name );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testMapKeyEntityEntity() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ AddressBook book = new AddressBook();
+ s.persist( book );
+ AddressEntry entry = new AddressEntry();
+ entry.setCity( "Atlanta");
+ AddressEntryPk pk = new AddressEntryPk("Coca", "Cola" );
+ entry.setPerson( pk );
+ entry.setBook( book );
+ AlphabeticalDirectory ad = new AlphabeticalDirectory();
+ ad.setName( "C");
+ s.persist( ad );
+ entry.setDirectory( ad );
+ s.persist( entry );
+ book.getDirectoryEntries().put( ad, entry );
+
+ s.flush();
+ s.clear();
+
+ book = (AddressBook) s.get( AddressBook.class, book.getId() );
+ assertEquals( 1, book.getDirectoryEntries().size() );
+ assertEquals( "C", book.getDirectoryEntries().keySet().iterator().next().getName() );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testEntityKeyElementTarget() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Atmosphere atm = new Atmosphere();
+ Gas o2 = new Gas();
+ o2.name = "oxygen";
+ atm.composition.put( o2, 94.3 );
+ s.persist( o2 );
+ s.persist( atm );
+
+ s.flush();
+ s.clear();
+
+ atm = (Atmosphere) s.get( Atmosphere.class, atm.id );
+ assertTrue( ! Hibernate.isInitialized( atm.composition ) );
+ assertEquals( 1, atm.composition.size() );
+ assertEquals( o2.name, atm.composition.keySet().iterator().next().name );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testSortedMap() {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Training training = new Training();
+ Trainee trainee = new Trainee();
+ trainee.setName( "Jim" );
+ Trainee trainee2 = new Trainee();
+ trainee2.setName( "Emmanuel" );
+ s.persist( trainee );
+ s.persist( trainee2 );
+ training.getTrainees().put( "Jim", trainee );
+ training.getTrainees().put( "Emmanuel", trainee2 );
+ s.persist( training );
+
+ s.flush();
+ s.clear();
+
+ training = (Training) s.get( Training.class, training.getId() );
+ assertEquals( "Emmanuel", training.getTrainees().firstKey() );
+ assertEquals( "Jim", training.getTrainees().lastKey() );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testMapKeyLoad() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Software hibernate = new Software();
+ hibernate.setName( "Hibernate" );
+ Version v1 = new Version();
+ v1.setCodeName( "HumbaHumba" );
+ v1.setNumber( "1.0" );
+ v1.setSoftware( hibernate );
+ hibernate.addVersion( v1 );
+ s.persist( hibernate );
+ s.persist( v1 );
+
+ s.flush();
+ s.clear();
+
+ hibernate = (Software) s.get( Software.class, "Hibernate" );
+ assertEquals(1, hibernate.getVersions().size() );
+ Version v2 = new Version();
+ v2.setCodeName( "HumbaHumba2" );
+ v2.setNumber( "2.0" );
+ v2.setSoftware( hibernate );
+ hibernate.addVersion( v2 );
+ assertEquals( "One loaded persisted version, and one just added", 2, hibernate.getVersions().size() );
+
+ s.flush();
+ s.clear();
+
+ hibernate = (Software) s.get( Software.class, "Hibernate" );
+ for ( Version v : hibernate.getVersions().values() ) {
+ s.delete( v );
+ }
+ s.delete( hibernate );
+ tx.rollback();
+ s.close();
+ }
+
+
+ public IndexedCollectionTest(String x) {
+ super( x );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Wardrobe.class,
+ Drawer.class,
+ Dress.class,
+ Software.class,
+ Version.class,
+ AddressBook.class,
+ AddressEntry.class,
+ AddressEntryPk.class, //should be silently ignored
+ Newspaper.class,
+ News.class,
+ PressReleaseAgency.class,
+ Painter.class,
+ Painting.class,
+ Atmosphere.class,
+ Gas.class,
+ AlphabeticalDirectory.class,
+ GasKey.class,
+ Trainee.class,
+ Training.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/MapKeyTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/MapKeyTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/MapKeyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.indexcoll;
-
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MapKeyTest extends TestCase {
-
- public void testMapKeyOnEmbeddedId() {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Generation c = new Generation();
- c.setAge( "a" );
- c.setCulture( "b" );
- GenerationGroup r = new GenerationGroup();
- r.setGeneration( c );
- s.persist( r );
- GenerationUser m = new GenerationUser();
- s.persist( m );
- m.getRef().put( c, r );
- s.flush();
- s.clear();
-
- m = (GenerationUser) s.get( GenerationUser.class, m.getId() );
- assertEquals( "a", m.getRef().keySet().iterator().next().getAge() );
- tx.rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- GenerationUser.class,
- GenerationGroup.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/MapKeyTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/MapKeyTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/MapKeyTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/MapKeyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MapKeyTest extends TestCase {
+
+ public void testMapKeyOnEmbeddedId() {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Generation c = new Generation();
+ c.setAge( "a" );
+ c.setCulture( "b" );
+ GenerationGroup r = new GenerationGroup();
+ r.setGeneration( c );
+ s.persist( r );
+ GenerationUser m = new GenerationUser();
+ s.persist( m );
+ m.getRef().put( c, r );
+ s.flush();
+ s.clear();
+
+ m = (GenerationUser) s.get( GenerationUser.class, m.getId() );
+ assertEquals( "a", m.getRef().keySet().iterator().next().getAge() );
+ tx.rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ GenerationUser.class,
+ GenerationGroup.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/News.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/News.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/News.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class News {
- private Integer id;
- private String title;
- private String detail;
-
- @Id
- @GeneratedValue
- @Column(name = "news_id")
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getDetail() {
- return detail;
- }
-
- public void setDetail(String detail) {
- this.detail = detail;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/News.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/News.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/News.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/News.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class News {
+ private Integer id;
+ private String title;
+ private String detail;
+
+ @Id
+ @GeneratedValue
+ @Column(name = "news_id")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getDetail() {
+ return detail;
+ }
+
+ public void setDetail(String detail) {
+ this.detail = detail;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Newspaper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Newspaper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Newspaper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,48 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-import javax.persistence.MapKey;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Newspaper {
- private Integer id;
- private String name;
- private Map<String, News> news = new HashMap<String, News>();
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToMany
- @MapKey(name = "title")
- public Map<String, News> getNews() {
- return news;
- }
-
- public void setNews(Map<String, News> news) {
- this.news = news;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Newspaper.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Newspaper.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Newspaper.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Newspaper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,48 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.MapKey;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Newspaper {
+ private Integer id;
+ private String name;
+ private Map<String, News> news = new HashMap<String, News>();
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToMany
+ @MapKey(name = "title")
+ public Map<String, News> getNews() {
+ return news;
+ }
+
+ public void setNews(Map<String, News> news) {
+ this.news = news;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.MapKey;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Painter {
- private Integer id;
- private Map<String, Painting> paintings = new HashMap<String, Painting>();
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @OneToMany(cascade = {CascadeType.ALL})
- @MapKey(name = "name")
- @JoinColumn
- public Map<String, Painting> getPaintings() {
- return paintings;
- }
-
- public void setPaintings(Map<String, Painting> paintings) {
- this.paintings = paintings;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painter.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painter.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painter.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.MapKey;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Painter {
+ private Integer id;
+ private Map<String, Painting> paintings = new HashMap<String, Painting>();
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @OneToMany(cascade = {CascadeType.ALL})
+ @MapKey(name = "name")
+ @JoinColumn
+ public Map<String, Painting> getPaintings() {
+ return paintings;
+ }
+
+ public void setPaintings(Map<String, Painting> paintings) {
+ this.paintings = paintings;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painting.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painting.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painting.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,82 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at IdClass(PaintingPk.class)
-public class Painting {
-
- private int sizeX;
- private int sizeY;
- private String name;
- private String painter;
-
- public Painting() {
- }
-
- public Painting(String name, String painter, int sizeX, int sizeY) {
- this.name = name;
- this.painter = painter;
- this.sizeX = sizeX;
- this.sizeY = sizeY;
- }
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Id
- public String getPainter() {
- return painter;
- }
-
- public void setPainter(String painter) {
- this.painter = painter;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final PaintingPk that = (PaintingPk) o;
-
- if ( !name.equals( that.getName() ) ) return false;
- if ( !painter.equals( that.getPainter() ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = name.hashCode();
- result = 29 * result + painter.hashCode();
- return result;
- }
-
- public int getSizeX() {
- return sizeX;
- }
-
- public void setSizeX(int sizeX) {
- this.sizeX = sizeX;
- }
-
- public int getSizeY() {
- return sizeY;
- }
-
- public void setSizeY(int sizeY) {
- this.sizeY = sizeY;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painting.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painting.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painting.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Painting.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,82 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(PaintingPk.class)
+public class Painting {
+
+ private int sizeX;
+ private int sizeY;
+ private String name;
+ private String painter;
+
+ public Painting() {
+ }
+
+ public Painting(String name, String painter, int sizeX, int sizeY) {
+ this.name = name;
+ this.painter = painter;
+ this.sizeX = sizeX;
+ this.sizeY = sizeY;
+ }
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Id
+ public String getPainter() {
+ return painter;
+ }
+
+ public void setPainter(String painter) {
+ this.painter = painter;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final PaintingPk that = (PaintingPk) o;
+
+ if ( !name.equals( that.getName() ) ) return false;
+ if ( !painter.equals( that.getPainter() ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = name.hashCode();
+ result = 29 * result + painter.hashCode();
+ return result;
+ }
+
+ public int getSizeX() {
+ return sizeX;
+ }
+
+ public void setSizeX(int sizeX) {
+ this.sizeX = sizeX;
+ }
+
+ public int getSizeY() {
+ return sizeY;
+ }
+
+ public void setSizeY(int sizeY) {
+ this.sizeY = sizeY;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PaintingPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PaintingPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PaintingPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class PaintingPk implements Serializable {
- private String name;
- private String painter;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getPainter() {
- return painter;
- }
-
- public void setPainter(String painter) {
- this.painter = painter;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final PaintingPk that = (PaintingPk) o;
-
- if ( !name.equals( that.name ) ) return false;
- if ( !painter.equals( that.painter ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = name.hashCode();
- result = 29 * result + painter.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PaintingPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PaintingPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PaintingPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PaintingPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class PaintingPk implements Serializable {
+ private String name;
+ private String painter;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPainter() {
+ return painter;
+ }
+
+ public void setPainter(String painter) {
+ this.painter = painter;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final PaintingPk that = (PaintingPk) o;
+
+ if ( !name.equals( that.name ) ) return false;
+ if ( !painter.equals( that.painter ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = name.hashCode();
+ result = 29 * result + painter.hashCode();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,54 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.HashMap;
-import java.util.Map;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.MapKey;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class PressReleaseAgency {
- private Integer id;
- private String name;
- private Map<Integer, News> providedNews = new HashMap<Integer, News>();
-
- @Id
- @GeneratedValue
- @Column(name = "PressReleaseAgency_id")
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToMany
- @JoinTable(joinColumns = @JoinColumn(name = "PressReleaseAgency_id"),
- inverseJoinColumns = @JoinColumn(name = "News_id"))
- @MapKey
- public Map<Integer, News> getProvidedNews() {
- return providedNews;
- }
-
- public void setProvidedNews(Map<Integer, News> providedNews) {
- this.providedNews = providedNews;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/PressReleaseAgency.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,54 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.MapKey;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PressReleaseAgency {
+ private Integer id;
+ private String name;
+ private Map<Integer, News> providedNews = new HashMap<Integer, News>();
+
+ @Id
+ @GeneratedValue
+ @Column(name = "PressReleaseAgency_id")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToMany
+ @JoinTable(joinColumns = @JoinColumn(name = "PressReleaseAgency_id"),
+ inverseJoinColumns = @JoinColumn(name = "News_id"))
+ @MapKey
+ public Map<Integer, News> getProvidedNews() {
+ return providedNews;
+ }
+
+ public void setProvidedNews(Map<Integer, News> providedNews) {
+ this.providedNews = providedNews;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Software.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Software.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Software.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.Map;
-import java.util.HashMap;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.MapKey;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Software {
- private String name;
- private Map<String, Version> versions = new HashMap<String, Version>();
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @OneToMany(mappedBy = "software")
- @MapKey(name = "codeName")
- public Map<String, Version> getVersions() {
- return versions;
- }
-
- public void setVersions(Map<String, Version> versions) {
- this.versions = versions;
- }
-
- public void addVersion(Version version) {
- this.versions.put(version.getCodeName(), version);
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Software.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Software.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Software.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Software.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.MapKey;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Software {
+ private String name;
+ private Map<String, Version> versions = new HashMap<String, Version>();
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @OneToMany(mappedBy = "software")
+ @MapKey(name = "codeName")
+ public Map<String, Version> getVersions() {
+ return versions;
+ }
+
+ public void setVersions(Map<String, Version> versions) {
+ this.versions = versions;
+ }
+
+ public void addVersion(Version version) {
+ this.versions.put(version.getCodeName(), version);
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Trainee.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Trainee.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Trainee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Trainee {
- @Id @GeneratedValue private Long id;
- private String name;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Trainee.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Trainee.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Trainee.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Trainee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Trainee {
+ @Id @GeneratedValue private Long id;
+ private String name;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Training.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Training.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Training.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.SortedMap;
-import java.util.TreeMap;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.MapKey;
-import javax.persistence.ManyToMany;
-
-import org.hibernate.annotations.Sort;
-import org.hibernate.annotations.SortType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Training {
- @Id @GeneratedValue private Long id;
- @Sort(type= SortType.NATURAL)
- @MapKey(name="name") @ManyToMany SortedMap<String, Trainee> trainees = new TreeMap<String, Trainee>();
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public SortedMap<String, Trainee> getTrainees() {
- return trainees;
- }
-
- public void setTrainees(SortedMap<String, Trainee> trainees) {
- this.trainees = trainees;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Training.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Training.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Training.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Training.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.SortedMap;
+import java.util.TreeMap;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.MapKey;
+import javax.persistence.ManyToMany;
+
+import org.hibernate.annotations.Sort;
+import org.hibernate.annotations.SortType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Training {
+ @Id @GeneratedValue private Long id;
+ @Sort(type= SortType.NATURAL)
+ @MapKey(name="name") @ManyToMany SortedMap<String, Trainee> trainees = new TreeMap<String, Trainee>();
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public SortedMap<String, Trainee> getTrainees() {
+ return trainees;
+ }
+
+ public void setTrainees(SortedMap<String, Trainee> trainees) {
+ this.trainees = trainees;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Version.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Version.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.Column;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "tbl_version")
-public class Version {
- private Integer id;
- private String codeName;
- private String number;
- private Software software;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Column(name="`code_name`")
- public String getCodeName() {
- return codeName;
- }
-
- public void setCodeName(String codeName) {
- this.codeName = codeName;
- }
-
- public String getNumber() {
- return number;
- }
-
- public void setNumber(String number) {
- this.number = number;
- }
-
- @ManyToOne
- public Software getSoftware() {
- return software;
- }
-
- public void setSoftware(Software software) {
- this.software = software;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Version.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Version.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Version.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_version")
+public class Version {
+ private Integer id;
+ private String codeName;
+ private String number;
+ private Software software;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Column(name="`code_name`")
+ public String getCodeName() {
+ return codeName;
+ }
+
+ public void setCodeName(String codeName) {
+ this.codeName = codeName;
+ }
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+
+ @ManyToOne
+ public Software getSoftware() {
+ return software;
+ }
+
+ public void setSoftware(Software software) {
+ this.software = software;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Wardrobe.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Wardrobe.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Wardrobe.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.indexcoll;
-
-import java.util.List;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToMany;
-
-import org.hibernate.annotations.IndexColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Wardrobe {
-
- private Long id;
- private List<Drawer> drawers;
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- /**
- * unidirectional one to many list with non null foreign key (mapping
- * not recommended).
- */
- @OneToMany(cascade = CascadeType.ALL)
- @IndexColumn(name = "drawer_position", base = 1)
- @JoinColumn(name = "wardrobe_id", nullable = false)
- public List<Drawer> getDrawers() {
- return drawers;
- }
-
- public void setDrawers(List<Drawer> drawers) {
- this.drawers = drawers;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Wardrobe.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Wardrobe.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Wardrobe.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/indexcoll/Wardrobe.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id$
+package org.hibernate.test.annotations.indexcoll;
+
+import java.util.List;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.IndexColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Wardrobe {
+
+ private Long id;
+ private List<Drawer> drawers;
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ /**
+ * unidirectional one to many list with non null foreign key (mapping
+ * not recommended).
+ */
+ @OneToMany(cascade = CascadeType.ALL)
+ @IndexColumn(name = "drawer_position", base = 1)
+ @JoinColumn(name = "wardrobe_id", nullable = false)
+ public List<Drawer> getDrawers() {
+ return drawers;
+ }
+
+ public void setDrawers(List<Drawer> drawers) {
+ this.drawers = drawers;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Apple.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Apple.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Apple.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Apple extends Fruit {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Apple.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Apple.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Apple.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Apple.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Apple extends Fruit {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Carrot.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Carrot.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Carrot.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance;
-
-import javax.persistence.Entity;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.PrimaryKeyJoinColumn;
-import javax.persistence.PrimaryKeyJoinColumns;
-
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.JOINED)
- at PrimaryKeyJoinColumns(
- {@PrimaryKeyJoinColumn(name = "carrot_farmer", referencedColumnName = "farmer"),
- @PrimaryKeyJoinColumn(name = "harvest", referencedColumnName = "harvestDate")
- })
- at OnDelete(action = OnDeleteAction.CASCADE)
-public class Carrot extends Vegetable {
- private int length;
-
- public int getLength() {
- return length;
- }
-
- public void setLength(int length) {
- this.length = length;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Carrot.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Carrot.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Carrot.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Carrot.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.PrimaryKeyJoinColumns;
+
+import org.hibernate.annotations.OnDelete;
+import org.hibernate.annotations.OnDeleteAction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at PrimaryKeyJoinColumns(
+ {@PrimaryKeyJoinColumn(name = "carrot_farmer", referencedColumnName = "farmer"),
+ @PrimaryKeyJoinColumn(name = "harvest", referencedColumnName = "harvestDate")
+ })
+ at OnDelete(action = OnDeleteAction.CASCADE)
+public class Carrot extends Vegetable {
+ private int length;
+
+ public int getLength() {
+ return length;
+ }
+
+ public void setLength(int length) {
+ this.length = length;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Fruit.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Fruit.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Fruit.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Fruit {
- private Integer id;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Fruit.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Fruit.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Fruit.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Fruit.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Fruit {
+ private Integer id;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/SubclassTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/SubclassTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/SubclassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,170 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance;
-
-import java.util.List;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.A320;
-import org.hibernate.test.annotations.A320b;
-import org.hibernate.test.annotations.Plane;
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.test.annotations.inheritance.singletable.Funk;
-import org.hibernate.test.annotations.inheritance.singletable.Music;
-import org.hibernate.test.annotations.inheritance.singletable.Noise;
-import org.hibernate.test.annotations.inheritance.singletable.Rock;
-
-/**
- * @author Emmanuel Bernard
- */
-public class SubclassTest extends TestCase {
-
- public SubclassTest(String x) {
- super( x );
- }
-
- public void testPolymorphism() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Plane p = new Plane();
- p.setNbrOfSeats( 10 );
- A320 a = new A320();
- a.setJavaEmbeddedVersion( "5.0" );
- a.setNbrOfSeats( 300 );
- s.persist( a );
- s.persist( p );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.createQuery( "from " + A320.class.getName() );
- List a320s = q.list();
- assertNotNull( a320s );
- assertEquals( 1, a320s.size() );
- assertTrue( a320s.get( 0 ) instanceof A320 );
- assertEquals( "5.0", ( (A320) a320s.get( 0 ) ).getJavaEmbeddedVersion() );
- q = s.createQuery( "from " + Plane.class.getName() );
- List planes = q.list();
- assertNotNull( planes );
- assertEquals( 2, planes.size() );
- tx.commit();
- s.close();
- }
-
- public void test2ndLevelSubClass() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- A320b a = new A320b();
- a.setJavaEmbeddedVersion( "Elephant" );
- a.setNbrOfSeats( 300 );
- s.persist( a );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.createQuery( "from " + A320.class.getName() + " as a where a.javaEmbeddedVersion = :version" );
- q.setString( "version", "Elephant" );
- List a320s = q.list();
- assertNotNull( a320s );
- assertEquals( 1, a320s.size() );
- tx.commit();
- s.close();
- }
-
- public void testEmbeddedSuperclass() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Plane p = new Plane();
- p.setAlive( true ); //sic
- p.setAltitude( 10000 );
- p.setMetricAltitude( 3000 );
- p.setNbrOfSeats( 150 );
- p.setSerial( "0123456789" );
- s.persist( p );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- p = (Plane) s.get( Plane.class, p.getId() );
- assertNotNull( p );
- assertEquals( true, p.isAlive() );
- assertEquals( 150, p.getNbrOfSeats() );
- assertEquals( 10000, p.getAltitude() );
- assertEquals( "0123456789", p.getSerial() );
- assertFalse( 3000 == p.getMetricAltitude() );
- s.delete( p );
- tx.commit();
- s.close();
- }
-
- public void testFormula() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Rock guns = new Rock();
- guns.setAvgBeat( 90 );
- guns.setType( 2 );
- Noise white = new Noise();
- white.setAvgBeat( 0 );
- white.setType( null );
-
- s.persist( guns );
- s.persist( white );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- List result = s.createCriteria( Noise.class ).list();
- assertNotNull( result );
- assertEquals( 1, result.size() );
- white = (Noise) result.get( 0 );
- assertNull( white.getType() );
- s.delete( white );
- result = s.createCriteria( Rock.class ).list();
- assertEquals( 1, result.size() );
- s.delete( result.get( 0 ) );
- result = s.createCriteria( Funk.class ).list();
- assertEquals( 0, result.size() );
-
- tx.commit();
- s.close();
- }
-
- private void checkClassType(Fruit fruitToTest, Fruit f, Apple a) {
- if ( fruitToTest.getId().equals( f.getId() ) ) {
- assertFalse( fruitToTest instanceof Apple );
- }
- else if ( fruitToTest.getId().equals( a.getId() ) ) {
- assertTrue( fruitToTest instanceof Apple );
- }
- else {
- fail( "Result does not contains the previously inserted elements" );
- }
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- A320b.class, //subclasses should be properly reordered
- Plane.class,
- A320.class,
- Fruit.class,
- //FlyingObject.class, //had to declare embedded superclasses
- //Thing.class,
- Apple.class,
- Music.class,
- Rock.class,
- Funk.class,
- Noise.class
- };
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/SubclassTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/SubclassTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/SubclassTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/SubclassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,170 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance;
+
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.A320;
+import org.hibernate.test.annotations.A320b;
+import org.hibernate.test.annotations.Plane;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.inheritance.singletable.Funk;
+import org.hibernate.test.annotations.inheritance.singletable.Music;
+import org.hibernate.test.annotations.inheritance.singletable.Noise;
+import org.hibernate.test.annotations.inheritance.singletable.Rock;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SubclassTest extends TestCase {
+
+ public SubclassTest(String x) {
+ super( x );
+ }
+
+ public void testPolymorphism() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Plane p = new Plane();
+ p.setNbrOfSeats( 10 );
+ A320 a = new A320();
+ a.setJavaEmbeddedVersion( "5.0" );
+ a.setNbrOfSeats( 300 );
+ s.persist( a );
+ s.persist( p );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.createQuery( "from " + A320.class.getName() );
+ List a320s = q.list();
+ assertNotNull( a320s );
+ assertEquals( 1, a320s.size() );
+ assertTrue( a320s.get( 0 ) instanceof A320 );
+ assertEquals( "5.0", ( (A320) a320s.get( 0 ) ).getJavaEmbeddedVersion() );
+ q = s.createQuery( "from " + Plane.class.getName() );
+ List planes = q.list();
+ assertNotNull( planes );
+ assertEquals( 2, planes.size() );
+ tx.commit();
+ s.close();
+ }
+
+ public void test2ndLevelSubClass() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ A320b a = new A320b();
+ a.setJavaEmbeddedVersion( "Elephant" );
+ a.setNbrOfSeats( 300 );
+ s.persist( a );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.createQuery( "from " + A320.class.getName() + " as a where a.javaEmbeddedVersion = :version" );
+ q.setString( "version", "Elephant" );
+ List a320s = q.list();
+ assertNotNull( a320s );
+ assertEquals( 1, a320s.size() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testEmbeddedSuperclass() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Plane p = new Plane();
+ p.setAlive( true ); //sic
+ p.setAltitude( 10000 );
+ p.setMetricAltitude( 3000 );
+ p.setNbrOfSeats( 150 );
+ p.setSerial( "0123456789" );
+ s.persist( p );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ p = (Plane) s.get( Plane.class, p.getId() );
+ assertNotNull( p );
+ assertEquals( true, p.isAlive() );
+ assertEquals( 150, p.getNbrOfSeats() );
+ assertEquals( 10000, p.getAltitude() );
+ assertEquals( "0123456789", p.getSerial() );
+ assertFalse( 3000 == p.getMetricAltitude() );
+ s.delete( p );
+ tx.commit();
+ s.close();
+ }
+
+ public void testFormula() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Rock guns = new Rock();
+ guns.setAvgBeat( 90 );
+ guns.setType( 2 );
+ Noise white = new Noise();
+ white.setAvgBeat( 0 );
+ white.setType( null );
+
+ s.persist( guns );
+ s.persist( white );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ List result = s.createCriteria( Noise.class ).list();
+ assertNotNull( result );
+ assertEquals( 1, result.size() );
+ white = (Noise) result.get( 0 );
+ assertNull( white.getType() );
+ s.delete( white );
+ result = s.createCriteria( Rock.class ).list();
+ assertEquals( 1, result.size() );
+ s.delete( result.get( 0 ) );
+ result = s.createCriteria( Funk.class ).list();
+ assertEquals( 0, result.size() );
+
+ tx.commit();
+ s.close();
+ }
+
+ private void checkClassType(Fruit fruitToTest, Fruit f, Apple a) {
+ if ( fruitToTest.getId().equals( f.getId() ) ) {
+ assertFalse( fruitToTest instanceof Apple );
+ }
+ else if ( fruitToTest.getId().equals( a.getId() ) ) {
+ assertTrue( fruitToTest instanceof Apple );
+ }
+ else {
+ fail( "Result does not contains the previously inserted elements" );
+ }
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ A320b.class, //subclasses should be properly reordered
+ Plane.class,
+ A320.class,
+ Fruit.class,
+ //FlyingObject.class, //had to declare embedded superclasses
+ //Thing.class,
+ Apple.class,
+ Music.class,
+ Rock.class,
+ Funk.class,
+ Noise.class
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Tomato.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Tomato.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Tomato.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance;
-
-import javax.persistence.Entity;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
-
-/**
- * @author Emmanuel Bernard
- */
-//FIXME HBX-55 default for composite PK does not work yet
-//FIXME Tomato is a fruit
- at Entity()
- at Inheritance(
- strategy = InheritanceType.JOINED
-)
- at OnDelete(action = OnDeleteAction.CASCADE)
-public class Tomato extends Vegetable {
- private int size;
-
- public int getSize() {
- return size;
- }
-
- public void setSize(int size) {
- this.size = size;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Tomato.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Tomato.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Tomato.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Tomato.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+import org.hibernate.annotations.OnDelete;
+import org.hibernate.annotations.OnDeleteAction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+//FIXME HBX-55 default for composite PK does not work yet
+//FIXME Tomato is a fruit
+ at Entity()
+ at Inheritance(
+ strategy = InheritanceType.JOINED
+)
+ at OnDelete(action = OnDeleteAction.CASCADE)
+public class Tomato extends Vegetable {
+ private int size;
+
+ public int getSize() {
+ return size;
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Vegetable.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Vegetable.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Vegetable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity()
- at Inheritance(
- strategy = InheritanceType.JOINED
-)
-public class Vegetable {
- private VegetablePk id;
- private long priceInCent;
-
- @Id
- public VegetablePk getId() {
- return id;
- }
-
- public void setId(VegetablePk id) {
- this.id = id;
- }
-
- public long getPriceInCent() {
- return priceInCent;
- }
-
- public void setPriceInCent(long priceInCent) {
- this.priceInCent = priceInCent;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Vegetable ) ) return false;
-
- final Vegetable vegetable = (Vegetable) o;
-
- if ( !id.equals( vegetable.id ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return id.hashCode();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Vegetable.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Vegetable.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Vegetable.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/Vegetable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Inheritance(
+ strategy = InheritanceType.JOINED
+)
+public class Vegetable {
+ private VegetablePk id;
+ private long priceInCent;
+
+ @Id
+ public VegetablePk getId() {
+ return id;
+ }
+
+ public void setId(VegetablePk id) {
+ this.id = id;
+ }
+
+ public long getPriceInCent() {
+ return priceInCent;
+ }
+
+ public void setPriceInCent(long priceInCent) {
+ this.priceInCent = priceInCent;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Vegetable ) ) return false;
+
+ final Vegetable vegetable = (Vegetable) o;
+
+ if ( !id.equals( vegetable.id ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return id.hashCode();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/VegetablePk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/VegetablePk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/VegetablePk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class VegetablePk implements Serializable {
- private String farmer;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof VegetablePk ) ) return false;
-
- final VegetablePk vegetablePk = (VegetablePk) o;
-
- if ( !farmer.equals( vegetablePk.farmer ) ) return false;
- if ( !harvestDate.equals( vegetablePk.harvestDate ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = farmer.hashCode();
- result = 29 * result + harvestDate.hashCode();
- return result;
- }
-
- public String getFarmer() {
- return farmer;
- }
-
- public void setFarmer(String farmer) {
- this.farmer = farmer;
- }
-
- public String getHarvestDate() {
- return harvestDate;
- }
-
- public void setHarvestDate(String harvestDate) {
- this.harvestDate = harvestDate;
- }
-
- private String harvestDate;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/VegetablePk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/VegetablePk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/VegetablePk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/VegetablePk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class VegetablePk implements Serializable {
+ private String farmer;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof VegetablePk ) ) return false;
+
+ final VegetablePk vegetablePk = (VegetablePk) o;
+
+ if ( !farmer.equals( vegetablePk.farmer ) ) return false;
+ if ( !harvestDate.equals( vegetablePk.harvestDate ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = farmer.hashCode();
+ result = 29 * result + harvestDate.hashCode();
+ return result;
+ }
+
+ public String getFarmer() {
+ return farmer;
+ }
+
+ public void setFarmer(String farmer) {
+ this.farmer = farmer;
+ }
+
+ public String getHarvestDate() {
+ return harvestDate;
+ }
+
+ public void setHarvestDate(String harvestDate) {
+ this.harvestDate = harvestDate;
+ }
+
+ private String harvestDate;
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Alarm.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Alarm.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Alarm.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id: Sweater.java 8974 2006-01-04 00:43:49Z epbernard $
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.OneToOne;
-
- at Entity
- at DiscriminatorValue("AlarmT")
-public class Alarm extends EventInformation {
-
- protected EventInformation eventInfo;
-
- @OneToOne
- @JoinColumns({@JoinColumn(name = "EVENTINFORMATIONT_NOTIFICATIONID",
- referencedColumnName = "NOTIFICATIONID")})
- public EventInformation getEventInfo() {
- return eventInfo;
- }
-
- public void setEventInfo(EventInformation value) {
- this.eventInfo = value;
- }
-
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- String eventId = ( getEventInfo() != null ?
- getEventInfo().getNotificationId() : null );
- sb.append(
- "AlarmT: id = " + getNotificationId() + "\t" +
- "has event id = " + eventId
- );
- return sb.toString();
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Alarm.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Alarm.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Alarm.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Alarm.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id: Sweater.java 8974 2006-01-04 00:43:49Z epbernard $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.OneToOne;
+
+ at Entity
+ at DiscriminatorValue("AlarmT")
+public class Alarm extends EventInformation {
+
+ protected EventInformation eventInfo;
+
+ @OneToOne
+ @JoinColumns({@JoinColumn(name = "EVENTINFORMATIONT_NOTIFICATIONID",
+ referencedColumnName = "NOTIFICATIONID")})
+ public EventInformation getEventInfo() {
+ return eventInfo;
+ }
+
+ public void setEventInfo(EventInformation value) {
+ this.eventInfo = value;
+ }
+
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ String eventId = ( getEventInfo() != null ?
+ getEventInfo().getNotificationId() : null );
+ sb.append(
+ "AlarmT: id = " + getNotificationId() + "\t" +
+ "has event id = " + eventId
+ );
+ return sb.toString();
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping package="org.hibernate.test.annotations.inheritance.joined">
-
- <class name="Parent">
- <id name="id">
- <generator class="native"/>
- </id>
- <set name="financialAssets" fetch="join" cascade="refresh" inverse="true">
- <key column="PARENT_ID"/>
- <one-to-many class="FinancialAsset"/>
- </set>
- <set name="propertyAssets" fetch="join" cascade="refresh" inverse="true">
- <key column="PARENT_ID"/>
- <one-to-many class="PropertyAsset"/>
- </set>
- </class>
- <class name="Asset">
- <id name="id">
- <generator class="native"/>
- </id>
- <many-to-one name="parent" column="PARENT_ID" property-ref="parent"/>
- <joined-subclass name="FinancialAsset">
- <key column="ID"/>
- <property name="price"/>
- </joined-subclass>
- <joined-subclass name="PropertyAsset">
- <key column="ID"/>
- <property name="price"/>
- </joined-subclass>
- </class>
-
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.annotations.inheritance.joined">
+
+ <class name="Parent">
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <set name="financialAssets" fetch="join" cascade="refresh" inverse="true">
+ <key column="PARENT_ID"/>
+ <one-to-many class="FinancialAsset"/>
+ </set>
+ <set name="propertyAssets" fetch="join" cascade="refresh" inverse="true">
+ <key column="PARENT_ID"/>
+ <one-to-many class="PropertyAsset"/>
+ </set>
+ </class>
+ <class name="Asset">
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <many-to-one name="parent" column="PARENT_ID" property-ref="parent"/>
+ <joined-subclass name="FinancialAsset">
+ <key column="ID"/>
+ <property name="price"/>
+ </joined-subclass>
+ <joined-subclass name="PropertyAsset">
+ <key column="ID"/>
+ <property name="price"/>
+ </joined-subclass>
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.JOINED)
- at Table(name = "TBLASSET")
-public class Asset {
- private Integer id;
-
- private Parent parent = null;
-
- @Id @GeneratedValue public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @ManyToOne(targetEntity = Parent.class)
- @JoinColumn(name = "PARENTID")
- public Parent getParent() {
- return parent;
- }
-
- public void setParent(Parent parent) {
- this.parent = parent;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Asset.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id: $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at Table(name = "TBLASSET")
+public class Asset {
+ private Integer id;
+
+ private Parent parent = null;
+
+ @Id @GeneratedValue public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @ManyToOne(targetEntity = Parent.class)
+ @JoinColumn(name = "PARENTID")
+ public Parent getParent() {
+ return parent;
+ }
+
+ public void setParent(Parent parent) {
+ this.parent = parent;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Clothing.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Clothing.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Clothing.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,46 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.JOINED)
-public abstract class Clothing {
- private long id;
- private int size;
- private String color;
-
- @Id
- @GeneratedValue
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public int getSize() {
- return size;
- }
-
- public void setSize(int size) {
- this.size = size;
- }
-
- public String getColor() {
- return color;
- }
-
- public void setColor(String color) {
- this.color = color;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Clothing.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Clothing.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Clothing.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Clothing.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,46 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+public abstract class Clothing {
+ private long id;
+ private int size;
+ private String color;
+
+ @Id
+ @GeneratedValue
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public int getSize() {
+ return size;
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Document.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Document.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Document.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-
-import org.hibernate.annotations.ForeignKey;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at ForeignKey(name = "FK_DOCU_FILE")
-public class Document extends File {
- @Column(nullable = false)
- private int size;
-
- Document() {
- }
-
- Document(String name, int size) {
- super( name );
- this.size = size;
- }
-
- public int getSize() {
- return size;
- }
-
- public void setSize(int size) {
- this.size = size;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Document.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Document.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Document.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Document.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+
+import org.hibernate.annotations.ForeignKey;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at ForeignKey(name = "FK_DOCU_FILE")
+public class Document extends File {
+ @Column(nullable = false)
+ private int size;
+
+ Document() {
+ }
+
+ Document(String name, int size) {
+ super( name );
+ this.size = size;
+ }
+
+ public int getSize() {
+ return size;
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/EventInformation.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/EventInformation.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/EventInformation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id: Sweater.java 8974 2006-01-04 00:43:49Z epbernard $
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorType;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-
- at Entity
- at Inheritance(strategy = InheritanceType.JOINED)
- at DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING, length = 80)
- at DiscriminatorValue("EventInformationT")
-public class EventInformation implements java.io.Serializable {
-
-
- protected String notificationId;
-
- @Id
- public String getNotificationId() {
- return notificationId;
- }
-
- public void setNotificationId(String value) {
- this.notificationId = value;
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append( "EventInformationT: id = " + getNotificationId() );
- return sb.toString();
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/EventInformation.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/EventInformation.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/EventInformation.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/EventInformation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id: Sweater.java 8974 2006-01-04 00:43:49Z epbernard $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at DiscriminatorColumn(name = "DTYPE", discriminatorType = DiscriminatorType.STRING, length = 80)
+ at DiscriminatorValue("EventInformationT")
+public class EventInformation implements java.io.Serializable {
+
+
+ protected String notificationId;
+
+ @Id
+ public String getNotificationId() {
+ return notificationId;
+ }
+
+ public void setNotificationId(String value) {
+ this.notificationId = value;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append( "EventInformationT: id = " + getNotificationId() );
+ return sb.toString();
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/File.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/File.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/File.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.JOINED)
-public abstract class File {
- @Id
- private String name;
- @ManyToOne
- private Folder parent;
-
- File() {
- }
-
- public File(String name) {
- this.name = name;
- }
-
-
- public String getName() {
- return name;
- }
-
- public void setName(String id) {
- this.name = id;
- }
-
- public Folder getParent() {
- return parent;
- }
-
- public void setParent(Folder parent) {
- this.parent = parent;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/File.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/File.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/File.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/File.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+public abstract class File {
+ @Id
+ private String name;
+ @ManyToOne
+ private Folder parent;
+
+ File() {
+ }
+
+ public File(String name) {
+ this.name = name;
+ }
+
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String id) {
+ this.name = id;
+ }
+
+ public Folder getParent() {
+ return parent;
+ }
+
+ public void setParent(Folder parent) {
+ this.parent = parent;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class FinancialAsset extends Asset {
- private double price;
-
- public double getPrice() {
- return price;
- }
-
- public void setPrice(double price) {
- this.price = price;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/FinancialAsset.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class FinancialAsset extends Asset {
+ private double price;
+
+ public double getPrice() {
+ return price;
+ }
+
+ public void setPrice(double price) {
+ this.price = price;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Folder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Folder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Folder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.joined;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Folder extends File {
- @OneToMany(mappedBy = "parent")
- private Set<File> children = new HashSet<File>();
-
- Folder() {
- }
-
- public Folder(String name) {
- super( name );
- }
-
- public Set<File> getChildren() {
- return children;
- }
-
- public void setChildren(Set children) {
- this.children = children;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Folder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Folder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Folder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Folder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.joined;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Folder extends File {
+ @OneToMany(mappedBy = "parent")
+ private Set<File> children = new HashSet<File>();
+
+ Folder() {
+ }
+
+ public Folder(String name) {
+ super( name );
+ }
+
+ public Set<File> getChildren() {
+ return children;
+ }
+
+ public void setChildren(Set children) {
+ this.children = children;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.inheritance.joined;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JoinedSubclassAndSecondaryTable extends TestCase {
-
- public void testSecondaryTableAndJoined() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- SwimmingPool sp = new SwimmingPool();
- sp.setAddress( "Park Avenue" );
- s.persist( sp );
- tx.rollback();
- s.close();
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- Pool.class,
- SwimmingPool.class
- };
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassAndSecondaryTable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id: $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JoinedSubclassAndSecondaryTable extends TestCase {
+
+ public void testSecondaryTableAndJoined() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ SwimmingPool sp = new SwimmingPool();
+ sp.setAddress( "Park Avenue" );
+ s.persist( sp );
+ tx.rollback();
+ s.close();
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ Pool.class,
+ SwimmingPool.class
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,178 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.joined;
-
-import java.util.List;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JoinedSubclassTest extends TestCase {
-
- public JoinedSubclassTest(String x) {
- super( x );
- }
-
- public void testDefault() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- File doc = new Document( "Enron Stuff To Shred", 1000 );
- Folder folder = new Folder( "Enron" );
- s.persist( doc );
- s.persist( folder );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- List result = s.createCriteria( File.class ).list();
- assertNotNull( result );
- assertEquals( 2, result.size() );
- File f2 = (File) result.get( 0 );
- checkClassType( f2, doc, folder );
- f2 = (File) result.get( 1 );
- checkClassType( f2, doc, folder );
- s.delete( result.get( 0 ) );
- s.delete( result.get( 1 ) );
- tx.commit();
- s.close();
- }
-
- public void testManyToOneOnAbstract() throws Exception {
- Folder f = new Folder();
- f.setName( "data" );
- ProgramExecution remove = new ProgramExecution();
- remove.setAction( "remove" );
- remove.setAppliesOn( f );
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( f );
- s.persist( remove );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- remove = (ProgramExecution) s.get( ProgramExecution.class, remove.getId() );
- assertNotNull( remove );
- assertNotNull( remove.getAppliesOn().getName() );
- s.delete( remove );
- s.delete( remove.getAppliesOn() );
- tx.commit();
- s.close();
-
- }
-
- private void checkClassType(File fruitToTest, File f, Folder a) {
- if ( fruitToTest.getName().equals( f.getName() ) ) {
- assertFalse( fruitToTest instanceof Folder );
- }
- else if ( fruitToTest.getName().equals( a.getName() ) ) {
- assertTrue( fruitToTest instanceof Folder );
- }
- else {
- fail( "Result does not contains the previously inserted elements" );
- }
- }
-
- public void testJoinedAbstractClass() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- s.getTransaction().begin();
- Sweater sw = new Sweater();
- sw.setColor( "Black" );
- sw.setSize( 2 );
- sw.setSweat( true );
- s.persist( sw );
- s.getTransaction().commit();
- s.clear();
-
- s = openSession();
- s.getTransaction().begin();
- sw = (Sweater) s.get( Sweater.class, sw.getId() );
- s.delete( sw );
- s.getTransaction().commit();
- s.close();
- }
-
- public void testInheritance() throws Exception {
- Session session = openSession();
- Transaction transaction = session.beginTransaction();
- String eventPK = "event1";
- EventInformation event = (EventInformation) session.get( EventInformation.class, eventPK );
- if ( event == null ) {
- event = new EventInformation();
- event.setNotificationId( eventPK );
- session.persist( event );
- }
- String alarmPK = "alarm1";
- Alarm alarm = (Alarm) session.get( Alarm.class, alarmPK );
- if ( alarm == null ) {
- alarm = new Alarm();
- alarm.setNotificationId( alarmPK );
- alarm.setEventInfo( event );
- session.persist( alarm );
- }
- transaction.commit();
- session.close();
- }
-
-// public void testManyToOneAndJoin() throws Exception {
-// Session session = openSession();
-// Transaction transaction = session.beginTransaction();
-// Parent parent = new Parent();
-// session.persist( parent );
-// PropertyAsset property = new PropertyAsset();
-// property.setParent( parent );
-// property.setPrice( 230000d );
-// FinancialAsset financial = new FinancialAsset();
-// financial.setParent( parent );
-// financial.setPrice( 230000d );
-// session.persist( financial );
-// session.persist( property );
-// session.flush();
-// session.clear();
-// parent = (Parent) session.get( Parent.class, parent.getId() );
-// assertNotNull( parent );
-// assertEquals( 1, parent.getFinancialAssets().size() );
-// assertEquals( 1, parent.getPropertyAssets().size() );
-// assertEquals( property.getId(), parent.getPropertyAssets().iterator().next() );
-// transaction.rollback();
-// session.close();
-// }
-
- @Override
- protected String[] getXmlFiles() {
- return new String[] {
- //"org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml"
- };
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- File.class,
- Folder.class,
- Document.class,
- SymbolicLink.class,
- ProgramExecution.class,
- Clothing.class,
- Sweater.class,
- EventInformation.class,
- Alarm.class,
- //Asset.class,
- //Parent.class,
- //PropertyAsset.class,
- //FinancialAsset.class
- };
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/JoinedSubclassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,178 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.joined;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JoinedSubclassTest extends TestCase {
+
+ public JoinedSubclassTest(String x) {
+ super( x );
+ }
+
+ public void testDefault() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ File doc = new Document( "Enron Stuff To Shred", 1000 );
+ Folder folder = new Folder( "Enron" );
+ s.persist( doc );
+ s.persist( folder );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ List result = s.createCriteria( File.class ).list();
+ assertNotNull( result );
+ assertEquals( 2, result.size() );
+ File f2 = (File) result.get( 0 );
+ checkClassType( f2, doc, folder );
+ f2 = (File) result.get( 1 );
+ checkClassType( f2, doc, folder );
+ s.delete( result.get( 0 ) );
+ s.delete( result.get( 1 ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testManyToOneOnAbstract() throws Exception {
+ Folder f = new Folder();
+ f.setName( "data" );
+ ProgramExecution remove = new ProgramExecution();
+ remove.setAction( "remove" );
+ remove.setAppliesOn( f );
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( f );
+ s.persist( remove );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ remove = (ProgramExecution) s.get( ProgramExecution.class, remove.getId() );
+ assertNotNull( remove );
+ assertNotNull( remove.getAppliesOn().getName() );
+ s.delete( remove );
+ s.delete( remove.getAppliesOn() );
+ tx.commit();
+ s.close();
+
+ }
+
+ private void checkClassType(File fruitToTest, File f, Folder a) {
+ if ( fruitToTest.getName().equals( f.getName() ) ) {
+ assertFalse( fruitToTest instanceof Folder );
+ }
+ else if ( fruitToTest.getName().equals( a.getName() ) ) {
+ assertTrue( fruitToTest instanceof Folder );
+ }
+ else {
+ fail( "Result does not contains the previously inserted elements" );
+ }
+ }
+
+ public void testJoinedAbstractClass() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ s.getTransaction().begin();
+ Sweater sw = new Sweater();
+ sw.setColor( "Black" );
+ sw.setSize( 2 );
+ sw.setSweat( true );
+ s.persist( sw );
+ s.getTransaction().commit();
+ s.clear();
+
+ s = openSession();
+ s.getTransaction().begin();
+ sw = (Sweater) s.get( Sweater.class, sw.getId() );
+ s.delete( sw );
+ s.getTransaction().commit();
+ s.close();
+ }
+
+ public void testInheritance() throws Exception {
+ Session session = openSession();
+ Transaction transaction = session.beginTransaction();
+ String eventPK = "event1";
+ EventInformation event = (EventInformation) session.get( EventInformation.class, eventPK );
+ if ( event == null ) {
+ event = new EventInformation();
+ event.setNotificationId( eventPK );
+ session.persist( event );
+ }
+ String alarmPK = "alarm1";
+ Alarm alarm = (Alarm) session.get( Alarm.class, alarmPK );
+ if ( alarm == null ) {
+ alarm = new Alarm();
+ alarm.setNotificationId( alarmPK );
+ alarm.setEventInfo( event );
+ session.persist( alarm );
+ }
+ transaction.commit();
+ session.close();
+ }
+
+// public void testManyToOneAndJoin() throws Exception {
+// Session session = openSession();
+// Transaction transaction = session.beginTransaction();
+// Parent parent = new Parent();
+// session.persist( parent );
+// PropertyAsset property = new PropertyAsset();
+// property.setParent( parent );
+// property.setPrice( 230000d );
+// FinancialAsset financial = new FinancialAsset();
+// financial.setParent( parent );
+// financial.setPrice( 230000d );
+// session.persist( financial );
+// session.persist( property );
+// session.flush();
+// session.clear();
+// parent = (Parent) session.get( Parent.class, parent.getId() );
+// assertNotNull( parent );
+// assertEquals( 1, parent.getFinancialAssets().size() );
+// assertEquals( 1, parent.getPropertyAssets().size() );
+// assertEquals( property.getId(), parent.getPropertyAssets().iterator().next() );
+// transaction.rollback();
+// session.close();
+// }
+
+ @Override
+ protected String[] getXmlFiles() {
+ return new String[] {
+ //"org/hibernate/test/annotations/inheritance/joined/Asset.hbm.xml"
+ };
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ File.class,
+ Folder.class,
+ Document.class,
+ SymbolicLink.class,
+ ProgramExecution.class,
+ Clothing.class,
+ Sweater.class,
+ EventInformation.class,
+ Alarm.class,
+ //Asset.class,
+ //Parent.class,
+ //PropertyAsset.class,
+ //FinancialAsset.class
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Parent.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Parent.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.inheritance.joined;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "Parent")
-public class Parent {
- private Integer id;
- private Set propertyAssets = new HashSet();
- private Set financialAssets = new HashSet();
-
- @Id @GeneratedValue public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER, mappedBy = "parent", targetEntity = PropertyAsset.class)
- public Set getPropertyAssets() {
- return this.propertyAssets;
- }
-
- public void setPropertyAssets(Set propertyAssets) {
- this.propertyAssets = propertyAssets;
- }
-
- @OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER, mappedBy = "parent", targetEntity = FinancialAsset.class)
- public Set getFinancialAssets() {
- return this.financialAssets;
- }
-
- public void setFinancialAssets(Set financialAssets) {
- this.financialAssets = financialAssets;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Parent.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Parent.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Parent.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id: $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "Parent")
+public class Parent {
+ private Integer id;
+ private Set propertyAssets = new HashSet();
+ private Set financialAssets = new HashSet();
+
+ @Id @GeneratedValue public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER, mappedBy = "parent", targetEntity = PropertyAsset.class)
+ public Set getPropertyAssets() {
+ return this.propertyAssets;
+ }
+
+ public void setPropertyAssets(Set propertyAssets) {
+ this.propertyAssets = propertyAssets;
+ }
+
+ @OneToMany(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER, mappedBy = "parent", targetEntity = FinancialAsset.class)
+ public Set getFinancialAssets() {
+ return this.financialAssets;
+ }
+
+ public void setFinancialAssets(Set financialAssets) {
+ this.financialAssets = financialAssets;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Pool.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Pool.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Pool.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Entity;
-import javax.persistence.SecondaryTable;
-import javax.persistence.Column;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.JOINED)
- at SecondaryTable(name="POOL_ADDRESS")
-public class Pool {
- @Id @GeneratedValue private Integer id;
- @Column(table = "POOL_ADDRESS")
- private String address;
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Pool.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Pool.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Pool.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Pool.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id: $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at SecondaryTable(name="POOL_ADDRESS")
+public class Pool {
+ @Id @GeneratedValue private Integer id;
+ @Column(table = "POOL_ADDRESS")
+ private String address;
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class ProgramExecution {
- @Id
- @GeneratedValue
- private Integer id;
- private String action;
- @ManyToOne(fetch = FetchType.LAZY)
- private File appliesOn;
-
-
- public File getAppliesOn() {
- return appliesOn;
- }
-
- public void setAppliesOn(File appliesOn) {
- this.appliesOn = appliesOn;
- }
-
- public String getAction() {
- return action;
- }
-
- public void setAction(String action) {
- this.action = action;
- }
-
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/ProgramExecution.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ProgramExecution {
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private String action;
+ @ManyToOne(fetch = FetchType.LAZY)
+ private File appliesOn;
+
+
+ public File getAppliesOn() {
+ return appliesOn;
+ }
+
+ public void setAppliesOn(File appliesOn) {
+ this.appliesOn = appliesOn;
+ }
+
+ public String getAction() {
+ return action;
+ }
+
+ public void setAction(String action) {
+ this.action = action;
+ }
+
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class PropertyAsset extends Asset {
- private double price;
-
- public double getPrice() {
- return price;
- }
-
- public void setPrice(double price) {
- this.price = price;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/PropertyAsset.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PropertyAsset extends Asset {
+ private double price;
+
+ public double getPrice() {
+ return price;
+ }
+
+ public void setPrice(double price) {
+ this.price = price;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Sweater.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Sweater.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Sweater.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Entity;
-import javax.persistence.PrimaryKeyJoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at PrimaryKeyJoinColumn(name = "clothing_id")
-public class Sweater extends Clothing {
- private boolean isSweat;
-
- public boolean isSweat() {
- return isSweat;
- }
-
- public void setSweat(boolean sweat) {
- isSweat = sweat;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Sweater.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Sweater.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Sweater.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/Sweater.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at PrimaryKeyJoinColumn(name = "clothing_id")
+public class Sweater extends Clothing {
+ private boolean isSweat;
+
+ public boolean isSweat() {
+ return isSweat;
+ }
+
+ public void setSweat(boolean sweat) {
+ isSweat = sweat;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class SwimmingPool extends Pool {
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SwimmingPool.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id: $
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SwimmingPool extends Pool {
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.joined;
-
-import javax.persistence.Entity;
-import javax.persistence.ManyToOne;
-
- at Entity
-public class SymbolicLink extends File {
-
- @ManyToOne(optional = false)
- File target;
-
- SymbolicLink() {
- }
-
- public SymbolicLink(File target) {
- this.target = target;
- }
-
- public File getTarget() {
- return target;
- }
-
- public void setTarget(File target) {
- this.target = target;
- }
-
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/joined/SymbolicLink.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.joined;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class SymbolicLink extends File {
+
+ @ManyToOne(optional = false)
+ File target;
+
+ SymbolicLink() {
+ }
+
+ public SymbolicLink(File target) {
+ this.target = target;
+ }
+
+ public File getTarget() {
+ return target;
+ }
+
+ public void setTarget(File target) {
+ this.target = target;
+ }
+
+
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Document.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Document.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Document.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.mixed;
-
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.SecondaryTable;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorValue("D")
- at SecondaryTable(name = "DocumentMixed")
- at Table(name="Document_Wrong") //illegal use, a warn is raised
-public class Document extends File {
- private int size;
-
- Document() {
- }
-
- Document(String name, int size) {
- super( name );
- this.size = size;
- }
-
- @Column(table = "DocumentMixed", nullable = false)
- public int getSize() {
- return size;
- }
-
- public void setSize(int size) {
- this.size = size;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Document.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Document.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Document.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Document.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.mixed;
+
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("D")
+ at SecondaryTable(name = "DocumentMixed")
+ at Table(name="Document_Wrong") //illegal use, a warn is raised
+public class Document extends File {
+ private int size;
+
+ Document() {
+ }
+
+ Document(String name, int size) {
+ super( name );
+ this.size = size;
+ }
+
+ @Column(table = "DocumentMixed", nullable = false)
+ public int getSize() {
+ return size;
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/File.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/File.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/File.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.mixed;
-
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.SecondaryTable;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.SINGLE_TABLE)
- at Table(name = "FileMixed")
- at SecondaryTable(name = "FileFolderMixed")
- at DiscriminatorColumn(length = 1)
-public abstract class File {
- private String name;
- private Folder parent;
-
- File() {
- }
-
- public File(String name) {
- this.name = name;
- }
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String id) {
- this.name = id;
- }
-
- @ManyToOne
- @JoinColumn(table = "FileFolderMixed")
- public Folder getParent() {
- return parent;
- }
-
- public void setParent(Folder parent) {
- this.parent = parent;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/File.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/File.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/File.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/File.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.mixed;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+ at Table(name = "FileMixed")
+ at SecondaryTable(name = "FileFolderMixed")
+ at DiscriminatorColumn(length = 1)
+public abstract class File {
+ private String name;
+ private Folder parent;
+
+ File() {
+ }
+
+ public File(String name) {
+ this.name = name;
+ }
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String id) {
+ this.name = id;
+ }
+
+ @ManyToOne
+ @JoinColumn(table = "FileFolderMixed")
+ public Folder getParent() {
+ return parent;
+ }
+
+ public void setParent(Folder parent) {
+ this.parent = parent;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Folder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Folder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Folder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.mixed;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorValue("F")
-public class Folder extends File {
- private Set<File> children = new HashSet<File>();
-
- Folder() {
- }
-
- public Folder(String name) {
- super( name );
- }
-
- @OneToMany(mappedBy = "parent")
- public Set<File> getChildren() {
- return children;
- }
-
- public void setChildren(Set children) {
- this.children = children;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Folder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Folder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Folder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/Folder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.mixed;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("F")
+public class Folder extends File {
+ private Set<File> children = new HashSet<File>();
+
+ Folder() {
+ }
+
+ public Folder(String name) {
+ super( name );
+ }
+
+ @OneToMany(mappedBy = "parent")
+ public Set<File> getChildren() {
+ return children;
+ }
+
+ public void setChildren(Set children) {
+ this.children = children;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,76 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.mixed;
-
-import java.util.List;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.exception.SQLGrammarException;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class SubclassTest extends TestCase {
-
- public SubclassTest(String x) {
- super( x );
- }
-
- public void testDefault() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- File doc = new Document( "Enron Stuff To Shred", 1000 );
- Folder folder = new Folder( "Enron" );
- s.persist( doc );
- s.persist( folder );
- try {
- tx.commit();
- }
- catch (SQLGrammarException e) {
- System.err.println( e.getSQLException().getNextException() );
- }
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- List result = s.createCriteria( File.class ).list();
- assertNotNull( result );
- assertEquals( 2, result.size() );
- File f2 = (File) result.get( 0 );
- checkClassType( f2, doc, folder );
- f2 = (File) result.get( 1 );
- checkClassType( f2, doc, folder );
- s.delete( result.get( 0 ) );
- s.delete( result.get( 1 ) );
- tx.commit();
- s.close();
- }
-
- private void checkClassType(File fruitToTest, File f, Folder a) {
- if ( fruitToTest.getName().equals( f.getName() ) ) {
- assertFalse( fruitToTest instanceof Folder );
- }
- else if ( fruitToTest.getName().equals( a.getName() ) ) {
- assertTrue( fruitToTest instanceof Folder );
- }
- else {
- fail( "Result does not contains the previously inserted elements" );
- }
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- File.class,
- Folder.class,
- Document.class,
- SymbolicLink.class
- };
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SubclassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,76 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.mixed;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.exception.SQLGrammarException;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SubclassTest extends TestCase {
+
+ public SubclassTest(String x) {
+ super( x );
+ }
+
+ public void testDefault() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ File doc = new Document( "Enron Stuff To Shred", 1000 );
+ Folder folder = new Folder( "Enron" );
+ s.persist( doc );
+ s.persist( folder );
+ try {
+ tx.commit();
+ }
+ catch (SQLGrammarException e) {
+ System.err.println( e.getSQLException().getNextException() );
+ }
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ List result = s.createCriteria( File.class ).list();
+ assertNotNull( result );
+ assertEquals( 2, result.size() );
+ File f2 = (File) result.get( 0 );
+ checkClassType( f2, doc, folder );
+ f2 = (File) result.get( 1 );
+ checkClassType( f2, doc, folder );
+ s.delete( result.get( 0 ) );
+ s.delete( result.get( 1 ) );
+ tx.commit();
+ s.close();
+ }
+
+ private void checkClassType(File fruitToTest, File f, Folder a) {
+ if ( fruitToTest.getName().equals( f.getName() ) ) {
+ assertFalse( fruitToTest instanceof Folder );
+ }
+ else if ( fruitToTest.getName().equals( a.getName() ) ) {
+ assertTrue( fruitToTest instanceof Folder );
+ }
+ else {
+ fail( "Result does not contains the previously inserted elements" );
+ }
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ File.class,
+ Folder.class,
+ Document.class,
+ SymbolicLink.class
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.mixed;
-
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.SecondaryTable;
-
- at Entity
- at DiscriminatorValue("L")
- at SecondaryTable(name = "SymbolicLinkMixed")
-public class SymbolicLink extends File {
-
- File target;
-
- SymbolicLink() {
- }
-
- public SymbolicLink(File target) {
- this.target = target;
- }
-
- @ManyToOne(optional = false)
- @JoinColumn(table = "SymbolicLinkMixed")
- public File getTarget() {
- return target;
- }
-
- public void setTarget(File target) {
- this.target = target;
- }
-
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/mixed/SymbolicLink.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.mixed;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.SecondaryTable;
+
+ at Entity
+ at DiscriminatorValue("L")
+ at SecondaryTable(name = "SymbolicLinkMixed")
+public class SymbolicLink extends File {
+
+ File target;
+
+ SymbolicLink() {
+ }
+
+ public SymbolicLink(File target) {
+ this.target = target;
+ }
+
+ @ManyToOne(optional = false)
+ @JoinColumn(table = "SymbolicLinkMixed")
+ public File getTarget() {
+ return target;
+ }
+
+ public void setTarget(File target) {
+ this.target = target;
+ }
+
+
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Building.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Building.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Building.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.singletable;
-
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import org.hibernate.annotations.ForceDiscriminator;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorColumn(name = "discriminator_disc")
- at ForceDiscriminator
- at DiscriminatorValue("B")
-public class Building {
- @Id
- @GeneratedValue
- @Column(name = "discriminator_id")
- private Integer id;
- @Column(name = "discriminator_street")
- private String street;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getStreet() {
- return street;
- }
-
- public void setStreet(String street) {
- this.street = street;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Building.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Building.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Building.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Building.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.ForceDiscriminator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorColumn(name = "discriminator_disc")
+ at ForceDiscriminator
+ at DiscriminatorValue("B")
+public class Building {
+ @Id
+ @GeneratedValue
+ @Column(name = "discriminator_id")
+ private Integer id;
+ @Column(name = "discriminator_street")
+ private String street;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Funk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Funk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Funk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.singletable;
-
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorValue("1")
-public class Funk extends Music {
- private int starred;
-
- public int getStarred() {
- return starred;
- }
-
- public void setStarred(int starred) {
- this.starred = starred;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Funk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Funk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Funk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Funk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("1")
+public class Funk extends Music {
+ private int starred;
+
+ public int getStarred() {
+ return starred;
+ }
+
+ public void setStarred(int starred) {
+ this.starred = starred;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/House.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/House.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/House.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.singletable;
-
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorValue("H")
-public class House extends Building {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/House.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/House.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/House.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/House.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("H")
+public class House extends Building {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Music.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Music.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Music.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.singletable;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import org.hibernate.annotations.DiscriminatorFormula;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorFormula("case when zik_type is null then 0 else zik_type end")
- at Table(uniqueConstraints = @UniqueConstraint(columnNames = {"avgBeat", "starred"} ))
-public abstract class Music {
- private Integer id;
- private int avgBeat;
- private Integer type;
-
- @Column(name = "zik_type")
- public Integer getType() {
- return type;
- }
-
- public void setType(Integer type) {
- this.type = type;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public int getAvgBeat() {
- return avgBeat;
- }
-
- public void setAvgBeat(int avgBeat) {
- this.avgBeat = avgBeat;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Music.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Music.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Music.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Music.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.DiscriminatorFormula;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorFormula("case when zik_type is null then 0 else zik_type end")
+ at Table(uniqueConstraints = @UniqueConstraint(columnNames = {"avgBeat", "starred"} ))
+public abstract class Music {
+ private Integer id;
+ private int avgBeat;
+ private Integer type;
+
+ @Column(name = "zik_type")
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public int getAvgBeat() {
+ return avgBeat;
+ }
+
+ public void setAvgBeat(int avgBeat) {
+ this.avgBeat = avgBeat;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Noise.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Noise.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Noise.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.singletable;
-
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorValue("0")
-public class Noise extends Music {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Noise.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Noise.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Noise.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Noise.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("0")
+public class Noise extends Music {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.singletable;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class PaperTrash extends Trash {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/PaperTrash.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PaperTrash extends Trash {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Rock.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Rock.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Rock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.singletable;
-
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorValue("2")
-public class Rock extends Music {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Rock.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Rock.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Rock.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Rock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("2")
+public class Rock extends Music {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Trash.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Trash.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Trash.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.singletable;
-
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorColumn(discriminatorType = DiscriminatorType.INTEGER)
-public class Trash {
- @Id
- @GeneratedValue
- private Integer id;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Trash.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Trash.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Trash.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/singletable/Trash.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.singletable;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorColumn(discriminatorType = DiscriminatorType.INTEGER)
+public class Trash {
+ @Id
+ @GeneratedValue
+ private Integer id;
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Document.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Document.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Document.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.union;
-
-import javax.persistence.Entity;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "DocumentUnion")
-public class Document extends File {
- private int size;
-
- Document() {
- }
-
- Document(String name, int size) {
- super( name );
- this.size = size;
- }
-
- public int getSize() {
- return size;
- }
-
- public void setSize(int size) {
- this.size = size;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Document.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Document.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Document.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Document.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.union;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "DocumentUnion")
+public class Document extends File {
+ private int size;
+
+ Document() {
+ }
+
+ Document(String name, int size) {
+ super( name );
+ this.size = size;
+ }
+
+ public int getSize() {
+ return size;
+ }
+
+ public void setSize(int size) {
+ this.size = size;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/File.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/File.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/File.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.union;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public abstract class File {
- private String name;
- private Folder parent;
-
- File() {
- }
-
- public File(String name) {
- this.name = name;
- }
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String id) {
- this.name = id;
- }
-
- @ManyToOne
- public Folder getParent() {
- return parent;
- }
-
- public void setParent(Folder parent) {
- this.parent = parent;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/File.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/File.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/File.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/File.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.union;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public abstract class File {
+ private String name;
+ private Folder parent;
+
+ File() {
+ }
+
+ public File(String name) {
+ this.name = name;
+ }
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String id) {
+ this.name = id;
+ }
+
+ @ManyToOne
+ public Folder getParent() {
+ return parent;
+ }
+
+ public void setParent(Folder parent) {
+ this.parent = parent;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Folder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Folder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Folder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.union;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.OneToMany;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "FolderUnion")
-public class Folder extends File {
- private Set<File> children = new HashSet<File>();
-
- Folder() {
- }
-
- public Folder(String name) {
- super( name );
- }
-
- @OneToMany(mappedBy = "parent")
- public Set<File> getChildren() {
- return children;
- }
-
- public void setChildren(Set children) {
- this.children = children;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Folder.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Folder.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Folder.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/Folder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.union;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "FolderUnion")
+public class Folder extends File {
+ private Set<File> children = new HashSet<File>();
+
+ Folder() {
+ }
+
+ public Folder(String name) {
+ super( name );
+ }
+
+ @OneToMany(mappedBy = "parent")
+ public Set<File> getChildren() {
+ return children;
+ }
+
+ public void setChildren(Set children) {
+ this.children = children;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SubclassTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SubclassTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SubclassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,68 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.union;
-
-import java.util.List;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class SubclassTest extends TestCase {
-
- public SubclassTest(String x) {
- super( x );
- }
-
- public void testDefault() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- File doc = new Document( "Enron Stuff To Shred", 1000 );
- Folder folder = new Folder( "Enron" );
- s.persist( doc );
- s.persist( folder );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- List result = s.createCriteria( File.class ).list();
- assertNotNull( result );
- assertEquals( 2, result.size() );
- File f2 = (File) result.get( 0 );
- checkClassType( f2, doc, folder );
- f2 = (File) result.get( 1 );
- checkClassType( f2, doc, folder );
- tx.commit();
- s.close();
- }
-
- private void checkClassType(File fruitToTest, File f, Folder a) {
- if ( fruitToTest.getName().equals( f.getName() ) ) {
- assertFalse( fruitToTest instanceof Folder );
- }
- else if ( fruitToTest.getName().equals( a.getName() ) ) {
- assertTrue( fruitToTest instanceof Folder );
- }
- else {
- fail( "Result does not contains the previously inserted elements" );
- }
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- File.class,
- Folder.class,
- Document.class,
- SymbolicLink.class
- };
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SubclassTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SubclassTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SubclassTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SubclassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,68 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.union;
+
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SubclassTest extends TestCase {
+
+ public SubclassTest(String x) {
+ super( x );
+ }
+
+ public void testDefault() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ File doc = new Document( "Enron Stuff To Shred", 1000 );
+ Folder folder = new Folder( "Enron" );
+ s.persist( doc );
+ s.persist( folder );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ List result = s.createCriteria( File.class ).list();
+ assertNotNull( result );
+ assertEquals( 2, result.size() );
+ File f2 = (File) result.get( 0 );
+ checkClassType( f2, doc, folder );
+ f2 = (File) result.get( 1 );
+ checkClassType( f2, doc, folder );
+ tx.commit();
+ s.close();
+ }
+
+ private void checkClassType(File fruitToTest, File f, Folder a) {
+ if ( fruitToTest.getName().equals( f.getName() ) ) {
+ assertFalse( fruitToTest instanceof Folder );
+ }
+ else if ( fruitToTest.getName().equals( a.getName() ) ) {
+ assertTrue( fruitToTest instanceof Folder );
+ }
+ else {
+ fail( "Result does not contains the previously inserted elements" );
+ }
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ File.class,
+ Folder.class,
+ Document.class,
+ SymbolicLink.class
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.inheritance.union;
-
-import javax.persistence.Entity;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "SymbolicLinkUnion")
-public class SymbolicLink extends File {
-
- File target;
-
- SymbolicLink() {
- }
-
- public SymbolicLink(File target) {
- this.target = target;
- }
-
- @ManyToOne(optional = false)
- public File getTarget() {
- return target;
- }
-
- public void setTarget(File target) {
- this.target = target;
- }
-
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/inheritance/union/SymbolicLink.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.test.annotations.inheritance.union;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "SymbolicLinkUnion")
+public class SymbolicLink extends File {
+
+ File target;
+
+ SymbolicLink() {
+ }
+
+ public SymbolicLink(File target) {
+ this.target = target;
+ }
+
+ @ManyToOne(optional = false)
+ public File getTarget() {
+ return target;
+ }
+
+ public void setTarget(File target) {
+ this.target = target;
+ }
+
+
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/Contact.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/Contact.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/Contact.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.interfaces;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Contact {
- Integer getId();
-
- String getName();
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/Contact.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/Contact.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/Contact.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/Contact.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id: $
+package org.hibernate.test.annotations.interfaces;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Contact {
+ Integer getId();
+
+ String getName();
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/ContactImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/ContactImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/ContactImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.interfaces;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class ContactImpl implements Contact {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/ContactImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/ContactImpl.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/ContactImpl.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/ContactImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id: $
+package org.hibernate.test.annotations.interfaces;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ContactImpl implements Contact {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/InterfacesTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/InterfacesTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/InterfacesTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.interfaces;
-
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class InterfacesTest extends TestCase {
- public void testInterface() {
-
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- ContactImpl.class,
- UserImpl.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/InterfacesTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/InterfacesTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/InterfacesTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/InterfacesTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.test.annotations.interfaces;
+
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class InterfacesTest extends TestCase {
+ public void testInterface() {
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ ContactImpl.class,
+ UserImpl.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/User.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/User.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/User.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.interfaces;
-
-import java.util.Collection;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface User {
- Integer getId();
-
- Collection<Contact> getContacts();
-
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/User.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/User.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/User.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/User.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+//$Id: $
+package org.hibernate.test.annotations.interfaces;
+
+import java.util.Collection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface User {
+ Integer getId();
+
+ Collection<Contact> getContacts();
+
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/UserImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/UserImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/UserImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.interfaces;
-
-import java.util.Collection;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class UserImpl implements User {
- private Collection<Contact> contacts;
- private Integer id;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @OneToMany(targetEntity = ContactImpl.class)
- public Collection<Contact> getContacts() {
- return contacts;
- }
-
- public void setContacts(Collection<Contact> contacts) {
- this.contacts = contacts;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/UserImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/UserImpl.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/UserImpl.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/interfaces/UserImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+//$Id: $
+package org.hibernate.test.annotations.interfaces;
+
+import java.util.Collection;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class UserImpl implements User {
+ private Collection<Contact> contacts;
+ private Integer id;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @OneToMany(targetEntity = ContactImpl.class)
+ public Collection<Contact> getContacts() {
+ return contacts;
+ }
+
+ public void setContacts(Collection<Contact> contacts) {
+ this.contacts = contacts;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Cat.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Cat.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Cat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,101 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.join;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.SecondaryTable;
-import javax.persistence.SecondaryTables;
-import javax.persistence.UniqueConstraint;
-
-import org.hibernate.annotations.Index;
-import org.hibernate.annotations.Table;
-import org.hibernate.annotations.ForeignKey;
-import org.hibernate.annotations.Tables;
-import org.hibernate.annotations.FetchMode;
-import org.hibernate.annotations.SQLInsert;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at SecondaryTables({
- at SecondaryTable(name = "`Cat nbr1`"),
- at SecondaryTable(name = "Cat2", uniqueConstraints = {@UniqueConstraint(columnNames = {"storyPart2"})})
- })
- at Tables( {
- @Table(appliesTo = "Cat", indexes = @Index(name = "secondname",
- columnNames = "secondName"), comment = "My cat table" ),
- @Table(appliesTo = "Cat2", foreignKey = @ForeignKey(name="FK_CAT2_CAT"), fetch = FetchMode.SELECT,
- sqlInsert=@SQLInsert(sql="insert into Cat2(storyPart2, id) values(upper(?), ?)") )
- } )
-public class Cat implements Serializable {
-
- private Integer id;
- private String name;
- private String secondName;
- private String storyPart1;
- private String storyPart2;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- @Index(name = "nameindex")
- public String getName() {
- return name;
- }
-
- public void setId(Integer integer) {
- id = integer;
- }
-
- public void setName(String string) {
- name = string;
- }
-
- public String getSecondName() {
- return secondName;
- }
-
- public void setSecondName(String secondName) {
- this.secondName = secondName;
- }
-
-// Bug HHH-36
-// @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
-// @JoinColumn(name="CAT_ID", secondaryTable="ExtendedLife")
-// public Set<Life> getLifes() {
-// return lifes;
-// }
-//
-// public void setLifes(Set<Life> collection) {
-// lifes = collection;
-// }
-
- @Column(table = "`Cat nbr1`")
- @Index(name = "story1index")
- public String getStoryPart1() {
- return storyPart1;
- }
-
- @Column(table = "Cat2")
- public String getStoryPart2() {
- return storyPart2;
- }
-
-
- public void setStoryPart1(String string) {
- storyPart1 = string;
- }
-
-
- public void setStoryPart2(String string) {
- storyPart2 = string;
- }
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Cat.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Cat.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Cat.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Cat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,101 @@
+//$Id$
+package org.hibernate.test.annotations.join;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.SecondaryTable;
+import javax.persistence.SecondaryTables;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.Index;
+import org.hibernate.annotations.Table;
+import org.hibernate.annotations.ForeignKey;
+import org.hibernate.annotations.Tables;
+import org.hibernate.annotations.FetchMode;
+import org.hibernate.annotations.SQLInsert;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SecondaryTables({
+ at SecondaryTable(name = "`Cat nbr1`"),
+ at SecondaryTable(name = "Cat2", uniqueConstraints = {@UniqueConstraint(columnNames = {"storyPart2"})})
+ })
+ at Tables( {
+ @Table(appliesTo = "Cat", indexes = @Index(name = "secondname",
+ columnNames = "secondName"), comment = "My cat table" ),
+ @Table(appliesTo = "Cat2", foreignKey = @ForeignKey(name="FK_CAT2_CAT"), fetch = FetchMode.SELECT,
+ sqlInsert=@SQLInsert(sql="insert into Cat2(storyPart2, id) values(upper(?), ?)") )
+ } )
+public class Cat implements Serializable {
+
+ private Integer id;
+ private String name;
+ private String secondName;
+ private String storyPart1;
+ private String storyPart2;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ @Index(name = "nameindex")
+ public String getName() {
+ return name;
+ }
+
+ public void setId(Integer integer) {
+ id = integer;
+ }
+
+ public void setName(String string) {
+ name = string;
+ }
+
+ public String getSecondName() {
+ return secondName;
+ }
+
+ public void setSecondName(String secondName) {
+ this.secondName = secondName;
+ }
+
+// Bug HHH-36
+// @OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
+// @JoinColumn(name="CAT_ID", secondaryTable="ExtendedLife")
+// public Set<Life> getLifes() {
+// return lifes;
+// }
+//
+// public void setLifes(Set<Life> collection) {
+// lifes = collection;
+// }
+
+ @Column(table = "`Cat nbr1`")
+ @Index(name = "story1index")
+ public String getStoryPart1() {
+ return storyPart1;
+ }
+
+ @Column(table = "Cat2")
+ public String getStoryPart2() {
+ return storyPart2;
+ }
+
+
+ public void setStoryPart1(String string) {
+ storyPart1 = string;
+ }
+
+
+ public void setStoryPart2(String string) {
+ storyPart2 = string;
+ }
+
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Death.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Death.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Death.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.join;
-
-import java.io.Serializable;
-import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.SecondaryTable;
-import javax.persistence.PrimaryKeyJoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at SecondaryTable(
- name = "ExtendedDeath",
- pkJoinColumns = @PrimaryKeyJoinColumn(name = "DEATH_ID")
-)
-public class Death implements Serializable {
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- public Integer id;
- @Column(name = "death_date")
- public Date date;
- @Column(table = "ExtendedDeath")
- public String howDoesItHappen;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Death.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Death.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Death.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Death.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id$
+package org.hibernate.test.annotations.join;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.SecondaryTable;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SecondaryTable(
+ name = "ExtendedDeath",
+ pkJoinColumns = @PrimaryKeyJoinColumn(name = "DEATH_ID")
+)
+public class Death implements Serializable {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ public Integer id;
+ @Column(name = "death_date")
+ public Date date;
+ @Column(table = "ExtendedDeath")
+ public String howDoesItHappen;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Dog.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Dog.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Dog.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.join;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.PrimaryKeyJoinColumn;
-import javax.persistence.SecondaryTable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at SecondaryTable(
- name = "DogThoroughbred",
- pkJoinColumns = {@PrimaryKeyJoinColumn(name = "NAME", referencedColumnName = "name"),
- @PrimaryKeyJoinColumn(name = "OWNER_NAME", referencedColumnName = "ownerName")}
-)
-public class Dog {
- @Id
- public DogPk id;
- public int weight;
- @Column(table = "DogThoroughbred")
- public String thoroughbredName;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Dog ) ) return false;
-
- final Dog dog = (Dog) o;
-
- if ( !id.equals( dog.id ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return id.hashCode();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Dog.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Dog.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Dog.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Dog.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id$
+package org.hibernate.test.annotations.join;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.SecondaryTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SecondaryTable(
+ name = "DogThoroughbred",
+ pkJoinColumns = {@PrimaryKeyJoinColumn(name = "NAME", referencedColumnName = "name"),
+ @PrimaryKeyJoinColumn(name = "OWNER_NAME", referencedColumnName = "ownerName")}
+)
+public class Dog {
+ @Id
+ public DogPk id;
+ public int weight;
+ @Column(table = "DogThoroughbred")
+ public String thoroughbredName;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Dog ) ) return false;
+
+ final Dog dog = (Dog) o;
+
+ if ( !id.equals( dog.id ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return id.hashCode();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/DogPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/DogPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/DogPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.join;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class DogPk implements Serializable {
- public String name;
- public String ownerName;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof DogPk ) ) return false;
-
- final DogPk dogPk = (DogPk) o;
-
- if ( !name.equals( dogPk.name ) ) return false;
- if ( !ownerName.equals( dogPk.ownerName ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = name.hashCode();
- result = 29 * result + ownerName.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/DogPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/DogPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/DogPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/DogPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.join;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class DogPk implements Serializable {
+ public String name;
+ public String ownerName;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof DogPk ) ) return false;
+
+ final DogPk dogPk = (DogPk) o;
+
+ if ( !name.equals( dogPk.name ) ) return false;
+ if ( !ownerName.equals( dogPk.ownerName ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = name.hashCode();
+ result = 29 * result + ownerName.hashCode();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/JoinTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/JoinTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/JoinTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,190 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.join;
-
-import java.util.Date;
-
-import org.hibernate.Criteria;
-import org.hibernate.HibernateException;
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.criterion.Expression;
-import org.hibernate.mapping.Join;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JoinTest extends TestCase {
-
- public JoinTest(String x) {
- super( x );
- }
-
- public void testDefaultValue() throws Exception {
- Join join = (Join) getCfg().getClassMapping( Life.class.getName() ).getJoinClosureIterator().next();
- assertEquals( "ExtendedLife", join.getTable().getName() );
- org.hibernate.mapping.Column owner = new org.hibernate.mapping.Column();
- owner.setName( "LIFE_ID" );
- assertTrue( join.getTable().getPrimaryKey().containsColumn( owner ) );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Life life = new Life();
- life.duration = 15;
- life.fullDescription = "Long long description";
- s.persist( life );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.createQuery( "from " + Life.class.getName() );
- life = (Life) q.uniqueResult();
- assertEquals( "Long long description", life.fullDescription );
- tx.commit();
- s.close();
- }
-
- public void testCompositePK() throws Exception {
- Join join = (Join) getCfg().getClassMapping( Dog.class.getName() ).getJoinClosureIterator().next();
- assertEquals( "DogThoroughbred", join.getTable().getName() );
- org.hibernate.mapping.Column owner = new org.hibernate.mapping.Column();
- owner.setName( "OWNER_NAME" );
- assertTrue( join.getTable().getPrimaryKey().containsColumn( owner ) );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Dog dog = new Dog();
- DogPk id = new DogPk();
- id.name = "Thalie";
- id.ownerName = "Martine";
- dog.id = id;
- dog.weight = 30;
- dog.thoroughbredName = "Colley";
- s.persist( dog );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.createQuery( "from Dog" );
- dog = (Dog) q.uniqueResult();
- assertEquals( "Colley", dog.thoroughbredName );
- tx.commit();
- s.close();
- }
-
- public void testExplicitValue() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Death death = new Death();
- death.date = new Date();
- death.howDoesItHappen = "Well, haven't seen it";
- s.persist( death );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.createQuery( "from " + Death.class.getName() );
- death = (Death) q.uniqueResult();
- assertEquals( "Well, haven't seen it", death.howDoesItHappen );
- s.delete( death );
- tx.commit();
- s.close();
- }
-
- public void testManyToOne() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Life life = new Life();
- Cat cat = new Cat();
- cat.setName( "kitty" );
- life.duration = 15;
- life.fullDescription = "Long long description";
- life.owner = cat;
- s.persist( life );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Criteria crit = s.createCriteria( Life.class );
- crit.createCriteria( "owner" ).add( Expression.eq( "name", "kitty" ) );
- life = (Life) crit.uniqueResult();
- assertEquals( "Long long description", life.fullDescription );
- s.delete( life.owner );
- s.delete( life );
- tx.commit();
- s.close();
- }
-
- public void testUniqueConstaintOnSecondaryTable() throws Exception {
- Cat cat = new Cat();
- cat.setStoryPart2( "My long story" );
- Cat cat2 = new Cat();
- cat2.setStoryPart2( "My long story" );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- try {
- s.persist( cat );
- s.persist( cat2 );
- tx.commit();
- fail( "unique constraints violation on secondary table" );
- }
- catch (HibernateException e) {
- //success
- }
- finally {
- if ( tx != null ) tx.rollback();
- s.close();
- }
- }
-
- public void testFetchModeOnSecondaryTable() throws Exception {
- Cat cat = new Cat();
- cat.setStoryPart2( "My long story" );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
-
- s.persist( cat );
- s.flush();
- s.clear();
-
- s.get( Cat.class, cat.getId() );
- //Find a way to test it, I need to define the secondary table on a subclass
-
- tx.rollback();
- s.close();
- }
-
- public void testCustomSQL() throws Exception {
- Cat cat = new Cat();
- String storyPart2 = "My long story";
- cat.setStoryPart2( storyPart2 );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
-
- s.persist( cat );
- s.flush();
- s.clear();
-
- Cat c = (Cat) s.get( Cat.class, cat.getId() );
- assertEquals( storyPart2.toUpperCase(), c.getStoryPart2() );
-
- tx.rollback();
- s.close();
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- Life.class,
- Death.class,
- Cat.class,
- Dog.class
- };
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/JoinTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/JoinTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/JoinTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/JoinTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,190 @@
+//$Id$
+package org.hibernate.test.annotations.join;
+
+import java.util.Date;
+
+import org.hibernate.Criteria;
+import org.hibernate.HibernateException;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.criterion.Expression;
+import org.hibernate.mapping.Join;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JoinTest extends TestCase {
+
+ public JoinTest(String x) {
+ super( x );
+ }
+
+ public void testDefaultValue() throws Exception {
+ Join join = (Join) getCfg().getClassMapping( Life.class.getName() ).getJoinClosureIterator().next();
+ assertEquals( "ExtendedLife", join.getTable().getName() );
+ org.hibernate.mapping.Column owner = new org.hibernate.mapping.Column();
+ owner.setName( "LIFE_ID" );
+ assertTrue( join.getTable().getPrimaryKey().containsColumn( owner ) );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Life life = new Life();
+ life.duration = 15;
+ life.fullDescription = "Long long description";
+ s.persist( life );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.createQuery( "from " + Life.class.getName() );
+ life = (Life) q.uniqueResult();
+ assertEquals( "Long long description", life.fullDescription );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCompositePK() throws Exception {
+ Join join = (Join) getCfg().getClassMapping( Dog.class.getName() ).getJoinClosureIterator().next();
+ assertEquals( "DogThoroughbred", join.getTable().getName() );
+ org.hibernate.mapping.Column owner = new org.hibernate.mapping.Column();
+ owner.setName( "OWNER_NAME" );
+ assertTrue( join.getTable().getPrimaryKey().containsColumn( owner ) );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Dog dog = new Dog();
+ DogPk id = new DogPk();
+ id.name = "Thalie";
+ id.ownerName = "Martine";
+ dog.id = id;
+ dog.weight = 30;
+ dog.thoroughbredName = "Colley";
+ s.persist( dog );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.createQuery( "from Dog" );
+ dog = (Dog) q.uniqueResult();
+ assertEquals( "Colley", dog.thoroughbredName );
+ tx.commit();
+ s.close();
+ }
+
+ public void testExplicitValue() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Death death = new Death();
+ death.date = new Date();
+ death.howDoesItHappen = "Well, haven't seen it";
+ s.persist( death );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.createQuery( "from " + Death.class.getName() );
+ death = (Death) q.uniqueResult();
+ assertEquals( "Well, haven't seen it", death.howDoesItHappen );
+ s.delete( death );
+ tx.commit();
+ s.close();
+ }
+
+ public void testManyToOne() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Life life = new Life();
+ Cat cat = new Cat();
+ cat.setName( "kitty" );
+ life.duration = 15;
+ life.fullDescription = "Long long description";
+ life.owner = cat;
+ s.persist( life );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Criteria crit = s.createCriteria( Life.class );
+ crit.createCriteria( "owner" ).add( Expression.eq( "name", "kitty" ) );
+ life = (Life) crit.uniqueResult();
+ assertEquals( "Long long description", life.fullDescription );
+ s.delete( life.owner );
+ s.delete( life );
+ tx.commit();
+ s.close();
+ }
+
+ public void testUniqueConstaintOnSecondaryTable() throws Exception {
+ Cat cat = new Cat();
+ cat.setStoryPart2( "My long story" );
+ Cat cat2 = new Cat();
+ cat2.setStoryPart2( "My long story" );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ try {
+ s.persist( cat );
+ s.persist( cat2 );
+ tx.commit();
+ fail( "unique constraints violation on secondary table" );
+ }
+ catch (HibernateException e) {
+ //success
+ }
+ finally {
+ if ( tx != null ) tx.rollback();
+ s.close();
+ }
+ }
+
+ public void testFetchModeOnSecondaryTable() throws Exception {
+ Cat cat = new Cat();
+ cat.setStoryPart2( "My long story" );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+
+ s.persist( cat );
+ s.flush();
+ s.clear();
+
+ s.get( Cat.class, cat.getId() );
+ //Find a way to test it, I need to define the secondary table on a subclass
+
+ tx.rollback();
+ s.close();
+ }
+
+ public void testCustomSQL() throws Exception {
+ Cat cat = new Cat();
+ String storyPart2 = "My long story";
+ cat.setStoryPart2( storyPart2 );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+
+ s.persist( cat );
+ s.flush();
+ s.clear();
+
+ Cat c = (Cat) s.get( Cat.class, cat.getId() );
+ assertEquals( storyPart2.toUpperCase(), c.getStoryPart2() );
+
+ tx.rollback();
+ s.close();
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ Life.class,
+ Death.class,
+ Cat.class,
+ Dog.class
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Life.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Life.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Life.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.join;
-
-import java.io.Serializable;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.SecondaryTable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at SecondaryTable(name = "ExtendedLife")
-public class Life implements Serializable {
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- @Column(name = "LIFE_ID")
- public Integer id;
-
- public int duration;
- @Column(table = "ExtendedLife")
- public String fullDescription;
-
- @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
- @JoinColumn(name = "CAT_ID", table = "ExtendedLife")
- public Cat owner;
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Life.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Life.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Life.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/join/Life.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id$
+package org.hibernate.test.annotations.join;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.SecondaryTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SecondaryTable(name = "ExtendedLife")
+public class Life implements Serializable {
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ @Column(name = "LIFE_ID")
+ public Integer id;
+
+ public int duration;
+ @Column(table = "ExtendedLife")
+ public String fullDescription;
+
+ @ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+ @JoinColumn(name = "CAT_ID", table = "ExtendedLife")
+ public Cat owner;
+
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Loader.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Loader.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Loader.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<!--
-
- Used to demonstrate the declarative configuration
- of both hbm files and annotated classes
- See hibernate.cfg.xml and ConfigurationTest
-
--->
-
-<hibernate-mapping package="org.hibernate.test.annotations.loader">
-
- <sql-query name="loadByTeam">
- <load-collection alias="p" role="Team.players"/>
- select {p.*} from Player p where p.team_id = ?
- </sql-query>
-
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Loader.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Loader.hbm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Loader.hbm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Loader.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+ Used to demonstrate the declarative configuration
+ of both hbm files and annotated classes
+ See hibernate.cfg.xml and ConfigurationTest
+
+-->
+
+<hibernate-mapping package="org.hibernate.test.annotations.loader">
+
+ <sql-query name="loadByTeam">
+ <load-collection alias="p" role="Team.players"/>
+ select {p.*} from Player p where p.team_id = ?
+ </sql-query>
+
+</hibernate-mapping>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/LoaderTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/LoaderTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/LoaderTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,69 +0,0 @@
-//$Id: EntityTest.java 9838 2006-04-30 19:00:59Z epbernard $
-package org.hibernate.test.annotations.loader;
-
-import java.util.Set;
-import java.util.Iterator;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-
-/**
- * @author Emmanuel Bernard
- */
-public class LoaderTest extends TestCase {
-
-
- protected String[] getXmlFiles() {
- return new String[] {
- "org/hibernate/test/annotations/loader/Loader.hbm.xml"
- };
- }
-
- public void testBasic() throws Exception {
- Session s = openSession( );
- Transaction tx = s.beginTransaction();
- Team t = new Team();
- Player p = new Player();
- p.setName("me");
- t.getPlayers().add(p);
- p.setTeam(t);
-
-
- try {
- s.persist(p);
- s.persist(t);
- tx.commit();
- s.close();
-
- s= openSession( );
- tx = s.beginTransaction();
- Team t2 = (Team)s.load(Team.class,new Long(1));
- Set<Player> players = t2.getPlayers();
- Iterator<Player> iterator = players.iterator();
- assertEquals("me", iterator.next().getName());
- tx.commit();
-
- }
- catch (Exception e) {
- e.printStackTrace();
- if ( tx != null ) tx.rollback();
- }
- finally {
- s.close();
- }
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- Player.class,
- Team.class
- };
- }
-
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/LoaderTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/LoaderTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/LoaderTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/LoaderTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,69 @@
+//$Id: EntityTest.java 9838 2006-04-30 19:00:59Z epbernard $
+package org.hibernate.test.annotations.loader;
+
+import java.util.Set;
+import java.util.Iterator;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LoaderTest extends TestCase {
+
+
+ protected String[] getXmlFiles() {
+ return new String[] {
+ "org/hibernate/test/annotations/loader/Loader.hbm.xml"
+ };
+ }
+
+ public void testBasic() throws Exception {
+ Session s = openSession( );
+ Transaction tx = s.beginTransaction();
+ Team t = new Team();
+ Player p = new Player();
+ p.setName("me");
+ t.getPlayers().add(p);
+ p.setTeam(t);
+
+
+ try {
+ s.persist(p);
+ s.persist(t);
+ tx.commit();
+ s.close();
+
+ s= openSession( );
+ tx = s.beginTransaction();
+ Team t2 = (Team)s.load(Team.class,new Long(1));
+ Set<Player> players = t2.getPlayers();
+ Iterator<Player> iterator = players.iterator();
+ assertEquals("me", iterator.next().getName());
+ tx.commit();
+
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ if ( tx != null ) tx.rollback();
+ }
+ finally {
+ s.close();
+ }
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ Player.class,
+ Team.class
+ };
+ }
+
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Player.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Player.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Player.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,48 +0,0 @@
-package org.hibernate.test.annotations.loader;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-import org.hibernate.annotations.Fetch;
-import org.hibernate.annotations.FetchMode;
-
- at Entity
-public class Player {
-
- private Long id;
- private Team team;
- private String name;
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- @ManyToOne(targetEntity = Team.class)
- @Fetch(FetchMode.SELECT)
- @JoinColumn(name = "team_id")
- public Team getTeam() {
- return team;
- }
-
- public void setTeam(Team team) {
- this.team = team;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Player.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Player.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Player.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Player.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,48 @@
+package org.hibernate.test.annotations.loader;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.FetchMode;
+
+ at Entity
+public class Player {
+
+ private Long id;
+ private Team team;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @ManyToOne(targetEntity = Team.class)
+ @Fetch(FetchMode.SELECT)
+ @JoinColumn(name = "team_id")
+ public Team getTeam() {
+ return team;
+ }
+
+ public void setTeam(Team team) {
+ this.team = team;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Team.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Team.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Team.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-package org.hibernate.test.annotations.loader;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-import org.hibernate.annotations.Fetch;
-import org.hibernate.annotations.FetchMode;
-import org.hibernate.annotations.Loader;
-import org.hibernate.annotations.NamedNativeQueries;
-import org.hibernate.annotations.NamedNativeQuery;
-
-import javax.persistence.NamedQuery;
-
- at Entity
-public class Team {
- private Long id;
- private Set<Player> players = new HashSet<Player>();
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- @OneToMany(targetEntity = Player.class, mappedBy = "team", fetch = FetchType.EAGER)
- @Fetch(FetchMode.SELECT)
- @Loader(namedQuery = "loadByTeam")
- public Set<Player> getPlayers() {
- return players;
- }
-
- public void setPlayers(Set<Player> players) {
- this.players = players;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Team.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Team.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Team.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/Team.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+package org.hibernate.test.annotations.loader;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.Fetch;
+import org.hibernate.annotations.FetchMode;
+import org.hibernate.annotations.Loader;
+import org.hibernate.annotations.NamedNativeQueries;
+import org.hibernate.annotations.NamedNativeQuery;
+
+import javax.persistence.NamedQuery;
+
+ at Entity
+public class Team {
+ private Long id;
+ private Set<Player> players = new HashSet<Player>();
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @OneToMany(targetEntity = Player.class, mappedBy = "team", fetch = FetchType.EAGER)
+ @Fetch(FetchMode.SELECT)
+ @Loader(namedQuery = "loadByTeam")
+ public Set<Player> getPlayers() {
+ return players;
+ }
+
+ public void setPlayers(Set<Player> players) {
+ this.players = players;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/TestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/TestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/TestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,146 +0,0 @@
-package org.hibernate.test.annotations.loader;
-import java.io.InputStream;
-
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.dialect.Dialect;
-
-public abstract class TestCase extends junit.framework.TestCase {
-
- private static SessionFactory sessions;
- private static AnnotationConfiguration cfg;
- private static Dialect dialect;
- private static Class lastTestClass;
- private Session session;
-
- public TestCase() {
- super();
- }
-
- public TestCase(String x) {
- super( x );
- }
-
- protected void buildSessionFactory(Class[] classes, String[] packages, String[] xmlFiles) throws Exception {
-
- if ( getSessions() != null ) getSessions().close();
- try {
- setCfg( new AnnotationConfiguration() );
- configure( cfg );
- if ( recreateSchema() ) {
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- }
- for ( int i = 0; i < packages.length ; i++ ) {
- getCfg().addPackage( packages[i] );
- }
- for ( int i = 0; i < classes.length ; i++ ) {
- getCfg().addAnnotatedClass( classes[i] );
- }
- for ( int i = 0; i < xmlFiles.length ; i++ ) {
- InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFiles[i] );
- getCfg().addInputStream( is );
- }
- setDialect( Dialect.getDialect() );
- setSessions( getCfg().buildSessionFactory( /*new TestInterceptor()*/ ) );
- }
- catch (Exception e) {
- e.printStackTrace();
- throw e;
- }
- }
-
- protected void setUp() throws Exception {
- if ( getSessions() == null || lastTestClass != getClass() ) {
- buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
- lastTestClass = getClass();
- }
- }
-
- protected void runTest() throws Throwable {
- try {
- super.runTest();
- if ( session != null && session.isOpen() ) {
- if ( session.isConnected() ) session.connection().rollback();
- session.close();
- session = null;
- fail( "unclosed session" );
- }
- else {
- session = null;
- }
- }
- catch (Throwable e) {
- try {
- if ( session != null && session.isOpen() ) {
- if ( session.isConnected() ) session.connection().rollback();
- session.close();
- }
- }
- catch (Exception ignore) {
- }
- try {
- if ( sessions != null ) {
- sessions.close();
- sessions = null;
- }
- }
- catch (Exception ignore) {
- }
- throw e;
- }
- }
-
- public Session openSession() throws HibernateException {
- session = getSessions().openSession();
- return session;
- }
-
- protected abstract Class[] getMappings();
-
- protected String[] getAnnotatedPackages() {
- return new String[]{};
- }
-
- protected String[] getXmlFiles() {
- return new String[]{};
- }
-
- private void setSessions(SessionFactory sessions) {
- TestCase.sessions = sessions;
- }
-
- protected SessionFactory getSessions() {
- return sessions;
- }
-
- private void setDialect(Dialect dialect) {
- TestCase.dialect = dialect;
- }
-
- protected Dialect getDialect() {
- return dialect;
- }
-
- protected static void setCfg(AnnotationConfiguration cfg) {
- TestCase.cfg = cfg;
- }
-
- protected static AnnotationConfiguration getCfg() {
- return cfg;
- }
-
- protected void configure(Configuration cfg) {
- //cfg.setNamingStrategy( AlternativeNamingStrategy.INSTANCE );
- //cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
- //cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
- }
-
- protected boolean recreateSchema() {
- return true;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/TestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/TestCase.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/TestCase.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/loader/TestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,146 @@
+package org.hibernate.test.annotations.loader;
+import java.io.InputStream;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.Dialect;
+
+public abstract class TestCase extends junit.framework.TestCase {
+
+ private static SessionFactory sessions;
+ private static AnnotationConfiguration cfg;
+ private static Dialect dialect;
+ private static Class lastTestClass;
+ private Session session;
+
+ public TestCase() {
+ super();
+ }
+
+ public TestCase(String x) {
+ super( x );
+ }
+
+ protected void buildSessionFactory(Class[] classes, String[] packages, String[] xmlFiles) throws Exception {
+
+ if ( getSessions() != null ) getSessions().close();
+ try {
+ setCfg( new AnnotationConfiguration() );
+ configure( cfg );
+ if ( recreateSchema() ) {
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ }
+ for ( int i = 0; i < packages.length ; i++ ) {
+ getCfg().addPackage( packages[i] );
+ }
+ for ( int i = 0; i < classes.length ; i++ ) {
+ getCfg().addAnnotatedClass( classes[i] );
+ }
+ for ( int i = 0; i < xmlFiles.length ; i++ ) {
+ InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFiles[i] );
+ getCfg().addInputStream( is );
+ }
+ setDialect( Dialect.getDialect() );
+ setSessions( getCfg().buildSessionFactory( /*new TestInterceptor()*/ ) );
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ protected void setUp() throws Exception {
+ if ( getSessions() == null || lastTestClass != getClass() ) {
+ buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
+ lastTestClass = getClass();
+ }
+ }
+
+ protected void runTest() throws Throwable {
+ try {
+ super.runTest();
+ if ( session != null && session.isOpen() ) {
+ if ( session.isConnected() ) session.connection().rollback();
+ session.close();
+ session = null;
+ fail( "unclosed session" );
+ }
+ else {
+ session = null;
+ }
+ }
+ catch (Throwable e) {
+ try {
+ if ( session != null && session.isOpen() ) {
+ if ( session.isConnected() ) session.connection().rollback();
+ session.close();
+ }
+ }
+ catch (Exception ignore) {
+ }
+ try {
+ if ( sessions != null ) {
+ sessions.close();
+ sessions = null;
+ }
+ }
+ catch (Exception ignore) {
+ }
+ throw e;
+ }
+ }
+
+ public Session openSession() throws HibernateException {
+ session = getSessions().openSession();
+ return session;
+ }
+
+ protected abstract Class[] getMappings();
+
+ protected String[] getAnnotatedPackages() {
+ return new String[]{};
+ }
+
+ protected String[] getXmlFiles() {
+ return new String[]{};
+ }
+
+ private void setSessions(SessionFactory sessions) {
+ TestCase.sessions = sessions;
+ }
+
+ protected SessionFactory getSessions() {
+ return sessions;
+ }
+
+ private void setDialect(Dialect dialect) {
+ TestCase.dialect = dialect;
+ }
+
+ protected Dialect getDialect() {
+ return dialect;
+ }
+
+ protected static void setCfg(AnnotationConfiguration cfg) {
+ TestCase.cfg = cfg;
+ }
+
+ protected static AnnotationConfiguration getCfg() {
+ return cfg;
+ }
+
+ protected void configure(Configuration cfg) {
+ //cfg.setNamingStrategy( AlternativeNamingStrategy.INSTANCE );
+ //cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
+ //cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
+ }
+
+ protected boolean recreateSchema() {
+ return true;
+ }
+
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Book.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Book.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Book.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,79 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.lob;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "lob_book")
-public class Book {
- private Integer id;
- private String shortDescription;
- private String fullText;
- private Character[] code;
- private char[] code2;
- private Editor editor;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getShortDescription() {
- return shortDescription;
- }
-
- public void setShortDescription(String shortDescription) {
- this.shortDescription = shortDescription;
- }
-
- @Lob
- @Column(name = "fld_fulltext")
- public String getFullText() {
- return fullText;
- }
-
- public void setFullText(String fullText) {
- this.fullText = fullText;
- }
-
- @Lob
- @Column(name = "fld_code")
- public Character[] getCode() {
- return code;
- }
-
- public void setCode(Character[] code) {
- this.code = code;
- }
-
- @Lob
- public char[] getCode2() {
- return code2;
- }
-
- public void setCode2(char[] code2) {
- this.code2 = code2;
- }
-
- @Lob
- public Editor getEditor() {
- return editor;
- }
-
- public void setEditor(Editor editor) {
- this.editor = editor;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Book.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Book.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Book.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Book.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,79 @@
+//$Id$
+package org.hibernate.test.annotations.lob;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "lob_book")
+public class Book {
+ private Integer id;
+ private String shortDescription;
+ private String fullText;
+ private Character[] code;
+ private char[] code2;
+ private Editor editor;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getShortDescription() {
+ return shortDescription;
+ }
+
+ public void setShortDescription(String shortDescription) {
+ this.shortDescription = shortDescription;
+ }
+
+ @Lob
+ @Column(name = "fld_fulltext")
+ public String getFullText() {
+ return fullText;
+ }
+
+ public void setFullText(String fullText) {
+ this.fullText = fullText;
+ }
+
+ @Lob
+ @Column(name = "fld_code")
+ public Character[] getCode() {
+ return code;
+ }
+
+ public void setCode(Character[] code) {
+ this.code = code;
+ }
+
+ @Lob
+ public char[] getCode2() {
+ return code2;
+ }
+
+ public void setCode2(char[] code2) {
+ this.code2 = code2;
+ }
+
+ @Lob
+ public Editor getEditor() {
+ return editor;
+ }
+
+ public void setEditor(Editor editor) {
+ this.editor = editor;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/CompiledCode.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/CompiledCode.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/CompiledCode.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.lob;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-
-/**
- * Compiled code representation
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class CompiledCode {
- private Integer id;
- private Byte[] header;
- private byte[] fullCode;
- private byte[] metadata;
-
- public byte[] getMetadata() {
- return metadata;
- }
-
- public void setMetadata(byte[] metadata) {
- this.metadata = metadata;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Lob
- public Byte[] getHeader() {
- return header;
- }
-
- public void setHeader(Byte[] header) {
- this.header = header;
- }
-
- @Lob
- public byte[] getFullCode() {
- return fullCode;
- }
-
- public void setFullCode(byte[] fullCode) {
- this.fullCode = fullCode;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/CompiledCode.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/CompiledCode.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/CompiledCode.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/CompiledCode.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+//$Id$
+package org.hibernate.test.annotations.lob;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+/**
+ * Compiled code representation
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CompiledCode {
+ private Integer id;
+ private Byte[] header;
+ private byte[] fullCode;
+ private byte[] metadata;
+
+ public byte[] getMetadata() {
+ return metadata;
+ }
+
+ public void setMetadata(byte[] metadata) {
+ this.metadata = metadata;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Lob
+ public Byte[] getHeader() {
+ return header;
+ }
+
+ public void setHeader(Byte[] header) {
+ this.header = header;
+ }
+
+ @Lob
+ public byte[] getFullCode() {
+ return fullCode;
+ }
+
+ public void setFullCode(byte[] fullCode) {
+ this.fullCode = fullCode;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Editor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Editor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Editor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.lob;
-
-import java.io.Serializable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Editor implements Serializable {
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Editor.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Editor.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Editor.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/Editor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.test.annotations.lob;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Editor implements Serializable {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/LobTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/LobTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/LobTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,126 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.lob;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class LobTest extends TestCase {
- public void testSerializableToBlob() throws Exception {
- Book book = new Book();
- Editor editor = new Editor();
- editor.setName( "O'Reilly" );
- book.setEditor( editor );
- book.setCode2( new char[]{'r'} );
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( book );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- Book loadedBook = (Book) s.get( Book.class, book.getId() );
- assertNotNull( loadedBook.getEditor() );
- assertEquals( book.getEditor().getName(), loadedBook.getEditor().getName() );
- loadedBook.setEditor( null );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- loadedBook = (Book) s.get( Book.class, book.getId() );
- assertNull( loadedBook.getEditor() );
- tx.commit();
- s.close();
-
- }
-
- public void testClob() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Book b = new Book();
- b.setShortDescription( "Hibernate Bible" );
- b.setFullText( "Hibernate in Action aims to..." );
- b.setCode( new Character[]{'a', 'b', 'c'} );
- b.setCode2( new char[]{'a', 'b', 'c'} );
- s.persist( b );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Book b2 = (Book) s.get( Book.class, b.getId() );
- assertNotNull( b2 );
- assertEquals( b2.getFullText(), b.getFullText() );
- assertEquals( b2.getCode()[1].charValue(), b.getCode()[1].charValue() );
- assertEquals( b2.getCode2()[2], b.getCode2()[2] );
- tx.commit();
- s.close();
- }
-
- public void testBlob() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- CompiledCode cc = new CompiledCode();
- Byte[] header = new Byte[2];
- header[0] = new Byte( (byte) 3 );
- header[1] = new Byte( (byte) 0 );
- cc.setHeader( header );
- int codeSize = 5;
- byte[] full = new byte[codeSize];
- for ( int i = 0; i < codeSize ; i++ ) {
- full[i] = (byte) ( 1 + i );
- }
- cc.setFullCode( full );
- s.persist( cc );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- CompiledCode recompiled = (CompiledCode) s.get( CompiledCode.class, cc.getId() );
- assertEquals( recompiled.getHeader()[1], cc.getHeader()[1] );
- assertEquals( recompiled.getFullCode()[codeSize - 1], cc.getFullCode()[codeSize - 1] );
- tx.commit();
- s.close();
- }
-
- public void testBinary() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- CompiledCode cc = new CompiledCode();
- byte[] metadata = new byte[2];
- metadata[0] = (byte) 3;
- metadata[1] = (byte) 0;
- cc.setMetadata( metadata );
- s.persist( cc );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- CompiledCode recompiled = (CompiledCode) s.get( CompiledCode.class, cc.getId() );
- assertEquals( recompiled.getMetadata()[1], cc.getMetadata()[1] );
- tx.commit();
- s.close();
- }
-
- public LobTest(String x) {
- super( x );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Book.class,
- CompiledCode.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/LobTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/LobTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/LobTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/lob/LobTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,126 @@
+//$Id$
+package org.hibernate.test.annotations.lob;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LobTest extends TestCase {
+ public void testSerializableToBlob() throws Exception {
+ Book book = new Book();
+ Editor editor = new Editor();
+ editor.setName( "O'Reilly" );
+ book.setEditor( editor );
+ book.setCode2( new char[]{'r'} );
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( book );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ Book loadedBook = (Book) s.get( Book.class, book.getId() );
+ assertNotNull( loadedBook.getEditor() );
+ assertEquals( book.getEditor().getName(), loadedBook.getEditor().getName() );
+ loadedBook.setEditor( null );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ loadedBook = (Book) s.get( Book.class, book.getId() );
+ assertNull( loadedBook.getEditor() );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testClob() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Book b = new Book();
+ b.setShortDescription( "Hibernate Bible" );
+ b.setFullText( "Hibernate in Action aims to..." );
+ b.setCode( new Character[]{'a', 'b', 'c'} );
+ b.setCode2( new char[]{'a', 'b', 'c'} );
+ s.persist( b );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Book b2 = (Book) s.get( Book.class, b.getId() );
+ assertNotNull( b2 );
+ assertEquals( b2.getFullText(), b.getFullText() );
+ assertEquals( b2.getCode()[1].charValue(), b.getCode()[1].charValue() );
+ assertEquals( b2.getCode2()[2], b.getCode2()[2] );
+ tx.commit();
+ s.close();
+ }
+
+ public void testBlob() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ CompiledCode cc = new CompiledCode();
+ Byte[] header = new Byte[2];
+ header[0] = new Byte( (byte) 3 );
+ header[1] = new Byte( (byte) 0 );
+ cc.setHeader( header );
+ int codeSize = 5;
+ byte[] full = new byte[codeSize];
+ for ( int i = 0; i < codeSize ; i++ ) {
+ full[i] = (byte) ( 1 + i );
+ }
+ cc.setFullCode( full );
+ s.persist( cc );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ CompiledCode recompiled = (CompiledCode) s.get( CompiledCode.class, cc.getId() );
+ assertEquals( recompiled.getHeader()[1], cc.getHeader()[1] );
+ assertEquals( recompiled.getFullCode()[codeSize - 1], cc.getFullCode()[codeSize - 1] );
+ tx.commit();
+ s.close();
+ }
+
+ public void testBinary() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ CompiledCode cc = new CompiledCode();
+ byte[] metadata = new byte[2];
+ metadata[0] = (byte) 3;
+ metadata[1] = (byte) 0;
+ cc.setMetadata( metadata );
+ s.persist( cc );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ CompiledCode recompiled = (CompiledCode) s.get( CompiledCode.class, cc.getId() );
+ assertEquals( recompiled.getMetadata()[1], cc.getMetadata()[1] );
+ tx.commit();
+ s.close();
+ }
+
+ public LobTest(String x) {
+ super( x );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Book.class,
+ CompiledCode.class
+ };
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Building.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Building.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Building.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytomany;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Building {
- @Id @GeneratedValue private Long id;
-
- @ManyToOne @JoinColumn(name="company_id", referencedColumnName = "name")
- private BuildingCompany company;
-
- public BuildingCompany getCompany() {
- return company;
- }
-
- public void setCompany(BuildingCompany company) {
- this.company = company;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Building.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Building.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Building.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Building.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id: $
+package org.hibernate.test.annotations.manytomany;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Building {
+ @Id @GeneratedValue private Long id;
+
+ @ManyToOne @JoinColumn(name="company_id", referencedColumnName = "name")
+ private BuildingCompany company;
+
+ public BuildingCompany getCompany() {
+ return company;
+ }
+
+ public void setCompany(BuildingCompany company) {
+ this.company = company;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/BuildingCompany.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/BuildingCompany.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/BuildingCompany.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytomany;
-
-import java.util.Date;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class BuildingCompany extends Company {
- @Id @GeneratedValue private Long id;
- private Date foundedIn;
-
- public Date getFoundedIn() {
- return foundedIn;
- }
-
- public void setFoundedIn(Date foundedIn) {
- this.foundedIn = foundedIn;
- }
-
- public Long getId() {
- return id;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/BuildingCompany.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/BuildingCompany.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/BuildingCompany.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/BuildingCompany.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id: $
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BuildingCompany extends Company {
+ @Id @GeneratedValue private Long id;
+ private Date foundedIn;
+
+ public Date getFoundedIn() {
+ return foundedIn;
+ }
+
+ public void setFoundedIn(Date foundedIn) {
+ this.foundedIn = foundedIn;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Cat.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Cat.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Cat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,60 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.util.Set;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.ManyToMany;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "tbl_cat")
-public class Cat {
- private CatPk id;
- private int age;
- private Set<Woman> humanContacts;
-
- @ManyToMany
- public Set<Woman> getHumanContacts() {
- return humanContacts;
- }
-
- public void setHumanContacts(Set<Woman> humanContacts) {
- this.humanContacts = humanContacts;
- }
-
- @EmbeddedId()
- public CatPk getId() {
- return id;
- }
-
- public void setId(CatPk id) {
- this.id = id;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Cat ) ) return false;
-
- final Cat cat = (Cat) o;
-
- if ( !id.equals( cat.id ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return id.hashCode();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Cat.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Cat.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Cat.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Cat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,60 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Set;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.ManyToMany;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_cat")
+public class Cat {
+ private CatPk id;
+ private int age;
+ private Set<Woman> humanContacts;
+
+ @ManyToMany
+ public Set<Woman> getHumanContacts() {
+ return humanContacts;
+ }
+
+ public void setHumanContacts(Set<Woman> humanContacts) {
+ this.humanContacts = humanContacts;
+ }
+
+ @EmbeddedId()
+ public CatPk getId() {
+ return id;
+ }
+
+ public void setId(CatPk id) {
+ this.id = id;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Cat ) ) return false;
+
+ final Cat cat = (Cat) o;
+
+ if ( !id.equals( cat.id ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return id.hashCode();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/CatPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/CatPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/CatPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.io.Serializable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CatPk implements Serializable {
- private String name;
- private String thoroughbred;
-
- public String getThoroughbred() {
- return thoroughbred;
- }
-
- public void setThoroughbred(String thoroughbred) {
- this.thoroughbred = thoroughbred;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof CatPk ) ) return false;
-
- final CatPk catPk = (CatPk) o;
-
- if ( !name.equals( catPk.name ) ) return false;
- if ( !thoroughbred.equals( catPk.thoroughbred ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = name.hashCode();
- result = 29 * result + thoroughbred.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/CatPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/CatPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/CatPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/CatPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CatPk implements Serializable {
+ private String name;
+ private String thoroughbred;
+
+ public String getThoroughbred() {
+ return thoroughbred;
+ }
+
+ public void setThoroughbred(String thoroughbred) {
+ this.thoroughbred = thoroughbred;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof CatPk ) ) return false;
+
+ final CatPk catPk = (CatPk) o;
+
+ if ( !name.equals( catPk.name ) ) return false;
+ if ( !thoroughbred.equals( catPk.thoroughbred ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = name.hashCode();
+ result = 29 * result + thoroughbred.hashCode();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/City.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/City.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/City.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "tbl_city")
-public class City {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/City.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/City.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/City.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/City.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_city")
+public class City {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Company.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Company.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Company.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytomany;
-
-import java.io.Serializable;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.Column;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Company implements Serializable {
- @Column(unique = true) private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Company.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Company.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Company.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Company.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Company implements Serializable {
+ @Column(unique = true) private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employee.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employee.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.io.Serializable;
-import java.util.Collection;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-import javax.persistence.Column;
-
-import org.hibernate.annotations.Cascade;
-
-/**
- * Employee in an Employer-Employee relationship
- *
- * @author Emmanuel Bernard
- */
- at Entity()
-public class Employee implements Serializable {
- private Integer id;
- private Collection<Employer> employers;
- private String name;
-
- @Column(name="fld_name")
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer integer) {
- id = integer;
- }
-
- @ManyToMany(
- cascade = {CascadeType.PERSIST, CascadeType.MERGE},
- mappedBy = "employees"
- )
- @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
- org.hibernate.annotations.CascadeType.PERSIST})
- public Collection<Employer> getEmployers() {
- return employers;
- }
-
- public void setEmployers(Collection<Employer> employers) {
- this.employers = employers;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employee.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employee.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employee.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.Column;
+
+import org.hibernate.annotations.Cascade;
+
+/**
+ * Employee in an Employer-Employee relationship
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Employee implements Serializable {
+ private Integer id;
+ private Collection<Employer> employers;
+ private String name;
+
+ @Column(name="fld_name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer integer) {
+ id = integer;
+ }
+
+ @ManyToMany(
+ cascade = {CascadeType.PERSIST, CascadeType.MERGE},
+ mappedBy = "employees"
+ )
+ @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE,
+ org.hibernate.annotations.CascadeType.PERSIST})
+ public Collection<Employer> getEmployers() {
+ return employers;
+ }
+
+ public void setEmployers(Collection<Employer> employers) {
+ this.employers = employers;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.io.Serializable;
-import java.util.Collection;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.Table;
-
-import org.hibernate.annotations.Cascade;
-
-/**
- * Employer in a employer-Employee relationship
- *
- * @author Emmanuel Bernard
- */
- at Entity()
- at Table(name="`Employer`")
-public class Employer implements Serializable {
- private Integer id;
- private Collection employees;
-
- @ManyToMany(
- targetEntity = org.hibernate.test.annotations.manytomany.Employee.class,
- cascade = {CascadeType.PERSIST, CascadeType.MERGE}
- )
- @JoinTable(
- name = "EMPLOYER_EMPLOYEE",
- joinColumns = {@JoinColumn(name = "EMPER_ID")},
- inverseJoinColumns = {@JoinColumn(name = "EMPEE_ID")}
- )
- @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
- @OrderBy("name")
- public Collection getEmployees() {
- return employees;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setEmployees(Collection set) {
- employees = set;
- }
-
- public void setId(Integer integer) {
- id = integer;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Employer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Cascade;
+
+/**
+ * Employer in a employer-Employee relationship
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+ at Table(name="`Employer`")
+public class Employer implements Serializable {
+ private Integer id;
+ private Collection employees;
+
+ @ManyToMany(
+ targetEntity = org.hibernate.test.annotations.manytomany.Employee.class,
+ cascade = {CascadeType.PERSIST, CascadeType.MERGE}
+ )
+ @JoinTable(
+ name = "EMPLOYER_EMPLOYEE",
+ joinColumns = {@JoinColumn(name = "EMPER_ID")},
+ inverseJoinColumns = {@JoinColumn(name = "EMPEE_ID")}
+ )
+ @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
+ @OrderBy("name")
+ public Collection getEmployees() {
+ return employees;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setEmployees(Collection set) {
+ employees = set;
+ }
+
+ public void setId(Integer integer) {
+ id = integer;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Friend.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Friend.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Friend.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,59 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.io.Serializable;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-
-
-/**
- * Friend has other friends in a many to many way
- *
- * @author Emmanuel Bernard
- */
- at Entity()
-public class Friend implements Serializable {
- private Integer id;
- private String name;
- private Set<Friend> friends;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setId(Integer integer) {
- id = integer;
- }
-
- public void setName(String string) {
- name = string;
- }
-
- @ManyToMany(
- cascade = {CascadeType.PERSIST, CascadeType.MERGE}
- )
- @JoinTable(
- name = "FRIEND2FRIEND",
- joinColumns = {@JoinColumn(name = "FROM_FR", nullable = false)},
- inverseJoinColumns = {@JoinColumn(name = "TO_FR", nullable = false)}
- )
- public Set<Friend> getFriends() {
- return friends;
- }
-
- public void setFriends(Set<Friend> friend) {
- this.friends = friend;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Friend.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Friend.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Friend.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Friend.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,59 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+
+
+/**
+ * Friend has other friends in a many to many way
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Friend implements Serializable {
+ private Integer id;
+ private String name;
+ private Set<Friend> friends;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setId(Integer integer) {
+ id = integer;
+ }
+
+ public void setName(String string) {
+ name = string;
+ }
+
+ @ManyToMany(
+ cascade = {CascadeType.PERSIST, CascadeType.MERGE}
+ )
+ @JoinTable(
+ name = "FRIEND2FRIEND",
+ joinColumns = {@JoinColumn(name = "FROM_FR", nullable = false)},
+ inverseJoinColumns = {@JoinColumn(name = "TO_FR", nullable = false)}
+ )
+ public Set<Friend> getFriends() {
+ return friends;
+ }
+
+ public void setFriends(Set<Friend> friend) {
+ this.friends = friend;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Group.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Group.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Group.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.util.Collection;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import org.hibernate.annotations.Where;
-import org.hibernate.annotations.FilterDef;
-import org.hibernate.annotations.Filter;
-import org.hibernate.annotations.FilterJoinTable;
-import org.hibernate.annotations.WhereJoinTable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "tbl_group")
- at FilterDef(name="Groupfilter")
-public class Group {
- private Integer id;
- private Collection<Permission> permissions;
-
- @Id
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @ManyToMany(cascade = CascadeType.PERSIST)
- @JoinTable(name = "GROUPS_PERMISSIONS",
- uniqueConstraints = @UniqueConstraint(columnNames = {"group_id", "permission"}),
- joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"),
- inverseJoinColumns = @JoinColumn(name = "permission", referencedColumnName = "permission")
- )
- @OrderBy("expirationDate")
- @Where(clause = "1=1")
- @WhereJoinTable(clause = "2=2")
- @Filter(name="Groupfilter", condition = "3=3")
- @FilterJoinTable(name="Groupfilter", condition = "4=4")
- public Collection<Permission> getPermissions() {
- return permissions;
- }
-
- public void setPermissions(Collection<Permission> permissions) {
- this.permissions = permissions;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Group.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Group.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Group.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Group.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Collection;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.Where;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterJoinTable;
+import org.hibernate.annotations.WhereJoinTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_group")
+ at FilterDef(name="Groupfilter")
+public class Group {
+ private Integer id;
+ private Collection<Permission> permissions;
+
+ @Id
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @ManyToMany(cascade = CascadeType.PERSIST)
+ @JoinTable(name = "GROUPS_PERMISSIONS",
+ uniqueConstraints = @UniqueConstraint(columnNames = {"group_id", "permission"}),
+ joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"),
+ inverseJoinColumns = @JoinColumn(name = "permission", referencedColumnName = "permission")
+ )
+ @OrderBy("expirationDate")
+ @Where(clause = "1=1")
+ @WhereJoinTable(clause = "2=2")
+ @Filter(name="Groupfilter", condition = "3=3")
+ @FilterJoinTable(name="Groupfilter", condition = "4=4")
+ public Collection<Permission> getPermissions() {
+ return permissions;
+ }
+
+ public void setPermissions(Collection<Permission> permissions) {
+ this.permissions = permissions;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/GroupWithSet.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/GroupWithSet.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/GroupWithSet.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,60 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.util.Collection;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-import org.hibernate.annotations.Where;
-import org.hibernate.annotations.FilterDef;
-import org.hibernate.annotations.Filter;
-import org.hibernate.annotations.FilterJoinTable;
-import org.hibernate.annotations.WhereJoinTable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "tbl_group")
- at FilterDef(name="Groupfilter")
-public class GroupWithSet {
- private Integer id;
- private Set<Permission> permissions;
-
- @Id
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @ManyToMany(cascade = CascadeType.PERSIST)
- @JoinTable(name = "GROUPS_PERMISSIONS",
- uniqueConstraints = @UniqueConstraint(columnNames = {"group_id", "permission"}),
- joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"),
- inverseJoinColumns = @JoinColumn(name = "permission", referencedColumnName = "permission")
- )
- @OrderBy("expirationDate")
- @Where(clause = "1=1")
- @WhereJoinTable(clause = "2=2")
- @Filter(name="Groupfilter", condition = "3=3")
- @FilterJoinTable(name="Groupfilter", condition = "4=4")
- public Set<Permission> getPermissions() {
- return permissions;
- }
-
- public void setPermissions(Set<Permission> permissions) {
- this.permissions = permissions;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/GroupWithSet.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/GroupWithSet.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/GroupWithSet.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/GroupWithSet.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,60 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Collection;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+import org.hibernate.annotations.Where;
+import org.hibernate.annotations.FilterDef;
+import org.hibernate.annotations.Filter;
+import org.hibernate.annotations.FilterJoinTable;
+import org.hibernate.annotations.WhereJoinTable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_group")
+ at FilterDef(name="Groupfilter")
+public class GroupWithSet {
+ private Integer id;
+ private Set<Permission> permissions;
+
+ @Id
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @ManyToMany(cascade = CascadeType.PERSIST)
+ @JoinTable(name = "GROUPS_PERMISSIONS",
+ uniqueConstraints = @UniqueConstraint(columnNames = {"group_id", "permission"}),
+ joinColumns = @JoinColumn(name = "group_id", referencedColumnName = "id"),
+ inverseJoinColumns = @JoinColumn(name = "permission", referencedColumnName = "permission")
+ )
+ @OrderBy("expirationDate")
+ @Where(clause = "1=1")
+ @WhereJoinTable(clause = "2=2")
+ @Filter(name="Groupfilter", condition = "3=3")
+ @FilterJoinTable(name="Groupfilter", condition = "4=4")
+ public Set<Permission> getPermissions() {
+ return permissions;
+ }
+
+ public void setPermissions(Set<Permission> permissions) {
+ this.permissions = permissions;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Inspector.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Inspector.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Inspector.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,37 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.JOINED)
-class Inspector implements Serializable {
- @Id
- @GeneratedValue
- @Column(name = "id")
- private Long _id;
-
- private String name;
-
- public Long getId() {
- return _id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Inspector.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Inspector.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Inspector.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Inspector.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,37 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+class Inspector implements Serializable {
+ @Id
+ @GeneratedValue
+ @Column(name = "id")
+ private Long _id;
+
+ private String name;
+
+ public Long getId() {
+ return _id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.PrimaryKeyJoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at PrimaryKeyJoinColumn(name = "inspector_id")
-class InspectorPrefixes extends Inspector {
- @Column(name = "prefixes", nullable = false)
- private String prefixes;
- @ManyToMany()
- @JoinTable(name = "deserted_area",
- joinColumns = @JoinColumn(name = "inspector_name", referencedColumnName = "name"),
- inverseJoinColumns = @JoinColumn(name = "area_id", referencedColumnName = "id"))
- private List<Zone> desertedAreas = new ArrayList<Zone>();
-
- @ManyToMany()
- @JoinTable(name = "inspector_prefixes_areas",
- joinColumns = @JoinColumn(name = "inspector_id", referencedColumnName = "inspector_id"),
- inverseJoinColumns = @JoinColumn(name = "area_id", referencedColumnName = "id"))
- private List<Zone> areas = new ArrayList<Zone>();
-
- InspectorPrefixes() {
- }
-
- InspectorPrefixes(String prefixes) {
- this.prefixes = prefixes;
- }
-
- public String getPrefixes() {
- return this.prefixes;
- }
-
- public List<Zone> getAreas() {
- return areas;
- }
-
- public List<Zone> getDesertedAreas() {
- return desertedAreas;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/InspectorPrefixes.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at PrimaryKeyJoinColumn(name = "inspector_id")
+class InspectorPrefixes extends Inspector {
+ @Column(name = "prefixes", nullable = false)
+ private String prefixes;
+ @ManyToMany()
+ @JoinTable(name = "deserted_area",
+ joinColumns = @JoinColumn(name = "inspector_name", referencedColumnName = "name"),
+ inverseJoinColumns = @JoinColumn(name = "area_id", referencedColumnName = "id"))
+ private List<Zone> desertedAreas = new ArrayList<Zone>();
+
+ @ManyToMany()
+ @JoinTable(name = "inspector_prefixes_areas",
+ joinColumns = @JoinColumn(name = "inspector_id", referencedColumnName = "inspector_id"),
+ inverseJoinColumns = @JoinColumn(name = "area_id", referencedColumnName = "id"))
+ private List<Zone> areas = new ArrayList<Zone>();
+
+ InspectorPrefixes() {
+ }
+
+ InspectorPrefixes(String prefixes) {
+ this.prefixes = prefixes;
+ }
+
+ public String getPrefixes() {
+ return this.prefixes;
+ }
+
+ public List<Zone> getAreas() {
+ return areas;
+ }
+
+ public List<Zone> getDesertedAreas() {
+ return desertedAreas;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/KnownClient.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/KnownClient.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/KnownClient.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class KnownClient {
- private Integer id;
- private String name;
- private Set<Store> stores;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToMany(mappedBy = "customers")
- public Set<Store> getStores() {
- return stores;
- }
-
- public void setStores(Set<Store> stores) {
- this.stores = stores;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/KnownClient.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/KnownClient.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/KnownClient.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/KnownClient.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class KnownClient {
+ private Integer id;
+ private String name;
+ private Set<Store> stores;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToMany(mappedBy = "customers")
+ public Set<Store> getStores() {
+ return stores;
+ }
+
+ public void setStores(Set<Store> stores) {
+ this.stores = stores;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Man.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Man.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Man.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,63 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.io.Serializable;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-
-/**
- * Man knowing sevezral womens
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Man implements Serializable {
- private ManPk id;
- private String carName;
- private Set<Woman> womens;
-
- @ManyToMany(cascade = {CascadeType.ALL}, mappedBy = "mens")
- public Set<Woman> getWomens() {
- return womens;
- }
-
- public void setWomens(Set<Woman> womens) {
- this.womens = womens;
- }
-
- @Id
- public ManPk getId() {
- return id;
- }
-
- public void setId(ManPk id) {
- this.id = id;
- }
-
- public String getCarName() {
- return carName;
- }
-
- public void setCarName(String carName) {
- this.carName = carName;
- }
-
- public int hashCode() {
- //a NPE can occurs, but I don't expect hashcode to be used before pk is set
- return getId().hashCode();
- }
-
- public boolean equals(Object obj) {
- //a NPE can occurs, but I don't expect equals to be used before pk is set
- if ( obj != null && obj instanceof Man ) {
- return getId().equals( ( (Man) obj ).getId() );
- }
- else {
- return false;
- }
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Man.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Man.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Man.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Man.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,63 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+
+/**
+ * Man knowing sevezral womens
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Man implements Serializable {
+ private ManPk id;
+ private String carName;
+ private Set<Woman> womens;
+
+ @ManyToMany(cascade = {CascadeType.ALL}, mappedBy = "mens")
+ public Set<Woman> getWomens() {
+ return womens;
+ }
+
+ public void setWomens(Set<Woman> womens) {
+ this.womens = womens;
+ }
+
+ @Id
+ public ManPk getId() {
+ return id;
+ }
+
+ public void setId(ManPk id) {
+ this.id = id;
+ }
+
+ public String getCarName() {
+ return carName;
+ }
+
+ public void setCarName(String carName) {
+ this.carName = carName;
+ }
+
+ public int hashCode() {
+ //a NPE can occurs, but I don't expect hashcode to be used before pk is set
+ return getId().hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ //a NPE can occurs, but I don't expect equals to be used before pk is set
+ if ( obj != null && obj instanceof Man ) {
+ return getId().equals( ( (Man) obj ).getId() );
+ }
+ else {
+ return false;
+ }
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class ManPk implements Serializable {
- private String firstName;
- private String lastName;
- private boolean isElder;
-
- public boolean isElder() {
- return isElder;
- }
-
- public void setElder(boolean elder) {
- isElder = elder;
- }
-
- public int hashCode() {
- //this implem sucks
- return getFirstName().hashCode() + getLastName().hashCode() + ( isElder() ? 0 : 1 );
- }
-
- public boolean equals(Object obj) {
- //firstName and lastName are expected to be set in this implem
- if ( obj != null && obj instanceof ManPk ) {
- ManPk other = (ManPk) obj;
- return getFirstName().equals( other.getFirstName() )
- && getLastName().equals( other.getLastName() )
- && isElder() == other.isElder();
- }
- else {
- return false;
- }
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public String getLastName() {
- return lastName;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class ManPk implements Serializable {
+ private String firstName;
+ private String lastName;
+ private boolean isElder;
+
+ public boolean isElder() {
+ return isElder;
+ }
+
+ public void setElder(boolean elder) {
+ isElder = elder;
+ }
+
+ public int hashCode() {
+ //this implem sucks
+ return getFirstName().hashCode() + getLastName().hashCode() + ( isElder() ? 0 : 1 );
+ }
+
+ public boolean equals(Object obj) {
+ //firstName and lastName are expected to be set in this implem
+ if ( obj != null && obj instanceof ManPk ) {
+ ManPk other = (ManPk) obj;
+ return getFirstName().equals( other.getFirstName() )
+ && getLastName().equals( other.getLastName() )
+ && isElder() == other.isElder();
+ }
+ else {
+ return false;
+ }
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,597 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.hibernate.Hibernate;
-import org.hibernate.JDBCException;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * Many to many tests
- *
- * @author Emmanuel Bernard
- */
-public class ManyToManyTest extends TestCase {
-
- public ManyToManyTest(String x) {
- super( x );
- }
-
- public void testDefault() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Store fnac = new Store();
- fnac.setName( "Fnac" );
- KnownClient emmanuel = new KnownClient();
- emmanuel.setName( "Emmanuel" );
- emmanuel.setStores( new HashSet<Store>() );
- fnac.setCustomers( new HashSet<KnownClient>() );
- fnac.getCustomers().add( emmanuel );
- emmanuel.getStores().add( fnac );
- fnac.setImplantedIn( new HashSet<City>() );
- City paris = new City();
- fnac.getImplantedIn().add( paris );
- paris.setName( "Paris" );
- s.persist( fnac );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Store store;
- KnownClient knownClient;
- City city;
- store = (Store) s.get( Store.class, fnac.getId() );
- assertNotNull( store );
- assertNotNull( store.getCustomers() );
- assertEquals( 1, store.getCustomers().size() );
- knownClient = (KnownClient) store.getCustomers().iterator().next();
- assertEquals( emmanuel.getName(), knownClient.getName() );
- assertNotNull( store.getImplantedIn() );
- assertEquals( 1, store.getImplantedIn().size() );
- city = (City) store.getImplantedIn().iterator().next();
- assertEquals( paris.getName(), city.getName() );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- knownClient = (KnownClient) s.get( KnownClient.class, emmanuel.getId() );
- assertNotNull( knownClient );
- assertNotNull( knownClient.getStores() );
- assertEquals( 1, knownClient.getStores().size() );
- store = (Store) knownClient.getStores().iterator().next();
- assertEquals( fnac.getName(), store.getName() );
- tx.commit();
- s.close();
- }
-
- public void testDefaultCompositePk() throws Exception {
- Session s;
- Transaction tx;
-
- s = openSession();
- tx = s.beginTransaction();
- CatPk catPk = new CatPk();
- catPk.setName( "Minou" );
- catPk.setThoroughbred( "Persan" );
- Cat cat = new Cat();
- cat.setId( catPk );
- cat.setAge( 32 );
- Woman woman = new Woman();
- WomanPk womanPk = new WomanPk();
- womanPk.setFirstName( "Emma" );
- womanPk.setLastName( "Peel" );
- woman.setId( womanPk );
- woman.setCats( new HashSet<Cat>() );
- woman.getCats().add( cat );
- cat.setHumanContacts( new HashSet<Woman>() );
- cat.getHumanContacts().add( woman );
- s.persist( woman );
- s.persist( cat );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Cat sameCat = (Cat) s.get( Cat.class, cat.getId() );
- assertNotNull( sameCat );
- assertNotNull( sameCat.getHumanContacts() );
- assertEquals( 1, sameCat.getHumanContacts().size() );
- Woman sameWoman = sameCat.getHumanContacts().iterator().next();
- assertEquals( sameWoman.getId().getLastName(), woman.getId().getLastName() );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- sameWoman = (Woman) s.get( Woman.class, woman.getId() );
- assertNotNull( sameWoman );
- assertNotNull( sameWoman.getCats() );
- assertEquals( 1, sameWoman.getCats().size() );
- sameCat = sameWoman.getCats().iterator().next();
- assertEquals( cat.getAge(), sameCat.getAge() );
- tx.commit();
- s.close();
- }
-
- public void testMappedBy() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Store fnac = new Store();
- fnac.setName( "Fnac" );
- Supplier emi = new Supplier();
- emi.setName( "Emmanuel" );
- emi.setSuppStores( new HashSet<Store>() );
- fnac.setSuppliers( new HashSet<Supplier>() );
- fnac.getSuppliers().add( emi );
- emi.getSuppStores().add( fnac );
- s.persist( fnac );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Store store;
- Supplier supplier;
- store = (Store) s.get( Store.class, fnac.getId() );
- assertNotNull( store );
- assertNotNull( store.getSuppliers() );
- assertEquals( 1, store.getSuppliers().size() );
- supplier = (Supplier) store.getSuppliers().iterator().next();
- assertEquals( emi.getName(), supplier.getName() );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- supplier = (Supplier) s.get( Supplier.class, emi.getId() );
- assertNotNull( supplier );
- assertNotNull( supplier.getSuppStores() );
- assertEquals( 1, supplier.getSuppStores().size() );
- store = (Store) supplier.getSuppStores().iterator().next();
- assertEquals( fnac.getName(), store.getName() );
- tx.commit();
- s.close();
- }
-
- public void testBasic() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Employer er = new Employer();
- Employee ee = new Employee();
- s.persist( ee );
- Set erColl = new HashSet();
- Collection eeColl = new ArrayList();
- erColl.add( ee );
- eeColl.add( er );
- er.setEmployees( erColl );
- ee.setEmployers( eeColl );
- //s.persist(ee);
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- er = (Employer) s.load( Employer.class, er.getId() );
- assertNotNull( er );
- assertNotNull( er.getEmployees() );
- assertEquals( 1, er.getEmployees().size() );
- Employee eeFromDb = (Employee) er.getEmployees().iterator().next();
- assertEquals( ee.getId(), eeFromDb.getId() );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- ee = (Employee) s.get( Employee.class, ee.getId() );
- assertNotNull( ee );
- assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
- tx.commit();
- assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- ee = (Employee) s.get( Employee.class, ee.getId() );
- assertNotNull( ee );
- er = ee.getEmployers().iterator().next();
- assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
- s.delete( er );
- s.delete( ee );
- tx.commit();
- s.close();
- }
-
- public void testOrderBy() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Employer er = new Employer();
- Employee ee = new Employee();
- ee.setName( "Emmanuel" );
- Employee ee2 = new Employee();
- ee2.setName( "Alice" );
- s.persist( ee );
- s.persist( ee2 );
- Set erColl = new HashSet();
- Collection eeColl = new ArrayList();
- Collection eeColl2 = new ArrayList();
- erColl.add( ee );
- erColl.add( ee2 );
- eeColl.add( er );
- eeColl2.add( er );
- er.setEmployees( erColl );
- ee.setEmployers( eeColl );
- ee2.setEmployers( eeColl2 );
- //s.persist(ee);
-
- s.flush();
- s.clear();
-
- er = (Employer) s.get( Employer.class, er.getId() );
- assertNotNull( er );
- assertNotNull( er.getEmployees() );
- assertEquals( 2, er.getEmployees().size() );
- Employee eeFromDb = (Employee) er.getEmployees().iterator().next();
- assertEquals( ee2.getName(), eeFromDb.getName() );
- tx.rollback();
- s.close();
-
- }
-
- public void testRemoveInBetween() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Employer er = new Employer();
- Employee ee = new Employee();
- Employee ee2 = new Employee();
- s.persist( ee );
- s.persist( ee2 );
- Set erColl = new HashSet();
- Collection eeColl = new ArrayList();
- erColl.add( ee );
- erColl.add( ee2 );
- eeColl.add( er );
- er.setEmployees( erColl );
- ee.setEmployers( eeColl );
- //s.persist(ee);
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- er = (Employer) s.load( Employer.class, er.getId() );
- assertNotNull( er );
- assertNotNull( er.getEmployees() );
- assertEquals( 2, er.getEmployees().size() );
- Iterator iterator = er.getEmployees().iterator();
- Employee eeFromDb = (Employee) iterator.next();
- if ( eeFromDb.getId().equals( ee.getId() ) ) {
- eeFromDb = (Employee) iterator.next();
- }
- assertEquals( ee2.getId(), eeFromDb.getId() );
- er.getEmployees().remove( eeFromDb );
- eeFromDb.getEmployers().remove( er );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- ee = (Employee) s.get( Employee.class, ee.getId() );
- assertNotNull( ee );
- assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
- tx.commit();
- assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- ee = (Employee) s.get( Employee.class, ee.getId() );
- assertNotNull( ee );
- er = ee.getEmployers().iterator().next();
- assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
- assertEquals( 1, er.getEmployees().size() );
- s.delete( er );
- s.delete( ee );
- tx.commit();
- s.close();
- }
-
- public void testSelf() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Friend f = new Friend();
- Friend sndF = new Friend();
- f.setName( "Starsky" );
- sndF.setName( "Hutch" );
- Set frnds = new HashSet();
- frnds.add( sndF );
- f.setFriends( frnds );
- //Starsky is a friend of Hutch but hutch is not
- s.persist( f );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- f = (Friend) s.load( Friend.class, f.getId() );
- assertNotNull( f );
- assertNotNull( f.getFriends() );
- assertEquals( 1, f.getFriends().size() );
- Friend fromDb2ndFrnd = (Friend) f.getFriends().iterator().next();
- assertEquals( fromDb2ndFrnd.getId(), sndF.getId() );
- assertEquals( 0, fromDb2ndFrnd.getFriends().size() );
- tx.commit();
- s.close();
- }
-
- public void testCompositePk() throws Exception {
- Session s;
- Transaction tx;
-
- ManPk m1pk = new ManPk();
- m1pk.setElder( true );
- m1pk.setFirstName( "Lucky" );
- m1pk.setLastName( "Luke" );
- ManPk m2pk = new ManPk();
- m2pk.setElder( false );
- m2pk.setFirstName( "Joe" );
- m2pk.setLastName( "Dalton" );
-
- Man m1 = new Man();
- m1.setId( m1pk );
- m1.setCarName( "Jolly Jumper" );
- Man m2 = new Man();
- m2.setId( m2pk );
-
- WomanPk w1pk = new WomanPk();
- w1pk.setFirstName( "Ma" );
- w1pk.setLastName( "Dalton" );
- WomanPk w2pk = new WomanPk();
- w2pk.setFirstName( "Carla" );
- w2pk.setLastName( "Bruni" );
-
- Woman w1 = new Woman();
- w1.setId( w1pk );
- Woman w2 = new Woman();
- w2.setId( w2pk );
-
- Set<Woman> womens = new HashSet<Woman>();
- womens.add( w1 );
- m1.setWomens( womens );
- Set<Woman> womens2 = new HashSet<Woman>();
- womens2.add( w1 );
- womens2.add( w2 );
- m2.setWomens( womens2 );
-
- Set<Man> mens = new HashSet<Man>();
- mens.add( m1 );
- mens.add( m2 );
- w1.setMens( mens );
- Set<Man> mens2 = new HashSet<Man>();
- mens2.add( m2 );
- w2.setMens( mens2 );
-
- s = openSession();
- tx = s.beginTransaction();
- s.persist( m1 );
- s.persist( m2 );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- m1 = (Man) s.load( Man.class, m1pk );
- assertFalse( m1.getWomens().isEmpty() );
- assertEquals( 1, m1.getWomens().size() );
- w1 = (Woman) s.load( Woman.class, w1pk );
- assertFalse( w1.getMens().isEmpty() );
- assertEquals( 2, w1.getMens().size() );
-
- tx.commit();
- s.close();
- }
-
- public void testAssociationTableUniqueConstraints() throws Exception {
- Session s = openSession();
- Permission readAccess = new Permission();
- readAccess.setPermission( "read" );
- readAccess.setExpirationDate( new Date() );
- Collection<Permission> coll = new ArrayList<Permission>( 2 );
- coll.add( readAccess );
- coll.add( readAccess );
- Group group = new Group();
- group.setId( new Integer( 1 ) );
- group.setPermissions( coll );
- s.getTransaction().begin();
- try {
- s.persist( group );
- s.getTransaction().commit();
- fail( "Unique constraints not applied on association table" );
- }
- catch (JDBCException e) {
- //success
- s.getTransaction().rollback();
- }
- finally {
- s.close();
- }
- }
-
- public void testAssociationTableAndOrderBy() throws Exception {
- Session s = openSession();
- s.enableFilter( "Groupfilter" );
- Permission readAccess = new Permission();
- readAccess.setPermission( "read" );
- readAccess.setExpirationDate( new Date() );
- Permission writeAccess = new Permission();
- writeAccess.setPermission( "write" );
- writeAccess.setExpirationDate( new Date( new Date().getTime() - 10*60*1000 ) );
- Collection<Permission> coll = new ArrayList<Permission>( 2 );
- coll.add( readAccess );
- coll.add( writeAccess );
- Group group = new Group();
- group.setId( new Integer( 1 ) );
- group.setPermissions( coll );
- s.getTransaction().begin();
- s.persist( group );
- s.flush();
- s.clear();
- group = (Group) s.get( Group.class, group.getId() );
- s.createQuery( "select g from Group g join fetch g.permissions").list();
- assertEquals( "write", group.getPermissions().iterator().next().getPermission() );
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testAssociationTableAndOrderByWithSet() throws Exception {
- Session s = openSession();
- s.enableFilter( "Groupfilter" );
-
- Permission readAccess = new Permission();
- readAccess.setPermission( "read" );
- readAccess.setExpirationDate( new Date() );
-
- Permission writeAccess = new Permission();
- writeAccess.setPermission( "write" );
- writeAccess.setExpirationDate( new Date( new Date().getTime() - 10*60*1000 ) );
-
- Permission executeAccess = new Permission();
- executeAccess.setPermission( "execute" );
- executeAccess.setExpirationDate( new Date( new Date().getTime() - 5*60*1000 ) );
-
- Set<Permission> coll = new HashSet<Permission>( 3 );
- coll.add( readAccess );
- coll.add( writeAccess );
- coll.add( executeAccess );
-
- GroupWithSet group = new GroupWithSet();
- group.setId( new Integer( 1 ) );
- group.setPermissions( coll );
- s.getTransaction().begin();
- s.persist( group );
- s.flush();
- s.clear();
-
- group = (GroupWithSet) s.get( GroupWithSet.class, group.getId() );
- s.createQuery( "select g from Group g join fetch g.permissions").list();
- Iterator<Permission> permIter = group.getPermissions().iterator();
- assertEquals( "write", permIter.next().getPermission() );
- assertEquals( "execute", permIter.next().getPermission() );
- assertEquals( "read", permIter.next().getPermission() );
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testJoinedSubclassManyToMany() throws Exception {
- Session s = openSession();
- Zone a = new Zone();
- InspectorPrefixes ip = new InspectorPrefixes( "dgi" );
- Transaction tx = s.beginTransaction();
- s.save( a );
- s.save( ip );
- ip.getAreas().add( a );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- ip = (InspectorPrefixes) s.get( InspectorPrefixes.class, ip.getId() );
- assertNotNull( ip );
- assertEquals( 1, ip.getAreas().size() );
- assertEquals( a.getId(), ip.getAreas().get( 0 ).getId() );
- s.delete( ip );
- s.delete( ip.getAreas().get( 0 ) );
- tx.commit();
- s.close();
- }
-
- public void testJoinedSubclassManyToManyWithNonPkReference() throws Exception {
- Session s = openSession();
- Zone a = new Zone();
- InspectorPrefixes ip = new InspectorPrefixes( "dgi" );
- ip.setName( "Inspector" );
- Transaction tx = s.beginTransaction();
- s.save( a );
- s.save( ip );
- ip.getDesertedAreas().add( a );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- ip = (InspectorPrefixes) s.get( InspectorPrefixes.class, ip.getId() );
- assertNotNull( ip );
- assertEquals( 1, ip.getDesertedAreas().size() );
- assertEquals( a.getId(), ip.getDesertedAreas().get( 0 ).getId() );
- s.delete( ip );
- s.delete( ip.getDesertedAreas().get( 0 ) );
- tx.commit();
- s.close();
- }
-
- public void testReferencedColumnNameToSuperclass() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- BuildingCompany comp = new BuildingCompany();
- comp.setFoundedIn( new Date() );
- comp.setName( "Builder century corp.");
- s.persist( comp );
- Building building = new Building();
- building.setCompany( comp );
- s.persist( building );
- s.flush();
- s.clear();
- building = (Building) s.get( Building.class, building.getId() );
- assertEquals( comp.getName(), building.getCompany().getName() );
- tx.rollback();
- s.close();
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- Friend.class,
- Employer.class,
- Employee.class,
- Man.class,
- Woman.class,
- Store.class,
- KnownClient.class,
- Supplier.class,
- City.class,
- Cat.class,
- Group.class,
- GroupWithSet.class,
- Permission.class,
- Zone.class,
- Inspector.class,
- InspectorPrefixes.class,
- BuildingCompany.class,
- Building.class
-
- };
- }
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/ManyToManyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,597 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+
+import org.hibernate.Hibernate;
+import org.hibernate.JDBCException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * Many to many tests
+ *
+ * @author Emmanuel Bernard
+ */
+public class ManyToManyTest extends TestCase {
+
+ public ManyToManyTest(String x) {
+ super( x );
+ }
+
+ public void testDefault() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Store fnac = new Store();
+ fnac.setName( "Fnac" );
+ KnownClient emmanuel = new KnownClient();
+ emmanuel.setName( "Emmanuel" );
+ emmanuel.setStores( new HashSet<Store>() );
+ fnac.setCustomers( new HashSet<KnownClient>() );
+ fnac.getCustomers().add( emmanuel );
+ emmanuel.getStores().add( fnac );
+ fnac.setImplantedIn( new HashSet<City>() );
+ City paris = new City();
+ fnac.getImplantedIn().add( paris );
+ paris.setName( "Paris" );
+ s.persist( fnac );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Store store;
+ KnownClient knownClient;
+ City city;
+ store = (Store) s.get( Store.class, fnac.getId() );
+ assertNotNull( store );
+ assertNotNull( store.getCustomers() );
+ assertEquals( 1, store.getCustomers().size() );
+ knownClient = (KnownClient) store.getCustomers().iterator().next();
+ assertEquals( emmanuel.getName(), knownClient.getName() );
+ assertNotNull( store.getImplantedIn() );
+ assertEquals( 1, store.getImplantedIn().size() );
+ city = (City) store.getImplantedIn().iterator().next();
+ assertEquals( paris.getName(), city.getName() );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ knownClient = (KnownClient) s.get( KnownClient.class, emmanuel.getId() );
+ assertNotNull( knownClient );
+ assertNotNull( knownClient.getStores() );
+ assertEquals( 1, knownClient.getStores().size() );
+ store = (Store) knownClient.getStores().iterator().next();
+ assertEquals( fnac.getName(), store.getName() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testDefaultCompositePk() throws Exception {
+ Session s;
+ Transaction tx;
+
+ s = openSession();
+ tx = s.beginTransaction();
+ CatPk catPk = new CatPk();
+ catPk.setName( "Minou" );
+ catPk.setThoroughbred( "Persan" );
+ Cat cat = new Cat();
+ cat.setId( catPk );
+ cat.setAge( 32 );
+ Woman woman = new Woman();
+ WomanPk womanPk = new WomanPk();
+ womanPk.setFirstName( "Emma" );
+ womanPk.setLastName( "Peel" );
+ woman.setId( womanPk );
+ woman.setCats( new HashSet<Cat>() );
+ woman.getCats().add( cat );
+ cat.setHumanContacts( new HashSet<Woman>() );
+ cat.getHumanContacts().add( woman );
+ s.persist( woman );
+ s.persist( cat );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Cat sameCat = (Cat) s.get( Cat.class, cat.getId() );
+ assertNotNull( sameCat );
+ assertNotNull( sameCat.getHumanContacts() );
+ assertEquals( 1, sameCat.getHumanContacts().size() );
+ Woman sameWoman = sameCat.getHumanContacts().iterator().next();
+ assertEquals( sameWoman.getId().getLastName(), woman.getId().getLastName() );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ sameWoman = (Woman) s.get( Woman.class, woman.getId() );
+ assertNotNull( sameWoman );
+ assertNotNull( sameWoman.getCats() );
+ assertEquals( 1, sameWoman.getCats().size() );
+ sameCat = sameWoman.getCats().iterator().next();
+ assertEquals( cat.getAge(), sameCat.getAge() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testMappedBy() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Store fnac = new Store();
+ fnac.setName( "Fnac" );
+ Supplier emi = new Supplier();
+ emi.setName( "Emmanuel" );
+ emi.setSuppStores( new HashSet<Store>() );
+ fnac.setSuppliers( new HashSet<Supplier>() );
+ fnac.getSuppliers().add( emi );
+ emi.getSuppStores().add( fnac );
+ s.persist( fnac );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Store store;
+ Supplier supplier;
+ store = (Store) s.get( Store.class, fnac.getId() );
+ assertNotNull( store );
+ assertNotNull( store.getSuppliers() );
+ assertEquals( 1, store.getSuppliers().size() );
+ supplier = (Supplier) store.getSuppliers().iterator().next();
+ assertEquals( emi.getName(), supplier.getName() );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ supplier = (Supplier) s.get( Supplier.class, emi.getId() );
+ assertNotNull( supplier );
+ assertNotNull( supplier.getSuppStores() );
+ assertEquals( 1, supplier.getSuppStores().size() );
+ store = (Store) supplier.getSuppStores().iterator().next();
+ assertEquals( fnac.getName(), store.getName() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testBasic() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Employer er = new Employer();
+ Employee ee = new Employee();
+ s.persist( ee );
+ Set erColl = new HashSet();
+ Collection eeColl = new ArrayList();
+ erColl.add( ee );
+ eeColl.add( er );
+ er.setEmployees( erColl );
+ ee.setEmployers( eeColl );
+ //s.persist(ee);
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ er = (Employer) s.load( Employer.class, er.getId() );
+ assertNotNull( er );
+ assertNotNull( er.getEmployees() );
+ assertEquals( 1, er.getEmployees().size() );
+ Employee eeFromDb = (Employee) er.getEmployees().iterator().next();
+ assertEquals( ee.getId(), eeFromDb.getId() );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ ee = (Employee) s.get( Employee.class, ee.getId() );
+ assertNotNull( ee );
+ assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
+ tx.commit();
+ assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ ee = (Employee) s.get( Employee.class, ee.getId() );
+ assertNotNull( ee );
+ er = ee.getEmployers().iterator().next();
+ assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
+ s.delete( er );
+ s.delete( ee );
+ tx.commit();
+ s.close();
+ }
+
+ public void testOrderBy() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Employer er = new Employer();
+ Employee ee = new Employee();
+ ee.setName( "Emmanuel" );
+ Employee ee2 = new Employee();
+ ee2.setName( "Alice" );
+ s.persist( ee );
+ s.persist( ee2 );
+ Set erColl = new HashSet();
+ Collection eeColl = new ArrayList();
+ Collection eeColl2 = new ArrayList();
+ erColl.add( ee );
+ erColl.add( ee2 );
+ eeColl.add( er );
+ eeColl2.add( er );
+ er.setEmployees( erColl );
+ ee.setEmployers( eeColl );
+ ee2.setEmployers( eeColl2 );
+ //s.persist(ee);
+
+ s.flush();
+ s.clear();
+
+ er = (Employer) s.get( Employer.class, er.getId() );
+ assertNotNull( er );
+ assertNotNull( er.getEmployees() );
+ assertEquals( 2, er.getEmployees().size() );
+ Employee eeFromDb = (Employee) er.getEmployees().iterator().next();
+ assertEquals( ee2.getName(), eeFromDb.getName() );
+ tx.rollback();
+ s.close();
+
+ }
+
+ public void testRemoveInBetween() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Employer er = new Employer();
+ Employee ee = new Employee();
+ Employee ee2 = new Employee();
+ s.persist( ee );
+ s.persist( ee2 );
+ Set erColl = new HashSet();
+ Collection eeColl = new ArrayList();
+ erColl.add( ee );
+ erColl.add( ee2 );
+ eeColl.add( er );
+ er.setEmployees( erColl );
+ ee.setEmployers( eeColl );
+ //s.persist(ee);
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ er = (Employer) s.load( Employer.class, er.getId() );
+ assertNotNull( er );
+ assertNotNull( er.getEmployees() );
+ assertEquals( 2, er.getEmployees().size() );
+ Iterator iterator = er.getEmployees().iterator();
+ Employee eeFromDb = (Employee) iterator.next();
+ if ( eeFromDb.getId().equals( ee.getId() ) ) {
+ eeFromDb = (Employee) iterator.next();
+ }
+ assertEquals( ee2.getId(), eeFromDb.getId() );
+ er.getEmployees().remove( eeFromDb );
+ eeFromDb.getEmployers().remove( er );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ ee = (Employee) s.get( Employee.class, ee.getId() );
+ assertNotNull( ee );
+ assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
+ tx.commit();
+ assertFalse( "ManyToMany mappedBy lazyness", Hibernate.isInitialized( ee.getEmployers() ) );
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ ee = (Employee) s.get( Employee.class, ee.getId() );
+ assertNotNull( ee );
+ er = ee.getEmployers().iterator().next();
+ assertTrue( "second join non lazy", Hibernate.isInitialized( er ) );
+ assertEquals( 1, er.getEmployees().size() );
+ s.delete( er );
+ s.delete( ee );
+ tx.commit();
+ s.close();
+ }
+
+ public void testSelf() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Friend f = new Friend();
+ Friend sndF = new Friend();
+ f.setName( "Starsky" );
+ sndF.setName( "Hutch" );
+ Set frnds = new HashSet();
+ frnds.add( sndF );
+ f.setFriends( frnds );
+ //Starsky is a friend of Hutch but hutch is not
+ s.persist( f );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ f = (Friend) s.load( Friend.class, f.getId() );
+ assertNotNull( f );
+ assertNotNull( f.getFriends() );
+ assertEquals( 1, f.getFriends().size() );
+ Friend fromDb2ndFrnd = (Friend) f.getFriends().iterator().next();
+ assertEquals( fromDb2ndFrnd.getId(), sndF.getId() );
+ assertEquals( 0, fromDb2ndFrnd.getFriends().size() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCompositePk() throws Exception {
+ Session s;
+ Transaction tx;
+
+ ManPk m1pk = new ManPk();
+ m1pk.setElder( true );
+ m1pk.setFirstName( "Lucky" );
+ m1pk.setLastName( "Luke" );
+ ManPk m2pk = new ManPk();
+ m2pk.setElder( false );
+ m2pk.setFirstName( "Joe" );
+ m2pk.setLastName( "Dalton" );
+
+ Man m1 = new Man();
+ m1.setId( m1pk );
+ m1.setCarName( "Jolly Jumper" );
+ Man m2 = new Man();
+ m2.setId( m2pk );
+
+ WomanPk w1pk = new WomanPk();
+ w1pk.setFirstName( "Ma" );
+ w1pk.setLastName( "Dalton" );
+ WomanPk w2pk = new WomanPk();
+ w2pk.setFirstName( "Carla" );
+ w2pk.setLastName( "Bruni" );
+
+ Woman w1 = new Woman();
+ w1.setId( w1pk );
+ Woman w2 = new Woman();
+ w2.setId( w2pk );
+
+ Set<Woman> womens = new HashSet<Woman>();
+ womens.add( w1 );
+ m1.setWomens( womens );
+ Set<Woman> womens2 = new HashSet<Woman>();
+ womens2.add( w1 );
+ womens2.add( w2 );
+ m2.setWomens( womens2 );
+
+ Set<Man> mens = new HashSet<Man>();
+ mens.add( m1 );
+ mens.add( m2 );
+ w1.setMens( mens );
+ Set<Man> mens2 = new HashSet<Man>();
+ mens2.add( m2 );
+ w2.setMens( mens2 );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( m1 );
+ s.persist( m2 );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ m1 = (Man) s.load( Man.class, m1pk );
+ assertFalse( m1.getWomens().isEmpty() );
+ assertEquals( 1, m1.getWomens().size() );
+ w1 = (Woman) s.load( Woman.class, w1pk );
+ assertFalse( w1.getMens().isEmpty() );
+ assertEquals( 2, w1.getMens().size() );
+
+ tx.commit();
+ s.close();
+ }
+
+ public void testAssociationTableUniqueConstraints() throws Exception {
+ Session s = openSession();
+ Permission readAccess = new Permission();
+ readAccess.setPermission( "read" );
+ readAccess.setExpirationDate( new Date() );
+ Collection<Permission> coll = new ArrayList<Permission>( 2 );
+ coll.add( readAccess );
+ coll.add( readAccess );
+ Group group = new Group();
+ group.setId( new Integer( 1 ) );
+ group.setPermissions( coll );
+ s.getTransaction().begin();
+ try {
+ s.persist( group );
+ s.getTransaction().commit();
+ fail( "Unique constraints not applied on association table" );
+ }
+ catch (JDBCException e) {
+ //success
+ s.getTransaction().rollback();
+ }
+ finally {
+ s.close();
+ }
+ }
+
+ public void testAssociationTableAndOrderBy() throws Exception {
+ Session s = openSession();
+ s.enableFilter( "Groupfilter" );
+ Permission readAccess = new Permission();
+ readAccess.setPermission( "read" );
+ readAccess.setExpirationDate( new Date() );
+ Permission writeAccess = new Permission();
+ writeAccess.setPermission( "write" );
+ writeAccess.setExpirationDate( new Date( new Date().getTime() - 10*60*1000 ) );
+ Collection<Permission> coll = new ArrayList<Permission>( 2 );
+ coll.add( readAccess );
+ coll.add( writeAccess );
+ Group group = new Group();
+ group.setId( new Integer( 1 ) );
+ group.setPermissions( coll );
+ s.getTransaction().begin();
+ s.persist( group );
+ s.flush();
+ s.clear();
+ group = (Group) s.get( Group.class, group.getId() );
+ s.createQuery( "select g from Group g join fetch g.permissions").list();
+ assertEquals( "write", group.getPermissions().iterator().next().getPermission() );
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testAssociationTableAndOrderByWithSet() throws Exception {
+ Session s = openSession();
+ s.enableFilter( "Groupfilter" );
+
+ Permission readAccess = new Permission();
+ readAccess.setPermission( "read" );
+ readAccess.setExpirationDate( new Date() );
+
+ Permission writeAccess = new Permission();
+ writeAccess.setPermission( "write" );
+ writeAccess.setExpirationDate( new Date( new Date().getTime() - 10*60*1000 ) );
+
+ Permission executeAccess = new Permission();
+ executeAccess.setPermission( "execute" );
+ executeAccess.setExpirationDate( new Date( new Date().getTime() - 5*60*1000 ) );
+
+ Set<Permission> coll = new HashSet<Permission>( 3 );
+ coll.add( readAccess );
+ coll.add( writeAccess );
+ coll.add( executeAccess );
+
+ GroupWithSet group = new GroupWithSet();
+ group.setId( new Integer( 1 ) );
+ group.setPermissions( coll );
+ s.getTransaction().begin();
+ s.persist( group );
+ s.flush();
+ s.clear();
+
+ group = (GroupWithSet) s.get( GroupWithSet.class, group.getId() );
+ s.createQuery( "select g from Group g join fetch g.permissions").list();
+ Iterator<Permission> permIter = group.getPermissions().iterator();
+ assertEquals( "write", permIter.next().getPermission() );
+ assertEquals( "execute", permIter.next().getPermission() );
+ assertEquals( "read", permIter.next().getPermission() );
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testJoinedSubclassManyToMany() throws Exception {
+ Session s = openSession();
+ Zone a = new Zone();
+ InspectorPrefixes ip = new InspectorPrefixes( "dgi" );
+ Transaction tx = s.beginTransaction();
+ s.save( a );
+ s.save( ip );
+ ip.getAreas().add( a );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ ip = (InspectorPrefixes) s.get( InspectorPrefixes.class, ip.getId() );
+ assertNotNull( ip );
+ assertEquals( 1, ip.getAreas().size() );
+ assertEquals( a.getId(), ip.getAreas().get( 0 ).getId() );
+ s.delete( ip );
+ s.delete( ip.getAreas().get( 0 ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testJoinedSubclassManyToManyWithNonPkReference() throws Exception {
+ Session s = openSession();
+ Zone a = new Zone();
+ InspectorPrefixes ip = new InspectorPrefixes( "dgi" );
+ ip.setName( "Inspector" );
+ Transaction tx = s.beginTransaction();
+ s.save( a );
+ s.save( ip );
+ ip.getDesertedAreas().add( a );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ ip = (InspectorPrefixes) s.get( InspectorPrefixes.class, ip.getId() );
+ assertNotNull( ip );
+ assertEquals( 1, ip.getDesertedAreas().size() );
+ assertEquals( a.getId(), ip.getDesertedAreas().get( 0 ).getId() );
+ s.delete( ip );
+ s.delete( ip.getDesertedAreas().get( 0 ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testReferencedColumnNameToSuperclass() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ BuildingCompany comp = new BuildingCompany();
+ comp.setFoundedIn( new Date() );
+ comp.setName( "Builder century corp.");
+ s.persist( comp );
+ Building building = new Building();
+ building.setCompany( comp );
+ s.persist( building );
+ s.flush();
+ s.clear();
+ building = (Building) s.get( Building.class, building.getId() );
+ assertEquals( comp.getName(), building.getCompany().getName() );
+ tx.rollback();
+ s.close();
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ Friend.class,
+ Employer.class,
+ Employee.class,
+ Man.class,
+ Woman.class,
+ Store.class,
+ KnownClient.class,
+ Supplier.class,
+ City.class,
+ Cat.class,
+ Group.class,
+ GroupWithSet.class,
+ Permission.class,
+ Zone.class,
+ Inspector.class,
+ InspectorPrefixes.class,
+ BuildingCompany.class,
+ Building.class
+
+ };
+ }
+
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Permission.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Permission.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Permission.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.util.Date;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Permission {
- private String permission;
- private Date expirationDate;
-
- @Id
- public String getPermission() {
- return permission;
- }
-
- public void setPermission(String permission) {
- this.permission = permission;
- }
-
- public Date getExpirationDate() {
- return expirationDate;
- }
-
- public void setExpirationDate(Date expirationDate) {
- this.expirationDate = expirationDate;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Permission.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Permission.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Permission.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Permission.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Permission {
+ private String permission;
+ private Date expirationDate;
+
+ @Id
+ public String getPermission() {
+ return permission;
+ }
+
+ public void setPermission(String permission) {
+ this.permission = permission;
+ }
+
+ public Date getExpirationDate() {
+ return expirationDate;
+ }
+
+ public void setExpirationDate(Date expirationDate) {
+ this.expirationDate = expirationDate;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Store.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Store.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Store.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,74 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Store {
- private Integer id;
- private String name;
- private Set<KnownClient> customers;
- private Set<Supplier> suppliers;
-
- @ManyToMany(cascade = CascadeType.PERSIST)
- public Set<City> getImplantedIn() {
- return implantedIn;
- }
-
- public void setImplantedIn(Set<City> implantedIn) {
- this.implantedIn = implantedIn;
- }
-
- private Set<City> implantedIn;
-
- @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
- @JoinTable(
- name = "StoreSupplier",
- joinColumns = @JoinColumn(name = "store"),
- inverseJoinColumns = @JoinColumn(name = "supplier")
- )
- public Set<Supplier> getSuppliers() {
- return suppliers;
- }
-
- public void setSuppliers(Set<Supplier> suppliers) {
- this.suppliers = suppliers;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
- public Set<KnownClient> getCustomers() {
- return customers;
- }
-
- public void setCustomers(Set<KnownClient> customers) {
- this.customers = customers;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Store.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Store.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Store.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Store.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,74 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Store {
+ private Integer id;
+ private String name;
+ private Set<KnownClient> customers;
+ private Set<Supplier> suppliers;
+
+ @ManyToMany(cascade = CascadeType.PERSIST)
+ public Set<City> getImplantedIn() {
+ return implantedIn;
+ }
+
+ public void setImplantedIn(Set<City> implantedIn) {
+ this.implantedIn = implantedIn;
+ }
+
+ private Set<City> implantedIn;
+
+ @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+ @JoinTable(
+ name = "StoreSupplier",
+ joinColumns = @JoinColumn(name = "store"),
+ inverseJoinColumns = @JoinColumn(name = "supplier")
+ )
+ public Set<Supplier> getSuppliers() {
+ return suppliers;
+ }
+
+ public void setSuppliers(Set<Supplier> suppliers) {
+ this.suppliers = suppliers;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+ public Set<KnownClient> getCustomers() {
+ return customers;
+ }
+
+ public void setCustomers(Set<KnownClient> customers) {
+ this.customers = customers;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Supplier.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Supplier.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Supplier.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,46 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Supplier {
- private Integer id;
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- private Set<Store> suppStores;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @ManyToMany(mappedBy = "suppliers")
- public Set<Store> getSuppStores() {
- return suppStores;
- }
-
- public void setSuppStores(Set<Store> suppStores) {
- this.suppStores = suppStores;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Supplier.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Supplier.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Supplier.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Supplier.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,46 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Supplier {
+ private Integer id;
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ private Set<Store> suppStores;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @ManyToMany(mappedBy = "suppliers")
+ public Set<Store> getSuppStores() {
+ return suppStores;
+ }
+
+ public void setSuppStores(Set<Store> suppStores) {
+ this.suppStores = suppStores;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Woman.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Woman.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Woman.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,91 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.io.Serializable;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-
-import org.hibernate.annotations.ForeignKey;
-
-/**
- * Woman knowing several mens
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Woman implements Serializable {
- private WomanPk id;
- private String carName;
- private Set<Man> mens;
- private Set<Cat> cats;
-
- @ManyToMany(mappedBy = "humanContacts")
- public Set<Cat> getCats() {
- return cats;
- }
-
- public void setCats(Set<Cat> cats) {
- this.cats = cats;
- }
-
- @ManyToMany(cascade = {CascadeType.ALL})
- @JoinTable(
- name = "Man_Woman",
- joinColumns = {
- @JoinColumn(name = "womanLastName", referencedColumnName = "lastName"),
- @JoinColumn(name = "womanFirstName", referencedColumnName = "firstName")
- },
- inverseJoinColumns = {
- @JoinColumn(name = "manIsElder", referencedColumnName = "elder"),
- @JoinColumn(name = "manLastName", referencedColumnName = "lastName"),
- @JoinColumn(name = "manFirstName", referencedColumnName = "firstName")
- }
- )
- @ForeignKey(name = "WM_W_FK", inverseName = "WM_M_FK")
- public Set<Man> getMens() {
- return mens;
- }
-
- public void setMens(Set<Man> mens) {
- this.mens = mens;
- }
-
- @Id
- public WomanPk getId() {
- return id;
- }
-
- public void setId(WomanPk id) {
- this.id = id;
- }
-
- public String getCarName() {
- return carName;
- }
-
- public void setCarName(String carName) {
- this.carName = carName;
- }
-
-
- public int hashCode() {
- //a NPE can occurs, but I don't expect hashcode to be used before pk is set
- return getId().hashCode();
- }
-
- public boolean equals(Object obj) {
- //a NPE can occurs, but I don't expect equals to be used before pk is set
- if ( obj != null && obj instanceof Woman ) {
- return getId().equals( ( (Woman) obj ).getId() );
- }
- else {
- return false;
- }
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Woman.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Woman.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Woman.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Woman.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,91 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+
+import org.hibernate.annotations.ForeignKey;
+
+/**
+ * Woman knowing several mens
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Woman implements Serializable {
+ private WomanPk id;
+ private String carName;
+ private Set<Man> mens;
+ private Set<Cat> cats;
+
+ @ManyToMany(mappedBy = "humanContacts")
+ public Set<Cat> getCats() {
+ return cats;
+ }
+
+ public void setCats(Set<Cat> cats) {
+ this.cats = cats;
+ }
+
+ @ManyToMany(cascade = {CascadeType.ALL})
+ @JoinTable(
+ name = "Man_Woman",
+ joinColumns = {
+ @JoinColumn(name = "womanLastName", referencedColumnName = "lastName"),
+ @JoinColumn(name = "womanFirstName", referencedColumnName = "firstName")
+ },
+ inverseJoinColumns = {
+ @JoinColumn(name = "manIsElder", referencedColumnName = "elder"),
+ @JoinColumn(name = "manLastName", referencedColumnName = "lastName"),
+ @JoinColumn(name = "manFirstName", referencedColumnName = "firstName")
+ }
+ )
+ @ForeignKey(name = "WM_W_FK", inverseName = "WM_M_FK")
+ public Set<Man> getMens() {
+ return mens;
+ }
+
+ public void setMens(Set<Man> mens) {
+ this.mens = mens;
+ }
+
+ @Id
+ public WomanPk getId() {
+ return id;
+ }
+
+ public void setId(WomanPk id) {
+ this.id = id;
+ }
+
+ public String getCarName() {
+ return carName;
+ }
+
+ public void setCarName(String carName) {
+ this.carName = carName;
+ }
+
+
+ public int hashCode() {
+ //a NPE can occurs, but I don't expect hashcode to be used before pk is set
+ return getId().hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ //a NPE can occurs, but I don't expect equals to be used before pk is set
+ if ( obj != null && obj instanceof Woman ) {
+ return getId().equals( ( (Woman) obj ).getId() );
+ }
+ else {
+ return false;
+ }
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/WomanPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/WomanPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/WomanPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class WomanPk implements Serializable {
-
-
- private String firstName;
- private String lastName;
-
- public int hashCode() {
- //this implem sucks
- return getFirstName().hashCode() + getLastName().hashCode();
- }
-
- public boolean equals(Object obj) {
- //firstName and lastName are expected to be set in this implem
- if ( obj != null && obj instanceof WomanPk ) {
- WomanPk other = (WomanPk) obj;
- return getFirstName().equals( other.getFirstName() )
- && getLastName().equals( other.getLastName() );
- }
- else {
- return false;
- }
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- public String getFirstName() {
- return firstName;
- }
-
- public String getLastName() {
- return lastName;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/WomanPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/WomanPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/WomanPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/WomanPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class WomanPk implements Serializable {
+
+
+ private String firstName;
+ private String lastName;
+
+ public int hashCode() {
+ //this implem sucks
+ return getFirstName().hashCode() + getLastName().hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ //firstName and lastName are expected to be set in this implem
+ if ( obj != null && obj instanceof WomanPk ) {
+ WomanPk other = (WomanPk) obj;
+ return getFirstName().equals( other.getFirstName() )
+ && getLastName().equals( other.getLastName() );
+ }
+ else {
+ return false;
+ }
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public String getLastName() {
+ return lastName;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Zone.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Zone.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Zone.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytomany;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Zone {
- private Integer id;
-
- @Id
- @GeneratedValue
- @Column(name = "id")
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Zone.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Zone.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Zone.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytomany/Zone.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id$
+package org.hibernate.test.annotations.manytomany;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Zone {
+ private Integer id;
+
+ @Id
+ @GeneratedValue
+ @Column(name = "id")
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/BiggestForest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/BiggestForest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/BiggestForest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import javax.persistence.Entity;
-import javax.persistence.OneToOne;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class BiggestForest {
- private Integer id;
- private ForestType type;
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @OneToOne(mappedBy = "biggestRepresentative")
- public ForestType getType() {
- return type;
- }
-
- public void setType(ForestType type) {
- this.type = type;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/BiggestForest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/BiggestForest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/BiggestForest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/BiggestForest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.OneToOne;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BiggestForest {
+ private Integer id;
+ private ForestType type;
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @OneToOne(mappedBy = "biggestRepresentative")
+ public ForestType getType() {
+ return type;
+ }
+
+ public void setType(ForestType type) {
+ this.type = type;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Car.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Car.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Car.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytoone;
-
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-
-import org.hibernate.annotations.ForeignKey;
-
-/**
- * Many to one sample using default mapping values
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Car {
- private Integer id;
- private Color bodyColor;
- private Parent owner;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @ManyToOne(fetch = FetchType.EAGER)
- @ForeignKey(name="BODY_COLOR_FK")
- public Color getBodyColor() {
- return bodyColor;
- }
-
- public void setBodyColor(Color bodyColor) {
- this.bodyColor = bodyColor;
- }
-
- @ManyToOne
- public Parent getOwner() {
- return owner;
- }
-
- public void setOwner(Parent owner) {
- this.owner = owner;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Car.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Car.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Car.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Car.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+//$Id$
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.ForeignKey;
+
+/**
+ * Many to one sample using default mapping values
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Car {
+ private Integer id;
+ private Color bodyColor;
+ private Parent owner;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @ManyToOne(fetch = FetchType.EAGER)
+ @ForeignKey(name="BODY_COLOR_FK")
+ public Color getBodyColor() {
+ return bodyColor;
+ }
+
+ public void setBodyColor(Color bodyColor) {
+ this.bodyColor = bodyColor;
+ }
+
+ @ManyToOne
+ public Parent getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Parent owner) {
+ this.owner = owner;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Carz.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Carz.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Carz.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,124 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import java.io.Serializable;
-import java.util.Date;
-import javax.persistence.Entity;
-import javax.persistence.ManyToOne;
-import javax.persistence.Column;
-import javax.persistence.JoinColumns;
-import javax.persistence.FetchType;
-import javax.persistence.JoinColumn;
-import javax.persistence.TemporalType;
-import javax.persistence.Id;
-import javax.persistence.Temporal;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Carz implements Serializable {
- @Id
- private Integer id;
-
- @Column( name = "make", nullable = false )
- private String make;
-
- @Column( name = "model", nullable = false )
- private String model;
-
- @Column( name = "manufactured", nullable = false )
- @Temporal( TemporalType.TIMESTAMP )
- private Date manufactured;
-
- @ManyToOne( fetch = FetchType.LAZY )
- @JoinColumn( name = "loc_code", referencedColumnName = "loc_code" )
- private Lotz lot;
-
- public Carz() {
- }
-
- public Integer getId() {
- return this.id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public Lotz getLot() {
- return this.lot;
- }
-
- public void setLot(Lotz lot) {
- this.lot = lot;
- }
-
- public String getMake() {
- return this.make;
- }
-
- public void setMake(String make) {
- this.make = make;
- }
-
- public Date getManufactured() {
- return this.manufactured;
- }
-
- public void setManufactured(Date manufactured) {
- this.manufactured = manufactured;
- }
-
- public String getModel() {
- return this.model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- @Override
- public int hashCode() {
- final int PRIME = 31;
- int result = 1;
- result = PRIME * result + ( ( this.id == null ) ?
- 0 :
- this.id.hashCode() );
- result = PRIME * result + ( ( this.make == null ) ?
- 0 :
- this.make.hashCode() );
- result = PRIME * result + ( ( this.manufactured == null ) ?
- 0 :
- this.manufactured.hashCode() );
- result = PRIME * result + ( ( this.model == null ) ?
- 0 :
- this.model.hashCode() );
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if ( this == obj ) return true;
- if ( obj == null ) return false;
- if ( getClass() != obj.getClass() ) return false;
- final Carz other = (Carz) obj;
- if ( this.id == null ) {
- if ( other.id != null ) return false;
- }
- else if ( !this.id.equals( other.id ) ) return false;
- if ( this.make == null ) {
- if ( other.make != null ) return false;
- }
- else if ( !this.make.equals( other.make ) ) return false;
- if ( this.manufactured == null ) {
- if ( other.manufactured != null ) return false;
- }
- else if ( !this.manufactured.equals( other.manufactured ) ) return false;
- if ( this.model == null ) {
- if ( other.model != null ) return false;
- }
- else if ( !this.model.equals( other.model ) ) return false;
- return true;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Carz.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Carz.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Carz.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Carz.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,124 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.Column;
+import javax.persistence.JoinColumns;
+import javax.persistence.FetchType;
+import javax.persistence.JoinColumn;
+import javax.persistence.TemporalType;
+import javax.persistence.Id;
+import javax.persistence.Temporal;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Carz implements Serializable {
+ @Id
+ private Integer id;
+
+ @Column( name = "make", nullable = false )
+ private String make;
+
+ @Column( name = "model", nullable = false )
+ private String model;
+
+ @Column( name = "manufactured", nullable = false )
+ @Temporal( TemporalType.TIMESTAMP )
+ private Date manufactured;
+
+ @ManyToOne( fetch = FetchType.LAZY )
+ @JoinColumn( name = "loc_code", referencedColumnName = "loc_code" )
+ private Lotz lot;
+
+ public Carz() {
+ }
+
+ public Integer getId() {
+ return this.id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Lotz getLot() {
+ return this.lot;
+ }
+
+ public void setLot(Lotz lot) {
+ this.lot = lot;
+ }
+
+ public String getMake() {
+ return this.make;
+ }
+
+ public void setMake(String make) {
+ this.make = make;
+ }
+
+ public Date getManufactured() {
+ return this.manufactured;
+ }
+
+ public void setManufactured(Date manufactured) {
+ this.manufactured = manufactured;
+ }
+
+ public String getModel() {
+ return this.model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ( ( this.id == null ) ?
+ 0 :
+ this.id.hashCode() );
+ result = PRIME * result + ( ( this.make == null ) ?
+ 0 :
+ this.make.hashCode() );
+ result = PRIME * result + ( ( this.manufactured == null ) ?
+ 0 :
+ this.manufactured.hashCode() );
+ result = PRIME * result + ( ( this.model == null ) ?
+ 0 :
+ this.model.hashCode() );
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if ( this == obj ) return true;
+ if ( obj == null ) return false;
+ if ( getClass() != obj.getClass() ) return false;
+ final Carz other = (Carz) obj;
+ if ( this.id == null ) {
+ if ( other.id != null ) return false;
+ }
+ else if ( !this.id.equals( other.id ) ) return false;
+ if ( this.make == null ) {
+ if ( other.make != null ) return false;
+ }
+ else if ( !this.make.equals( other.make ) ) return false;
+ if ( this.manufactured == null ) {
+ if ( other.manufactured != null ) return false;
+ }
+ else if ( !this.manufactured.equals( other.manufactured ) ) return false;
+ if ( this.model == null ) {
+ if ( other.model != null ) return false;
+ }
+ else if ( !this.model.equals( other.model ) ) return false;
+ return true;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Child.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Child.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Child.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytoone;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
-/**
- * TODO: change this sample with an Address -> Country relation. This is more accurate
- *
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "tbl_child")
-public class Child implements Serializable {
- @Id
- @GeneratedValue
- public Integer id;
-
- @ManyToOne()
- @JoinColumns({
- @JoinColumn(name = "parentCivility", referencedColumnName = "isMale"),
- @JoinColumn(name = "parentLastName", referencedColumnName = "lastName"),
- @JoinColumn(name = "parentFirstName", referencedColumnName = "firstName")
- })
- public Parent parent;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Child.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Child.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Child.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Child.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id$
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+/**
+ * TODO: change this sample with an Address -> Country relation. This is more accurate
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_child")
+public class Child implements Serializable {
+ @Id
+ @GeneratedValue
+ public Integer id;
+
+ @ManyToOne()
+ @JoinColumns({
+ @JoinColumn(name = "parentCivility", referencedColumnName = "isMale"),
+ @JoinColumn(name = "parentLastName", referencedColumnName = "lastName"),
+ @JoinColumn(name = "parentFirstName", referencedColumnName = "firstName")
+ })
+ public Parent parent;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Color.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Color.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Color.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,37 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytoone;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * Color showing a surrogate key and a unique constraint to ensure business rule
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Color {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Column(unique = true)
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Color.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Color.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Color.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Color.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,37 @@
+//$Id$
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * Color showing a surrogate key and a unique constraint to ensure business rule
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Color {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Column(unique = true)
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Customer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Customer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Customer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity(name="DealedCustomer")
-public class Customer implements Serializable {
- @Id @GeneratedValue public Integer id;
- public String userId;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Customer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Customer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Customer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Customer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity(name="DealedCustomer")
+public class Customer implements Serializable {
+ @Id @GeneratedValue public Integer id;
+ public String userId;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Deal.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Deal.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Deal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.ManyToOne;
-import javax.persistence.JoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Deal {
- @Id @GeneratedValue public Integer id;
- @ManyToOne @JoinColumn(referencedColumnName = "userId") public Customer from;
- @ManyToOne @JoinColumn(referencedColumnName = "userId") public Customer to;
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Deal.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Deal.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Deal.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Deal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Deal {
+ @Id @GeneratedValue public Integer id;
+ @ManyToOne @JoinColumn(referencedColumnName = "userId") public Customer from;
+ @ManyToOne @JoinColumn(referencedColumnName = "userId") public Customer to;
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-package org.hibernate.test.annotations.manytoone;
-
-import java.util.Date;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "CLRUS2DI")
-public class DistrictUser {
- @Id
- @GeneratedValue
- @Column(name = "CLRUS2DI_KEY")
- private Long id;
-
- @Column(name = "CLRUS2DI_CREATE_USERS_KEY")
- private Long createdBy;
-
- @Column(name = "CLRUS2DI_CREATE_DATE")
- private Date createdOn;
-
- //@ManyToOne(cascade = CascadeType.ALL)
- //@JoinColumn(name = "CLRUS2DI_DISTR_KEY")
- //private District district;
-
- @ManyToOne(cascade = CascadeType.ALL)
- @JoinColumns({@JoinColumn(name = "CLRUS2DI_USERS_KEY", referencedColumnName = "CTVUSERS_KEY"),
- @JoinColumn(name = "CLRUS2DI_BEGIN_DATE", referencedColumnName = "CTVUSERS_START_DATE"),
- @JoinColumn(name = "CLRUS2DI_END_DATE", referencedColumnName = "CTVUSERS_END_DATE")})
- private User user;
-
- @Column(name = "CLRUS2DI_LDTMD_KEY")
- private Long ldtmd;
-
- @Column(name = "CLRUS2DI_PMTMP_KEY")
- private Long pmtmp;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/DistrictUser.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.Date;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "CLRUS2DI")
+public class DistrictUser {
+ @Id
+ @GeneratedValue
+ @Column(name = "CLRUS2DI_KEY")
+ private Long id;
+
+ @Column(name = "CLRUS2DI_CREATE_USERS_KEY")
+ private Long createdBy;
+
+ @Column(name = "CLRUS2DI_CREATE_DATE")
+ private Date createdOn;
+
+ //@ManyToOne(cascade = CascadeType.ALL)
+ //@JoinColumn(name = "CLRUS2DI_DISTR_KEY")
+ //private District district;
+
+ @ManyToOne(cascade = CascadeType.ALL)
+ @JoinColumns({@JoinColumn(name = "CLRUS2DI_USERS_KEY", referencedColumnName = "CTVUSERS_KEY"),
+ @JoinColumn(name = "CLRUS2DI_BEGIN_DATE", referencedColumnName = "CTVUSERS_START_DATE"),
+ @JoinColumn(name = "CLRUS2DI_END_DATE", referencedColumnName = "CTVUSERS_END_DATE")})
+ private User user;
+
+ @Column(name = "CLRUS2DI_LDTMD_KEY")
+ private Long ldtmd;
+
+ @Column(name = "CLRUS2DI_PMTMP_KEY")
+ private Long pmtmp;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ForestType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ForestType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ForestType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,66 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinTable;
-import javax.persistence.JoinColumn;
-
-import org.hibernate.annotations.ForeignKey;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class ForestType {
- private Integer id;
- private String name;
- private Set<TreeType> trees;
- private BiggestForest biggestRepresentative;
-
- @OneToOne
- @JoinTable(name="BiggestRepresentativePerForestType",
- joinColumns = @JoinColumn(name="forest_type"),
- inverseJoinColumns = @JoinColumn(name="forest")
- )
- @ForeignKey(name="A_TYP_FK",
- inverseName = "A_FOR_FK" //inverse fail cause it involves a Join
- )
- public BiggestForest getBiggestRepresentative() {
- return biggestRepresentative;
- }
-
- public void setBiggestRepresentative(BiggestForest biggestRepresentative) {
- this.biggestRepresentative = biggestRepresentative;
- }
-
- @OneToMany(mappedBy="forestType")
- public Set<TreeType> getTrees() {
- return trees;
- }
-
- public void setTrees(Set<TreeType> trees) {
- this.trees = trees;
- }
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ForestType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ForestType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ForestType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ForestType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,66 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinTable;
+import javax.persistence.JoinColumn;
+
+import org.hibernate.annotations.ForeignKey;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ForestType {
+ private Integer id;
+ private String name;
+ private Set<TreeType> trees;
+ private BiggestForest biggestRepresentative;
+
+ @OneToOne
+ @JoinTable(name="BiggestRepresentativePerForestType",
+ joinColumns = @JoinColumn(name="forest_type"),
+ inverseJoinColumns = @JoinColumn(name="forest")
+ )
+ @ForeignKey(name="A_TYP_FK",
+ inverseName = "A_FOR_FK" //inverse fail cause it involves a Join
+ )
+ public BiggestForest getBiggestRepresentative() {
+ return biggestRepresentative;
+ }
+
+ public void setBiggestRepresentative(BiggestForest biggestRepresentative) {
+ this.biggestRepresentative = biggestRepresentative;
+ }
+
+ @OneToMany(mappedBy="forestType")
+ public Set<TreeType> getTrees() {
+ return trees;
+ }
+
+ public void setTrees(Set<TreeType> trees) {
+ this.trees = trees;
+ }
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Frame.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Frame.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Frame.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import java.util.Set;
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-import org.hibernate.annotations.Formula;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Frame implements Serializable {
- @Id
- @GeneratedValue
- private Long id;
- @OneToMany( mappedBy = "frame" )
- private Set<Lens> lenses;
- @Column( unique = true )
- private String name;
- @Formula("lower(name)")
- private String lowerName;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Set<Lens> getLenses() {
- return lenses;
- }
-
- public void setLenses(Set<Lens> lenses) {
- this.lenses = lenses;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Frame.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Frame.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Frame.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Frame.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.Set;
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.Formula;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Frame implements Serializable {
+ @Id
+ @GeneratedValue
+ private Long id;
+ @OneToMany( mappedBy = "frame" )
+ private Set<Lens> lenses;
+ @Column( unique = true )
+ private String name;
+ @Formula("lower(name)")
+ private String lowerName;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Set<Lens> getLenses() {
+ return lenses;
+ }
+
+ public void setLenses(Set<Lens> lenses) {
+ this.lenses = lenses;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lens.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lens.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lens.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import javax.persistence.Entity;
-import javax.persistence.ManyToOne;
-import javax.persistence.JoinColumn;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-import org.hibernate.annotations.Formula;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Lens {
- @Id
- @GeneratedValue
- private Long id;
- private float focal;
- @Formula("(1/focal)")
- private float length;
- @ManyToOne()
- @JoinColumn(name="`frame_fk`", referencedColumnName = "name")
- private Frame frame;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public float getFocal() {
- return focal;
- }
-
- public void setFocal(float focal) {
- this.focal = focal;
- }
-
- public float getLength() {
- return length;
- }
-
- public void setLength(float length) {
- this.length = length;
- }
-
- public Frame getFrame() {
- return frame;
- }
-
- public void setFrame(Frame frame) {
- this.frame = frame;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lens.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lens.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lens.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lens.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+import org.hibernate.annotations.Formula;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Lens {
+ @Id
+ @GeneratedValue
+ private Long id;
+ private float focal;
+ @Formula("(1/focal)")
+ private float length;
+ @ManyToOne()
+ @JoinColumn(name="`frame_fk`", referencedColumnName = "name")
+ private Frame frame;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public float getFocal() {
+ return focal;
+ }
+
+ public void setFocal(float focal) {
+ this.focal = focal;
+ }
+
+ public float getLength() {
+ return length;
+ }
+
+ public void setLength(float length) {
+ this.length = length;
+ }
+
+ public Frame getFrame() {
+ return frame;
+ }
+
+ public void setFrame(Frame frame) {
+ this.frame = frame;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lotz.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lotz.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lotz.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,101 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import java.util.List;
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Column;
-import javax.persistence.FetchType;
-import javax.persistence.OneToMany;
-import javax.persistence.CascadeType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Lotz implements Serializable {
- @EmbeddedId
- protected LotzPK lotPK;
-
- @Column( name = "name", nullable = false )
- private String name;
-
- @Column( name = "location", nullable = false )
- private String location;
-
- @OneToMany( mappedBy = "lot", fetch = FetchType.LAZY, cascade = CascadeType.ALL )
- private List<Carz> cars;
-
- public Lotz() {
- }
-
- public List<Carz> getCars() {
- return this.cars;
- }
-
- public void setCars(List<Carz> cars) {
- this.cars = cars;
- }
-
- public String getLocation() {
- return this.location;
- }
-
- public void setLocation(String location) {
- this.location = location;
- }
-
- public LotzPK getLotPK() {
- return this.lotPK;
- }
-
- public void setLotPK(LotzPK lotPK) {
- this.lotPK = lotPK;
- }
-
- public String getName() {
- return this.name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Override
- public int hashCode() {
- final int PRIME = 31;
- int result = 1;
- result = PRIME * result + ( ( this.location == null ) ?
- 0 :
- this.location.hashCode() );
- result = PRIME * result + ( ( this.lotPK == null ) ?
- 0 :
- this.lotPK.hashCode() );
- result = PRIME * result + ( ( this.name == null ) ?
- 0 :
- this.name.hashCode() );
- return result;
- }
-
- @Override
- public boolean equals(Object obj) {
- if ( this == obj ) return true;
- if ( obj == null ) return false;
- if ( getClass() != obj.getClass() ) return false;
- final Lotz other = (Lotz) obj;
- if ( this.location == null ) {
- if ( other.location != null ) return false;
- }
- else if ( !this.location.equals( other.location ) ) return false;
- if ( this.lotPK == null ) {
- if ( other.lotPK != null ) return false;
- }
- else if ( !this.lotPK.equals( other.lotPK ) ) return false;
- if ( this.name == null ) {
- if ( other.name != null ) return false;
- }
- else if ( !this.name.equals( other.name ) ) return false;
- return true;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lotz.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lotz.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lotz.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Lotz.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,101 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.List;
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Column;
+import javax.persistence.FetchType;
+import javax.persistence.OneToMany;
+import javax.persistence.CascadeType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Lotz implements Serializable {
+ @EmbeddedId
+ protected LotzPK lotPK;
+
+ @Column( name = "name", nullable = false )
+ private String name;
+
+ @Column( name = "location", nullable = false )
+ private String location;
+
+ @OneToMany( mappedBy = "lot", fetch = FetchType.LAZY, cascade = CascadeType.ALL )
+ private List<Carz> cars;
+
+ public Lotz() {
+ }
+
+ public List<Carz> getCars() {
+ return this.cars;
+ }
+
+ public void setCars(List<Carz> cars) {
+ this.cars = cars;
+ }
+
+ public String getLocation() {
+ return this.location;
+ }
+
+ public void setLocation(String location) {
+ this.location = location;
+ }
+
+ public LotzPK getLotPK() {
+ return this.lotPK;
+ }
+
+ public void setLotPK(LotzPK lotPK) {
+ this.lotPK = lotPK;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Override
+ public int hashCode() {
+ final int PRIME = 31;
+ int result = 1;
+ result = PRIME * result + ( ( this.location == null ) ?
+ 0 :
+ this.location.hashCode() );
+ result = PRIME * result + ( ( this.lotPK == null ) ?
+ 0 :
+ this.lotPK.hashCode() );
+ result = PRIME * result + ( ( this.name == null ) ?
+ 0 :
+ this.name.hashCode() );
+ return result;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if ( this == obj ) return true;
+ if ( obj == null ) return false;
+ if ( getClass() != obj.getClass() ) return false;
+ final Lotz other = (Lotz) obj;
+ if ( this.location == null ) {
+ if ( other.location != null ) return false;
+ }
+ else if ( !this.location.equals( other.location ) ) return false;
+ if ( this.lotPK == null ) {
+ if ( other.lotPK != null ) return false;
+ }
+ else if ( !this.lotPK.equals( other.lotPK ) ) return false;
+ if ( this.name == null ) {
+ if ( other.name != null ) return false;
+ }
+ else if ( !this.name.equals( other.name ) ) return false;
+ return true;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/LotzPK.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/LotzPK.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/LotzPK.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class LotzPK implements Serializable {
- @Column( name = "id", nullable = false )
- private Integer id;
-
- @Column( name = "loc_code", nullable = false, unique = true )
- private String locCode;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getLocCode() {
- return locCode;
- }
-
- public void setLocCode(String locCode) {
- this.locCode = locCode;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/LotzPK.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/LotzPK.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/LotzPK.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/LotzPK.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class LotzPK implements Serializable {
+ @Column( name = "id", nullable = false )
+ private Integer id;
+
+ @Column( name = "loc_code", nullable = false, unique = true )
+ private String locCode;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getLocCode() {
+ return locCode;
+ }
+
+ public void setLocCode(String locCode) {
+ this.locCode = locCode;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,62 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ManyToOneJoinTest extends TestCase {
- public void testManyToOneJoinTable() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- ForestType forest = new ForestType();
- forest.setName( "Original forest" );
- s.persist( forest );
- TreeType tree = new TreeType();
- tree.setForestType( forest );
- tree.setAlternativeForestType( forest );
- tree.setName( "just a tree");
- s.persist( tree );
- s.flush();
- s.clear();
- tree = (TreeType) s.get(TreeType.class, tree.getId() );
- assertNotNull( tree.getForestType() );
- assertNotNull( tree.getAlternativeForestType() );
- s.clear();
- forest = (ForestType) s.get( ForestType.class, forest.getId() );
- assertEquals( 1, forest.getTrees().size() );
- assertEquals( tree.getId(), forest.getTrees().iterator().next().getId() );
- tx.rollback();
- s.close();
- }
-
- public void testOneToOneJoinTable() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- ForestType forest = new ForestType();
- forest.setName( "Original forest" );
- s.persist( forest );
- BiggestForest forestRepr = new BiggestForest();
- forestRepr.setType( forest );
- forest.setBiggestRepresentative( forestRepr );
- s.persist( forestRepr );
- s.flush();
- s.clear();
- forest = (ForestType) s.get( ForestType.class, forest.getId() );
- assertNotNull( forest.getBiggestRepresentative() );
- assertEquals( forest, forest.getBiggestRepresentative().getType() );
- tx.rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- BiggestForest.class,
- ForestType.class,
- TreeType.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneJoinTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,62 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ManyToOneJoinTest extends TestCase {
+ public void testManyToOneJoinTable() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ ForestType forest = new ForestType();
+ forest.setName( "Original forest" );
+ s.persist( forest );
+ TreeType tree = new TreeType();
+ tree.setForestType( forest );
+ tree.setAlternativeForestType( forest );
+ tree.setName( "just a tree");
+ s.persist( tree );
+ s.flush();
+ s.clear();
+ tree = (TreeType) s.get(TreeType.class, tree.getId() );
+ assertNotNull( tree.getForestType() );
+ assertNotNull( tree.getAlternativeForestType() );
+ s.clear();
+ forest = (ForestType) s.get( ForestType.class, forest.getId() );
+ assertEquals( 1, forest.getTrees().size() );
+ assertEquals( tree.getId(), forest.getTrees().iterator().next().getId() );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testOneToOneJoinTable() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ ForestType forest = new ForestType();
+ forest.setName( "Original forest" );
+ s.persist( forest );
+ BiggestForest forestRepr = new BiggestForest();
+ forestRepr.setType( forest );
+ forest.setBiggestRepresentative( forestRepr );
+ s.persist( forestRepr );
+ s.flush();
+ s.clear();
+ forest = (ForestType) s.get( ForestType.class, forest.getId() );
+ assertNotNull( forest.getBiggestRepresentative() );
+ assertEquals( forest, forest.getBiggestRepresentative().getType() );
+ tx.rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ BiggestForest.class,
+ ForestType.class,
+ TreeType.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,54 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import java.util.Date;
-
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.Session;
-
-
-/**
- * FIXME test for ANN-548
- * @author Emmanuel Bernard
- */
-public class ManyToOneOnNonPkTest extends TestCase {
-
- public void testNonPkPartOfPk() throws Exception {
-// Session s = openSession( );
-// s.getTransaction().begin();
-//
-// LotzPK pk = new LotzPK();
-// pk.setId( 1 );
-// pk.setLocCode( "fr" );
-// Lotz lot = new Lotz();
-// lot.setLocation( "France" );
-// lot.setName( "Chez Dede" );
-// lot.setLotPK( pk );
-// Carz car = new Carz();
-// car.setId( 1 );
-// car.setLot( lot );
-// car.setMake( "Citroen" );
-// car.setManufactured( new Date() );
-// car.setModel( "C5" );
-// s.persist( lot );
-// s.persist( car );
-//
-// s.flush();
-// s.clear();
-// s.clear();
-//
-// car = (Carz) s.createQuery( "from Carz car left join fetch car.lot").uniqueResult();
-// assertNotNull( car.getLot() );
-//
-// s.getTransaction().commit();
-// s.close();
-//
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- //Carz.class,
- //Lotz.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneOnNonPkTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,54 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.Date;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+
+/**
+ * FIXME test for ANN-548
+ * @author Emmanuel Bernard
+ */
+public class ManyToOneOnNonPkTest extends TestCase {
+
+ public void testNonPkPartOfPk() throws Exception {
+// Session s = openSession( );
+// s.getTransaction().begin();
+//
+// LotzPK pk = new LotzPK();
+// pk.setId( 1 );
+// pk.setLocCode( "fr" );
+// Lotz lot = new Lotz();
+// lot.setLocation( "France" );
+// lot.setName( "Chez Dede" );
+// lot.setLotPK( pk );
+// Carz car = new Carz();
+// car.setId( 1 );
+// car.setLot( lot );
+// car.setMake( "Citroen" );
+// car.setManufactured( new Date() );
+// car.setModel( "C5" );
+// s.persist( lot );
+// s.persist( car );
+//
+// s.flush();
+// s.clear();
+// s.clear();
+//
+// car = (Carz) s.createQuery( "from Carz car left join fetch car.lot").uniqueResult();
+// assertNotNull( car.getLot() );
+//
+// s.getTransaction().commit();
+// s.close();
+//
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ //Carz.class,
+ //Lotz.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,350 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytoone;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-import org.hibernate.Hibernate;
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.Company;
-import org.hibernate.test.annotations.Customer;
-import org.hibernate.test.annotations.Discount;
-import org.hibernate.test.annotations.Flight;
-import org.hibernate.test.annotations.Passport;
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.test.annotations.Ticket;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ManyToOneTest extends TestCase {
-
- public ManyToOneTest(String x) {
- super( x );
- }
-
- public void testEager() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Color c = new Color();
- c.setName( "Yellow" );
- s.persist( c );
- Car car = new Car();
- car.setBodyColor( c );
- s.persist( car );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- car = (Car) s.get( Car.class, car.getId() );
- tx.commit();
- s.close();
- assertNotNull( car );
- assertNotNull( car.getBodyColor() );
- assertEquals( "Yellow", car.getBodyColor().getName() );
-
- }
-
- public void testDefaultMetadata() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Color c = new Color();
- c.setName( "Blue" );
- s.persist( c );
- Car car = new Car();
- car.setBodyColor( c );
- s.persist( car );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- car = (Car) s.get( Car.class, car.getId() );
- assertNotNull( car );
- assertNotNull( car.getBodyColor() );
- assertEquals( c.getId(), car.getBodyColor().getId() );
- tx.rollback();
- s.close();
- }
-
- public void testCreate() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Flight firstOne = new Flight();
- firstOne.setId( new Long( 1 ) );
- firstOne.setName( "AF0101" );
- firstOne.setDuration( new Long( 1000 ) );
- Company frenchOne = new Company();
- frenchOne.setName( "Air France" );
- firstOne.setCompany( frenchOne );
- s.persist( firstOne );
- tx.commit();
- s.close();
- assertNotNull( "identity id should work", frenchOne.getId() );
-
- s = openSession();
- tx = s.beginTransaction();
- firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
- assertNotNull( firstOne.getCompany() );
- assertEquals( frenchOne.getName(), firstOne.getCompany().getName() );
- tx.commit();
- s.close();
- }
-
- public void testCascade() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Discount discount = new Discount();
- discount.setDiscount( 20.12 );
- Customer customer = new Customer();
- Collection discounts = new ArrayList();
- discounts.add( discount );
- customer.setName( "Quentin Tarantino" );
- discount.setOwner( customer );
- customer.setDiscountTickets( discounts );
- s.persist( discount );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- discount = (Discount) s.get( Discount.class, discount.getId() );
- assertNotNull( discount );
- assertEquals( 20.12, discount.getDiscount() );
- assertNotNull( discount.getOwner() );
- customer = new Customer();
- customer.setName( "Clooney" );
- discount.setOwner( customer );
- discounts = new ArrayList();
- discounts.add( discount );
- customer.setDiscountTickets( discounts );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- discount = (Discount) s.get( Discount.class, discount.getId() );
- assertNotNull( discount );
- assertNotNull( discount.getOwner() );
- assertEquals( "Clooney", discount.getOwner().getName() );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- customer = (Customer) s.get( Customer.class, customer.getId() );
- s.delete( customer );
- tx.commit();
- s.close();
- }
-
- public void testFetch() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Discount discount = new Discount();
- discount.setDiscount( 20 );
- Customer customer = new Customer();
- Collection discounts = new ArrayList();
- discounts.add( discount );
- customer.setName( "Quentin Tarantino" );
- discount.setOwner( customer );
- customer.setDiscountTickets( discounts );
- s.persist( discount );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- discount = (Discount) s.get( Discount.class, discount.getId() );
- assertNotNull( discount );
- assertFalse( Hibernate.isInitialized( discount.getOwner() ) );
- tx.commit();
-
- s = openSession();
- tx = s.beginTransaction();
- discount = (Discount) s.load( Discount.class, discount.getId() );
- assertNotNull( discount );
- assertFalse( Hibernate.isInitialized( discount.getOwner() ) );
- tx.commit();
-
- s = openSession();
- tx = s.beginTransaction();
- s.delete( s.get( Discount.class, discount.getId() ) );
- tx.commit();
- s.close();
- }
-
- public void testCompositeFK() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- ParentPk ppk = new ParentPk();
- ppk.firstName = "John";
- ppk.lastName = "Doe";
- Parent p = new Parent();
- p.age = 45;
- p.id = ppk;
- s.persist( p );
- Child c = new Child();
- c.parent = p;
- s.persist( c );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- //FIXME: fix this when the small parser bug will be fixed
- Query q = s.createQuery( "from " + Child.class.getName() ); //+ " c where c.parent.id.lastName = :lastName");
- //q.setString("lastName", p.id.lastName);
- List result = q.list();
- assertEquals( 1, result.size() );
- Child c2 = (Child) result.get( 0 );
- assertEquals( c2.id, c.id );
- tx.commit();
- s.close();
- }
-
- public void testImplicitCompositeFk() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Node n1 = new Node();
- n1.setDescription( "Parent" );
- NodePk n1pk = new NodePk();
- n1pk.setLevel( 1 );
- n1pk.setName( "Root" );
- n1.setId( n1pk );
- Node n2 = new Node();
- NodePk n2pk = new NodePk();
- n2pk.setLevel( 2 );
- n2pk.setName( "Level 1: A" );
- n2.setParent( n1 );
- n2.setId( n2pk );
- s.persist( n2 );
- tx.commit();
-
- s = openSession();
- tx = s.beginTransaction();
- n2 = (Node) s.get( Node.class, n2pk );
- assertNotNull( n2 );
- assertNotNull( n2.getParent() );
- assertEquals( 1, n2.getParent().getId().getLevel() );
- tx.commit();
- s.close();
- }
-
- public void testManyToOneAndIdClass() throws Exception {
-
- }
-
- public void testManyToOneNonPk() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Order order = new Order();
- order.setOrderNbr( "123" );
- s.persist( order );
- OrderLine ol = new OrderLine();
- ol.setItem( "Mouse" );
- ol.setOrder( order );
- s.persist( ol );
- s.flush();
- s.clear();
- ol = (OrderLine) s.get( OrderLine.class, ol.getId() );
- assertNotNull( ol.getOrder() );
- assertEquals( "123", ol.getOrder().getOrderNbr() );
- assertTrue( ol.getOrder().getOrderLines().contains( ol ) );
- tx.rollback();
- s.close();
- }
-
- public void testTwoManyToOneNonPk() throws Exception {
- //2 many to one non pk pointing to the same referencedColumnName should not fail
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- org.hibernate.test.annotations.manytoone.Customer customer = new org.hibernate.test.annotations.manytoone.Customer();
- customer.userId="123";
- org.hibernate.test.annotations.manytoone.Customer customer2 = new org.hibernate.test.annotations.manytoone.Customer();
- customer2.userId="124";
- s.persist( customer2 );
- s.persist( customer );
- Deal deal = new Deal();
- deal.from = customer;
- deal.to = customer2;
- s.persist( deal );
- s.flush();
- s.clear();
- deal = (Deal) s.get( Deal.class, deal.id );
- assertNotNull( deal.from );
- assertNotNull( deal.to );
- tx.rollback();
- s.close();
- }
-
- public void testFormulaOnOtherSide() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Frame frame = new Frame();
- frame.setName( "Prada" );
- s.persist( frame );
- Lens l = new Lens();
- l.setFocal( 2.5f );
- l.setFrame( frame );
- s.persist( l );
- Lens r = new Lens();
- r.setFocal( 1.2f);
- r.setFrame( frame );
- s.persist( r );
- s.flush();
- s.clear();
- frame = (Frame) s.get( Frame.class, frame.getId() );
- assertEquals( 2, frame.getLenses().size() );
- assertTrue( frame.getLenses().iterator().next().getLength() <= 1/1.2f );
- assertTrue( frame.getLenses().iterator().next().getLength() >= 1/2.5f );
- tx.rollback();
- s.close();
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected java.lang.Class[] getMappings() {
- return new java.lang.Class[]{
- Deal.class,
- org.hibernate.test.annotations.manytoone.Customer.class,
- Car.class,
- Color.class,
- Flight.class,
- Company.class,
- Customer.class,
- Discount.class,
- Ticket.class,
- Passport.class,
- Parent.class,
- Child.class,
- Node.class,
- User.class,
- DistrictUser.class,
- Order.class,
- OrderLine.class,
- Frame.class,
- Lens.class
- };
- }
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ManyToOneTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,350 @@
+//$Id$
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.hibernate.Hibernate;
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.Company;
+import org.hibernate.test.annotations.Customer;
+import org.hibernate.test.annotations.Discount;
+import org.hibernate.test.annotations.Flight;
+import org.hibernate.test.annotations.Passport;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.Ticket;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ManyToOneTest extends TestCase {
+
+ public ManyToOneTest(String x) {
+ super( x );
+ }
+
+ public void testEager() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Color c = new Color();
+ c.setName( "Yellow" );
+ s.persist( c );
+ Car car = new Car();
+ car.setBodyColor( c );
+ s.persist( car );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ car = (Car) s.get( Car.class, car.getId() );
+ tx.commit();
+ s.close();
+ assertNotNull( car );
+ assertNotNull( car.getBodyColor() );
+ assertEquals( "Yellow", car.getBodyColor().getName() );
+
+ }
+
+ public void testDefaultMetadata() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Color c = new Color();
+ c.setName( "Blue" );
+ s.persist( c );
+ Car car = new Car();
+ car.setBodyColor( c );
+ s.persist( car );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ car = (Car) s.get( Car.class, car.getId() );
+ assertNotNull( car );
+ assertNotNull( car.getBodyColor() );
+ assertEquals( c.getId(), car.getBodyColor().getId() );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testCreate() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Flight firstOne = new Flight();
+ firstOne.setId( new Long( 1 ) );
+ firstOne.setName( "AF0101" );
+ firstOne.setDuration( new Long( 1000 ) );
+ Company frenchOne = new Company();
+ frenchOne.setName( "Air France" );
+ firstOne.setCompany( frenchOne );
+ s.persist( firstOne );
+ tx.commit();
+ s.close();
+ assertNotNull( "identity id should work", frenchOne.getId() );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ firstOne = (Flight) s.get( Flight.class, new Long( 1 ) );
+ assertNotNull( firstOne.getCompany() );
+ assertEquals( frenchOne.getName(), firstOne.getCompany().getName() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCascade() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Discount discount = new Discount();
+ discount.setDiscount( 20.12 );
+ Customer customer = new Customer();
+ Collection discounts = new ArrayList();
+ discounts.add( discount );
+ customer.setName( "Quentin Tarantino" );
+ discount.setOwner( customer );
+ customer.setDiscountTickets( discounts );
+ s.persist( discount );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ discount = (Discount) s.get( Discount.class, discount.getId() );
+ assertNotNull( discount );
+ assertEquals( 20.12, discount.getDiscount() );
+ assertNotNull( discount.getOwner() );
+ customer = new Customer();
+ customer.setName( "Clooney" );
+ discount.setOwner( customer );
+ discounts = new ArrayList();
+ discounts.add( discount );
+ customer.setDiscountTickets( discounts );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ discount = (Discount) s.get( Discount.class, discount.getId() );
+ assertNotNull( discount );
+ assertNotNull( discount.getOwner() );
+ assertEquals( "Clooney", discount.getOwner().getName() );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ customer = (Customer) s.get( Customer.class, customer.getId() );
+ s.delete( customer );
+ tx.commit();
+ s.close();
+ }
+
+ public void testFetch() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Discount discount = new Discount();
+ discount.setDiscount( 20 );
+ Customer customer = new Customer();
+ Collection discounts = new ArrayList();
+ discounts.add( discount );
+ customer.setName( "Quentin Tarantino" );
+ discount.setOwner( customer );
+ customer.setDiscountTickets( discounts );
+ s.persist( discount );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ discount = (Discount) s.get( Discount.class, discount.getId() );
+ assertNotNull( discount );
+ assertFalse( Hibernate.isInitialized( discount.getOwner() ) );
+ tx.commit();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ discount = (Discount) s.load( Discount.class, discount.getId() );
+ assertNotNull( discount );
+ assertFalse( Hibernate.isInitialized( discount.getOwner() ) );
+ tx.commit();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.delete( s.get( Discount.class, discount.getId() ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCompositeFK() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ ParentPk ppk = new ParentPk();
+ ppk.firstName = "John";
+ ppk.lastName = "Doe";
+ Parent p = new Parent();
+ p.age = 45;
+ p.id = ppk;
+ s.persist( p );
+ Child c = new Child();
+ c.parent = p;
+ s.persist( c );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ //FIXME: fix this when the small parser bug will be fixed
+ Query q = s.createQuery( "from " + Child.class.getName() ); //+ " c where c.parent.id.lastName = :lastName");
+ //q.setString("lastName", p.id.lastName);
+ List result = q.list();
+ assertEquals( 1, result.size() );
+ Child c2 = (Child) result.get( 0 );
+ assertEquals( c2.id, c.id );
+ tx.commit();
+ s.close();
+ }
+
+ public void testImplicitCompositeFk() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Node n1 = new Node();
+ n1.setDescription( "Parent" );
+ NodePk n1pk = new NodePk();
+ n1pk.setLevel( 1 );
+ n1pk.setName( "Root" );
+ n1.setId( n1pk );
+ Node n2 = new Node();
+ NodePk n2pk = new NodePk();
+ n2pk.setLevel( 2 );
+ n2pk.setName( "Level 1: A" );
+ n2.setParent( n1 );
+ n2.setId( n2pk );
+ s.persist( n2 );
+ tx.commit();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ n2 = (Node) s.get( Node.class, n2pk );
+ assertNotNull( n2 );
+ assertNotNull( n2.getParent() );
+ assertEquals( 1, n2.getParent().getId().getLevel() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testManyToOneAndIdClass() throws Exception {
+
+ }
+
+ public void testManyToOneNonPk() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Order order = new Order();
+ order.setOrderNbr( "123" );
+ s.persist( order );
+ OrderLine ol = new OrderLine();
+ ol.setItem( "Mouse" );
+ ol.setOrder( order );
+ s.persist( ol );
+ s.flush();
+ s.clear();
+ ol = (OrderLine) s.get( OrderLine.class, ol.getId() );
+ assertNotNull( ol.getOrder() );
+ assertEquals( "123", ol.getOrder().getOrderNbr() );
+ assertTrue( ol.getOrder().getOrderLines().contains( ol ) );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testTwoManyToOneNonPk() throws Exception {
+ //2 many to one non pk pointing to the same referencedColumnName should not fail
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ org.hibernate.test.annotations.manytoone.Customer customer = new org.hibernate.test.annotations.manytoone.Customer();
+ customer.userId="123";
+ org.hibernate.test.annotations.manytoone.Customer customer2 = new org.hibernate.test.annotations.manytoone.Customer();
+ customer2.userId="124";
+ s.persist( customer2 );
+ s.persist( customer );
+ Deal deal = new Deal();
+ deal.from = customer;
+ deal.to = customer2;
+ s.persist( deal );
+ s.flush();
+ s.clear();
+ deal = (Deal) s.get( Deal.class, deal.id );
+ assertNotNull( deal.from );
+ assertNotNull( deal.to );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testFormulaOnOtherSide() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Frame frame = new Frame();
+ frame.setName( "Prada" );
+ s.persist( frame );
+ Lens l = new Lens();
+ l.setFocal( 2.5f );
+ l.setFrame( frame );
+ s.persist( l );
+ Lens r = new Lens();
+ r.setFocal( 1.2f);
+ r.setFrame( frame );
+ s.persist( r );
+ s.flush();
+ s.clear();
+ frame = (Frame) s.get( Frame.class, frame.getId() );
+ assertEquals( 2, frame.getLenses().size() );
+ assertTrue( frame.getLenses().iterator().next().getLength() <= 1/1.2f );
+ assertTrue( frame.getLenses().iterator().next().getLength() >= 1/2.5f );
+ tx.rollback();
+ s.close();
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected java.lang.Class[] getMappings() {
+ return new java.lang.Class[]{
+ Deal.class,
+ org.hibernate.test.annotations.manytoone.Customer.class,
+ Car.class,
+ Color.class,
+ Flight.class,
+ Company.class,
+ Customer.class,
+ Discount.class,
+ Ticket.class,
+ Passport.class,
+ Parent.class,
+ Child.class,
+ Node.class,
+ User.class,
+ DistrictUser.class,
+ Order.class,
+ OrderLine.class,
+ Frame.class,
+ Lens.class
+ };
+ }
+
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Node.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Node.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Node.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,68 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytoone;
-
-import java.io.Serializable;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Node implements Serializable {
-
- private NodePk id;
- private String description;
- private Node parent;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Node ) ) return false;
-
- final Node node = (Node) o;
-
- if ( !id.equals( node.id ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return id.hashCode();
- }
-
- @Id
- public NodePk getId() {
- return id;
- }
-
- public void setId(NodePk id) {
- this.id = id;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
- @JoinColumns({
- @JoinColumn(name = "parentName"),
- @JoinColumn(name = "parentLevel")
- })
- public Node getParent() {
- return parent;
- }
-
- public void setParent(Node parent) {
- this.parent = parent;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Node.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Node.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Node.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Node.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,68 @@
+//$Id$
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Node implements Serializable {
+
+ private NodePk id;
+ private String description;
+ private Node parent;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Node ) ) return false;
+
+ final Node node = (Node) o;
+
+ if ( !id.equals( node.id ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ @Id
+ public NodePk getId() {
+ return id;
+ }
+
+ public void setId(NodePk id) {
+ this.id = id;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+ @ManyToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
+ @JoinColumns({
+ @JoinColumn(name = "parentName"),
+ @JoinColumn(name = "parentLevel")
+ })
+ public Node getParent() {
+ return parent;
+ }
+
+ public void setParent(Node parent) {
+ this.parent = parent;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/NodePk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/NodePk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/NodePk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytoone;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class NodePk implements Serializable {
- private String name;
- private int level;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof NodePk ) ) return false;
-
- final NodePk nodePk = (NodePk) o;
-
- if ( level != nodePk.level ) return false;
- if ( !name.equals( nodePk.name ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = name.hashCode();
- result = 29 * result + level;
- return result;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Column(name = "fld_lvl")
- public int getLevel() {
- return level;
- }
-
- public void setLevel(int level) {
- this.level = level;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/NodePk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/NodePk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/NodePk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/NodePk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+//$Id$
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class NodePk implements Serializable {
+ private String name;
+ private int level;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof NodePk ) ) return false;
+
+ final NodePk nodePk = (NodePk) o;
+
+ if ( level != nodePk.level ) return false;
+ if ( !name.equals( nodePk.name ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = name.hashCode();
+ result = 29 * result + level;
+ return result;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Column(name = "fld_lvl")
+ public int getLevel() {
+ return level;
+ }
+
+ public void setLevel(int level) {
+ this.level = level;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Order.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Order.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Order.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import java.io.Serializable;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Column;
-import javax.persistence.Table;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name="ORDERS")
-public class Order implements Serializable {
- private Integer id;
- private String orderNbr;
- private Set<OrderLine> orderLines;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Column(name="order_nbr", unique = true)
- public String getOrderNbr() {
- return orderNbr;
- }
-
- public void setOrderNbr(String orderNbr) {
- this.orderNbr = orderNbr;
- }
-
- @OneToMany(mappedBy = "order")
- public Set<OrderLine> getOrderLines() {
- return orderLines;
- }
-
- public void setOrderLines(Set<OrderLine> orderLines) {
- this.orderLines = orderLines;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Order.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Order.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Order.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Order.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Column;
+import javax.persistence.Table;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name="ORDERS")
+public class Order implements Serializable {
+ private Integer id;
+ private String orderNbr;
+ private Set<OrderLine> orderLines;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Column(name="order_nbr", unique = true)
+ public String getOrderNbr() {
+ return orderNbr;
+ }
+
+ public void setOrderNbr(String orderNbr) {
+ this.orderNbr = orderNbr;
+ }
+
+ @OneToMany(mappedBy = "order")
+ public Set<OrderLine> getOrderLines() {
+ return orderLines;
+ }
+
+ public void setOrderLines(Set<OrderLine> orderLines) {
+ this.orderLines = orderLines;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/OrderLine.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/OrderLine.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/OrderLine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.ManyToOne;
-import javax.persistence.JoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class OrderLine {
- private Integer id;
- private String item;
- private Order order;
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getItem() {
- return item;
- }
-
- public void setItem(String item) {
- this.item = item;
- }
-
- @ManyToOne
- @JoinColumn(name="order_nbr", referencedColumnName = "order_nbr", unique = true)
- public Order getOrder() {
- return order;
- }
-
- public void setOrder(Order order) {
- this.order = order;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/OrderLine.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/OrderLine.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/OrderLine.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/OrderLine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class OrderLine {
+ private Integer id;
+ private String item;
+ private Order order;
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getItem() {
+ return item;
+ }
+
+ public void setItem(String item) {
+ this.item = item;
+ }
+
+ @ManyToOne
+ @JoinColumn(name="order_nbr", referencedColumnName = "order_nbr", unique = true)
+ public Order getOrder() {
+ return order;
+ }
+
+ public void setOrder(Order order) {
+ this.order = order;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Parent.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Parent.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytoone;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "tbl_parent")
-public class Parent implements Serializable {
- @Id
- public ParentPk id;
- public int age;
-
- public int hashCode() {
- //a NPE can occurs, but I don't expect hashcode to be used before pk is set
- return id.hashCode();
- }
-
- public boolean equals(Object obj) {
- //a NPE can occurs, but I don't expect equals to be used before pk is set
- if ( obj != null && obj instanceof Parent ) {
- return id.equals( ( (Parent) obj ).id );
- }
- else {
- return false;
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Parent.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Parent.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Parent.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "tbl_parent")
+public class Parent implements Serializable {
+ @Id
+ public ParentPk id;
+ public int age;
+
+ public int hashCode() {
+ //a NPE can occurs, but I don't expect hashcode to be used before pk is set
+ return id.hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ //a NPE can occurs, but I don't expect equals to be used before pk is set
+ if ( obj != null && obj instanceof Parent ) {
+ return id.equals( ( (Parent) obj ).id );
+ }
+ else {
+ return false;
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ParentPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ParentPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ParentPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.manytoone;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class ParentPk implements Serializable {
- @Column(length = 50)
- String firstName;
- String lastName;
-
- /**
- * is a male or a female
- */
- //show hetereogenous PK types
- boolean isMale;
-
- public int hashCode() {
- //this implem sucks
- return firstName.hashCode() + lastName.hashCode() + ( isMale ? 0 : 1 );
- }
-
- public boolean equals(Object obj) {
- //firstName and lastName are expected to be set in this implem
- if ( obj != null && obj instanceof ParentPk ) {
- ParentPk other = (ParentPk) obj;
- return firstName.equals( other.firstName )
- && lastName.equals( other.lastName )
- && isMale == other.isMale;
- }
- else {
- return false;
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ParentPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ParentPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ParentPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/ParentPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id$
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class ParentPk implements Serializable {
+ @Column(length = 50)
+ String firstName;
+ String lastName;
+
+ /**
+ * is a male or a female
+ */
+ //show hetereogenous PK types
+ boolean isMale;
+
+ public int hashCode() {
+ //this implem sucks
+ return firstName.hashCode() + lastName.hashCode() + ( isMale ? 0 : 1 );
+ }
+
+ public boolean equals(Object obj) {
+ //firstName and lastName are expected to be set in this implem
+ if ( obj != null && obj instanceof ParentPk ) {
+ ParentPk other = (ParentPk) obj;
+ return firstName.equals( other.firstName )
+ && lastName.equals( other.lastName )
+ && isMale == other.isMale;
+ }
+ else {
+ return false;
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/TreeType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/TreeType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/TreeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,61 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.manytoone;
-
-import javax.persistence.Entity;
-import javax.persistence.ManyToOne;
-import javax.persistence.JoinTable;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.JoinColumn;
-import javax.persistence.FetchType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class TreeType {
- private Integer id;
- private String name;
- private ForestType forestType;
- private ForestType alternativeForestType;
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinTable(name="Tree_Forest")
- public ForestType getForestType() {
- return forestType;
- }
-
- public void setForestType(ForestType forestType) {
- this.forestType = forestType;
- }
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinTable(name="Atl_Forest_Type",
- joinColumns = @JoinColumn(name="tree_id"),
- inverseJoinColumns = @JoinColumn(name="forest_id") )
- public ForestType getAlternativeForestType() {
- return alternativeForestType;
- }
-
- public void setAlternativeForestType(ForestType alternativeForestType) {
- this.alternativeForestType = alternativeForestType;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/TreeType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/TreeType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/TreeType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/TreeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,61 @@
+//$Id: $
+package org.hibernate.test.annotations.manytoone;
+
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinTable;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.JoinColumn;
+import javax.persistence.FetchType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class TreeType {
+ private Integer id;
+ private String name;
+ private ForestType forestType;
+ private ForestType alternativeForestType;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinTable(name="Tree_Forest")
+ public ForestType getForestType() {
+ return forestType;
+ }
+
+ public void setForestType(ForestType forestType) {
+ this.forestType = forestType;
+ }
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinTable(name="Atl_Forest_Type",
+ joinColumns = @JoinColumn(name="tree_id"),
+ inverseJoinColumns = @JoinColumn(name="forest_id") )
+ public ForestType getAlternativeForestType() {
+ return alternativeForestType;
+ }
+
+ public void setAlternativeForestType(ForestType alternativeForestType) {
+ this.alternativeForestType = alternativeForestType;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/User.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/User.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/User.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,113 +0,0 @@
-package org.hibernate.test.annotations.manytoone;
-
-import java.util.Date;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.OneToMany;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.Table;
-
- at Entity
- at Table(name = "CTVUSERS")
- at IdClass(UserPK.class)
- at SequenceGenerator(name = "UserSeq", sequenceName = "SQ_USER")
-public class User {
- @Id
- @Column(name = "CTVUSERS_KEY")
- private Long userKey;
-
- @Id
- @Column(name = "CTVUSERS_START_DATE")
- private Date startDate;
-
- @Id
- @Column(name = "CTVUSERS_END_DATE")
- private Date endDate;
-
- @Column(name = "CTVUSERS_CREATE_USERS_KEY")
- private Long createdBy;
-
- @Column(name = "CTVUSERS_CREATE_DATE")
- private Date createdOn;
-
- @Column(name = "CTVUSERS_ID")
- private String userId;
-
- @Column(name = "CTVUSERS_PREFX_KEY")
- private Integer prefix;
-
- @Column(name = "CTVUSERS_FIRST_NAME")
- private String firstName;
-
- @Column(name = "CTVUSERS_LAST_NAME1")
- private String lastName1;
-
- @Column(name = "CTVUSERS_LAST_NAME2")
- private String lastName2;
-
- @Column(name = "CTVUSERS_MIDDLE_NAME1")
- private String middleName1;
-
- @Column(name = "CTVUSERS_MIDDLE_NAME2")
- private String middleName2;
-
- @Column(name = "CTVUSERS_SUFFX_KEY")
- private Integer suffix;
-
- @Column(name = "CTVUSERS_BIRTH_DATE")
- private Date birthDate;
-
- @Column(name = "CTVUSERS_BIRTH_STATE_KEY")
- private Integer birthState;
-
- @Column(name = "CTVUSERS_BIRTH_CNTRY_KEY")
- private Integer birthCountry;
-
- @Column(name = "CTVUSERS_USERNAME")
- private String username;
-
- @Column(name = "CTVUSERS_PASSWORD")
- private String password;
-
- @Column(name = "CTVUSERS_LOTYP_KEY")
- private Integer userType;
-
- @Column(name = "CTVUSERS_PRIVL_KEY")
- private Integer privilege;
-
- @Column(name = "CTVUSERS_STATE_KEY")
- private Integer state;
-
- @Column(name = "CTVUSERS_CNTRY_KEY")
- private Integer country;
-
- @Column(name = "CTVUSERS_PREFERRED_NAME")
- private String preferredName;
-
- @Column(name = "CTVUSERS_BIRTH_PLACE")
- private String birthPlace;
-
- @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user")
- private Set<DistrictUser> districtUsers;
-
- @Column(name = "CTVUSERS_SCHOL_KEY")
- private Long school;
-
- @Column(name = "CTVUSERS_CLSTR_KEY")
- private Long cluster;
-
- @Column(name = "CTVUSERS_LDTMM_KEY")
- private Long ldtmm;
-
- @Column(name = "CTVUSERS_LDTMD_KEY")
- private Long ldtmd;
-
- @Column(name = "CTVUSERS_PMTMP_KEY")
- private Long pmtmp;
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/User.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/User.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/User.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/User.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,113 @@
+package org.hibernate.test.annotations.manytoone;
+
+import java.util.Date;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.OneToMany;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.Table;
+
+ at Entity
+ at Table(name = "CTVUSERS")
+ at IdClass(UserPK.class)
+ at SequenceGenerator(name = "UserSeq", sequenceName = "SQ_USER")
+public class User {
+ @Id
+ @Column(name = "CTVUSERS_KEY")
+ private Long userKey;
+
+ @Id
+ @Column(name = "CTVUSERS_START_DATE")
+ private Date startDate;
+
+ @Id
+ @Column(name = "CTVUSERS_END_DATE")
+ private Date endDate;
+
+ @Column(name = "CTVUSERS_CREATE_USERS_KEY")
+ private Long createdBy;
+
+ @Column(name = "CTVUSERS_CREATE_DATE")
+ private Date createdOn;
+
+ @Column(name = "CTVUSERS_ID")
+ private String userId;
+
+ @Column(name = "CTVUSERS_PREFX_KEY")
+ private Integer prefix;
+
+ @Column(name = "CTVUSERS_FIRST_NAME")
+ private String firstName;
+
+ @Column(name = "CTVUSERS_LAST_NAME1")
+ private String lastName1;
+
+ @Column(name = "CTVUSERS_LAST_NAME2")
+ private String lastName2;
+
+ @Column(name = "CTVUSERS_MIDDLE_NAME1")
+ private String middleName1;
+
+ @Column(name = "CTVUSERS_MIDDLE_NAME2")
+ private String middleName2;
+
+ @Column(name = "CTVUSERS_SUFFX_KEY")
+ private Integer suffix;
+
+ @Column(name = "CTVUSERS_BIRTH_DATE")
+ private Date birthDate;
+
+ @Column(name = "CTVUSERS_BIRTH_STATE_KEY")
+ private Integer birthState;
+
+ @Column(name = "CTVUSERS_BIRTH_CNTRY_KEY")
+ private Integer birthCountry;
+
+ @Column(name = "CTVUSERS_USERNAME")
+ private String username;
+
+ @Column(name = "CTVUSERS_PASSWORD")
+ private String password;
+
+ @Column(name = "CTVUSERS_LOTYP_KEY")
+ private Integer userType;
+
+ @Column(name = "CTVUSERS_PRIVL_KEY")
+ private Integer privilege;
+
+ @Column(name = "CTVUSERS_STATE_KEY")
+ private Integer state;
+
+ @Column(name = "CTVUSERS_CNTRY_KEY")
+ private Integer country;
+
+ @Column(name = "CTVUSERS_PREFERRED_NAME")
+ private String preferredName;
+
+ @Column(name = "CTVUSERS_BIRTH_PLACE")
+ private String birthPlace;
+
+ @OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL, mappedBy = "user")
+ private Set<DistrictUser> districtUsers;
+
+ @Column(name = "CTVUSERS_SCHOL_KEY")
+ private Long school;
+
+ @Column(name = "CTVUSERS_CLSTR_KEY")
+ private Long cluster;
+
+ @Column(name = "CTVUSERS_LDTMM_KEY")
+ private Long ldtmm;
+
+ @Column(name = "CTVUSERS_LDTMD_KEY")
+ private Long ldtmd;
+
+ @Column(name = "CTVUSERS_PMTMP_KEY")
+ private Long pmtmp;
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/UserPK.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/UserPK.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/UserPK.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-package org.hibernate.test.annotations.manytoone;
-
-import java.io.Serializable;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import javax.persistence.Column;
-
-public class UserPK implements Serializable {
- private static final long serialVersionUID = -7720874756224520523L;
- @Column(name = "CTVUSERS_KEY")
- public Long userKey;
-
- @Column(name = "CTVUSERS_START_DATE")
- public Date startDate;
-
-
- @Column(name = "CTVUSERS_END_DATE")
- public Date endDate;
-
- public UserPK() {
- }
-
- @Override
- public boolean equals(Object obj) {
- if ( !( obj instanceof UserPK ) ) {
- return false;
- }
- UserPK userPK = (UserPK) obj;
- SimpleDateFormat formatter = new SimpleDateFormat( "MM/dd/yyyy" );
- return userKey.equals( userPK.userKey ) && formatter.format( startDate )
- .equals( formatter.format( userPK.startDate ) )
- && formatter.format( endDate ).equals( formatter.format( userPK.endDate ) );
- }
-
- @Override
- public int hashCode() {
- return userKey.hashCode() * startDate.hashCode() * endDate.hashCode();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/UserPK.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/UserPK.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/UserPK.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/manytoone/UserPK.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+package org.hibernate.test.annotations.manytoone;
+
+import java.io.Serializable;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import javax.persistence.Column;
+
+public class UserPK implements Serializable {
+ private static final long serialVersionUID = -7720874756224520523L;
+ @Column(name = "CTVUSERS_KEY")
+ public Long userKey;
+
+ @Column(name = "CTVUSERS_START_DATE")
+ public Date startDate;
+
+
+ @Column(name = "CTVUSERS_END_DATE")
+ public Date endDate;
+
+ public UserPK() {
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if ( !( obj instanceof UserPK ) ) {
+ return false;
+ }
+ UserPK userPK = (UserPK) obj;
+ SimpleDateFormat formatter = new SimpleDateFormat( "MM/dd/yyyy" );
+ return userKey.equals( userPK.userKey ) && formatter.format( startDate )
+ .equals( formatter.format( userPK.startDate ) )
+ && formatter.format( endDate ).equals( formatter.format( userPK.endDate ) );
+ }
+
+ @Override
+ public int hashCode() {
+ return userKey.hashCode() * startDate.hashCode() * endDate.hashCode();
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Coin.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Coin.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Coin.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.notfound;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-import org.hibernate.annotations.NotFound;
-import org.hibernate.annotations.NotFoundAction;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Coin {
- private Integer id;
- private String name;
- private Currency currency;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne
- @JoinColumn(name = "currency", referencedColumnName = "name")
- @NotFound(action = NotFoundAction.IGNORE)
- public Currency getCurrency() {
- return currency;
- }
-
- public void setCurrency(Currency currency) {
- this.currency = currency;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Coin.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Coin.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Coin.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Coin.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+//$Id$
+package org.hibernate.test.annotations.notfound;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.NotFound;
+import org.hibernate.annotations.NotFoundAction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Coin {
+ private Integer id;
+ private String name;
+ private Currency currency;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne
+ @JoinColumn(name = "currency", referencedColumnName = "name")
+ @NotFound(action = NotFoundAction.IGNORE)
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ public void setCurrency(Currency currency) {
+ this.currency = currency;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Currency.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Currency.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Currency.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.notfound;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Currency implements Serializable {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Currency.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Currency.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Currency.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/Currency.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id$
+package org.hibernate.test.annotations.notfound;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Currency implements Serializable {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/NotFoundTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/NotFoundTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/NotFoundTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.notfound;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class NotFoundTest extends TestCase {
-
- public void testManyToOne() throws Exception {
- Currency euro = new Currency();
- euro.setName( "Euro" );
- Coin fiveC = new Coin();
- fiveC.setName( "Five cents" );
- fiveC.setCurrency( euro );
- Session s = openSession();
- s.getTransaction().begin();
- s.persist( euro );
- s.persist( fiveC );
- s.getTransaction().commit();
- s.clear();
- Transaction tx = s.beginTransaction();
- euro = (Currency) s.get( Currency.class, euro.getId() );
- s.delete( euro );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- fiveC = (Coin) s.get( Coin.class, fiveC.getId() );
- assertNull( fiveC.getCurrency() );
- s.delete( fiveC );
- tx.commit();
- s.close();
-
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Coin.class,
- Currency.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/NotFoundTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/NotFoundTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/NotFoundTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/notfound/NotFoundTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+//$Id$
+package org.hibernate.test.annotations.notfound;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class NotFoundTest extends TestCase {
+
+ public void testManyToOne() throws Exception {
+ Currency euro = new Currency();
+ euro.setName( "Euro" );
+ Coin fiveC = new Coin();
+ fiveC.setName( "Five cents" );
+ fiveC.setCurrency( euro );
+ Session s = openSession();
+ s.getTransaction().begin();
+ s.persist( euro );
+ s.persist( fiveC );
+ s.getTransaction().commit();
+ s.clear();
+ Transaction tx = s.beginTransaction();
+ euro = (Currency) s.get( Currency.class, euro.getId() );
+ s.delete( euro );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ fiveC = (Coin) s.get( Coin.class, fiveC.getId() );
+ assertNull( fiveC.getCurrency() );
+ s.delete( fiveC );
+ tx.commit();
+ s.close();
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Coin.class,
+ Currency.class
+ };
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Child.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Child.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Child.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Child implements Serializable {
- @Id
- @GeneratedValue
- public Integer id;
-
- @ManyToOne()
- @JoinColumns({
- @JoinColumn(name = "parentCivility", referencedColumnName = "isMale"),
- @JoinColumn(name = "parentLastName", referencedColumnName = "lastName"),
- @JoinColumn(name = "parentFirstName", referencedColumnName = "firstName")
- })
- public Parent parent;
- @Column(name = "fav_sup_hero")
- public String favoriteSuperhero;
- @Column(name = "fav_singer")
- public String favoriteSinger;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Child.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Child.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Child.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Child.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Child implements Serializable {
+ @Id
+ @GeneratedValue
+ public Integer id;
+
+ @ManyToOne()
+ @JoinColumns({
+ @JoinColumn(name = "parentCivility", referencedColumnName = "isMale"),
+ @JoinColumn(name = "parentLastName", referencedColumnName = "lastName"),
+ @JoinColumn(name = "parentFirstName", referencedColumnName = "firstName")
+ })
+ public Parent parent;
+ @Column(name = "fav_sup_hero")
+ public String favoriteSuperhero;
+ @Column(name = "fav_singer")
+ public String favoriteSinger;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/City.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/City.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/City.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,72 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToMany;
-import javax.persistence.OrderBy;
-
-import org.hibernate.annotations.ForeignKey;
-import org.hibernate.annotations.Immutable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-class City {
- private Integer id;
- private String name;
- private List<Street> streets;
- private List<Street> mainStreets;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @OneToMany(mappedBy = "city")
- @OrderBy("streetNameCopy, streetName, id")
- public synchronized List<Street> getStreets() {
- return streets;
- }
-
- public void setStreets(List<Street> streets) {
- this.streets = streets;
- }
-
- @OneToMany()
- @JoinColumn(name = "mainstreetcity_id")
- @ForeignKey(name = "CITYSTR_FK")
- @OrderBy
- @Immutable
- public List<Street> getMainStreets() {
- return mainStreets;
- }
-
- public void setMainStreets(List<Street> streets) {
- this.mainStreets = streets;
- }
-
- public void addMainStreet(Street street) {
- if ( mainStreets == null ) mainStreets = new ArrayList<Street>();
- mainStreets.add( street );
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/City.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/City.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/City.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/City.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,72 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+
+import org.hibernate.annotations.ForeignKey;
+import org.hibernate.annotations.Immutable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+class City {
+ private Integer id;
+ private String name;
+ private List<Street> streets;
+ private List<Street> mainStreets;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @OneToMany(mappedBy = "city")
+ @OrderBy("streetNameCopy, streetName, id")
+ public synchronized List<Street> getStreets() {
+ return streets;
+ }
+
+ public void setStreets(List<Street> streets) {
+ this.streets = streets;
+ }
+
+ @OneToMany()
+ @JoinColumn(name = "mainstreetcity_id")
+ @ForeignKey(name = "CITYSTR_FK")
+ @OrderBy
+ @Immutable
+ public List<Street> getMainStreets() {
+ return mainStreets;
+ }
+
+ public void setMainStreets(List<Street> streets) {
+ this.mainStreets = streets;
+ }
+
+ public void addMainStreet(Street street) {
+ if ( mainStreets == null ) mainStreets = new ArrayList<Street>();
+ mainStreets.add( street );
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Monkey.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Monkey.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Monkey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Monkey {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Monkey.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Monkey.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Monkey.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Monkey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Monkey {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OneToManyTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OneToManyTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OneToManyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,429 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.SortedSet;
-import java.util.TreeSet;
-import java.util.Set;
-
-import org.hibernate.Hibernate;
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.Customer;
-import org.hibernate.test.annotations.Discount;
-import org.hibernate.test.annotations.Passport;
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.test.annotations.Ticket;
-import org.hibernate.test.annotations.TicketComparator;
-
-/**
- * Test various case of a one to many relationship
- *
- * @author Emmanuel Bernard
- */
-public class OneToManyTest extends TestCase {
-
- public OneToManyTest(String x) {
- super( x );
- }
-
- public void testColumnDefinitionPropagation() throws Exception {
- Session s;
- s = openSession();
- s.getTransaction().begin();
- Politician casimir = new Politician();
- casimir.setName( "Casimir" );
- PoliticalParty dream = new PoliticalParty();
- dream.setName( "Dream" );
- dream.addPolitician( casimir );
- s.persist( dream );
- s.getTransaction().commit();
- s.clear();
-
- Transaction tx = s.beginTransaction();
- s.delete( s.get( PoliticalParty.class, dream.getName() ) );
- tx.commit();
- s.close();
- }
-
- public void testListWithBagSemanticAndOrderBy() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- City paris = new City();
- paris.setName( "Paris" );
- s.persist( paris );
- Street rochechoir = new Street();
- rochechoir.setStreetName( "Rochechoir" );
- rochechoir.setCity( paris );
- Street chmpsElysees = new Street();
- chmpsElysees.setStreetName( "Champs Elysees" );
- chmpsElysees.setCity( paris );
- Street grandeArmee = new Street();
- grandeArmee.setStreetName( "Grande Armée" );
- grandeArmee.setCity( paris );
- s.persist( rochechoir );
- s.persist( chmpsElysees );
- s.persist( grandeArmee );
- paris.addMainStreet( chmpsElysees );
- paris.addMainStreet( grandeArmee );
-
- s.flush();
- s.clear();
-
- //testing @OrderBy with explicit values including Formula
- paris = (City) s.get( City.class, paris.getId() );
- assertEquals( 3, paris.getStreets().size() );
- assertEquals( chmpsElysees.getStreetName(), paris.getStreets().get( 0 ).getStreetName() );
- List<Street> mainStreets = paris.getMainStreets();
- assertEquals( 2, mainStreets.size() );
- Integer previousId = new Integer( -1 );
- for ( Street street : mainStreets ) {
- assertTrue( previousId < street.getId() );
- previousId = street.getId();
- }
- tx.rollback();
- s.close();
-
- }
-
- public void testUnidirectionalDefault() throws Exception {
- Session s;
- Transaction tx;
- Trainer trainer = new Trainer();
- trainer.setName( "First trainer" );
- Tiger regularTiger = new Tiger();
- regularTiger.setName( "Regular Tiger" );
- Tiger whiteTiger = new Tiger();
- whiteTiger.setName( "White Tiger" );
- trainer.setTrainedTigers( new HashSet<Tiger>() );
- s = openSession();
- tx = s.beginTransaction();
- s.persist( trainer );
- s.persist( regularTiger );
- s.persist( whiteTiger );
- trainer.getTrainedTigers().add( regularTiger );
- trainer.getTrainedTigers().add( whiteTiger );
-
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- trainer = (Trainer) s.get( Trainer.class, trainer.getId() );
- assertNotNull( trainer );
- assertNotNull( trainer.getTrainedTigers() );
- assertEquals( 2, trainer.getTrainedTigers().size() );
- tx.rollback();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- trainer = new Trainer();
- trainer.setName( "new trainer" );
- trainer.setTrainedTigers( new HashSet<Tiger>() );
- trainer.getTrainedTigers().add( whiteTiger );
- try {
- s.persist( trainer );
- tx.commit();
- fail( "A one to many should not allow several trainer per Tiger" );
- }
- catch (HibernateException ce) {
- tx.rollback();
- //success
- }
- s.close();
- }
-
- public void testUnidirectionalExplicit() throws Exception {
- Session s;
- Transaction tx;
- Trainer trainer = new Trainer();
- trainer.setName( "First trainer" );
- Monkey regularMonkey = new Monkey();
- regularMonkey.setName( "Regular Monkey" );
- Monkey miniMonkey = new Monkey();
- miniMonkey.setName( "Mini Monkey" );
- trainer.setTrainedMonkeys( new HashSet<Monkey>() );
- s = openSession();
- tx = s.beginTransaction();
- s.persist( trainer );
- s.persist( regularMonkey );
- s.persist( miniMonkey );
- trainer.getTrainedMonkeys().add( regularMonkey );
- trainer.getTrainedMonkeys().add( miniMonkey );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- trainer = (Trainer) s.get( Trainer.class, trainer.getId() );
- assertNotNull( trainer );
- assertNotNull( trainer.getTrainedMonkeys() );
- assertEquals( 2, trainer.getTrainedMonkeys().size() );
- tx.rollback();
- s.close();
- }
-
- public void testFetching() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Troop t = new Troop();
- t.setName( "Final cut" );
- Soldier vandamme = new Soldier();
- vandamme.setName( "JC Vandamme" );
- t.addSoldier( vandamme );
- Soldier rambo = new Soldier();
- rambo.setName( "Rambo" );
- t.addSoldier( rambo );
- s.persist( t );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- t = (Troop) s.get( Troop.class, t.getId() );
- assertNotNull( t.getSoldiers() );
- assertFalse( Hibernate.isInitialized( t.getSoldiers() ) );
- assertEquals( 2, t.getSoldiers().size() );
- assertEquals( rambo.getName(), t.getSoldiers().iterator().next().getName() );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- t = (Troop) s.createQuery( "from " + Troop.class.getName() + " as t where t.id = :id" )
- .setParameter( "id", t.getId() ).uniqueResult();
- assertFalse( Hibernate.isInitialized( t.getSoldiers() ) );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- rambo = (Soldier) s.get( Soldier.class, rambo.getId() );
- assertTrue( Hibernate.isInitialized( rambo.getTroop() ) );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- rambo = (Soldier) s.createQuery( "from " + Soldier.class.getName() + " as s where s.id = :rid" )
- .setParameter( "rid", rambo.getId() ).uniqueResult();
- assertTrue( "fetching strategy used when we do query", Hibernate.isInitialized( rambo.getTroop() ) );
- tx.commit();
- s.close();
- }
-
- public void testCascadeDeleteOrphan() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Troop disney = new Troop();
- disney.setName( "Disney" );
- Soldier mickey = new Soldier();
- mickey.setName( "Mickey" );
- disney.addSoldier( mickey );
- s.persist( disney );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- Troop troop = (Troop) s.get( Troop.class, disney.getId() );
- Soldier soldier = (Soldier) troop.getSoldiers().iterator().next();
- tx.commit();
- s.close();
- //troop.getSoldiers().remove(soldier);
- troop.getSoldiers().clear();
- s = openSession();
- tx = s.beginTransaction();
- s.merge( troop );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- soldier = (Soldier) s.get( Soldier.class, mickey.getId() );
- assertNull( "delete-orphan should work", soldier );
- troop = (Troop) s.get( Troop.class, disney.getId() );
- s.delete( troop );
- tx.commit();
- s.close();
- }
-
- public void testCascadeDelete() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Troop disney = new Troop();
- disney.setName( "Disney" );
- Soldier mickey = new Soldier();
- mickey.setName( "Mickey" );
- disney.addSoldier( mickey );
- s.persist( disney );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- Troop troop = (Troop) s.get( Troop.class, disney.getId() );
- s.delete( troop );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- Soldier soldier = (Soldier) s.get( Soldier.class, mickey.getId() );
- assertNull( "delete-orphan should work", soldier );
- tx.commit();
- s.close();
- }
-
- public void testSimpleOneToManySet() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Ticket t = new Ticket();
- t.setNumber( "33A" );
- Ticket t2 = new Ticket();
- t2.setNumber( "234ER" );
- Customer c = new Customer();
- s.persist( c );
- //s.persist(t);
- SortedSet<Ticket> tickets = new TreeSet<Ticket>( new TicketComparator() );
- tickets.add( t );
- tickets.add( t2 );
- c.setTickets( tickets );
-
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- c = (Customer) s.load( Customer.class, c.getId() );
- assertNotNull( c );
- assertTrue( Hibernate.isInitialized( c.getTickets() ) );
- assertNotNull( c.getTickets() );
- tickets = c.getTickets();
- assertTrue( tickets.size() > 0 );
- assertEquals( t2.getNumber(), c.getTickets().first().getNumber() );
- tx.commit();
- s.close();
- }
-
- public void testSimpleOneToManyCollection() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Discount d = new Discount();
- d.setDiscount( 10 );
- Customer c = new Customer();
- List discounts = new ArrayList();
- discounts.add( d );
- d.setOwner( c );
- c.setDiscountTickets( discounts );
- s.persist( c );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- c = (Customer) s.load( Customer.class, c.getId() );
- assertNotNull( c );
- assertFalse( Hibernate.isInitialized( c.getDiscountTickets() ) );
- assertNotNull( c.getDiscountTickets() );
- Collection collecDiscount = c.getDiscountTickets();
- assertTrue( collecDiscount.size() > 0 );
- tx.commit();
- s.close();
- }
-
- public void testJoinColumns() throws Exception {
- Parent parent = new Parent();
- ParentPk pk = new ParentPk();
- pk.firstName = "Bruce";
- pk.lastName = "Willis";
- pk.isMale = true;
- parent.id = pk;
- parent.age = 40;
- Child child = new Child();
- Child child2 = new Child();
- parent.addChild( child );
- parent.addChild( child2 );
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( parent );
- tx.commit();
- s.close();
-
- assertNotNull( child.id );
- assertNotNull( child2.id );
- assertNotSame( child.id, child2.id );
-
- s = openSession();
- tx = s.beginTransaction();
- parent = (Parent) s.get( Parent.class, pk );
- assertNotNull( parent.children );
- Hibernate.initialize( parent.children );
- assertEquals( 2, parent.children.size() );
- tx.commit();
- s.close();
- }
-
- public void testOrderByOnSuperclassProperty() {
- OrganisationUser user = new OrganisationUser();
- user.setFirstName( "Emmanuel" );
- user.setLastName( "Bernard" );
- user.setIdPerson( new Long(1) );
- user.setSomeText( "SomeText" );
- Organisation org = new Organisation();
- org.setIdOrganisation( new Long(1) );
- org.setName( "S Diego Zoo" );
- user.setOrganisation( org );
- Session s = openSession();
- s.getTransaction().begin();
- s.persist( user );
- s.persist( org );
- s.flush();
- s.clear();
- List l = s.createQuery( "select org from Organisation org left join fetch org.organisationUsers" ).list();
- s.getTransaction().rollback();
- s.close();
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- Troop.class,
- Soldier.class,
- Customer.class,
- Ticket.class,
- Discount.class,
- Passport.class,
- Parent.class,
- Child.class,
- Trainer.class,
- Tiger.class,
- Monkey.class,
- City.class,
- Street.class,
- PoliticalParty.class,
- Politician.class,
- Person.class,
- Organisation.class,
- OrganisationUser.class
- };
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OneToManyTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OneToManyTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OneToManyTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OneToManyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,429 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.SortedSet;
+import java.util.TreeSet;
+import java.util.Set;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.Customer;
+import org.hibernate.test.annotations.Discount;
+import org.hibernate.test.annotations.Passport;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.Ticket;
+import org.hibernate.test.annotations.TicketComparator;
+
+/**
+ * Test various case of a one to many relationship
+ *
+ * @author Emmanuel Bernard
+ */
+public class OneToManyTest extends TestCase {
+
+ public OneToManyTest(String x) {
+ super( x );
+ }
+
+ public void testColumnDefinitionPropagation() throws Exception {
+ Session s;
+ s = openSession();
+ s.getTransaction().begin();
+ Politician casimir = new Politician();
+ casimir.setName( "Casimir" );
+ PoliticalParty dream = new PoliticalParty();
+ dream.setName( "Dream" );
+ dream.addPolitician( casimir );
+ s.persist( dream );
+ s.getTransaction().commit();
+ s.clear();
+
+ Transaction tx = s.beginTransaction();
+ s.delete( s.get( PoliticalParty.class, dream.getName() ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testListWithBagSemanticAndOrderBy() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ City paris = new City();
+ paris.setName( "Paris" );
+ s.persist( paris );
+ Street rochechoir = new Street();
+ rochechoir.setStreetName( "Rochechoir" );
+ rochechoir.setCity( paris );
+ Street chmpsElysees = new Street();
+ chmpsElysees.setStreetName( "Champs Elysees" );
+ chmpsElysees.setCity( paris );
+ Street grandeArmee = new Street();
+ grandeArmee.setStreetName( "Grande Armée" );
+ grandeArmee.setCity( paris );
+ s.persist( rochechoir );
+ s.persist( chmpsElysees );
+ s.persist( grandeArmee );
+ paris.addMainStreet( chmpsElysees );
+ paris.addMainStreet( grandeArmee );
+
+ s.flush();
+ s.clear();
+
+ //testing @OrderBy with explicit values including Formula
+ paris = (City) s.get( City.class, paris.getId() );
+ assertEquals( 3, paris.getStreets().size() );
+ assertEquals( chmpsElysees.getStreetName(), paris.getStreets().get( 0 ).getStreetName() );
+ List<Street> mainStreets = paris.getMainStreets();
+ assertEquals( 2, mainStreets.size() );
+ Integer previousId = new Integer( -1 );
+ for ( Street street : mainStreets ) {
+ assertTrue( previousId < street.getId() );
+ previousId = street.getId();
+ }
+ tx.rollback();
+ s.close();
+
+ }
+
+ public void testUnidirectionalDefault() throws Exception {
+ Session s;
+ Transaction tx;
+ Trainer trainer = new Trainer();
+ trainer.setName( "First trainer" );
+ Tiger regularTiger = new Tiger();
+ regularTiger.setName( "Regular Tiger" );
+ Tiger whiteTiger = new Tiger();
+ whiteTiger.setName( "White Tiger" );
+ trainer.setTrainedTigers( new HashSet<Tiger>() );
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( trainer );
+ s.persist( regularTiger );
+ s.persist( whiteTiger );
+ trainer.getTrainedTigers().add( regularTiger );
+ trainer.getTrainedTigers().add( whiteTiger );
+
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ trainer = (Trainer) s.get( Trainer.class, trainer.getId() );
+ assertNotNull( trainer );
+ assertNotNull( trainer.getTrainedTigers() );
+ assertEquals( 2, trainer.getTrainedTigers().size() );
+ tx.rollback();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ trainer = new Trainer();
+ trainer.setName( "new trainer" );
+ trainer.setTrainedTigers( new HashSet<Tiger>() );
+ trainer.getTrainedTigers().add( whiteTiger );
+ try {
+ s.persist( trainer );
+ tx.commit();
+ fail( "A one to many should not allow several trainer per Tiger" );
+ }
+ catch (HibernateException ce) {
+ tx.rollback();
+ //success
+ }
+ s.close();
+ }
+
+ public void testUnidirectionalExplicit() throws Exception {
+ Session s;
+ Transaction tx;
+ Trainer trainer = new Trainer();
+ trainer.setName( "First trainer" );
+ Monkey regularMonkey = new Monkey();
+ regularMonkey.setName( "Regular Monkey" );
+ Monkey miniMonkey = new Monkey();
+ miniMonkey.setName( "Mini Monkey" );
+ trainer.setTrainedMonkeys( new HashSet<Monkey>() );
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( trainer );
+ s.persist( regularMonkey );
+ s.persist( miniMonkey );
+ trainer.getTrainedMonkeys().add( regularMonkey );
+ trainer.getTrainedMonkeys().add( miniMonkey );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ trainer = (Trainer) s.get( Trainer.class, trainer.getId() );
+ assertNotNull( trainer );
+ assertNotNull( trainer.getTrainedMonkeys() );
+ assertEquals( 2, trainer.getTrainedMonkeys().size() );
+ tx.rollback();
+ s.close();
+ }
+
+ public void testFetching() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Troop t = new Troop();
+ t.setName( "Final cut" );
+ Soldier vandamme = new Soldier();
+ vandamme.setName( "JC Vandamme" );
+ t.addSoldier( vandamme );
+ Soldier rambo = new Soldier();
+ rambo.setName( "Rambo" );
+ t.addSoldier( rambo );
+ s.persist( t );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ t = (Troop) s.get( Troop.class, t.getId() );
+ assertNotNull( t.getSoldiers() );
+ assertFalse( Hibernate.isInitialized( t.getSoldiers() ) );
+ assertEquals( 2, t.getSoldiers().size() );
+ assertEquals( rambo.getName(), t.getSoldiers().iterator().next().getName() );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ t = (Troop) s.createQuery( "from " + Troop.class.getName() + " as t where t.id = :id" )
+ .setParameter( "id", t.getId() ).uniqueResult();
+ assertFalse( Hibernate.isInitialized( t.getSoldiers() ) );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ rambo = (Soldier) s.get( Soldier.class, rambo.getId() );
+ assertTrue( Hibernate.isInitialized( rambo.getTroop() ) );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ rambo = (Soldier) s.createQuery( "from " + Soldier.class.getName() + " as s where s.id = :rid" )
+ .setParameter( "rid", rambo.getId() ).uniqueResult();
+ assertTrue( "fetching strategy used when we do query", Hibernate.isInitialized( rambo.getTroop() ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCascadeDeleteOrphan() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Troop disney = new Troop();
+ disney.setName( "Disney" );
+ Soldier mickey = new Soldier();
+ mickey.setName( "Mickey" );
+ disney.addSoldier( mickey );
+ s.persist( disney );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ Troop troop = (Troop) s.get( Troop.class, disney.getId() );
+ Soldier soldier = (Soldier) troop.getSoldiers().iterator().next();
+ tx.commit();
+ s.close();
+ //troop.getSoldiers().remove(soldier);
+ troop.getSoldiers().clear();
+ s = openSession();
+ tx = s.beginTransaction();
+ s.merge( troop );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ soldier = (Soldier) s.get( Soldier.class, mickey.getId() );
+ assertNull( "delete-orphan should work", soldier );
+ troop = (Troop) s.get( Troop.class, disney.getId() );
+ s.delete( troop );
+ tx.commit();
+ s.close();
+ }
+
+ public void testCascadeDelete() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Troop disney = new Troop();
+ disney.setName( "Disney" );
+ Soldier mickey = new Soldier();
+ mickey.setName( "Mickey" );
+ disney.addSoldier( mickey );
+ s.persist( disney );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ Troop troop = (Troop) s.get( Troop.class, disney.getId() );
+ s.delete( troop );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ Soldier soldier = (Soldier) s.get( Soldier.class, mickey.getId() );
+ assertNull( "delete-orphan should work", soldier );
+ tx.commit();
+ s.close();
+ }
+
+ public void testSimpleOneToManySet() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Ticket t = new Ticket();
+ t.setNumber( "33A" );
+ Ticket t2 = new Ticket();
+ t2.setNumber( "234ER" );
+ Customer c = new Customer();
+ s.persist( c );
+ //s.persist(t);
+ SortedSet<Ticket> tickets = new TreeSet<Ticket>( new TicketComparator() );
+ tickets.add( t );
+ tickets.add( t2 );
+ c.setTickets( tickets );
+
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ c = (Customer) s.load( Customer.class, c.getId() );
+ assertNotNull( c );
+ assertTrue( Hibernate.isInitialized( c.getTickets() ) );
+ assertNotNull( c.getTickets() );
+ tickets = c.getTickets();
+ assertTrue( tickets.size() > 0 );
+ assertEquals( t2.getNumber(), c.getTickets().first().getNumber() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testSimpleOneToManyCollection() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Discount d = new Discount();
+ d.setDiscount( 10 );
+ Customer c = new Customer();
+ List discounts = new ArrayList();
+ discounts.add( d );
+ d.setOwner( c );
+ c.setDiscountTickets( discounts );
+ s.persist( c );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ c = (Customer) s.load( Customer.class, c.getId() );
+ assertNotNull( c );
+ assertFalse( Hibernate.isInitialized( c.getDiscountTickets() ) );
+ assertNotNull( c.getDiscountTickets() );
+ Collection collecDiscount = c.getDiscountTickets();
+ assertTrue( collecDiscount.size() > 0 );
+ tx.commit();
+ s.close();
+ }
+
+ public void testJoinColumns() throws Exception {
+ Parent parent = new Parent();
+ ParentPk pk = new ParentPk();
+ pk.firstName = "Bruce";
+ pk.lastName = "Willis";
+ pk.isMale = true;
+ parent.id = pk;
+ parent.age = 40;
+ Child child = new Child();
+ Child child2 = new Child();
+ parent.addChild( child );
+ parent.addChild( child2 );
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( parent );
+ tx.commit();
+ s.close();
+
+ assertNotNull( child.id );
+ assertNotNull( child2.id );
+ assertNotSame( child.id, child2.id );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ parent = (Parent) s.get( Parent.class, pk );
+ assertNotNull( parent.children );
+ Hibernate.initialize( parent.children );
+ assertEquals( 2, parent.children.size() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testOrderByOnSuperclassProperty() {
+ OrganisationUser user = new OrganisationUser();
+ user.setFirstName( "Emmanuel" );
+ user.setLastName( "Bernard" );
+ user.setIdPerson( new Long(1) );
+ user.setSomeText( "SomeText" );
+ Organisation org = new Organisation();
+ org.setIdOrganisation( new Long(1) );
+ org.setName( "S Diego Zoo" );
+ user.setOrganisation( org );
+ Session s = openSession();
+ s.getTransaction().begin();
+ s.persist( user );
+ s.persist( org );
+ s.flush();
+ s.clear();
+ List l = s.createQuery( "select org from Organisation org left join fetch org.organisationUsers" ).list();
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ Troop.class,
+ Soldier.class,
+ Customer.class,
+ Ticket.class,
+ Discount.class,
+ Passport.class,
+ Parent.class,
+ Child.class,
+ Trainer.class,
+ Tiger.class,
+ Monkey.class,
+ City.class,
+ Street.class,
+ PoliticalParty.class,
+ Politician.class,
+ Person.class,
+ Organisation.class,
+ OrganisationUser.class
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Organisation.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Organisation.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Organisation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,60 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.onetomany;
-
-import java.io.Serializable;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.Table;
-import javax.persistence.Column;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-import javax.persistence.OrderBy;
-import javax.persistence.CascadeType;
-import javax.persistence.FetchType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table( name = "ORGANISATION" )
-public class Organisation implements Serializable {
-
- private Long idOrganisation;
- private String name;
- private Set<OrganisationUser> organisationUsers;
-
- public Organisation() {
- }
-
- public void setIdOrganisation(Long idOrganisation) {
- this.idOrganisation = idOrganisation;
- }
-
- @Id
- @Column( name = "id_organisation", nullable = false )
- public Long getIdOrganisation() {
- return idOrganisation;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Column( name = "name", nullable = false, length = 40 )
- public String getName() {
- return name;
- }
-
- public void setOrganisationUsers(Set<OrganisationUser> organisationUsers) {
- this.organisationUsers = organisationUsers;
- }
-
- @OneToMany( mappedBy = "organisation",
- fetch = FetchType.LAZY,
- cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
- @OrderBy( value = "firstName" )
- public Set<OrganisationUser> getOrganisationUsers() {
- return organisationUsers;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Organisation.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Organisation.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Organisation.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Organisation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,60 @@
+//$Id: $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.OrderBy;
+import javax.persistence.CascadeType;
+import javax.persistence.FetchType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table( name = "ORGANISATION" )
+public class Organisation implements Serializable {
+
+ private Long idOrganisation;
+ private String name;
+ private Set<OrganisationUser> organisationUsers;
+
+ public Organisation() {
+ }
+
+ public void setIdOrganisation(Long idOrganisation) {
+ this.idOrganisation = idOrganisation;
+ }
+
+ @Id
+ @Column( name = "id_organisation", nullable = false )
+ public Long getIdOrganisation() {
+ return idOrganisation;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Column( name = "name", nullable = false, length = 40 )
+ public String getName() {
+ return name;
+ }
+
+ public void setOrganisationUsers(Set<OrganisationUser> organisationUsers) {
+ this.organisationUsers = organisationUsers;
+ }
+
+ @OneToMany( mappedBy = "organisation",
+ fetch = FetchType.LAZY,
+ cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
+ @OrderBy( value = "firstName" )
+ public Set<OrganisationUser> getOrganisationUsers() {
+ return organisationUsers;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OrganisationUser.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OrganisationUser.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OrganisationUser.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,46 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.onetomany;
-
-import java.io.Serializable;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.PrimaryKeyJoinColumn;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at PrimaryKeyJoinColumn( name = "id_organisation_user" )
- at Table( name = "ORGANISATION_USER" )
-public class OrganisationUser extends Person implements Serializable {
-
- private String someText;
- private Organisation organisation;
-
- public OrganisationUser() {
- }
-
- public void setSomeText(String someText) {
- this.someText = someText;
- }
-
- @Column( name = "some_text", nullable=true,length=1024)
- public String getSomeText() {
- return someText;
- }
-
- public void setOrganisation(Organisation organisation) {
- this.organisation = organisation;
- }
-
- @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
- @JoinColumn( name = "fk_id_organisation", nullable = false )
- public Organisation getOrganisation() {
- return organisation;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OrganisationUser.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OrganisationUser.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OrganisationUser.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/OrganisationUser.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,46 @@
+//$Id: $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at PrimaryKeyJoinColumn( name = "id_organisation_user" )
+ at Table( name = "ORGANISATION_USER" )
+public class OrganisationUser extends Person implements Serializable {
+
+ private String someText;
+ private Organisation organisation;
+
+ public OrganisationUser() {
+ }
+
+ public void setSomeText(String someText) {
+ this.someText = someText;
+ }
+
+ @Column( name = "some_text", nullable=true,length=1024)
+ public String getSomeText() {
+ return someText;
+ }
+
+ public void setOrganisation(Organisation organisation) {
+ this.organisation = organisation;
+ }
+
+ @ManyToOne( cascade = {CascadeType.PERSIST, CascadeType.MERGE} )
+ @JoinColumn( name = "fk_id_organisation", nullable = false )
+ public Organisation getOrganisation() {
+ return organisation;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Parent.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Parent.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-import org.hibernate.annotations.BatchSize;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Parent implements Serializable {
- @Id
- public ParentPk id;
- public int age;
-
- @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
- @BatchSize(size = 5)
- @javax.persistence.OrderBy("favoriteSuperhero asc, favoriteSinger desc")
- public Set<Child> children;
-
- public int hashCode() {
- //a NPE can occurs, but I don't expect hashcode to be used before pk is set
- return id.hashCode();
- }
-
- public boolean equals(Object obj) {
- //a NPE can occurs, but I don't expect equals to be used before pk is set
- if ( obj != null && obj instanceof Parent ) {
- return id.equals( ( (Parent) obj ).id );
- }
- else {
- return false;
- }
- }
-
- public void addChild(Child child) {
- if ( children == null ) {
- children = new HashSet();
- }
- child.parent = this;
- children.add( child );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Parent.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Parent.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Parent.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.BatchSize;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Parent implements Serializable {
+ @Id
+ public ParentPk id;
+ public int age;
+
+ @OneToMany(cascade = CascadeType.ALL, mappedBy = "parent")
+ @BatchSize(size = 5)
+ @javax.persistence.OrderBy("favoriteSuperhero asc, favoriteSinger desc")
+ public Set<Child> children;
+
+ public int hashCode() {
+ //a NPE can occurs, but I don't expect hashcode to be used before pk is set
+ return id.hashCode();
+ }
+
+ public boolean equals(Object obj) {
+ //a NPE can occurs, but I don't expect equals to be used before pk is set
+ if ( obj != null && obj instanceof Parent ) {
+ return id.equals( ( (Parent) obj ).id );
+ }
+ else {
+ return false;
+ }
+ }
+
+ public void addChild(Child child) {
+ if ( children == null ) {
+ children = new HashSet();
+ }
+ child.parent = this;
+ children.add( child );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/ParentPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/ParentPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/ParentPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class ParentPk implements Serializable {
- String firstName;
- String lastName;
-
- /**
- * is a male or a female
- */
- //show hetereogenous PK types
- boolean isMale;
-
- public int hashCode() {
- //this implem sucks
- return firstName.hashCode() + lastName.hashCode() + ( isMale ? 0 : 1 );
- }
-
- public boolean equals(Object obj) {
- //firstName and lastName are expected to be set in this implem
- if ( obj != null && obj instanceof ParentPk ) {
- ParentPk other = (ParentPk) obj;
- return firstName.equals( other.firstName )
- && lastName.equals( other.lastName )
- && isMale == other.isMale;
- }
- else {
- return false;
- }
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/ParentPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/ParentPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/ParentPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/ParentPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class ParentPk implements Serializable {
+ String firstName;
+ String lastName;
+
+ /**
+ * is a male or a female
+ */
+ //show hetereogenous PK types
+ boolean isMale;
+
+ public int hashCode() {
+ //this implem sucks
+ return firstName.hashCode() + lastName.hashCode() + ( isMale ? 0 : 1 );
+ }
+
+ public boolean equals(Object obj) {
+ //firstName and lastName are expected to be set in this implem
+ if ( obj != null && obj instanceof ParentPk ) {
+ ParentPk other = (ParentPk) obj;
+ return firstName.equals( other.firstName )
+ && lastName.equals( other.lastName )
+ && isMale == other.isMale;
+ }
+ else {
+ return false;
+ }
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Person.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Person.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Person.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,55 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.onetomany;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Id;
-import javax.persistence.Entity;
-import javax.persistence.Table;
-import javax.persistence.InheritanceType;
-import javax.persistence.Inheritance;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance( strategy = InheritanceType.JOINED )
- at Table( name = "PERSON_Orderby" )
-public class Person implements Serializable {
-
- private Long idPerson;
- private String firstName, lastName;
-
- public Person() {
- }
-
- public void setIdPerson(Long idPerson) {
- this.idPerson = idPerson;
- }
-
- @Id
- @Column( name = "id_person", nullable = false )
- public Long getIdPerson() {
- return idPerson;
- }
-
- public void setFirstName(String firstName) {
- this.firstName = firstName;
- }
-
- @Column( name = "first_name", length = 40, nullable = false )
- public String getFirstName() {
- return firstName;
- }
-
- public void setLastName(String lastName) {
- this.lastName = lastName;
- }
-
- @Column( name = "last_name", length = 40, nullable = false )
- public String getLastName() {
- return lastName;
- }
-
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Person.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Person.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Person.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Person.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,55 @@
+//$Id: $
+package org.hibernate.test.annotations.onetomany;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Id;
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.InheritanceType;
+import javax.persistence.Inheritance;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance( strategy = InheritanceType.JOINED )
+ at Table( name = "PERSON_Orderby" )
+public class Person implements Serializable {
+
+ private Long idPerson;
+ private String firstName, lastName;
+
+ public Person() {
+ }
+
+ public void setIdPerson(Long idPerson) {
+ this.idPerson = idPerson;
+ }
+
+ @Id
+ @Column( name = "id_person", nullable = false )
+ public Long getIdPerson() {
+ return idPerson;
+ }
+
+ public void setFirstName(String firstName) {
+ this.firstName = firstName;
+ }
+
+ @Column( name = "first_name", length = 40, nullable = false )
+ public String getFirstName() {
+ return firstName;
+ }
+
+ public void setLastName(String lastName) {
+ this.lastName = lastName;
+ }
+
+ @Column( name = "last_name", length = 40, nullable = false )
+ public String getLastName() {
+ return lastName;
+ }
+
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/PoliticalParty.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/PoliticalParty.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/PoliticalParty.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class PoliticalParty {
- private String name;
- private Set<Politician> politicians = new HashSet<Politician>();
-
- @Id
- @Column(columnDefinition = "VARCHAR(60)")
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @OneToMany(mappedBy = "party", cascade = CascadeType.ALL)
- public Set<Politician> getPoliticians() {
- return politicians;
- }
-
- public void setPoliticians(Set<Politician> politicians) {
- this.politicians = politicians;
- }
-
- public void addPolitician(Politician politician) {
- politicians.add( politician );
- politician.setParty( this );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/PoliticalParty.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/PoliticalParty.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/PoliticalParty.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/PoliticalParty.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PoliticalParty {
+ private String name;
+ private Set<Politician> politicians = new HashSet<Politician>();
+
+ @Id
+ @Column(columnDefinition = "VARCHAR(60)")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @OneToMany(mappedBy = "party", cascade = CascadeType.ALL)
+ public Set<Politician> getPoliticians() {
+ return politicians;
+ }
+
+ public void setPoliticians(Set<Politician> politicians) {
+ this.politicians = politicians;
+ }
+
+ public void addPolitician(Politician politician) {
+ politicians.add( politician );
+ politician.setParty( this );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Politician.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Politician.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Politician.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,37 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Politician {
- private String name;
- private PoliticalParty party;
-
- @Id
- @Column(columnDefinition = "VARCHAR(30)")
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne
- @JoinColumn(name = "party_fk")
- public PoliticalParty getParty() {
- return party;
- }
-
- public void setParty(PoliticalParty party) {
- this.party = party;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Politician.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Politician.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Politician.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Politician.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,37 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Politician {
+ private String name;
+ private PoliticalParty party;
+
+ @Id
+ @Column(columnDefinition = "VARCHAR(30)")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne
+ @JoinColumn(name = "party_fk")
+ public PoliticalParty getParty() {
+ return party;
+ }
+
+ public void setParty(PoliticalParty party) {
+ this.party = party;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Soldier.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Soldier.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Soldier.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,62 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Soldier {
- private Integer id;
- private String name;
- private Troop troop;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne(fetch = FetchType.EAGER)
- @JoinColumn(name = "troop_fk")
- public Troop getTroop() {
- return troop;
- }
-
- public void setTroop(Troop troop) {
- this.troop = troop;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Soldier ) ) return false;
-
- final Soldier soldier = (Soldier) o;
-
- if ( !name.equals( soldier.name ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return name.hashCode();
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Soldier.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Soldier.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Soldier.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Soldier.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,62 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Soldier {
+ private Integer id;
+ private String name;
+ private Troop troop;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne(fetch = FetchType.EAGER)
+ @JoinColumn(name = "troop_fk")
+ public Troop getTroop() {
+ return troop;
+ }
+
+ public void setTroop(Troop troop) {
+ this.troop = troop;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Soldier ) ) return false;
+
+ final Soldier soldier = (Soldier) o;
+
+ if ( !name.equals( soldier.name ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Street.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Street.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Street.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.Column;
-
-import org.hibernate.annotations.Formula;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Street {
- private Integer id;
- private String streetName;
- private String streetNameCopy;
- private City city;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Column(name="STREET_NAME")
- public String getStreetName() {
- return streetName;
- }
-
- public void setStreetName(String streetName) {
- this.streetName = streetName;
- }
-
- @Formula("STREET_NAME")
- public String getStreetNameCopy() {
- return streetNameCopy;
- }
-
- public void setStreetNameCopy(String streetNameCopy) {
- this.streetNameCopy = streetNameCopy;
- }
-
- @ManyToOne
- public City getCity() {
- return city;
- }
-
- public void setCity(City city) {
- this.city = city;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Street.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Street.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Street.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Street.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.Column;
+
+import org.hibernate.annotations.Formula;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Street {
+ private Integer id;
+ private String streetName;
+ private String streetNameCopy;
+ private City city;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Column(name="STREET_NAME")
+ public String getStreetName() {
+ return streetName;
+ }
+
+ public void setStreetName(String streetName) {
+ this.streetName = streetName;
+ }
+
+ @Formula("STREET_NAME")
+ public String getStreetNameCopy() {
+ return streetNameCopy;
+ }
+
+ public void setStreetNameCopy(String streetNameCopy) {
+ this.streetNameCopy = streetNameCopy;
+ }
+
+ @ManyToOne
+ public City getCity() {
+ return city;
+ }
+
+ public void setCity(City city) {
+ this.city = city;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Tiger.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Tiger.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Tiger.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Tiger {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Tiger.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Tiger.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Tiger.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Tiger.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Tiger {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Trainer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Trainer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Trainer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,67 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.OneToMany;
-
-import org.hibernate.annotations.ForeignKey;
-
-/**
- * Unidirectional one to many sample
- *
- * @author Emmanuel Bernard
- */
- at Entity()
-public class Trainer {
- private Integer id;
- private String name;
- private Set<Tiger> trainedTigers;
- private Set<Monkey> trainedMonkeys;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @OneToMany
- public Set<Tiger> getTrainedTigers() {
- return trainedTigers;
- }
-
- public void setTrainedTigers(Set<Tiger> trainedTigers) {
- this.trainedTigers = trainedTigers;
- }
-
- @OneToMany
- @JoinTable(
- name = "TrainedMonkeys",
- joinColumns = {@JoinColumn(name = "trainer_id")},
- inverseJoinColumns = @JoinColumn(name = "monkey_id")
- )
- @ForeignKey(name = "TM_TRA_FK", inverseName = "TM_MON_FK")
- public Set<Monkey> getTrainedMonkeys() {
- return trainedMonkeys;
- }
-
- public void setTrainedMonkeys(Set<Monkey> trainedMonkeys) {
- this.trainedMonkeys = trainedMonkeys;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Trainer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Trainer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Trainer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Trainer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,67 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.ForeignKey;
+
+/**
+ * Unidirectional one to many sample
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity()
+public class Trainer {
+ private Integer id;
+ private String name;
+ private Set<Tiger> trainedTigers;
+ private Set<Monkey> trainedMonkeys;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @OneToMany
+ public Set<Tiger> getTrainedTigers() {
+ return trainedTigers;
+ }
+
+ public void setTrainedTigers(Set<Tiger> trainedTigers) {
+ this.trainedTigers = trainedTigers;
+ }
+
+ @OneToMany
+ @JoinTable(
+ name = "TrainedMonkeys",
+ joinColumns = {@JoinColumn(name = "trainer_id")},
+ inverseJoinColumns = @JoinColumn(name = "monkey_id")
+ )
+ @ForeignKey(name = "TM_TRA_FK", inverseName = "TM_MON_FK")
+ public Set<Monkey> getTrainedMonkeys() {
+ return trainedMonkeys;
+ }
+
+ public void setTrainedMonkeys(Set<Monkey> trainedMonkeys) {
+ this.trainedMonkeys = trainedMonkeys;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Troop.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Troop.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Troop.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,64 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetomany;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-import org.hibernate.annotations.OnDelete;
-import org.hibernate.annotations.OnDeleteAction;
-import org.hibernate.annotations.OrderBy;
-
-/**
- * Shows a default one to many
- *
- * @author Emmanuel Bernard
- */
- at Entity
-public class Troop {
- private Integer id;
- private String name;
- private Set<Soldier> soldiers;
-
- @OneToMany(mappedBy = "troop", cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
- @OrderBy(clause = "name desc")
- @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
- @OnDelete(action = OnDeleteAction.CASCADE)
- public Set<Soldier> getSoldiers() {
- return soldiers;
- }
-
- public void setSoldiers(Set<Soldier> soldiers) {
- this.soldiers = soldiers;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void addSoldier(Soldier s) {
- if ( soldiers == null ) soldiers = new HashSet<Soldier>();
- soldiers.add( s );
- s.setTroop( this );
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Troop.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Troop.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Troop.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetomany/Troop.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,64 @@
+//$Id$
+package org.hibernate.test.annotations.onetomany;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.OnDelete;
+import org.hibernate.annotations.OnDeleteAction;
+import org.hibernate.annotations.OrderBy;
+
+/**
+ * Shows a default one to many
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Troop {
+ private Integer id;
+ private String name;
+ private Set<Soldier> soldiers;
+
+ @OneToMany(mappedBy = "troop", cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
+ @OrderBy(clause = "name desc")
+ @org.hibernate.annotations.Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
+ @OnDelete(action = OnDeleteAction.CASCADE)
+ public Set<Soldier> getSoldiers() {
+ return soldiers;
+ }
+
+ public void setSoldiers(Set<Soldier> soldiers) {
+ this.soldiers = soldiers;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void addSoldier(Soldier s) {
+ if ( soldiers == null ) soldiers = new HashSet<Soldier>();
+ soldiers.add( s );
+ s.setTroop( this );
+ }
+
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Address.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Address.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Address {
-
- private Integer id;
- private String city;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Address.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Address.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Address.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Address {
+
+ private Integer id;
+ private String city;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Body.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Body.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Body.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-import javax.persistence.PrimaryKeyJoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Body {
- private Integer id;
- private Heart heart;
-
- @OneToOne
- @PrimaryKeyJoinColumn
- public Heart getHeart() {
- return heart;
- }
-
- public void setHeart(Heart heart) {
- this.heart = heart;
- }
-
- @Id
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Body.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Body.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Body.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Body.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Body {
+ private Integer id;
+ private Heart heart;
+
+ @OneToOne
+ @PrimaryKeyJoinColumn
+ public Heart getHeart() {
+ return heart;
+ }
+
+ public void setHeart(Heart heart) {
+ this.heart = heart;
+ }
+
+ @Id
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Client.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Client.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Client.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Client {
-
- private Integer id;
- private String name;
- private Address address;
-
- @OneToOne(cascade = CascadeType.ALL)
- @JoinColumn(name = "ADDRESS_ID")
- public Address getAddress() {
- return address;
- }
-
- public void setAddress(Address address) {
- this.address = address;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Client.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Client.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Client.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Client.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Client {
+
+ private Integer id;
+ private String name;
+ private Address address;
+
+ @OneToOne(cascade = CascadeType.ALL)
+ @JoinColumn(name = "ADDRESS_ID")
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Computer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Computer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Computer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,73 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.OneToOne;
-
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Computer {
-
- private ComputerPk id;
- private String cpu;
- private SerialNumber serial;
-
- @OneToOne(cascade = {CascadeType.PERSIST})
- @JoinColumns({
- @JoinColumn(name = "serialbrand", referencedColumnName = "brand"),
- @JoinColumn(name = "serialmodel", referencedColumnName = "model")
- })
- public SerialNumber getSerial() {
- return serial;
- }
-
- public void setSerial(SerialNumber serial) {
- this.serial = serial;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Computer ) ) return false;
-
- final Computer computer = (Computer) o;
-
- if ( !id.equals( computer.id ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return id.hashCode();
- }
-
- @EmbeddedId
- @AttributeOverrides({
- @AttributeOverride(name = "brand", column = @Column(name = "computer_brand")),
- @AttributeOverride(name = "model", column = @Column(name = "computer_model"))
- })
- public ComputerPk getId() {
- return id;
- }
-
- public void setId(ComputerPk id) {
- this.id = id;
- }
-
- public String getCpu() {
- return cpu;
- }
-
- public void setCpu(String cpu) {
- this.cpu = cpu;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Computer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Computer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Computer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Computer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,73 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.OneToOne;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Computer {
+
+ private ComputerPk id;
+ private String cpu;
+ private SerialNumber serial;
+
+ @OneToOne(cascade = {CascadeType.PERSIST})
+ @JoinColumns({
+ @JoinColumn(name = "serialbrand", referencedColumnName = "brand"),
+ @JoinColumn(name = "serialmodel", referencedColumnName = "model")
+ })
+ public SerialNumber getSerial() {
+ return serial;
+ }
+
+ public void setSerial(SerialNumber serial) {
+ this.serial = serial;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Computer ) ) return false;
+
+ final Computer computer = (Computer) o;
+
+ if ( !id.equals( computer.id ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ @EmbeddedId
+ @AttributeOverrides({
+ @AttributeOverride(name = "brand", column = @Column(name = "computer_brand")),
+ @AttributeOverride(name = "model", column = @Column(name = "computer_model"))
+ })
+ public ComputerPk getId() {
+ return id;
+ }
+
+ public void setId(ComputerPk id) {
+ this.id = id;
+ }
+
+ public String getCpu() {
+ return cpu;
+ }
+
+ public void setCpu(String cpu) {
+ this.cpu = cpu;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/ComputerPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/ComputerPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/ComputerPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class ComputerPk implements Serializable {
- private String brand;
- private String model;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof ComputerPk ) ) return false;
-
- final ComputerPk computerPk = (ComputerPk) o;
-
- if ( !brand.equals( computerPk.brand ) ) return false;
- if ( !model.equals( computerPk.model ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = brand.hashCode();
- result = 29 * result + model.hashCode();
- return result;
- }
-
- public String getBrand() {
- return brand;
- }
-
- public void setBrand(String brand) {
- this.brand = brand;
- }
-
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/ComputerPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/ComputerPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/ComputerPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/ComputerPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class ComputerPk implements Serializable {
+ private String brand;
+ private String model;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof ComputerPk ) ) return false;
+
+ final ComputerPk computerPk = (ComputerPk) o;
+
+ if ( !brand.equals( computerPk.brand ) ) return false;
+ if ( !model.equals( computerPk.model ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = brand.hashCode();
+ result = 29 * result + model.hashCode();
+ return result;
+ }
+
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Heart.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Heart.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Heart.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Heart {
- private Integer id;
-
- @Id
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Heart.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Heart.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Heart.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Heart.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Heart {
+ private Integer id;
+
+ @Id
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OneToOneTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OneToOneTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OneToOneTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,268 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.Customer;
-import org.hibernate.test.annotations.Discount;
-import org.hibernate.test.annotations.Passport;
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.test.annotations.Ticket;
-
-/**
- * @author Emmanuel Bernard
- */
-public class OneToOneTest extends TestCase {
-
- public OneToOneTest(String x) {
- super( x );
- }
-
- public void testEagerFetching() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Client c = new Client();
- c.setName( "Emmanuel" );
- Address a = new Address();
- a.setCity( "Courbevoie" );
- c.setAddress( a );
- s.persist( c );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.createQuery( "select c from Client c where c.name = :name" );
- q.setString( "name", c.getName() );
- c = (Client) q.uniqueResult();
- //c = (Client) s.get(Client.class, c.getId());
- assertNotNull( c );
- tx.commit();
- s.close();
- assertNotNull( c.getAddress() );
- //assertTrue( "Should be eager fetched", Hibernate.isInitialized( c.getAddress() ) );
-
- }
-
- public void testDefaultOneToOne() throws Exception {
- //test a default one to one and a mappedBy in the other side
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Customer c = new Customer();
- c.setName( "Hibernatus" );
- Passport p = new Passport();
- p.setNumber( "123456789" );
- s.persist( c ); //we need the id to assigned it to passport
- c.setPassport( p );
- p.setOwner( c );
- p.setId( c.getId() );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- c = (Customer) s.get( Customer.class, c.getId() );
- assertNotNull( c );
- p = c.getPassport();
- assertNotNull( p );
- assertEquals( "123456789", p.getNumber() );
- assertNotNull( p.getOwner() );
- assertEquals( "Hibernatus", p.getOwner().getName() );
- tx.commit(); // commit or rollback is the same, we don't care for read queries
- s.close();
- }
-
- public void testOneToOneWithExplicitFk() throws Exception {
- Client c = new Client();
- Address a = new Address();
- a.setCity( "Paris" );
- c.setName( "Emmanuel" );
- c.setAddress( a );
-
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( c );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- c = (Client) s.get( Client.class, c.getId() );
- assertNotNull( c );
- assertNotNull( c.getAddress() );
- assertEquals( "Paris", c.getAddress().getCity() );
- tx.commit();
- s.close();
- }
-
- public void testUnidirectionalTrueOneToOne() throws Exception {
- Body b = new Body();
- Heart h = new Heart();
- b.setHeart( h );
- b.setId( new Integer( 1 ) );
- h.setId( b.getId() ); //same PK
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- s.persist( h );
- s.persist( b );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- b = (Body) s.get( Body.class, b.getId() );
- assertNotNull( b );
- assertNotNull( b.getHeart() );
- assertEquals( h.getId(), b.getHeart().getId() );
- tx.commit();
- s.close();
-
- }
-
- public void testCompositePk() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- ComputerPk cid = new ComputerPk();
- cid.setBrand( "IBM" );
- cid.setModel( "ThinkPad" );
- Computer c = new Computer();
- c.setId( cid );
- c.setCpu( "2 GHz" );
- SerialNumberPk sid = new SerialNumberPk();
- sid.setBrand( cid.getBrand() );
- sid.setModel( cid.getModel() );
- SerialNumber sn = new SerialNumber();
- sn.setId( sid );
- sn.setValue( "REZREZ23424" );
- c.setSerial( sn );
- s.persist( c );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- c = (Computer) s.get( Computer.class, cid );
- assertNotNull( c );
- assertNotNull( c.getSerial() );
- assertEquals( sn.getValue(), c.getSerial().getValue() );
- tx.commit();
- s.close();
- }
-
- public void testBidirectionalTrueOneToOne() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Party party = new Party();
- PartyAffiliate affiliate = new PartyAffiliate();
- affiliate.partyId = "id";
- party.partyId = "id";
- party.partyAffiliate = affiliate;
- affiliate.party = party;
- s.persist( party );
- s.persist( affiliate );
- s.getTransaction().commit();
-
- s.clear();
-
- Transaction tx = s.beginTransaction();
- affiliate = (PartyAffiliate) s.get( PartyAffiliate.class, "id" );
- assertNotNull( affiliate.party );
- assertEquals( affiliate.partyId, affiliate.party.partyId );
-
- s.clear();
-
- party = (Party) s.get( Party.class, "id" );
- assertNotNull( party.partyAffiliate );
- assertEquals( party.partyId, party.partyAffiliate.partyId );
-
- s.delete( party );
- s.delete( party.partyAffiliate );
- tx.commit();
- s.close();
- }
-
- public void testBidirectionalFkOneToOne() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Trousers trousers = new Trousers();
- TrousersZip zip = new TrousersZip();
- trousers.id = new Integer( 1 );
- zip.id = new Integer( 2 );
- trousers.zip = zip;
- zip.trousers = trousers;
- s.persist( trousers );
- s.persist( zip );
- s.getTransaction().commit();
-
- s.clear();
-
- Transaction tx = s.beginTransaction();
- trousers = (Trousers) s.get( Trousers.class, trousers.id );
- assertNotNull( trousers.zip );
- assertEquals( zip.id, trousers.zip.id );
-
- s.clear();
-
- zip = (TrousersZip) s.get( TrousersZip.class, zip.id );
- assertNotNull( zip.trousers );
- assertEquals( trousers.id, zip.trousers.id );
-
- s.delete( zip );
- s.delete( zip.trousers );
- tx.commit();
- s.close();
- }
-
- public void testForeignGenerator() {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Owner owner = new Owner();
- OwnerAddress address = new OwnerAddress();
- owner.setAddress( address );
- address.setOwner( owner );
- s.persist( owner );
- s.flush();
- s.clear();
- owner = (Owner) s.get( Owner.class, owner.getId() );
- assertNotNull( owner );
- assertNotNull( owner.getAddress() );
- assertEquals( owner.getId(), owner.getAddress().getId() );
- tx.rollback();
- s.close();
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- PartyAffiliate.class,
- Party.class,
- Trousers.class,
- TrousersZip.class,
- Customer.class,
- Ticket.class,
- Discount.class,
- Passport.class,
- Client.class,
- Address.class,
- Computer.class,
- SerialNumber.class,
- Body.class,
- Heart.class,
- Owner.class,
- OwnerAddress.class
- };
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OneToOneTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OneToOneTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OneToOneTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OneToOneTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,268 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.Customer;
+import org.hibernate.test.annotations.Discount;
+import org.hibernate.test.annotations.Passport;
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.test.annotations.Ticket;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OneToOneTest extends TestCase {
+
+ public OneToOneTest(String x) {
+ super( x );
+ }
+
+ public void testEagerFetching() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Client c = new Client();
+ c.setName( "Emmanuel" );
+ Address a = new Address();
+ a.setCity( "Courbevoie" );
+ c.setAddress( a );
+ s.persist( c );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.createQuery( "select c from Client c where c.name = :name" );
+ q.setString( "name", c.getName() );
+ c = (Client) q.uniqueResult();
+ //c = (Client) s.get(Client.class, c.getId());
+ assertNotNull( c );
+ tx.commit();
+ s.close();
+ assertNotNull( c.getAddress() );
+ //assertTrue( "Should be eager fetched", Hibernate.isInitialized( c.getAddress() ) );
+
+ }
+
+ public void testDefaultOneToOne() throws Exception {
+ //test a default one to one and a mappedBy in the other side
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Customer c = new Customer();
+ c.setName( "Hibernatus" );
+ Passport p = new Passport();
+ p.setNumber( "123456789" );
+ s.persist( c ); //we need the id to assigned it to passport
+ c.setPassport( p );
+ p.setOwner( c );
+ p.setId( c.getId() );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ c = (Customer) s.get( Customer.class, c.getId() );
+ assertNotNull( c );
+ p = c.getPassport();
+ assertNotNull( p );
+ assertEquals( "123456789", p.getNumber() );
+ assertNotNull( p.getOwner() );
+ assertEquals( "Hibernatus", p.getOwner().getName() );
+ tx.commit(); // commit or rollback is the same, we don't care for read queries
+ s.close();
+ }
+
+ public void testOneToOneWithExplicitFk() throws Exception {
+ Client c = new Client();
+ Address a = new Address();
+ a.setCity( "Paris" );
+ c.setName( "Emmanuel" );
+ c.setAddress( a );
+
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( c );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ c = (Client) s.get( Client.class, c.getId() );
+ assertNotNull( c );
+ assertNotNull( c.getAddress() );
+ assertEquals( "Paris", c.getAddress().getCity() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testUnidirectionalTrueOneToOne() throws Exception {
+ Body b = new Body();
+ Heart h = new Heart();
+ b.setHeart( h );
+ b.setId( new Integer( 1 ) );
+ h.setId( b.getId() ); //same PK
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( h );
+ s.persist( b );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ b = (Body) s.get( Body.class, b.getId() );
+ assertNotNull( b );
+ assertNotNull( b.getHeart() );
+ assertEquals( h.getId(), b.getHeart().getId() );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testCompositePk() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ ComputerPk cid = new ComputerPk();
+ cid.setBrand( "IBM" );
+ cid.setModel( "ThinkPad" );
+ Computer c = new Computer();
+ c.setId( cid );
+ c.setCpu( "2 GHz" );
+ SerialNumberPk sid = new SerialNumberPk();
+ sid.setBrand( cid.getBrand() );
+ sid.setModel( cid.getModel() );
+ SerialNumber sn = new SerialNumber();
+ sn.setId( sid );
+ sn.setValue( "REZREZ23424" );
+ c.setSerial( sn );
+ s.persist( c );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ c = (Computer) s.get( Computer.class, cid );
+ assertNotNull( c );
+ assertNotNull( c.getSerial() );
+ assertEquals( sn.getValue(), c.getSerial().getValue() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testBidirectionalTrueOneToOne() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Party party = new Party();
+ PartyAffiliate affiliate = new PartyAffiliate();
+ affiliate.partyId = "id";
+ party.partyId = "id";
+ party.partyAffiliate = affiliate;
+ affiliate.party = party;
+ s.persist( party );
+ s.persist( affiliate );
+ s.getTransaction().commit();
+
+ s.clear();
+
+ Transaction tx = s.beginTransaction();
+ affiliate = (PartyAffiliate) s.get( PartyAffiliate.class, "id" );
+ assertNotNull( affiliate.party );
+ assertEquals( affiliate.partyId, affiliate.party.partyId );
+
+ s.clear();
+
+ party = (Party) s.get( Party.class, "id" );
+ assertNotNull( party.partyAffiliate );
+ assertEquals( party.partyId, party.partyAffiliate.partyId );
+
+ s.delete( party );
+ s.delete( party.partyAffiliate );
+ tx.commit();
+ s.close();
+ }
+
+ public void testBidirectionalFkOneToOne() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Trousers trousers = new Trousers();
+ TrousersZip zip = new TrousersZip();
+ trousers.id = new Integer( 1 );
+ zip.id = new Integer( 2 );
+ trousers.zip = zip;
+ zip.trousers = trousers;
+ s.persist( trousers );
+ s.persist( zip );
+ s.getTransaction().commit();
+
+ s.clear();
+
+ Transaction tx = s.beginTransaction();
+ trousers = (Trousers) s.get( Trousers.class, trousers.id );
+ assertNotNull( trousers.zip );
+ assertEquals( zip.id, trousers.zip.id );
+
+ s.clear();
+
+ zip = (TrousersZip) s.get( TrousersZip.class, zip.id );
+ assertNotNull( zip.trousers );
+ assertEquals( trousers.id, zip.trousers.id );
+
+ s.delete( zip );
+ s.delete( zip.trousers );
+ tx.commit();
+ s.close();
+ }
+
+ public void testForeignGenerator() {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Owner owner = new Owner();
+ OwnerAddress address = new OwnerAddress();
+ owner.setAddress( address );
+ address.setOwner( owner );
+ s.persist( owner );
+ s.flush();
+ s.clear();
+ owner = (Owner) s.get( Owner.class, owner.getId() );
+ assertNotNull( owner );
+ assertNotNull( owner.getAddress() );
+ assertEquals( owner.getId(), owner.getAddress().getId() );
+ tx.rollback();
+ s.close();
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ PartyAffiliate.class,
+ Party.class,
+ Trousers.class,
+ TrousersZip.class,
+ Customer.class,
+ Ticket.class,
+ Discount.class,
+ Passport.class,
+ Client.class,
+ Address.class,
+ Computer.class,
+ SerialNumber.class,
+ Body.class,
+ Heart.class,
+ Owner.class,
+ OwnerAddress.class
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Owner.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Owner.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Owner.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.OneToOne;
-import javax.persistence.PrimaryKeyJoinColumn;
-import javax.persistence.CascadeType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Owner {
- @Id @GeneratedValue private Integer id;
-
- @OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn private OwnerAddress address;
-
- public OwnerAddress getAddress() {
- return address;
- }
-
- public void setAddress(OwnerAddress address) {
- this.address = address;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Owner.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Owner.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Owner.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Owner.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id: $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.OneToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.CascadeType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Owner {
+ @Id @GeneratedValue private Integer id;
+
+ @OneToOne(cascade = CascadeType.ALL) @PrimaryKeyJoinColumn private OwnerAddress address;
+
+ public OwnerAddress getAddress() {
+ return address;
+ }
+
+ public void setAddress(OwnerAddress address) {
+ this.address = address;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OwnerAddress.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OwnerAddress.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OwnerAddress.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.OneToOne;
-
-import org.hibernate.annotations.GenericGenerator;
-import org.hibernate.annotations.Parameter;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class OwnerAddress {
- @Id @GeneratedValue(generator = "fk")
- @GenericGenerator(strategy = "foreign", name = "fk", parameters = @Parameter(name="property", value="owner"))
- private Integer id;
-
- @OneToOne(mappedBy="address", optional = false)
- private Owner owner;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public Owner getOwner() {
- return owner;
- }
-
- public void setOwner(Owner owner) {
- this.owner = owner;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OwnerAddress.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OwnerAddress.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OwnerAddress.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/OwnerAddress.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.OneToOne;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Parameter;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class OwnerAddress {
+ @Id @GeneratedValue(generator = "fk")
+ @GenericGenerator(strategy = "foreign", name = "fk", parameters = @Parameter(name="property", value="owner"))
+ private Integer id;
+
+ @OneToOne(mappedBy="address", optional = false)
+ private Owner owner;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Owner getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Owner owner) {
+ this.owner = owner;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Party.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Party.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Party.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-import javax.persistence.PrimaryKeyJoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Party {
- @Id
- String partyId;
-
- @OneToOne
- @PrimaryKeyJoinColumn
- PartyAffiliate partyAffiliate;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Party.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Party.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Party.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Party.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Party {
+ @Id
+ String partyId;
+
+ @OneToOne
+ @PrimaryKeyJoinColumn
+ PartyAffiliate partyAffiliate;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/PartyAffiliate.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/PartyAffiliate.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/PartyAffiliate.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-import javax.persistence.PrimaryKeyJoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class PartyAffiliate {
- @Id
- String partyId;
-
- @OneToOne(mappedBy="partyAffiliate")
- Party party;
-
- String affiliateName;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/PartyAffiliate.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/PartyAffiliate.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/PartyAffiliate.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/PartyAffiliate.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PartyAffiliate {
+ @Id
+ String partyId;
+
+ @OneToOne(mappedBy="partyAffiliate")
+ Party party;
+
+ String affiliateName;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumber.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumber.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumber.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,46 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class SerialNumber {
- private SerialNumberPk id;
- private String value;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof SerialNumber ) ) return false;
-
- final SerialNumber serialNumber = (SerialNumber) o;
-
- if ( !id.equals( serialNumber.id ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return id.hashCode();
- }
-
- @Id
- public SerialNumberPk getId() {
- return id;
- }
-
- public void setId(SerialNumberPk id) {
- this.id = id;
- }
-
- public String getValue() {
- return value;
- }
-
- public void setValue(String value) {
- this.value = value;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumber.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumber.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumber.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumber.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,46 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SerialNumber {
+ private SerialNumberPk id;
+ private String value;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof SerialNumber ) ) return false;
+
+ final SerialNumber serialNumber = (SerialNumber) o;
+
+ if ( !id.equals( serialNumber.id ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ @Id
+ public SerialNumberPk getId() {
+ return id;
+ }
+
+ public void setId(SerialNumberPk id) {
+ this.id = id;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumberPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumberPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumberPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class SerialNumberPk implements Serializable {
- private String brand;
- private String model;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof SerialNumberPk ) ) return false;
-
- final SerialNumberPk serialNumberPk = (SerialNumberPk) o;
-
- if ( !brand.equals( serialNumberPk.brand ) ) return false;
- if ( !model.equals( serialNumberPk.model ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = brand.hashCode();
- result = 13 * result + model.hashCode();
- return result;
- }
-
- public String getBrand() {
- return brand;
- }
-
- public void setBrand(String brand) {
- this.brand = brand;
- }
-
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumberPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumberPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumberPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/SerialNumberPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class SerialNumberPk implements Serializable {
+ private String brand;
+ private String model;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof SerialNumberPk ) ) return false;
+
+ final SerialNumberPk serialNumberPk = (SerialNumberPk) o;
+
+ if ( !brand.equals( serialNumberPk.brand ) ) return false;
+ if ( !model.equals( serialNumberPk.model ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = brand.hashCode();
+ result = 13 * result + model.hashCode();
+ return result;
+ }
+
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Trousers.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Trousers.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Trousers.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Trousers {
- @Id
- public Integer id;
-
- @OneToOne
- @JoinColumn(name = "zip_id")
- public TrousersZip zip;
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Trousers.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Trousers.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Trousers.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/Trousers.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Trousers {
+ @Id
+ public Integer id;
+
+ @OneToOne
+ @JoinColumn(name = "zip_id")
+ public TrousersZip zip;
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/TrousersZip.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/TrousersZip.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/TrousersZip.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.onetoone;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class TrousersZip {
- @Id
- public Integer id;
- @OneToOne(mappedBy = "zip")
- public Trousers trousers;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/TrousersZip.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/TrousersZip.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/TrousersZip.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/onetoone/TrousersZip.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id$
+package org.hibernate.test.annotations.onetoone;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class TrousersZip {
+ @Id
+ public Integer id;
+ @OneToOne(mappedBy = "zip")
+ public Trousers trousers;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/orm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/orm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-<?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"
- version="1.0"
- >
- <sequence-generator name="SEQ_GEN" sequence-name="my_sequence"/>
- <table-generator name="EMP_GEN" table="GENERATOR_TABLE"
- pk-column-name="pkey" pk-column-value="EMP"
- value-column-name="hi" allocation-size="20"/>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/orm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/orm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/orm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+<?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"
+ version="1.0"
+ >
+ <sequence-generator name="SEQ_GEN" sequence-name="my_sequence"/>
+ <table-generator name="EMP_GEN" table="GENERATOR_TABLE"
+ pk-column-name="pkey" pk-column-value="EMP"
+ value-column-name="hi" allocation-size="20"/>
+</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.override;
-
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class AssociationOverrideTest extends TestCase {
-
- public void testOverriding() throws Exception {
- Location paris = new Location();
- paris.setName( "Paris" );
- Location atlanta = new Location();
- atlanta.setName( "Atlanta" );
- Trip trip = new Trip();
- trip.setFrom( paris );
- //trip.setTo( atlanta );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist( paris );
- s.persist( atlanta );
- try {
- s.persist( trip );
- s.flush();
- fail( "Should be non nullable" );
- }
- catch (HibernateException e) {
- //success
- }
- finally {
- tx.rollback();
- s.close();
- }
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Location.class,
- Move.class,
- Trip.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/AssociationOverrideTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id: $
+package org.hibernate.test.annotations.override;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AssociationOverrideTest extends TestCase {
+
+ public void testOverriding() throws Exception {
+ Location paris = new Location();
+ paris.setName( "Paris" );
+ Location atlanta = new Location();
+ atlanta.setName( "Atlanta" );
+ Trip trip = new Trip();
+ trip.setFrom( paris );
+ //trip.setTo( atlanta );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( paris );
+ s.persist( atlanta );
+ try {
+ s.persist( trip );
+ s.flush();
+ fail( "Should be non nullable" );
+ }
+ catch (HibernateException e) {
+ //success
+ }
+ finally {
+ tx.rollback();
+ s.close();
+ }
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Location.class,
+ Move.class,
+ Trip.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Location.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Location.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Location.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.override;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Location {
- private String name;
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Location.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Location.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Location.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Location.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.test.annotations.override;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Location {
+ private String name;
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Move.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Move.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Move.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.override;
-
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Move {
- private int id;
- private Location from;
- private Location to;
-
- @ManyToOne
- public Location getFrom() {
- return from;
- }
-
- public void setFrom(Location from) {
- this.from = from;
- }
-
- @Id
- @GeneratedValue
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- @ManyToOne
- @JoinColumn(name = "to", nullable = true)
- public Location getTo() {
- return to;
- }
-
- public void setTo(Location to) {
- this.to = to;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Move.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Move.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Move.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Move.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id: $
+package org.hibernate.test.annotations.override;
+
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Move {
+ private int id;
+ private Location from;
+ private Location to;
+
+ @ManyToOne
+ public Location getFrom() {
+ return from;
+ }
+
+ public void setFrom(Location from) {
+ this.from = from;
+ }
+
+ @Id
+ @GeneratedValue
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @ManyToOne
+ @JoinColumn(name = "to", nullable = true)
+ public Location getTo() {
+ return to;
+ }
+
+ public void setTo(Location to) {
+ this.to = to;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Trip.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Trip.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Trip.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.override;
-
-import javax.persistence.AssociationOverride;
-import javax.persistence.AssociationOverrides;
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at AssociationOverrides({
- at AssociationOverride(name = "from", joinColumns = @JoinColumn(name = "from2", nullable = false)),
- at AssociationOverride(name = "to", joinColumns = @JoinColumn(name = "to2", nullable = false))
- })
-public class Trip extends Move {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Trip.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Trip.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Trip.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/override/Trip.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.test.annotations.override;
+
+import javax.persistence.AssociationOverride;
+import javax.persistence.AssociationOverrides;
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at AssociationOverrides({
+ at AssociationOverride(name = "from", joinColumns = @JoinColumn(name = "from2", nullable = false)),
+ at AssociationOverride(name = "to", joinColumns = @JoinColumn(name = "to2", nullable = false))
+ })
+public class Trip extends Move {
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Card.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Card.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Card.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-package org.hibernate.test.annotations.persister;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Shawn Clowater
- */
- at Entity
- at org.hibernate.annotations.Entity( persister = "org.hibernate.persister.entity.SingleTableEntityPersister" )
-public class Card implements Serializable {
- @Id
- public Integer id;
-
- @ManyToOne()
- @JoinColumn()
- public Deck deck;
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Card.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Card.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Card.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Card.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+package org.hibernate.test.annotations.persister;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Shawn Clowater
+ */
+ at Entity
+ at org.hibernate.annotations.Entity( persister = "org.hibernate.persister.entity.SingleTableEntityPersister" )
+public class Card implements Serializable {
+ @Id
+ public Integer id;
+
+ @ManyToOne()
+ @JoinColumn()
+ public Deck deck;
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/CollectionPersister.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/CollectionPersister.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/CollectionPersister.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-package org.hibernate.test.annotations.persister;
-
-import org.hibernate.MappingException;
-import org.hibernate.cache.CacheConcurrencyStrategy;
-import org.hibernate.cache.CacheException;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.mapping.Collection;
-import org.hibernate.persister.collection.OneToManyPersister;
-
-/**
- * @author Shawn Clowater
- */
-public class CollectionPersister extends OneToManyPersister {
- public CollectionPersister(Collection collection, CacheConcurrencyStrategy cache, Configuration cfg,
- SessionFactoryImplementor factory) throws MappingException, CacheException {
- super( collection, cache, cfg, factory );
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/CollectionPersister.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/CollectionPersister.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/CollectionPersister.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/CollectionPersister.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+package org.hibernate.test.annotations.persister;
+
+import org.hibernate.MappingException;
+import org.hibernate.cache.CacheConcurrencyStrategy;
+import org.hibernate.cache.CacheException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.mapping.Collection;
+import org.hibernate.persister.collection.OneToManyPersister;
+
+/**
+ * @author Shawn Clowater
+ */
+public class CollectionPersister extends OneToManyPersister {
+ public CollectionPersister(Collection collection, CacheConcurrencyStrategy cache, Configuration cfg,
+ SessionFactoryImplementor factory) throws MappingException, CacheException {
+ super( collection, cache, cfg, factory );
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Deck.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Deck.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Deck.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-package org.hibernate.test.annotations.persister;
-
-import java.io.Serializable;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-import org.hibernate.annotations.Persister;
-
-
-/**
- * @author Shawn Clowater
- */
- at Entity
- at org.hibernate.annotations.Entity( persister = "org.hibernate.persister.entity.SingleTableEntityPersister" )
- at Persister( impl = org.hibernate.test.annotations.persister.EntityPersister.class )
-public class Deck implements Serializable {
- @Id
- public Integer id;
-
- @OneToMany( mappedBy = "deck" )
- @Persister( impl = org.hibernate.test.annotations.persister.CollectionPersister.class )
- public Set<Card> cards;
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Deck.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Deck.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Deck.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/Deck.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+package org.hibernate.test.annotations.persister;
+
+import java.io.Serializable;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.Persister;
+
+
+/**
+ * @author Shawn Clowater
+ */
+ at Entity
+ at org.hibernate.annotations.Entity( persister = "org.hibernate.persister.entity.SingleTableEntityPersister" )
+ at Persister( impl = org.hibernate.test.annotations.persister.EntityPersister.class )
+public class Deck implements Serializable {
+ @Id
+ public Integer id;
+
+ @OneToMany( mappedBy = "deck" )
+ @Persister( impl = org.hibernate.test.annotations.persister.CollectionPersister.class )
+ public Set<Card> cards;
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/EntityPersister.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/EntityPersister.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/EntityPersister.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-package org.hibernate.test.annotations.persister;
-
-import org.hibernate.HibernateException;
-import org.hibernate.cache.CacheConcurrencyStrategy;
-import org.hibernate.engine.Mapping;
-import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.persister.entity.SingleTableEntityPersister;
-
-/**
- * @author Shawn Clowater
- */
-public class EntityPersister extends SingleTableEntityPersister {
- public EntityPersister(PersistentClass persistentClass, CacheConcurrencyStrategy cache,
- SessionFactoryImplementor factory, Mapping cfg) throws HibernateException {
- super( persistentClass, cache, factory, cfg );
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/EntityPersister.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/EntityPersister.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/EntityPersister.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/EntityPersister.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+package org.hibernate.test.annotations.persister;
+
+import org.hibernate.HibernateException;
+import org.hibernate.cache.CacheConcurrencyStrategy;
+import org.hibernate.engine.Mapping;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.persister.entity.SingleTableEntityPersister;
+
+/**
+ * @author Shawn Clowater
+ */
+public class EntityPersister extends SingleTableEntityPersister {
+ public EntityPersister(PersistentClass persistentClass, CacheConcurrencyStrategy cache,
+ SessionFactoryImplementor factory, Mapping cfg) throws HibernateException {
+ super( persistentClass, cache, factory, cfg );
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/PersisterTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/PersisterTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/PersisterTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-package org.hibernate.test.annotations.persister;
-
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.persister.entity.SingleTableEntityPersister;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Shawn Clowater
- */
-public class PersisterTest extends TestCase {
- public PersisterTest(String x) {
- super( x );
- }
-
- public void testEntityEntityPersisterAndPersisterSpecified() throws Exception {
- //checks to see that the persister specified with the @Persister annotation takes precedence if a @Entity.persister() is also specified
- PersistentClass persistentClass = (PersistentClass) getCfg().getClassMapping( Deck.class.getName() );
- assertEquals( "Incorrect Persister class for " + persistentClass.getMappedClass(), EntityPersister.class,
- persistentClass.getEntityPersisterClass() );
- }
-
- public void testEntityEntityPersisterSpecified() throws Exception {
- //tests the persister specified with an @Entity.persister()
- PersistentClass persistentClass = (PersistentClass) getCfg().getClassMapping( Card.class.getName() );
- assertEquals( "Incorrect Persister class for " + persistentClass.getMappedClass(),
- SingleTableEntityPersister.class, persistentClass.getEntityPersisterClass() );
- }
-
- public void testCollectionPersisterSpecified() throws Exception {
- //tests the persister specified by the @Persister annotation on a collection
- Collection collection = (Collection) getCfg().getCollectionMapping( Deck.class.getName() + ".cards" );
- assertEquals( "Incorrect Persister class for collection " + collection.getRole(), CollectionPersister.class,
- collection.getCollectionPersisterClass() );
- }
-
- /**
- * @see org.hibernate.test.annotations.TestCase#getMappings()
- */
- protected Class[] getMappings() {
- return new Class[]{
- Card.class,
- Deck.class
- };
- }
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/PersisterTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/PersisterTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/PersisterTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/persister/PersisterTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+package org.hibernate.test.annotations.persister;
+
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.persister.entity.SingleTableEntityPersister;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Shawn Clowater
+ */
+public class PersisterTest extends TestCase {
+ public PersisterTest(String x) {
+ super( x );
+ }
+
+ public void testEntityEntityPersisterAndPersisterSpecified() throws Exception {
+ //checks to see that the persister specified with the @Persister annotation takes precedence if a @Entity.persister() is also specified
+ PersistentClass persistentClass = (PersistentClass) getCfg().getClassMapping( Deck.class.getName() );
+ assertEquals( "Incorrect Persister class for " + persistentClass.getMappedClass(), EntityPersister.class,
+ persistentClass.getEntityPersisterClass() );
+ }
+
+ public void testEntityEntityPersisterSpecified() throws Exception {
+ //tests the persister specified with an @Entity.persister()
+ PersistentClass persistentClass = (PersistentClass) getCfg().getClassMapping( Card.class.getName() );
+ assertEquals( "Incorrect Persister class for " + persistentClass.getMappedClass(),
+ SingleTableEntityPersister.class, persistentClass.getEntityPersisterClass() );
+ }
+
+ public void testCollectionPersisterSpecified() throws Exception {
+ //tests the persister specified by the @Persister annotation on a collection
+ Collection collection = (Collection) getCfg().getCollectionMapping( Deck.class.getName() + ".cards" );
+ assertEquals( "Incorrect Persister class for collection " + collection.getRole(), CollectionPersister.class,
+ collection.getCollectionPersisterClass() );
+ }
+
+ /**
+ * @see org.hibernate.test.annotations.TestCase#getMappings()
+ */
+ protected Class[] getMappings() {
+ return new Class[]{
+ Card.class,
+ Deck.class
+ };
+ }
+
+}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/Car.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/Car.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/Car.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.polymorphism;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-import org.hibernate.annotations.PolymorphismType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
- at org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)
-public class Car extends MovingThing {
- private Integer id;
- private String model;
-
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- @Id @GeneratedValue(strategy = GenerationType.TABLE )
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/Car.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/Car.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/Car.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/Car.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.test.annotations.polymorphism;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+import org.hibernate.annotations.PolymorphismType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
+ at org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT)
+public class Car extends MovingThing {
+ private Integer id;
+ private String model;
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ @Id @GeneratedValue(strategy = GenerationType.TABLE )
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/MovingThing.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/MovingThing.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/MovingThing.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,8 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.polymorphism;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MovingThing {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/MovingThing.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/MovingThing.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/MovingThing.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/MovingThing.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,8 @@
+//$Id: $
+package org.hibernate.test.annotations.polymorphism;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MovingThing {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,37 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.polymorphism;
-
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-
-/**
- * @author Emmanuel Bernard
- */
-public class PolymorphismTest extends TestCase {
-
- public void testPolymorphism() throws Exception {
- Car car = new Car();
- car.setModel( "SUV" );
- SportCar car2 = new SportCar();
- car2.setModel( "350Z" );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- tx.begin();
- s.persist( car );
- s.persist( car2 );
- s.flush();
- assertEquals( 2, s.createQuery( "select car from Car car").list().size() );
- assertEquals( 0, s.createQuery( "select count(m) from " + MovingThing.class.getName() + " m").list().size() );
- tx.rollback();
- s.close();
-
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- Car.class,
- SportCar.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/PolymorphismTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,37 @@
+//$Id: $
+package org.hibernate.test.annotations.polymorphism;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PolymorphismTest extends TestCase {
+
+ public void testPolymorphism() throws Exception {
+ Car car = new Car();
+ car.setModel( "SUV" );
+ SportCar car2 = new SportCar();
+ car2.setModel( "350Z" );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ tx.begin();
+ s.persist( car );
+ s.persist( car2 );
+ s.flush();
+ assertEquals( 2, s.createQuery( "select car from Car car").list().size() );
+ assertEquals( 0, s.createQuery( "select count(m) from " + MovingThing.class.getName() + " m").list().size() );
+ tx.rollback();
+ s.close();
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Car.class,
+ SportCar.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/SportCar.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/SportCar.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/SportCar.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.polymorphism;
-
-import javax.persistence.Entity;
-import javax.persistence.Table;
-
-import org.hibernate.annotations.PolymorphismType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "sport_car")
- at org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT) //raise a warn
-public class SportCar extends Car {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/SportCar.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/SportCar.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/SportCar.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/polymorphism/SportCar.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.test.annotations.polymorphism;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.PolymorphismType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "sport_car")
+ at org.hibernate.annotations.Entity(polymorphism = PolymorphismType.EXPLICIT) //raise a warn
+public class SportCar extends Car {
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Area.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Area.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Area.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,73 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.query;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EntityResult;
-import javax.persistence.FieldResult;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.NamedNativeQueries;
-import javax.persistence.NamedNativeQuery;
-import javax.persistence.SqlResultSetMapping;
-import javax.persistence.SqlResultSetMappings;
-import javax.persistence.Table;
-
-/**
- * Example of a entity load incl a join fetching of an associated *ToOne entity
- *
- * @author Emmanuel Bernard
- */
- at Entity
- at NamedNativeQueries({
- at NamedNativeQuery(
- name = "night&area", query = "select night.id as nid, night.night_duration, night.night_date, area.id as aid, "
- + "night.area_id, area.name from Night night, tbl_area area where night.area_id = area.id",
- resultSetMapping = "joinMapping")
- })
- at org.hibernate.annotations.NamedNativeQueries({
- at org.hibernate.annotations.NamedNativeQuery(
- name = "night&areaCached",
- query = "select night.id as nid, night.night_duration, night.night_date, area.id as aid, "
- + "night.area_id, area.name from Night night, tbl_area area where night.area_id = area.id",
- resultSetMapping = "joinMapping")
- })
- at SqlResultSetMappings(
- @SqlResultSetMapping(name = "joinMapping", entities = {
- @EntityResult(entityClass = org.hibernate.test.annotations.query.Night.class, fields = {
- @FieldResult(name = "id", column = "nid"),
- @FieldResult(name = "duration", column = "night_duration"),
- @FieldResult(name = "date", column = "night_date"),
- @FieldResult(name = "area", column = "area_id")
- }),
- @EntityResult(entityClass = org.hibernate.test.annotations.query.Area.class, fields = {
- @FieldResult(name = "id", column = "aid"),
- @FieldResult(name = "name", column = "name")
- })
- }
- )
-)
- at Table(name = "tbl_area")
-public class Area {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Column(unique = true)
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Area.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Area.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Area.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Area.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,73 @@
+//$Id$
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EntityResult;
+import javax.persistence.FieldResult;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.SqlResultSetMapping;
+import javax.persistence.SqlResultSetMappings;
+import javax.persistence.Table;
+
+/**
+ * Example of a entity load incl a join fetching of an associated *ToOne entity
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at NamedNativeQueries({
+ at NamedNativeQuery(
+ name = "night&area", query = "select night.id as nid, night.night_duration, night.night_date, area.id as aid, "
+ + "night.area_id, area.name from Night night, tbl_area area where night.area_id = area.id",
+ resultSetMapping = "joinMapping")
+ })
+ at org.hibernate.annotations.NamedNativeQueries({
+ at org.hibernate.annotations.NamedNativeQuery(
+ name = "night&areaCached",
+ query = "select night.id as nid, night.night_duration, night.night_date, area.id as aid, "
+ + "night.area_id, area.name from Night night, tbl_area area where night.area_id = area.id",
+ resultSetMapping = "joinMapping")
+ })
+ at SqlResultSetMappings(
+ @SqlResultSetMapping(name = "joinMapping", entities = {
+ @EntityResult(entityClass = org.hibernate.test.annotations.query.Night.class, fields = {
+ @FieldResult(name = "id", column = "nid"),
+ @FieldResult(name = "duration", column = "night_duration"),
+ @FieldResult(name = "date", column = "night_date"),
+ @FieldResult(name = "area", column = "area_id")
+ }),
+ @EntityResult(entityClass = org.hibernate.test.annotations.query.Area.class, fields = {
+ @FieldResult(name = "id", column = "aid"),
+ @FieldResult(name = "name", column = "name")
+ })
+ }
+ )
+)
+ at Table(name = "tbl_area")
+public class Area {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Column(unique = true)
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Captain.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Captain.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Captain.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.query;
-
-import java.io.Serializable;
-import javax.persistence.ColumnResult;
-import javax.persistence.Entity;
-import javax.persistence.EntityResult;
-import javax.persistence.FieldResult;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.SqlResultSetMapping;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at IdClass(Identity.class)
- at SqlResultSetMapping(name = "compositekey",
- entities = @EntityResult(entityClass = org.hibernate.test.annotations.query.SpaceShip.class,
- fields = {
- @FieldResult(name = "name", column = "name"),
- @FieldResult(name = "model", column = "model"),
- @FieldResult(name = "speed", column = "speed"),
- @FieldResult(name = "dimensions.width", column = "width"),
- @FieldResult(name = "captain.lastname", column = "lastn"),
- @FieldResult(name = "dimensions.length", column = "length"),
- @FieldResult(name = "captain.firstname", column = "firstn")
- }),
- columns = {@ColumnResult(name = "surface"),
- @ColumnResult(name = "volume")})
-public class Captain implements Serializable {
- private String firstname;
- private String lastname;
-
- @Id
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- @Id
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Captain.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Captain.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Captain.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Captain.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+//$Id$
+package org.hibernate.test.annotations.query;
+
+import java.io.Serializable;
+import javax.persistence.ColumnResult;
+import javax.persistence.Entity;
+import javax.persistence.EntityResult;
+import javax.persistence.FieldResult;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.SqlResultSetMapping;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(Identity.class)
+ at SqlResultSetMapping(name = "compositekey",
+ entities = @EntityResult(entityClass = org.hibernate.test.annotations.query.SpaceShip.class,
+ fields = {
+ @FieldResult(name = "name", column = "name"),
+ @FieldResult(name = "model", column = "model"),
+ @FieldResult(name = "speed", column = "speed"),
+ @FieldResult(name = "dimensions.width", column = "width"),
+ @FieldResult(name = "captain.lastname", column = "lastn"),
+ @FieldResult(name = "dimensions.length", column = "length"),
+ @FieldResult(name = "captain.firstname", column = "firstn")
+ }),
+ columns = {@ColumnResult(name = "surface"),
+ @ColumnResult(name = "volume")})
+public class Captain implements Serializable {
+ private String firstname;
+ private String lastname;
+
+ @Id
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ @Id
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/CasimirParticle.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/CasimirParticle.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/CasimirParticle.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.query;
-
-import javax.persistence.Entity;
-import javax.persistence.Table;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name="CASIMIR_PARTICULE")
-public class CasimirParticle {
- @Id
- private Long id;
-
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/CasimirParticle.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/CasimirParticle.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/CasimirParticle.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/CasimirParticle.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name="CASIMIR_PARTICULE")
+public class CasimirParticle {
+ @Id
+ private Long id;
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Chaos.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Chaos.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Chaos.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,83 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.query;
-
-import java.util.Set;
-import java.util.HashSet;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.NamedQuery;
-import javax.persistence.NamedNativeQuery;
-import javax.persistence.OneToMany;
-import javax.persistence.JoinColumn;
-
-import org.hibernate.annotations.SQLInsert;
-import org.hibernate.annotations.SQLUpdate;
-import org.hibernate.annotations.SQLDelete;
-import org.hibernate.annotations.SQLDeleteAll;
-import org.hibernate.annotations.Loader;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name="CHAOS")
- at SQLInsert( sql="INSERT INTO CHAOS(name, nickname, size, id) VALUES(upper(?),?,?,?)")
- at SQLUpdate( sql="UPDATE CHAOS SET name = upper(?), nickname = ?, size = ? WHERE id = ?")
- at SQLDelete( sql="DELETE CHAOS WHERE id = ?")
- at SQLDeleteAll( sql="DELETE CHAOS")
- at Loader(namedQuery = "chaos")
- at NamedNativeQuery(name="chaos", query="select id, size, name, lower( nickname ) as nickname from CHAOS where id= ?", resultClass = Chaos.class)
-public class Chaos {
- @Id
- private Long id;
- private Long size;
- private String name;
- private String nickname;
-
- @OneToMany
- @JoinColumn(name="chaos_fk")
- @SQLInsert( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = ? where id = ?")
- @SQLDelete( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = null where id = ?")
- private Set<CasimirParticle> particles = new HashSet<CasimirParticle>();
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Long getSize() {
- return size;
- }
-
- public void setSize(Long size) {
- this.size = size;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getNickname() {
- return nickname;
- }
-
- public void setNickname(String nickname) {
- this.nickname = nickname;
- }
-
- public Set<CasimirParticle> getParticles() {
- return particles;
- }
-
- public void setParticles(Set<CasimirParticle> particles) {
- this.particles = particles;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Chaos.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Chaos.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Chaos.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Chaos.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,83 @@
+//$Id: $
+package org.hibernate.test.annotations.query;
+
+import java.util.Set;
+import java.util.HashSet;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.NamedQuery;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.OneToMany;
+import javax.persistence.JoinColumn;
+
+import org.hibernate.annotations.SQLInsert;
+import org.hibernate.annotations.SQLUpdate;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.SQLDeleteAll;
+import org.hibernate.annotations.Loader;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name="CHAOS")
+ at SQLInsert( sql="INSERT INTO CHAOS(name, nickname, size, id) VALUES(upper(?),?,?,?)")
+ at SQLUpdate( sql="UPDATE CHAOS SET name = upper(?), nickname = ?, size = ? WHERE id = ?")
+ at SQLDelete( sql="DELETE CHAOS WHERE id = ?")
+ at SQLDeleteAll( sql="DELETE CHAOS")
+ at Loader(namedQuery = "chaos")
+ at NamedNativeQuery(name="chaos", query="select id, size, name, lower( nickname ) as nickname from CHAOS where id= ?", resultClass = Chaos.class)
+public class Chaos {
+ @Id
+ private Long id;
+ private Long size;
+ private String name;
+ private String nickname;
+
+ @OneToMany
+ @JoinColumn(name="chaos_fk")
+ @SQLInsert( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = ? where id = ?")
+ @SQLDelete( sql="UPDATE CASIMIR_PARTICULE SET chaos_fk = null where id = ?")
+ private Set<CasimirParticle> particles = new HashSet<CasimirParticle>();
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getNickname() {
+ return nickname;
+ }
+
+ public void setNickname(String nickname) {
+ this.nickname = nickname;
+ }
+
+ public Set<CasimirParticle> getParticles() {
+ return particles;
+ }
+
+ public void setParticles(Set<CasimirParticle> particles) {
+ this.particles = particles;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dictionary.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dictionary.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dictionary.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,66 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.query;
-
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.EntityResult;
-import javax.persistence.FieldResult;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.NamedNativeQuery;
-import javax.persistence.SqlResultSetMapping;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorColumn(name = "disc")
- at DiscriminatorValue("Dic")
- at SqlResultSetMapping(
- name = "dictionary", entities = {
- at EntityResult(
- entityClass = org.hibernate.test.annotations.query.Dictionary.class,
- fields = {
- @FieldResult(name = "id", column = "id"),
- @FieldResult(name = "name", column = "name"),
- @FieldResult(name = "editor", column = "editor")
- },
- discriminatorColumn = "type"
-)
- }
-)
- at NamedNativeQuery(name = "all.dictionaries",
- query = "select id, name, editor, disc as type from Dictionary",
- resultSetMapping = "dictionary")
-public class Dictionary {
- private Integer id;
- private String name;
- private String editor;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getEditor() {
- return editor;
- }
-
- public void setEditor(String editor) {
- this.editor = editor;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dictionary.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dictionary.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dictionary.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dictionary.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,66 @@
+//$Id$
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.EntityResult;
+import javax.persistence.FieldResult;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.SqlResultSetMapping;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorColumn(name = "disc")
+ at DiscriminatorValue("Dic")
+ at SqlResultSetMapping(
+ name = "dictionary", entities = {
+ at EntityResult(
+ entityClass = org.hibernate.test.annotations.query.Dictionary.class,
+ fields = {
+ @FieldResult(name = "id", column = "id"),
+ @FieldResult(name = "name", column = "name"),
+ @FieldResult(name = "editor", column = "editor")
+ },
+ discriminatorColumn = "type"
+)
+ }
+)
+ at NamedNativeQuery(name = "all.dictionaries",
+ query = "select id, name, editor, disc as type from Dictionary",
+ resultSetMapping = "dictionary")
+public class Dictionary {
+ private Integer id;
+ private String name;
+ private String editor;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getEditor() {
+ return editor;
+ }
+
+ public void setEditor(String editor) {
+ this.editor = editor;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dimensions.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dimensions.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dimensions.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.query;
-
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class Dimensions {
-
-
- private int length;
- private int width;
-
- 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;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dimensions.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dimensions.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dimensions.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Dimensions.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Dimensions {
+
+
+ private int length;
+ private int width;
+
+ 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;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Identity.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Identity.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Identity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.query;
-
-import java.io.Serializable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Identity implements Serializable {
- private String firstname;
- private String lastname;
-
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final Identity identity = (Identity) o;
-
- if ( !firstname.equals( identity.firstname ) ) return false;
- if ( !lastname.equals( identity.lastname ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = firstname.hashCode();
- result = 29 * result + lastname.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Identity.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Identity.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Identity.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Identity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id$
+package org.hibernate.test.annotations.query;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Identity implements Serializable {
+ private String firstname;
+ private String lastname;
+
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final Identity identity = (Identity) o;
+
+ if ( !firstname.equals( identity.firstname ) ) return false;
+ if ( !lastname.equals( identity.lastname ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = firstname.hashCode();
+ result = 29 * result + lastname.hashCode();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Mark.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Mark.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Mark.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.query;
-
-import javax.persistence.ColumnResult;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.NamedNativeQuery;
-import javax.persistence.SqlResultSetMapping;
-
-/**
- * Example of scalar result (not working right now)
- *
- * @author Emmanuel Bernard
- */
- at Entity
- at NamedNativeQuery(name = "average", query = "select avg(m.value) from Mark m", resultSetMapping = "columnmapping")
- at SqlResultSetMapping(
- name = "columnmapping",
- columns = @ColumnResult(name = "aver")
-)
-public class Mark {
- @Id
- @GeneratedValue
- public int id;
- public int value;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Mark.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Mark.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Mark.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Mark.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id$
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.ColumnResult;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.SqlResultSetMapping;
+
+/**
+ * Example of scalar result (not working right now)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at NamedNativeQuery(name = "average", query = "select avg(m.value) from Mark m", resultSetMapping = "columnmapping")
+ at SqlResultSetMapping(
+ name = "columnmapping",
+ columns = @ColumnResult(name = "aver")
+)
+public class Mark {
+ @Id
+ @GeneratedValue
+ public int id;
+ public int value;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Night.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Night.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Night.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,66 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.query;
-
-import java.util.Date;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedQuery;
-
-/**
- * Entity declaring a named query
- *
- * @author Emmanuel Bernard
- */
- at Entity
- at NamedQuery(name = "night.moreRecentThan", query = "select n from Night n where n.date >= :date")
- at org.hibernate.annotations.NamedQuery(
- name = "night.duration",
- query = "select n from Night n where n.duration = :duration",
- cacheable = true, cacheRegion = "nightQuery"
-)
-public class Night {
- private Integer id;
- private long duration;
- private Date date;
- private Area area;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Column(name = "night_duration")
- public long getDuration() {
- return duration;
- }
-
- public void setDuration(long duration) {
- this.duration = duration;
- }
-
- @Column(name = "night_date")
- public Date getDate() {
- return date;
- }
-
- public void setDate(Date date) {
- this.date = date;
- }
-
- @ManyToOne
- public Area getArea() {
- return area;
- }
-
- public void setArea(Area area) {
- this.area = area;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Night.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Night.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Night.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/Night.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,66 @@
+//$Id$
+package org.hibernate.test.annotations.query;
+
+import java.util.Date;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedQuery;
+
+/**
+ * Entity declaring a named query
+ *
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at NamedQuery(name = "night.moreRecentThan", query = "select n from Night n where n.date >= :date")
+ at org.hibernate.annotations.NamedQuery(
+ name = "night.duration",
+ query = "select n from Night n where n.duration = :duration",
+ cacheable = true, cacheRegion = "nightQuery"
+)
+public class Night {
+ private Integer id;
+ private long duration;
+ private Date date;
+ private Area area;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Column(name = "night_duration")
+ public long getDuration() {
+ return duration;
+ }
+
+ public void setDuration(long duration) {
+ this.duration = duration;
+ }
+
+ @Column(name = "night_date")
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ @ManyToOne
+ public Area getArea() {
+ return area;
+ }
+
+ public void setArea(Area area) {
+ this.area = area;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/QueryAndSQLTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/QueryAndSQLTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/QueryAndSQLTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,380 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.query;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.List;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.stat.Statistics;
-import org.hibernate.test.annotations.A320;
-import org.hibernate.test.annotations.A320b;
-import org.hibernate.test.annotations.Plane;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * Test named queries
- *
- * @author Emmanuel Bernard
- */
-public class QueryAndSQLTest extends TestCase {
- public QueryAndSQLTest(String x) {
- super( x );
- }
-
- public void testPackageQueries() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Plane p = new Plane();
- s.persist( p );
- Query q = s.getNamedQuery( "plane.getAll" );
- assertEquals( 1, q.list().size() );
- tx.commit();
- s.close();
- }
-
- public void testClassQueries() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Night n = new Night();
- Calendar c = new GregorianCalendar();
- c.set( 2000, 2, 2 );
- Date now = c.getTime();
- c.add( Calendar.MONTH, -1 );
- Date aMonthAgo = c.getTime();
- c.add( Calendar.MONTH, 2 );
- Date inAMonth = c.getTime();
- n.setDate( now );
- n.setDuration( 14 );
- s.persist( n );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.getNamedQuery( "night.moreRecentThan" );
- q.setDate( "date", aMonthAgo );
- assertEquals( 1, q.list().size() );
- q = s.getNamedQuery( "night.moreRecentThan" );
- q.setDate( "date", inAMonth );
- assertEquals( 0, q.list().size() );
- Statistics stats = getSessions().getStatistics();
- stats.setStatisticsEnabled( true );
- stats.clear();
- q = s.getNamedQuery( "night.duration" );
- q.setParameter( "duration", 14l );
- assertEquals( 1, q.list().size() );
- assertEquals( 1, stats.getQueryCachePutCount() );
- q = s.getNamedQuery( "night.duration" );
- q.setParameter( "duration", 14l );
- s.delete( q.list().get( 0 ) );
- assertEquals( 1, stats.getQueryCacheHitCount() );
- tx.commit();
- s.close();
- }
-
- public void testSQLQuery() {
- Night n = new Night();
- Calendar c = new GregorianCalendar();
- c.set( 2000, 2, 2 );
- Date now = c.getTime();
- c.add( Calendar.MONTH, -1 );
- Date aMonthAgo = c.getTime();
- c.add( Calendar.MONTH, 2 );
- Date inAMonth = c.getTime();
- n.setDate( now );
- n.setDuration( 9999 );
- Area area = new Area();
- area.setName( "Monceau" );
-
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist( n );
- s.persist( area );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- Query q = s.getNamedQuery( "night.getAll.bySQL" );
- q.setParameter( 0, 9990 );
- List result = q.list();
- assertEquals( 1, result.size() );
- Night n2 = (Night) result.get( 0 );
- assertEquals( n2.getDuration(), n.getDuration() );
- List areas = s.getNamedQuery( "getAreaByNative" ).list();
- assertTrue( 1 == areas.size() );
- assertEquals( area.getName(), ( (Area) areas.get( 0 ) ).getName() );
- tx.commit();
- s.close();
- }
-
- public void testSQLQueryWithManyToOne() {
- Night n = new Night();
- Calendar c = new GregorianCalendar();
- c.set( 2000, 2, 2 );
- Date now = c.getTime();
- c.add( Calendar.MONTH, -1 );
- Date aMonthAgo = c.getTime();
- c.add( Calendar.MONTH, 2 );
- Date inAMonth = c.getTime();
- n.setDate( now );
- n.setDuration( 9999 );
- Area a = new Area();
- a.setName( "Paris" );
- n.setArea( a );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist( a );
- s.persist( n );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- Statistics stats = getSessions().getStatistics();
- stats.setStatisticsEnabled( true );
- Query q = s.getNamedQuery( "night&areaCached" );
- List result = q.list();
- assertEquals( 1, result.size() );
- assertEquals( 1, stats.getQueryCachePutCount() );
- q.list();
- assertEquals( 1, stats.getQueryCacheHitCount() );
- Night n2 = (Night) ( (Object[]) result.get( 0 ) )[0];
- assertEquals( n2.getDuration(), n.getDuration() );
- tx.commit();
- s.close();
- }
-
- public void testImplicitNativeQuery() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- SpaceShip ship = new SpaceShip();
- ship.setModel( "X-Wing" );
- ship.setName( "YuBlue" );
- ship.setSpeed( 2000 );
- ship.setDimensions( new Dimensions() );
- s.persist( ship );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- Query q = s.getNamedQuery( "implicitSample" );
- List result = q.list();
- assertEquals( 1, result.size() );
- assertEquals( ship.getModel(), ( (SpaceShip) result.get( 0 ) ).getModel() );
- s.delete( result.get( 0 ) );
- tx.commit();
- s.close();
- }
-
- public void testNativeQueryAndCompositePKAndComponents() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- SpaceShip ship = new SpaceShip();
- ship.setModel( "X-Wing" );
- ship.setName( "YuBlue" );
- ship.setSpeed( 2000 );
- ship.setDimensions( new Dimensions() );
- ship.getDimensions().setLength( 10 );
- ship.getDimensions().setWidth( 5 );
- Captain captain = new Captain();
- captain.setFirstname( "Luke" );
- captain.setLastname( "Skywalker" );
- ship.setCaptain( captain );
- s.persist( captain );
- s.persist( ship );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- Query q = s.getNamedQuery( "compositekey" );
- List result = q.list();
- assertEquals( 1, result.size() );
- Object[] row = (Object[]) result.get( 0 );
- SpaceShip spaceShip = (SpaceShip) row[0];
- assertEquals( ship.getModel(), spaceShip.getModel() );
- assertNotNull( spaceShip.getDimensions() );
- assertEquals( ship.getDimensions().getWidth(), spaceShip.getDimensions().getWidth() );
- assertEquals( ship.getDimensions().getLength(), spaceShip.getDimensions().getLength() );
- assertEquals( ship.getCaptain().getFirstname(), ship.getCaptain().getFirstname() );
- assertEquals( ship.getCaptain().getLastname(), ship.getCaptain().getLastname() );
- //FIXME vary depending on databases
- assertTrue( row[1].toString().startsWith( "50" ) );
- assertTrue( row[2].toString().startsWith( "500" ) );
- s.delete( spaceShip.getCaptain() );
- s.delete( spaceShip );
- tx.commit();
- s.close();
- }
-
- public void testDiscriminator() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Dictionary dic = new Dictionary();
- dic.setName( "Anglais-Francais" );
- dic.setEditor( "Harrap's" );
- SynonymousDictionary syn = new SynonymousDictionary();
- syn.setName( "Synonymes de tous les temps" );
- syn.setEditor( "Imagination edition" );
- s.persist( dic );
- s.persist( syn );
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- List results = s.getNamedQuery( "all.dictionaries" ).list();
- assertEquals( 2, results.size() );
- assertTrue(
- results.get( 0 ) instanceof SynonymousDictionary
- || results.get( 1 ) instanceof SynonymousDictionary
- );
- tx.commit();
- s.close();
- }
-
-// public void testScalarQuery() throws Exception {
-// Session s = openSession();
-// Transaction tx;
-// tx = s.beginTransaction();
-// Mark bad = new Mark();
-// bad.value = 5;
-// Mark good = new Mark();
-// good.value = 15;
-// s.persist(bad);
-// s.persist(good);
-// tx.commit();
-// s.clear();
-// tx = s.beginTransaction();
-// List result = s.getNamedQuery("average").list();
-// assertEquals( 1, result.size() );
-// tx.commit();
-// s.close();
-//
-// }
-
- public void testCache() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Plane plane = new Plane();
- plane.setNbrOfSeats( 5 );
- s.persist( plane );
- tx.commit();
- s.close();
- getSessions().getStatistics().clear();
- getSessions().getStatistics().setStatisticsEnabled( true );
- s = openSession();
- tx = s.beginTransaction();
- Query query = s.getNamedQuery( "plane.byId" ).setParameter( "id", plane.getId() );
- plane = (Plane) query.uniqueResult();
- assertEquals( 1, getSessions().getStatistics().getQueryCachePutCount() );
- plane = (Plane) s.getNamedQuery( "plane.byId" ).setParameter( "id", plane.getId() ).uniqueResult();
- assertEquals( 1, getSessions().getStatistics().getQueryCacheHitCount() );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- s.delete( s.get( Plane.class, plane.getId() ) );
- tx.commit();
- s.close();
- }
-
- public void testEntitySQLOverriding() {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Chaos chaos = new Chaos();
- chaos.setSize( 123l );
- chaos.setId( 1l );
-
- String lowerName = "hello";
- String upperName = lowerName.toUpperCase();
- assertFalse( lowerName.equals( upperName ) );
-
- chaos.setName( "hello" );
- chaos.setNickname( "NickName" );
- s.persist( chaos );
- s.flush();
- s.clear();
- s.getSessionFactory().evict( Chaos.class );
-
- Chaos resultChaos = (Chaos) s.load( Chaos.class, chaos.getId() );
- assertEquals( upperName, resultChaos.getName() );
- assertEquals( "nickname", resultChaos.getNickname() );
-
- tx.rollback();
- s.close();
- }
-
- public void testCollectionSQLOverriding() {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Chaos chaos = new Chaos();
- chaos.setSize( 123l );
- chaos.setId( 1l );
-
- chaos.setName( "hello" );
- s.persist( chaos );
- CasimirParticle p = new CasimirParticle();
- p.setId( 1l );
- s.persist( p );
- chaos.getParticles().add(p);
- p = new CasimirParticle();
- p.setId( 2l );
- s.persist( p );
- chaos.getParticles().add(p);
- s.flush();
- s.clear();
- s.getSessionFactory().evict( Chaos.class );
-
- Chaos resultChaos = (Chaos) s.load( Chaos.class, chaos.getId() );
- assertEquals( 2, resultChaos.getParticles().size() );
- resultChaos.getParticles().remove( resultChaos.getParticles().iterator().next() );
- resultChaos.getParticles().remove( resultChaos.getParticles().iterator().next() );
- s.flush();
-
- s.clear();
- resultChaos = (Chaos) s.load( Chaos.class, chaos.getId() );
- assertEquals( 0, resultChaos.getParticles().size() );
-
- tx.rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Plane.class,
- A320.class,
- A320b.class,
- Night.class,
- Area.class,
- SpaceShip.class,
- Dictionary.class,
- SynonymousDictionary.class,
- Captain.class,
- Chaos.class,
- CasimirParticle.class
- };
- }
-
- protected String[] getAnnotatedPackages() {
- return new String[]{
- "org.hibernate.test.annotations.query"
- };
- }
-
- @Override
- protected String[] getXmlFiles() {
- return new String[]{
- "org/hibernate/test/annotations/query/orm.xml"
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/QueryAndSQLTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/QueryAndSQLTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/QueryAndSQLTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/QueryAndSQLTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,380 @@
+//$Id$
+package org.hibernate.test.annotations.query;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.stat.Statistics;
+import org.hibernate.test.annotations.A320;
+import org.hibernate.test.annotations.A320b;
+import org.hibernate.test.annotations.Plane;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * Test named queries
+ *
+ * @author Emmanuel Bernard
+ */
+public class QueryAndSQLTest extends TestCase {
+ public QueryAndSQLTest(String x) {
+ super( x );
+ }
+
+ public void testPackageQueries() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Plane p = new Plane();
+ s.persist( p );
+ Query q = s.getNamedQuery( "plane.getAll" );
+ assertEquals( 1, q.list().size() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testClassQueries() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Night n = new Night();
+ Calendar c = new GregorianCalendar();
+ c.set( 2000, 2, 2 );
+ Date now = c.getTime();
+ c.add( Calendar.MONTH, -1 );
+ Date aMonthAgo = c.getTime();
+ c.add( Calendar.MONTH, 2 );
+ Date inAMonth = c.getTime();
+ n.setDate( now );
+ n.setDuration( 14 );
+ s.persist( n );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.getNamedQuery( "night.moreRecentThan" );
+ q.setDate( "date", aMonthAgo );
+ assertEquals( 1, q.list().size() );
+ q = s.getNamedQuery( "night.moreRecentThan" );
+ q.setDate( "date", inAMonth );
+ assertEquals( 0, q.list().size() );
+ Statistics stats = getSessions().getStatistics();
+ stats.setStatisticsEnabled( true );
+ stats.clear();
+ q = s.getNamedQuery( "night.duration" );
+ q.setParameter( "duration", 14l );
+ assertEquals( 1, q.list().size() );
+ assertEquals( 1, stats.getQueryCachePutCount() );
+ q = s.getNamedQuery( "night.duration" );
+ q.setParameter( "duration", 14l );
+ s.delete( q.list().get( 0 ) );
+ assertEquals( 1, stats.getQueryCacheHitCount() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testSQLQuery() {
+ Night n = new Night();
+ Calendar c = new GregorianCalendar();
+ c.set( 2000, 2, 2 );
+ Date now = c.getTime();
+ c.add( Calendar.MONTH, -1 );
+ Date aMonthAgo = c.getTime();
+ c.add( Calendar.MONTH, 2 );
+ Date inAMonth = c.getTime();
+ n.setDate( now );
+ n.setDuration( 9999 );
+ Area area = new Area();
+ area.setName( "Monceau" );
+
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( n );
+ s.persist( area );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ Query q = s.getNamedQuery( "night.getAll.bySQL" );
+ q.setParameter( 0, 9990 );
+ List result = q.list();
+ assertEquals( 1, result.size() );
+ Night n2 = (Night) result.get( 0 );
+ assertEquals( n2.getDuration(), n.getDuration() );
+ List areas = s.getNamedQuery( "getAreaByNative" ).list();
+ assertTrue( 1 == areas.size() );
+ assertEquals( area.getName(), ( (Area) areas.get( 0 ) ).getName() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testSQLQueryWithManyToOne() {
+ Night n = new Night();
+ Calendar c = new GregorianCalendar();
+ c.set( 2000, 2, 2 );
+ Date now = c.getTime();
+ c.add( Calendar.MONTH, -1 );
+ Date aMonthAgo = c.getTime();
+ c.add( Calendar.MONTH, 2 );
+ Date inAMonth = c.getTime();
+ n.setDate( now );
+ n.setDuration( 9999 );
+ Area a = new Area();
+ a.setName( "Paris" );
+ n.setArea( a );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( a );
+ s.persist( n );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ Statistics stats = getSessions().getStatistics();
+ stats.setStatisticsEnabled( true );
+ Query q = s.getNamedQuery( "night&areaCached" );
+ List result = q.list();
+ assertEquals( 1, result.size() );
+ assertEquals( 1, stats.getQueryCachePutCount() );
+ q.list();
+ assertEquals( 1, stats.getQueryCacheHitCount() );
+ Night n2 = (Night) ( (Object[]) result.get( 0 ) )[0];
+ assertEquals( n2.getDuration(), n.getDuration() );
+ tx.commit();
+ s.close();
+ }
+
+ public void testImplicitNativeQuery() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ SpaceShip ship = new SpaceShip();
+ ship.setModel( "X-Wing" );
+ ship.setName( "YuBlue" );
+ ship.setSpeed( 2000 );
+ ship.setDimensions( new Dimensions() );
+ s.persist( ship );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ Query q = s.getNamedQuery( "implicitSample" );
+ List result = q.list();
+ assertEquals( 1, result.size() );
+ assertEquals( ship.getModel(), ( (SpaceShip) result.get( 0 ) ).getModel() );
+ s.delete( result.get( 0 ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testNativeQueryAndCompositePKAndComponents() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ SpaceShip ship = new SpaceShip();
+ ship.setModel( "X-Wing" );
+ ship.setName( "YuBlue" );
+ ship.setSpeed( 2000 );
+ ship.setDimensions( new Dimensions() );
+ ship.getDimensions().setLength( 10 );
+ ship.getDimensions().setWidth( 5 );
+ Captain captain = new Captain();
+ captain.setFirstname( "Luke" );
+ captain.setLastname( "Skywalker" );
+ ship.setCaptain( captain );
+ s.persist( captain );
+ s.persist( ship );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ Query q = s.getNamedQuery( "compositekey" );
+ List result = q.list();
+ assertEquals( 1, result.size() );
+ Object[] row = (Object[]) result.get( 0 );
+ SpaceShip spaceShip = (SpaceShip) row[0];
+ assertEquals( ship.getModel(), spaceShip.getModel() );
+ assertNotNull( spaceShip.getDimensions() );
+ assertEquals( ship.getDimensions().getWidth(), spaceShip.getDimensions().getWidth() );
+ assertEquals( ship.getDimensions().getLength(), spaceShip.getDimensions().getLength() );
+ assertEquals( ship.getCaptain().getFirstname(), ship.getCaptain().getFirstname() );
+ assertEquals( ship.getCaptain().getLastname(), ship.getCaptain().getLastname() );
+ //FIXME vary depending on databases
+ assertTrue( row[1].toString().startsWith( "50" ) );
+ assertTrue( row[2].toString().startsWith( "500" ) );
+ s.delete( spaceShip.getCaptain() );
+ s.delete( spaceShip );
+ tx.commit();
+ s.close();
+ }
+
+ public void testDiscriminator() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Dictionary dic = new Dictionary();
+ dic.setName( "Anglais-Francais" );
+ dic.setEditor( "Harrap's" );
+ SynonymousDictionary syn = new SynonymousDictionary();
+ syn.setName( "Synonymes de tous les temps" );
+ syn.setEditor( "Imagination edition" );
+ s.persist( dic );
+ s.persist( syn );
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ List results = s.getNamedQuery( "all.dictionaries" ).list();
+ assertEquals( 2, results.size() );
+ assertTrue(
+ results.get( 0 ) instanceof SynonymousDictionary
+ || results.get( 1 ) instanceof SynonymousDictionary
+ );
+ tx.commit();
+ s.close();
+ }
+
+// public void testScalarQuery() throws Exception {
+// Session s = openSession();
+// Transaction tx;
+// tx = s.beginTransaction();
+// Mark bad = new Mark();
+// bad.value = 5;
+// Mark good = new Mark();
+// good.value = 15;
+// s.persist(bad);
+// s.persist(good);
+// tx.commit();
+// s.clear();
+// tx = s.beginTransaction();
+// List result = s.getNamedQuery("average").list();
+// assertEquals( 1, result.size() );
+// tx.commit();
+// s.close();
+//
+// }
+
+ public void testCache() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Plane plane = new Plane();
+ plane.setNbrOfSeats( 5 );
+ s.persist( plane );
+ tx.commit();
+ s.close();
+ getSessions().getStatistics().clear();
+ getSessions().getStatistics().setStatisticsEnabled( true );
+ s = openSession();
+ tx = s.beginTransaction();
+ Query query = s.getNamedQuery( "plane.byId" ).setParameter( "id", plane.getId() );
+ plane = (Plane) query.uniqueResult();
+ assertEquals( 1, getSessions().getStatistics().getQueryCachePutCount() );
+ plane = (Plane) s.getNamedQuery( "plane.byId" ).setParameter( "id", plane.getId() ).uniqueResult();
+ assertEquals( 1, getSessions().getStatistics().getQueryCacheHitCount() );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.delete( s.get( Plane.class, plane.getId() ) );
+ tx.commit();
+ s.close();
+ }
+
+ public void testEntitySQLOverriding() {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Chaos chaos = new Chaos();
+ chaos.setSize( 123l );
+ chaos.setId( 1l );
+
+ String lowerName = "hello";
+ String upperName = lowerName.toUpperCase();
+ assertFalse( lowerName.equals( upperName ) );
+
+ chaos.setName( "hello" );
+ chaos.setNickname( "NickName" );
+ s.persist( chaos );
+ s.flush();
+ s.clear();
+ s.getSessionFactory().evict( Chaos.class );
+
+ Chaos resultChaos = (Chaos) s.load( Chaos.class, chaos.getId() );
+ assertEquals( upperName, resultChaos.getName() );
+ assertEquals( "nickname", resultChaos.getNickname() );
+
+ tx.rollback();
+ s.close();
+ }
+
+ public void testCollectionSQLOverriding() {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Chaos chaos = new Chaos();
+ chaos.setSize( 123l );
+ chaos.setId( 1l );
+
+ chaos.setName( "hello" );
+ s.persist( chaos );
+ CasimirParticle p = new CasimirParticle();
+ p.setId( 1l );
+ s.persist( p );
+ chaos.getParticles().add(p);
+ p = new CasimirParticle();
+ p.setId( 2l );
+ s.persist( p );
+ chaos.getParticles().add(p);
+ s.flush();
+ s.clear();
+ s.getSessionFactory().evict( Chaos.class );
+
+ Chaos resultChaos = (Chaos) s.load( Chaos.class, chaos.getId() );
+ assertEquals( 2, resultChaos.getParticles().size() );
+ resultChaos.getParticles().remove( resultChaos.getParticles().iterator().next() );
+ resultChaos.getParticles().remove( resultChaos.getParticles().iterator().next() );
+ s.flush();
+
+ s.clear();
+ resultChaos = (Chaos) s.load( Chaos.class, chaos.getId() );
+ assertEquals( 0, resultChaos.getParticles().size() );
+
+ tx.rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Plane.class,
+ A320.class,
+ A320b.class,
+ Night.class,
+ Area.class,
+ SpaceShip.class,
+ Dictionary.class,
+ SynonymousDictionary.class,
+ Captain.class,
+ Chaos.class,
+ CasimirParticle.class
+ };
+ }
+
+ protected String[] getAnnotatedPackages() {
+ return new String[]{
+ "org.hibernate.test.annotations.query"
+ };
+ }
+
+ @Override
+ protected String[] getXmlFiles() {
+ return new String[]{
+ "org/hibernate/test/annotations/query/orm.xml"
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SpaceShip.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SpaceShip.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SpaceShip.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,80 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.query;
-
-import javax.persistence.Entity;
-import javax.persistence.EntityResult;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.ManyToOne;
-import javax.persistence.NamedNativeQueries;
-import javax.persistence.NamedNativeQuery;
-import javax.persistence.SqlResultSetMapping;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at SqlResultSetMapping(name = "implicit",
- entities = @EntityResult(entityClass = org.hibernate.test.annotations.query.SpaceShip.class))
- at NamedNativeQueries({
- at NamedNativeQuery(name = "implicitSample", query = "select * from SpaceShip", resultSetMapping = "implicit"),
- at NamedNativeQuery(name = "compositekey",
- query = "select name, model, speed, lname as lastn, fname as firstn, length, width, length * width as surface, length * width *10 as volume from SpaceShip",
- resultSetMapping = "compositekey")
- })
-//we're missins @SqlREsultSetMappings so look at Captain
-public class SpaceShip {
- private String name;
- private String model;
- private double speed;
- private Captain captain;
- private Dimensions dimensions;
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumns({
- @JoinColumn(name = "fname", referencedColumnName = "firstname"),
- @JoinColumn(name = "lname", referencedColumnName = "lastname")
- })
- public Captain getCaptain() {
- return captain;
- }
-
- public void setCaptain(Captain captain) {
- this.captain = captain;
- }
-
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- public double getSpeed() {
- return speed;
- }
-
- public void setSpeed(double speed) {
- this.speed = speed;
- }
-
- public Dimensions getDimensions() {
- return dimensions;
- }
-
- public void setDimensions(Dimensions dimensions) {
- this.dimensions = dimensions;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SpaceShip.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SpaceShip.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SpaceShip.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SpaceShip.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,80 @@
+//$Id$
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.Entity;
+import javax.persistence.EntityResult;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.SqlResultSetMapping;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at SqlResultSetMapping(name = "implicit",
+ entities = @EntityResult(entityClass = org.hibernate.test.annotations.query.SpaceShip.class))
+ at NamedNativeQueries({
+ at NamedNativeQuery(name = "implicitSample", query = "select * from SpaceShip", resultSetMapping = "implicit"),
+ at NamedNativeQuery(name = "compositekey",
+ query = "select name, model, speed, lname as lastn, fname as firstn, length, width, length * width as surface, length * width *10 as volume from SpaceShip",
+ resultSetMapping = "compositekey")
+ })
+//we're missins @SqlREsultSetMappings so look at Captain
+public class SpaceShip {
+ private String name;
+ private String model;
+ private double speed;
+ private Captain captain;
+ private Dimensions dimensions;
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumns({
+ @JoinColumn(name = "fname", referencedColumnName = "firstname"),
+ @JoinColumn(name = "lname", referencedColumnName = "lastname")
+ })
+ public Captain getCaptain() {
+ return captain;
+ }
+
+ public void setCaptain(Captain captain) {
+ this.captain = captain;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public double getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(double speed) {
+ this.speed = speed;
+ }
+
+ public Dimensions getDimensions() {
+ return dimensions;
+ }
+
+ public void setDimensions(Dimensions dimensions) {
+ this.dimensions = dimensions;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SynonymousDictionary.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SynonymousDictionary.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SynonymousDictionary.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.query;
-
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at DiscriminatorValue("Syn")
-public class SynonymousDictionary extends Dictionary {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SynonymousDictionary.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SynonymousDictionary.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SynonymousDictionary.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/SynonymousDictionary.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id$
+package org.hibernate.test.annotations.query;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at DiscriminatorValue("Syn")
+public class SynonymousDictionary extends Dictionary {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/orm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/orm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-<?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"
- version="1.0"
- >
- <named-query name="plane.getAll">
- <query>select p from Plane p</query>
- </named-query>
- <named-native-query name="night.getAll.bySQL" result-set-mapping="sqlmapping">
- <query>select id, night_duration, night_date as dte, area_id from Night where night_duration > ?</query>
- </named-native-query>
- <named-native-query name="getAreaByNative" result-class="org.hibernate.test.annotations.query.Area">
- <query>select * from tbl_area</query>
- </named-native-query>
- <sql-result-set-mapping name="sqlmapping">
- <entity-result entity-class="org.hibernate.test.annotations.query.Night">
- <field-result name="id" column="id"/>
- <field-result name="duration" column="night_duration"/>
- <field-result name="date" column="dte"/>
- <field-result name="area" column="area_id"/>
- </entity-result>
- </sql-result-set-mapping>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/orm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/orm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/orm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/query/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+<?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"
+ version="1.0"
+ >
+ <named-query name="plane.getAll">
+ <query>select p from Plane p</query>
+ </named-query>
+ <named-native-query name="night.getAll.bySQL" result-set-mapping="sqlmapping">
+ <query>select id, night_duration, night_date as dte, area_id from Night where night_duration > ?</query>
+ </named-native-query>
+ <named-native-query name="getAreaByNative" result-class="org.hibernate.test.annotations.query.Area">
+ <query>select * from tbl_area</query>
+ </named-native-query>
+ <sql-result-set-mapping name="sqlmapping">
+ <entity-result entity-class="org.hibernate.test.annotations.query.Night">
+ <field-result name="id" column="id"/>
+ <field-result name="duration" column="night_duration"/>
+ <field-result name="date" column="dte"/>
+ <field-result name="area" column="area_id"/>
+ </entity-result>
+ </sql-result-set-mapping>
+</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/QuoteTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/QuoteTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/QuoteTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.quote;
-
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-
-/**
- * @author Emmanuel Bernard
- */
-public class QuoteTest extends TestCase {
- public void testQuoteManytoMany() {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- User u = new User();
- s.persist( u );
- Role r = new Role();
- s.persist( r );
- u.getRoles().add( r );
- s.flush();
- s.clear();
- u = (User) s.get( User.class, u.getId() );
- assertEquals( 1, u.getRoles().size() );
- tx.rollback();
- String role = User.class.getName() + ".roles";
- assertEquals( "User_Role", getCfg().getCollectionMapping( role ).getCollectionTable().getName() );
- s.close();
- }
- protected Class[] getMappings() {
- return new Class[] {
- User.class,
- Role.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/QuoteTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/QuoteTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/QuoteTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/QuoteTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id: $
+package org.hibernate.test.annotations.quote;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class QuoteTest extends TestCase {
+ public void testQuoteManytoMany() {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ User u = new User();
+ s.persist( u );
+ Role r = new Role();
+ s.persist( r );
+ u.getRoles().add( r );
+ s.flush();
+ s.clear();
+ u = (User) s.get( User.class, u.getId() );
+ assertEquals( 1, u.getRoles().size() );
+ tx.rollback();
+ String role = User.class.getName() + ".roles";
+ assertEquals( "User_Role", getCfg().getCollectionMapping( role ).getCollectionTable().getName() );
+ s.close();
+ }
+ protected Class[] getMappings() {
+ return new Class[] {
+ User.class,
+ Role.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/Role.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/Role.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/Role.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.quote;
-
-import java.io.Serializable;
-import javax.persistence.Id;
-import javax.persistence.Entity;
-import javax.persistence.GenerationType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "`Role`")
-public class Role implements Serializable {
-
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private long id;
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/Role.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/Role.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/Role.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/Role.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.test.annotations.quote;
+
+import java.io.Serializable;
+import javax.persistence.Id;
+import javax.persistence.Entity;
+import javax.persistence.GenerationType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "`Role`")
+public class Role implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/User.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/User.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/User.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.quote;
-
-import java.io.Serializable;
-import java.util.Set;
-import java.util.HashSet;
-import javax.persistence.ManyToMany;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Table;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "`User`")
-public class User implements Serializable {
-
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- private long id;
-
- @ManyToMany
- private Set<Role> roles = new HashSet<Role>();
-
-
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public Set<Role> getRoles() {
- return roles;
- }
-
- public void setRoles(Set<Role> roles) {
- this.roles = roles;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/User.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/User.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/User.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/quote/User.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id: $
+package org.hibernate.test.annotations.quote;
+
+import java.io.Serializable;
+import java.util.Set;
+import java.util.HashSet;
+import javax.persistence.ManyToMany;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Table;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "`User`")
+public class User implements Serializable {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ private long id;
+
+ @ManyToMany
+ private Set<Role> roles = new HashSet<Role>();
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public Set<Role> getRoles() {
+ return roles;
+ }
+
+ public void setRoles(Set<Role> roles) {
+ this.roles = roles;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Bag.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Bag.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Bag.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Bag {
- private Integer id;
- private String serial;
- private Rambler owner;
-
- public Bag() {
- }
-
- public Bag(String serial, Rambler owner) {
- this.serial = serial;
- this.owner = owner;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Column(unique = true)
- public String getSerial() {
- return serial;
- }
-
- public void setSerial(String serial) {
- this.serial = serial;
- }
-
- @ManyToOne
- @JoinColumn(referencedColumnName = "fld_name")
- public Rambler getOwner() {
- return owner;
- }
-
- public void setOwner(Rambler owner) {
- this.owner = owner;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Bag.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Bag.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Bag.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Bag.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+//$Id$
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Bag {
+ private Integer id;
+ private String serial;
+ private Rambler owner;
+
+ public Bag() {
+ }
+
+ public Bag(String serial, Rambler owner) {
+ this.serial = serial;
+ this.owner = owner;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Column(unique = true)
+ public String getSerial() {
+ return serial;
+ }
+
+ public void setSerial(String serial) {
+ this.serial = serial;
+ }
+
+ @ManyToOne
+ @JoinColumn(referencedColumnName = "fld_name")
+ public Rambler getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Rambler owner) {
+ this.owner = owner;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Clothes.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Clothes.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Clothes.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,69 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Clothes {
- private Integer id;
- private String type;
- private String flavor;
-
- public Clothes() {
- }
-
- public Clothes(String type, String flavor) {
- this.type = type;
- this.flavor = flavor;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getType() {
- return type;
- }
-
- public void setType(String type) {
- this.type = type;
- }
-
- public String getFlavor() {
- return flavor;
- }
-
- public void setFlavor(String flavor) {
- this.flavor = flavor;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Clothes ) ) return false;
-
- final Clothes clothes = (Clothes) o;
-
- if ( !flavor.equals( clothes.flavor ) ) return false;
- if ( !type.equals( clothes.type ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = type.hashCode();
- result = 29 * result + flavor.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Clothes.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Clothes.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Clothes.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Clothes.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,69 @@
+//$Id$
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Clothes {
+ private Integer id;
+ private String type;
+ private String flavor;
+
+ public Clothes() {
+ }
+
+ public Clothes(String type, String flavor) {
+ this.type = type;
+ this.flavor = flavor;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ public String getFlavor() {
+ return flavor;
+ }
+
+ public void setFlavor(String flavor) {
+ this.flavor = flavor;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Clothes ) ) return false;
+
+ final Clothes clothes = (Clothes) o;
+
+ if ( !flavor.equals( clothes.flavor ) ) return false;
+ if ( !type.equals( clothes.type ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = type.hashCode();
+ result = 29 * result + flavor.hashCode();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/House.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/House.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/House.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,80 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinTable;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class House implements Serializable {
- private Integer id;
- private String address;
- private Postman postman;
- private Set<Inhabitant> hasInhabitants = new HashSet<Inhabitant>();
-
- @ManyToOne
- @JoinColumn(referencedColumnName = "name")
- public Postman getPostman() {
- return postman;
- }
-
- public void setPostman(Postman postman) {
- this.postman = postman;
- }
-
- @Id
- @GeneratedValue(strategy = GenerationType.AUTO)
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-
- @ManyToMany
- @JoinTable(joinColumns = @JoinColumn(referencedColumnName = "address"),
- inverseJoinColumns = @JoinColumn(referencedColumnName = "name")
- )
- public Set<Inhabitant> getHasInhabitants() {
- return hasInhabitants;
- }
-
- public void setHasInhabitants(Set<Inhabitant> hasInhabitants) {
- this.hasInhabitants = hasInhabitants;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof House ) ) return false;
-
- final House house = (House) o;
-
- if ( address != null ? !address.equals( house.address ) : house.address != null ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return ( address != null ? address.hashCode() : 0 );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/House.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/House.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/House.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/House.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,80 @@
+//$Id$
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinTable;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class House implements Serializable {
+ private Integer id;
+ private String address;
+ private Postman postman;
+ private Set<Inhabitant> hasInhabitants = new HashSet<Inhabitant>();
+
+ @ManyToOne
+ @JoinColumn(referencedColumnName = "name")
+ public Postman getPostman() {
+ return postman;
+ }
+
+ public void setPostman(Postman postman) {
+ this.postman = postman;
+ }
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.AUTO)
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ @ManyToMany
+ @JoinTable(joinColumns = @JoinColumn(referencedColumnName = "address"),
+ inverseJoinColumns = @JoinColumn(referencedColumnName = "name")
+ )
+ public Set<Inhabitant> getHasInhabitants() {
+ return hasInhabitants;
+ }
+
+ public void setHasInhabitants(Set<Inhabitant> hasInhabitants) {
+ this.hasInhabitants = hasInhabitants;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof House ) ) return false;
+
+ final House house = (House) o;
+
+ if ( address != null ? !address.equals( house.address ) : house.address != null ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return ( address != null ? address.hashCode() : 0 );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,62 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Inhabitant implements Serializable {
- private Integer id;
- private String name;
- private Set<House> livesIn = new HashSet<House>();
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToMany(mappedBy = "hasInhabitants")
- public Set<House> getLivesIn() {
- return livesIn;
- }
-
- public void setLivesIn(Set<House> livesIn) {
- this.livesIn = livesIn;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Inhabitant ) ) return false;
-
- final Inhabitant inhabitant = (Inhabitant) o;
-
- if ( name != null ? !name.equals( inhabitant.name ) : inhabitant.name != null ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return ( name != null ? name.hashCode() : 0 );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Inhabitant.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,62 @@
+//$Id$
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Inhabitant implements Serializable {
+ private Integer id;
+ private String name;
+ private Set<House> livesIn = new HashSet<House>();
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToMany(mappedBy = "hasInhabitants")
+ public Set<House> getLivesIn() {
+ return livesIn;
+ }
+
+ public void setLivesIn(Set<House> livesIn) {
+ this.livesIn = livesIn;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Inhabitant ) ) return false;
+
+ final Inhabitant inhabitant = (Inhabitant) o;
+
+ if ( name != null ? !name.equals( inhabitant.name ) : inhabitant.name != null ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return ( name != null ? name.hashCode() : 0 );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Item.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Item.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Item.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Item {
- int id;
-
- @Id
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Item.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Item.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Item.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Item.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id: $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Item {
+ int id;
+
+ @Id
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,55 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import java.math.BigDecimal;
-import java.io.Serializable;
-import javax.persistence.Id;
-import javax.persistence.Entity;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class ItemCost implements Serializable {
- int id;
- Item item;
- Vendor vendor;
- BigDecimal cost;
-
-
- @Id
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- @ManyToOne
- public Item getItem() {
- return item;
- }
-
- public void setItem(Item item) {
- this.item = item;
- }
-
- @ManyToOne
- public Vendor getVendor() {
- return vendor;
- }
-
- public void setVendor(Vendor vendor) {
- this.vendor = vendor;
- }
-
- public BigDecimal getCost() {
- return cost;
- }
-
- public void setCost(BigDecimal cost) {
- this.cost = cost;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ItemCost.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,55 @@
+//$Id: $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.math.BigDecimal;
+import java.io.Serializable;
+import javax.persistence.Id;
+import javax.persistence.Entity;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ItemCost implements Serializable {
+ int id;
+ Item item;
+ Vendor vendor;
+ BigDecimal cost;
+
+
+ @Id
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @ManyToOne
+ public Item getItem() {
+ return item;
+ }
+
+ public void setItem(Item item) {
+ this.item = item;
+ }
+
+ @ManyToOne
+ public Vendor getVendor() {
+ return vendor;
+ }
+
+ public void setVendor(Vendor vendor) {
+ this.vendor = vendor;
+ }
+
+ public BigDecimal getCost() {
+ return cost;
+ }
+
+ public void setCost(BigDecimal cost) {
+ this.cost = cost;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Luggage.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Luggage.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Luggage.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,90 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Luggage implements Serializable {
- private Integer id;
- private String owner;
- private String type;
- private Set<Clothes> hasInside = new HashSet<Clothes>();
-
- public Luggage() {
- }
-
- public Luggage(String owner, String type) {
- this.owner = owner;
- this.type = type;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getOwner() {
- return owner;
- }
-
- public void setOwner(String owner) {
- this.owner = owner;
- }
-
- public String getType() {
- return type;
- }
-
- public void setType(String type) {
- this.type = type;
- }
-
- @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
- @JoinColumns({
- @JoinColumn(name = "lug_type", referencedColumnName = "type"),
- @JoinColumn(name = "lug_owner", referencedColumnName = "owner")
- })
- public Set<Clothes> getHasInside() {
- return hasInside;
- }
-
- public void setHasInside(Set<Clothes> hasInside) {
- this.hasInside = hasInside;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Luggage ) ) return false;
-
- final Luggage luggage = (Luggage) o;
-
- if ( !owner.equals( luggage.owner ) ) return false;
- if ( !type.equals( luggage.type ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = owner.hashCode();
- result = 29 * result + type.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Luggage.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Luggage.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Luggage.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Luggage.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,90 @@
+//$Id$
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Luggage implements Serializable {
+ private Integer id;
+ private String owner;
+ private String type;
+ private Set<Clothes> hasInside = new HashSet<Clothes>();
+
+ public Luggage() {
+ }
+
+ public Luggage(String owner, String type) {
+ this.owner = owner;
+ this.type = type;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getOwner() {
+ return owner;
+ }
+
+ public void setOwner(String owner) {
+ this.owner = owner;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public void setType(String type) {
+ this.type = type;
+ }
+
+ @OneToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+ @JoinColumns({
+ @JoinColumn(name = "lug_type", referencedColumnName = "type"),
+ @JoinColumn(name = "lug_owner", referencedColumnName = "owner")
+ })
+ public Set<Clothes> getHasInside() {
+ return hasInside;
+ }
+
+ public void setHasInside(Set<Clothes> hasInside) {
+ this.hasInside = hasInside;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Luggage ) ) return false;
+
+ final Luggage luggage = (Luggage) o;
+
+ if ( !owner.equals( luggage.owner ) ) return false;
+ if ( !type.equals( luggage.type ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = owner.hashCode();
+ result = 29 * result + type.hashCode();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Postman.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Postman.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Postman.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Postman implements Serializable {
- private String name;
- private String id;
-
- public Postman() {
- }
-
- @Id
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public Postman(String name, String id) {
- this.name = name;
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Postman.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Postman.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Postman.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Postman.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id$
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Postman implements Serializable {
+ private String name;
+ private String id;
+
+ public Postman() {
+ }
+
+ @Id
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public Postman(String name, String id) {
+ this.name = name;
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Rambler.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Rambler.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Rambler.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Rambler implements Serializable {
- private Integer id;
- private String name;
- private Set<Bag> bags = new HashSet<Bag>();
-
- public Rambler() {
- }
-
- public Rambler(String name) {
- this.name = name;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Column(name = "fld_name")
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @OneToMany(mappedBy = "owner", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
- public Set<Bag> getBags() {
- return bags;
- }
-
- public void setBags(Set<Bag> bags) {
- this.bags = bags;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Rambler.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Rambler.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Rambler.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Rambler.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id$
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Rambler implements Serializable {
+ private Integer id;
+ private String name;
+ private Set<Bag> bags = new HashSet<Bag>();
+
+ public Rambler() {
+ }
+
+ public Rambler(String name) {
+ this.name = name;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Column(name = "fld_name")
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @OneToMany(mappedBy = "owner", cascade = {CascadeType.PERSIST, CascadeType.MERGE})
+ public Set<Bag> getBags() {
+ return bags;
+ }
+
+ public void setBags(Set<Bag> bags) {
+ this.bags = bags;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,196 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import java.util.Iterator;
-import java.math.BigDecimal;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ReferencedColumnNameTest extends TestCase {
- public void testManyToOne() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Postman pm = new Postman( "Bob", "A01" );
- House house = new House();
- house.setPostman( pm );
- house.setAddress( "Rue des prés" );
- s.persist( pm );
- s.persist( house );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- house = (House) s.get( House.class, house.getId() );
- assertNotNull( house.getPostman() );
- assertEquals( "Bob", house.getPostman().getName() );
- pm = house.getPostman();
- s.delete( house );
- s.delete( pm );
- tx.commit();
- s.close();
- }
-
- public void testOneToMany() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
-
- Rambler rambler = new Rambler( "Emmanuel" );
- Bag bag = new Bag( "0001", rambler );
- rambler.getBags().add( bag );
- s.persist( rambler );
-
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
-
- bag = (Bag) s.createQuery( "select b from Bag b left join fetch b.owner" ).uniqueResult();
- assertNotNull( bag );
- assertNotNull( bag.getOwner() );
-
- rambler = (Rambler) s.createQuery( "select r from Rambler r left join fetch r.bags" ).uniqueResult();
- assertNotNull( rambler );
- assertNotNull( rambler.getBags() );
- assertEquals( 1, rambler.getBags().size() );
- s.delete( rambler.getBags().iterator().next() );
- s.delete( rambler );
-
- tx.commit();
- s.close();
- }
-
- public void testUnidirectionalOneToMany() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
-
- Clothes clothes = new Clothes( "underwear", "interesting" );
- Luggage luggage = new Luggage( "Emmanuel", "Cabin Luggage" );
- luggage.getHasInside().add( clothes );
- s.persist( luggage );
-
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
-
- luggage = (Luggage) s.createQuery( "select l from Luggage l left join fetch l.hasInside" ).uniqueResult();
- assertNotNull( luggage );
- assertNotNull( luggage.getHasInside() );
- assertEquals( 1, luggage.getHasInside().size() );
-
- s.delete( luggage.getHasInside().iterator().next() );
- s.delete( luggage );
-
- tx.commit();
- s.close();
- }
-
- public void testManyToMany() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
-
- House whiteHouse = new House();
- whiteHouse.setAddress( "1600 Pennsylvania Avenue, Washington" );
- Inhabitant bill = new Inhabitant();
- bill.setName( "Bill Clinton" );
- Inhabitant george = new Inhabitant();
- george.setName( "George W Bush" );
- s.persist( george );
- s.persist( bill );
- whiteHouse.getHasInhabitants().add( bill );
- whiteHouse.getHasInhabitants().add( george );
- //bill.getLivesIn().add( whiteHouse );
- //george.getLivesIn().add( whiteHouse );
-
- s.persist( whiteHouse );
- tx.commit();
- s = openSession();
- tx = s.beginTransaction();
-
- whiteHouse = (House) s.get( House.class, whiteHouse.getId() );
- assertNotNull( whiteHouse );
- assertEquals( 2, whiteHouse.getHasInhabitants().size() );
-
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- bill = (Inhabitant) s.get( Inhabitant.class, bill.getId() );
- assertNotNull( bill );
- assertEquals( 1, bill.getLivesIn().size() );
- assertEquals( whiteHouse.getAddress(), bill.getLivesIn().iterator().next().getAddress() );
-
- whiteHouse = bill.getLivesIn().iterator().next();
- s.delete( whiteHouse );
- Iterator it = whiteHouse.getHasInhabitants().iterator();
- while ( it.hasNext() ) {
- s.delete( it.next() );
- }
- tx.commit();
- s.close();
- }
-
- public void testManyToOneReferenceManyToOne() throws Exception {
- Item item = new Item();
- item.setId( 1 );
- Vendor vendor = new Vendor();
- vendor.setId( 1 );
- ItemCost cost = new ItemCost();
- cost.setCost( new BigDecimal(1) );
- cost.setId( 1 );
- cost.setItem( item );
- cost.setVendor( vendor );
- WarehouseItem wItem = new WarehouseItem();
- wItem.setDefaultCost( cost );
- wItem.setId( 1 );
- wItem.setItem( item );
- wItem.setQtyInStock( new BigDecimal(1) );
- wItem.setVendor( vendor );
- Session s = openSession( );
- s.getTransaction().begin();
- s.persist( item );
- s.persist( vendor );
- s.persist( cost );
- s.persist( wItem );
- s.flush();
- s.clear();
- wItem = (WarehouseItem) s.get(WarehouseItem.class, wItem.getId() );
- assertNotNull( wItem.getDefaultCost().getItem() );
- s.getTransaction().rollback();
- s.close();
- }
-
- public ReferencedColumnNameTest(String x) {
- super( x );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- House.class,
- Postman.class,
- Bag.class,
- Rambler.class,
- Luggage.class,
- Clothes.class,
- Inhabitant.class,
- Item.class,
- ItemCost.class,
- Vendor.class,
- WarehouseItem.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/ReferencedColumnNameTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,196 @@
+//$Id$
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.util.Iterator;
+import java.math.BigDecimal;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ReferencedColumnNameTest extends TestCase {
+ public void testManyToOne() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Postman pm = new Postman( "Bob", "A01" );
+ House house = new House();
+ house.setPostman( pm );
+ house.setAddress( "Rue des prés" );
+ s.persist( pm );
+ s.persist( house );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ house = (House) s.get( House.class, house.getId() );
+ assertNotNull( house.getPostman() );
+ assertEquals( "Bob", house.getPostman().getName() );
+ pm = house.getPostman();
+ s.delete( house );
+ s.delete( pm );
+ tx.commit();
+ s.close();
+ }
+
+ public void testOneToMany() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+
+ Rambler rambler = new Rambler( "Emmanuel" );
+ Bag bag = new Bag( "0001", rambler );
+ rambler.getBags().add( bag );
+ s.persist( rambler );
+
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+
+ bag = (Bag) s.createQuery( "select b from Bag b left join fetch b.owner" ).uniqueResult();
+ assertNotNull( bag );
+ assertNotNull( bag.getOwner() );
+
+ rambler = (Rambler) s.createQuery( "select r from Rambler r left join fetch r.bags" ).uniqueResult();
+ assertNotNull( rambler );
+ assertNotNull( rambler.getBags() );
+ assertEquals( 1, rambler.getBags().size() );
+ s.delete( rambler.getBags().iterator().next() );
+ s.delete( rambler );
+
+ tx.commit();
+ s.close();
+ }
+
+ public void testUnidirectionalOneToMany() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+
+ Clothes clothes = new Clothes( "underwear", "interesting" );
+ Luggage luggage = new Luggage( "Emmanuel", "Cabin Luggage" );
+ luggage.getHasInside().add( clothes );
+ s.persist( luggage );
+
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+
+ luggage = (Luggage) s.createQuery( "select l from Luggage l left join fetch l.hasInside" ).uniqueResult();
+ assertNotNull( luggage );
+ assertNotNull( luggage.getHasInside() );
+ assertEquals( 1, luggage.getHasInside().size() );
+
+ s.delete( luggage.getHasInside().iterator().next() );
+ s.delete( luggage );
+
+ tx.commit();
+ s.close();
+ }
+
+ public void testManyToMany() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+
+ House whiteHouse = new House();
+ whiteHouse.setAddress( "1600 Pennsylvania Avenue, Washington" );
+ Inhabitant bill = new Inhabitant();
+ bill.setName( "Bill Clinton" );
+ Inhabitant george = new Inhabitant();
+ george.setName( "George W Bush" );
+ s.persist( george );
+ s.persist( bill );
+ whiteHouse.getHasInhabitants().add( bill );
+ whiteHouse.getHasInhabitants().add( george );
+ //bill.getLivesIn().add( whiteHouse );
+ //george.getLivesIn().add( whiteHouse );
+
+ s.persist( whiteHouse );
+ tx.commit();
+ s = openSession();
+ tx = s.beginTransaction();
+
+ whiteHouse = (House) s.get( House.class, whiteHouse.getId() );
+ assertNotNull( whiteHouse );
+ assertEquals( 2, whiteHouse.getHasInhabitants().size() );
+
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ bill = (Inhabitant) s.get( Inhabitant.class, bill.getId() );
+ assertNotNull( bill );
+ assertEquals( 1, bill.getLivesIn().size() );
+ assertEquals( whiteHouse.getAddress(), bill.getLivesIn().iterator().next().getAddress() );
+
+ whiteHouse = bill.getLivesIn().iterator().next();
+ s.delete( whiteHouse );
+ Iterator it = whiteHouse.getHasInhabitants().iterator();
+ while ( it.hasNext() ) {
+ s.delete( it.next() );
+ }
+ tx.commit();
+ s.close();
+ }
+
+ public void testManyToOneReferenceManyToOne() throws Exception {
+ Item item = new Item();
+ item.setId( 1 );
+ Vendor vendor = new Vendor();
+ vendor.setId( 1 );
+ ItemCost cost = new ItemCost();
+ cost.setCost( new BigDecimal(1) );
+ cost.setId( 1 );
+ cost.setItem( item );
+ cost.setVendor( vendor );
+ WarehouseItem wItem = new WarehouseItem();
+ wItem.setDefaultCost( cost );
+ wItem.setId( 1 );
+ wItem.setItem( item );
+ wItem.setQtyInStock( new BigDecimal(1) );
+ wItem.setVendor( vendor );
+ Session s = openSession( );
+ s.getTransaction().begin();
+ s.persist( item );
+ s.persist( vendor );
+ s.persist( cost );
+ s.persist( wItem );
+ s.flush();
+ s.clear();
+ wItem = (WarehouseItem) s.get(WarehouseItem.class, wItem.getId() );
+ assertNotNull( wItem.getDefaultCost().getItem() );
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public ReferencedColumnNameTest(String x) {
+ super( x );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ House.class,
+ Postman.class,
+ Bag.class,
+ Rambler.class,
+ Luggage.class,
+ Clothes.class,
+ Inhabitant.class,
+ Item.class,
+ ItemCost.class,
+ Vendor.class,
+ WarehouseItem.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Vendor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Vendor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Vendor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import javax.persistence.Id;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Vendor {
- int id;
-
- @Id
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Vendor.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Vendor.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Vendor.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/Vendor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import javax.persistence.Id;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Vendor {
+ int id;
+
+ @Id
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,71 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.referencedcolumnname;
-
-import java.math.BigDecimal;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumns;
-import javax.persistence.ManyToOne;
-import javax.persistence.JoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class WarehouseItem {
-
- int id;
- Item item;
- Vendor vendor;
- ItemCost defaultCost;
- BigDecimal qtyInStock;
-
- @Id
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public BigDecimal getQtyInStock() {
- return qtyInStock;
- }
-
- public void setQtyInStock(BigDecimal qtyInStock) {
- this.qtyInStock = qtyInStock;
- }
-
- @ManyToOne
- public Item getItem() {
- return item;
- }
-
- public void setItem(Item item) {
- this.item = item;
- }
-
- @ManyToOne
- public Vendor getVendor() {
- return vendor;
- }
-
- public void setVendor(Vendor vendor) {
- this.vendor = vendor;
- }
-
- @ManyToOne
- @JoinColumns({
- @JoinColumn(name="vendor_id", referencedColumnName="vendor_id", insertable=false, updatable=false),
- @JoinColumn(name="item_id", referencedColumnName="item_id", insertable=false, updatable=false)
- })
- public ItemCost getDefaultCost() {
- return defaultCost;
- }
-
- public void setDefaultCost(ItemCost defaultCost) {
- this.defaultCost = defaultCost;
- }
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/referencedcolumnname/WarehouseItem.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,71 @@
+//$Id: $
+package org.hibernate.test.annotations.referencedcolumnname;
+
+import java.math.BigDecimal;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumns;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class WarehouseItem {
+
+ int id;
+ Item item;
+ Vendor vendor;
+ ItemCost defaultCost;
+ BigDecimal qtyInStock;
+
+ @Id
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public BigDecimal getQtyInStock() {
+ return qtyInStock;
+ }
+
+ public void setQtyInStock(BigDecimal qtyInStock) {
+ this.qtyInStock = qtyInStock;
+ }
+
+ @ManyToOne
+ public Item getItem() {
+ return item;
+ }
+
+ public void setItem(Item item) {
+ this.item = item;
+ }
+
+ @ManyToOne
+ public Vendor getVendor() {
+ return vendor;
+ }
+
+ public void setVendor(Vendor vendor) {
+ this.vendor = vendor;
+ }
+
+ @ManyToOne
+ @JoinColumns({
+ @JoinColumn(name="vendor_id", referencedColumnName="vendor_id", insertable=false, updatable=false),
+ @JoinColumn(name="item_id", referencedColumnName="item_id", insertable=false, updatable=false)
+ })
+ public ItemCost getDefaultCost() {
+ return defaultCost;
+ }
+
+ public void setDefaultCost(ItemCost defaultCost) {
+ this.defaultCost = defaultCost;
+ }
+}
+
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Administration.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Administration.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Administration.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,77 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import javax.persistence.Basic;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.JoinColumns;
-import javax.persistence.OneToOne;
-import javax.persistence.PostLoad;
-import javax.persistence.SecondaryTable;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity(name = "JavaAdministration")
- at Table(name = "JavaAdministration")
- at SecondaryTable(name = "Extend")
-public class Administration extends Organization {
- @Id
- private Integer id;
- private String firstname;
- private String lastname;
- private String address;
- private Integer version;
- @Basic
- private String transientField;
- @OneToOne
- @JoinColumns({@JoinColumn(name = "busNumber_fk"), @JoinColumn(name = "busDriver_fk")})
- private BusTrip defaultBusTrip;
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-
- public Integer getVersion() {
- return version;
- }
-
- public void setVersion(Integer version) {
- this.version = version;
- }
-
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- @PostLoad
- public void calculate() {
- //...
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Administration.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Administration.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Administration.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Administration.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,77 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.JoinColumns;
+import javax.persistence.OneToOne;
+import javax.persistence.PostLoad;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity(name = "JavaAdministration")
+ at Table(name = "JavaAdministration")
+ at SecondaryTable(name = "Extend")
+public class Administration extends Organization {
+ @Id
+ private Integer id;
+ private String firstname;
+ private String lastname;
+ private String address;
+ private Integer version;
+ @Basic
+ private String transientField;
+ @OneToOne
+ @JoinColumns({@JoinColumn(name = "busNumber_fk"), @JoinColumn(name = "busDriver_fk")})
+ private BusTrip defaultBusTrip;
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public Integer getVersion() {
+ return version;
+ }
+
+ public void setVersion(Integer version) {
+ this.version = version;
+ }
+
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ @PostLoad
+ public void calculate() {
+ //...
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Availability.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Availability.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Availability.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-/**
- * @author Emmanuel Bernard
- */
-public enum Availability {
- ON_DUTY,
- NO_SERVICE
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Availability.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Availability.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Availability.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Availability.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum Availability {
+ ON_DUTY,
+ NO_SERVICE
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTrip.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTrip.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTrip.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,54 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class BusTrip {
- private BusTripPk id;
- private Availability status;
- private byte[] serial;
- private Date terminusTime;
- private Map<String, SocialSecurityPhysicalAccount> players;
- private List roads;
-
- @EmbeddedId
- public BusTripPk getId() {
- return id;
- }
-
- public void setId(BusTripPk id) {
- this.id = id;
- }
-
- public Availability getStatus() {
- return status;
- }
-
- public void setStatus(Availability status) {
- this.status = status;
- }
-
- public byte[] getSerial() {
- return serial;
- }
-
- public void setSerial(byte[] serial) {
- this.serial = serial;
- }
-
- public Date getTerminusTime() {
- return terminusTime;
- }
-
- public void setTerminusTime(Date terminusTime) {
- this.terminusTime = terminusTime;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTrip.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTrip.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTrip.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTrip.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,54 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class BusTrip {
+ private BusTripPk id;
+ private Availability status;
+ private byte[] serial;
+ private Date terminusTime;
+ private Map<String, SocialSecurityPhysicalAccount> players;
+ private List roads;
+
+ @EmbeddedId
+ public BusTripPk getId() {
+ return id;
+ }
+
+ public void setId(BusTripPk id) {
+ this.id = id;
+ }
+
+ public Availability getStatus() {
+ return status;
+ }
+
+ public void setStatus(Availability status) {
+ this.status = status;
+ }
+
+ public byte[] getSerial() {
+ return serial;
+ }
+
+ public void setSerial(byte[] serial) {
+ this.serial = serial;
+ }
+
+ public Date getTerminusTime() {
+ return terminusTime;
+ }
+
+ public void setTerminusTime(Date terminusTime) {
+ this.terminusTime = terminusTime;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTripPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTripPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTripPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-/**
- * @author Emmanuel Bernard
- */
-public class BusTripPk {
- private String busNumber;
- private String busDriver;
-
- public String getBusDriver() {
- return busDriver;
- }
-
- public void setBusDriver(String busDriver) {
- this.busDriver = busDriver;
- }
-
- public String getBusNumber() {
- return busNumber;
- }
-
- public void setBusNumber(String busNumber) {
- this.busNumber = busNumber;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTripPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTripPk.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTripPk.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/BusTripPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BusTripPk {
+ private String busNumber;
+ private String busDriver;
+
+ public String getBusDriver() {
+ return busDriver;
+ }
+
+ public void setBusDriver(String busDriver) {
+ this.busDriver = busDriver;
+ }
+
+ public String getBusNumber() {
+ return busNumber;
+ }
+
+ public void setBusNumber(String busNumber) {
+ this.busNumber = busNumber;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Competition.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Competition.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Competition.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
-public class Competition {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Competition.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Competition.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Competition.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Competition.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+public class Competition {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,434 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import javax.persistence.AssociationOverrides;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Embedded;
-import javax.persistence.EmbeddedId;
-import javax.persistence.Entity;
-import javax.persistence.EnumType;
-import javax.persistence.Enumerated;
-import javax.persistence.ExcludeDefaultListeners;
-import javax.persistence.ExcludeSuperclassListeners;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumns;
-import javax.persistence.JoinTable;
-import javax.persistence.Lob;
-import javax.persistence.ManyToMany;
-import javax.persistence.MapKey;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.NamedNativeQueries;
-import javax.persistence.NamedQueries;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-import javax.persistence.OrderBy;
-import javax.persistence.PrimaryKeyJoinColumn;
-import javax.persistence.PrimaryKeyJoinColumns;
-import javax.persistence.SecondaryTable;
-import javax.persistence.SecondaryTables;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.SqlResultSetMappings;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-import javax.persistence.Version;
-import javax.persistence.PrePersist;
-import javax.persistence.EntityListeners;
-import javax.persistence.PostLoad;
-import javax.persistence.PostPersist;
-
-import junit.framework.TestCase;
-import org.dom4j.DocumentException;
-import org.dom4j.io.SAXReader;
-import org.hibernate.annotations.Columns;
-import org.hibernate.cfg.EJB3DTDEntityResolver;
-import org.hibernate.cfg.annotations.reflection.EJB3OverridenAnnotationReader;
-import org.hibernate.cfg.annotations.reflection.XMLContext;
-import org.hibernate.util.XMLHelper;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.SAXNotSupportedException;
-
-
-/**
- * @author Emmanuel Bernard
- */
-public class EJB3OverridenAnnotationReaderTest extends TestCase {
- public void testMappedSuperclassAnnotations() throws Exception {
- XMLContext context = buildContext(
- "org/hibernate/test/annotations/reflection/metadata-complete.xml" );
- EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( Organization.class, context );
- assertTrue( reader.isAnnotationPresent( MappedSuperclass.class ) );
- }
-
- public void testEntityRelatedAnnotations() throws Exception {
- XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
- EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( Administration.class, context );
- assertNotNull( reader.getAnnotation( Entity.class ) );
- assertEquals(
- "Default value in xml entity should not override @Entity.name", "JavaAdministration",
- reader.getAnnotation( Entity.class ).name()
- );
- assertNotNull( reader.getAnnotation( Table.class ) );
- assertEquals( "@Table not overriden", "tbl_admin", reader.getAnnotation( Table.class ).name() );
- assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() );
- assertEquals(
- "Proper @Table.uniqueConstraints", 2,
- reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames().length
- );
- String columnName = reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames()[0];
- assertTrue(
- "Proper @Table.uniqueConstraints", "firstname".equals( columnName ) || "lastname".equals( columnName )
- );
- assertNull( "Both Java and XML used", reader.getAnnotation( SecondaryTable.class ) );
- assertNotNull( "XML does not work", reader.getAnnotation( SecondaryTables.class ) );
- SecondaryTable[] tables = reader.getAnnotation( SecondaryTables.class ).value();
- assertEquals( 1, tables.length );
- assertEquals( "admin2", tables[0].name() );
- assertEquals( "unique constraints ignored", 1, tables[0].uniqueConstraints().length );
- assertEquals( "pk join column ignored", 1, tables[0].pkJoinColumns().length );
- assertEquals( "pk join column ignored", "admin_id", tables[0].pkJoinColumns()[0].name() );
- assertNotNull( "Sequence Overriding not working", reader.getAnnotation( SequenceGenerator.class ) );
- assertEquals(
- "wrong sequence name", "seqhilo", reader.getAnnotation( SequenceGenerator.class ).sequenceName()
- );
- assertEquals( "default fails", 50, reader.getAnnotation( SequenceGenerator.class ).allocationSize() );
- assertNotNull( "TableOverriding not working", reader.getAnnotation( TableGenerator.class ) );
- assertEquals( "wrong tble name", "tablehilo", reader.getAnnotation( TableGenerator.class ).table() );
- assertEquals( "no schema overriding", "myschema", reader.getAnnotation( TableGenerator.class ).schema() );
-
- reader = new EJB3OverridenAnnotationReader( Match.class, context );
- assertNotNull( reader.getAnnotation( Table.class ) );
- assertEquals(
- "Java annotation not taken into account", "matchtable", reader.getAnnotation( Table.class ).name()
- );
- assertEquals(
- "Java annotation not taken into account", "matchschema", reader.getAnnotation( Table.class ).schema()
- );
- assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() );
- assertNotNull( "SecondaryTable swallowed", reader.getAnnotation( SecondaryTables.class ) );
- assertEquals(
- "Default schema not taken into account", "myschema",
- reader.getAnnotation( SecondaryTables.class ).value()[0].schema()
- );
- assertNotNull( reader.getAnnotation( Inheritance.class ) );
- assertEquals(
- "inheritance strategy not overriden", InheritanceType.JOINED,
- reader.getAnnotation( Inheritance.class ).strategy()
- );
- assertNotNull( "NamedQuery not overriden", reader.getAnnotation( NamedQueries.class ) );
- assertEquals( "No deduplication", 3, reader.getAnnotation( NamedQueries.class ).value().length );
- assertEquals(
- "deduplication kept the Java version", 1,
- reader.getAnnotation( NamedQueries.class ).value()[1].hints().length
- );
- assertEquals(
- "org.hibernate.timeout", reader.getAnnotation( NamedQueries.class ).value()[1].hints()[0].name()
- );
- assertNotNull( "NamedNativeQuery not overriden", reader.getAnnotation( NamedNativeQueries.class ) );
- assertEquals( "No deduplication", 3, reader.getAnnotation( NamedNativeQueries.class ).value().length );
- assertEquals(
- "deduplication kept the Java version", 1,
- reader.getAnnotation( NamedNativeQueries.class ).value()[1].hints().length
- );
- assertEquals(
- "org.hibernate.timeout", reader.getAnnotation( NamedNativeQueries.class ).value()[1].hints()[0].name()
- );
- assertNotNull( reader.getAnnotation( SqlResultSetMappings.class ) );
- assertEquals(
- "competitor1Point", reader.getAnnotation( SqlResultSetMappings.class ).value()[0].columns()[0].name()
- );
- assertEquals(
- "competitor1Point",
- reader.getAnnotation( SqlResultSetMappings.class ).value()[0].entities()[0].fields()[0].column()
- );
- assertNotNull( reader.getAnnotation( ExcludeSuperclassListeners.class ) );
- assertNotNull( reader.getAnnotation( ExcludeDefaultListeners.class ) );
-
- reader = new EJB3OverridenAnnotationReader( Competition.class, context );
- assertNotNull( reader.getAnnotation( MappedSuperclass.class ) );
-
- reader = new EJB3OverridenAnnotationReader( TennisMatch.class, context );
- assertNull( "Mutualize PKJC into PKJCs", reader.getAnnotation( PrimaryKeyJoinColumn.class ) );
- assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class ) );
- assertEquals(
- "PrimaryKeyJoinColumn overrden", "id",
- reader.getAnnotation( PrimaryKeyJoinColumns.class ).value()[0].name()
- );
- assertNotNull( reader.getAnnotation( AttributeOverrides.class ) );
- assertEquals( "Wrong deduplication", 3, reader.getAnnotation( AttributeOverrides.class ).value().length );
- assertEquals(
- "Wrong priority (XML vs java annotations)", "fld_net",
- reader.getAnnotation( AttributeOverrides.class ).value()[0].column().name()
- );
- assertEquals(
- "Column mapping", 2, reader.getAnnotation( AttributeOverrides.class ).value()[1].column().scale()
- );
- assertEquals(
- "Column mapping", true, reader.getAnnotation( AttributeOverrides.class ).value()[1].column().unique()
- );
- assertNotNull( reader.getAnnotation( AssociationOverrides.class ) );
- assertEquals( "no XML processing", 1, reader.getAnnotation( AssociationOverrides.class ).value().length );
- assertEquals(
- "wrong xml processing", "id",
- reader.getAnnotation( AssociationOverrides.class ).value()[0].joinColumns()[0].referencedColumnName()
- );
-
-
- reader = new EJB3OverridenAnnotationReader( SocialSecurityPhysicalAccount.class, context );
- assertNotNull( reader.getAnnotation( IdClass.class ) );
- assertEquals( "id-class not used", SocialSecurityNumber.class, reader.getAnnotation( IdClass.class ).value() );
- assertEquals(
- "discriminator-value not used", "Physical", reader.getAnnotation( DiscriminatorValue.class ).value()
- );
- assertNotNull( "discriminator-column not used", reader.getAnnotation( DiscriminatorColumn.class ) );
- assertEquals(
- "discriminator-column.name default value broken", "DTYPE",
- reader.getAnnotation( DiscriminatorColumn.class ).name()
- );
- assertEquals(
- "discriminator-column.length broken", 34, reader.getAnnotation( DiscriminatorColumn.class ).length()
- );
- }
-
- public void testEntityRelatedAnnotationsMetadataComplete() throws Exception {
- XMLContext context = buildContext(
- "org/hibernate/test/annotations/reflection/metadata-complete.xml" );
- EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( Administration.class, context );
- assertNotNull( reader.getAnnotation( Entity.class ) );
- assertEquals(
- "Metadata complete should ignore java annotations", "", reader.getAnnotation( Entity.class ).name()
- );
- assertNotNull( reader.getAnnotation( Table.class ) );
- assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() );
- assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() );
-
- reader = new EJB3OverridenAnnotationReader( Match.class, context );
- assertNotNull( reader.getAnnotation( Table.class ) );
- assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() );
- assertEquals( "Overriding not taken into account", "myschema", reader.getAnnotation( Table.class ).schema() );
- assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() );
- assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTable.class ) );
- assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTables.class ) );
- assertNull( "Ignore Java annotation", reader.getAnnotation( Inheritance.class ) );
- assertNull( reader.getAnnotation( NamedQueries.class ) );
- assertNull( reader.getAnnotation( NamedNativeQueries.class ) );
-
- reader = new EJB3OverridenAnnotationReader( TennisMatch.class, context );
- assertNull( reader.getAnnotation( PrimaryKeyJoinColumn.class ) );
- assertNull( reader.getAnnotation( PrimaryKeyJoinColumns.class ) );
-
- reader = new EJB3OverridenAnnotationReader( Competition.class, context );
- assertNull( reader.getAnnotation( MappedSuperclass.class ) );
-
- reader = new EJB3OverridenAnnotationReader( SocialSecurityMoralAccount.class, context );
- assertNull( reader.getAnnotation( IdClass.class ) );
- assertNull( reader.getAnnotation( DiscriminatorValue.class ) );
- assertNull( reader.getAnnotation( DiscriminatorColumn.class ) );
- assertNull( reader.getAnnotation( SequenceGenerator.class ) );
- assertNull( reader.getAnnotation( TableGenerator.class ) );
- }
-
- public void testIdRelatedAnnotations() throws Exception {
- XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
- Method method = Administration.class.getDeclaredMethod( "getId" );
- EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( method, context );
- assertNull( reader.getAnnotation( Id.class ) );
- assertNull( reader.getAnnotation( Column.class ) );
- Field field = Administration.class.getDeclaredField( "id" );
- reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( Id.class ) );
- assertNotNull( reader.getAnnotation( GeneratedValue.class ) );
- assertEquals( GenerationType.SEQUENCE, reader.getAnnotation( GeneratedValue.class ).strategy() );
- assertEquals( "generator", reader.getAnnotation( GeneratedValue.class ).generator() );
- assertNotNull( reader.getAnnotation( SequenceGenerator.class ) );
- assertEquals( "seq", reader.getAnnotation( SequenceGenerator.class ).sequenceName() );
- assertNotNull( reader.getAnnotation( Columns.class ) );
- assertEquals( 1, reader.getAnnotation( Columns.class ).columns().length );
- assertEquals( "fld_id", reader.getAnnotation( Columns.class ).columns()[0].name() );
- assertNotNull( reader.getAnnotation( Temporal.class ) );
- assertEquals( TemporalType.DATE, reader.getAnnotation( Temporal.class ).value() );
-
- context = buildContext(
- "org/hibernate/test/annotations/reflection/metadata-complete.xml" );
- method = Administration.class.getDeclaredMethod( "getId" );
- reader = new EJB3OverridenAnnotationReader( method, context );
- assertNotNull(
- "Default access type when not defined in metadata complete should be property",
- reader.getAnnotation( Id.class )
- );
- field = Administration.class.getDeclaredField( "id" );
- reader = new EJB3OverridenAnnotationReader( field, context );
- assertNull(
- "Default access type when not defined in metadata complete should be property",
- reader.getAnnotation( Id.class )
- );
-
- method = BusTrip.class.getDeclaredMethod( "getId" );
- reader = new EJB3OverridenAnnotationReader( method, context );
- assertNull( reader.getAnnotation( EmbeddedId.class ) );
- field = BusTrip.class.getDeclaredField( "id" );
- reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( EmbeddedId.class ) );
- assertNotNull( reader.getAnnotation( AttributeOverrides.class ) );
- assertEquals( 1, reader.getAnnotation( AttributeOverrides.class ).value().length );
- }
-
- public void testBasicRelatedAnnotations() throws Exception {
- XMLContext context = buildContext(
- "org/hibernate/test/annotations/reflection/metadata-complete.xml" );
- Field field = BusTrip.class.getDeclaredField( "status" );
- EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( Enumerated.class ) );
- assertEquals( EnumType.STRING, reader.getAnnotation( Enumerated.class ).value() );
- assertEquals( false, reader.getAnnotation( Basic.class ).optional() );
- field = BusTrip.class.getDeclaredField( "serial" );
- reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( Lob.class ) );
- assertEquals( "serialbytes", reader.getAnnotation( Columns.class ).columns()[0].name() );
- field = BusTrip.class.getDeclaredField( "terminusTime" );
- reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( Temporal.class ) );
- assertEquals( TemporalType.TIMESTAMP, reader.getAnnotation( Temporal.class ).value() );
- assertEquals( FetchType.LAZY, reader.getAnnotation( Basic.class ).fetch() );
-
- field = BusTripPk.class.getDeclaredField( "busDriver" );
- reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.isAnnotationPresent( Basic.class ) );
- }
-
- public void testVersionRelatedAnnotations() throws Exception {
- XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
- Method method = Administration.class.getDeclaredMethod( "getVersion" );
- EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( method, context );
- assertNotNull( reader.getAnnotation( Version.class ) );
-
- Field field = Match.class.getDeclaredField( "version" );
- reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( Version.class ) );
- }
-
- public void testTransientAndEmbeddedRelatedAnnotations() throws Exception {
- XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
-
- Field field = Administration.class.getDeclaredField( "transientField" );
- EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( Transient.class ) );
- assertNull( reader.getAnnotation( Basic.class ) );
-
- field = Match.class.getDeclaredField( "playerASSN" );
- reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( Embedded.class ) );
- }
-
- public void testAssociationRelatedAnnotations() throws Exception {
- XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
-
- Field field = Administration.class.getDeclaredField( "defaultBusTrip" );
- EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( OneToOne.class ) );
- assertNull( reader.getAnnotation( JoinColumns.class ) );
- assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class ) );
- assertEquals( "pk", reader.getAnnotation( PrimaryKeyJoinColumns.class ).value()[0].name() );
- assertEquals( 5, reader.getAnnotation( OneToOne.class ).cascade().length );
- assertEquals( FetchType.LAZY, reader.getAnnotation( OneToOne.class ).fetch() );
- assertEquals( "test", reader.getAnnotation( OneToOne.class ).mappedBy() );
-
- context = buildContext(
- "org/hibernate/test/annotations/reflection/metadata-complete.xml" );
- field = BusTrip.class.getDeclaredField( "players" );
- reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( OneToMany.class ) );
- assertNotNull( reader.getAnnotation( JoinColumns.class ) );
- assertEquals( 2, reader.getAnnotation( JoinColumns.class ).value().length );
- assertEquals( "driver", reader.getAnnotation( JoinColumns.class ).value()[0].name() );
- assertNotNull( reader.getAnnotation( MapKey.class ) );
- assertEquals( "name", reader.getAnnotation( MapKey.class ).name() );
-
- field = BusTrip.class.getDeclaredField( "roads" );
- reader = new EJB3OverridenAnnotationReader( field, context );
- assertNotNull( reader.getAnnotation( ManyToMany.class ) );
- assertNotNull( reader.getAnnotation( JoinTable.class ) );
- assertEquals( "bus_road", reader.getAnnotation( JoinTable.class ).name() );
- assertEquals( 2, reader.getAnnotation( JoinTable.class ).joinColumns().length );
- assertEquals( 1, reader.getAnnotation( JoinTable.class ).inverseJoinColumns().length );
- assertEquals( 2, reader.getAnnotation( JoinTable.class ).uniqueConstraints()[0].columnNames().length );
- assertNotNull( reader.getAnnotation( OrderBy.class ) );
- assertEquals( "maxSpeed", reader.getAnnotation( OrderBy.class ).value() );
- }
-
- public void testEntityListeners() throws Exception {
- XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
-
- Method method = Administration.class.getDeclaredMethod( "calculate" );
- EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( method, context );
- assertTrue( reader.isAnnotationPresent( PrePersist.class ) );
-
- reader = new EJB3OverridenAnnotationReader( Administration.class, context );
- assertTrue( reader.isAnnotationPresent( EntityListeners.class ) );
- assertEquals( 1, reader.getAnnotation( EntityListeners.class ).value().length );
- assertEquals( LogListener.class, reader.getAnnotation( EntityListeners.class ).value()[0] );
-
- method = LogListener.class.getDeclaredMethod( "noLog", Object.class );
- reader = new EJB3OverridenAnnotationReader( method, context );
- assertTrue( reader.isAnnotationPresent( PostLoad.class ) );
-
- method = LogListener.class.getDeclaredMethod( "log", Object.class );
- reader = new EJB3OverridenAnnotationReader( method, context );
- assertTrue( reader.isAnnotationPresent( PrePersist.class ) );
- assertFalse( reader.isAnnotationPresent( PostPersist.class ) );
-
- assertEquals( 1, context.getDefaultEntityListeners().size() );
- assertEquals( OtherLogListener.class.getName(), context.getDefaultEntityListeners().get(0) );
- }
-
- private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException {
- XMLHelper xmlHelper = new XMLHelper();
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
- InputStream is = cl.getResourceAsStream( ormfile );
- assertNotNull( "ORM.xml not found: " + ormfile, is );
- XMLContext context = new XMLContext();
- List errors = new ArrayList();
- SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, EJB3DTDEntityResolver.INSTANCE );
- //saxReader.setValidation( false );
- try {
- saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
- }
- catch (SAXNotSupportedException e) {
- saxReader.setValidation( false );
- }
- org.dom4j.Document doc;
- try {
- doc = saxReader
- .read( new InputSource( new BufferedInputStream( is ) ) );
- }
- finally {
- is.close();
- }
- if (errors.size() > 0) {
- System.out.println( errors.get( 0 ) );
- }
- assertEquals( 0, errors.size() );
- context.addDocument( doc );
- return context;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/EJB3OverridenAnnotationReaderTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,434 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.AssociationOverrides;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Basic;
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Embedded;
+import javax.persistence.EmbeddedId;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.ExcludeDefaultListeners;
+import javax.persistence.ExcludeSuperclassListeners;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumns;
+import javax.persistence.JoinTable;
+import javax.persistence.Lob;
+import javax.persistence.ManyToMany;
+import javax.persistence.MapKey;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedQueries;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+import javax.persistence.OrderBy;
+import javax.persistence.PrimaryKeyJoinColumn;
+import javax.persistence.PrimaryKeyJoinColumns;
+import javax.persistence.SecondaryTable;
+import javax.persistence.SecondaryTables;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.SqlResultSetMappings;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+import javax.persistence.Version;
+import javax.persistence.PrePersist;
+import javax.persistence.EntityListeners;
+import javax.persistence.PostLoad;
+import javax.persistence.PostPersist;
+
+import junit.framework.TestCase;
+import org.dom4j.DocumentException;
+import org.dom4j.io.SAXReader;
+import org.hibernate.annotations.Columns;
+import org.hibernate.cfg.EJB3DTDEntityResolver;
+import org.hibernate.cfg.annotations.reflection.EJB3OverridenAnnotationReader;
+import org.hibernate.cfg.annotations.reflection.XMLContext;
+import org.hibernate.util.XMLHelper;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.SAXNotSupportedException;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EJB3OverridenAnnotationReaderTest extends TestCase {
+ public void testMappedSuperclassAnnotations() throws Exception {
+ XMLContext context = buildContext(
+ "org/hibernate/test/annotations/reflection/metadata-complete.xml" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( Organization.class, context );
+ assertTrue( reader.isAnnotationPresent( MappedSuperclass.class ) );
+ }
+
+ public void testEntityRelatedAnnotations() throws Exception {
+ XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( Administration.class, context );
+ assertNotNull( reader.getAnnotation( Entity.class ) );
+ assertEquals(
+ "Default value in xml entity should not override @Entity.name", "JavaAdministration",
+ reader.getAnnotation( Entity.class ).name()
+ );
+ assertNotNull( reader.getAnnotation( Table.class ) );
+ assertEquals( "@Table not overriden", "tbl_admin", reader.getAnnotation( Table.class ).name() );
+ assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() );
+ assertEquals(
+ "Proper @Table.uniqueConstraints", 2,
+ reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames().length
+ );
+ String columnName = reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames()[0];
+ assertTrue(
+ "Proper @Table.uniqueConstraints", "firstname".equals( columnName ) || "lastname".equals( columnName )
+ );
+ assertNull( "Both Java and XML used", reader.getAnnotation( SecondaryTable.class ) );
+ assertNotNull( "XML does not work", reader.getAnnotation( SecondaryTables.class ) );
+ SecondaryTable[] tables = reader.getAnnotation( SecondaryTables.class ).value();
+ assertEquals( 1, tables.length );
+ assertEquals( "admin2", tables[0].name() );
+ assertEquals( "unique constraints ignored", 1, tables[0].uniqueConstraints().length );
+ assertEquals( "pk join column ignored", 1, tables[0].pkJoinColumns().length );
+ assertEquals( "pk join column ignored", "admin_id", tables[0].pkJoinColumns()[0].name() );
+ assertNotNull( "Sequence Overriding not working", reader.getAnnotation( SequenceGenerator.class ) );
+ assertEquals(
+ "wrong sequence name", "seqhilo", reader.getAnnotation( SequenceGenerator.class ).sequenceName()
+ );
+ assertEquals( "default fails", 50, reader.getAnnotation( SequenceGenerator.class ).allocationSize() );
+ assertNotNull( "TableOverriding not working", reader.getAnnotation( TableGenerator.class ) );
+ assertEquals( "wrong tble name", "tablehilo", reader.getAnnotation( TableGenerator.class ).table() );
+ assertEquals( "no schema overriding", "myschema", reader.getAnnotation( TableGenerator.class ).schema() );
+
+ reader = new EJB3OverridenAnnotationReader( Match.class, context );
+ assertNotNull( reader.getAnnotation( Table.class ) );
+ assertEquals(
+ "Java annotation not taken into account", "matchtable", reader.getAnnotation( Table.class ).name()
+ );
+ assertEquals(
+ "Java annotation not taken into account", "matchschema", reader.getAnnotation( Table.class ).schema()
+ );
+ assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() );
+ assertNotNull( "SecondaryTable swallowed", reader.getAnnotation( SecondaryTables.class ) );
+ assertEquals(
+ "Default schema not taken into account", "myschema",
+ reader.getAnnotation( SecondaryTables.class ).value()[0].schema()
+ );
+ assertNotNull( reader.getAnnotation( Inheritance.class ) );
+ assertEquals(
+ "inheritance strategy not overriden", InheritanceType.JOINED,
+ reader.getAnnotation( Inheritance.class ).strategy()
+ );
+ assertNotNull( "NamedQuery not overriden", reader.getAnnotation( NamedQueries.class ) );
+ assertEquals( "No deduplication", 3, reader.getAnnotation( NamedQueries.class ).value().length );
+ assertEquals(
+ "deduplication kept the Java version", 1,
+ reader.getAnnotation( NamedQueries.class ).value()[1].hints().length
+ );
+ assertEquals(
+ "org.hibernate.timeout", reader.getAnnotation( NamedQueries.class ).value()[1].hints()[0].name()
+ );
+ assertNotNull( "NamedNativeQuery not overriden", reader.getAnnotation( NamedNativeQueries.class ) );
+ assertEquals( "No deduplication", 3, reader.getAnnotation( NamedNativeQueries.class ).value().length );
+ assertEquals(
+ "deduplication kept the Java version", 1,
+ reader.getAnnotation( NamedNativeQueries.class ).value()[1].hints().length
+ );
+ assertEquals(
+ "org.hibernate.timeout", reader.getAnnotation( NamedNativeQueries.class ).value()[1].hints()[0].name()
+ );
+ assertNotNull( reader.getAnnotation( SqlResultSetMappings.class ) );
+ assertEquals(
+ "competitor1Point", reader.getAnnotation( SqlResultSetMappings.class ).value()[0].columns()[0].name()
+ );
+ assertEquals(
+ "competitor1Point",
+ reader.getAnnotation( SqlResultSetMappings.class ).value()[0].entities()[0].fields()[0].column()
+ );
+ assertNotNull( reader.getAnnotation( ExcludeSuperclassListeners.class ) );
+ assertNotNull( reader.getAnnotation( ExcludeDefaultListeners.class ) );
+
+ reader = new EJB3OverridenAnnotationReader( Competition.class, context );
+ assertNotNull( reader.getAnnotation( MappedSuperclass.class ) );
+
+ reader = new EJB3OverridenAnnotationReader( TennisMatch.class, context );
+ assertNull( "Mutualize PKJC into PKJCs", reader.getAnnotation( PrimaryKeyJoinColumn.class ) );
+ assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class ) );
+ assertEquals(
+ "PrimaryKeyJoinColumn overrden", "id",
+ reader.getAnnotation( PrimaryKeyJoinColumns.class ).value()[0].name()
+ );
+ assertNotNull( reader.getAnnotation( AttributeOverrides.class ) );
+ assertEquals( "Wrong deduplication", 3, reader.getAnnotation( AttributeOverrides.class ).value().length );
+ assertEquals(
+ "Wrong priority (XML vs java annotations)", "fld_net",
+ reader.getAnnotation( AttributeOverrides.class ).value()[0].column().name()
+ );
+ assertEquals(
+ "Column mapping", 2, reader.getAnnotation( AttributeOverrides.class ).value()[1].column().scale()
+ );
+ assertEquals(
+ "Column mapping", true, reader.getAnnotation( AttributeOverrides.class ).value()[1].column().unique()
+ );
+ assertNotNull( reader.getAnnotation( AssociationOverrides.class ) );
+ assertEquals( "no XML processing", 1, reader.getAnnotation( AssociationOverrides.class ).value().length );
+ assertEquals(
+ "wrong xml processing", "id",
+ reader.getAnnotation( AssociationOverrides.class ).value()[0].joinColumns()[0].referencedColumnName()
+ );
+
+
+ reader = new EJB3OverridenAnnotationReader( SocialSecurityPhysicalAccount.class, context );
+ assertNotNull( reader.getAnnotation( IdClass.class ) );
+ assertEquals( "id-class not used", SocialSecurityNumber.class, reader.getAnnotation( IdClass.class ).value() );
+ assertEquals(
+ "discriminator-value not used", "Physical", reader.getAnnotation( DiscriminatorValue.class ).value()
+ );
+ assertNotNull( "discriminator-column not used", reader.getAnnotation( DiscriminatorColumn.class ) );
+ assertEquals(
+ "discriminator-column.name default value broken", "DTYPE",
+ reader.getAnnotation( DiscriminatorColumn.class ).name()
+ );
+ assertEquals(
+ "discriminator-column.length broken", 34, reader.getAnnotation( DiscriminatorColumn.class ).length()
+ );
+ }
+
+ public void testEntityRelatedAnnotationsMetadataComplete() throws Exception {
+ XMLContext context = buildContext(
+ "org/hibernate/test/annotations/reflection/metadata-complete.xml" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( Administration.class, context );
+ assertNotNull( reader.getAnnotation( Entity.class ) );
+ assertEquals(
+ "Metadata complete should ignore java annotations", "", reader.getAnnotation( Entity.class ).name()
+ );
+ assertNotNull( reader.getAnnotation( Table.class ) );
+ assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() );
+ assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() );
+
+ reader = new EJB3OverridenAnnotationReader( Match.class, context );
+ assertNotNull( reader.getAnnotation( Table.class ) );
+ assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() );
+ assertEquals( "Overriding not taken into account", "myschema", reader.getAnnotation( Table.class ).schema() );
+ assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() );
+ assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTable.class ) );
+ assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTables.class ) );
+ assertNull( "Ignore Java annotation", reader.getAnnotation( Inheritance.class ) );
+ assertNull( reader.getAnnotation( NamedQueries.class ) );
+ assertNull( reader.getAnnotation( NamedNativeQueries.class ) );
+
+ reader = new EJB3OverridenAnnotationReader( TennisMatch.class, context );
+ assertNull( reader.getAnnotation( PrimaryKeyJoinColumn.class ) );
+ assertNull( reader.getAnnotation( PrimaryKeyJoinColumns.class ) );
+
+ reader = new EJB3OverridenAnnotationReader( Competition.class, context );
+ assertNull( reader.getAnnotation( MappedSuperclass.class ) );
+
+ reader = new EJB3OverridenAnnotationReader( SocialSecurityMoralAccount.class, context );
+ assertNull( reader.getAnnotation( IdClass.class ) );
+ assertNull( reader.getAnnotation( DiscriminatorValue.class ) );
+ assertNull( reader.getAnnotation( DiscriminatorColumn.class ) );
+ assertNull( reader.getAnnotation( SequenceGenerator.class ) );
+ assertNull( reader.getAnnotation( TableGenerator.class ) );
+ }
+
+ public void testIdRelatedAnnotations() throws Exception {
+ XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+ Method method = Administration.class.getDeclaredMethod( "getId" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( method, context );
+ assertNull( reader.getAnnotation( Id.class ) );
+ assertNull( reader.getAnnotation( Column.class ) );
+ Field field = Administration.class.getDeclaredField( "id" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( Id.class ) );
+ assertNotNull( reader.getAnnotation( GeneratedValue.class ) );
+ assertEquals( GenerationType.SEQUENCE, reader.getAnnotation( GeneratedValue.class ).strategy() );
+ assertEquals( "generator", reader.getAnnotation( GeneratedValue.class ).generator() );
+ assertNotNull( reader.getAnnotation( SequenceGenerator.class ) );
+ assertEquals( "seq", reader.getAnnotation( SequenceGenerator.class ).sequenceName() );
+ assertNotNull( reader.getAnnotation( Columns.class ) );
+ assertEquals( 1, reader.getAnnotation( Columns.class ).columns().length );
+ assertEquals( "fld_id", reader.getAnnotation( Columns.class ).columns()[0].name() );
+ assertNotNull( reader.getAnnotation( Temporal.class ) );
+ assertEquals( TemporalType.DATE, reader.getAnnotation( Temporal.class ).value() );
+
+ context = buildContext(
+ "org/hibernate/test/annotations/reflection/metadata-complete.xml" );
+ method = Administration.class.getDeclaredMethod( "getId" );
+ reader = new EJB3OverridenAnnotationReader( method, context );
+ assertNotNull(
+ "Default access type when not defined in metadata complete should be property",
+ reader.getAnnotation( Id.class )
+ );
+ field = Administration.class.getDeclaredField( "id" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNull(
+ "Default access type when not defined in metadata complete should be property",
+ reader.getAnnotation( Id.class )
+ );
+
+ method = BusTrip.class.getDeclaredMethod( "getId" );
+ reader = new EJB3OverridenAnnotationReader( method, context );
+ assertNull( reader.getAnnotation( EmbeddedId.class ) );
+ field = BusTrip.class.getDeclaredField( "id" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( EmbeddedId.class ) );
+ assertNotNull( reader.getAnnotation( AttributeOverrides.class ) );
+ assertEquals( 1, reader.getAnnotation( AttributeOverrides.class ).value().length );
+ }
+
+ public void testBasicRelatedAnnotations() throws Exception {
+ XMLContext context = buildContext(
+ "org/hibernate/test/annotations/reflection/metadata-complete.xml" );
+ Field field = BusTrip.class.getDeclaredField( "status" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( Enumerated.class ) );
+ assertEquals( EnumType.STRING, reader.getAnnotation( Enumerated.class ).value() );
+ assertEquals( false, reader.getAnnotation( Basic.class ).optional() );
+ field = BusTrip.class.getDeclaredField( "serial" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( Lob.class ) );
+ assertEquals( "serialbytes", reader.getAnnotation( Columns.class ).columns()[0].name() );
+ field = BusTrip.class.getDeclaredField( "terminusTime" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( Temporal.class ) );
+ assertEquals( TemporalType.TIMESTAMP, reader.getAnnotation( Temporal.class ).value() );
+ assertEquals( FetchType.LAZY, reader.getAnnotation( Basic.class ).fetch() );
+
+ field = BusTripPk.class.getDeclaredField( "busDriver" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.isAnnotationPresent( Basic.class ) );
+ }
+
+ public void testVersionRelatedAnnotations() throws Exception {
+ XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+ Method method = Administration.class.getDeclaredMethod( "getVersion" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( method, context );
+ assertNotNull( reader.getAnnotation( Version.class ) );
+
+ Field field = Match.class.getDeclaredField( "version" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( Version.class ) );
+ }
+
+ public void testTransientAndEmbeddedRelatedAnnotations() throws Exception {
+ XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+
+ Field field = Administration.class.getDeclaredField( "transientField" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( Transient.class ) );
+ assertNull( reader.getAnnotation( Basic.class ) );
+
+ field = Match.class.getDeclaredField( "playerASSN" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( Embedded.class ) );
+ }
+
+ public void testAssociationRelatedAnnotations() throws Exception {
+ XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+
+ Field field = Administration.class.getDeclaredField( "defaultBusTrip" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( OneToOne.class ) );
+ assertNull( reader.getAnnotation( JoinColumns.class ) );
+ assertNotNull( reader.getAnnotation( PrimaryKeyJoinColumns.class ) );
+ assertEquals( "pk", reader.getAnnotation( PrimaryKeyJoinColumns.class ).value()[0].name() );
+ assertEquals( 5, reader.getAnnotation( OneToOne.class ).cascade().length );
+ assertEquals( FetchType.LAZY, reader.getAnnotation( OneToOne.class ).fetch() );
+ assertEquals( "test", reader.getAnnotation( OneToOne.class ).mappedBy() );
+
+ context = buildContext(
+ "org/hibernate/test/annotations/reflection/metadata-complete.xml" );
+ field = BusTrip.class.getDeclaredField( "players" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( OneToMany.class ) );
+ assertNotNull( reader.getAnnotation( JoinColumns.class ) );
+ assertEquals( 2, reader.getAnnotation( JoinColumns.class ).value().length );
+ assertEquals( "driver", reader.getAnnotation( JoinColumns.class ).value()[0].name() );
+ assertNotNull( reader.getAnnotation( MapKey.class ) );
+ assertEquals( "name", reader.getAnnotation( MapKey.class ).name() );
+
+ field = BusTrip.class.getDeclaredField( "roads" );
+ reader = new EJB3OverridenAnnotationReader( field, context );
+ assertNotNull( reader.getAnnotation( ManyToMany.class ) );
+ assertNotNull( reader.getAnnotation( JoinTable.class ) );
+ assertEquals( "bus_road", reader.getAnnotation( JoinTable.class ).name() );
+ assertEquals( 2, reader.getAnnotation( JoinTable.class ).joinColumns().length );
+ assertEquals( 1, reader.getAnnotation( JoinTable.class ).inverseJoinColumns().length );
+ assertEquals( 2, reader.getAnnotation( JoinTable.class ).uniqueConstraints()[0].columnNames().length );
+ assertNotNull( reader.getAnnotation( OrderBy.class ) );
+ assertEquals( "maxSpeed", reader.getAnnotation( OrderBy.class ).value() );
+ }
+
+ public void testEntityListeners() throws Exception {
+ XMLContext context = buildContext( "org/hibernate/test/annotations/reflection/orm.xml" );
+
+ Method method = Administration.class.getDeclaredMethod( "calculate" );
+ EJB3OverridenAnnotationReader reader = new EJB3OverridenAnnotationReader( method, context );
+ assertTrue( reader.isAnnotationPresent( PrePersist.class ) );
+
+ reader = new EJB3OverridenAnnotationReader( Administration.class, context );
+ assertTrue( reader.isAnnotationPresent( EntityListeners.class ) );
+ assertEquals( 1, reader.getAnnotation( EntityListeners.class ).value().length );
+ assertEquals( LogListener.class, reader.getAnnotation( EntityListeners.class ).value()[0] );
+
+ method = LogListener.class.getDeclaredMethod( "noLog", Object.class );
+ reader = new EJB3OverridenAnnotationReader( method, context );
+ assertTrue( reader.isAnnotationPresent( PostLoad.class ) );
+
+ method = LogListener.class.getDeclaredMethod( "log", Object.class );
+ reader = new EJB3OverridenAnnotationReader( method, context );
+ assertTrue( reader.isAnnotationPresent( PrePersist.class ) );
+ assertFalse( reader.isAnnotationPresent( PostPersist.class ) );
+
+ assertEquals( 1, context.getDefaultEntityListeners().size() );
+ assertEquals( OtherLogListener.class.getName(), context.getDefaultEntityListeners().get(0) );
+ }
+
+ private XMLContext buildContext(String ormfile) throws SAXException, DocumentException, IOException {
+ XMLHelper xmlHelper = new XMLHelper();
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ InputStream is = cl.getResourceAsStream( ormfile );
+ assertNotNull( "ORM.xml not found: " + ormfile, is );
+ XMLContext context = new XMLContext();
+ List errors = new ArrayList();
+ SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, EJB3DTDEntityResolver.INSTANCE );
+ //saxReader.setValidation( false );
+ try {
+ saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
+ }
+ catch (SAXNotSupportedException e) {
+ saxReader.setValidation( false );
+ }
+ org.dom4j.Document doc;
+ try {
+ doc = saxReader
+ .read( new InputSource( new BufferedInputStream( is ) ) );
+ }
+ finally {
+ is.close();
+ }
+ if (errors.size() > 0) {
+ System.out.println( errors.get( 0 ) );
+ }
+ assertEquals( 0, errors.size() );
+ context.addDocument( doc );
+ return context;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/LogListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/LogListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/LogListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import javax.persistence.PrePersist;
-import javax.persistence.PostPersist;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @author Emmanuel Bernard
- */
-public class LogListener {
- Log log = LogFactory.getLog( LogListener.class );
-
- @PrePersist
- @PostPersist
- public void log(Object entity) {
- log.debug( "Logging entity " + entity.getClass().getName() + " with hashCode: " + entity.hashCode() );
- }
-
-
- public void noLog(Object entity) {
- log.debug( "NoLogging entity " + entity.getClass().getName() + " with hashCode: " + entity.hashCode() );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/LogListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/LogListener.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/LogListener.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/LogListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.PrePersist;
+import javax.persistence.PostPersist;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LogListener {
+ Log log = LogFactory.getLog( LogListener.class );
+
+ @PrePersist
+ @PostPersist
+ public void log(Object entity) {
+ log.debug( "Logging entity " + entity.getClass().getName() + " with hashCode: " + entity.hashCode() );
+ }
+
+
+ public void noLog(Object entity) {
+ log.debug( "NoLogging entity " + entity.getClass().getName() + " with hashCode: " + entity.hashCode() );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Match.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Match.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Match.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import javax.persistence.Entity;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.NamedNativeQueries;
-import javax.persistence.NamedNativeQuery;
-import javax.persistence.NamedQueries;
-import javax.persistence.NamedQuery;
-import javax.persistence.SecondaryTable;
-import javax.persistence.Table;
-import javax.persistence.Version;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "matchtable", schema = "matchschema")
- at SecondaryTable(name = "extendedMatch")
- at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
- at NamedQueries({
- at NamedQuery(name = "matchbyid", query = "select m from Match m where m.id = :id"),
- at NamedQuery(name = "getAllMatches2", query = "select m from Match m")
- })
- at NamedNativeQueries({
- at NamedNativeQuery(name = "matchbyid", query = "select m from Match m where m.id = :id", resultSetMapping = "matchrs"),
- at NamedNativeQuery(name = "getAllMatches2", query = "select m from Match m", resultSetMapping = "matchrs")
- })
-public class Match extends Competition {
- public String competitor1Point;
- @Version
- public Integer version;
- public SocialSecurityNumber playerASSN;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Match.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Match.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Match.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Match.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.NamedNativeQueries;
+import javax.persistence.NamedNativeQuery;
+import javax.persistence.NamedQueries;
+import javax.persistence.NamedQuery;
+import javax.persistence.SecondaryTable;
+import javax.persistence.Table;
+import javax.persistence.Version;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "matchtable", schema = "matchschema")
+ at SecondaryTable(name = "extendedMatch")
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+ at NamedQueries({
+ at NamedQuery(name = "matchbyid", query = "select m from Match m where m.id = :id"),
+ at NamedQuery(name = "getAllMatches2", query = "select m from Match m")
+ })
+ at NamedNativeQueries({
+ at NamedNativeQuery(name = "matchbyid", query = "select m from Match m where m.id = :id", resultSetMapping = "matchrs"),
+ at NamedNativeQuery(name = "getAllMatches2", query = "select m from Match m", resultSetMapping = "matchrs")
+ })
+public class Match extends Competition {
+ public String competitor1Point;
+ @Version
+ public Integer version;
+ public SocialSecurityNumber playerASSN;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Organization.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Organization.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Organization.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Organization {
- private String organizationId;
-
- public String getOrganizationId() {
- return organizationId;
- }
-
- public void setOrganizationId(String organizationId) {
- this.organizationId = organizationId;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Organization.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Organization.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Organization.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/Organization.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Organization {
+ private String organizationId;
+
+ public String getOrganizationId() {
+ return organizationId;
+ }
+
+ public void setOrganizationId(String organizationId) {
+ this.organizationId = organizationId;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/OtherLogListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/OtherLogListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/OtherLogListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import javax.persistence.PrePersist;
-import javax.persistence.PostPersist;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @author Emmanuel Bernard
- */
-public class OtherLogListener {
- Log log = LogFactory.getLog( OtherLogListener.class );
-
- @PrePersist
- @PostPersist
- public void log(Object entity) {
- log.debug( "Logging entity " + entity.getClass().getName() + " with hashCode: " + entity.hashCode() );
- }
-
-
- public void noLog(Object entity) {
- log.debug( "NoLogging entity " + entity.getClass().getName() + " with hashCode: " + entity.hashCode() );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/OtherLogListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/OtherLogListener.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/OtherLogListener.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/OtherLogListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.PrePersist;
+import javax.persistence.PostPersist;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OtherLogListener {
+ Log log = LogFactory.getLog( OtherLogListener.class );
+
+ @PrePersist
+ @PostPersist
+ public void log(Object entity) {
+ log.debug( "Logging entity " + entity.getClass().getName() + " with hashCode: " + entity.hashCode() );
+ }
+
+
+ public void noLog(Object entity) {
+ log.debug( "NoLogging entity " + entity.getClass().getName() + " with hashCode: " + entity.hashCode() );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.IdClass;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.TableGenerator;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at IdClass(SocialSecurityNumber.class)
- at DiscriminatorValue("Moral")
- at SequenceGenerator(name = "seq")
- at TableGenerator(name = "table")
-public class SocialSecurityMoralAccount {
- public String number;
- public String countryCode;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityMoralAccount.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.IdClass;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.TableGenerator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(SocialSecurityNumber.class)
+ at DiscriminatorValue("Moral")
+ at SequenceGenerator(name = "seq")
+ at TableGenerator(name = "table")
+public class SocialSecurityMoralAccount {
+ public String number;
+ public String countryCode;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class SocialSecurityNumber implements Serializable {
- public String number;
- public String countryCode;
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final SocialSecurityNumber that = (SocialSecurityNumber) o;
-
- if ( !countryCode.equals( that.countryCode ) ) return false;
- if ( !number.equals( that.number ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = number.hashCode();
- result = 29 * result + countryCode.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityNumber.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class SocialSecurityNumber implements Serializable {
+ public String number;
+ public String countryCode;
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final SocialSecurityNumber that = (SocialSecurityNumber) o;
+
+ if ( !countryCode.equals( that.countryCode ) ) return false;
+ if ( !number.equals( that.number ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = number.hashCode();
+ result = 29 * result + countryCode.hashCode();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class SocialSecurityPhysicalAccount {
- public String number;
- public String countryCode;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/SocialSecurityPhysicalAccount.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class SocialSecurityPhysicalAccount {
+ public String number;
+ public String countryCode;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/TennisMatch.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/TennisMatch.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/TennisMatch.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import javax.persistence.AttributeOverride;
-import javax.persistence.AttributeOverrides;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.PrimaryKeyJoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at PrimaryKeyJoinColumn(name = "match_id")
- at AttributeOverrides(
- {@AttributeOverride(name = "net", column = @Column(name = "net")),
- @AttributeOverride(name = "line", column = @Column(name = "line"))
- })
-public class TennisMatch {
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/TennisMatch.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/TennisMatch.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/TennisMatch.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/TennisMatch.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import javax.persistence.AttributeOverride;
+import javax.persistence.AttributeOverrides;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.PrimaryKeyJoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at PrimaryKeyJoinColumn(name = "match_id")
+ at AttributeOverrides(
+ {@AttributeOverride(name = "net", column = @Column(name = "net")),
+ @AttributeOverride(name = "line", column = @Column(name = "line"))
+ })
+public class TennisMatch {
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/XMLContextTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/XMLContextTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/XMLContextTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,54 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.reflection;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-import org.dom4j.io.SAXReader;
-import org.hibernate.cfg.EJB3DTDEntityResolver;
-import org.hibernate.cfg.annotations.reflection.XMLContext;
-import org.hibernate.util.XMLHelper;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXNotSupportedException;
-
-/**
- * @author Emmanuel Bernard
- */
-public class XMLContextTest extends TestCase {
- public void testAll() throws Exception {
- XMLHelper xmlHelper = new XMLHelper();
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
- InputStream is = cl.getResourceAsStream(
- "org/hibernate/test/annotations/reflection/orm.xml" );
- assertNotNull( "ORM.xml not found", is );
- XMLContext context = new XMLContext();
- List errors = new ArrayList();
- SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, EJB3DTDEntityResolver.INSTANCE );
- //saxReader.setValidation( false );
- try {
- saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
- }
- catch (SAXNotSupportedException e) {
- saxReader.setValidation( false );
- }
- org.dom4j.Document doc;
- try {
- doc = saxReader
- .read( new InputSource( new BufferedInputStream( is ) ) );
- }
- finally {
- try {
- is.close();
- }
- catch (IOException ioe) {
- //log.warn( "Could not close input stream", ioe );
- }
- }
- assertEquals( 0, errors.size() );
- context.addDocument( doc );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/XMLContextTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/XMLContextTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/XMLContextTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/XMLContextTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,54 @@
+//$Id: $
+package org.hibernate.test.annotations.reflection;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+import org.dom4j.io.SAXReader;
+import org.hibernate.cfg.EJB3DTDEntityResolver;
+import org.hibernate.cfg.annotations.reflection.XMLContext;
+import org.hibernate.util.XMLHelper;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXNotSupportedException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class XMLContextTest extends TestCase {
+ public void testAll() throws Exception {
+ XMLHelper xmlHelper = new XMLHelper();
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ InputStream is = cl.getResourceAsStream(
+ "org/hibernate/test/annotations/reflection/orm.xml" );
+ assertNotNull( "ORM.xml not found", is );
+ XMLContext context = new XMLContext();
+ List errors = new ArrayList();
+ SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, EJB3DTDEntityResolver.INSTANCE );
+ //saxReader.setValidation( false );
+ try {
+ saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
+ }
+ catch (SAXNotSupportedException e) {
+ saxReader.setValidation( false );
+ }
+ org.dom4j.Document doc;
+ try {
+ doc = saxReader
+ .read( new InputSource( new BufferedInputStream( is ) ) );
+ }
+ finally {
+ try {
+ is.close();
+ }
+ catch (IOException ioe) {
+ //log.warn( "Could not close input stream", ioe );
+ }
+ }
+ assertEquals( 0, errors.size() );
+ context.addDocument( doc );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/metadata-complete.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/metadata-complete.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/metadata-complete.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,76 +0,0 @@
-<?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"
- >
- <persistence-unit-metadata>
- <xml-mapping-metadata-complete/>
- <persistence-unit-defaults>
- <schema>myschema</schema>
- <catalog>mycatalog</catalog>
- <cascade-persist/>
- </persistence-unit-defaults>
- </persistence-unit-metadata>
- <package>org.hibernate.test.annotations.reflection</package>
- <mapped-superclass class="Organization">
- <attributes>
- <basic name="organizationId"/>
- </attributes>
- </mapped-superclass>
- <entity class="Administration">
- <attributes>
- <id name="id"/>
- </attributes>
- </entity>
- <entity class="Match">
- </entity>
- <entity class="SocialSecurityMoralAccount"/>
- <entity class="BusTrip" access="FIELD">
- <attributes>
- <embedded-id name="id">
- <attribute-override name="busDriver">
- <column name="fld_busdriver"/>
- </attribute-override>
- </embedded-id>
- <basic name="status" optional="false">
- <enumerated>STRING</enumerated>
- </basic>
- <basic name="serial" optional="true">
- <column name="serialbytes"/>
- <lob/>
- </basic>
- <basic name="terminusTime" fetch="LAZY">
- <temporal>TIMESTAMP</temporal>
- </basic>
- <one-to-many name="players">
- <map-key name="name"/>
- <join-column name="driver"/>
- <join-column name="number"/>
- </one-to-many>
- <many-to-many name="roads" target-entity="Administration">
- <order-by>maxSpeed</order-by>
- <join-table name="bus_road">
- <join-column name="driver"/>
- <join-column name="number"/>
- <inverse-join-column name="road_id"/>
- <unique-constraint>
- <column-name>driver</column-name>
- <column-name>number</column-name>
- </unique-constraint>
- </join-table>
- </many-to-many>
- </attributes>
- </entity>
- <embeddable class="BusTripPk" access="FIELD">
- <attributes>
- <basic name="busDriver">
- <column name="busdriver"/>
- </basic>
- <basic name="busNumber">
- <column name="busnumber"/>
- </basic>
- </attributes>
- </embeddable>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/metadata-complete.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/metadata-complete.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/metadata-complete.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/metadata-complete.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,76 @@
+<?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"
+ >
+ <persistence-unit-metadata>
+ <xml-mapping-metadata-complete/>
+ <persistence-unit-defaults>
+ <schema>myschema</schema>
+ <catalog>mycatalog</catalog>
+ <cascade-persist/>
+ </persistence-unit-defaults>
+ </persistence-unit-metadata>
+ <package>org.hibernate.test.annotations.reflection</package>
+ <mapped-superclass class="Organization">
+ <attributes>
+ <basic name="organizationId"/>
+ </attributes>
+ </mapped-superclass>
+ <entity class="Administration">
+ <attributes>
+ <id name="id"/>
+ </attributes>
+ </entity>
+ <entity class="Match">
+ </entity>
+ <entity class="SocialSecurityMoralAccount"/>
+ <entity class="BusTrip" access="FIELD">
+ <attributes>
+ <embedded-id name="id">
+ <attribute-override name="busDriver">
+ <column name="fld_busdriver"/>
+ </attribute-override>
+ </embedded-id>
+ <basic name="status" optional="false">
+ <enumerated>STRING</enumerated>
+ </basic>
+ <basic name="serial" optional="true">
+ <column name="serialbytes"/>
+ <lob/>
+ </basic>
+ <basic name="terminusTime" fetch="LAZY">
+ <temporal>TIMESTAMP</temporal>
+ </basic>
+ <one-to-many name="players">
+ <map-key name="name"/>
+ <join-column name="driver"/>
+ <join-column name="number"/>
+ </one-to-many>
+ <many-to-many name="roads" target-entity="Administration">
+ <order-by>maxSpeed</order-by>
+ <join-table name="bus_road">
+ <join-column name="driver"/>
+ <join-column name="number"/>
+ <inverse-join-column name="road_id"/>
+ <unique-constraint>
+ <column-name>driver</column-name>
+ <column-name>number</column-name>
+ </unique-constraint>
+ </join-table>
+ </many-to-many>
+ </attributes>
+ </entity>
+ <embeddable class="BusTripPk" access="FIELD">
+ <attributes>
+ <basic name="busDriver">
+ <column name="busdriver"/>
+ </basic>
+ <basic name="busNumber">
+ <column name="busnumber"/>
+ </basic>
+ </attributes>
+ </embeddable>
+</entity-mappings>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/orm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/orm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,117 +0,0 @@
-<?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"
- >
- <persistence-unit-metadata>
- <persistence-unit-defaults>
- <schema>myschema</schema>
- <catalog>mycatalog</catalog>
- <cascade-persist/>
- <entity-listeners>
- <entity-listener class="org.hibernate.test.annotations.reflection.OtherLogListener">
- <post-update method-name="log"/>
- </entity-listener>
- </entity-listeners>
- </persistence-unit-defaults>
- </persistence-unit-metadata>
- <package>org.hibernate.test.annotations.reflection</package>
- <entity class="Administration">
- <table name="tbl_admin">
- <unique-constraint>
- <column-name>firstname</column-name>
- <column-name>lastname</column-name>
- </unique-constraint>
- </table>
- <secondary-table name="admin2">
- <primary-key-join-column name="admin_id" referenced-column-name="id"/>
- <unique-constraint>
- <column-name>address</column-name>
- </unique-constraint>
- </secondary-table>
- <sequence-generator name="seqhilo" sequence-name="seqhilo"/>
- <table-generator name="table" table="tablehilo"/>
- <entity-listeners>
- <entity-listener class="LogListener">
- <pre-persist method-name="log"/>
- <post-load method-name="noLog"/>
- </entity-listener>
- </entity-listeners>
- <pre-persist method-name="calculate"/>
- <attributes>
- <id name="id">
- <column name="fld_id"/>
- <generated-value generator="generator" strategy="SEQUENCE"/>
- <temporal>DATE</temporal>
- <sequence-generator name="generator" sequence-name="seq"/>
- </id>
- <version name="version"/>
- <one-to-one name="defaultBusTrip" fetch="LAZY" mapped-by="test">
- <primary-key-join-column name="pk"/>
- <cascade>
- <cascade-all/>
- <cascade-persist/>
- <cascade-merge/>
- <cascade-remove/>
- <cascade-refresh/>
- </cascade>
- </one-to-one>
- <transient name="transientField"/>
- </attributes>
- </entity>
- <entity class="Match">
- <inheritance strategy="JOINED"/>
- <named-query name="allmatches">
- <query>select m from Match m</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-query>
- <named-query name="matchbyid">
- <query>select m from Match m where m.id = :id</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-query>
- <named-native-query name="allmatches" result-set-mapping="matchrs">
- <query>select m from Match m</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-native-query>
- <named-native-query name="matchbyid" result-set-mapping="matchrs">
- <query>select m from Match m where m.id = :id</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-native-query>
- <sql-result-set-mapping name="matchrs">
- <entity-result entity-class="org.hibernate.test.annotations.reflection.Match">
- <field-result name="competitor1Point" column="competitor1Point"/>
- </entity-result>
- <column-result name="competitor1Point"/>
- </sql-result-set-mapping>
- <exclude-default-listeners/>
- <exclude-superclass-listeners/>
- <entity-listeners>
- <entity-listener class="LogListener">
- <pre-persist method-name="log"/>
- <post-load method-name="noLog"/>
- </entity-listener>
- </entity-listeners>
- <attributes>
- <embedded name="playerASSN"/>
- </attributes>
- </entity>
- <entity class="TennisMatch">
- <primary-key-join-column name="id"/>
- <attribute-override name="net">
- <column name="fld_net"/>
- </attribute-override>
- <attribute-override name="ground">
- <column name="fld_ground" unique="true" scale="2"/>
- </attribute-override>
- <association-override name="referer">
- <join-column name="referer_id" referenced-column-name="id"/>
- </association-override>
- </entity>
- <entity class="SocialSecurityPhysicalAccount">
- <id-class class="org.hibernate.test.annotations.reflection.SocialSecurityNumber"/>
- <discriminator-value>Physical</discriminator-value>
- <discriminator-column length="34"/>
- </entity>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/orm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/orm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/orm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/reflection/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,117 @@
+<?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"
+ >
+ <persistence-unit-metadata>
+ <persistence-unit-defaults>
+ <schema>myschema</schema>
+ <catalog>mycatalog</catalog>
+ <cascade-persist/>
+ <entity-listeners>
+ <entity-listener class="org.hibernate.test.annotations.reflection.OtherLogListener">
+ <post-update method-name="log"/>
+ </entity-listener>
+ </entity-listeners>
+ </persistence-unit-defaults>
+ </persistence-unit-metadata>
+ <package>org.hibernate.test.annotations.reflection</package>
+ <entity class="Administration">
+ <table name="tbl_admin">
+ <unique-constraint>
+ <column-name>firstname</column-name>
+ <column-name>lastname</column-name>
+ </unique-constraint>
+ </table>
+ <secondary-table name="admin2">
+ <primary-key-join-column name="admin_id" referenced-column-name="id"/>
+ <unique-constraint>
+ <column-name>address</column-name>
+ </unique-constraint>
+ </secondary-table>
+ <sequence-generator name="seqhilo" sequence-name="seqhilo"/>
+ <table-generator name="table" table="tablehilo"/>
+ <entity-listeners>
+ <entity-listener class="LogListener">
+ <pre-persist method-name="log"/>
+ <post-load method-name="noLog"/>
+ </entity-listener>
+ </entity-listeners>
+ <pre-persist method-name="calculate"/>
+ <attributes>
+ <id name="id">
+ <column name="fld_id"/>
+ <generated-value generator="generator" strategy="SEQUENCE"/>
+ <temporal>DATE</temporal>
+ <sequence-generator name="generator" sequence-name="seq"/>
+ </id>
+ <version name="version"/>
+ <one-to-one name="defaultBusTrip" fetch="LAZY" mapped-by="test">
+ <primary-key-join-column name="pk"/>
+ <cascade>
+ <cascade-all/>
+ <cascade-persist/>
+ <cascade-merge/>
+ <cascade-remove/>
+ <cascade-refresh/>
+ </cascade>
+ </one-to-one>
+ <transient name="transientField"/>
+ </attributes>
+ </entity>
+ <entity class="Match">
+ <inheritance strategy="JOINED"/>
+ <named-query name="allmatches">
+ <query>select m from Match m</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-query>
+ <named-query name="matchbyid">
+ <query>select m from Match m where m.id = :id</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-query>
+ <named-native-query name="allmatches" result-set-mapping="matchrs">
+ <query>select m from Match m</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-native-query>
+ <named-native-query name="matchbyid" result-set-mapping="matchrs">
+ <query>select m from Match m where m.id = :id</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-native-query>
+ <sql-result-set-mapping name="matchrs">
+ <entity-result entity-class="org.hibernate.test.annotations.reflection.Match">
+ <field-result name="competitor1Point" column="competitor1Point"/>
+ </entity-result>
+ <column-result name="competitor1Point"/>
+ </sql-result-set-mapping>
+ <exclude-default-listeners/>
+ <exclude-superclass-listeners/>
+ <entity-listeners>
+ <entity-listener class="LogListener">
+ <pre-persist method-name="log"/>
+ <post-load method-name="noLog"/>
+ </entity-listener>
+ </entity-listeners>
+ <attributes>
+ <embedded name="playerASSN"/>
+ </attributes>
+ </entity>
+ <entity class="TennisMatch">
+ <primary-key-join-column name="id"/>
+ <attribute-override name="net">
+ <column name="fld_net"/>
+ </attribute-override>
+ <attribute-override name="ground">
+ <column name="fld_ground" unique="true" scale="2"/>
+ </attribute-override>
+ <association-override name="referer">
+ <join-column name="referer_id" referenced-column-name="id"/>
+ </association-override>
+ </entity>
+ <entity class="SocialSecurityPhysicalAccount">
+ <id-class class="org.hibernate.test.annotations.reflection.SocialSecurityNumber"/>
+ <discriminator-value>Physical</discriminator-value>
+ <discriminator-column length="34"/>
+ </entity>
+</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Location.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Location.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Location.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.strategy;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Location {
- private String city;
- private String country;
-
- 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;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Location.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Location.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Location.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Location.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+package org.hibernate.test.annotations.strategy;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Location {
+ private String city;
+ private String country;
+
+ 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;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Storm.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Storm.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Storm.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,62 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.strategy;
-
-import javax.persistence.Column;
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.UniqueConstraint;
-import javax.persistence.Table;
-
-import org.hibernate.annotations.Index;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"start.country", "start.city"})})
-public class Storm {
- private Integer id;
- private Location start;
- private Location end;
- private String stormName;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Embedded
- public Location getStart() {
- return start;
- }
-
- public void setStart(Location start) {
- this.start = start;
- }
-
- @Embedded
- public Location getEnd() {
- return end;
- }
-
- public void setEnd(Location end) {
- this.end = end;
- }
-
- @Index(name="storm_name_idx")
- @Column(unique = true)
- public String getStormName() {
- return stormName;
- }
-
- public void setStormName(String name) {
- this.stormName = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Storm.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Storm.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Storm.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/Storm.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,62 @@
+//$Id$
+package org.hibernate.test.annotations.strategy;
+
+import javax.persistence.Column;
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.UniqueConstraint;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"start.country", "start.city"})})
+public class Storm {
+ private Integer id;
+ private Location start;
+ private Location end;
+ private String stormName;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Embedded
+ public Location getStart() {
+ return start;
+ }
+
+ public void setStart(Location start) {
+ this.start = start;
+ }
+
+ @Embedded
+ public Location getEnd() {
+ return end;
+ }
+
+ public void setEnd(Location end) {
+ this.end = end;
+ }
+
+ @Index(name="storm_name_idx")
+ @Column(unique = true)
+ public String getStormName() {
+ return stormName;
+ }
+
+ public void setStormName(String name) {
+ this.stormName = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/StrategyTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/StrategyTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/StrategyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.strategy;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.DefaultComponentSafeNamingStrategy;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class StrategyTest extends TestCase {
-
- public void testComponentSafeStrategy() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Location start = new Location();
- start.setCity( "Paris" );
- start.setCountry( "France" );
- Location end = new Location();
- end.setCity( "London" );
- end.setCountry( "UK" );
- Storm storm = new Storm();
- storm.setEnd( end );
- storm.setStart( start );
- s.persist( storm );
- s.flush();
- tx.rollback();
- s.close();
- }
-
- protected void configure(Configuration cfg) {
- cfg.setNamingStrategy( DefaultComponentSafeNamingStrategy.INSTANCE );
- //cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
- //cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Storm.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/StrategyTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/StrategyTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/StrategyTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/strategy/StrategyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id$
+package org.hibernate.test.annotations.strategy;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.DefaultComponentSafeNamingStrategy;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class StrategyTest extends TestCase {
+
+ public void testComponentSafeStrategy() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Location start = new Location();
+ start.setCity( "Paris" );
+ start.setCountry( "France" );
+ Location end = new Location();
+ end.setCity( "London" );
+ end.setCountry( "UK" );
+ Storm storm = new Storm();
+ storm.setEnd( end );
+ storm.setStart( start );
+ s.persist( storm );
+ s.flush();
+ tx.rollback();
+ s.close();
+ }
+
+ protected void configure(Configuration cfg) {
+ cfg.setNamingStrategy( DefaultComponentSafeNamingStrategy.INSTANCE );
+ //cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
+ //cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Storm.class
+ };
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Component.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Component.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Component.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tableperclass;
-
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.Entity;
-import javax.persistence.InheritanceType;
-
-import org.hibernate.validator.NotNull;
-import org.hibernate.validator.Length;
-import org.hibernate.annotations.Index;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity(name = "xpmComponent")
- at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public abstract class Component {
- private String manufacturerPartNumber;
- private Long manufacturerId;
- private Long id;
-
-
-
- public void setId(Long id) {
- this.id = id;
- }
-
-
- @Id
- public Long getId() {
- return id;
- }
-
-
- @NotNull
- @Length(max = 40)
- @Index(name = "manufacturerPartNumber")
- public String getManufacturerPartNumber() {
- return manufacturerPartNumber;
- }
-
- @NotNull
- public Long getManufacturerId() {
- return manufacturerId;
- }
-
- public void setManufacturerId(Long manufacturerId) {
- this.manufacturerId = manufacturerId;
- }
-
-
- public void setManufacturerPartNumber(String manufacturerPartNumber) {
- this.manufacturerPartNumber = manufacturerPartNumber;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Component.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Component.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Component.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Component.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+//$Id: $
+package org.hibernate.test.annotations.tableperclass;
+
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.Entity;
+import javax.persistence.InheritanceType;
+
+import org.hibernate.validator.NotNull;
+import org.hibernate.validator.Length;
+import org.hibernate.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity(name = "xpmComponent")
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public abstract class Component {
+ private String manufacturerPartNumber;
+ private Long manufacturerId;
+ private Long id;
+
+
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+
+ @Id
+ public Long getId() {
+ return id;
+ }
+
+
+ @NotNull
+ @Length(max = 40)
+ @Index(name = "manufacturerPartNumber")
+ public String getManufacturerPartNumber() {
+ return manufacturerPartNumber;
+ }
+
+ @NotNull
+ public Long getManufacturerId() {
+ return manufacturerId;
+ }
+
+ public void setManufacturerId(Long manufacturerId) {
+ this.manufacturerId = manufacturerId;
+ }
+
+
+ public void setManufacturerPartNumber(String manufacturerPartNumber) {
+ this.manufacturerPartNumber = manufacturerPartNumber;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Machine.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Machine.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Machine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,37 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.tableperclass;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
-public class Machine {
- private Integer id;
- private Double weight;
-
- @Id
- @GeneratedValue(strategy = GenerationType.TABLE)
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public Double getWeight() {
- return weight;
- }
-
- public void setWeight(Double weight) {
- this.weight = weight;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Machine.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Machine.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Machine.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Machine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,37 @@
+//$Id$
+package org.hibernate.test.annotations.tableperclass;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
+public class Machine {
+ private Integer id;
+ private Double weight;
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.TABLE)
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Double getWeight() {
+ return weight;
+ }
+
+ public void setWeight(Double weight) {
+ this.weight = weight;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Product.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Product.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Product.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tableperclass;
-
-import javax.persistence.Entity;
-import javax.persistence.Table;
-import javax.persistence.UniqueConstraint;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table( name = "xPM_Product", uniqueConstraints = {@UniqueConstraint( columnNames = {
- "manufacturerPartNumber", "manufacturerId"} )} )
-public class Product extends Component {
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Product.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Product.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Product.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Product.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+//$Id: $
+package org.hibernate.test.annotations.tableperclass;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table( name = "xPM_Product", uniqueConstraints = {@UniqueConstraint( columnNames = {
+ "manufacturerPartNumber", "manufacturerId"} )} )
+public class Product extends Component {
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Robot.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Robot.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Robot.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.tableperclass;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Robot extends Machine {
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Robot.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Robot.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Robot.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/Robot.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.test.annotations.tableperclass;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Robot extends Machine {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/T800.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/T800.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/T800.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.tableperclass;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class T800 extends Robot {
- public String getTargetName() {
- return targetName;
- }
-
- public void setTargetName(String targetName) {
- this.targetName = targetName;
- }
-
- private String targetName;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/T800.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/T800.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/T800.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/T800.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.test.annotations.tableperclass;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class T800 extends Robot {
+ public String getTargetName() {
+ return targetName;
+ }
+
+ public void setTargetName(String targetName) {
+ this.targetName = targetName;
+ }
+
+ private String targetName;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,90 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.tableperclass;
-
-import java.util.List;
-import java.sql.SQLException;
-
-import org.hibernate.Query;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.JDBCException;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class TablePerClassTest extends TestCase {
- public void testUnionSubClass() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Machine computer = new Machine();
- computer.setWeight( new Double( 4 ) );
- Robot asimov = new Robot();
- asimov.setWeight( new Double( 120 ) );
- asimov.setName( "Asimov" );
- T800 terminator = new T800();
- terminator.setName( "Terminator" );
- terminator.setWeight( new Double( 300 ) );
- terminator.setTargetName( "Sarah Connor" );
- s.persist( computer );
- s.persist( asimov );
- s.persist( terminator );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- Query q = s.createQuery( "from Machine m where m.weight >= :weight" );
- q.setDouble( "weight", new Double( 10 ) );
- List result = q.list();
- assertEquals( 2, result.size() );
- tx.commit();
- s.close();
- s = openSession();
- tx = s.beginTransaction();
- tx.commit();
- s.close();
- }
-
- public void testConstraintsOnSuperclassProperties() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Product product1 = new Product();
- product1.setId( 1l );
- product1.setManufacturerId( 1l );
- product1.setManufacturerPartNumber( "AAFR");
- s.persist( product1 );
- s.flush();
- Product product2 = new Product();
- product2.setId( 2l );
- product2.setManufacturerId( 1l );
- product2.setManufacturerPartNumber( "AAFR");
- s.persist( product2 );
- try {
- s.flush();
- fail("Database Exception not handled");
- }
- catch( JDBCException e ) {
- //success
- }
- tx.rollback();
- s.close();
- }
-
-
-
- public TablePerClassTest(String x) {
- super( x ); //To change body of overridden methods use File | Settings | File Templates.
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Robot.class,
- T800.class,
- Machine.class,
- Component.class,
- Product.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tableperclass/TablePerClassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,90 @@
+//$Id$
+package org.hibernate.test.annotations.tableperclass;
+
+import java.util.List;
+import java.sql.SQLException;
+
+import org.hibernate.Query;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.JDBCException;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TablePerClassTest extends TestCase {
+ public void testUnionSubClass() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Machine computer = new Machine();
+ computer.setWeight( new Double( 4 ) );
+ Robot asimov = new Robot();
+ asimov.setWeight( new Double( 120 ) );
+ asimov.setName( "Asimov" );
+ T800 terminator = new T800();
+ terminator.setName( "Terminator" );
+ terminator.setWeight( new Double( 300 ) );
+ terminator.setTargetName( "Sarah Connor" );
+ s.persist( computer );
+ s.persist( asimov );
+ s.persist( terminator );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ Query q = s.createQuery( "from Machine m where m.weight >= :weight" );
+ q.setDouble( "weight", new Double( 10 ) );
+ List result = q.list();
+ assertEquals( 2, result.size() );
+ tx.commit();
+ s.close();
+ s = openSession();
+ tx = s.beginTransaction();
+ tx.commit();
+ s.close();
+ }
+
+ public void testConstraintsOnSuperclassProperties() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Product product1 = new Product();
+ product1.setId( 1l );
+ product1.setManufacturerId( 1l );
+ product1.setManufacturerPartNumber( "AAFR");
+ s.persist( product1 );
+ s.flush();
+ Product product2 = new Product();
+ product2.setId( 2l );
+ product2.setManufacturerId( 1l );
+ product2.setManufacturerPartNumber( "AAFR");
+ s.persist( product2 );
+ try {
+ s.flush();
+ fail("Database Exception not handled");
+ }
+ catch( JDBCException e ) {
+ //success
+ }
+ tx.rollback();
+ s.close();
+ }
+
+
+
+ public TablePerClassTest(String x) {
+ super( x ); //To change body of overridden methods use File | Settings | File Templates.
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Robot.class,
+ T800.class,
+ Machine.class,
+ Component.class,
+ Product.class
+ };
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Brand.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Brand.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Brand.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.target;
-
-import java.util.Map;
-import java.util.HashMap;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.ManyToMany;
-
-import org.hibernate.annotations.MapKey;
-import org.hibernate.annotations.CollectionOfElements;
-import org.hibernate.annotations.MapKeyManyToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Brand {
- @Id
- @GeneratedValue
- private Long id;
-
- @ManyToMany(targetEntity = LuggageImpl.class)
- @MapKey(targetElement = SizeImpl.class)
- private Map<Size, Luggage> luggagesBySize = new HashMap<Size, Luggage>();
-
- @CollectionOfElements(targetElement = SizeImpl.class)
- @MapKeyManyToMany(targetEntity = LuggageImpl.class)
- private Map<Luggage, Size> sizePerLuggage = new HashMap<Luggage, Size>();
-
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Map<Size, Luggage> getLuggagesBySize() {
- return luggagesBySize;
- }
-
- public void setLuggagesBySize(Map<Size, Luggage> luggagesBySize) {
- this.luggagesBySize = luggagesBySize;
- }
-
- public Map<Luggage, Size> getSizePerLuggage() {
- return sizePerLuggage;
- }
-
- public void setSizePerLuggage(Map<Luggage, Size> sizePerLuggage) {
- this.sizePerLuggage = sizePerLuggage;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Brand.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Brand.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Brand.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Brand.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToMany;
+
+import org.hibernate.annotations.MapKey;
+import org.hibernate.annotations.CollectionOfElements;
+import org.hibernate.annotations.MapKeyManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Brand {
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @ManyToMany(targetEntity = LuggageImpl.class)
+ @MapKey(targetElement = SizeImpl.class)
+ private Map<Size, Luggage> luggagesBySize = new HashMap<Size, Luggage>();
+
+ @CollectionOfElements(targetElement = SizeImpl.class)
+ @MapKeyManyToMany(targetEntity = LuggageImpl.class)
+ private Map<Luggage, Size> sizePerLuggage = new HashMap<Luggage, Size>();
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Map<Size, Luggage> getLuggagesBySize() {
+ return luggagesBySize;
+ }
+
+ public void setLuggagesBySize(Map<Size, Luggage> luggagesBySize) {
+ this.luggagesBySize = luggagesBySize;
+ }
+
+ public Map<Luggage, Size> getSizePerLuggage() {
+ return sizePerLuggage;
+ }
+
+ public void setSizePerLuggage(Map<Luggage, Size> sizePerLuggage) {
+ this.sizePerLuggage = sizePerLuggage;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Luggage.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Luggage.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Luggage.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.target;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Luggage {
- double getHeight();
- double getWidth();
-
- void setHeight(double height);
- void setWidth(double width);
-
- Owner getOwner();
-
- void setOwner(Owner owner);
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Luggage.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Luggage.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Luggage.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Luggage.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Luggage {
+ double getHeight();
+ double getWidth();
+
+ void setHeight(double height);
+ void setWidth(double width);
+
+ Owner getOwner();
+
+ void setOwner(Owner owner);
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/LuggageImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/LuggageImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/LuggageImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.target;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.ManyToOne;
-import javax.persistence.Embedded;
-
-import org.hibernate.annotations.Target;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class LuggageImpl implements Luggage {
- private Long id;
- private double height;
- private double width;
- private Owner owner;
-
- @Embedded
- @Target(OwnerImpl.class)
- public Owner getOwner() {
- return owner;
- }
-
- public void setOwner(Owner owner) {
- this.owner = owner;
- }
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public double getHeight() {
- return height;
- }
-
- public void setHeight(double height) {
- this.height = height;
- }
-
- public double getWidth() {
- return width;
- }
-
- public void setWidth(double width) {
- this.width = width;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/LuggageImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/LuggageImpl.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/LuggageImpl.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/LuggageImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToOne;
+import javax.persistence.Embedded;
+
+import org.hibernate.annotations.Target;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class LuggageImpl implements Luggage {
+ private Long id;
+ private double height;
+ private double width;
+ private Owner owner;
+
+ @Embedded
+ @Target(OwnerImpl.class)
+ public Owner getOwner() {
+ return owner;
+ }
+
+ public void setOwner(Owner owner) {
+ this.owner = owner;
+ }
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public double getHeight() {
+ return height;
+ }
+
+ public void setHeight(double height) {
+ this.height = height;
+ }
+
+ public double getWidth() {
+ return width;
+ }
+
+ public void setWidth(double width) {
+ this.width = width;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Owner.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Owner.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Owner.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.target;
-
-import java.util.Map;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Owner {
- String getName();
- void setName(String name);
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Owner.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Owner.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Owner.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Owner.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import java.util.Map;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Owner {
+ String getName();
+ void setName(String name);
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/OwnerImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/OwnerImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/OwnerImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.target;
-
-import java.util.Map;
-import java.util.HashMap;
-import javax.persistence.Embeddable;
-import org.hibernate.annotations.MapKey;
-import javax.persistence.ManyToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class OwnerImpl implements Owner {
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/OwnerImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/OwnerImpl.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/OwnerImpl.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/OwnerImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.Embeddable;
+import org.hibernate.annotations.MapKey;
+import javax.persistence.ManyToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class OwnerImpl implements Owner {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Size.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Size.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Size.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.target;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Size {
- String getName();
- void setName(String name);
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Size.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Size.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Size.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/Size.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Size {
+ String getName();
+ void setName(String name);
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/SizeImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/SizeImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/SizeImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.target;
-
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class SizeImpl implements Size {
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/SizeImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/SizeImpl.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/SizeImpl.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/SizeImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class SizeImpl implements Size {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/TargetTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/TargetTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/TargetTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,82 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.target;
-
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.Session;
-
-/**
- * @author Emmanuel Bernard
- */
-public class TargetTest extends TestCase {
-
- public void testTargetOnEmbedded() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Luggage l = new LuggageImpl();
- l.setHeight( 12 );
- l.setWidth( 12 );
- Owner o = new OwnerImpl();
- o.setName( "Emmanuel" );
- l.setOwner( o );
- s.persist( l );
- s.flush();
- s.clear();
- l = (Luggage) s.get(LuggageImpl.class, ( (LuggageImpl) l).getId() );
- assertEquals( "Emmanuel", l.getOwner().getName() );
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testTargetOnMapKey() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Luggage l = new LuggageImpl();
- l.setHeight( 12 );
- l.setWidth( 12 );
- Size size = new SizeImpl();
- size.setName( "S" );
- Owner o = new OwnerImpl();
- o.setName( "Emmanuel" );
- l.setOwner( o );
- s.persist( l );
- Brand b = new Brand();
- s.persist( b );
- b.getLuggagesBySize().put( size, l );
- s.flush();
- s.clear();
- b = (Brand) s.get(Brand.class, b.getId() );
- assertEquals( "S", b.getLuggagesBySize().keySet().iterator().next().getName() );
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testTargetOnMapKeyManyToMany() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Luggage l = new LuggageImpl();
- l.setHeight( 12 );
- l.setWidth( 12 );
- Size size = new SizeImpl();
- size.setName( "S" );
- Owner o = new OwnerImpl();
- o.setName( "Emmanuel" );
- l.setOwner( o );
- s.persist( l );
- Brand b = new Brand();
- s.persist( b );
- b.getSizePerLuggage().put( l, size );
- s.flush();
- s.clear();
- b = (Brand) s.get(Brand.class, b.getId() );
- assertEquals( 12d, b.getSizePerLuggage().keySet().iterator().next().getWidth() );
- s.getTransaction().rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- LuggageImpl.class,
- Brand.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/TargetTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/TargetTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/TargetTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/target/TargetTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,82 @@
+//$Id: $
+package org.hibernate.test.annotations.target;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TargetTest extends TestCase {
+
+ public void testTargetOnEmbedded() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Luggage l = new LuggageImpl();
+ l.setHeight( 12 );
+ l.setWidth( 12 );
+ Owner o = new OwnerImpl();
+ o.setName( "Emmanuel" );
+ l.setOwner( o );
+ s.persist( l );
+ s.flush();
+ s.clear();
+ l = (Luggage) s.get(LuggageImpl.class, ( (LuggageImpl) l).getId() );
+ assertEquals( "Emmanuel", l.getOwner().getName() );
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testTargetOnMapKey() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Luggage l = new LuggageImpl();
+ l.setHeight( 12 );
+ l.setWidth( 12 );
+ Size size = new SizeImpl();
+ size.setName( "S" );
+ Owner o = new OwnerImpl();
+ o.setName( "Emmanuel" );
+ l.setOwner( o );
+ s.persist( l );
+ Brand b = new Brand();
+ s.persist( b );
+ b.getLuggagesBySize().put( size, l );
+ s.flush();
+ s.clear();
+ b = (Brand) s.get(Brand.class, b.getId() );
+ assertEquals( "S", b.getLuggagesBySize().keySet().iterator().next().getName() );
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testTargetOnMapKeyManyToMany() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Luggage l = new LuggageImpl();
+ l.setHeight( 12 );
+ l.setWidth( 12 );
+ Size size = new SizeImpl();
+ size.setName( "S" );
+ Owner o = new OwnerImpl();
+ o.setName( "Emmanuel" );
+ l.setOwner( o );
+ s.persist( l );
+ Brand b = new Brand();
+ s.persist( b );
+ b.getSizePerLuggage().put( l, size );
+ s.flush();
+ s.clear();
+ b = (Brand) s.get(Brand.class, b.getId() );
+ assertEquals( 12d, b.getSizePerLuggage().keySet().iterator().next().getWidth() );
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ LuggageImpl.class,
+ Brand.class
+ };
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Country.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Country.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Country.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tuplizer;
-
-import javax.persistence.Embeddable;
-import javax.persistence.Column;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public interface Country {
- @Column(name = "CountryName")
- public String getName();
- public void setName(String name);
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Country.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Country.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Country.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Country.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+//$Id: $
+package org.hibernate.test.annotations.tuplizer;
+
+import javax.persistence.Embeddable;
+import javax.persistence.Column;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public interface Country {
+ @Column(name = "CountryName")
+ public String getName();
+ public void setName(String name);
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Cuisine.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Cuisine.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Cuisine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tuplizer;
-
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Entity;
-
-import org.hibernate.annotations.Tuplizer;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Tuplizer(impl = DynamicEntityTuplizer.class)
-public interface Cuisine {
- @Id
- @GeneratedValue
- public Long getId();
- public void setId(Long id);
-
- public String getName();
- public void setName(String name);
-
- @Tuplizer(impl = DynamicComponentTuplizer.class)
- public Country getCountry();
- public void setCountry(Country country);
-
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Cuisine.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Cuisine.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Cuisine.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/Cuisine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id: $
+package org.hibernate.test.annotations.tuplizer;
+
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+
+import org.hibernate.annotations.Tuplizer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Tuplizer(impl = DynamicEntityTuplizer.class)
+public interface Cuisine {
+ @Id
+ @GeneratedValue
+ public Long getId();
+ public void setId(Long id);
+
+ public String getName();
+ public void setName(String name);
+
+ @Tuplizer(impl = DynamicComponentTuplizer.class)
+ public Country getCountry();
+ public void setCountry(Country country);
+
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,53 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tuplizer;
-
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.util.HashMap;
-import java.io.Serializable;
-
-/**
- * A simple {@link java.lang.reflect.InvocationHandler} to act as the handler for our generated
- * {@link java.lang.reflect.Proxy}-based entity instances.
- * <p/>
- * This is a trivial impl which simply keeps the property values into
- * a Map.
- *
- * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
- */
-public final class DataProxyHandler implements InvocationHandler {
- private String entityName;
- private HashMap data = new HashMap();
-
- public DataProxyHandler(String entityName, Serializable id) {
- this.entityName = entityName;
- data.put( "Id", id );
- }
-
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- String methodName = method.getName();
- if ( methodName.startsWith( "set" ) ) {
- String propertyName = methodName.substring( 3 );
- data.put( propertyName, args[0] );
- }
- else if ( methodName.startsWith( "get" ) ) {
- String propertyName = methodName.substring( 3 );
- return data.get( propertyName );
- }
- else if ( "toString".equals( methodName ) ) {
- return entityName + "#" + data.get( "Id" );
- }
- else if ( "hashCode".equals( methodName ) ) {
- return new Integer( this.hashCode() );
- }
- return null;
- }
-
- public String getEntityName() {
- return entityName;
- }
-
- public HashMap getData() {
- return data;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DataProxyHandler.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,53 @@
+//$Id: $
+package org.hibernate.test.annotations.tuplizer;
+
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.io.Serializable;
+
+/**
+ * A simple {@link java.lang.reflect.InvocationHandler} to act as the handler for our generated
+ * {@link java.lang.reflect.Proxy}-based entity instances.
+ * <p/>
+ * This is a trivial impl which simply keeps the property values into
+ * a Map.
+ *
+ * @author <a href="mailto:steve at hibernate.org">Steve Ebersole </a>
+ */
+public final class DataProxyHandler implements InvocationHandler {
+ private String entityName;
+ private HashMap data = new HashMap();
+
+ public DataProxyHandler(String entityName, Serializable id) {
+ this.entityName = entityName;
+ data.put( "Id", id );
+ }
+
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ String methodName = method.getName();
+ if ( methodName.startsWith( "set" ) ) {
+ String propertyName = methodName.substring( 3 );
+ data.put( propertyName, args[0] );
+ }
+ else if ( methodName.startsWith( "get" ) ) {
+ String propertyName = methodName.substring( 3 );
+ return data.get( propertyName );
+ }
+ else if ( "toString".equals( methodName ) ) {
+ return entityName + "#" + data.get( "Id" );
+ }
+ else if ( "hashCode".equals( methodName ) ) {
+ return new Integer( this.hashCode() );
+ }
+ return null;
+ }
+
+ public String getEntityName() {
+ return entityName;
+ }
+
+ public HashMap getData() {
+ return data;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tuplizer;
-
-import org.hibernate.tuple.entity.PojoEntityTuplizer;
-import org.hibernate.tuple.entity.EntityMetamodel;
-import org.hibernate.tuple.Instantiator;
-import org.hibernate.tuple.component.PojoComponentTuplizer;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Component;
-import org.hibernate.proxy.ProxyFactory;
-import org.hibernate.property.Getter;
-import org.hibernate.property.Setter;
-import org.hibernate.HibernateException;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DynamicComponentTuplizer extends PojoComponentTuplizer {
-
- public DynamicComponentTuplizer(Component component) {
- super( component );
- }
-
-
- protected Instantiator buildInstantiator(Component component) {
- return new DynamicInstantiator( component.getComponentClassName() ); //To change body of overridden methods use File | Settings | File Templates.
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicComponentTuplizer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id: $
+package org.hibernate.test.annotations.tuplizer;
+
+import org.hibernate.tuple.entity.PojoEntityTuplizer;
+import org.hibernate.tuple.entity.EntityMetamodel;
+import org.hibernate.tuple.Instantiator;
+import org.hibernate.tuple.component.PojoComponentTuplizer;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Component;
+import org.hibernate.proxy.ProxyFactory;
+import org.hibernate.property.Getter;
+import org.hibernate.property.Setter;
+import org.hibernate.HibernateException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DynamicComponentTuplizer extends PojoComponentTuplizer {
+
+ public DynamicComponentTuplizer(Component component) {
+ super( component );
+ }
+
+
+ protected Instantiator buildInstantiator(Component component) {
+ return new DynamicInstantiator( component.getComponentClassName() ); //To change body of overridden methods use File | Settings | File Templates.
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tuplizer;
-
-import org.hibernate.tuple.entity.PojoEntityTuplizer;
-import org.hibernate.tuple.entity.EntityMetamodel;
-import org.hibernate.tuple.Instantiator;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.proxy.ProxyFactory;
-import org.hibernate.property.Getter;
-import org.hibernate.property.Setter;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DynamicEntityTuplizer extends PojoEntityTuplizer {
-
- public DynamicEntityTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) {
- super( entityMetamodel, mappedEntity );
- }
-
- protected Instantiator buildInstantiator(PersistentClass persistentClass) {
- return new DynamicInstantiator( persistentClass.getEntityName() );
- }
-
- protected ProxyFactory buildProxyFactory(PersistentClass persistentClass, Getter idGetter, Setter idSetter) {
- // allows defining a custom proxy factory, which is responsible for
- // generating lazy proxies for a given entity.
- //
- // Here we simply use the default...
- return super.buildProxyFactory( persistentClass, idGetter, idSetter );
- }
- }
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicEntityTuplizer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id: $
+package org.hibernate.test.annotations.tuplizer;
+
+import org.hibernate.tuple.entity.PojoEntityTuplizer;
+import org.hibernate.tuple.entity.EntityMetamodel;
+import org.hibernate.tuple.Instantiator;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.proxy.ProxyFactory;
+import org.hibernate.property.Getter;
+import org.hibernate.property.Setter;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DynamicEntityTuplizer extends PojoEntityTuplizer {
+
+ public DynamicEntityTuplizer(EntityMetamodel entityMetamodel, PersistentClass mappedEntity) {
+ super( entityMetamodel, mappedEntity );
+ }
+
+ protected Instantiator buildInstantiator(PersistentClass persistentClass) {
+ return new DynamicInstantiator( persistentClass.getEntityName() );
+ }
+
+ protected ProxyFactory buildProxyFactory(PersistentClass persistentClass, Getter idGetter, Setter idSetter) {
+ // allows defining a custom proxy factory, which is responsible for
+ // generating lazy proxies for a given entity.
+ //
+ // Here we simply use the default...
+ return super.buildProxyFactory( persistentClass, idGetter, idSetter );
+ }
+ }
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tuplizer;
-
-import java.io.Serializable;
-import java.lang.reflect.Proxy;
-import java.lang.reflect.InvocationHandler;
-
-import org.hibernate.tuple.Instantiator;
-import org.hibernate.util.ReflectHelper;
-import org.hibernate.HibernateException;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DynamicInstantiator implements Instantiator {
- private final String entityName;
-
- public DynamicInstantiator(String entityName) {
- this.entityName = entityName;
- }
-
- public Object instantiate(Serializable id) {
- if ( Cuisine.class.getName().equals( entityName ) ) {
- return ProxyHelper.newCuisineProxy( id );
- }
- if ( Country.class.getName().equals( entityName ) ) {
- return ProxyHelper.newCountryProxy( id );
- }
- else {
- throw new IllegalArgumentException( "unknown entity for instantiation [" + entityName + "]" );
- }
- }
-
- public Object instantiate() {
- return instantiate( null );
- }
-
- public boolean isInstance(Object object) {
- String resolvedEntityName = null;
- if ( Proxy.isProxyClass( object.getClass() ) ) {
- InvocationHandler handler = Proxy.getInvocationHandler( object );
- if ( DataProxyHandler.class.isAssignableFrom( handler.getClass() ) ) {
- DataProxyHandler myHandler = ( DataProxyHandler ) handler;
- resolvedEntityName = myHandler.getEntityName();
- }
- }
- try {
- return ReflectHelper.classForName( entityName ).isInstance( object );
- }
- catch( Throwable t ) {
- throw new HibernateException( "could not get handle to entity-name as interface : " + t );
- }
-
-// return entityName.equals( resolvedEntityName );
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/DynamicInstantiator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+//$Id: $
+package org.hibernate.test.annotations.tuplizer;
+
+import java.io.Serializable;
+import java.lang.reflect.Proxy;
+import java.lang.reflect.InvocationHandler;
+
+import org.hibernate.tuple.Instantiator;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.HibernateException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DynamicInstantiator implements Instantiator {
+ private final String entityName;
+
+ public DynamicInstantiator(String entityName) {
+ this.entityName = entityName;
+ }
+
+ public Object instantiate(Serializable id) {
+ if ( Cuisine.class.getName().equals( entityName ) ) {
+ return ProxyHelper.newCuisineProxy( id );
+ }
+ if ( Country.class.getName().equals( entityName ) ) {
+ return ProxyHelper.newCountryProxy( id );
+ }
+ else {
+ throw new IllegalArgumentException( "unknown entity for instantiation [" + entityName + "]" );
+ }
+ }
+
+ public Object instantiate() {
+ return instantiate( null );
+ }
+
+ public boolean isInstance(Object object) {
+ String resolvedEntityName = null;
+ if ( Proxy.isProxyClass( object.getClass() ) ) {
+ InvocationHandler handler = Proxy.getInvocationHandler( object );
+ if ( DataProxyHandler.class.isAssignableFrom( handler.getClass() ) ) {
+ DataProxyHandler myHandler = ( DataProxyHandler ) handler;
+ resolvedEntityName = myHandler.getEntityName();
+ }
+ }
+ try {
+ return ReflectHelper.classForName( entityName ).isInstance( object );
+ }
+ catch( Throwable t ) {
+ throw new HibernateException( "could not get handle to entity-name as interface : " + t );
+ }
+
+// return entityName.equals( resolvedEntityName );
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tuplizer;
-
-import org.hibernate.EmptyInterceptor;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EntityNameInterceptor extends EmptyInterceptor {
- /**
- * The callback from Hibernate to determine the entity name given
- * a presumed entity instance.
- *
- * @param object The presumed entity instance.
- * @return The entity name (pointing to the proper entity mapping).
- */
- public String getEntityName(Object object) {
- String entityName = ProxyHelper.extractEntityName( object );
- if ( entityName == null ) {
- entityName = super.getEntityName( object );
- }
- return entityName;
- }
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/EntityNameInterceptor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.test.annotations.tuplizer;
+
+import org.hibernate.EmptyInterceptor;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EntityNameInterceptor extends EmptyInterceptor {
+ /**
+ * The callback from Hibernate to determine the entity name given
+ * a presumed entity instance.
+ *
+ * @param object The presumed entity instance.
+ * @return The entity name (pointing to the proper entity mapping).
+ */
+ public String getEntityName(Object object) {
+ String entityName = ProxyHelper.extractEntityName( object );
+ if ( entityName == null ) {
+ entityName = super.getEntityName( object );
+ }
+ return entityName;
+ }
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/ProxyHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/ProxyHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/ProxyHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tuplizer;
-
-import java.io.Serializable;
-import java.lang.reflect.Proxy;
-import java.lang.reflect.InvocationHandler;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ProxyHelper {
-
- public static Country newPersonProxy() {
- return newCountryProxy( null );
- }
-
- public static Country newCountryProxy(Serializable id) {
- return ( Country ) Proxy.newProxyInstance(
- Country.class.getClassLoader(),
- new Class[] {Country.class},
- new DataProxyHandler( Country.class.getName(), id )
- );
- }
-
- public static Cuisine newCustomerProxy() {
- return newCuisineProxy( null );
- }
-
- public static Cuisine newCuisineProxy(Serializable id) {
- return ( Cuisine ) Proxy.newProxyInstance(
- Cuisine.class.getClassLoader(),
- new Class[] {Cuisine.class},
- new DataProxyHandler( Cuisine.class.getName(), id )
- );
- }
-
- public static String extractEntityName(Object object) {
- // Our custom java.lang.reflect.Proxy instances actually bundle
- // their appropriate entity name, so we simply extract it from there
- // if this represents one of our proxies; otherwise, we return null
- if ( Proxy.isProxyClass( object.getClass() ) ) {
- InvocationHandler handler = Proxy.getInvocationHandler( object );
- if ( DataProxyHandler.class.isAssignableFrom( handler.getClass() ) ) {
- DataProxyHandler myHandler = ( DataProxyHandler ) handler;
- return myHandler.getEntityName();
- }
- }
- return null;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/ProxyHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/ProxyHelper.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/ProxyHelper.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/ProxyHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+//$Id: $
+package org.hibernate.test.annotations.tuplizer;
+
+import java.io.Serializable;
+import java.lang.reflect.Proxy;
+import java.lang.reflect.InvocationHandler;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ProxyHelper {
+
+ public static Country newPersonProxy() {
+ return newCountryProxy( null );
+ }
+
+ public static Country newCountryProxy(Serializable id) {
+ return ( Country ) Proxy.newProxyInstance(
+ Country.class.getClassLoader(),
+ new Class[] {Country.class},
+ new DataProxyHandler( Country.class.getName(), id )
+ );
+ }
+
+ public static Cuisine newCustomerProxy() {
+ return newCuisineProxy( null );
+ }
+
+ public static Cuisine newCuisineProxy(Serializable id) {
+ return ( Cuisine ) Proxy.newProxyInstance(
+ Cuisine.class.getClassLoader(),
+ new Class[] {Cuisine.class},
+ new DataProxyHandler( Cuisine.class.getName(), id )
+ );
+ }
+
+ public static String extractEntityName(Object object) {
+ // Our custom java.lang.reflect.Proxy instances actually bundle
+ // their appropriate entity name, so we simply extract it from there
+ // if this represents one of our proxies; otherwise, we return null
+ if ( Proxy.isProxyClass( object.getClass() ) ) {
+ InvocationHandler handler = Proxy.getInvocationHandler( object );
+ if ( DataProxyHandler.class.isAssignableFrom( handler.getClass() ) ) {
+ DataProxyHandler myHandler = ( DataProxyHandler ) handler;
+ return myHandler.getEntityName();
+ }
+ }
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/TuplizerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/TuplizerTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/TuplizerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.tuplizer;
-
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.Session;
-
-/**
- * @author Emmanuel Bernard
- */
-public class TuplizerTest extends TestCase {
- public void testEntityTuplizer() throws Exception {
- Cuisine cuisine = ProxyHelper.newCuisineProxy( null );
- cuisine.setName( "Française" );
- Country country = ProxyHelper.newCountryProxy( null );
- country.setName( "France" );
- cuisine.setCountry( country );
- Session s = openSession( new EntityNameInterceptor() );
- s.getTransaction().begin();
- s.persist( cuisine );
- s.flush();
- s.clear();
- cuisine = (Cuisine) s.get(Cuisine.class, cuisine.getId() );
- assertNotNull( cuisine );
- assertEquals( "Française", cuisine.getName() );
- assertEquals( "France", country.getName() );
- s.getTransaction().rollback();
- s.close();
- }
- protected Class[] getMappings() {
- return new Class[] {
- Cuisine.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/TuplizerTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/TuplizerTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/TuplizerTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/tuplizer/TuplizerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.test.annotations.tuplizer;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TuplizerTest extends TestCase {
+ public void testEntityTuplizer() throws Exception {
+ Cuisine cuisine = ProxyHelper.newCuisineProxy( null );
+ cuisine.setName( "Française" );
+ Country country = ProxyHelper.newCountryProxy( null );
+ country.setName( "France" );
+ cuisine.setCountry( country );
+ Session s = openSession( new EntityNameInterceptor() );
+ s.getTransaction().begin();
+ s.persist( cuisine );
+ s.flush();
+ s.clear();
+ cuisine = (Cuisine) s.get(Cuisine.class, cuisine.getId() );
+ assertNotNull( cuisine );
+ assertEquals( "Française", cuisine.getName() );
+ assertEquals( "France", country.getName() );
+ s.getTransaction().rollback();
+ s.close();
+ }
+ protected Class[] getMappings() {
+ return new Class[] {
+ Cuisine.class
+ };
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/Dvd.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/Dvd.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/Dvd.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,48 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.type;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import org.hibernate.annotations.Columns;
-import org.hibernate.annotations.GenericGenerator;
-import org.hibernate.annotations.Type;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Dvd {
- private MyOid id;
- private String title;
-
- @Id
- @GeneratedValue(generator = "custom-id")
- @GenericGenerator(name = "custom-id", strategy = "org.hibernate.test.annotations.type.MyOidGenerator")
- @Type(type = "org.hibernate.test.annotations.type.MyOidType")
- @Columns(
- columns = {
- @Column(name = "high"),
- @Column(name = "middle"),
- @Column(name = "low"),
- @Column(name = "other")
- }
- )
- public MyOid getId() {
- return id;
- }
-
- public void setId(MyOid id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/Dvd.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/Dvd.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/Dvd.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/Dvd.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,48 @@
+//$Id$
+package org.hibernate.test.annotations.type;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.Columns;
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Type;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Dvd {
+ private MyOid id;
+ private String title;
+
+ @Id
+ @GeneratedValue(generator = "custom-id")
+ @GenericGenerator(name = "custom-id", strategy = "org.hibernate.test.annotations.type.MyOidGenerator")
+ @Type(type = "org.hibernate.test.annotations.type.MyOidType")
+ @Columns(
+ columns = {
+ @Column(name = "high"),
+ @Column(name = "middle"),
+ @Column(name = "low"),
+ @Column(name = "other")
+ }
+ )
+ public MyOid getId() {
+ return id;
+ }
+
+ public void setId(MyOid id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOid.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOid.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOid.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,79 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.type;
-
-import java.io.Serializable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MyOid implements Serializable {
- private int high;
- private int middle;
- private int low;
- private int other;
-
- protected MyOid() {
- }
-
- public MyOid(int aHigh, int aMiddle, int aLow, int aOther) {
- high = aHigh;
- middle = aMiddle;
- low = aLow;
- other = aOther;
- }
-
- public int getHigh() {
- return high;
- }
-
- public void setHigh(int aHigh) {
- high = aHigh;
- }
-
- public int getMiddle() {
- return middle;
- }
-
- public void setMiddle(int aMiddle) {
- middle = aMiddle;
- }
-
- public int getLow() {
- return low;
- }
-
- public void setLow(int aLow) {
- low = aLow;
- }
-
- public int getOther() {
- return other;
- }
-
- public void setOther(int aOther) {
- other = aOther;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final MyOid myOid = (MyOid) o;
-
- if ( high != myOid.high ) return false;
- if ( low != myOid.low ) return false;
- if ( middle != myOid.middle ) return false;
- if ( other != myOid.other ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = low;
- result = 29 * result + middle;
- result = 29 * result + high;
- result = 29 * result + other;
- return result;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOid.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOid.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOid.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOid.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,79 @@
+//$Id$
+package org.hibernate.test.annotations.type;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MyOid implements Serializable {
+ private int high;
+ private int middle;
+ private int low;
+ private int other;
+
+ protected MyOid() {
+ }
+
+ public MyOid(int aHigh, int aMiddle, int aLow, int aOther) {
+ high = aHigh;
+ middle = aMiddle;
+ low = aLow;
+ other = aOther;
+ }
+
+ public int getHigh() {
+ return high;
+ }
+
+ public void setHigh(int aHigh) {
+ high = aHigh;
+ }
+
+ public int getMiddle() {
+ return middle;
+ }
+
+ public void setMiddle(int aMiddle) {
+ middle = aMiddle;
+ }
+
+ public int getLow() {
+ return low;
+ }
+
+ public void setLow(int aLow) {
+ low = aLow;
+ }
+
+ public int getOther() {
+ return other;
+ }
+
+ public void setOther(int aOther) {
+ other = aOther;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final MyOid myOid = (MyOid) o;
+
+ if ( high != myOid.high ) return false;
+ if ( low != myOid.low ) return false;
+ if ( middle != myOid.middle ) return false;
+ if ( other != myOid.other ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = low;
+ result = 29 * result + middle;
+ result = 29 * result + high;
+ result = 29 * result + other;
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidGenerator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidGenerator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidGenerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.type;
-
-import java.io.Serializable;
-
-import org.hibernate.HibernateException;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.id.IdentifierGenerator;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MyOidGenerator implements IdentifierGenerator {
-
- private int counter;
-
- public Serializable generate(SessionImplementor aSessionImplementor, Object aObject) throws HibernateException {
- counter++;
- return new MyOid( 0, 0, 0, counter );
- }
-}
-
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidGenerator.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidGenerator.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidGenerator.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidGenerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.test.annotations.type;
+
+import java.io.Serializable;
+
+import org.hibernate.HibernateException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.id.IdentifierGenerator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MyOidGenerator implements IdentifierGenerator {
+
+ private int counter;
+
+ public Serializable generate(SessionImplementor aSessionImplementor, Object aObject) throws HibernateException {
+ counter++;
+ return new MyOid( 0, 0, 0, counter );
+ }
+}
+
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,147 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.type;
-
-import java.io.Serializable;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.sql.SQLException;
-
-import org.hibernate.Hibernate;
-import org.hibernate.HibernateException;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.type.Type;
-import org.hibernate.usertype.CompositeUserType;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MyOidType implements CompositeUserType {
-
- public static final String[] PROPERTY_NAMES = new String[]{"high", "middle", "low", "other"};
- public static final Type[] TYPES = new Type[]{Hibernate.INTEGER, Hibernate.INTEGER, Hibernate.INTEGER, Hibernate.INTEGER};
-
-
- public String[] getPropertyNames() {
- return PROPERTY_NAMES;
- }
-
- public Type[] getPropertyTypes() {
- return TYPES;
- }
-
- public Object getPropertyValue(Object aObject, int i) throws HibernateException {
- MyOid dbOid = (MyOid) aObject;
- switch ( i ) {
- case 0:
- return dbOid.getHigh();
- case 1:
- return dbOid.getMiddle();
- case 2:
- return dbOid.getLow();
- case 3:
- return dbOid.getOther();
- default:
- throw new HibernateException( "Unsupported property index " + i );
- }
-
- }
-
- public void setPropertyValue(Object aObject, int i, Object aObject1) throws HibernateException {
- MyOid dbOid = (MyOid) aObject;
- switch ( i ) {
- case 0:
- dbOid.setHigh( (Integer) aObject1 );
- case 1:
- dbOid.setMiddle( (Integer) aObject1 );
- case 2:
- dbOid.setLow( (Integer) aObject1 );
- case 3:
- dbOid.setOther( (Integer) aObject1 );
- default:
- throw new HibernateException( "Unsupported property index " + i );
- }
- }
-
- public Class returnedClass() {
- return MyOid.class;
- }
-
- public boolean equals(Object x, Object y) throws HibernateException {
- if ( x == y ) return true;
- if ( x == null || y == null ) return false;
-
- MyOid oid1 = (MyOid) x;
- MyOid oid2 = (MyOid) y;
-
- if ( oid1.getHigh() != oid2.getHigh() ) {
- return false;
- }
- if ( oid1.getMiddle() != oid2.getMiddle() ) {
- return false;
- }
- if ( oid1.getLow() != oid2.getLow() ) {
- return false;
- }
- return oid1.getOther() == oid2.getOther();
-
- }
-
- public int hashCode(Object aObject) throws HibernateException {
- return aObject.hashCode();
- }
-
- public Object nullSafeGet(
- ResultSet aResultSet, String[] names, SessionImplementor aSessionImplementor, Object aObject
- ) throws HibernateException, SQLException {
- Integer highval = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[0] );
- Integer midval = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[1] );
- Integer lowval = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[2] );
- Integer other = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[3] );
-
- return new MyOid( highval, midval, lowval, other );
- }
-
- public void nullSafeSet(
- PreparedStatement aPreparedStatement, Object value, int index, SessionImplementor aSessionImplementor
- ) throws HibernateException, SQLException {
- MyOid c;
- if ( value == null ) {
- // todo is this correct?
- throw new HibernateException( "Oid object may not be null" );
- }
- else {
- c = (MyOid) value;
- }
-
- Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getHigh(), index );
- Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getMiddle(), index + 1 );
- Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getLow(), index + 2 );
- Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getOther(), index + 3 );
- }
-
- public Object deepCopy(Object aObject) throws HibernateException {
- MyOid oldOid = (MyOid) aObject;
-
- return new MyOid( oldOid.getHigh(), oldOid.getMiddle(), oldOid.getLow(), oldOid.getOther() );
- }
-
- public boolean isMutable() {
- return false;
- }
-
- public Serializable disassemble(Object value, SessionImplementor aSessionImplementor) throws HibernateException {
- return (Serializable) deepCopy( value );
- }
-
- public Object assemble(Serializable cached, SessionImplementor aSessionImplementor, Object aObject)
- throws HibernateException {
- return deepCopy( cached );
- }
-
- public Object replace(Object original, Object target, SessionImplementor aSessionImplementor, Object aObject2)
- throws HibernateException {
- // we are immutable. return original
- return original;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/MyOidType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,147 @@
+//$Id$
+package org.hibernate.test.annotations.type;
+
+import java.io.Serializable;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.type.Type;
+import org.hibernate.usertype.CompositeUserType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MyOidType implements CompositeUserType {
+
+ public static final String[] PROPERTY_NAMES = new String[]{"high", "middle", "low", "other"};
+ public static final Type[] TYPES = new Type[]{Hibernate.INTEGER, Hibernate.INTEGER, Hibernate.INTEGER, Hibernate.INTEGER};
+
+
+ public String[] getPropertyNames() {
+ return PROPERTY_NAMES;
+ }
+
+ public Type[] getPropertyTypes() {
+ return TYPES;
+ }
+
+ public Object getPropertyValue(Object aObject, int i) throws HibernateException {
+ MyOid dbOid = (MyOid) aObject;
+ switch ( i ) {
+ case 0:
+ return dbOid.getHigh();
+ case 1:
+ return dbOid.getMiddle();
+ case 2:
+ return dbOid.getLow();
+ case 3:
+ return dbOid.getOther();
+ default:
+ throw new HibernateException( "Unsupported property index " + i );
+ }
+
+ }
+
+ public void setPropertyValue(Object aObject, int i, Object aObject1) throws HibernateException {
+ MyOid dbOid = (MyOid) aObject;
+ switch ( i ) {
+ case 0:
+ dbOid.setHigh( (Integer) aObject1 );
+ case 1:
+ dbOid.setMiddle( (Integer) aObject1 );
+ case 2:
+ dbOid.setLow( (Integer) aObject1 );
+ case 3:
+ dbOid.setOther( (Integer) aObject1 );
+ default:
+ throw new HibernateException( "Unsupported property index " + i );
+ }
+ }
+
+ public Class returnedClass() {
+ return MyOid.class;
+ }
+
+ public boolean equals(Object x, Object y) throws HibernateException {
+ if ( x == y ) return true;
+ if ( x == null || y == null ) return false;
+
+ MyOid oid1 = (MyOid) x;
+ MyOid oid2 = (MyOid) y;
+
+ if ( oid1.getHigh() != oid2.getHigh() ) {
+ return false;
+ }
+ if ( oid1.getMiddle() != oid2.getMiddle() ) {
+ return false;
+ }
+ if ( oid1.getLow() != oid2.getLow() ) {
+ return false;
+ }
+ return oid1.getOther() == oid2.getOther();
+
+ }
+
+ public int hashCode(Object aObject) throws HibernateException {
+ return aObject.hashCode();
+ }
+
+ public Object nullSafeGet(
+ ResultSet aResultSet, String[] names, SessionImplementor aSessionImplementor, Object aObject
+ ) throws HibernateException, SQLException {
+ Integer highval = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[0] );
+ Integer midval = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[1] );
+ Integer lowval = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[2] );
+ Integer other = (Integer) Hibernate.INTEGER.nullSafeGet( aResultSet, names[3] );
+
+ return new MyOid( highval, midval, lowval, other );
+ }
+
+ public void nullSafeSet(
+ PreparedStatement aPreparedStatement, Object value, int index, SessionImplementor aSessionImplementor
+ ) throws HibernateException, SQLException {
+ MyOid c;
+ if ( value == null ) {
+ // todo is this correct?
+ throw new HibernateException( "Oid object may not be null" );
+ }
+ else {
+ c = (MyOid) value;
+ }
+
+ Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getHigh(), index );
+ Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getMiddle(), index + 1 );
+ Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getLow(), index + 2 );
+ Hibernate.INTEGER.nullSafeSet( aPreparedStatement, c.getOther(), index + 3 );
+ }
+
+ public Object deepCopy(Object aObject) throws HibernateException {
+ MyOid oldOid = (MyOid) aObject;
+
+ return new MyOid( oldOid.getHigh(), oldOid.getMiddle(), oldOid.getLow(), oldOid.getOther() );
+ }
+
+ public boolean isMutable() {
+ return false;
+ }
+
+ public Serializable disassemble(Object value, SessionImplementor aSessionImplementor) throws HibernateException {
+ return (Serializable) deepCopy( value );
+ }
+
+ public Object assemble(Serializable cached, SessionImplementor aSessionImplementor, Object aObject)
+ throws HibernateException {
+ return deepCopy( cached );
+ }
+
+ public Object replace(Object original, Object target, SessionImplementor aSessionImplementor, Object aObject2)
+ throws HibernateException {
+ // we are immutable. return original
+ return original;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/TypeTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/TypeTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/TypeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.type;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class TypeTest extends TestCase {
- public void testIdWithMulticolumns() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Dvd lesOiseaux = new Dvd();
- lesOiseaux.setTitle( "Les oiseaux" );
- s.persist( lesOiseaux );
- s.flush();
- assertNotNull( lesOiseaux.getId() );
- tx.rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Dvd.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/TypeTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/TypeTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/TypeTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/type/TypeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.test.annotations.type;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TypeTest extends TestCase {
+ public void testIdWithMulticolumns() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Dvd lesOiseaux = new Dvd();
+ lesOiseaux.setTitle( "Les oiseaux" );
+ s.persist( lesOiseaux );
+ s.flush();
+ assertNotNull( lesOiseaux.getId() );
+ tx.rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Dvd.class
+ };
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Antenna.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Antenna.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Antenna.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.various;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Column;
-
-import org.hibernate.annotations.Generated;
-import org.hibernate.annotations.GenerationTime;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Antenna {
- @Id public Integer id;
- @Generated(GenerationTime.ALWAYS) @Column()
- public String longitude;
-
- @Generated(GenerationTime.INSERT) @Column(insertable = false)
- public String latitude;
-
- @Generated(GenerationTime.NEVER)
- public Double power;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Antenna.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Antenna.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Antenna.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Antenna.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.test.annotations.various;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Column;
+
+import org.hibernate.annotations.Generated;
+import org.hibernate.annotations.GenerationTime;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Antenna {
+ @Id public Integer id;
+ @Generated(GenerationTime.ALWAYS) @Column()
+ public String longitude;
+
+ @Generated(GenerationTime.INSERT) @Column(insertable = false)
+ public String latitude;
+
+ @Generated(GenerationTime.NEVER)
+ public Double power;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Conductor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Conductor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Conductor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,54 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.various;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Version;
-
-import org.hibernate.annotations.Index;
-import org.hibernate.annotations.OptimisticLock;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Conductor {
- @Id
- @GeneratedValue
- private Integer id;
-
- @Column(name = "cond_name")
- @Index(name = "cond_name")
- @OptimisticLock(excluded = true)
- private String name;
-
- @Version
- private Long version;
-
-
- public Long getVersion() {
- return version;
- }
-
- public void setVersion(Long version) {
- this.version = version;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Conductor.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Conductor.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Conductor.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Conductor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,54 @@
+//$Id$
+package org.hibernate.test.annotations.various;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Version;
+
+import org.hibernate.annotations.Index;
+import org.hibernate.annotations.OptimisticLock;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Conductor {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ @Column(name = "cond_name")
+ @Index(name = "cond_name")
+ @OptimisticLock(excluded = true)
+ private String name;
+
+ @Version
+ private Long version;
+
+
+ public Long getVersion() {
+ return version;
+ }
+
+ public void setVersion(Long version) {
+ this.version = version;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/GeneratedTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/GeneratedTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/GeneratedTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.various;
-
-import org.hibernate.test.annotations.TestCase;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-
-/**
- * @author Emmanuel Bernard
- */
-public class GeneratedTest extends TestCase {
-
- public void testGenerated() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Antenna antenna = new Antenna();
- antenna.id = new Integer(1);
- s.persist( antenna );
- assertNull( antenna.latitude );
- assertNull( antenna.longitude );
- tx.rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- Antenna.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/GeneratedTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/GeneratedTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/GeneratedTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/GeneratedTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id: $
+package org.hibernate.test.annotations.various;
+
+import org.hibernate.test.annotations.TestCase;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class GeneratedTest extends TestCase {
+
+ public void testGenerated() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Antenna antenna = new Antenna();
+ antenna.id = new Integer(1);
+ s.persist( antenna );
+ assertNull( antenna.latitude );
+ assertNull( antenna.longitude );
+ tx.rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Antenna.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/IndexTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/IndexTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/IndexTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,63 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.various;
-
-import java.util.Date;
-
-import org.hibernate.Session;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class IndexTest extends TestCase {
- public void testIndexManyToOne() throws Exception {
- //TODO find a way to test indexes???
- Session s = openSession();
- s.getTransaction().begin();
- Conductor emmanuel = new Conductor();
- emmanuel.setName( "Emmanuel" );
- s.persist( emmanuel );
- Vehicule tank = new Vehicule();
- tank.setCurrentConductor( emmanuel );
- tank.setRegistrationNumber( "324VX43" );
- s.persist( tank );
- s.flush();
- s.delete( tank );
- s.delete( emmanuel );
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testIndexAndJoined() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Conductor cond = new Conductor();
- cond.setName( "Bob" );
- s.persist( cond );
- ProfessionalAgreement agreement = new ProfessionalAgreement();
- agreement.setExpirationDate( new Date() );
- s.persist( agreement );
- Truck truck = new Truck();
- truck.setAgreement( agreement );
- truck.setWeight( 20 );
- truck.setRegistrationNumber( "2003424" );
- truck.setYear( 2005 );
- truck.setCurrentConductor( cond );
- s.persist( truck );
- s.flush();
- s.delete( truck );
- s.delete( agreement );
- s.delete( cond );
- s.getTransaction().rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Conductor.class,
- Vehicule.class,
- ProfessionalAgreement.class,
- Truck.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/IndexTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/IndexTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/IndexTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/IndexTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,63 @@
+//$Id$
+package org.hibernate.test.annotations.various;
+
+import java.util.Date;
+
+import org.hibernate.Session;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IndexTest extends TestCase {
+ public void testIndexManyToOne() throws Exception {
+ //TODO find a way to test indexes???
+ Session s = openSession();
+ s.getTransaction().begin();
+ Conductor emmanuel = new Conductor();
+ emmanuel.setName( "Emmanuel" );
+ s.persist( emmanuel );
+ Vehicule tank = new Vehicule();
+ tank.setCurrentConductor( emmanuel );
+ tank.setRegistrationNumber( "324VX43" );
+ s.persist( tank );
+ s.flush();
+ s.delete( tank );
+ s.delete( emmanuel );
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testIndexAndJoined() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Conductor cond = new Conductor();
+ cond.setName( "Bob" );
+ s.persist( cond );
+ ProfessionalAgreement agreement = new ProfessionalAgreement();
+ agreement.setExpirationDate( new Date() );
+ s.persist( agreement );
+ Truck truck = new Truck();
+ truck.setAgreement( agreement );
+ truck.setWeight( 20 );
+ truck.setRegistrationNumber( "2003424" );
+ truck.setYear( 2005 );
+ truck.setCurrentConductor( cond );
+ s.persist( truck );
+ s.flush();
+ s.delete( truck );
+ s.delete( agreement );
+ s.delete( cond );
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Conductor.class,
+ Vehicule.class,
+ ProfessionalAgreement.class,
+ Truck.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.various;
-
-import java.util.Date;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class ProfessionalAgreement {
- @Id
- @GeneratedValue
- private Integer id;
- private Date expirationDate;
-
- public Date getExpirationDate() {
- return expirationDate;
- }
-
- public void setExpirationDate(Date expirationDate) {
- this.expirationDate = expirationDate;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/ProfessionalAgreement.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.test.annotations.various;
+
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ProfessionalAgreement {
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private Date expirationDate;
+
+ public Date getExpirationDate() {
+ return expirationDate;
+ }
+
+ public void setExpirationDate(Date expirationDate) {
+ this.expirationDate = expirationDate;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Truck.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Truck.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Truck.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.various;
-
-import javax.persistence.Entity;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-import org.hibernate.annotations.Index;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Truck extends Vehicule {
- @Index(name = "weigth_idx")
- private int weight;
-
- @ManyToOne
- @JoinColumn(name = "agreement_id")
- @Index(name = "agreement_idx")
- private ProfessionalAgreement agreement;
-
- public int getWeight() {
- return weight;
- }
-
- public void setWeight(int weight) {
- this.weight = weight;
- }
-
- public ProfessionalAgreement getAgreement() {
- return agreement;
- }
-
- public void setAgreement(ProfessionalAgreement agreement) {
- this.agreement = agreement;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Truck.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Truck.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Truck.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Truck.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.test.annotations.various;
+
+import javax.persistence.Entity;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Truck extends Vehicule {
+ @Index(name = "weigth_idx")
+ private int weight;
+
+ @ManyToOne
+ @JoinColumn(name = "agreement_id")
+ @Index(name = "agreement_idx")
+ private ProfessionalAgreement agreement;
+
+ public int getWeight() {
+ return weight;
+ }
+
+ public void setWeight(int weight) {
+ this.weight = weight;
+ }
+
+ public ProfessionalAgreement getAgreement() {
+ return agreement;
+ }
+
+ public void setAgreement(ProfessionalAgreement agreement) {
+ this.agreement = agreement;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Vehicule.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Vehicule.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Vehicule.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,83 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.various;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-import org.hibernate.annotations.GenericGenerator;
-import org.hibernate.annotations.Index;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.JOINED)
- at org.hibernate.annotations.Table(appliesTo = "Vehicule",
- indexes = {
- @Index(name = "improbableindex", columnNames = {"registration", "Conductor_fk"}),
- @Index(name = "secondone", columnNames = {"Conductor_fk"})
- }
-)
-public class Vehicule {
- @Id
- @GeneratedValue(generator = "gen")
- @GenericGenerator(name = "gen", strategy = "uuid")
- private String id;
- @Column(name = "registration")
- private String registrationNumber;
- @ManyToOne(optional = false)
- @JoinColumn(name = "Conductor_fk")
- @Index(name = "thirdone")
- private Conductor currentConductor;
- @Index(name = "year_idx")
- private Integer year;
- @ManyToOne(optional = true)
- @Index(name = "forthone")
- private Conductor previousConductor;
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getRegistrationNumber() {
- return registrationNumber;
- }
-
- public void setRegistrationNumber(String registrationNumber) {
- this.registrationNumber = registrationNumber;
- }
-
- public Conductor getCurrentConductor() {
- return currentConductor;
- }
-
- public void setCurrentConductor(Conductor currentConductor) {
- this.currentConductor = currentConductor;
- }
-
- public Integer getYear() {
- return year;
- }
-
- public void setYear(Integer year) {
- this.year = year;
- }
-
- public Conductor getPreviousConductor() {
- return previousConductor;
- }
-
- public void setPreviousConductor(Conductor previousConductor) {
- this.previousConductor = previousConductor;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Vehicule.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Vehicule.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Vehicule.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/Vehicule.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,83 @@
+//$Id$
+package org.hibernate.test.annotations.various;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.annotations.GenericGenerator;
+import org.hibernate.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+ at org.hibernate.annotations.Table(appliesTo = "Vehicule",
+ indexes = {
+ @Index(name = "improbableindex", columnNames = {"registration", "Conductor_fk"}),
+ @Index(name = "secondone", columnNames = {"Conductor_fk"})
+ }
+)
+public class Vehicule {
+ @Id
+ @GeneratedValue(generator = "gen")
+ @GenericGenerator(name = "gen", strategy = "uuid")
+ private String id;
+ @Column(name = "registration")
+ private String registrationNumber;
+ @ManyToOne(optional = false)
+ @JoinColumn(name = "Conductor_fk")
+ @Index(name = "thirdone")
+ private Conductor currentConductor;
+ @Index(name = "year_idx")
+ private Integer year;
+ @ManyToOne(optional = true)
+ @Index(name = "forthone")
+ private Conductor previousConductor;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getRegistrationNumber() {
+ return registrationNumber;
+ }
+
+ public void setRegistrationNumber(String registrationNumber) {
+ this.registrationNumber = registrationNumber;
+ }
+
+ public Conductor getCurrentConductor() {
+ return currentConductor;
+ }
+
+ public void setCurrentConductor(Conductor currentConductor) {
+ this.currentConductor = currentConductor;
+ }
+
+ public Integer getYear() {
+ return year;
+ }
+
+ public void setYear(Integer year) {
+ this.year = year;
+ }
+
+ public Conductor getPreviousConductor() {
+ return previousConductor;
+ }
+
+ public void setPreviousConductor(Conductor previousConductor) {
+ this.previousConductor = previousConductor;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/VersionTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/VersionTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/VersionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.various;
-
-import org.hibernate.Session;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class VersionTest extends TestCase {
-
- public void testOptimisticLockDisabled() throws Exception {
- Conductor c = new Conductor();
- c.setName( "Bob" );
- Session s = openSession( );
- s.getTransaction().begin();
- s.persist( c );
- s.flush();
-
- s.clear();
-
- c = (Conductor) s.get( Conductor.class, c.getId() );
- Long version = c.getVersion();
- c.setName( "Don" );
- s.flush();
-
- s.clear();
-
- c = (Conductor) s.get( Conductor.class, c.getId() );
- assertEquals( version, c.getVersion() );
-
- s.getTransaction().rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- Conductor.class
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/VersionTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/VersionTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/VersionTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/various/VersionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id: $
+package org.hibernate.test.annotations.various;
+
+import org.hibernate.Session;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class VersionTest extends TestCase {
+
+ public void testOptimisticLockDisabled() throws Exception {
+ Conductor c = new Conductor();
+ c.setName( "Bob" );
+ Session s = openSession( );
+ s.getTransaction().begin();
+ s.persist( c );
+ s.flush();
+
+ s.clear();
+
+ c = (Conductor) s.get( Conductor.class, c.getId() );
+ Long version = c.getVersion();
+ c.setName( "Don" );
+ s.flush();
+
+ s.clear();
+
+ c = (Conductor) s.get( Conductor.class, c.getId() );
+ assertEquals( version, c.getVersion() );
+
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Conductor.class
+ };
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/version (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/version)
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml)
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3 (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/CarModel.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/CarModel.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/CarModel.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.ejb3;
-
-import java.util.Date;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CarModel extends Model {
- private Date year;
-
- public Date getYear() {
- return year;
- }
-
- public void setYear(Date year) {
- this.year = year;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/CarModel.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/CarModel.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/CarModel.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/CarModel.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.ejb3;
+
+import java.util.Date;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CarModel extends Model {
+ private Date year;
+
+ public Date getYear() {
+ return year;
+ }
+
+ public void setYear(Date year) {
+ this.year = year;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.ejb3;
-
-import java.util.Date;
-import java.util.List;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Ejb3XmlTest extends TestCase {
- public void testEjb3Xml() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- CarModel model = new CarModel();
- model.setYear( new Date() );
- Manufacturer manufacturer = new Manufacturer();
- //s.persist( manufacturer );
- model.setManufacturer( manufacturer );
- manufacturer.getModels().add( model );
- s.persist( model );
- s.flush();
- s.clear();
-
- model.setYear( new Date() );
- manufacturer = (Manufacturer) s.get( Manufacturer.class, manufacturer.getId() );
- List<Model> cars = s.getNamedQuery( "allModelsPerManufacturer" )
- .setParameter( "manufacturer", manufacturer )
- .list();
- assertEquals( 1, cars.size() );
- for ( Model car : cars ) {
- assertNotNull( car.getManufacturer() );
- s.delete( manufacturer );
- s.delete( car );
- }
- tx.rollback();
- s.close();
- }
-
- public void testXMLEntityHandled() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Lighter l = new Lighter();
- l.name = "Blue";
- l.power = "400°F";
- s.persist( l );
- s.flush();
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testXmlDefaultOverriding() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Manufacturer manufacturer = new Manufacturer();
- s.persist( manufacturer );
- s.flush();
- s.clear();
-
- assertEquals( 1, s.getNamedQuery( "manufacturer.findAll" ).list().size() );
- tx.rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- CarModel.class,
- Manufacturer.class,
- Model.class,
- Light.class
- //Lighter.class xml only entuty
- };
- }
-
- @Override
- protected String[] getXmlFiles() {
- return new String[]{
- "org/hibernate/test/annotations/xml/ejb3/orm.xml",
- "org/hibernate/test/annotations/xml/ejb3/orm2.xml",
- "org/hibernate/test/annotations/xml/ejb3/orm3.xml"
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Ejb3XmlTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.ejb3;
+
+import java.util.Date;
+import java.util.List;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Ejb3XmlTest extends TestCase {
+ public void testEjb3Xml() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ CarModel model = new CarModel();
+ model.setYear( new Date() );
+ Manufacturer manufacturer = new Manufacturer();
+ //s.persist( manufacturer );
+ model.setManufacturer( manufacturer );
+ manufacturer.getModels().add( model );
+ s.persist( model );
+ s.flush();
+ s.clear();
+
+ model.setYear( new Date() );
+ manufacturer = (Manufacturer) s.get( Manufacturer.class, manufacturer.getId() );
+ List<Model> cars = s.getNamedQuery( "allModelsPerManufacturer" )
+ .setParameter( "manufacturer", manufacturer )
+ .list();
+ assertEquals( 1, cars.size() );
+ for ( Model car : cars ) {
+ assertNotNull( car.getManufacturer() );
+ s.delete( manufacturer );
+ s.delete( car );
+ }
+ tx.rollback();
+ s.close();
+ }
+
+ public void testXMLEntityHandled() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Lighter l = new Lighter();
+ l.name = "Blue";
+ l.power = "400°F";
+ s.persist( l );
+ s.flush();
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testXmlDefaultOverriding() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Manufacturer manufacturer = new Manufacturer();
+ s.persist( manufacturer );
+ s.flush();
+ s.clear();
+
+ assertEquals( 1, s.getNamedQuery( "manufacturer.findAll" ).list().size() );
+ tx.rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ CarModel.class,
+ Manufacturer.class,
+ Model.class,
+ Light.class
+ //Lighter.class xml only entuty
+ };
+ }
+
+ @Override
+ protected String[] getXmlFiles() {
+ return new String[]{
+ "org/hibernate/test/annotations/xml/ejb3/orm.xml",
+ "org/hibernate/test/annotations/xml/ejb3/orm2.xml",
+ "org/hibernate/test/annotations/xml/ejb3/orm3.xml"
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Light.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Light.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Light.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.ejb3;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Light {
- public String name;
- public String power;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Light.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Light.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Light.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Light.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.ejb3;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Light {
+ public String name;
+ public String power;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Lighter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Lighter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Lighter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.ejb3;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Lighter {
- public String name;
- public String power;
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Lighter.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Lighter.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Lighter.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Lighter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.ejb3;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Lighter {
+ public String name;
+ public String power;
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.ejb3;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-import javax.persistence.NamedQuery;
-import javax.persistence.TableGenerator;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at NamedQuery(name="manufacturer.findAll", query = "from Manufacturer where 1 = 2")
- at TableGenerator(name="generator", table = "this is a broken name with select from and other SQL keywords")
-public class Manufacturer {
- private Integer id;
- private Set<Model> models = new HashSet<Model>();
-
- @Id
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @OneToMany
- public Set<Model> getModels() {
- return models;
- }
-
- public void setModels(Set<Model> models) {
- this.models = models;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Manufacturer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.ejb3;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.NamedQuery;
+import javax.persistence.TableGenerator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at NamedQuery(name="manufacturer.findAll", query = "from Manufacturer where 1 = 2")
+ at TableGenerator(name="generator", table = "this is a broken name with select from and other SQL keywords")
+public class Manufacturer {
+ private Integer id;
+ private Set<Model> models = new HashSet<Model>();
+
+ @Id
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @OneToMany
+ public Set<Model> getModels() {
+ return models;
+ }
+
+ public void setModels(Set<Model> models) {
+ this.models = models;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Model.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Model.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Model.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.ejb3;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Model {
- private Integer id;
- private Manufacturer manufacturer;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public Manufacturer getManufacturer() {
- return manufacturer;
- }
-
- public void setManufacturer(Manufacturer manufacturer) {
- this.manufacturer = manufacturer;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Model.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Model.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Model.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/Model.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.ejb3;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Model {
+ private Integer id;
+ private Manufacturer manufacturer;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Manufacturer getManufacturer() {
+ return manufacturer;
+ }
+
+ public void setManufacturer(Manufacturer manufacturer) {
+ this.manufacturer = manufacturer;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-<?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"
- version="1.0"
- >
- <!-- no grammar specified should pass -->
- <persistence-unit-metadata>
- <persistence-unit-defaults>
- <cascade-persist/>
- </persistence-unit-defaults>
- </persistence-unit-metadata>
- <package>org.hibernate.test.annotations.xml.ejb3</package>
- <table-generator name="generator" table="table_id"/>
- <named-query name="manufacturer.findAll">
- <query>select m from Manufacturer m</query>
- </named-query>
- <entity class="Model" access="PROPERTY" name="ModelZ" metadata-complete="true">
- <table name="ModelZ">
- </table>
- <inheritance strategy="JOINED"/>
- <attributes>
- <id name="id">
- <column name="fld_id"/>
- <generated-value strategy="TABLE" generator="generator"/>
- </id>
- <basic name="unknownProperty"/>
- <many-to-one name="manufacturer" fetch="LAZY">
- <join-column name="manufacturer_pk"/>
- </many-to-one>
- </attributes>
- </entity>
- <entity class="CarModel" metadata-complete="true">
- <primary-key-join-column name="model_id"/>
- <inheritance strategy="JOINED"/>
- <named-query name="allModelsPerManufacturer">
- <query>from ModelZ m where m.manufacturer = :manufacturer</query>
- <hint name="org.hibernate.timeout" value="200"/>
- </named-query>
- <exclude-default-listeners/>
- <exclude-superclass-listeners/>
- <attributes>
- <basic name="year" optional="false">
- <temporal>DATE</temporal>
- </basic>
- </attributes>
- </entity>
- <entity class="Manufacturer">
- <attributes>
- <id name="id">
- <generated-value strategy="AUTO"/>
- </id>
- <one-to-many name="models" mapped-by="manufacturer"/>
- </attributes>
- </entity>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+<?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"
+ version="1.0"
+ >
+ <!-- no grammar specified should pass -->
+ <persistence-unit-metadata>
+ <persistence-unit-defaults>
+ <cascade-persist/>
+ </persistence-unit-defaults>
+ </persistence-unit-metadata>
+ <package>org.hibernate.test.annotations.xml.ejb3</package>
+ <table-generator name="generator" table="table_id"/>
+ <named-query name="manufacturer.findAll">
+ <query>select m from Manufacturer m</query>
+ </named-query>
+ <entity class="Model" access="PROPERTY" name="ModelZ" metadata-complete="true">
+ <table name="ModelZ">
+ </table>
+ <inheritance strategy="JOINED"/>
+ <attributes>
+ <id name="id">
+ <column name="fld_id"/>
+ <generated-value strategy="TABLE" generator="generator"/>
+ </id>
+ <basic name="unknownProperty"/>
+ <many-to-one name="manufacturer" fetch="LAZY">
+ <join-column name="manufacturer_pk"/>
+ </many-to-one>
+ </attributes>
+ </entity>
+ <entity class="CarModel" metadata-complete="true">
+ <primary-key-join-column name="model_id"/>
+ <inheritance strategy="JOINED"/>
+ <named-query name="allModelsPerManufacturer">
+ <query>from ModelZ m where m.manufacturer = :manufacturer</query>
+ <hint name="org.hibernate.timeout" value="200"/>
+ </named-query>
+ <exclude-default-listeners/>
+ <exclude-superclass-listeners/>
+ <attributes>
+ <basic name="year" optional="false">
+ <temporal>DATE</temporal>
+ </basic>
+ </attributes>
+ </entity>
+ <entity class="Manufacturer">
+ <attributes>
+ <id name="id">
+ <generated-value strategy="AUTO"/>
+ </id>
+ <one-to-many name="models" mapped-by="manufacturer"/>
+ </attributes>
+ </entity>
+</entity-mappings>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm2.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm2.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm2.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-<?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>org.hibernate.test.annotations.xml.ejb3</package>
- <entity class="Light" access="FIELD" metadata-complete="true">
- <attributes>
- <id name="name">
- <column name="fld_id"/>
- </id>
- <basic name="power"></basic>
- </attributes>
- </entity>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm2.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm2.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm2.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm2.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -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_1_0.xsd"
+ version="1.0"
+ >
+ <package>org.hibernate.test.annotations.xml.ejb3</package>
+ <entity class="Light" access="FIELD" metadata-complete="true">
+ <attributes>
+ <id name="name">
+ <column name="fld_id"/>
+ </id>
+ <basic name="power"></basic>
+ </attributes>
+ </entity>
+</entity-mappings>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm3.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm3.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm3.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-<?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>org.hibernate.test.annotations.xml.ejb3</package>
- <entity class="Lighter" access="FIELD" metadata-complete="true">
- <attributes>
- <id name="name">
- <column name="fld_id"/>
- </id>
- <basic name="power"></basic>
- </attributes>
- </entity>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm3.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm3.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm3.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/ejb3/orm3.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -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_1_0.xsd"
+ version="1.0"
+ >
+ <package>org.hibernate.test.annotations.xml.ejb3</package>
+ <entity class="Lighter" access="FIELD" metadata-complete="true">
+ <attributes>
+ <id name="name">
+ <column name="fld_id"/>
+ </id>
+ <basic name="power"></basic>
+ </attributes>
+ </entity>
+</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm)
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
-<hibernate-mapping>
- <class name="org.hibernate.test.annotations.xml.hbm.AImpl" table="A"
- proxy="org.hibernate.test.annotations.xml.hbm.A">
- <id name="AId" column="aID" type="java.lang.Integer">
- <generator class="identity"/>
- </id>
- </class>
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.hbm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.hbm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
+<hibernate-mapping>
+ <class name="org.hibernate.test.annotations.xml.hbm.AImpl" table="A"
+ proxy="org.hibernate.test.annotations.xml.hbm.A">
+ <id name="AId" column="aID" type="java.lang.Integer">
+ <generator class="identity"/>
+ </id>
+ </class>
+</hibernate-mapping>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.hbm;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface A extends java.io.Serializable {
- public Integer getAId();
-
- public void setAId(Integer aId);
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/A.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.hbm;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface A extends java.io.Serializable {
+ public Integer getAId();
+
+ public void setAId(Integer aId);
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/AImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/AImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/AImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.hbm;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-
- at Entity
- at Inheritance( strategy = InheritanceType.JOINED )
- at org.hibernate.annotations.Proxy( proxyClass = A.class )
- at Table( name = "A" )
-public class AImpl implements A {
- private static final long serialVersionUID = 1L;
-
- private Integer aId = 0;
-
- public AImpl() {
- }
-
- @Id
- @GeneratedValue
- @Column( name = "aID" )
- public Integer getAId() {
- return this.aId;
- }
-
- public void setAId(Integer aId) {
- this.aId = aId;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/AImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/AImpl.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/AImpl.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/AImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.hbm;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+
+ at Entity
+ at Inheritance( strategy = InheritanceType.JOINED )
+ at org.hibernate.annotations.Proxy( proxyClass = A.class )
+ at Table( name = "A" )
+public class AImpl implements A {
+ private static final long serialVersionUID = 1L;
+
+ private Integer aId = 0;
+
+ public AImpl() {
+ }
+
+ @Id
+ @GeneratedValue
+ @Column( name = "aID" )
+ public Integer getAId() {
+ return this.aId;
+ }
+
+ public void setAId(Integer aId) {
+ this.aId = aId;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
-<hibernate-mapping>
- <joined-subclass name="org.hibernate.test.annotations.xml.hbm.BImpl" table="B"
- proxy="org.hibernate.test.annotations.xml.hbm.B"
- extends="org.hibernate.test.annotations.xml.hbm.AImpl">
- <key column="aID"/>
- <property name="BId" column="bID" type="java.lang.Integer"
- not-null="true"/>
- </joined-subclass>
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.hbm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.hbm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+<!-- Generated Nov 9, 2006 6:27:53 PM by Hibernate Tools 3.2.0.beta7 -->
+<hibernate-mapping>
+ <joined-subclass name="org.hibernate.test.annotations.xml.hbm.BImpl" table="B"
+ proxy="org.hibernate.test.annotations.xml.hbm.B"
+ extends="org.hibernate.test.annotations.xml.hbm.AImpl">
+ <key column="aID"/>
+ <property name="BId" column="bID" type="java.lang.Integer"
+ not-null="true"/>
+ </joined-subclass>
+</hibernate-mapping>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.hbm;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface B extends A {
- public Integer getBId();
-
- public void setBId(Integer bId);
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/B.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.hbm;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface B extends A {
+ public Integer getBId();
+
+ public void setBId(Integer bId);
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/BImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/BImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/BImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.hbm;
-
-import javax.persistence.Entity;
-import javax.persistence.Table;
-
- at Entity
- at org.hibernate.annotations.Proxy( proxyClass = B.class )
- at Table( name = "B" )
-public class BImpl extends AImpl implements B {
- private static final long serialVersionUID = 1L;
-
- private Integer bId = 0;
-
- public BImpl() {
- super();
- }
-
- public Integer getBId() {
- return bId;
- }
-
- public void setBId(Integer bId) {
- this.bId = bId;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/BImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/BImpl.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/BImpl.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/BImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.hbm;
+
+import javax.persistence.Entity;
+import javax.persistence.Table;
+
+ at Entity
+ at org.hibernate.annotations.Proxy( proxyClass = B.class )
+ at Table( name = "B" )
+public class BImpl extends AImpl implements B {
+ private static final long serialVersionUID = 1L;
+
+ private Integer bId = 0;
+
+ public BImpl() {
+ super();
+ }
+
+ public Integer getBId() {
+ return bId;
+ }
+
+ public void setBId(Integer bId) {
+ this.bId = bId;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping package="org.hibernate.test.annotations.xml.hbm">
-
- <class name="CloudType">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- </class>
-
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.annotations.xml.hbm">
+
+ <class name="CloudType">
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <property name="name"/>
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.hbm;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CloudType {
- private Integer id;
- private String name;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/CloudType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.hbm;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CloudType {
+ private Integer id;
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping package="org.hibernate.test.annotations.xml.hbm">
-
- <class name="Government">
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
- <many-to-one name="primeMinister" column="primeMinister_id"/>
- </class>
-
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.hibernate.test.annotations.xml.hbm">
+
+ <class name="Government">
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <property name="name"/>
+ <many-to-one name="primeMinister" column="primeMinister_id"/>
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id$
-package org.hibernate.test.annotations.xml.hbm;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Government {
- private Integer id;
- private String name;
- private PrimeMinister primeMinister;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public PrimeMinister getPrimeMinister() {
- return primeMinister;
- }
-
- public void setPrimeMinister(PrimeMinister primeMinister) {
- this.primeMinister = primeMinister;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Government.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.test.annotations.xml.hbm;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Government {
+ private Integer id;
+ private String name;
+ private PrimeMinister primeMinister;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public PrimeMinister getPrimeMinister() {
+ return primeMinister;
+ }
+
+ public void setPrimeMinister(PrimeMinister primeMinister) {
+ this.primeMinister = primeMinister;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/HbmTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/HbmTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/HbmTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,104 +0,0 @@
-//$Id:HbmTest.java 9793 2006-04-26 02:20:18 -0400 (mer., 26 avr. 2006) epbernard $
-package org.hibernate.test.annotations.xml.hbm;
-
-import java.util.HashSet;
-
-import org.hibernate.Session;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.test.annotations.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class HbmTest extends TestCase {
-
- public void testManyToOne() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Government gov = new Government();
- gov.setName( "Liberals" );
- s.save( gov );
- PrimeMinister pm = new PrimeMinister();
- pm.setName( "Murray" );
- pm.setCurrentGovernment( gov );
- s.save( pm );
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testOneToMany() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- Government gov = new Government();
- gov.setName( "Liberals" );
- Government gov2 = new Government();
- gov2.setName( "Liberals2" );
- s.save( gov );
- s.save( gov2 );
- PrimeMinister pm = new PrimeMinister();
- pm.setName( "Murray" );
- pm.setCurrentGovernment( gov );
- pm.setGovernments( new HashSet() );
- pm.getGovernments().add( gov2 );
- pm.getGovernments().add( gov );
- gov.setPrimeMinister( pm );
- gov2.setPrimeMinister( pm );
- s.save( pm );
- s.flush();
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testManyToMany() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- CloudType type = new CloudType();
- type.setName( "Cumulus" );
- Sky sky = new Sky();
- s.persist( type );
- sky.getCloudTypes().add(type);
- s.persist( sky );
- s.flush();
- s.getTransaction().rollback();
- s.close();
- }
-
- public void testManyToOneAndInterface() throws Exception {
- Session s = openSession();
- s.getTransaction().begin();
- B b = new BImpl();
- b.setBId( 1 );
- s.persist( b );
- Z z = new ZImpl();
- z.setB( b );
- s.persist( z );
- s.flush();
- s.getTransaction().rollback();
- s.close();
- }
-
- @Override
- protected void configure(Configuration cfg) {
- super.configure( cfg );
- //cfg.addClass( Government.class );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- PrimeMinister.class,
- Sky.class,
- ZImpl.class
-
- };
- }
-
- @Override
- protected String[] getXmlFiles() {
- return new String[]{
- "org/hibernate/test/annotations/xml/hbm/Government.hbm.xml",
- "org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml",
- "org/hibernate/test/annotations/xml/hbm/A.hbm.xml",
- "org/hibernate/test/annotations/xml/hbm/B.hbm.xml"
- };
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/HbmTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/HbmTest.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/HbmTest.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/HbmTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,104 @@
+//$Id:HbmTest.java 9793 2006-04-26 02:20:18 -0400 (mer., 26 avr. 2006) epbernard $
+package org.hibernate.test.annotations.xml.hbm;
+
+import java.util.HashSet;
+
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.test.annotations.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class HbmTest extends TestCase {
+
+ public void testManyToOne() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Government gov = new Government();
+ gov.setName( "Liberals" );
+ s.save( gov );
+ PrimeMinister pm = new PrimeMinister();
+ pm.setName( "Murray" );
+ pm.setCurrentGovernment( gov );
+ s.save( pm );
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testOneToMany() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ Government gov = new Government();
+ gov.setName( "Liberals" );
+ Government gov2 = new Government();
+ gov2.setName( "Liberals2" );
+ s.save( gov );
+ s.save( gov2 );
+ PrimeMinister pm = new PrimeMinister();
+ pm.setName( "Murray" );
+ pm.setCurrentGovernment( gov );
+ pm.setGovernments( new HashSet() );
+ pm.getGovernments().add( gov2 );
+ pm.getGovernments().add( gov );
+ gov.setPrimeMinister( pm );
+ gov2.setPrimeMinister( pm );
+ s.save( pm );
+ s.flush();
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testManyToMany() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ CloudType type = new CloudType();
+ type.setName( "Cumulus" );
+ Sky sky = new Sky();
+ s.persist( type );
+ sky.getCloudTypes().add(type);
+ s.persist( sky );
+ s.flush();
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ public void testManyToOneAndInterface() throws Exception {
+ Session s = openSession();
+ s.getTransaction().begin();
+ B b = new BImpl();
+ b.setBId( 1 );
+ s.persist( b );
+ Z z = new ZImpl();
+ z.setB( b );
+ s.persist( z );
+ s.flush();
+ s.getTransaction().rollback();
+ s.close();
+ }
+
+ @Override
+ protected void configure(Configuration cfg) {
+ super.configure( cfg );
+ //cfg.addClass( Government.class );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ PrimeMinister.class,
+ Sky.class,
+ ZImpl.class
+
+ };
+ }
+
+ @Override
+ protected String[] getXmlFiles() {
+ return new String[]{
+ "org/hibernate/test/annotations/xml/hbm/Government.hbm.xml",
+ "org/hibernate/test/annotations/xml/hbm/CloudType.hbm.xml",
+ "org/hibernate/test/annotations/xml/hbm/A.hbm.xml",
+ "org/hibernate/test/annotations/xml/hbm/B.hbm.xml"
+ };
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id:PrimeMinister.java 9793 2006-04-26 02:20:18 -0400 (mer., 26 avr. 2006) epbernard $
-package org.hibernate.test.annotations.xml.hbm;
-
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class PrimeMinister {
- private Integer id;
- private String name;
- private Government currentGovernment;
- private Set<Government> governments;
-
- @ManyToOne
- public Government getCurrentGovernment() {
- return currentGovernment;
- }
-
- public void setCurrentGovernment(Government currentGovernment) {
- this.currentGovernment = currentGovernment;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @OneToMany(mappedBy = "primeMinister")
- public Set<Government> getGovernments() {
- return governments;
- }
-
- public void setGovernments(Set<Government> governments) {
- this.governments = governments;
- }
-
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/PrimeMinister.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id:PrimeMinister.java 9793 2006-04-26 02:20:18 -0400 (mer., 26 avr. 2006) epbernard $
+package org.hibernate.test.annotations.xml.hbm;
+
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class PrimeMinister {
+ private Integer id;
+ private String name;
+ private Government currentGovernment;
+ private Set<Government> governments;
+
+ @ManyToOne
+ public Government getCurrentGovernment() {
+ return currentGovernment;
+ }
+
+ public void setCurrentGovernment(Government currentGovernment) {
+ this.currentGovernment = currentGovernment;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @OneToMany(mappedBy = "primeMinister")
+ public Set<Government> getGovernments() {
+ return governments;
+ }
+
+ public void setGovernments(Set<Government> governments) {
+ this.governments = governments;
+ }
+
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Sky.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Sky.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Sky.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.hbm;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToMany;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity(name="EarthSky")
-public class Sky {
- private Integer id;
- private Set<CloudType> cloudTypes = new HashSet<CloudType>();
- private CloudType mainCloud;
-
- @ManyToMany
- public Set<CloudType> getCloudTypes() {
- return cloudTypes;
- }
-
- public void setCloudTypes(Set<CloudType> cloudTypes) {
- this.cloudTypes = cloudTypes;
- }
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @ManyToOne
- public CloudType getMainCloud() {
- return mainCloud;
- }
-
- public void setMainCloud(CloudType mainCloud) {
- this.mainCloud = mainCloud;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Sky.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Sky.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Sky.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Sky.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.hbm;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToMany;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity(name="EarthSky")
+public class Sky {
+ private Integer id;
+ private Set<CloudType> cloudTypes = new HashSet<CloudType>();
+ private CloudType mainCloud;
+
+ @ManyToMany
+ public Set<CloudType> getCloudTypes() {
+ return cloudTypes;
+ }
+
+ public void setCloudTypes(Set<CloudType> cloudTypes) {
+ this.cloudTypes = cloudTypes;
+ }
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @ManyToOne
+ public CloudType getMainCloud() {
+ return mainCloud;
+ }
+
+ public void setMainCloud(CloudType mainCloud) {
+ this.mainCloud = mainCloud;
+ }
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Z.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Z.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Z.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.hbm;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Z extends java.io.Serializable {
- public Integer getZId();
-
- public void setZId(Integer zId);
-
- public B getB();
-
- public void setB(B b);
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Z.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Z.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Z.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/Z.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.hbm;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Z extends java.io.Serializable {
+ public Integer getZId();
+
+ public void setZId(Integer zId);
+
+ public B getB();
+
+ public void setB(B b);
+}
Deleted: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/ZImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/ZImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/ZImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-//$Id: $
-package org.hibernate.test.annotations.xml.hbm;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-
- at Entity
- at Inheritance( strategy = InheritanceType.JOINED )
- at org.hibernate.annotations.Proxy( proxyClass = Z.class )
- at Table( name = "Z" )
-public class ZImpl implements Z {
- private static final long serialVersionUID = 1L;
-
- private Integer zId = null;
- private B b = null;
-
- @Id
- @GeneratedValue
- @Column( name = "zID" )
- public Integer getZId() {
- return zId;
- }
-
- public void setZId(Integer zId) {
- this.zId = zId;
- }
-
- @ManyToOne( optional = false, targetEntity = BImpl.class, fetch = FetchType.LAZY )
- @JoinColumn( name = "bID", referencedColumnName = "bID")
- public B getB() {
- return b;
- }
-
- public void setB(B b) {
- this.b = b;
- }
-}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/ZImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/ZImpl.java)
===================================================================
--- trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/ZImpl.java (rev 0)
+++ trunk/HibernateExt/annotations/src/test/org/hibernate/test/annotations/xml/hbm/ZImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+//$Id: $
+package org.hibernate.test.annotations.xml.hbm;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+
+ at Entity
+ at Inheritance( strategy = InheritanceType.JOINED )
+ at org.hibernate.annotations.Proxy( proxyClass = Z.class )
+ at Table( name = "Z" )
+public class ZImpl implements Z {
+ private static final long serialVersionUID = 1L;
+
+ private Integer zId = null;
+ private B b = null;
+
+ @Id
+ @GeneratedValue
+ @Column( name = "zID" )
+ public Integer getZId() {
+ return zId;
+ }
+
+ public void setZId(Integer zId) {
+ this.zId = zId;
+ }
+
+ @ManyToOne( optional = false, targetEntity = BImpl.class, fetch = FetchType.LAZY )
+ @JoinColumn( name = "bID", referencedColumnName = "bID")
+ public B getB() {
+ return b;
+ }
+
+ public void setB(B b) {
+ this.b = b;
+ }
+}
Copied: trunk/HibernateExt/annotations/src/test/org/hibernate/test/lucene (from rev 11279, branches/Branch_3_2/HibernateExt/annotations/src/test/org/hibernate/test/lucene)
Modified: trunk/HibernateExt/common/common-build.xml
===================================================================
--- trunk/HibernateExt/common/common-build.xml 2007-03-14 22:02:55 UTC (rev 11281)
+++ trunk/HibernateExt/common/common-build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -36,9 +36,11 @@
<property name="javadoc" value="http://java.sun.com/j2se/1.4/docs/api"/>
<property name="javac.debug" value="on"/>
<property name="javac.optimize" value="off"/>
+ <property name="javac.source" value="1.4"/>
+ <property name="javac.target" value="1.4"/>
- <!-- set Hibernate core related properties -->
+ <!-- set Hibernate core related properties -->
<property name="hibernate-core.home" location="${common-build.basedir}/../../hibernate-3.2"/>
<property name="hibernate-core.jar" location="${hibernate-core.home}/hibernate3.jar"/>
<property name="hibernate-core.lib.dir" location="${hibernate-core.home}/lib"/>
@@ -48,7 +50,16 @@
<!--
Explicitly define tasks from ant..
- Unfortunately, checkstyle-all.jar contains it's own version of ANTLR, so ANTLR cannot be in the classpath.
+ Unfortunately, checkstyle-a<path id="lib.class.path">
+ <path location="${hibernate-core.jar}"></path>
+ <fileset dir="${hibernate-core.lib.dir}">
+ <include name="*.jar"/>
+ </fileset>
+ <fileset dir="${lib.dir}">
+ <include name="*.jar"/>
+ </fileset>
+ <pathelement path="${clover.jar}"/>
+ </path>ll.jar contains it's own version of ANTLR, so ANTLR cannot be in the classpath.
-->
<!-- Emmanuel: Removed antlr, shouldn't be useful in Ext package...
taskdef name="antlr" classname="org.apache.tools.ant.taskdefs.optional.ANTLR">
@@ -84,10 +95,14 @@
<fileset dir="${lib.dir}">
<include name="*.jar"/>
</fileset>
- <pathelement path="${clover.jar}"/>
+ <path refid="lib.moduleclass.path"/>
+ <pathelement path="${clover.jar}"/>
</path>
- <patternset id="support.files">
+ <!-- overridable in modules -->
+ <path id="lib.moduleclass.path"/>
+
+ <patternset id="support.files">
<include name="**/*.jpg"/>
<include name="**/*.gif"/>
<include name="**/*.dtd"/>
@@ -193,8 +208,8 @@
value="org.eclipse.jdt.core.JDTCompilerAdapter"
classpath="${java.class.path}"/>
<javac
- target="1.4"
- source="1.4"
+ target="${javac.target}"
+ source="${javac.source}"
srcdir="${src.dir}"
destdir="${classes.dir}"
classpathref="lib.class.path"
@@ -211,8 +226,8 @@
value="org.eclipse.jdt.core.JDTCompilerAdapter"
classpath="${java.class.path}"/>
<javac
- target="1.4"
- source="1.4"
+ target="${javac.target}"
+ source="${javac.source}"
destdir="${testclasses.dir}"
classpathref="junit.classpath"
debug="${javac.debug}"
@@ -386,7 +401,18 @@
</junit>
</target>
- <target name="junitinstrument" depends="compiletest,instrument"
+ <!-- Run a single unit test. -->
+ <target name="junitsingle" depends="compiletest" description="Run a single test suite (requires testname and jdbc.driver properties)">
+ <mkdir dir="test_output"/>
+ <junit printsummary="yes" fork="yes" haltonfailure="yes">
+ <classpath refid="junit.classpath"/>
+ <formatter type="plain"/>
+ <formatter type="xml"/>
+ <test fork="yes" todir="test_output" haltonfailure="no" name="${testname}"/>
+ </junit>
+ </target>
+
+ <target name="junitinstrument" depends="compiletest,instrument"
description="Run the instrument test suite (requires driver.jar property)">
<mkdir dir="${instrumenttest.out.dir}"/>
<junit printsummary="yes" haltonfailure="yes" dir="${basedir}"
Copied: trunk/HibernateExt/commons-annotations (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations)
Deleted: trunk/HibernateExt/commons-annotations/build.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/build.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,133 +0,0 @@
-<project name="Hibernate Commons Annotations" default="dist" basedir=".">
-
- <!-- Give user a chance to override without editing this file
- (and without typing -D each time it compiles it) -->
- <property file="build.properties"/>
- <property file="${user.home}/.ant.properties"/>
-
- <!-- Name of project and version, used to create filenames -->
- <property name="Name" value="Hibernate Commons Annotations"/>
- <property name="name" value="hibernate-commons-annotations"/>
- <property name="version" value="3.2.2.GA"/>
- <property name="javadoc.packagenames" value="org.hibernate.commons.annotations.*"/>
- <property name="copy.test" value="true"/>
- <property name="javac.source" value="1.5"/>
- <property name="javac.target" value="1.5"/>
- <property name="common.dir" value="${basedir}/../common"/>
- <property name="hibernate-core.jar.available" value="true"/>
- <property name="jpa-api.jar" value="${basedir}/../jpa-api/build/ejb3-persistence.jar"/>
-
- <import file="${common.dir}/common-build.xml"/>
-
- <path id="lib.class.path">
- <fileset dir="${hibernate-core.lib.dir}">
- <include name="commons-logging*.jar"/>
- <include name="log4j*.jar"/>
- </fileset>
- <fileset dir="${lib.dir}">
- <include name="*.jar"/>
- </fileset>
- <path refid="lib.moduleclass.path"/>
- <pathelement path="${clover.jar}"/>
- </path>
-
- <path id="junit.moduleclasspath">
- <pathelement location="${src.dir}"/>
- <pathelement location="${test.dir}"/>
- <pathelement location="${jpa-api.jar}"/>
- <fileset dir="${hibernate-core.lib.dir}">
- <include name="junit*.jar"/>
- </fileset>
- </path>
-
- <!-- target name="report">
- <mkdir dir="test_output"/>
- <junitreport todir="test_output">
- <fileset dir="test_output">
- <include name="TEST-*.xml"/>
- </fileset>
- <report format="frames" todir="test_output/report"/>
- </junitreport>
- </target -->
-
- <target name="init" description="Initialize the build">
- <!-- CCed from common-build to avoid failure when hibernate core is not compiled -->
- <tstamp>
- <format property="subversion" pattern="yyyy-MM-dd hh:mm:ss"/>
- </tstamp>
- <echo message="Build ${Name}-${version} (${subversion})"/>
- <mkdir dir="${classes.dir}"/>
- <mkdir dir="${testclasses.dir}"/>
- <copy todir="${classes.dir}">
- <fileset dir="${src.dir}">
- <patternset refid="support.files"/>
- </fileset>
- </copy>
-
- <copy todir="${build.dir}">
- <fileset dir=".">
- <include name="readme.txt"/>
- <include name="lgpl.txt"/>
- </fileset>
- </copy>
-
- <!-- check for dependency artefacts -->
- <available file="${jpa-api.jar}" type="file" property="jpa-api.jar.available"/>
- </target>
-
- <target name="compiletest" depends="get.jpa-api,compile" description="Compile the tests">
- <available
- classname="org.eclipse.core.launcher.Main"
- property="build.compiler"
- value="org.eclipse.jdt.core.JDTCompilerAdapter"
- classpath="${java.class.path}"/>
- <javac
- target="${javac.target}"
- source="${javac.source}"
- destdir="${testclasses.dir}"
- classpathref="junit.classpath"
- debug="${javac.debug}"
- optimize="${javac.optimize}"
- nowarn="on">
- <src refid="testsrc.path"/>
- </javac>
- </target>
-
- <target name="get.jpa-api" depends="init" unless="jpa-api.jar.available">
- <ant inheritall="false" dir="${basedir}/../jpa-api" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../jpa-api" target="jar"/>
- </target>
-
- <target name="jar" depends="compile" description="Build the distribution .jar file">
- <mkdir dir="${classes.dir}/META-INF"/>
- <manifest file="${classes.dir}/META-INF/MANIFEST.MF">
- <attribute name="Product" value="${Name}"/>
- <attribute name="Version" value="${version}"/>
- </manifest>
- <antcall target="common-build.jar"/>
- </target>
-
- <!-- Some of this can probably be moved to common-build... -->
- <target name="dist" depends="jar,javadoc,copysource,copytest,copylib,extras" description="Build everything">
-
- <copy todir="${dist.dir}" failonerror="false">
- <fileset dir="${common.dir}">
- <include name="common-build.xml"/>
- </fileset>
- </copy>
- <copy file="${basedir}/build.properties.dist" tofile="${dist.dir}/build.properties" failonerror="false">
- </copy>
- <antcall target="common-build.dist"/>
- </target>
-
- <target name="zip-dist" description="zip the dist">
- <zip zipfile="${dist.dir}-${version}.zip">
- <zipfileset prefix="${name}-${version}" dir="${dist.dir}"/>
- </zip>
- <tar compression="gzip" tarfile="${dist.dir}-${version}.tar.gz">
- <tarfileset prefix="${name}-${version}" dir="${dist.dir}"/>
- </tar>
- </target>
-
-
-</project>
Copied: trunk/HibernateExt/commons-annotations/build.xml (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/build.xml)
===================================================================
--- trunk/HibernateExt/commons-annotations/build.xml (rev 0)
+++ trunk/HibernateExt/commons-annotations/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,133 @@
+<project name="Hibernate Commons Annotations" default="dist" basedir=".">
+
+ <!-- Give user a chance to override without editing this file
+ (and without typing -D each time it compiles it) -->
+ <property file="build.properties"/>
+ <property file="${user.home}/.ant.properties"/>
+
+ <!-- Name of project and version, used to create filenames -->
+ <property name="Name" value="Hibernate Commons Annotations"/>
+ <property name="name" value="hibernate-commons-annotations"/>
+ <property name="version" value="3.2.2.GA"/>
+ <property name="javadoc.packagenames" value="org.hibernate.commons.annotations.*"/>
+ <property name="copy.test" value="true"/>
+ <property name="javac.source" value="1.5"/>
+ <property name="javac.target" value="1.5"/>
+ <property name="common.dir" value="${basedir}/../common"/>
+ <property name="hibernate-core.jar.available" value="true"/>
+ <property name="jpa-api.jar" value="${basedir}/../jpa-api/build/ejb3-persistence.jar"/>
+
+ <import file="${common.dir}/common-build.xml"/>
+
+ <path id="lib.class.path">
+ <fileset dir="${hibernate-core.lib.dir}">
+ <include name="commons-logging*.jar"/>
+ <include name="log4j*.jar"/>
+ </fileset>
+ <fileset dir="${lib.dir}">
+ <include name="*.jar"/>
+ </fileset>
+ <path refid="lib.moduleclass.path"/>
+ <pathelement path="${clover.jar}"/>
+ </path>
+
+ <path id="junit.moduleclasspath">
+ <pathelement location="${src.dir}"/>
+ <pathelement location="${test.dir}"/>
+ <pathelement location="${jpa-api.jar}"/>
+ <fileset dir="${hibernate-core.lib.dir}">
+ <include name="junit*.jar"/>
+ </fileset>
+ </path>
+
+ <!-- target name="report">
+ <mkdir dir="test_output"/>
+ <junitreport todir="test_output">
+ <fileset dir="test_output">
+ <include name="TEST-*.xml"/>
+ </fileset>
+ <report format="frames" todir="test_output/report"/>
+ </junitreport>
+ </target -->
+
+ <target name="init" description="Initialize the build">
+ <!-- CCed from common-build to avoid failure when hibernate core is not compiled -->
+ <tstamp>
+ <format property="subversion" pattern="yyyy-MM-dd hh:mm:ss"/>
+ </tstamp>
+ <echo message="Build ${Name}-${version} (${subversion})"/>
+ <mkdir dir="${classes.dir}"/>
+ <mkdir dir="${testclasses.dir}"/>
+ <copy todir="${classes.dir}">
+ <fileset dir="${src.dir}">
+ <patternset refid="support.files"/>
+ </fileset>
+ </copy>
+
+ <copy todir="${build.dir}">
+ <fileset dir=".">
+ <include name="readme.txt"/>
+ <include name="lgpl.txt"/>
+ </fileset>
+ </copy>
+
+ <!-- check for dependency artefacts -->
+ <available file="${jpa-api.jar}" type="file" property="jpa-api.jar.available"/>
+ </target>
+
+ <target name="compiletest" depends="get.jpa-api,compile" description="Compile the tests">
+ <available
+ classname="org.eclipse.core.launcher.Main"
+ property="build.compiler"
+ value="org.eclipse.jdt.core.JDTCompilerAdapter"
+ classpath="${java.class.path}"/>
+ <javac
+ target="${javac.target}"
+ source="${javac.source}"
+ destdir="${testclasses.dir}"
+ classpathref="junit.classpath"
+ debug="${javac.debug}"
+ optimize="${javac.optimize}"
+ nowarn="on">
+ <src refid="testsrc.path"/>
+ </javac>
+ </target>
+
+ <target name="get.jpa-api" depends="init" unless="jpa-api.jar.available">
+ <ant inheritall="false" dir="${basedir}/../jpa-api" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../jpa-api" target="jar"/>
+ </target>
+
+ <target name="jar" depends="compile" description="Build the distribution .jar file">
+ <mkdir dir="${classes.dir}/META-INF"/>
+ <manifest file="${classes.dir}/META-INF/MANIFEST.MF">
+ <attribute name="Product" value="${Name}"/>
+ <attribute name="Version" value="${version}"/>
+ </manifest>
+ <antcall target="common-build.jar"/>
+ </target>
+
+ <!-- Some of this can probably be moved to common-build... -->
+ <target name="dist" depends="jar,javadoc,copysource,copytest,copylib,extras" description="Build everything">
+
+ <copy todir="${dist.dir}" failonerror="false">
+ <fileset dir="${common.dir}">
+ <include name="common-build.xml"/>
+ </fileset>
+ </copy>
+ <copy file="${basedir}/build.properties.dist" tofile="${dist.dir}/build.properties" failonerror="false">
+ </copy>
+ <antcall target="common-build.dist"/>
+ </target>
+
+ <target name="zip-dist" description="zip the dist">
+ <zip zipfile="${dist.dir}-${version}.zip">
+ <zipfileset prefix="${name}-${version}" dir="${dist.dir}"/>
+ </zip>
+ <tar compression="gzip" tarfile="${dist.dir}-${version}.tar.gz">
+ <tarfileset prefix="${name}-${version}" dir="${dist.dir}"/>
+ </tar>
+ </target>
+
+
+</project>
Deleted: trunk/HibernateExt/commons-annotations/changelog.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/changelog.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/changelog.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,7 +0,0 @@
-Hibernate Annotations Changelog
-===============================
-
-3.2.2.GA (xx-02-2007)
----------------------
-
-Initial release as a standalone product (see Hibernate Annotations changelog for previous informations)
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/changelog.txt (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/changelog.txt)
===================================================================
--- trunk/HibernateExt/commons-annotations/changelog.txt (rev 0)
+++ trunk/HibernateExt/commons-annotations/changelog.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,7 @@
+Hibernate Annotations Changelog
+===============================
+
+3.2.2.GA (xx-02-2007)
+---------------------
+
+Initial release as a standalone product (see Hibernate Annotations changelog for previous informations)
\ No newline at end of file
Deleted: trunk/HibernateExt/commons-annotations/lgpl.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/lgpl.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/lgpl.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
Copied: trunk/HibernateExt/commons-annotations/lgpl.txt (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/lgpl.txt)
===================================================================
--- trunk/HibernateExt/commons-annotations/lgpl.txt (rev 0)
+++ trunk/HibernateExt/commons-annotations/lgpl.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Copied: trunk/HibernateExt/commons-annotations/lib (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/lib)
Deleted: trunk/HibernateExt/commons-annotations/lib/README.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/lib/README.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/lib/README.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-Hibernate Commons Annotations dependencies
-==========================================
-
-Core
-====
-commons-logging.jar (see Hibernate Core version): required
-log4j.jar (see Hibernate Core version): optional
-
-Test
-====
-ejb3-persistence.jar (final release version): required
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/lib/README.txt (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/lib/README.txt)
===================================================================
--- trunk/HibernateExt/commons-annotations/lib/README.txt (rev 0)
+++ trunk/HibernateExt/commons-annotations/lib/README.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+Hibernate Commons Annotations dependencies
+==========================================
+
+Core
+====
+commons-logging.jar (see Hibernate Core version): required
+log4j.jar (see Hibernate Core version): optional
+
+Test
+====
+ejb3-persistence.jar (final release version): required
\ No newline at end of file
Deleted: trunk/HibernateExt/commons-annotations/readme.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/readme.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/readme.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-Hibernate Commons Annotations
-==================================================
-Version: 3.2.2.GA, xx.02.2007
-
-Description
------------
-
-Hibernate Commons Annotations is a utility project used by annotations based
-Hibernate sub-projects.
-It's first scope is to support Java Generics type discovery.
-It's second scope is to support Java Annotations overriding through XML files
-(mainly but not conceptually limited to)
-
-
-Instructions
-------------
-
-TODO: Do something here
-
-
-Contact
-------------
-
-Latest Documentation:
-
-This project has no documentation per se, because of it's internal use focus.
-Please ask questions to the technical support forum.
-
-Bug Reports:
-
- Hibernate JIRA (preferred)
- hibernate-devel at lists.sourceforge.net
-
-Free Technical Support:
-
- http://forum.hibernate.org (http://forum.hibernate.org/viewforum.php?f=9)
-
-
-Notes
------------
-
-If you want to contribute, go to http://www.hibernate.org/
-
-This software and its documentation are distributed under the terms of the
-FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/readme.txt (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/readme.txt)
===================================================================
--- trunk/HibernateExt/commons-annotations/readme.txt (rev 0)
+++ trunk/HibernateExt/commons-annotations/readme.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+Hibernate Commons Annotations
+==================================================
+Version: 3.2.2.GA, xx.02.2007
+
+Description
+-----------
+
+Hibernate Commons Annotations is a utility project used by annotations based
+Hibernate sub-projects.
+It's first scope is to support Java Generics type discovery.
+It's second scope is to support Java Annotations overriding through XML files
+(mainly but not conceptually limited to)
+
+
+Instructions
+------------
+
+TODO: Do something here
+
+
+Contact
+------------
+
+Latest Documentation:
+
+This project has no documentation per se, because of it's internal use focus.
+Please ask questions to the technical support forum.
+
+Bug Reports:
+
+ Hibernate JIRA (preferred)
+ hibernate-devel at lists.sourceforge.net
+
+Free Technical Support:
+
+ http://forum.hibernate.org (http://forum.hibernate.org/viewforum.php?f=9)
+
+
+Notes
+-----------
+
+If you want to contribute, go to http://www.hibernate.org/
+
+This software and its documentation are distributed under the terms of the
+FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src)
Copied: trunk/HibernateExt/commons-annotations/src/java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java)
Copied: trunk/HibernateExt/commons-annotations/src/java/org (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org)
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate)
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations)
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common)
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/AssertionFailure.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/AssertionFailure.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/AssertionFailure.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id: $
-package org.hibernate.annotations.common;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Indicates failure of an assertion: a possible bug in Hibernate.
- *
- * @author Gavin King
- * @auhor Emmanuel Bernard
- */
-//TODO Copy from Hibernate Core, do some mutualization here?
-public class AssertionFailure extends RuntimeException {
-
- private static final Log log = LogFactory.getLog(AssertionFailure.class);
-
- private static final String MESSAGE = "an assertion failure occured (this may indicate a bug in Hibernate)";
-
- public AssertionFailure(String s) {
- super(s);
- log.error(MESSAGE, this);
- }
-
- public AssertionFailure(String s, Throwable t) {
- super(s, t);
- log.error(MESSAGE, t);
- }
-
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/AssertionFailure.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/AssertionFailure.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/AssertionFailure.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/AssertionFailure.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id: $
+package org.hibernate.annotations.common;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Indicates failure of an assertion: a possible bug in Hibernate.
+ *
+ * @author Gavin King
+ * @auhor Emmanuel Bernard
+ */
+//TODO Copy from Hibernate Core, do some mutualization here?
+public class AssertionFailure extends RuntimeException {
+
+ private static final Log log = LogFactory.getLog(AssertionFailure.class);
+
+ private static final String MESSAGE = "an assertion failure occured (this may indicate a bug in Hibernate)";
+
+ public AssertionFailure(String s) {
+ super(s);
+ log.error(MESSAGE, this);
+ }
+
+ public AssertionFailure(String s, Throwable t) {
+ super(s, t);
+ log.error(MESSAGE, t);
+ }
+
+}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory)
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationDescriptor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationDescriptor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationDescriptor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-package org.hibernate.annotations.common.annotationfactory;
-
-import java.lang.annotation.Annotation;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Encapsulates the data you need to create an annotation. In
- * particular, it stores the type of an <code>Annotation</code> instance
- * and the values of its elements.
- * The "elements" we're talking about are the annotation attributes,
- * not its targets (the term "element" is used ambiguously
- * in Java's annotations documentation).
- *
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-public class AnnotationDescriptor {
-
- private final Class<? extends Annotation> type;
-
- private final Map<String, Object> elements = new HashMap<String, Object>();
-
- public AnnotationDescriptor(Class<? extends Annotation> annotationType) {
- type = annotationType;
- }
-
- public void setValue(String elementName, Object value) {
- elements.put( elementName, value );
- }
-
- public Object valueOf(String elementName) {
- return elements.get( elementName );
- }
-
- public boolean containsElement(String elementName) {
- return elements.containsKey( elementName );
- }
-
- public int numberOfElements() {
- return elements.size();
- }
-
- public Class<? extends Annotation> type() {
- return type;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationDescriptor.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationDescriptor.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationDescriptor.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationDescriptor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+package org.hibernate.annotations.common.annotationfactory;
+
+import java.lang.annotation.Annotation;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Encapsulates the data you need to create an annotation. In
+ * particular, it stores the type of an <code>Annotation</code> instance
+ * and the values of its elements.
+ * The "elements" we're talking about are the annotation attributes,
+ * not its targets (the term "element" is used ambiguously
+ * in Java's annotations documentation).
+ *
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+public class AnnotationDescriptor {
+
+ private final Class<? extends Annotation> type;
+
+ private final Map<String, Object> elements = new HashMap<String, Object>();
+
+ public AnnotationDescriptor(Class<? extends Annotation> annotationType) {
+ type = annotationType;
+ }
+
+ public void setValue(String elementName, Object value) {
+ elements.put( elementName, value );
+ }
+
+ public Object valueOf(String elementName) {
+ return elements.get( elementName );
+ }
+
+ public boolean containsElement(String elementName) {
+ return elements.containsKey( elementName );
+ }
+
+ public int numberOfElements() {
+ return elements.size();
+ }
+
+ public Class<? extends Annotation> type() {
+ return type;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-package org.hibernate.annotations.common.annotationfactory;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Proxy;
-
-/**
- * Creates live annotations (actually <code>AnnotationProxies</code>) from <code>AnnotationDescriptors</code>.
- *
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- * @see AnnotationProxy
- */
-public class AnnotationFactory {
-
- @SuppressWarnings("unchecked")
- public static <T extends Annotation> T create(AnnotationDescriptor descriptor) {
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- //TODO round 34ms to generate the proxy, hug! is Javassist Faster?
- //TODO prebuild the javax.persistence and org.hibernate.annotations classes?
- Class<T> proxyClass = (Class<T>) Proxy.getProxyClass( classLoader, descriptor.type() );
- InvocationHandler handler = new AnnotationProxy( descriptor );
- try {
- return getProxyInstance( proxyClass, handler );
- }
- catch (RuntimeException e) {
- throw e;
- }
- catch (Exception e) {
- throw new RuntimeException( e );
- }
- }
-
- private static <T extends Annotation> T getProxyInstance(Class<T> proxyClass, InvocationHandler handler) throws
- SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException,
- IllegalAccessException, InvocationTargetException {
- Constructor<T> constructor = proxyClass.getConstructor( new Class[]{InvocationHandler.class} );
- return constructor.newInstance( new Object[]{handler} );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationFactory.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationFactory.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+package org.hibernate.annotations.common.annotationfactory;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Proxy;
+
+/**
+ * Creates live annotations (actually <code>AnnotationProxies</code>) from <code>AnnotationDescriptors</code>.
+ *
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ * @see AnnotationProxy
+ */
+public class AnnotationFactory {
+
+ @SuppressWarnings("unchecked")
+ public static <T extends Annotation> T create(AnnotationDescriptor descriptor) {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ //TODO round 34ms to generate the proxy, hug! is Javassist Faster?
+ //TODO prebuild the javax.persistence and org.hibernate.annotations classes?
+ Class<T> proxyClass = (Class<T>) Proxy.getProxyClass( classLoader, descriptor.type() );
+ InvocationHandler handler = new AnnotationProxy( descriptor );
+ try {
+ return getProxyInstance( proxyClass, handler );
+ }
+ catch (RuntimeException e) {
+ throw e;
+ }
+ catch (Exception e) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ private static <T extends Annotation> T getProxyInstance(Class<T> proxyClass, InvocationHandler handler) throws
+ SecurityException, NoSuchMethodException, IllegalArgumentException, InstantiationException,
+ IllegalAccessException, InvocationTargetException {
+ Constructor<T> constructor = proxyClass.getConstructor( new Class[]{InvocationHandler.class} );
+ return constructor.newInstance( new Object[]{handler} );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationProxy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationProxy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationProxy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,111 +0,0 @@
-package org.hibernate.annotations.common.annotationfactory;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationHandler;
-import java.lang.reflect.Method;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeSet;
-
-/**
- * A concrete implementation of <code>Annotation</code> that pretends it is a
- * "real" source code annotation. It's also an <code>InvocationHandler</code>.
- * <p/>
- * When you create an <code>AnnotationProxy</code>, you must initialize it
- * with an <code>AnnotationDescriptor</code>.
- * The adapter checks that the provided elements are the same elements defined
- * in the annotation interface. However, it does <i>not</i> check that their
- * values are the right type. If you omit an element, the adapter will use the
- * default value for that element from the annotation interface, if it exists.
- * If no default exists, it will throw an exception.
- * <p/>
- * Warning: this class does not implement <code>hashCode()</code> and
- * <code>equals()</code> - it just uses the ones it inherits from <code>Object</code>.
- * This means that an <code>AnnotationProxy</code> does <i>not</i> follow the
- * recommendations of the <code>Annotation</code> javadoc about these two
- * methods. That's why you should never mix <code>AnnotationProxies</code>
- * with "real" annotations. For example, don't put them into the same
- * <code>Collection</code>.
- *
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- * @see java.lang.annotation.Annotation
- */
-public class AnnotationProxy implements Annotation, InvocationHandler {
-
- private final Class<? extends Annotation> annotationType;
- //FIXME it's probably better to use String as a key rather than Method
- // to speed up and avoid any fancy permsize/GC issue
- // I'd better check the litterature on the subject
- private final Map<Method, Object> values;
-
- public AnnotationProxy(AnnotationDescriptor descriptor) {
- this.annotationType = descriptor.type();
- values = getAnnotationValues( descriptor );
- }
-
- private Map<Method, Object> getAnnotationValues(AnnotationDescriptor descriptor) {
- Map<Method, Object> result = new HashMap<Method, Object>();
- int processedValuesFromDescriptor = 0;
- for ( Method m : annotationType.getDeclaredMethods() ) {
- if ( descriptor.containsElement( m.getName() ) ) {
- result.put( m, descriptor.valueOf( m.getName() ) );
- processedValuesFromDescriptor++;
- }
- else if ( m.getDefaultValue() != null ) {
- result.put( m, m.getDefaultValue() );
- }
- else {
- throw new IllegalArgumentException( "No value provided for " + m.getName() );
- }
- }
- if ( processedValuesFromDescriptor != descriptor.numberOfElements() ) {
- throw new RuntimeException( "Trying to instanciate " + annotationType + " with unknown elements" );
- }
- return result;
- }
-
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- if ( values.containsKey( method ) ) {
- return values.get( method );
- }
- return method.invoke( this, args );
- }
-
- public Class<? extends Annotation> annotationType() {
- return annotationType;
- }
-
- public String toString() {
- StringBuilder result = new StringBuilder();
- result.append( '@' ).append( annotationType().getName() ).append( '(' );
- for ( Method m : getRegisteredMethodsInAlphabeticalOrder() ) {
- result.append( m.getName() ).append( '=' ).append( values.get( m ) ).append( ", " );
- }
- // remove last separator:
- if ( values.size() > 0 ) {
- result.delete( result.length() - 2, result.length() );
- result.append( ")" );
- }
- else {
- result.delete( result.length() - 1, result.length() );
- }
-
- return result.toString();
- }
-
- private SortedSet<Method> getRegisteredMethodsInAlphabeticalOrder() {
- SortedSet<Method> result = new TreeSet<Method>(
- new Comparator<Method>() {
- public int compare(Method o1, Method o2) {
- return o1.getName().compareTo( o2.getName() );
- }
- }
- );
- //List<Method> result = new LinkedList<Method>();
- result.addAll( values.keySet() );
- return result;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationProxy.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationProxy.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationProxy.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/annotationfactory/AnnotationProxy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,111 @@
+package org.hibernate.annotations.common.annotationfactory;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.SortedSet;
+import java.util.TreeSet;
+
+/**
+ * A concrete implementation of <code>Annotation</code> that pretends it is a
+ * "real" source code annotation. It's also an <code>InvocationHandler</code>.
+ * <p/>
+ * When you create an <code>AnnotationProxy</code>, you must initialize it
+ * with an <code>AnnotationDescriptor</code>.
+ * The adapter checks that the provided elements are the same elements defined
+ * in the annotation interface. However, it does <i>not</i> check that their
+ * values are the right type. If you omit an element, the adapter will use the
+ * default value for that element from the annotation interface, if it exists.
+ * If no default exists, it will throw an exception.
+ * <p/>
+ * Warning: this class does not implement <code>hashCode()</code> and
+ * <code>equals()</code> - it just uses the ones it inherits from <code>Object</code>.
+ * This means that an <code>AnnotationProxy</code> does <i>not</i> follow the
+ * recommendations of the <code>Annotation</code> javadoc about these two
+ * methods. That's why you should never mix <code>AnnotationProxies</code>
+ * with "real" annotations. For example, don't put them into the same
+ * <code>Collection</code>.
+ *
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ * @see java.lang.annotation.Annotation
+ */
+public class AnnotationProxy implements Annotation, InvocationHandler {
+
+ private final Class<? extends Annotation> annotationType;
+ //FIXME it's probably better to use String as a key rather than Method
+ // to speed up and avoid any fancy permsize/GC issue
+ // I'd better check the litterature on the subject
+ private final Map<Method, Object> values;
+
+ public AnnotationProxy(AnnotationDescriptor descriptor) {
+ this.annotationType = descriptor.type();
+ values = getAnnotationValues( descriptor );
+ }
+
+ private Map<Method, Object> getAnnotationValues(AnnotationDescriptor descriptor) {
+ Map<Method, Object> result = new HashMap<Method, Object>();
+ int processedValuesFromDescriptor = 0;
+ for ( Method m : annotationType.getDeclaredMethods() ) {
+ if ( descriptor.containsElement( m.getName() ) ) {
+ result.put( m, descriptor.valueOf( m.getName() ) );
+ processedValuesFromDescriptor++;
+ }
+ else if ( m.getDefaultValue() != null ) {
+ result.put( m, m.getDefaultValue() );
+ }
+ else {
+ throw new IllegalArgumentException( "No value provided for " + m.getName() );
+ }
+ }
+ if ( processedValuesFromDescriptor != descriptor.numberOfElements() ) {
+ throw new RuntimeException( "Trying to instanciate " + annotationType + " with unknown elements" );
+ }
+ return result;
+ }
+
+ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+ if ( values.containsKey( method ) ) {
+ return values.get( method );
+ }
+ return method.invoke( this, args );
+ }
+
+ public Class<? extends Annotation> annotationType() {
+ return annotationType;
+ }
+
+ public String toString() {
+ StringBuilder result = new StringBuilder();
+ result.append( '@' ).append( annotationType().getName() ).append( '(' );
+ for ( Method m : getRegisteredMethodsInAlphabeticalOrder() ) {
+ result.append( m.getName() ).append( '=' ).append( values.get( m ) ).append( ", " );
+ }
+ // remove last separator:
+ if ( values.size() > 0 ) {
+ result.delete( result.length() - 2, result.length() );
+ result.append( ")" );
+ }
+ else {
+ result.delete( result.length() - 1, result.length() );
+ }
+
+ return result.toString();
+ }
+
+ private SortedSet<Method> getRegisteredMethodsInAlphabeticalOrder() {
+ SortedSet<Method> result = new TreeSet<Method>(
+ new Comparator<Method>() {
+ public int compare(Method o1, Method o2) {
+ return o1.getName().compareTo( o2.getName() );
+ }
+ }
+ );
+ //List<Method> result = new LinkedList<Method>();
+ result.addAll( values.keySet() );
+ return result;
+ }
+}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection)
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/AnnotationReader.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/AnnotationReader.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/AnnotationReader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-package org.hibernate.annotations.common.reflection;
-
-import java.lang.annotation.Annotation;
-
-/**
- * @author Paolo Perrotta
- */
-public interface AnnotationReader {
-
- public <T extends Annotation> T getAnnotation(Class<T> annotationType);
-
- public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType);
-
- public Annotation[] getAnnotations();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/AnnotationReader.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/AnnotationReader.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/AnnotationReader.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/AnnotationReader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+package org.hibernate.annotations.common.reflection;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * @author Paolo Perrotta
+ */
+public interface AnnotationReader {
+
+ public <T extends Annotation> T getAnnotation(Class<T> annotationType);
+
+ public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType);
+
+ public Annotation[] getAnnotations();
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/Filter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/Filter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/Filter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id$
-package org.hibernate.annotations.common.reflection;
-
-/**
- * Filter properties
- *
- * @author Emmanuel Bernard
- */
-public interface Filter {
- boolean returnStatic();
-
- boolean returnTransient();
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/Filter.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/Filter.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/Filter.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/Filter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id$
+package org.hibernate.annotations.common.reflection;
+
+/**
+ * Filter properties
+ *
+ * @author Emmanuel Bernard
+ */
+public interface Filter {
+ boolean returnStatic();
+
+ boolean returnTransient();
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionManager.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionManager.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionManager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-package org.hibernate.annotations.common.reflection;
-
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Method;
-import java.util.Map;
-
-/**
- * The entry point to the reflection layer (a.k.a. the X* layer).
- *
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-public interface ReflectionManager {
-
- public <T> XClass toXClass(Class<T> clazz);
-
- public Class toClass(XClass xClazz);
-
- public Method toMethod(XMethod method);
-
- public <T> XClass classForName(String name, Class<T> caller) throws ClassNotFoundException;
-
- public XPackage packageForName(String packageName) throws ClassNotFoundException;
-
- public <T> boolean equals(XClass class1, Class<T> class2);
-
- public AnnotationReader buildAnnotationReader(AnnotatedElement annotatedElement);
-
- public Map getDefaults();
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionManager.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionManager.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionManager.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionManager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+package org.hibernate.annotations.common.reflection;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Method;
+import java.util.Map;
+
+/**
+ * The entry point to the reflection layer (a.k.a. the X* layer).
+ *
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+public interface ReflectionManager {
+
+ public <T> XClass toXClass(Class<T> clazz);
+
+ public Class toClass(XClass xClazz);
+
+ public Method toMethod(XMethod method);
+
+ public <T> XClass classForName(String name, Class<T> caller) throws ClassNotFoundException;
+
+ public XPackage packageForName(String packageName) throws ClassNotFoundException;
+
+ public <T> boolean equals(XClass class1, Class<T> class2);
+
+ public AnnotationReader buildAnnotationReader(AnnotatedElement annotatedElement);
+
+ public Map getDefaults();
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionUtil.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionUtil.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionUtil.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-package org.hibernate.annotations.common.reflection;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-
-import org.hibernate.annotations.common.reflection.java.generics.TypeUtils;
-
-/**
- * @author Paolo Perrotta
- */
-public class ReflectionUtil {
-
- public static boolean isProperty(Method m, Type boundType, Filter filter) {
- return ReflectionUtil.isPropertyType( boundType )
- && !m.isSynthetic()
- && !m.isBridge()
- && ( filter.returnStatic() || !Modifier.isStatic( m.getModifiers() ) )
- && m.getParameterTypes().length == 0
- && ( m.getName().startsWith( "get" ) || m.getName().startsWith( "is" ) );
- // TODO should we use stronger checking on the naming of getters/setters, or just leave this to the validator?
- }
-
- public static boolean isProperty(Field f, Type boundType, Filter filter) {
- return ( filter.returnStatic() || ! Modifier.isStatic( f.getModifiers() ) )
- && ( filter.returnTransient() || ! Modifier.isTransient( f.getModifiers() ) )
- && !f.isSynthetic()
- && ReflectionUtil.isPropertyType( boundType );
- }
-
- private static boolean isPropertyType(Type type) {
- // return TypeUtils.isArray( type ) || TypeUtils.isCollection( type ) || ( TypeUtils.isBase( type ) && ! TypeUtils.isVoid( type ) );
- return !TypeUtils.isVoid( type );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionUtil.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionUtil.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionUtil.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/ReflectionUtil.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+package org.hibernate.annotations.common.reflection;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.lang.reflect.Type;
+
+import org.hibernate.annotations.common.reflection.java.generics.TypeUtils;
+
+/**
+ * @author Paolo Perrotta
+ */
+public class ReflectionUtil {
+
+ public static boolean isProperty(Method m, Type boundType, Filter filter) {
+ return ReflectionUtil.isPropertyType( boundType )
+ && !m.isSynthetic()
+ && !m.isBridge()
+ && ( filter.returnStatic() || !Modifier.isStatic( m.getModifiers() ) )
+ && m.getParameterTypes().length == 0
+ && ( m.getName().startsWith( "get" ) || m.getName().startsWith( "is" ) );
+ // TODO should we use stronger checking on the naming of getters/setters, or just leave this to the validator?
+ }
+
+ public static boolean isProperty(Field f, Type boundType, Filter filter) {
+ return ( filter.returnStatic() || ! Modifier.isStatic( f.getModifiers() ) )
+ && ( filter.returnTransient() || ! Modifier.isTransient( f.getModifiers() ) )
+ && !f.isSynthetic()
+ && ReflectionUtil.isPropertyType( boundType );
+ }
+
+ private static boolean isPropertyType(Type type) {
+ // return TypeUtils.isArray( type ) || TypeUtils.isCollection( type ) || ( TypeUtils.isBase( type ) && ! TypeUtils.isVoid( type ) );
+ return !TypeUtils.isVoid( type );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XAnnotatedElement.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XAnnotatedElement.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XAnnotatedElement.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-package org.hibernate.annotations.common.reflection;
-
-import java.lang.annotation.Annotation;
-
-/**
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-public interface XAnnotatedElement {
-
- <T extends Annotation> T getAnnotation(Class<T> annotationType);
-
- <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType);
-
- Annotation[] getAnnotations();
-
- /**
- * Returns true if the underlying artefact
- * is the same
- */
- boolean equals(Object x);
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XAnnotatedElement.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XAnnotatedElement.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XAnnotatedElement.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XAnnotatedElement.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+package org.hibernate.annotations.common.reflection;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+public interface XAnnotatedElement {
+
+ <T extends Annotation> T getAnnotation(Class<T> annotationType);
+
+ <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType);
+
+ Annotation[] getAnnotations();
+
+ /**
+ * Returns true if the underlying artefact
+ * is the same
+ */
+ boolean equals(Object x);
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XClass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XClass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XClass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-package org.hibernate.annotations.common.reflection;
-
-import java.util.List;
-
-/**
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-public interface XClass extends XAnnotatedElement {
-
- public static final String ACCESS_PROPERTY = "property";
- public static final String ACCESS_FIELD = "field";
-
- static final Filter DEFAULT_FILTER = new Filter() {
-
- public boolean returnStatic() {
- return false;
- }
-
- public boolean returnTransient() {
- return false;
- }
- };
-
- String getName();
-
- /**
- * @see Class#getSuperclass()
- */
- XClass getSuperclass();
-
- /**
- * @see Class#getInterfaces()
- */
- XClass[] getInterfaces();
-
- /**
- * see Class#isInterface()
- */
- boolean isInterface();
-
- boolean isAbstract();
-
- boolean isPrimitive();
-
- boolean isEnum();
-
- boolean isAssignableFrom(XClass c);
-
- List<XProperty> getDeclaredProperties(String accessType);
-
- List<XProperty> getDeclaredProperties(String accessType, Filter filter);
-
- /**
- * Returns the <tt>Method</tt>s defined by this class.
- */
- List<XMethod> getDeclaredMethods();
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XClass.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XClass.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XClass.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XClass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+package org.hibernate.annotations.common.reflection;
+
+import java.util.List;
+
+/**
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+public interface XClass extends XAnnotatedElement {
+
+ public static final String ACCESS_PROPERTY = "property";
+ public static final String ACCESS_FIELD = "field";
+
+ static final Filter DEFAULT_FILTER = new Filter() {
+
+ public boolean returnStatic() {
+ return false;
+ }
+
+ public boolean returnTransient() {
+ return false;
+ }
+ };
+
+ String getName();
+
+ /**
+ * @see Class#getSuperclass()
+ */
+ XClass getSuperclass();
+
+ /**
+ * @see Class#getInterfaces()
+ */
+ XClass[] getInterfaces();
+
+ /**
+ * see Class#isInterface()
+ */
+ boolean isInterface();
+
+ boolean isAbstract();
+
+ boolean isPrimitive();
+
+ boolean isEnum();
+
+ boolean isAssignableFrom(XClass c);
+
+ List<XProperty> getDeclaredProperties(String accessType);
+
+ List<XProperty> getDeclaredProperties(String accessType, Filter filter);
+
+ /**
+ * Returns the <tt>Method</tt>s defined by this class.
+ */
+ List<XMethod> getDeclaredMethods();
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMember.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMember.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMember.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-//$Id$
-package org.hibernate.annotations.common.reflection;
-
-import java.util.Collection;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract interface XMember extends XAnnotatedElement {
-
- String getName();
-
- boolean isCollection();
-
- boolean isArray();
-
- /**
- * The collection class for collections, null for others.
- */
- Class<? extends Collection> getCollectionClass();
-
- // TODO We should probably try to reduce the following three methods to two.
- // the last one is particularly offensive
-
- /**
- * This property's XClass.
- */
- XClass getType();
-
- /**
- * This property's type for simple properties, the type of its elements for arrays and collections.
- */
- XClass getElementClass();
-
- /**
- * The type of this property's elements for arrays, the type of the property itself for everything else.
- */
- XClass getClassOrElementClass();
-
- /**
- * The type of this map's key, or null for anything that is not a map.
- */
- XClass getMapKey();
-
- /**
- * Same modifiers as java.lang.Member#getModifiers()
- */
- int getModifiers();
-
- //this breaks the Java reflect hierarchy, since accessible belongs to AccessibleObject
- void setAccessible(boolean accessible);
-
- public Object invoke(Object target, Object... parameters);
-
- boolean isTypeResolved();
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMember.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMember.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMember.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMember.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+//$Id$
+package org.hibernate.annotations.common.reflection;
+
+import java.util.Collection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract interface XMember extends XAnnotatedElement {
+
+ String getName();
+
+ boolean isCollection();
+
+ boolean isArray();
+
+ /**
+ * The collection class for collections, null for others.
+ */
+ Class<? extends Collection> getCollectionClass();
+
+ // TODO We should probably try to reduce the following three methods to two.
+ // the last one is particularly offensive
+
+ /**
+ * This property's XClass.
+ */
+ XClass getType();
+
+ /**
+ * This property's type for simple properties, the type of its elements for arrays and collections.
+ */
+ XClass getElementClass();
+
+ /**
+ * The type of this property's elements for arrays, the type of the property itself for everything else.
+ */
+ XClass getClassOrElementClass();
+
+ /**
+ * The type of this map's key, or null for anything that is not a map.
+ */
+ XClass getMapKey();
+
+ /**
+ * Same modifiers as java.lang.Member#getModifiers()
+ */
+ int getModifiers();
+
+ //this breaks the Java reflect hierarchy, since accessible belongs to AccessibleObject
+ void setAccessible(boolean accessible);
+
+ public Object invoke(Object target, Object... parameters);
+
+ boolean isTypeResolved();
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMethod.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMethod.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMethod.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id$
-package org.hibernate.annotations.common.reflection;
-
-/**
- * Represent an invokable method
- * <p/>
- * The underlying layer does not guaranty that xProperty == xMethod
- * if the underlying artefact is the same
- * However xProperty.equals(xMethod) is supposed to return true
- *
- * @author Emmanuel Bernard
- */
-public interface XMethod extends XMember {
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMethod.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMethod.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMethod.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XMethod.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id$
+package org.hibernate.annotations.common.reflection;
+
+/**
+ * Represent an invokable method
+ * <p/>
+ * The underlying layer does not guaranty that xProperty == xMethod
+ * if the underlying artefact is the same
+ * However xProperty.equals(xMethod) is supposed to return true
+ *
+ * @author Emmanuel Bernard
+ */
+public interface XMethod extends XMember {
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XPackage.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XPackage.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XPackage.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-package org.hibernate.annotations.common.reflection;
-
-/**
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-public interface XPackage extends XAnnotatedElement {
-
- String getName();
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XPackage.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XPackage.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XPackage.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XPackage.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+package org.hibernate.annotations.common.reflection;
+
+/**
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+public interface XPackage extends XAnnotatedElement {
+
+ String getName();
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XProperty.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XProperty.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XProperty.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-package org.hibernate.annotations.common.reflection;
-
-/**
- * A member which actually is a property (as per the JavaBean spec)
- * Note that the same underlying artefact can be represented as both
- * XProperty and XMethod
- * The underlying layer does not guaranty that xProperty == xMethod
- * if the underlying artefact is the same
- * However xProperty.equals(xMethod) is supposed to return true
- *
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- * @author Emmanuel Bernard
- */
-public interface XProperty extends XMember {
-
- /**
- * Unqualify the getter name
- */
- String getName();
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XProperty.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XProperty.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XProperty.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/XProperty.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+package org.hibernate.annotations.common.reflection;
+
+/**
+ * A member which actually is a property (as per the JavaBean spec)
+ * Note that the same underlying artefact can be represented as both
+ * XProperty and XMethod
+ * The underlying layer does not guaranty that xProperty == xMethod
+ * if the underlying artefact is the same
+ * However xProperty.equals(xMethod) is supposed to return true
+ *
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ * @author Emmanuel Bernard
+ */
+public interface XProperty extends XMember {
+
+ /**
+ * Unqualify the getter name
+ */
+ String getName();
+}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java)
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaAnnotationReader.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaAnnotationReader.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaAnnotationReader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-package org.hibernate.annotations.common.reflection.java;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AnnotatedElement;
-
-import org.hibernate.annotations.common.reflection.AnnotationReader;
-
-/**
- * Reads standard Java annotations.
- *
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-class JavaAnnotationReader implements AnnotationReader {
-
- protected final AnnotatedElement element;
-
- public JavaAnnotationReader(AnnotatedElement el) {
- this.element = el;
- }
-
- public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
- return element.getAnnotation( annotationType );
- }
-
- public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) {
- return element.isAnnotationPresent( annotationType );
- }
-
- public Annotation[] getAnnotations() {
- return element.getAnnotations();
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaAnnotationReader.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaAnnotationReader.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaAnnotationReader.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaAnnotationReader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+package org.hibernate.annotations.common.reflection.java;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+
+import org.hibernate.annotations.common.reflection.AnnotationReader;
+
+/**
+ * Reads standard Java annotations.
+ *
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+class JavaAnnotationReader implements AnnotationReader {
+
+ protected final AnnotatedElement element;
+
+ public JavaAnnotationReader(AnnotatedElement el) {
+ this.element = el;
+ }
+
+ public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
+ return element.getAnnotation( annotationType );
+ }
+
+ public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) {
+ return element.isAnnotationPresent( annotationType );
+ }
+
+ public Annotation[] getAnnotations() {
+ return element.getAnnotations();
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaReflectionManager.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaReflectionManager.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaReflectionManager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,185 +0,0 @@
-package org.hibernate.annotations.common.reflection.java;
-
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.hibernate.annotations.common.reflection.AnnotationReader;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XMethod;
-import org.hibernate.annotations.common.reflection.XPackage;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.annotations.common.reflection.java.generics.IdentityTypeEnvironment;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironmentFactory;
-import org.hibernate.annotations.common.reflection.java.generics.TypeSwitch;
-import org.hibernate.annotations.common.reflection.java.generics.TypeUtils;
-import org.hibernate.annotations.common.util.ReflectHelper;
-
-/**
- * The factory for all the objects in this package.
- *
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- * @author Emmanuel Bernard
- */
-public class JavaReflectionManager implements ReflectionManager {
-
- private static class TypeKey extends Pair<Type, TypeEnvironment> {
- TypeKey(Type t, TypeEnvironment context) {
- super( t, context );
- }
- }
-
- private static class MemberKey extends Pair<Member, TypeEnvironment> {
- MemberKey(Member member, TypeEnvironment context) {
- super( member, context );
- }
- }
-
- private final Map<TypeKey, JavaXClass> xClasses = new HashMap<TypeKey, JavaXClass>();
-
- private final Map<Package, JavaXPackage> packagesToXPackages = new HashMap<Package, JavaXPackage>();
-
- private final Map<MemberKey, JavaXProperty> xProperties = new HashMap<MemberKey, JavaXProperty>();
-
- private final Map<MemberKey, JavaXMethod> xMethods = new HashMap<MemberKey, JavaXMethod>();
-
- private final TypeEnvironmentFactory typeEnvs = new TypeEnvironmentFactory();
-
- public XClass toXClass(Class clazz) {
- return toXClass( clazz, IdentityTypeEnvironment.INSTANCE );
- }
-
- public Class toClass(XClass xClazz) {
- if ( ! ( xClazz instanceof JavaXClass ) ) {
- throw new IllegalArgumentException( "XClass not coming from this ReflectionManager implementation" );
- }
- return (Class) ( (JavaXClass) xClazz ).toAnnotatedElement();
- }
-
- public Method toMethod(XMethod xMethod) {
- if ( ! ( xMethod instanceof JavaXMethod ) ) {
- throw new IllegalArgumentException( "XMethod not coming from this ReflectionManager implementation" );
- }
- return (Method) ( (JavaXAnnotatedElement) xMethod ).toAnnotatedElement();
- }
-
- public XClass classForName(String name, Class caller) throws ClassNotFoundException {
- return toXClass( ReflectHelper.classForName( name, caller ) );
- }
-
- public XPackage packageForName(String packageName) throws ClassNotFoundException {
- return getXAnnotatedElement( ReflectHelper.classForName( packageName + ".package-info" ).getPackage() );
- }
-
- XClass toXClass(Type t, final TypeEnvironment context) {
- return new TypeSwitch<XClass>() {
- @Override
- public XClass caseClass(Class classType) {
- TypeKey key = new TypeKey( classType, context );
- JavaXClass result = xClasses.get( key );
- if ( result == null ) {
- result = new JavaXClass( classType, context, JavaReflectionManager.this );
- xClasses.put( key, result );
- }
- return result;
- }
-
- @Override
- public XClass caseParameterizedType(ParameterizedType parameterizedType) {
- return toXClass( parameterizedType.getRawType(),
- typeEnvs.getEnvironment( parameterizedType, context )
- );
- }
- }.doSwitch( context.bind( t ) );
- }
-
- XPackage getXAnnotatedElement(Package pkg) {
- JavaXPackage xPackage = packagesToXPackages.get( pkg );
- if ( xPackage == null ) {
- xPackage = new JavaXPackage( pkg, this );
- packagesToXPackages.put( pkg, xPackage );
- }
- return xPackage;
- }
-
- XProperty getXProperty(Member member, TypeEnvironment context) {
- MemberKey key = new MemberKey( member, context );
- //FIXME get is as expensive as create most time spent in hashCode and equals
- JavaXProperty xProperty = xProperties.get( key );
- if ( xProperty == null ) {
- xProperty = JavaXProperty.create( member, context, this );
- xProperties.put( key, xProperty );
- }
- return xProperty;
- }
-
- XMethod getXMethod(Member member, TypeEnvironment context) {
- MemberKey key = new MemberKey( member, context );
- //FIXME get is as expensive as create most time spent in hashCode and equals
- JavaXMethod xMethod = xMethods.get( key );
- if ( xMethod == null ) {
- xMethod = JavaXMethod.create( member, context, this );
- xMethods.put( key, xMethod );
- }
- return xMethod;
- }
-
- TypeEnvironment getTypeEnvironment(final Type t) {
- return new TypeSwitch<TypeEnvironment>() {
- @Override
- public TypeEnvironment caseClass(Class classType) {
- return typeEnvs.getEnvironment( classType );
- }
-
- @Override
- public TypeEnvironment caseParameterizedType(ParameterizedType parameterizedType) {
- return typeEnvs.getEnvironment( parameterizedType );
- }
-
- @Override
- public TypeEnvironment defaultCase(Type type) {
- return IdentityTypeEnvironment.INSTANCE;
- }
- }.doSwitch( t );
- }
-
- public JavaXType toXType(TypeEnvironment context, Type propType) {
- Type boundType = toApproximatingEnvironment( context ).bind( propType );
- if ( TypeUtils.isArray( boundType ) ) {
- return new JavaXArrayType( propType, context, this );
- }
- if ( TypeUtils.isCollection( boundType ) ) {
- return new JavaXCollectionType( propType, context, this );
- }
- if ( TypeUtils.isSimple( boundType ) ) {
- return new JavaXSimpleType( propType, context, this );
- }
- throw new IllegalArgumentException( "No PropertyTypeExtractor available for type void " );
- }
-
- public boolean equals(XClass class1, Class class2) {
- if ( class1 == null ) {
- return class2 == null;
- }
- return ( (JavaXClass) class1 ).toClass().equals( class2 );
- }
-
- public TypeEnvironment toApproximatingEnvironment(TypeEnvironment context) {
- return typeEnvs.toApproximatingEnvironment( context );
- }
-
- public AnnotationReader buildAnnotationReader(AnnotatedElement annotatedElement) {
- return new JavaAnnotationReader(annotatedElement);
- }
-
- public Map getDefaults() {
- return new HashMap();
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaReflectionManager.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaReflectionManager.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaReflectionManager.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaReflectionManager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,185 @@
+package org.hibernate.annotations.common.reflection.java;
+
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.hibernate.annotations.common.reflection.AnnotationReader;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XMethod;
+import org.hibernate.annotations.common.reflection.XPackage;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.annotations.common.reflection.java.generics.IdentityTypeEnvironment;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironmentFactory;
+import org.hibernate.annotations.common.reflection.java.generics.TypeSwitch;
+import org.hibernate.annotations.common.reflection.java.generics.TypeUtils;
+import org.hibernate.annotations.common.util.ReflectHelper;
+
+/**
+ * The factory for all the objects in this package.
+ *
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ * @author Emmanuel Bernard
+ */
+public class JavaReflectionManager implements ReflectionManager {
+
+ private static class TypeKey extends Pair<Type, TypeEnvironment> {
+ TypeKey(Type t, TypeEnvironment context) {
+ super( t, context );
+ }
+ }
+
+ private static class MemberKey extends Pair<Member, TypeEnvironment> {
+ MemberKey(Member member, TypeEnvironment context) {
+ super( member, context );
+ }
+ }
+
+ private final Map<TypeKey, JavaXClass> xClasses = new HashMap<TypeKey, JavaXClass>();
+
+ private final Map<Package, JavaXPackage> packagesToXPackages = new HashMap<Package, JavaXPackage>();
+
+ private final Map<MemberKey, JavaXProperty> xProperties = new HashMap<MemberKey, JavaXProperty>();
+
+ private final Map<MemberKey, JavaXMethod> xMethods = new HashMap<MemberKey, JavaXMethod>();
+
+ private final TypeEnvironmentFactory typeEnvs = new TypeEnvironmentFactory();
+
+ public XClass toXClass(Class clazz) {
+ return toXClass( clazz, IdentityTypeEnvironment.INSTANCE );
+ }
+
+ public Class toClass(XClass xClazz) {
+ if ( ! ( xClazz instanceof JavaXClass ) ) {
+ throw new IllegalArgumentException( "XClass not coming from this ReflectionManager implementation" );
+ }
+ return (Class) ( (JavaXClass) xClazz ).toAnnotatedElement();
+ }
+
+ public Method toMethod(XMethod xMethod) {
+ if ( ! ( xMethod instanceof JavaXMethod ) ) {
+ throw new IllegalArgumentException( "XMethod not coming from this ReflectionManager implementation" );
+ }
+ return (Method) ( (JavaXAnnotatedElement) xMethod ).toAnnotatedElement();
+ }
+
+ public XClass classForName(String name, Class caller) throws ClassNotFoundException {
+ return toXClass( ReflectHelper.classForName( name, caller ) );
+ }
+
+ public XPackage packageForName(String packageName) throws ClassNotFoundException {
+ return getXAnnotatedElement( ReflectHelper.classForName( packageName + ".package-info" ).getPackage() );
+ }
+
+ XClass toXClass(Type t, final TypeEnvironment context) {
+ return new TypeSwitch<XClass>() {
+ @Override
+ public XClass caseClass(Class classType) {
+ TypeKey key = new TypeKey( classType, context );
+ JavaXClass result = xClasses.get( key );
+ if ( result == null ) {
+ result = new JavaXClass( classType, context, JavaReflectionManager.this );
+ xClasses.put( key, result );
+ }
+ return result;
+ }
+
+ @Override
+ public XClass caseParameterizedType(ParameterizedType parameterizedType) {
+ return toXClass( parameterizedType.getRawType(),
+ typeEnvs.getEnvironment( parameterizedType, context )
+ );
+ }
+ }.doSwitch( context.bind( t ) );
+ }
+
+ XPackage getXAnnotatedElement(Package pkg) {
+ JavaXPackage xPackage = packagesToXPackages.get( pkg );
+ if ( xPackage == null ) {
+ xPackage = new JavaXPackage( pkg, this );
+ packagesToXPackages.put( pkg, xPackage );
+ }
+ return xPackage;
+ }
+
+ XProperty getXProperty(Member member, TypeEnvironment context) {
+ MemberKey key = new MemberKey( member, context );
+ //FIXME get is as expensive as create most time spent in hashCode and equals
+ JavaXProperty xProperty = xProperties.get( key );
+ if ( xProperty == null ) {
+ xProperty = JavaXProperty.create( member, context, this );
+ xProperties.put( key, xProperty );
+ }
+ return xProperty;
+ }
+
+ XMethod getXMethod(Member member, TypeEnvironment context) {
+ MemberKey key = new MemberKey( member, context );
+ //FIXME get is as expensive as create most time spent in hashCode and equals
+ JavaXMethod xMethod = xMethods.get( key );
+ if ( xMethod == null ) {
+ xMethod = JavaXMethod.create( member, context, this );
+ xMethods.put( key, xMethod );
+ }
+ return xMethod;
+ }
+
+ TypeEnvironment getTypeEnvironment(final Type t) {
+ return new TypeSwitch<TypeEnvironment>() {
+ @Override
+ public TypeEnvironment caseClass(Class classType) {
+ return typeEnvs.getEnvironment( classType );
+ }
+
+ @Override
+ public TypeEnvironment caseParameterizedType(ParameterizedType parameterizedType) {
+ return typeEnvs.getEnvironment( parameterizedType );
+ }
+
+ @Override
+ public TypeEnvironment defaultCase(Type type) {
+ return IdentityTypeEnvironment.INSTANCE;
+ }
+ }.doSwitch( t );
+ }
+
+ public JavaXType toXType(TypeEnvironment context, Type propType) {
+ Type boundType = toApproximatingEnvironment( context ).bind( propType );
+ if ( TypeUtils.isArray( boundType ) ) {
+ return new JavaXArrayType( propType, context, this );
+ }
+ if ( TypeUtils.isCollection( boundType ) ) {
+ return new JavaXCollectionType( propType, context, this );
+ }
+ if ( TypeUtils.isSimple( boundType ) ) {
+ return new JavaXSimpleType( propType, context, this );
+ }
+ throw new IllegalArgumentException( "No PropertyTypeExtractor available for type void " );
+ }
+
+ public boolean equals(XClass class1, Class class2) {
+ if ( class1 == null ) {
+ return class2 == null;
+ }
+ return ( (JavaXClass) class1 ).toClass().equals( class2 );
+ }
+
+ public TypeEnvironment toApproximatingEnvironment(TypeEnvironment context) {
+ return typeEnvs.toApproximatingEnvironment( context );
+ }
+
+ public AnnotationReader buildAnnotationReader(AnnotatedElement annotatedElement) {
+ return new JavaAnnotationReader(annotatedElement);
+ }
+
+ public Map getDefaults() {
+ return new HashMap();
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXAnnotatedElement.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXAnnotatedElement.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXAnnotatedElement.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,71 +0,0 @@
-package org.hibernate.annotations.common.reflection.java;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.AnnotatedElement;
-
-import org.hibernate.annotations.common.reflection.AnnotationReader;
-import org.hibernate.annotations.common.reflection.XAnnotatedElement;
-
-/**
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-abstract class JavaXAnnotatedElement implements XAnnotatedElement {
-
- // responsible for extracting annotations
- private AnnotationReader annotationReader;
-
- private final JavaReflectionManager factory;
-
- private final AnnotatedElement annotatedElement;
-
- public JavaXAnnotatedElement(AnnotatedElement annotatedElement, JavaReflectionManager factory) {
- this.factory = factory;
- this.annotatedElement = annotatedElement;
- }
-
- protected JavaReflectionManager getFactory() {
- return factory;
- }
-
- private AnnotationReader getAnnotationReader() {
- if (annotationReader == null) {
- annotationReader = factory.buildAnnotationReader(annotatedElement);
- }
- return annotationReader;
- }
-
- public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
- return getAnnotationReader().getAnnotation( annotationType );
- }
-
- public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) {
- return getAnnotationReader().isAnnotationPresent( annotationType );
- }
-
- public Annotation[] getAnnotations() {
- return getAnnotationReader().getAnnotations();
- }
-
- AnnotatedElement toAnnotatedElement() {
- return annotatedElement;
- }
-
- @Override
- public boolean equals(Object obj) {
- if ( ! ( obj instanceof JavaXAnnotatedElement ) ) return false;
- JavaXAnnotatedElement other = (JavaXAnnotatedElement) obj;
- //FIXME yuk this defeat the type environment
- return annotatedElement.equals( other.toAnnotatedElement() );
- }
-
- @Override
- public int hashCode() {
- return annotatedElement.hashCode();
- }
-
- @Override
- public String toString() {
- return annotatedElement.toString();
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXAnnotatedElement.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXAnnotatedElement.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXAnnotatedElement.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXAnnotatedElement.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,71 @@
+package org.hibernate.annotations.common.reflection.java;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+
+import org.hibernate.annotations.common.reflection.AnnotationReader;
+import org.hibernate.annotations.common.reflection.XAnnotatedElement;
+
+/**
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+abstract class JavaXAnnotatedElement implements XAnnotatedElement {
+
+ // responsible for extracting annotations
+ private AnnotationReader annotationReader;
+
+ private final JavaReflectionManager factory;
+
+ private final AnnotatedElement annotatedElement;
+
+ public JavaXAnnotatedElement(AnnotatedElement annotatedElement, JavaReflectionManager factory) {
+ this.factory = factory;
+ this.annotatedElement = annotatedElement;
+ }
+
+ protected JavaReflectionManager getFactory() {
+ return factory;
+ }
+
+ private AnnotationReader getAnnotationReader() {
+ if (annotationReader == null) {
+ annotationReader = factory.buildAnnotationReader(annotatedElement);
+ }
+ return annotationReader;
+ }
+
+ public <T extends Annotation> T getAnnotation(Class<T> annotationType) {
+ return getAnnotationReader().getAnnotation( annotationType );
+ }
+
+ public <T extends Annotation> boolean isAnnotationPresent(Class<T> annotationType) {
+ return getAnnotationReader().isAnnotationPresent( annotationType );
+ }
+
+ public Annotation[] getAnnotations() {
+ return getAnnotationReader().getAnnotations();
+ }
+
+ AnnotatedElement toAnnotatedElement() {
+ return annotatedElement;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if ( ! ( obj instanceof JavaXAnnotatedElement ) ) return false;
+ JavaXAnnotatedElement other = (JavaXAnnotatedElement) obj;
+ //FIXME yuk this defeat the type environment
+ return annotatedElement.equals( other.toAnnotatedElement() );
+ }
+
+ @Override
+ public int hashCode() {
+ return annotatedElement.hashCode();
+ }
+
+ @Override
+ public String toString() {
+ return annotatedElement.toString();
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXArrayType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXArrayType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXArrayType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,77 +0,0 @@
-package org.hibernate.annotations.common.reflection.java;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.Type;
-import java.util.Collection;
-
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-import org.hibernate.annotations.common.reflection.java.generics.TypeSwitch;
-
-/**
- * @author Emmanuel Bernard
- * @author Paolo Perrotta
- */
-class JavaXArrayType extends JavaXType {
-
- public JavaXArrayType(Type type, TypeEnvironment context, JavaReflectionManager factory) {
- super( type, context, factory );
- }
-
- public boolean isArray() {
- return true;
- }
-
- public boolean isCollection() {
- return false;
- }
-
- public XClass getElementClass() {
- return toXClass( getElementType() );
- }
-
- private Type getElementType() {
- //TODO make it a static class for faster performance?
- return new TypeSwitch<Type>() {
- @Override
- public Type caseClass(Class classType) {
- return classType.getComponentType();
- }
-
- @Override
- public Type caseGenericArrayType(GenericArrayType genericArrayType) {
- return genericArrayType.getGenericComponentType();
- }
-
- @Override
- public Type defaultCase(Type t) {
- throw new IllegalArgumentException( t + " is not an array type" );
- }
- }.doSwitch( approximate() );
- }
-
- public XClass getClassOrElementClass() {
- return getElementClass();
- }
-
- public Class<? extends Collection> getCollectionClass() {
- return null;
- }
-
- public XClass getMapKey() {
- return null;
- }
-
- public XClass getType() {
- Type boundType = getElementType();
- if ( boundType instanceof Class ) {
- boundType = arrayTypeOf( (Class) boundType );
- }
- return toXClass( boundType );
- }
-
- private Class<? extends Object> arrayTypeOf(Class componentType) {
- return Array.newInstance( componentType, 0 ).getClass();
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXArrayType.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXArrayType.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXArrayType.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXArrayType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,77 @@
+package org.hibernate.annotations.common.reflection.java;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.Type;
+import java.util.Collection;
+
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+import org.hibernate.annotations.common.reflection.java.generics.TypeSwitch;
+
+/**
+ * @author Emmanuel Bernard
+ * @author Paolo Perrotta
+ */
+class JavaXArrayType extends JavaXType {
+
+ public JavaXArrayType(Type type, TypeEnvironment context, JavaReflectionManager factory) {
+ super( type, context, factory );
+ }
+
+ public boolean isArray() {
+ return true;
+ }
+
+ public boolean isCollection() {
+ return false;
+ }
+
+ public XClass getElementClass() {
+ return toXClass( getElementType() );
+ }
+
+ private Type getElementType() {
+ //TODO make it a static class for faster performance?
+ return new TypeSwitch<Type>() {
+ @Override
+ public Type caseClass(Class classType) {
+ return classType.getComponentType();
+ }
+
+ @Override
+ public Type caseGenericArrayType(GenericArrayType genericArrayType) {
+ return genericArrayType.getGenericComponentType();
+ }
+
+ @Override
+ public Type defaultCase(Type t) {
+ throw new IllegalArgumentException( t + " is not an array type" );
+ }
+ }.doSwitch( approximate() );
+ }
+
+ public XClass getClassOrElementClass() {
+ return getElementClass();
+ }
+
+ public Class<? extends Collection> getCollectionClass() {
+ return null;
+ }
+
+ public XClass getMapKey() {
+ return null;
+ }
+
+ public XClass getType() {
+ Type boundType = getElementType();
+ if ( boundType instanceof Class ) {
+ boundType = arrayTypeOf( (Class) boundType );
+ }
+ return toXClass( boundType );
+ }
+
+ private Class<? extends Object> arrayTypeOf(Class componentType) {
+ return Array.newInstance( componentType, 0 ).getClass();
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXClass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXClass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXClass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,139 +0,0 @@
-package org.hibernate.annotations.common.reflection.java;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.LinkedList;
-import java.util.List;
-
-import org.hibernate.annotations.common.reflection.Filter;
-import org.hibernate.annotations.common.reflection.ReflectionUtil;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XMethod;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.annotations.common.reflection.java.generics.CompoundTypeEnvironment;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-
-/**
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-class JavaXClass extends JavaXAnnotatedElement implements XClass {
-
- private final TypeEnvironment context;
- private final Class clazz;
-
- public JavaXClass(Class clazz, TypeEnvironment env, JavaReflectionManager factory) {
- super( clazz, factory );
- this.clazz = clazz; //optimization
- this.context = env;
- }
-
- public String getName() {
- return toClass().getName();
- }
-
- public XClass getSuperclass() {
- return getFactory().toXClass( toClass().getSuperclass(),
- CompoundTypeEnvironment.create(
- getTypeEnvironment(),
- getFactory().getTypeEnvironment( toClass() )
- )
- );
- }
-
- public XClass[] getInterfaces() {
- Class[] classes = toClass().getInterfaces();
- int length = classes.length;
- XClass[] xClasses = new XClass[length];
- if (length != 0) {
- TypeEnvironment environment = CompoundTypeEnvironment.create(
- getTypeEnvironment(),
- getFactory().getTypeEnvironment( toClass() )
- );
- for ( int index = 0; index < length ; index++ ) {
- xClasses[index] = getFactory().toXClass( classes[index], environment );
- }
- }
- return xClasses;
- }
-
- public boolean isInterface() {
- return toClass().isInterface();
- }
-
- public boolean isAbstract() {
- return Modifier.isAbstract( toClass().getModifiers() );
- }
-
- public boolean isPrimitive() {
- return toClass().isPrimitive();
- }
-
- public boolean isEnum() {
- return toClass().isEnum();
- }
-
- private List<XProperty> getDeclaredFieldProperties(Filter filter) {
- List<XProperty> result = new LinkedList<XProperty>();
- for ( Field f : toClass().getDeclaredFields() ) {
- if ( ReflectionUtil.isProperty( f, getTypeEnvironment().bind( f.getGenericType() ), filter ) ) {
- result.add( getFactory().getXProperty( f, getTypeEnvironment() ) );
- }
- }
- return result;
- }
-
- private List<XProperty> getDeclaredMethodProperties(Filter filter) {
- List<XProperty> result = new LinkedList<XProperty>();
- for ( Method m : toClass().getDeclaredMethods() ) {
- if ( ReflectionUtil.isProperty( m, getTypeEnvironment().bind( m.getGenericReturnType() ), filter ) ) {
- result.add( getFactory().getXProperty( m, getTypeEnvironment() ) );
- }
- }
- return result;
- }
-
- public List<XProperty> getDeclaredProperties(String accessType) {
- return getDeclaredProperties( accessType, XClass.DEFAULT_FILTER );
- }
-
- public List<XProperty> getDeclaredProperties(String accessType, Filter filter) {
- if ( accessType.equals( ACCESS_FIELD ) ) {
- return getDeclaredFieldProperties( filter );
- }
- if ( accessType.equals( ACCESS_PROPERTY ) ) {
- return getDeclaredMethodProperties( filter );
- }
- throw new IllegalArgumentException( "Unknown access type " + accessType );
- }
-
- public List<XMethod> getDeclaredMethods() {
- List<XMethod> result = new LinkedList<XMethod>();
- for ( Method m : toClass().getDeclaredMethods() ) {
- result.add( getFactory().getXMethod( m, getTypeEnvironment() ) );
- }
- return result;
- }
-
- public Class<?> toClass() {
- return clazz;
- }
-
- public boolean isAssignableFrom(XClass c) {
- return toClass().isAssignableFrom( ( (JavaXClass) c ).toClass() );
- }
-
- boolean isArray() {
- return toClass().isArray();
- }
-
- TypeEnvironment getTypeEnvironment() {
- return context;
- }
-
- @Override
- public String toString() {
- return getName();
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXClass.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXClass.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXClass.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXClass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,139 @@
+package org.hibernate.annotations.common.reflection.java;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.LinkedList;
+import java.util.List;
+
+import org.hibernate.annotations.common.reflection.Filter;
+import org.hibernate.annotations.common.reflection.ReflectionUtil;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XMethod;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.annotations.common.reflection.java.generics.CompoundTypeEnvironment;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+
+/**
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+class JavaXClass extends JavaXAnnotatedElement implements XClass {
+
+ private final TypeEnvironment context;
+ private final Class clazz;
+
+ public JavaXClass(Class clazz, TypeEnvironment env, JavaReflectionManager factory) {
+ super( clazz, factory );
+ this.clazz = clazz; //optimization
+ this.context = env;
+ }
+
+ public String getName() {
+ return toClass().getName();
+ }
+
+ public XClass getSuperclass() {
+ return getFactory().toXClass( toClass().getSuperclass(),
+ CompoundTypeEnvironment.create(
+ getTypeEnvironment(),
+ getFactory().getTypeEnvironment( toClass() )
+ )
+ );
+ }
+
+ public XClass[] getInterfaces() {
+ Class[] classes = toClass().getInterfaces();
+ int length = classes.length;
+ XClass[] xClasses = new XClass[length];
+ if (length != 0) {
+ TypeEnvironment environment = CompoundTypeEnvironment.create(
+ getTypeEnvironment(),
+ getFactory().getTypeEnvironment( toClass() )
+ );
+ for ( int index = 0; index < length ; index++ ) {
+ xClasses[index] = getFactory().toXClass( classes[index], environment );
+ }
+ }
+ return xClasses;
+ }
+
+ public boolean isInterface() {
+ return toClass().isInterface();
+ }
+
+ public boolean isAbstract() {
+ return Modifier.isAbstract( toClass().getModifiers() );
+ }
+
+ public boolean isPrimitive() {
+ return toClass().isPrimitive();
+ }
+
+ public boolean isEnum() {
+ return toClass().isEnum();
+ }
+
+ private List<XProperty> getDeclaredFieldProperties(Filter filter) {
+ List<XProperty> result = new LinkedList<XProperty>();
+ for ( Field f : toClass().getDeclaredFields() ) {
+ if ( ReflectionUtil.isProperty( f, getTypeEnvironment().bind( f.getGenericType() ), filter ) ) {
+ result.add( getFactory().getXProperty( f, getTypeEnvironment() ) );
+ }
+ }
+ return result;
+ }
+
+ private List<XProperty> getDeclaredMethodProperties(Filter filter) {
+ List<XProperty> result = new LinkedList<XProperty>();
+ for ( Method m : toClass().getDeclaredMethods() ) {
+ if ( ReflectionUtil.isProperty( m, getTypeEnvironment().bind( m.getGenericReturnType() ), filter ) ) {
+ result.add( getFactory().getXProperty( m, getTypeEnvironment() ) );
+ }
+ }
+ return result;
+ }
+
+ public List<XProperty> getDeclaredProperties(String accessType) {
+ return getDeclaredProperties( accessType, XClass.DEFAULT_FILTER );
+ }
+
+ public List<XProperty> getDeclaredProperties(String accessType, Filter filter) {
+ if ( accessType.equals( ACCESS_FIELD ) ) {
+ return getDeclaredFieldProperties( filter );
+ }
+ if ( accessType.equals( ACCESS_PROPERTY ) ) {
+ return getDeclaredMethodProperties( filter );
+ }
+ throw new IllegalArgumentException( "Unknown access type " + accessType );
+ }
+
+ public List<XMethod> getDeclaredMethods() {
+ List<XMethod> result = new LinkedList<XMethod>();
+ for ( Method m : toClass().getDeclaredMethods() ) {
+ result.add( getFactory().getXMethod( m, getTypeEnvironment() ) );
+ }
+ return result;
+ }
+
+ public Class<?> toClass() {
+ return clazz;
+ }
+
+ public boolean isAssignableFrom(XClass c) {
+ return toClass().isAssignableFrom( ( (JavaXClass) c ).toClass() );
+ }
+
+ boolean isArray() {
+ return toClass().isArray();
+ }
+
+ TypeEnvironment getTypeEnvironment() {
+ return context;
+ }
+
+ @Override
+ public String toString() {
+ return getName();
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXCollectionType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXCollectionType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXCollectionType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,74 +0,0 @@
-package org.hibernate.annotations.common.reflection.java;
-
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.Collection;
-import java.util.Map;
-import java.util.SortedMap;
-
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-import org.hibernate.annotations.common.reflection.java.generics.TypeSwitch;
-import org.hibernate.annotations.common.reflection.java.generics.TypeUtils;
-
-/**
- * @author Emmanuel Bernard
- * @author Paolo Perrotta
- */
-class JavaXCollectionType extends JavaXType {
-
- public JavaXCollectionType(Type type, TypeEnvironment context, JavaReflectionManager factory) {
- super( type, context, factory );
- }
-
- public boolean isArray() {
- return false;
- }
-
- public boolean isCollection() {
- return true;
- }
-
- public XClass getElementClass() {
- return new TypeSwitch<XClass>() {
- @Override
- public XClass caseParameterizedType(ParameterizedType parameterizedType) {
- Type[] args = parameterizedType.getActualTypeArguments();
- Type componentType;
- Class<? extends Collection> collectionClass = getCollectionClass();
- if ( collectionClass.isAssignableFrom( Map.class )
- || collectionClass.isAssignableFrom( SortedMap.class ) ) {
- componentType = args[1];
- }
- else {
- componentType = args[0];
- }
- return toXClass( componentType );
- }
- }.doSwitch( approximate() );
- }
-
- public XClass getMapKey() {
- return new TypeSwitch<XClass>() {
- @Override
- public XClass caseParameterizedType(ParameterizedType parameterizedType) {
- if ( getCollectionClass().isAssignableFrom( Map.class ) ) {
- return toXClass( parameterizedType.getActualTypeArguments()[0] );
- }
- return null;
- }
- }.doSwitch( approximate() );
- }
-
- public XClass getClassOrElementClass() {
- return toXClass( approximate() );
- }
-
- public Class<? extends Collection> getCollectionClass() {
- return TypeUtils.getCollectionClass( approximate() );
- }
-
- public XClass getType() {
- return toXClass( approximate() );
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXCollectionType.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXCollectionType.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXCollectionType.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXCollectionType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,74 @@
+package org.hibernate.annotations.common.reflection.java;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Collection;
+import java.util.Map;
+import java.util.SortedMap;
+
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+import org.hibernate.annotations.common.reflection.java.generics.TypeSwitch;
+import org.hibernate.annotations.common.reflection.java.generics.TypeUtils;
+
+/**
+ * @author Emmanuel Bernard
+ * @author Paolo Perrotta
+ */
+class JavaXCollectionType extends JavaXType {
+
+ public JavaXCollectionType(Type type, TypeEnvironment context, JavaReflectionManager factory) {
+ super( type, context, factory );
+ }
+
+ public boolean isArray() {
+ return false;
+ }
+
+ public boolean isCollection() {
+ return true;
+ }
+
+ public XClass getElementClass() {
+ return new TypeSwitch<XClass>() {
+ @Override
+ public XClass caseParameterizedType(ParameterizedType parameterizedType) {
+ Type[] args = parameterizedType.getActualTypeArguments();
+ Type componentType;
+ Class<? extends Collection> collectionClass = getCollectionClass();
+ if ( collectionClass.isAssignableFrom( Map.class )
+ || collectionClass.isAssignableFrom( SortedMap.class ) ) {
+ componentType = args[1];
+ }
+ else {
+ componentType = args[0];
+ }
+ return toXClass( componentType );
+ }
+ }.doSwitch( approximate() );
+ }
+
+ public XClass getMapKey() {
+ return new TypeSwitch<XClass>() {
+ @Override
+ public XClass caseParameterizedType(ParameterizedType parameterizedType) {
+ if ( getCollectionClass().isAssignableFrom( Map.class ) ) {
+ return toXClass( parameterizedType.getActualTypeArguments()[0] );
+ }
+ return null;
+ }
+ }.doSwitch( approximate() );
+ }
+
+ public XClass getClassOrElementClass() {
+ return toXClass( approximate() );
+ }
+
+ public Class<? extends Collection> getCollectionClass() {
+ return TypeUtils.getCollectionClass( approximate() );
+ }
+
+ public XClass getType() {
+ return toXClass( approximate() );
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMember.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMember.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMember.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,94 +0,0 @@
-//$Id$
-package org.hibernate.annotations.common.reflection.java;
-
-import java.lang.reflect.AccessibleObject;
-import java.lang.reflect.AnnotatedElement;
-import java.lang.reflect.Field;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.Collection;
-
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XMember;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class JavaXMember extends JavaXAnnotatedElement implements XMember {
- private final Type type;
- private final TypeEnvironment env;
- private final JavaXType xType;
-
- protected static Type typeOf(Member member, TypeEnvironment env) {
- if ( member instanceof Field ) {
- return env.bind( ( (Field) member ).getGenericType() );
- }
- if ( member instanceof Method ) {
- return env.bind( ( (Method) member ).getGenericReturnType() );
- }
- throw new IllegalArgumentException( "Member " + member + " is neither a field nor a method" );
- }
-
- protected JavaXMember(Member member, Type type, TypeEnvironment env, JavaReflectionManager factory, JavaXType xType) {
- super( (AnnotatedElement) member, factory );
- this.type = type;
- this.env = env;
- this.xType = xType;
- }
-
- public XClass getType() {
- return xType.getType();
- }
-
- public abstract String getName();
-
- protected Type getJavaType() {
- return env.bind( type );
- }
-
- protected TypeEnvironment getTypeEnvironment() {
- return env;
- }
-
- protected Member getMember() {
- return (Member) toAnnotatedElement();
- }
-
- public Class<? extends Collection> getCollectionClass() {
- return xType.getCollectionClass();
- }
-
- public XClass getClassOrElementClass() {
- return xType.getClassOrElementClass();
- }
-
- public XClass getElementClass() {
- return xType.getElementClass();
- }
-
- public XClass getMapKey() {
- return xType.getMapKey();
- }
-
- public boolean isArray() {
- return xType.isArray();
- }
-
- public boolean isCollection() {
- return xType.isCollection();
- }
-
- public int getModifiers() {
- return getMember().getModifiers();
- }
-
- public final boolean isTypeResolved() {
- return xType.isResolved();
- }
-
- public void setAccessible(boolean accessible) {
- ( (AccessibleObject) getMember() ).setAccessible( accessible );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMember.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMember.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMember.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMember.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,94 @@
+//$Id$
+package org.hibernate.annotations.common.reflection.java;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.Collection;
+
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XMember;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class JavaXMember extends JavaXAnnotatedElement implements XMember {
+ private final Type type;
+ private final TypeEnvironment env;
+ private final JavaXType xType;
+
+ protected static Type typeOf(Member member, TypeEnvironment env) {
+ if ( member instanceof Field ) {
+ return env.bind( ( (Field) member ).getGenericType() );
+ }
+ if ( member instanceof Method ) {
+ return env.bind( ( (Method) member ).getGenericReturnType() );
+ }
+ throw new IllegalArgumentException( "Member " + member + " is neither a field nor a method" );
+ }
+
+ protected JavaXMember(Member member, Type type, TypeEnvironment env, JavaReflectionManager factory, JavaXType xType) {
+ super( (AnnotatedElement) member, factory );
+ this.type = type;
+ this.env = env;
+ this.xType = xType;
+ }
+
+ public XClass getType() {
+ return xType.getType();
+ }
+
+ public abstract String getName();
+
+ protected Type getJavaType() {
+ return env.bind( type );
+ }
+
+ protected TypeEnvironment getTypeEnvironment() {
+ return env;
+ }
+
+ protected Member getMember() {
+ return (Member) toAnnotatedElement();
+ }
+
+ public Class<? extends Collection> getCollectionClass() {
+ return xType.getCollectionClass();
+ }
+
+ public XClass getClassOrElementClass() {
+ return xType.getClassOrElementClass();
+ }
+
+ public XClass getElementClass() {
+ return xType.getElementClass();
+ }
+
+ public XClass getMapKey() {
+ return xType.getMapKey();
+ }
+
+ public boolean isArray() {
+ return xType.isArray();
+ }
+
+ public boolean isCollection() {
+ return xType.isCollection();
+ }
+
+ public int getModifiers() {
+ return getMember().getModifiers();
+ }
+
+ public final boolean isTypeResolved() {
+ return xType.isResolved();
+ }
+
+ public void setAccessible(boolean accessible) {
+ ( (AccessibleObject) getMember() ).setAccessible( accessible );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMethod.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMethod.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMethod.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-//$Id$
-package org.hibernate.annotations.common.reflection.java;
-
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-
-import org.hibernate.annotations.common.reflection.XMethod;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JavaXMethod extends JavaXMember implements XMethod {
-
- static JavaXMethod create(Member member, TypeEnvironment context, JavaReflectionManager factory) {
- final Type propType = typeOf( member, context );
- JavaXType xType = factory.toXType( context, propType );
- return new JavaXMethod( member, propType, context, factory, xType );
- }
-
- private JavaXMethod(Member member, Type type, TypeEnvironment env, JavaReflectionManager factory, JavaXType xType) {
- super( member, type, env, factory, xType );
- assert member instanceof Method;
- }
-
- public String getName() {
- return getMember().getName();
- }
-
- public Object invoke(Object target, Object... parameters) {
- try {
- return ( (Method) getMember() ).invoke( target, parameters );
- }
- catch (NullPointerException e) {
- throw new IllegalArgumentException( "Invoking " + getName() + " on a null object", e );
- }
- catch (IllegalArgumentException e) {
- throw new IllegalArgumentException( "Invoking " + getName() + " with wrong parameters", e );
- }
- catch (Exception e) {
- throw new IllegalStateException( "Unable to invoke " + getName(), e );
- }
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMethod.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMethod.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMethod.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXMethod.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+//$Id$
+package org.hibernate.annotations.common.reflection.java;
+
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+
+import org.hibernate.annotations.common.reflection.XMethod;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JavaXMethod extends JavaXMember implements XMethod {
+
+ static JavaXMethod create(Member member, TypeEnvironment context, JavaReflectionManager factory) {
+ final Type propType = typeOf( member, context );
+ JavaXType xType = factory.toXType( context, propType );
+ return new JavaXMethod( member, propType, context, factory, xType );
+ }
+
+ private JavaXMethod(Member member, Type type, TypeEnvironment env, JavaReflectionManager factory, JavaXType xType) {
+ super( member, type, env, factory, xType );
+ assert member instanceof Method;
+ }
+
+ public String getName() {
+ return getMember().getName();
+ }
+
+ public Object invoke(Object target, Object... parameters) {
+ try {
+ return ( (Method) getMember() ).invoke( target, parameters );
+ }
+ catch (NullPointerException e) {
+ throw new IllegalArgumentException( "Invoking " + getName() + " on a null object", e );
+ }
+ catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException( "Invoking " + getName() + " with wrong parameters", e );
+ }
+ catch (Exception e) {
+ throw new IllegalStateException( "Unable to invoke " + getName(), e );
+ }
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXPackage.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXPackage.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXPackage.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-package org.hibernate.annotations.common.reflection.java;
-
-import org.hibernate.annotations.common.reflection.XPackage;
-
-/**
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-class JavaXPackage extends JavaXAnnotatedElement implements XPackage {
-
- public JavaXPackage(Package pkg, JavaReflectionManager factory) {
- super( pkg, factory );
- }
-
- public String getName() {
- return ( (Package) toAnnotatedElement() ).getName();
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXPackage.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXPackage.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXPackage.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXPackage.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+package org.hibernate.annotations.common.reflection.java;
+
+import org.hibernate.annotations.common.reflection.XPackage;
+
+/**
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+class JavaXPackage extends JavaXAnnotatedElement implements XPackage {
+
+ public JavaXPackage(Package pkg, JavaReflectionManager factory) {
+ super( pkg, factory );
+ }
+
+ public String getName() {
+ return ( (Package) toAnnotatedElement() ).getName();
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXProperty.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXProperty.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXProperty.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,72 +0,0 @@
-package org.hibernate.annotations.common.reflection.java;
-
-import java.beans.Introspector;
-import java.lang.reflect.Field;
-import java.lang.reflect.Member;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-
-/**
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-class JavaXProperty extends JavaXMember implements XProperty {
-
- static JavaXProperty create(Member member, final TypeEnvironment context, final JavaReflectionManager factory) {
- final Type propType = typeOf( member, context );
- JavaXType xType = factory.toXType( context, propType );
- return new JavaXProperty( member, propType, context, factory, xType );
- }
-
- private JavaXProperty(Member member, Type type, TypeEnvironment env, JavaReflectionManager factory, JavaXType xType) {
- super( member, type, env, factory, xType );
- assert member instanceof Field || member instanceof Method;
- }
-
- public String getName() {
- String fullName = getMember().getName();
- if ( getMember() instanceof Method ) {
- if ( fullName.startsWith( "get" ) ) {
- return Introspector.decapitalize( fullName.substring( "get".length() ) );
- }
- if ( fullName.startsWith( "is" ) ) {
- return Introspector.decapitalize( fullName.substring( "is".length() ) );
- }
- throw new RuntimeException( "Method " + fullName + " is not a property getter" );
- }
- else {
- return fullName;
- }
- }
-
- public Object invoke(Object target, Object... parameters) {
- if ( parameters.length != 0 ) {
- throw new IllegalArgumentException( "An XProperty cannot have invoke parameters" );
- }
- try {
- if ( getMember() instanceof Method ) {
- return ( (Method) getMember() ).invoke( target );
- }
- else {
- return ( (Field) getMember() ).get( target );
- }
- }
- catch (NullPointerException e) {
- throw new IllegalArgumentException( "Invoking " + getName() + " on a null object", e );
- }
- catch (IllegalArgumentException e) {
- throw new IllegalArgumentException( "Invoking " + getName() + " with wrong parameters", e );
- }
- catch (Exception e) {
- throw new IllegalStateException( "Unable to invoke " + getName(), e );
- }
- }
-
- @Override
- public String toString() {
- return getName();
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXProperty.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXProperty.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXProperty.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXProperty.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,72 @@
+package org.hibernate.annotations.common.reflection.java;
+
+import java.beans.Introspector;
+import java.lang.reflect.Field;
+import java.lang.reflect.Member;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+
+/**
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+class JavaXProperty extends JavaXMember implements XProperty {
+
+ static JavaXProperty create(Member member, final TypeEnvironment context, final JavaReflectionManager factory) {
+ final Type propType = typeOf( member, context );
+ JavaXType xType = factory.toXType( context, propType );
+ return new JavaXProperty( member, propType, context, factory, xType );
+ }
+
+ private JavaXProperty(Member member, Type type, TypeEnvironment env, JavaReflectionManager factory, JavaXType xType) {
+ super( member, type, env, factory, xType );
+ assert member instanceof Field || member instanceof Method;
+ }
+
+ public String getName() {
+ String fullName = getMember().getName();
+ if ( getMember() instanceof Method ) {
+ if ( fullName.startsWith( "get" ) ) {
+ return Introspector.decapitalize( fullName.substring( "get".length() ) );
+ }
+ if ( fullName.startsWith( "is" ) ) {
+ return Introspector.decapitalize( fullName.substring( "is".length() ) );
+ }
+ throw new RuntimeException( "Method " + fullName + " is not a property getter" );
+ }
+ else {
+ return fullName;
+ }
+ }
+
+ public Object invoke(Object target, Object... parameters) {
+ if ( parameters.length != 0 ) {
+ throw new IllegalArgumentException( "An XProperty cannot have invoke parameters" );
+ }
+ try {
+ if ( getMember() instanceof Method ) {
+ return ( (Method) getMember() ).invoke( target );
+ }
+ else {
+ return ( (Field) getMember() ).get( target );
+ }
+ }
+ catch (NullPointerException e) {
+ throw new IllegalArgumentException( "Invoking " + getName() + " on a null object", e );
+ }
+ catch (IllegalArgumentException e) {
+ throw new IllegalArgumentException( "Invoking " + getName() + " with wrong parameters", e );
+ }
+ catch (Exception e) {
+ throw new IllegalStateException( "Unable to invoke " + getName(), e );
+ }
+ }
+
+ @Override
+ public String toString() {
+ return getName();
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXSimpleType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXSimpleType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXSimpleType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,46 +0,0 @@
-package org.hibernate.annotations.common.reflection.java;
-
-import java.lang.reflect.Type;
-import java.util.Collection;
-
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-
-/**
- * @author Emmanuel Bernard
- * @author Paolo Perrotta
- */
-class JavaXSimpleType extends JavaXType {
-
- public JavaXSimpleType(Type type, TypeEnvironment context, JavaReflectionManager factory) {
- super( type, context, factory );
- }
-
- public boolean isArray() {
- return false;
- }
-
- public boolean isCollection() {
- return false;
- }
-
- public XClass getElementClass() {
- return toXClass( approximate() );
- }
-
- public XClass getClassOrElementClass() {
- return getElementClass();
- }
-
- public Class<? extends Collection> getCollectionClass() {
- return null;
- }
-
- public XClass getType() {
- return toXClass( approximate() );
- }
-
- public XClass getMapKey() {
- return null;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXSimpleType.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXSimpleType.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXSimpleType.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXSimpleType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,46 @@
+package org.hibernate.annotations.common.reflection.java;
+
+import java.lang.reflect.Type;
+import java.util.Collection;
+
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+
+/**
+ * @author Emmanuel Bernard
+ * @author Paolo Perrotta
+ */
+class JavaXSimpleType extends JavaXType {
+
+ public JavaXSimpleType(Type type, TypeEnvironment context, JavaReflectionManager factory) {
+ super( type, context, factory );
+ }
+
+ public boolean isArray() {
+ return false;
+ }
+
+ public boolean isCollection() {
+ return false;
+ }
+
+ public XClass getElementClass() {
+ return toXClass( approximate() );
+ }
+
+ public XClass getClassOrElementClass() {
+ return getElementClass();
+ }
+
+ public Class<? extends Collection> getCollectionClass() {
+ return null;
+ }
+
+ public XClass getType() {
+ return toXClass( approximate() );
+ }
+
+ public XClass getMapKey() {
+ return null;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-//$Id: PropertyTypeExtractor.java 9316 2006-02-22 20:47:31Z epbernard $
-package org.hibernate.annotations.common.reflection.java;
-
-import java.lang.reflect.Type;
-import java.util.Collection;
-
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-import org.hibernate.annotations.common.reflection.java.generics.TypeUtils;
-
-/**
- * The Java X-layer equivalent to a Java <code>Type</code>.
- *
- * @author Emmanuel Bernard
- * @author Paolo Perrotta
- */
-abstract class JavaXType {
-
- private final TypeEnvironment context;
- private final JavaReflectionManager factory;
- private final Type approximatedType;
- private final Type boundType;
-
- protected JavaXType(Type unboundType, TypeEnvironment context, JavaReflectionManager factory) {
- this.context = context;
- this.factory = factory;
- this.boundType = context.bind( unboundType );
- this.approximatedType = factory.toApproximatingEnvironment( context ).bind( unboundType );
- }
-
- abstract public boolean isArray();
-
- abstract public boolean isCollection();
-
- abstract public XClass getElementClass();
-
- abstract public XClass getClassOrElementClass();
-
- abstract public Class<? extends Collection> getCollectionClass();
-
- abstract public XClass getMapKey();
-
- abstract public XClass getType();
-
- public boolean isResolved() {
- return TypeUtils.isResolved( boundType );
- }
-
- protected Type approximate() {
- return approximatedType;
- }
-
- protected XClass toXClass(Type type) {
- return factory.toXClass( type, context );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXType.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXType.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXType.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/JavaXType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+//$Id: PropertyTypeExtractor.java 9316 2006-02-22 20:47:31Z epbernard $
+package org.hibernate.annotations.common.reflection.java;
+
+import java.lang.reflect.Type;
+import java.util.Collection;
+
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+import org.hibernate.annotations.common.reflection.java.generics.TypeUtils;
+
+/**
+ * The Java X-layer equivalent to a Java <code>Type</code>.
+ *
+ * @author Emmanuel Bernard
+ * @author Paolo Perrotta
+ */
+abstract class JavaXType {
+
+ private final TypeEnvironment context;
+ private final JavaReflectionManager factory;
+ private final Type approximatedType;
+ private final Type boundType;
+
+ protected JavaXType(Type unboundType, TypeEnvironment context, JavaReflectionManager factory) {
+ this.context = context;
+ this.factory = factory;
+ this.boundType = context.bind( unboundType );
+ this.approximatedType = factory.toApproximatingEnvironment( context ).bind( unboundType );
+ }
+
+ abstract public boolean isArray();
+
+ abstract public boolean isCollection();
+
+ abstract public XClass getElementClass();
+
+ abstract public XClass getClassOrElementClass();
+
+ abstract public Class<? extends Collection> getCollectionClass();
+
+ abstract public XClass getMapKey();
+
+ abstract public XClass getType();
+
+ public boolean isResolved() {
+ return TypeUtils.isResolved( boundType );
+ }
+
+ protected Type approximate() {
+ return approximatedType;
+ }
+
+ protected XClass toXClass(Type type) {
+ return factory.toXClass( type, context );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/Pair.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/Pair.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/Pair.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-package org.hibernate.annotations.common.reflection.java;
-
-/**
- * A pair of objects that can be used as a key in a Map.
- *
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-abstract class Pair<T, U> {
-
- private final T o1;
-
- private final U o2;
- private final int hashCode;
-
- Pair(T o1, U o2) {
- this.o1 = o1;
- this.o2 = o2;
- this.hashCode = doHashCode();
- }
-
- @Override
- public boolean equals(Object obj) {
- if ( ! (obj instanceof Pair) ) {
- return false;
- }
- Pair other = (Pair) obj;
- return !differentHashCode( other ) && safeEquals( o1, other.o1 ) && safeEquals( o2, other.o2 );
- }
-
- private boolean differentHashCode(Pair other) {
- return hashCode != other.hashCode;
- }
-
- @Override
- public int hashCode() {
- //cached because the inheritance can be big
- return hashCode;
- }
-
- private int doHashCode() {
- return safeHashCode( o1 ) ^ safeHashCode( o2 );
- }
-
- private int safeHashCode(Object o) {
- if ( o == null ) {
- return 0;
- }
- return o.hashCode();
- }
-
- private boolean safeEquals(Object obj1, Object obj2) {
- if ( obj1 == null ) {
- return obj2 == null;
- }
- return obj1.equals( obj2 );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/Pair.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/Pair.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/Pair.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/Pair.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+package org.hibernate.annotations.common.reflection.java;
+
+/**
+ * A pair of objects that can be used as a key in a Map.
+ *
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+abstract class Pair<T, U> {
+
+ private final T o1;
+
+ private final U o2;
+ private final int hashCode;
+
+ Pair(T o1, U o2) {
+ this.o1 = o1;
+ this.o2 = o2;
+ this.hashCode = doHashCode();
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if ( ! (obj instanceof Pair) ) {
+ return false;
+ }
+ Pair other = (Pair) obj;
+ return !differentHashCode( other ) && safeEquals( o1, other.o1 ) && safeEquals( o2, other.o2 );
+ }
+
+ private boolean differentHashCode(Pair other) {
+ return hashCode != other.hashCode;
+ }
+
+ @Override
+ public int hashCode() {
+ //cached because the inheritance can be big
+ return hashCode;
+ }
+
+ private int doHashCode() {
+ return safeHashCode( o1 ) ^ safeHashCode( o2 );
+ }
+
+ private int safeHashCode(Object o) {
+ if ( o == null ) {
+ return 0;
+ }
+ return o.hashCode();
+ }
+
+ private boolean safeEquals(Object obj1, Object obj2) {
+ if ( obj1 == null ) {
+ return obj2 == null;
+ }
+ return obj1.equals( obj2 );
+ }
+}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics)
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/ApproximatingTypeEnvironment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/ApproximatingTypeEnvironment.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/ApproximatingTypeEnvironment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,151 +0,0 @@
-package org.hibernate.annotations.common.reflection.java.generics;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.lang.reflect.WildcardType;
-
-/**
- * A <code>TypeEnvironment</code> that approximates the unresolved components of a generic simple
- * type or collection to their nearest upper binding. The returned type is always fully resolved.
- * <p/>
- * The concept of "type approximation" is not really sound in general. This class just does what we need
- * within the Hibernate Annotations environment. It's more or less a hack. The idea is that certain
- * types can provide useful information even if they're not fully resolved in the environment. This class
- * tries to turn those types into the nearest fully resolved type that still carries that information.
- * <p/>
- * For example:<br>
- * <code>T</code> becomes <code>Object</code>.<br>
- * <code>T extends Foo</code> becomes <code>Foo</code>.<br>
- * <code>List<T></code> becomes <code>List<Object></code>.<br>
- * <code>List<T extends Foo></code> becomes <code>List<Foo></code>.<br>
- * An array of <code>T extends Foo</code> becomes an array of <code>Foo</code>.<p>
- * <p/>
- * If a type variable has multiple upper bounds, it will be approximated to <code>Object</code>.
- * Lower bounds are ignored.<p>
- * <p/>
- * Wildcards are generally not approximated. <code>Class<?></code> stays <code>Class<?></code>.
- * A wildcard within a generic collection is approximated to its upper binding. <code>List<?></code> becomes
- * <code>List<Object></code><p>
- * <p/>
- * Note that <code>Class<T></code> is <emp>not</emp> approximated <code>Class<Object></code>.
- * That would be wrong in any situation. All parametric types that are not type variables, collections or
- * arrays are coarsely approximated to <code>Object.class</code>.
- *
- * @author Paolo Perrotta
- * @return a type where the generic arguments have been replaced by raw classes.
- */
-class ApproximatingTypeEnvironment implements TypeEnvironment {
-
- public Type bind(final Type type) {
- Type result = fineApproximation( type );
- assert TypeUtils.isResolved( result );
- return result;
- }
-
- private Type fineApproximation(final Type type) {
- return new TypeSwitch<Type>() {
- public Type caseWildcardType(WildcardType wildcardType) {
- return wildcardType;
- }
-
- @Override
- public Type caseClass(Class classType) {
- return classType;
- }
-
- @Override
- public Type caseGenericArrayType(GenericArrayType genericArrayType) {
- if ( TypeUtils.isResolved( genericArrayType ) ) {
- return genericArrayType;
- }
- Type componentType = genericArrayType.getGenericComponentType();
- Type boundComponentType = bind( componentType );
- if ( boundComponentType instanceof Class ) {
- return Array.newInstance( (Class) boundComponentType, 0 ).getClass();
- }
- // fall back to coarse approximation, because I found no standard way
- // to instance arrays of a generic type
- return Object[].class;
- }
-
- @Override
- public Type caseParameterizedType(ParameterizedType parameterizedType) {
- if ( TypeUtils.isResolved( parameterizedType ) ) {
- return parameterizedType;
- }
-
- if ( !TypeUtils.isCollection( parameterizedType ) ) {
- return Object.class; // fall back to coarse approximation
- }
-
- Type[] typeArguments = parameterizedType.getActualTypeArguments();
- Type[] approximatedTypeArguments = new Type[typeArguments.length];
- for ( int i = 0; i < typeArguments.length ; i++ ) {
- approximatedTypeArguments[i] = coarseApproximation( typeArguments[i] );
- }
-
- return TypeFactory.createParameterizedType(
- bind( parameterizedType.getRawType() ),
- approximatedTypeArguments,
- parameterizedType.getOwnerType()
- );
- }
-
- @Override
- public Type defaultCase(Type t) {
- return coarseApproximation( t );
- }
- }.doSwitch( type );
- }
-
- private Type coarseApproximation(final Type type) {
- Type result = new TypeSwitch<Type>() {
- public Type caseWildcardType(WildcardType wildcardType) {
- return approximateTo( wildcardType.getUpperBounds() );
- }
-
- @Override
- public Type caseGenericArrayType(GenericArrayType genericArrayType) {
- if ( TypeUtils.isResolved( genericArrayType ) ) {
- return genericArrayType;
- }
- return Object[].class;
- }
-
- @Override
- public Type caseParameterizedType(ParameterizedType parameterizedType) {
- if ( TypeUtils.isResolved( parameterizedType ) ) {
- return parameterizedType;
- }
- return Object.class;
- }
-
- @Override
- public Type caseTypeVariable(TypeVariable typeVariable) {
- return approximateTo( typeVariable.getBounds() );
- }
-
- private Type approximateTo(Type[] bounds) {
- if ( bounds.length != 1 ) {
- return Object.class;
- }
- return coarseApproximation( bounds[0] );
- }
-
- @Override
- public Type defaultCase(Type t) {
- return t;
- }
- }.doSwitch( type );
- assert TypeUtils.isResolved( result );
- return result;
- }
-
- @Override
- public String toString() {
- return "approximated_types";
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/ApproximatingTypeEnvironment.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/ApproximatingTypeEnvironment.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/ApproximatingTypeEnvironment.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/ApproximatingTypeEnvironment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,151 @@
+package org.hibernate.annotations.common.reflection.java.generics;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+
+/**
+ * A <code>TypeEnvironment</code> that approximates the unresolved components of a generic simple
+ * type or collection to their nearest upper binding. The returned type is always fully resolved.
+ * <p/>
+ * The concept of "type approximation" is not really sound in general. This class just does what we need
+ * within the Hibernate Annotations environment. It's more or less a hack. The idea is that certain
+ * types can provide useful information even if they're not fully resolved in the environment. This class
+ * tries to turn those types into the nearest fully resolved type that still carries that information.
+ * <p/>
+ * For example:<br>
+ * <code>T</code> becomes <code>Object</code>.<br>
+ * <code>T extends Foo</code> becomes <code>Foo</code>.<br>
+ * <code>List<T></code> becomes <code>List<Object></code>.<br>
+ * <code>List<T extends Foo></code> becomes <code>List<Foo></code>.<br>
+ * An array of <code>T extends Foo</code> becomes an array of <code>Foo</code>.<p>
+ * <p/>
+ * If a type variable has multiple upper bounds, it will be approximated to <code>Object</code>.
+ * Lower bounds are ignored.<p>
+ * <p/>
+ * Wildcards are generally not approximated. <code>Class<?></code> stays <code>Class<?></code>.
+ * A wildcard within a generic collection is approximated to its upper binding. <code>List<?></code> becomes
+ * <code>List<Object></code><p>
+ * <p/>
+ * Note that <code>Class<T></code> is <emp>not</emp> approximated <code>Class<Object></code>.
+ * That would be wrong in any situation. All parametric types that are not type variables, collections or
+ * arrays are coarsely approximated to <code>Object.class</code>.
+ *
+ * @author Paolo Perrotta
+ * @return a type where the generic arguments have been replaced by raw classes.
+ */
+class ApproximatingTypeEnvironment implements TypeEnvironment {
+
+ public Type bind(final Type type) {
+ Type result = fineApproximation( type );
+ assert TypeUtils.isResolved( result );
+ return result;
+ }
+
+ private Type fineApproximation(final Type type) {
+ return new TypeSwitch<Type>() {
+ public Type caseWildcardType(WildcardType wildcardType) {
+ return wildcardType;
+ }
+
+ @Override
+ public Type caseClass(Class classType) {
+ return classType;
+ }
+
+ @Override
+ public Type caseGenericArrayType(GenericArrayType genericArrayType) {
+ if ( TypeUtils.isResolved( genericArrayType ) ) {
+ return genericArrayType;
+ }
+ Type componentType = genericArrayType.getGenericComponentType();
+ Type boundComponentType = bind( componentType );
+ if ( boundComponentType instanceof Class ) {
+ return Array.newInstance( (Class) boundComponentType, 0 ).getClass();
+ }
+ // fall back to coarse approximation, because I found no standard way
+ // to instance arrays of a generic type
+ return Object[].class;
+ }
+
+ @Override
+ public Type caseParameterizedType(ParameterizedType parameterizedType) {
+ if ( TypeUtils.isResolved( parameterizedType ) ) {
+ return parameterizedType;
+ }
+
+ if ( !TypeUtils.isCollection( parameterizedType ) ) {
+ return Object.class; // fall back to coarse approximation
+ }
+
+ Type[] typeArguments = parameterizedType.getActualTypeArguments();
+ Type[] approximatedTypeArguments = new Type[typeArguments.length];
+ for ( int i = 0; i < typeArguments.length ; i++ ) {
+ approximatedTypeArguments[i] = coarseApproximation( typeArguments[i] );
+ }
+
+ return TypeFactory.createParameterizedType(
+ bind( parameterizedType.getRawType() ),
+ approximatedTypeArguments,
+ parameterizedType.getOwnerType()
+ );
+ }
+
+ @Override
+ public Type defaultCase(Type t) {
+ return coarseApproximation( t );
+ }
+ }.doSwitch( type );
+ }
+
+ private Type coarseApproximation(final Type type) {
+ Type result = new TypeSwitch<Type>() {
+ public Type caseWildcardType(WildcardType wildcardType) {
+ return approximateTo( wildcardType.getUpperBounds() );
+ }
+
+ @Override
+ public Type caseGenericArrayType(GenericArrayType genericArrayType) {
+ if ( TypeUtils.isResolved( genericArrayType ) ) {
+ return genericArrayType;
+ }
+ return Object[].class;
+ }
+
+ @Override
+ public Type caseParameterizedType(ParameterizedType parameterizedType) {
+ if ( TypeUtils.isResolved( parameterizedType ) ) {
+ return parameterizedType;
+ }
+ return Object.class;
+ }
+
+ @Override
+ public Type caseTypeVariable(TypeVariable typeVariable) {
+ return approximateTo( typeVariable.getBounds() );
+ }
+
+ private Type approximateTo(Type[] bounds) {
+ if ( bounds.length != 1 ) {
+ return Object.class;
+ }
+ return coarseApproximation( bounds[0] );
+ }
+
+ @Override
+ public Type defaultCase(Type t) {
+ return t;
+ }
+ }.doSwitch( type );
+ assert TypeUtils.isResolved( result );
+ return result;
+ }
+
+ @Override
+ public String toString() {
+ return "approximated_types";
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/CompoundTypeEnvironment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/CompoundTypeEnvironment.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/CompoundTypeEnvironment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,70 +0,0 @@
-package org.hibernate.annotations.common.reflection.java.generics;
-
-import java.lang.reflect.Type;
-
-/**
- * A composition of two <code>TypeEnvironment</code> functions.
- *
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
-public class CompoundTypeEnvironment implements TypeEnvironment {
-
- private final TypeEnvironment f;
-
- private final TypeEnvironment g;
-
- private final int hashCode;
-
- public static TypeEnvironment create(TypeEnvironment f, TypeEnvironment g) {
- if ( g == IdentityTypeEnvironment.INSTANCE )
- return f;
- if ( f == IdentityTypeEnvironment.INSTANCE )
- return g;
- return new CompoundTypeEnvironment( f, g );
- }
-
- private CompoundTypeEnvironment(TypeEnvironment f, TypeEnvironment g) {
- this.f = f;
- this.g = g;
- hashCode = doHashCode();
- }
-
- public Type bind(Type type) {
- return f.bind( g.bind( type ) );
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( ! ( o instanceof CompoundTypeEnvironment ) ) return false;
-
- final CompoundTypeEnvironment that = (CompoundTypeEnvironment) o;
-
- if ( differentHashCode( that ) ) return false;
-
- if ( !f.equals( that.f ) ) return false;
- return g.equals( that.g );
-
- }
-
- private boolean differentHashCode(CompoundTypeEnvironment that) {
- return hashCode != that.hashCode;
- }
-
- private int doHashCode() {
- int result;
- result = f.hashCode();
- result = 29 * result + g.hashCode();
- return result;
- }
-
- public int hashCode() {
- //cached because the inheritance can be big
- return hashCode;
- }
-
- @Override
- public String toString() {
- return f.toString() + "(" + g.toString() + ")";
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/CompoundTypeEnvironment.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/CompoundTypeEnvironment.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/CompoundTypeEnvironment.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/CompoundTypeEnvironment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,70 @@
+package org.hibernate.annotations.common.reflection.java.generics;
+
+import java.lang.reflect.Type;
+
+/**
+ * A composition of two <code>TypeEnvironment</code> functions.
+ *
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+public class CompoundTypeEnvironment implements TypeEnvironment {
+
+ private final TypeEnvironment f;
+
+ private final TypeEnvironment g;
+
+ private final int hashCode;
+
+ public static TypeEnvironment create(TypeEnvironment f, TypeEnvironment g) {
+ if ( g == IdentityTypeEnvironment.INSTANCE )
+ return f;
+ if ( f == IdentityTypeEnvironment.INSTANCE )
+ return g;
+ return new CompoundTypeEnvironment( f, g );
+ }
+
+ private CompoundTypeEnvironment(TypeEnvironment f, TypeEnvironment g) {
+ this.f = f;
+ this.g = g;
+ hashCode = doHashCode();
+ }
+
+ public Type bind(Type type) {
+ return f.bind( g.bind( type ) );
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( ! ( o instanceof CompoundTypeEnvironment ) ) return false;
+
+ final CompoundTypeEnvironment that = (CompoundTypeEnvironment) o;
+
+ if ( differentHashCode( that ) ) return false;
+
+ if ( !f.equals( that.f ) ) return false;
+ return g.equals( that.g );
+
+ }
+
+ private boolean differentHashCode(CompoundTypeEnvironment that) {
+ return hashCode != that.hashCode;
+ }
+
+ private int doHashCode() {
+ int result;
+ result = f.hashCode();
+ result = 29 * result + g.hashCode();
+ return result;
+ }
+
+ public int hashCode() {
+ //cached because the inheritance can be big
+ return hashCode;
+ }
+
+ @Override
+ public String toString() {
+ return f.toString() + "(" + g.toString() + ")";
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/IdentityTypeEnvironment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/IdentityTypeEnvironment.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/IdentityTypeEnvironment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-package org.hibernate.annotations.common.reflection.java.generics;
-
-import java.lang.reflect.Type;
-
-/**
- * Substitutes a <code>Type</code> for itself.
- *
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
-public class IdentityTypeEnvironment implements TypeEnvironment {
-
- public static final TypeEnvironment INSTANCE = new IdentityTypeEnvironment();
-
- private IdentityTypeEnvironment() {
- }
-
- public Type bind(Type type) {
- return type;
- }
-
- public String toString() {
- return "{}";
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/IdentityTypeEnvironment.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/IdentityTypeEnvironment.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/IdentityTypeEnvironment.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/IdentityTypeEnvironment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+package org.hibernate.annotations.common.reflection.java.generics;
+
+import java.lang.reflect.Type;
+
+/**
+ * Substitutes a <code>Type</code> for itself.
+ *
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+public class IdentityTypeEnvironment implements TypeEnvironment {
+
+ public static final TypeEnvironment INSTANCE = new IdentityTypeEnvironment();
+
+ private IdentityTypeEnvironment() {
+ }
+
+ public Type bind(Type type) {
+ return type;
+ }
+
+ public String toString() {
+ return "{}";
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/SimpleTypeEnvironment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/SimpleTypeEnvironment.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/SimpleTypeEnvironment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,93 +0,0 @@
-package org.hibernate.annotations.common.reflection.java.generics;
-
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.lang.reflect.WildcardType;
-import java.util.HashMap;
-
-/**
- * Binds formal type arguments (typically T, E, etc.) to actual types.
- *
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
-class SimpleTypeEnvironment extends HashMap<Type, Type> implements TypeEnvironment {
-
- private static final long serialVersionUID = 1L;
-
- private final TypeSwitch<Type> substitute = new TypeSwitch<Type>() {
- @Override
- public Type caseClass(Class classType) {
- return classType;
- }
-
- @Override
- public Type caseGenericArrayType(GenericArrayType genericArrayType) {
- Type originalComponentType = genericArrayType.getGenericComponentType();
- Type boundComponentType = bind( originalComponentType );
- // try to keep the original type if possible
- if ( originalComponentType == boundComponentType ) {
- return genericArrayType;
- }
- return TypeFactory.createArrayType( boundComponentType );
- }
-
- @Override
- public Type caseParameterizedType(ParameterizedType parameterizedType) {
- Type[] originalArguments = parameterizedType.getActualTypeArguments();
- Type[] boundArguments = substitute( originalArguments );
- // try to keep the original type if possible
- if ( areSame( originalArguments, boundArguments ) ) {
- return parameterizedType;
- }
- return TypeFactory.createParameterizedType(
- parameterizedType.getRawType(), boundArguments, parameterizedType.getOwnerType()
- );
- }
-
- private boolean areSame(Object[] array1, Object[] array2) {
- if ( array1.length != array2.length ) {
- return false;
- }
- for ( int i = 0; i < array1.length ; i++ ) {
- if ( array1[i] != array2[i] ) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public Type caseTypeVariable(TypeVariable typeVariable) {
- if ( !containsKey( typeVariable )) {
- return typeVariable;
- }
- return get( typeVariable );
- }
-
- @Override
- public Type caseWildcardType(WildcardType wildcardType) {
- return wildcardType;
- }
- };
-
- public SimpleTypeEnvironment(Type[] formalTypeArgs, Type[] actualTypeArgs) {
- for (int i = 0; i < formalTypeArgs.length; i++) {
- put( formalTypeArgs[i], actualTypeArgs[i] );
- }
- }
-
- public Type bind(Type type) {
- return substitute.doSwitch( type );
- }
-
- private Type[] substitute(Type[] types) {
- Type[] substTypes = new Type[types.length];
- for ( int i = 0; i < substTypes.length ; i++ ) {
- substTypes[i] = bind( types[i] );
- }
- return substTypes;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/SimpleTypeEnvironment.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/SimpleTypeEnvironment.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/SimpleTypeEnvironment.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/SimpleTypeEnvironment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,93 @@
+package org.hibernate.annotations.common.reflection.java.generics;
+
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+import java.util.HashMap;
+
+/**
+ * Binds formal type arguments (typically T, E, etc.) to actual types.
+ *
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+class SimpleTypeEnvironment extends HashMap<Type, Type> implements TypeEnvironment {
+
+ private static final long serialVersionUID = 1L;
+
+ private final TypeSwitch<Type> substitute = new TypeSwitch<Type>() {
+ @Override
+ public Type caseClass(Class classType) {
+ return classType;
+ }
+
+ @Override
+ public Type caseGenericArrayType(GenericArrayType genericArrayType) {
+ Type originalComponentType = genericArrayType.getGenericComponentType();
+ Type boundComponentType = bind( originalComponentType );
+ // try to keep the original type if possible
+ if ( originalComponentType == boundComponentType ) {
+ return genericArrayType;
+ }
+ return TypeFactory.createArrayType( boundComponentType );
+ }
+
+ @Override
+ public Type caseParameterizedType(ParameterizedType parameterizedType) {
+ Type[] originalArguments = parameterizedType.getActualTypeArguments();
+ Type[] boundArguments = substitute( originalArguments );
+ // try to keep the original type if possible
+ if ( areSame( originalArguments, boundArguments ) ) {
+ return parameterizedType;
+ }
+ return TypeFactory.createParameterizedType(
+ parameterizedType.getRawType(), boundArguments, parameterizedType.getOwnerType()
+ );
+ }
+
+ private boolean areSame(Object[] array1, Object[] array2) {
+ if ( array1.length != array2.length ) {
+ return false;
+ }
+ for ( int i = 0; i < array1.length ; i++ ) {
+ if ( array1[i] != array2[i] ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public Type caseTypeVariable(TypeVariable typeVariable) {
+ if ( !containsKey( typeVariable )) {
+ return typeVariable;
+ }
+ return get( typeVariable );
+ }
+
+ @Override
+ public Type caseWildcardType(WildcardType wildcardType) {
+ return wildcardType;
+ }
+ };
+
+ public SimpleTypeEnvironment(Type[] formalTypeArgs, Type[] actualTypeArgs) {
+ for (int i = 0; i < formalTypeArgs.length; i++) {
+ put( formalTypeArgs[i], actualTypeArgs[i] );
+ }
+ }
+
+ public Type bind(Type type) {
+ return substitute.doSwitch( type );
+ }
+
+ private Type[] substitute(Type[] types) {
+ Type[] substTypes = new Type[types.length];
+ for ( int i = 0; i < substTypes.length ; i++ ) {
+ substTypes[i] = bind( types[i] );
+ }
+ return substTypes;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironment.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,53 +0,0 @@
-package org.hibernate.annotations.common.reflection.java.generics;
-
-import java.lang.reflect.Type;
-
-/**
- * A typing context that knows how to "resolve" the generic parameters of a
- * <code>Type</code>.
- * <p/>
- * For example:
- * <p/>
- * <p/>
- * <blockquote>
- * <p/>
- * <pre>
- * class Shop<T>{
- * List<T> getCatalog() { ... }
- * }
- * <p/>
- * class Bakery extends Shop<Bread>{}
- * </pre>
- * <p/>
- * </blockquote>
- * <p/>
- * Consider the type returned by method <code>getCatalog()</code>. There are
- * two possible contexts here. In the context of <code>Shop</code>, the type
- * is <code>List<T></code>. In the context of <code>Bakery</code>, the
- * type is <code>List<Bread></code>. Each of these contexts can be
- * represented by a <code>TypeEnvironment</code>.
- *
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
-public interface TypeEnvironment {
-
- /**
- * Binds as many generic components of the given type as possible in this
- * context.
- * <p/>
- * Warning: if the returned <code>Type</code> is a <code>Class</code>,
- * then it's guaranteed to be a regular Java <code>Class</code>. In all
- * other cases, this method might return a custom implementation of some
- * interface that extends <code>Type</code>. Be sure not to mix these
- * objects with Java's implementations of <code>Type</code> to avoid
- * potential identity problems.
- * <p/>
- * This class does not support bindings involving inner classes or
- * upper/lower bounds.
- *
- * @return a type where the generic arguments have been replaced by raw
- * classes whenever this is possible.
- */
- public Type bind(Type type);
-}
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironment.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironment.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironment.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,53 @@
+package org.hibernate.annotations.common.reflection.java.generics;
+
+import java.lang.reflect.Type;
+
+/**
+ * A typing context that knows how to "resolve" the generic parameters of a
+ * <code>Type</code>.
+ * <p/>
+ * For example:
+ * <p/>
+ * <p/>
+ * <blockquote>
+ * <p/>
+ * <pre>
+ * class Shop<T>{
+ * List<T> getCatalog() { ... }
+ * }
+ * <p/>
+ * class Bakery extends Shop<Bread>{}
+ * </pre>
+ * <p/>
+ * </blockquote>
+ * <p/>
+ * Consider the type returned by method <code>getCatalog()</code>. There are
+ * two possible contexts here. In the context of <code>Shop</code>, the type
+ * is <code>List<T></code>. In the context of <code>Bakery</code>, the
+ * type is <code>List<Bread></code>. Each of these contexts can be
+ * represented by a <code>TypeEnvironment</code>.
+ *
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+public interface TypeEnvironment {
+
+ /**
+ * Binds as many generic components of the given type as possible in this
+ * context.
+ * <p/>
+ * Warning: if the returned <code>Type</code> is a <code>Class</code>,
+ * then it's guaranteed to be a regular Java <code>Class</code>. In all
+ * other cases, this method might return a custom implementation of some
+ * interface that extends <code>Type</code>. Be sure not to mix these
+ * objects with Java's implementations of <code>Type</code> to avoid
+ * potential identity problems.
+ * <p/>
+ * This class does not support bindings involving inner classes or
+ * upper/lower bounds.
+ *
+ * @return a type where the generic arguments have been replaced by raw
+ * classes whenever this is possible.
+ */
+ public Type bind(Type type);
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironmentFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironmentFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironmentFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,95 +0,0 @@
-package org.hibernate.annotations.common.reflection.java.generics;
-
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-
-/**
- * Returns the type context for a given <code>Class</code> or <code>ParameterizedType</code>.
- * <p/>
- * Does not support bindings involving inner classes, nor upper/lower bounds.
- *
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
-public class TypeEnvironmentFactory {
-
- /**
- * @return Returns a type environment suitable for resolving types occurring
- * in subclasses of the context class.
- */
- public TypeEnvironment getEnvironment(Class context) {
- if ( context == null ) {
- return IdentityTypeEnvironment.INSTANCE;
- }
- return createEnvironment( context );
- }
-
- public TypeEnvironment getEnvironment(Type context) {
- if ( context == null ) {
- return IdentityTypeEnvironment.INSTANCE;
- }
- return createEnvironment( context );
- }
-
- public TypeEnvironment getEnvironment(Type t, TypeEnvironment context) {
- return CompoundTypeEnvironment.create( getEnvironment(t), context );
- }
-
- public TypeEnvironment toApproximatingEnvironment(TypeEnvironment context) {
- return CompoundTypeEnvironment.create( new ApproximatingTypeEnvironment(), context );
- }
-
- private TypeEnvironment createEnvironment(Type context) {
- return new TypeSwitch<TypeEnvironment>() {
- @Override
- public TypeEnvironment caseClass(Class classType) {
- return CompoundTypeEnvironment.create(
- createSuperTypeEnvironment( classType ),
- getEnvironment( classType.getSuperclass() )
- );
- }
-
- @Override
- public TypeEnvironment caseParameterizedType(ParameterizedType parameterizedType) {
- return createEnvironment( parameterizedType );
- }
-
- @Override
- public TypeEnvironment defaultCase(Type t) {
- throw new IllegalArgumentException( "Invalid type for generating environment: " + t );
- }
- }.doSwitch( context );
- }
-
- private TypeEnvironment createSuperTypeEnvironment(Class clazz) {
- Class superclass = clazz.getSuperclass();
- if ( superclass == null ) {
- return IdentityTypeEnvironment.INSTANCE;
- }
-
- Type[] formalArgs = superclass.getTypeParameters();
- Type genericSuperclass = clazz.getGenericSuperclass();
-
- if ( genericSuperclass instanceof Class ) {
- return IdentityTypeEnvironment.INSTANCE;
- }
-
- if ( genericSuperclass instanceof ParameterizedType ) {
- Type[] actualArgs = ( (ParameterizedType) genericSuperclass ).getActualTypeArguments();
- return new SimpleTypeEnvironment( formalArgs, actualArgs );
- }
-
- throw new AssertionError( "Should be unreachable" );
- }
-
- private TypeEnvironment createEnvironment(ParameterizedType t) {
- Type[] tactuals = t.getActualTypeArguments();
- Type rawType = t.getRawType();
- if ( rawType instanceof Class ) {
- TypeVariable[] tparms = ( (Class) rawType ).getTypeParameters();
- return new SimpleTypeEnvironment( tparms, tactuals );
- }
- return IdentityTypeEnvironment.INSTANCE;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironmentFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironmentFactory.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironmentFactory.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeEnvironmentFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,95 @@
+package org.hibernate.annotations.common.reflection.java.generics;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+
+/**
+ * Returns the type context for a given <code>Class</code> or <code>ParameterizedType</code>.
+ * <p/>
+ * Does not support bindings involving inner classes, nor upper/lower bounds.
+ *
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+public class TypeEnvironmentFactory {
+
+ /**
+ * @return Returns a type environment suitable for resolving types occurring
+ * in subclasses of the context class.
+ */
+ public TypeEnvironment getEnvironment(Class context) {
+ if ( context == null ) {
+ return IdentityTypeEnvironment.INSTANCE;
+ }
+ return createEnvironment( context );
+ }
+
+ public TypeEnvironment getEnvironment(Type context) {
+ if ( context == null ) {
+ return IdentityTypeEnvironment.INSTANCE;
+ }
+ return createEnvironment( context );
+ }
+
+ public TypeEnvironment getEnvironment(Type t, TypeEnvironment context) {
+ return CompoundTypeEnvironment.create( getEnvironment(t), context );
+ }
+
+ public TypeEnvironment toApproximatingEnvironment(TypeEnvironment context) {
+ return CompoundTypeEnvironment.create( new ApproximatingTypeEnvironment(), context );
+ }
+
+ private TypeEnvironment createEnvironment(Type context) {
+ return new TypeSwitch<TypeEnvironment>() {
+ @Override
+ public TypeEnvironment caseClass(Class classType) {
+ return CompoundTypeEnvironment.create(
+ createSuperTypeEnvironment( classType ),
+ getEnvironment( classType.getSuperclass() )
+ );
+ }
+
+ @Override
+ public TypeEnvironment caseParameterizedType(ParameterizedType parameterizedType) {
+ return createEnvironment( parameterizedType );
+ }
+
+ @Override
+ public TypeEnvironment defaultCase(Type t) {
+ throw new IllegalArgumentException( "Invalid type for generating environment: " + t );
+ }
+ }.doSwitch( context );
+ }
+
+ private TypeEnvironment createSuperTypeEnvironment(Class clazz) {
+ Class superclass = clazz.getSuperclass();
+ if ( superclass == null ) {
+ return IdentityTypeEnvironment.INSTANCE;
+ }
+
+ Type[] formalArgs = superclass.getTypeParameters();
+ Type genericSuperclass = clazz.getGenericSuperclass();
+
+ if ( genericSuperclass instanceof Class ) {
+ return IdentityTypeEnvironment.INSTANCE;
+ }
+
+ if ( genericSuperclass instanceof ParameterizedType ) {
+ Type[] actualArgs = ( (ParameterizedType) genericSuperclass ).getActualTypeArguments();
+ return new SimpleTypeEnvironment( formalArgs, actualArgs );
+ }
+
+ throw new AssertionError( "Should be unreachable" );
+ }
+
+ private TypeEnvironment createEnvironment(ParameterizedType t) {
+ Type[] tactuals = t.getActualTypeArguments();
+ Type rawType = t.getRawType();
+ if ( rawType instanceof Class ) {
+ TypeVariable[] tparms = ( (Class) rawType ).getTypeParameters();
+ return new SimpleTypeEnvironment( tparms, tactuals );
+ }
+ return IdentityTypeEnvironment.INSTANCE;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,100 +0,0 @@
-package org.hibernate.annotations.common.reflection.java.generics;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.Arrays;
-
-/**
- * This class instances our own <code>ParameterizedTypes</code> and <code>GenericArrayTypes</code>.
- * These are not supposed to be mixed with Java's implementations - beware of
- * equality/identity problems.
- *
- * @author Paolo Perrotta
- */
-class TypeFactory {
-
- static ParameterizedType createParameterizedType(
- final Type rawType, final Type[] substTypeArgs,
- final Type ownerType
- ) {
- return new ParameterizedType() {
-
- public Type[] getActualTypeArguments() {
- return substTypeArgs;
- }
-
- public Type getRawType() {
- return rawType;
- }
-
- public Type getOwnerType() {
- return ownerType;
- }
-
- @Override
- public boolean equals(Object obj) {
- if ( !( obj instanceof ParameterizedType ) ) {
- return false;
- }
- ParameterizedType other = (ParameterizedType) obj;
- return Arrays.equals( getActualTypeArguments(), other.getActualTypeArguments() )
- && safeEquals( getRawType(), other.getRawType() ) && safeEquals(
- getOwnerType(), other.getOwnerType()
- );
- }
-
- @Override
- public int hashCode() {
- return safeHashCode( getActualTypeArguments() ) ^ safeHashCode( getRawType() ) ^ safeHashCode(
- getOwnerType()
- );
- }
- };
- }
-
- static Type createArrayType(Type componentType) {
- if ( componentType instanceof Class ) {
- return Array.newInstance( (Class) componentType, 0 ).getClass();
- }
- return TypeFactory.createGenericArrayType( componentType );
- }
-
- private static GenericArrayType createGenericArrayType(final Type componentType) {
- return new GenericArrayType() {
-
- public Type getGenericComponentType() {
- return componentType;
- }
-
- @Override
- public boolean equals(Object obj) {
- if ( !( obj instanceof GenericArrayType ) ) {
- return false;
- }
- GenericArrayType other = (GenericArrayType) obj;
- return safeEquals( getGenericComponentType(), other.getGenericComponentType() );
- }
-
- @Override
- public int hashCode() {
- return safeHashCode( getGenericComponentType() );
- }
- };
- }
-
- private static boolean safeEquals(Type t1, Type t2) {
- if ( t1 == null ) {
- return t2 == null;
- }
- return t1.equals( t2 );
- }
-
- private static int safeHashCode(Object o) {
- if ( o == null ) {
- return 1;
- }
- return o.hashCode();
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeFactory.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeFactory.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,100 @@
+package org.hibernate.annotations.common.reflection.java.generics;
+
+import java.lang.reflect.Array;
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+
+/**
+ * This class instances our own <code>ParameterizedTypes</code> and <code>GenericArrayTypes</code>.
+ * These are not supposed to be mixed with Java's implementations - beware of
+ * equality/identity problems.
+ *
+ * @author Paolo Perrotta
+ */
+class TypeFactory {
+
+ static ParameterizedType createParameterizedType(
+ final Type rawType, final Type[] substTypeArgs,
+ final Type ownerType
+ ) {
+ return new ParameterizedType() {
+
+ public Type[] getActualTypeArguments() {
+ return substTypeArgs;
+ }
+
+ public Type getRawType() {
+ return rawType;
+ }
+
+ public Type getOwnerType() {
+ return ownerType;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if ( !( obj instanceof ParameterizedType ) ) {
+ return false;
+ }
+ ParameterizedType other = (ParameterizedType) obj;
+ return Arrays.equals( getActualTypeArguments(), other.getActualTypeArguments() )
+ && safeEquals( getRawType(), other.getRawType() ) && safeEquals(
+ getOwnerType(), other.getOwnerType()
+ );
+ }
+
+ @Override
+ public int hashCode() {
+ return safeHashCode( getActualTypeArguments() ) ^ safeHashCode( getRawType() ) ^ safeHashCode(
+ getOwnerType()
+ );
+ }
+ };
+ }
+
+ static Type createArrayType(Type componentType) {
+ if ( componentType instanceof Class ) {
+ return Array.newInstance( (Class) componentType, 0 ).getClass();
+ }
+ return TypeFactory.createGenericArrayType( componentType );
+ }
+
+ private static GenericArrayType createGenericArrayType(final Type componentType) {
+ return new GenericArrayType() {
+
+ public Type getGenericComponentType() {
+ return componentType;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if ( !( obj instanceof GenericArrayType ) ) {
+ return false;
+ }
+ GenericArrayType other = (GenericArrayType) obj;
+ return safeEquals( getGenericComponentType(), other.getGenericComponentType() );
+ }
+
+ @Override
+ public int hashCode() {
+ return safeHashCode( getGenericComponentType() );
+ }
+ };
+ }
+
+ private static boolean safeEquals(Type t1, Type t2) {
+ if ( t1 == null ) {
+ return t2 == null;
+ }
+ return t1.equals( t2 );
+ }
+
+ private static int safeHashCode(Object o) {
+ if ( o == null ) {
+ return 1;
+ }
+ return o.hashCode();
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeSwitch.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeSwitch.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeSwitch.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,59 +0,0 @@
-package org.hibernate.annotations.common.reflection.java.generics;
-
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.lang.reflect.WildcardType;
-
-/**
- * A visitor for the <code>java.lang.reflect.Type</code> hierarchy.
- *
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
-public class TypeSwitch<T> {
-
- public final T doSwitch(Type type) {
- if ( type instanceof Class ) {
- return caseClass( (Class) type );
- }
- if ( type instanceof GenericArrayType ) {
- return caseGenericArrayType( (GenericArrayType) type );
- }
- if ( type instanceof ParameterizedType ) {
- return caseParameterizedType( (ParameterizedType) type );
- }
- if ( type instanceof TypeVariable ) {
- return caseTypeVariable( (TypeVariable) type );
- }
- if ( type instanceof WildcardType ) {
- return caseWildcardType( (WildcardType) type );
- }
- return defaultCase( type );
- }
-
- public T caseWildcardType(WildcardType wildcardType) {
- return defaultCase( wildcardType );
- }
-
- public T caseTypeVariable(TypeVariable typeVariable) {
- return defaultCase( typeVariable );
- }
-
- public T caseClass(Class classType) {
- return defaultCase( classType );
- }
-
- public T caseGenericArrayType(GenericArrayType genericArrayType) {
- return defaultCase( genericArrayType );
- }
-
- public T caseParameterizedType(ParameterizedType parameterizedType) {
- return defaultCase( parameterizedType );
- }
-
- public T defaultCase(Type t) {
- return null;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeSwitch.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeSwitch.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeSwitch.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeSwitch.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,59 @@
+package org.hibernate.annotations.common.reflection.java.generics;
+
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+
+/**
+ * A visitor for the <code>java.lang.reflect.Type</code> hierarchy.
+ *
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+public class TypeSwitch<T> {
+
+ public final T doSwitch(Type type) {
+ if ( type instanceof Class ) {
+ return caseClass( (Class) type );
+ }
+ if ( type instanceof GenericArrayType ) {
+ return caseGenericArrayType( (GenericArrayType) type );
+ }
+ if ( type instanceof ParameterizedType ) {
+ return caseParameterizedType( (ParameterizedType) type );
+ }
+ if ( type instanceof TypeVariable ) {
+ return caseTypeVariable( (TypeVariable) type );
+ }
+ if ( type instanceof WildcardType ) {
+ return caseWildcardType( (WildcardType) type );
+ }
+ return defaultCase( type );
+ }
+
+ public T caseWildcardType(WildcardType wildcardType) {
+ return defaultCase( wildcardType );
+ }
+
+ public T caseTypeVariable(TypeVariable typeVariable) {
+ return defaultCase( typeVariable );
+ }
+
+ public T caseClass(Class classType) {
+ return defaultCase( classType );
+ }
+
+ public T caseGenericArrayType(GenericArrayType genericArrayType) {
+ return defaultCase( genericArrayType );
+ }
+
+ public T caseParameterizedType(ParameterizedType parameterizedType) {
+ return defaultCase( parameterizedType );
+ }
+
+ public T defaultCase(Type t) {
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeUtils.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeUtils.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeUtils.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,161 +0,0 @@
-package org.hibernate.annotations.common.reflection.java.generics;
-
-import java.lang.reflect.GenericArrayType;
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.lang.reflect.WildcardType;
-import java.util.Collection;
-
-/**
- * @author Paolo Perrotta
- */
-public class TypeUtils {
-
- public static boolean isResolved(Type t) {
- return new TypeSwitch<Boolean>() {
- @Override
- public Boolean caseClass(Class classType) {
- return true;
- }
-
- @Override
- public Boolean caseGenericArrayType(GenericArrayType genericArrayType) {
- return isResolved( genericArrayType.getGenericComponentType() );
- }
-
- @Override
- public Boolean caseParameterizedType(ParameterizedType parameterizedType) {
- Type[] typeArgs = parameterizedType.getActualTypeArguments();
- for ( Type arg : typeArgs ) {
- if ( !isResolved( arg ) ) {
- return false;
- }
- }
- return isResolved( parameterizedType.getRawType() );
- }
-
- @Override
- public Boolean caseTypeVariable(TypeVariable typeVariable) {
- return false;
- }
-
- @Override
- public Boolean caseWildcardType(WildcardType wildcardType) {
- return areResolved( wildcardType.getUpperBounds() ) && areResolved( wildcardType.getLowerBounds() );
- }
- }.doSwitch( t );
- }
-
- private static Boolean areResolved(Type[] types) {
- for ( Type t : types ) {
- if ( !isResolved( t ) ) {
- return false;
- }
- }
- return true;
- }
-
- public static Class<? extends Collection> getCollectionClass(Type type) {
- return new TypeSwitch<Class<? extends Collection>>() {
- @Override
- public Class<? extends Collection> caseClass(Class clazz) {
- return isCollectionClass( clazz ) ? (Class<? extends Collection>) clazz : null;
- }
-
- @Override
- public Class<? extends Collection> caseParameterizedType(ParameterizedType parameterizedType) {
- return getCollectionClass( (Class) parameterizedType.getRawType() );
- }
-
- @Override
- public Class<? extends Collection> caseWildcardType(WildcardType wildcardType) {
- Type[] upperBounds = wildcardType.getUpperBounds();
- if ( upperBounds.length == 0 ) {
- return null;
- }
- return getCollectionClass( upperBounds[0] );
- }
-
- @Override
- public Class<? extends Collection> defaultCase(Type t) {
- return null;
- }
- }.doSwitch( type );
- }
-
- private static boolean isCollectionClass(Class<?> clazz) {
- return clazz == Collection.class
- || clazz == java.util.List.class
- || clazz == java.util.Set.class
- || clazz == java.util.Map.class
- || clazz == java.util.SortedSet.class // extension to the specs
- || clazz == java.util.SortedMap.class; // extension to the specs
- }
-
- public static boolean isSimple(Type type) {
- return new TypeSwitch<Boolean>() {
- @Override
- public Boolean caseClass(Class clazz) {
- return !clazz.isArray() && !isCollectionClass( clazz );// hum probably not fully accurate
- //return classType != void.class;
- }
-
- @Override
- public Boolean caseParameterizedType(ParameterizedType parameterizedType) {
- for ( Type actualTypeArgument : parameterizedType.getActualTypeArguments() ) {
- if ( !isSimple( actualTypeArgument ) ) {
- return false;
- }
- }
- return true;
- }
-
- @Override
- public Boolean caseWildcardType(WildcardType wildcardType) {
- return areSimple( wildcardType.getUpperBounds() ) && areSimple( wildcardType.getLowerBounds() );
- }
-
- @Override
- public Boolean defaultCase(Type t) {
- return false;
- }
- }.doSwitch( type );
- }
-
- private static Boolean areSimple(Type[] types) {
- for ( Type t : types ) {
- if ( !isSimple( t ) ) {
- return false;
- }
- }
- return true;
- }
-
- public static boolean isVoid(Type type) {
- return void.class.equals( type );
- }
-
- public static boolean isArray(Type t) {
- return new TypeSwitch<Boolean>() {
- @Override
- public Boolean caseClass(Class clazz) {
- return clazz.isArray();
- }
-
- @Override
- public Boolean caseGenericArrayType(GenericArrayType genericArrayType) {
- return isSimple( genericArrayType.getGenericComponentType() );
- }
-
- @Override
- public Boolean defaultCase(Type type) {
- return false;
- }
- }.doSwitch( t );
- }
-
- public static boolean isCollection(Type t) {
- return getCollectionClass( t ) != null;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeUtils.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeUtils.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeUtils.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/reflection/java/generics/TypeUtils.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,161 @@
+package org.hibernate.annotations.common.reflection.java.generics;
+
+import java.lang.reflect.GenericArrayType;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.lang.reflect.WildcardType;
+import java.util.Collection;
+
+/**
+ * @author Paolo Perrotta
+ */
+public class TypeUtils {
+
+ public static boolean isResolved(Type t) {
+ return new TypeSwitch<Boolean>() {
+ @Override
+ public Boolean caseClass(Class classType) {
+ return true;
+ }
+
+ @Override
+ public Boolean caseGenericArrayType(GenericArrayType genericArrayType) {
+ return isResolved( genericArrayType.getGenericComponentType() );
+ }
+
+ @Override
+ public Boolean caseParameterizedType(ParameterizedType parameterizedType) {
+ Type[] typeArgs = parameterizedType.getActualTypeArguments();
+ for ( Type arg : typeArgs ) {
+ if ( !isResolved( arg ) ) {
+ return false;
+ }
+ }
+ return isResolved( parameterizedType.getRawType() );
+ }
+
+ @Override
+ public Boolean caseTypeVariable(TypeVariable typeVariable) {
+ return false;
+ }
+
+ @Override
+ public Boolean caseWildcardType(WildcardType wildcardType) {
+ return areResolved( wildcardType.getUpperBounds() ) && areResolved( wildcardType.getLowerBounds() );
+ }
+ }.doSwitch( t );
+ }
+
+ private static Boolean areResolved(Type[] types) {
+ for ( Type t : types ) {
+ if ( !isResolved( t ) ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static Class<? extends Collection> getCollectionClass(Type type) {
+ return new TypeSwitch<Class<? extends Collection>>() {
+ @Override
+ public Class<? extends Collection> caseClass(Class clazz) {
+ return isCollectionClass( clazz ) ? (Class<? extends Collection>) clazz : null;
+ }
+
+ @Override
+ public Class<? extends Collection> caseParameterizedType(ParameterizedType parameterizedType) {
+ return getCollectionClass( (Class) parameterizedType.getRawType() );
+ }
+
+ @Override
+ public Class<? extends Collection> caseWildcardType(WildcardType wildcardType) {
+ Type[] upperBounds = wildcardType.getUpperBounds();
+ if ( upperBounds.length == 0 ) {
+ return null;
+ }
+ return getCollectionClass( upperBounds[0] );
+ }
+
+ @Override
+ public Class<? extends Collection> defaultCase(Type t) {
+ return null;
+ }
+ }.doSwitch( type );
+ }
+
+ private static boolean isCollectionClass(Class<?> clazz) {
+ return clazz == Collection.class
+ || clazz == java.util.List.class
+ || clazz == java.util.Set.class
+ || clazz == java.util.Map.class
+ || clazz == java.util.SortedSet.class // extension to the specs
+ || clazz == java.util.SortedMap.class; // extension to the specs
+ }
+
+ public static boolean isSimple(Type type) {
+ return new TypeSwitch<Boolean>() {
+ @Override
+ public Boolean caseClass(Class clazz) {
+ return !clazz.isArray() && !isCollectionClass( clazz );// hum probably not fully accurate
+ //return classType != void.class;
+ }
+
+ @Override
+ public Boolean caseParameterizedType(ParameterizedType parameterizedType) {
+ for ( Type actualTypeArgument : parameterizedType.getActualTypeArguments() ) {
+ if ( !isSimple( actualTypeArgument ) ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ @Override
+ public Boolean caseWildcardType(WildcardType wildcardType) {
+ return areSimple( wildcardType.getUpperBounds() ) && areSimple( wildcardType.getLowerBounds() );
+ }
+
+ @Override
+ public Boolean defaultCase(Type t) {
+ return false;
+ }
+ }.doSwitch( type );
+ }
+
+ private static Boolean areSimple(Type[] types) {
+ for ( Type t : types ) {
+ if ( !isSimple( t ) ) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ public static boolean isVoid(Type type) {
+ return void.class.equals( type );
+ }
+
+ public static boolean isArray(Type t) {
+ return new TypeSwitch<Boolean>() {
+ @Override
+ public Boolean caseClass(Class clazz) {
+ return clazz.isArray();
+ }
+
+ @Override
+ public Boolean caseGenericArrayType(GenericArrayType genericArrayType) {
+ return isSimple( genericArrayType.getGenericComponentType() );
+ }
+
+ @Override
+ public Boolean defaultCase(Type type) {
+ return false;
+ }
+ }.doSwitch( t );
+ }
+
+ public static boolean isCollection(Type t) {
+ return getCollectionClass( t ) != null;
+ }
+}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util)
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/ReflectHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/ReflectHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/ReflectHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,122 +0,0 @@
-//$Id: $
-package org.hibernate.annotations.common.util;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Member;
-import java.lang.reflect.Modifier;
-
-import org.hibernate.annotations.common.AssertionFailure;
-
-/**
- * @author Emmanuel Bernard
- */
-
-public final class ReflectHelper {
-
- private static final Class[] OBJECT = new Class[] { Object.class };
- private static final Method OBJECT_EQUALS;
- private static final Class[] NO_PARAM = new Class[] { };
-
- private static final Method OBJECT_HASHCODE;
- static {
- Method eq;
- Method hash;
- try {
- eq = Object.class.getMethod("equals", OBJECT);
- hash = Object.class.getMethod("hashCode", NO_PARAM);
- }
- catch (Exception e) {
- throw new AssertionFailure("Could not find Object.equals() or Object.hashCode()", e);
- }
- OBJECT_EQUALS = eq;
- OBJECT_HASHCODE = hash;
- }
-
- public static boolean overridesEquals(Class clazz) {
- Method equals;
- try {
- equals = clazz.getMethod("equals", OBJECT);
- }
- catch (NoSuchMethodException nsme) {
- return false; //its an interface so we can't really tell anything...
- }
- return !OBJECT_EQUALS.equals(equals);
- }
-
- public static boolean overridesHashCode(Class clazz) {
- Method hashCode;
- try {
- hashCode = clazz.getMethod("hashCode", NO_PARAM);
- }
- catch (NoSuchMethodException nsme) {
- return false; //its an interface so we can't really tell anything...
- }
- return !OBJECT_HASHCODE.equals(hashCode);
- }
-
- public static Class classForName(String name) throws ClassNotFoundException {
- try {
- ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
- if ( contextClassLoader != null ) {
- return contextClassLoader.loadClass(name);
- }
- }
- catch ( Throwable t ) {
- }
- return Class.forName( name );
- }
-
- public static Class classForName(String name, Class caller) throws ClassNotFoundException {
- try {
- ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
- if ( contextClassLoader != null ) {
- return contextClassLoader.loadClass( name );
- }
- }
- catch ( Throwable e ) {
- }
- return Class.forName( name, true, caller.getClassLoader() );
- }
-
- public static boolean isPublic(Class clazz, Member member) {
- return Modifier.isPublic( member.getModifiers() ) && Modifier.isPublic( clazz.getModifiers() );
- }
-
- public static Object getConstantValue(String name) {
- Class clazz;
- try {
- clazz = classForName( StringHelper.qualifier( name ) );
- }
- catch ( Throwable t ) {
- return null;
- }
- try {
- return clazz.getField( StringHelper.unqualify( name ) ).get(null);
- }
- catch ( Throwable t ) {
- return null;
- }
- }
-
- public static boolean isAbstractClass(Class clazz) {
- int modifier = clazz.getModifiers();
- return Modifier.isAbstract(modifier) || Modifier.isInterface(modifier);
- }
-
- public static boolean isFinalClass(Class clazz) {
- return Modifier.isFinal( clazz.getModifiers() );
- }
-
- public static Method getMethod(Class clazz, Method method) {
- try {
- return clazz.getMethod( method.getName(), method.getParameterTypes() );
- }
- catch (Exception e) {
- return null;
- }
- }
-
- private ReflectHelper() {}
-
-}
-
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/ReflectHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/ReflectHelper.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/ReflectHelper.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/ReflectHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,122 @@
+//$Id: $
+package org.hibernate.annotations.common.util;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.Member;
+import java.lang.reflect.Modifier;
+
+import org.hibernate.annotations.common.AssertionFailure;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+public final class ReflectHelper {
+
+ private static final Class[] OBJECT = new Class[] { Object.class };
+ private static final Method OBJECT_EQUALS;
+ private static final Class[] NO_PARAM = new Class[] { };
+
+ private static final Method OBJECT_HASHCODE;
+ static {
+ Method eq;
+ Method hash;
+ try {
+ eq = Object.class.getMethod("equals", OBJECT);
+ hash = Object.class.getMethod("hashCode", NO_PARAM);
+ }
+ catch (Exception e) {
+ throw new AssertionFailure("Could not find Object.equals() or Object.hashCode()", e);
+ }
+ OBJECT_EQUALS = eq;
+ OBJECT_HASHCODE = hash;
+ }
+
+ public static boolean overridesEquals(Class clazz) {
+ Method equals;
+ try {
+ equals = clazz.getMethod("equals", OBJECT);
+ }
+ catch (NoSuchMethodException nsme) {
+ return false; //its an interface so we can't really tell anything...
+ }
+ return !OBJECT_EQUALS.equals(equals);
+ }
+
+ public static boolean overridesHashCode(Class clazz) {
+ Method hashCode;
+ try {
+ hashCode = clazz.getMethod("hashCode", NO_PARAM);
+ }
+ catch (NoSuchMethodException nsme) {
+ return false; //its an interface so we can't really tell anything...
+ }
+ return !OBJECT_HASHCODE.equals(hashCode);
+ }
+
+ public static Class classForName(String name) throws ClassNotFoundException {
+ try {
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ if ( contextClassLoader != null ) {
+ return contextClassLoader.loadClass(name);
+ }
+ }
+ catch ( Throwable t ) {
+ }
+ return Class.forName( name );
+ }
+
+ public static Class classForName(String name, Class caller) throws ClassNotFoundException {
+ try {
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ if ( contextClassLoader != null ) {
+ return contextClassLoader.loadClass( name );
+ }
+ }
+ catch ( Throwable e ) {
+ }
+ return Class.forName( name, true, caller.getClassLoader() );
+ }
+
+ public static boolean isPublic(Class clazz, Member member) {
+ return Modifier.isPublic( member.getModifiers() ) && Modifier.isPublic( clazz.getModifiers() );
+ }
+
+ public static Object getConstantValue(String name) {
+ Class clazz;
+ try {
+ clazz = classForName( StringHelper.qualifier( name ) );
+ }
+ catch ( Throwable t ) {
+ return null;
+ }
+ try {
+ return clazz.getField( StringHelper.unqualify( name ) ).get(null);
+ }
+ catch ( Throwable t ) {
+ return null;
+ }
+ }
+
+ public static boolean isAbstractClass(Class clazz) {
+ int modifier = clazz.getModifiers();
+ return Modifier.isAbstract(modifier) || Modifier.isInterface(modifier);
+ }
+
+ public static boolean isFinalClass(Class clazz) {
+ return Modifier.isFinal( clazz.getModifiers() );
+ }
+
+ public static Method getMethod(Class clazz, Method method) {
+ try {
+ return clazz.getMethod( method.getName(), method.getParameterTypes() );
+ }
+ catch (Exception e) {
+ return null;
+ }
+ }
+
+ private ReflectHelper() {}
+
+}
+
Deleted: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/StringHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/StringHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/StringHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,431 +0,0 @@
-//$Id: $
-package org.hibernate.annotations.common.util;
-
-import java.util.Iterator;
-import java.util.StringTokenizer;
-import java.util.ArrayList;
-import java.util.Collection;
-
-/**
- * @author Emmanuel Bernard
- */
-//TODO copy from Hibernate Core, mutualization?
-public final class StringHelper {
-
- private static final int ALIAS_TRUNCATE_LENGTH = 10;
- public static final String WHITESPACE = " \n\r\f\t";
-
- private StringHelper() { /* static methods only - hide constructor */
- }
-
- /*public static boolean containsDigits(String string) {
- for ( int i=0; i<string.length(); i++ ) {
- if ( Character.isDigit( string.charAt(i) ) ) return true;
- }
- return false;
- }*/
-
- public static int lastIndexOfLetter(String string) {
- for ( int i=0; i<string.length(); i++ ) {
- char character = string.charAt(i);
- if ( !Character.isLetter(character) /*&& !('_'==character)*/ ) return i-1;
- }
- return string.length()-1;
- }
-
- public static String join(String seperator, String[] strings) {
- int length = strings.length;
- if ( length == 0 ) return "";
- StringBuffer buf = new StringBuffer( length * strings[0].length() )
- .append( strings[0] );
- for ( int i = 1; i < length; i++ ) {
- buf.append( seperator ).append( strings[i] );
- }
- return buf.toString();
- }
-
- public static String join(String seperator, Iterator objects) {
- StringBuffer buf = new StringBuffer();
- if ( objects.hasNext() ) buf.append( objects.next() );
- while ( objects.hasNext() ) {
- buf.append( seperator ).append( objects.next() );
- }
- return buf.toString();
- }
-
- public static String[] add(String[] x, String sep, String[] y) {
- String[] result = new String[x.length];
- for ( int i = 0; i < x.length; i++ ) {
- result[i] = x[i] + sep + y[i];
- }
- return result;
- }
-
- public static String repeat(String string, int times) {
- StringBuffer buf = new StringBuffer( string.length() * times );
- for ( int i = 0; i < times; i++ ) buf.append( string );
- return buf.toString();
- }
-
-
- public static String replace(String template, String placeholder, String replacement) {
- return replace( template, placeholder, replacement, false );
- }
-
- public static String[] replace(String templates[], String placeholder, String replacement) {
- String[] result = new String[templates.length];
- for ( int i =0; i<templates.length; i++ ) {
- result[i] = replace( templates[i], placeholder, replacement );;
- }
- return result;
- }
-
- public static String replace(String template, String placeholder, String replacement, boolean wholeWords) {
- int loc = template == null ? -1 : template.indexOf( placeholder );
- if ( loc < 0 ) {
- return template;
- }
- else {
- final boolean actuallyReplace = !wholeWords ||
- loc + placeholder.length() == template.length() ||
- !Character.isJavaIdentifierPart( template.charAt( loc + placeholder.length() ) );
- String actualReplacement = actuallyReplace ? replacement : placeholder;
- return new StringBuffer( template.substring( 0, loc ) )
- .append( actualReplacement )
- .append( replace( template.substring( loc + placeholder.length() ),
- placeholder,
- replacement,
- wholeWords ) ).toString();
- }
- }
-
-
- public static String replaceOnce(String template, String placeholder, String replacement) {
- int loc = template == null ? -1 : template.indexOf( placeholder );
- if ( loc < 0 ) {
- return template;
- }
- else {
- return new StringBuffer( template.substring( 0, loc ) )
- .append( replacement )
- .append( template.substring( loc + placeholder.length() ) )
- .toString();
- }
- }
-
-
- public static String[] split(String seperators, String list) {
- return split( seperators, list, false );
- }
-
- public static String[] split(String seperators, String list, boolean include) {
- StringTokenizer tokens = new StringTokenizer( list, seperators, include );
- String[] result = new String[ tokens.countTokens() ];
- int i = 0;
- while ( tokens.hasMoreTokens() ) {
- result[i++] = tokens.nextToken();
- }
- return result;
- }
-
- 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 );
- }
-
- public static String[] suffix(String[] columns, String suffix) {
- if ( suffix == null ) return columns;
- String[] qualified = new String[columns.length];
- for ( int i = 0; i < columns.length; i++ ) {
- qualified[i] = suffix( columns[i], suffix );
- }
- return qualified;
- }
-
- private static String suffix(String name, String suffix) {
- return ( suffix == null ) ? name : name + suffix;
- }
-
- public static String root(String qualifiedName) {
- int loc = qualifiedName.indexOf( "." );
- return ( loc < 0 ) ? qualifiedName : qualifiedName.substring( 0, loc );
- }
-
- public static String unroot(String qualifiedName) {
- int loc = qualifiedName.indexOf( "." );
- return ( loc < 0 ) ? qualifiedName : qualifiedName.substring( loc+1, qualifiedName.length() );
- }
-
- public static boolean booleanValue(String tfString) {
- String trimmed = tfString.trim().toLowerCase();
- return trimmed.equals( "true" ) || trimmed.equals( "t" );
- }
-
- public static String toString(Object[] array) {
- int len = array.length;
- if ( len == 0 ) return "";
- StringBuffer buf = new StringBuffer( len * 12 );
- for ( int i = 0; i < len - 1; i++ ) {
- buf.append( array[i] ).append(", ");
- }
- return buf.append( array[len - 1] ).toString();
- }
-
- public static String[] multiply(String string, Iterator placeholders, Iterator replacements) {
- String[] result = new String[]{string};
- while ( placeholders.hasNext() ) {
- result = multiply( result, ( String ) placeholders.next(), ( String[] ) replacements.next() );
- }
- return result;
- }
-
- private static String[] multiply(String[] strings, String placeholder, String[] replacements) {
- String[] results = new String[replacements.length * strings.length];
- int n = 0;
- for ( int i = 0; i < replacements.length; i++ ) {
- for ( int j = 0; j < strings.length; j++ ) {
- results[n++] = replaceOnce( strings[j], placeholder, replacements[i] );
- }
- }
- return results;
- }
-
- public static int countUnquoted(String string, char character) {
- if ( '\'' == character ) {
- throw new IllegalArgumentException( "Unquoted count of quotes is invalid" );
- }
- if (string == null)
- return 0;
- // Impl note: takes advantage of the fact that an escpaed single quote
- // embedded within a quote-block can really be handled as two seperate
- // quote-blocks for the purposes of this method...
- int count = 0;
- int stringLength = string.length();
- boolean inQuote = false;
- for ( int indx = 0; indx < stringLength; indx++ ) {
- char c = string.charAt( indx );
- if ( inQuote ) {
- if ( '\'' == c ) {
- inQuote = false;
- }
- }
- else if ( '\'' == c ) {
- inQuote = true;
- }
- else if ( c == character ) {
- count++;
- }
- }
- return count;
- }
-
- public static int[] locateUnquoted(String string, char character) {
- if ( '\'' == character ) {
- throw new IllegalArgumentException( "Unquoted count of quotes is invalid" );
- }
- if (string == null) {
- return new int[0];
- }
-
- ArrayList locations = new ArrayList( 20 );
-
- // Impl note: takes advantage of the fact that an escpaed single quote
- // embedded within a quote-block can really be handled as two seperate
- // quote-blocks for the purposes of this method...
- int stringLength = string.length();
- boolean inQuote = false;
- for ( int indx = 0; indx < stringLength; indx++ ) {
- char c = string.charAt( indx );
- if ( inQuote ) {
- if ( '\'' == c ) {
- inQuote = false;
- }
- }
- else if ( '\'' == c ) {
- inQuote = true;
- }
- else if ( c == character ) {
- locations.add( new Integer( indx ) );
- }
- }
- return toIntArray( locations );
- }
-
- public static boolean isNotEmpty(String string) {
- return string != null && string.length() > 0;
- }
-
- public static boolean isEmpty(String string) {
- return string == null || string.length() == 0;
- }
-
- public static String qualify(String prefix, String name) {
- if ( name == null || prefix == null ) {
- throw new NullPointerException();
- }
- return new StringBuffer( prefix.length() + name.length() + 1 )
- .append(prefix)
- .append('.')
- .append(name)
- .toString();
- }
-
- public static String[] qualify(String prefix, String[] names) {
- if ( prefix == null ) return names;
- int len = names.length;
- String[] qualified = new String[len];
- for ( int i = 0; i < len; i++ ) {
- qualified[i] = qualify( prefix, names[i] );
- }
- return qualified;
- }
-
- public static int firstIndexOfChar(String sqlString, String string, int startindex) {
- int matchAt = -1;
- for ( int i = 0; i < string.length(); i++ ) {
- int curMatch = sqlString.indexOf( string.charAt( i ), startindex );
- if ( curMatch >= 0 ) {
- if ( matchAt == -1 ) { // first time we find match!
- matchAt = curMatch;
- }
- else {
- matchAt = Math.min( matchAt, curMatch );
- }
- }
- }
- return matchAt;
- }
-
- public static String truncate(String string, int length) {
- if ( string.length() <= length ) {
- return string;
- }
- else {
- return string.substring( 0, length );
- }
- }
-
- public static String generateAlias(String description) {
- return generateAliasRoot(description) + '_';
- }
-
- /**
- * Generate a nice alias for the given class name or collection role
- * name and unique integer. Subclasses of Loader do <em>not</em> have
- * to use aliases of this form.
- * @return an alias of the form <tt>foo1_</tt>
- */
- public static String generateAlias(String description, int unique) {
- return generateAliasRoot(description) +
- Integer.toString(unique) +
- '_';
- }
-
- /**
- * Generates a root alias by truncating the "root name" defined by
- * the incoming decription and removing/modifying any non-valid
- * alias characters.
- *
- * @param description The root name from which to generate a root alias.
- * @return The generated root alias.
- */
- private static String generateAliasRoot(String description) {
- String result = truncate( unqualifyEntityName(description), ALIAS_TRUNCATE_LENGTH )
- .toLowerCase()
- .replace( '/', '_' ) // entityNames may now include slashes for the representations
- .replace( '$', '_' ); //classname may be an inner class
- result = cleanAlias( result );
- if ( Character.isDigit( result.charAt(result.length()-1) ) ) {
- return result + "x"; //ick!
- }
- else {
- return result;
- }
- }
-
- /**
- * Clean the generated alias by removing any non-alpha characters from the
- * beginning.
- *
- * @param alias The generated alias to be cleaned.
- * @return The cleaned alias, stripped of any leading non-alpha characters.
- */
- private static String cleanAlias(String alias) {
- char[] chars = alias.toCharArray();
- // short cut check...
- if ( !Character.isLetter( chars[0] ) ) {
- for ( int i = 1; i < chars.length; i++ ) {
- // as soon as we encounter our first letter, return the substring
- // from that position
- if ( Character.isLetter( chars[i] ) ) {
- return alias.substring( i );
- }
- }
- }
- return alias;
- }
-
- public static String unqualifyEntityName(String entityName) {
- String result = unqualify(entityName);
- int slashPos = result.indexOf( '/' );
- if ( slashPos > 0 ) {
- result = result.substring( 0, slashPos - 1 );
- }
- return result;
- }
-
- public static String toUpperCase(String str) {
- return str==null ? null : str.toUpperCase();
- }
-
- public static String toLowerCase(String str) {
- return str==null ? null : str.toLowerCase();
- }
-
- public static String moveAndToBeginning(String filter) {
- if ( filter.trim().length()>0 ){
- filter += " and ";
- if ( filter.startsWith(" and ") ) filter = filter.substring(4);
- }
- return filter;
- }
-
- //TODO Copy from ArrayHelper in Hibernate Core
- public static int[] toIntArray(Collection coll) {
- Iterator iter = coll.iterator();
- int[] arr = new int[ coll.size() ];
- int i=0;
- while( iter.hasNext() ) {
- arr[i++] = ( (Integer) iter.next() ).intValue();
- }
- return arr;
- }
-
- public static boolean isQuoted(String name) {
- return name != null && name.length() != 0 && name.charAt( 0 ) == '`';
- }
-
- public static String quote(String name) {
- if ( name == null || name.length() == 0 || isQuoted( name ) ) {
- return name;
- }
- else {
- return new StringBuilder( name.length() + 2 ).append('`').append( name ).append( '`' ).toString();
- }
- }
-
- public static String unquote(String name) {
- if ( isQuoted( name ) ) {
- return name.substring( 1, name.length() - 1 );
- }
- else {
- return name;
- }
- }
-
-}
Copied: trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/StringHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/StringHelper.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/StringHelper.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/java/org/hibernate/annotations/common/util/StringHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,431 @@
+//$Id: $
+package org.hibernate.annotations.common.util;
+
+import java.util.Iterator;
+import java.util.StringTokenizer;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+//TODO copy from Hibernate Core, mutualization?
+public final class StringHelper {
+
+ private static final int ALIAS_TRUNCATE_LENGTH = 10;
+ public static final String WHITESPACE = " \n\r\f\t";
+
+ private StringHelper() { /* static methods only - hide constructor */
+ }
+
+ /*public static boolean containsDigits(String string) {
+ for ( int i=0; i<string.length(); i++ ) {
+ if ( Character.isDigit( string.charAt(i) ) ) return true;
+ }
+ return false;
+ }*/
+
+ public static int lastIndexOfLetter(String string) {
+ for ( int i=0; i<string.length(); i++ ) {
+ char character = string.charAt(i);
+ if ( !Character.isLetter(character) /*&& !('_'==character)*/ ) return i-1;
+ }
+ return string.length()-1;
+ }
+
+ public static String join(String seperator, String[] strings) {
+ int length = strings.length;
+ if ( length == 0 ) return "";
+ StringBuffer buf = new StringBuffer( length * strings[0].length() )
+ .append( strings[0] );
+ for ( int i = 1; i < length; i++ ) {
+ buf.append( seperator ).append( strings[i] );
+ }
+ return buf.toString();
+ }
+
+ public static String join(String seperator, Iterator objects) {
+ StringBuffer buf = new StringBuffer();
+ if ( objects.hasNext() ) buf.append( objects.next() );
+ while ( objects.hasNext() ) {
+ buf.append( seperator ).append( objects.next() );
+ }
+ return buf.toString();
+ }
+
+ public static String[] add(String[] x, String sep, String[] y) {
+ String[] result = new String[x.length];
+ for ( int i = 0; i < x.length; i++ ) {
+ result[i] = x[i] + sep + y[i];
+ }
+ return result;
+ }
+
+ public static String repeat(String string, int times) {
+ StringBuffer buf = new StringBuffer( string.length() * times );
+ for ( int i = 0; i < times; i++ ) buf.append( string );
+ return buf.toString();
+ }
+
+
+ public static String replace(String template, String placeholder, String replacement) {
+ return replace( template, placeholder, replacement, false );
+ }
+
+ public static String[] replace(String templates[], String placeholder, String replacement) {
+ String[] result = new String[templates.length];
+ for ( int i =0; i<templates.length; i++ ) {
+ result[i] = replace( templates[i], placeholder, replacement );;
+ }
+ return result;
+ }
+
+ public static String replace(String template, String placeholder, String replacement, boolean wholeWords) {
+ int loc = template == null ? -1 : template.indexOf( placeholder );
+ if ( loc < 0 ) {
+ return template;
+ }
+ else {
+ final boolean actuallyReplace = !wholeWords ||
+ loc + placeholder.length() == template.length() ||
+ !Character.isJavaIdentifierPart( template.charAt( loc + placeholder.length() ) );
+ String actualReplacement = actuallyReplace ? replacement : placeholder;
+ return new StringBuffer( template.substring( 0, loc ) )
+ .append( actualReplacement )
+ .append( replace( template.substring( loc + placeholder.length() ),
+ placeholder,
+ replacement,
+ wholeWords ) ).toString();
+ }
+ }
+
+
+ public static String replaceOnce(String template, String placeholder, String replacement) {
+ int loc = template == null ? -1 : template.indexOf( placeholder );
+ if ( loc < 0 ) {
+ return template;
+ }
+ else {
+ return new StringBuffer( template.substring( 0, loc ) )
+ .append( replacement )
+ .append( template.substring( loc + placeholder.length() ) )
+ .toString();
+ }
+ }
+
+
+ public static String[] split(String seperators, String list) {
+ return split( seperators, list, false );
+ }
+
+ public static String[] split(String seperators, String list, boolean include) {
+ StringTokenizer tokens = new StringTokenizer( list, seperators, include );
+ String[] result = new String[ tokens.countTokens() ];
+ int i = 0;
+ while ( tokens.hasMoreTokens() ) {
+ result[i++] = tokens.nextToken();
+ }
+ return result;
+ }
+
+ 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 );
+ }
+
+ public static String[] suffix(String[] columns, String suffix) {
+ if ( suffix == null ) return columns;
+ String[] qualified = new String[columns.length];
+ for ( int i = 0; i < columns.length; i++ ) {
+ qualified[i] = suffix( columns[i], suffix );
+ }
+ return qualified;
+ }
+
+ private static String suffix(String name, String suffix) {
+ return ( suffix == null ) ? name : name + suffix;
+ }
+
+ public static String root(String qualifiedName) {
+ int loc = qualifiedName.indexOf( "." );
+ return ( loc < 0 ) ? qualifiedName : qualifiedName.substring( 0, loc );
+ }
+
+ public static String unroot(String qualifiedName) {
+ int loc = qualifiedName.indexOf( "." );
+ return ( loc < 0 ) ? qualifiedName : qualifiedName.substring( loc+1, qualifiedName.length() );
+ }
+
+ public static boolean booleanValue(String tfString) {
+ String trimmed = tfString.trim().toLowerCase();
+ return trimmed.equals( "true" ) || trimmed.equals( "t" );
+ }
+
+ public static String toString(Object[] array) {
+ int len = array.length;
+ if ( len == 0 ) return "";
+ StringBuffer buf = new StringBuffer( len * 12 );
+ for ( int i = 0; i < len - 1; i++ ) {
+ buf.append( array[i] ).append(", ");
+ }
+ return buf.append( array[len - 1] ).toString();
+ }
+
+ public static String[] multiply(String string, Iterator placeholders, Iterator replacements) {
+ String[] result = new String[]{string};
+ while ( placeholders.hasNext() ) {
+ result = multiply( result, ( String ) placeholders.next(), ( String[] ) replacements.next() );
+ }
+ return result;
+ }
+
+ private static String[] multiply(String[] strings, String placeholder, String[] replacements) {
+ String[] results = new String[replacements.length * strings.length];
+ int n = 0;
+ for ( int i = 0; i < replacements.length; i++ ) {
+ for ( int j = 0; j < strings.length; j++ ) {
+ results[n++] = replaceOnce( strings[j], placeholder, replacements[i] );
+ }
+ }
+ return results;
+ }
+
+ public static int countUnquoted(String string, char character) {
+ if ( '\'' == character ) {
+ throw new IllegalArgumentException( "Unquoted count of quotes is invalid" );
+ }
+ if (string == null)
+ return 0;
+ // Impl note: takes advantage of the fact that an escpaed single quote
+ // embedded within a quote-block can really be handled as two seperate
+ // quote-blocks for the purposes of this method...
+ int count = 0;
+ int stringLength = string.length();
+ boolean inQuote = false;
+ for ( int indx = 0; indx < stringLength; indx++ ) {
+ char c = string.charAt( indx );
+ if ( inQuote ) {
+ if ( '\'' == c ) {
+ inQuote = false;
+ }
+ }
+ else if ( '\'' == c ) {
+ inQuote = true;
+ }
+ else if ( c == character ) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ public static int[] locateUnquoted(String string, char character) {
+ if ( '\'' == character ) {
+ throw new IllegalArgumentException( "Unquoted count of quotes is invalid" );
+ }
+ if (string == null) {
+ return new int[0];
+ }
+
+ ArrayList locations = new ArrayList( 20 );
+
+ // Impl note: takes advantage of the fact that an escpaed single quote
+ // embedded within a quote-block can really be handled as two seperate
+ // quote-blocks for the purposes of this method...
+ int stringLength = string.length();
+ boolean inQuote = false;
+ for ( int indx = 0; indx < stringLength; indx++ ) {
+ char c = string.charAt( indx );
+ if ( inQuote ) {
+ if ( '\'' == c ) {
+ inQuote = false;
+ }
+ }
+ else if ( '\'' == c ) {
+ inQuote = true;
+ }
+ else if ( c == character ) {
+ locations.add( new Integer( indx ) );
+ }
+ }
+ return toIntArray( locations );
+ }
+
+ public static boolean isNotEmpty(String string) {
+ return string != null && string.length() > 0;
+ }
+
+ public static boolean isEmpty(String string) {
+ return string == null || string.length() == 0;
+ }
+
+ public static String qualify(String prefix, String name) {
+ if ( name == null || prefix == null ) {
+ throw new NullPointerException();
+ }
+ return new StringBuffer( prefix.length() + name.length() + 1 )
+ .append(prefix)
+ .append('.')
+ .append(name)
+ .toString();
+ }
+
+ public static String[] qualify(String prefix, String[] names) {
+ if ( prefix == null ) return names;
+ int len = names.length;
+ String[] qualified = new String[len];
+ for ( int i = 0; i < len; i++ ) {
+ qualified[i] = qualify( prefix, names[i] );
+ }
+ return qualified;
+ }
+
+ public static int firstIndexOfChar(String sqlString, String string, int startindex) {
+ int matchAt = -1;
+ for ( int i = 0; i < string.length(); i++ ) {
+ int curMatch = sqlString.indexOf( string.charAt( i ), startindex );
+ if ( curMatch >= 0 ) {
+ if ( matchAt == -1 ) { // first time we find match!
+ matchAt = curMatch;
+ }
+ else {
+ matchAt = Math.min( matchAt, curMatch );
+ }
+ }
+ }
+ return matchAt;
+ }
+
+ public static String truncate(String string, int length) {
+ if ( string.length() <= length ) {
+ return string;
+ }
+ else {
+ return string.substring( 0, length );
+ }
+ }
+
+ public static String generateAlias(String description) {
+ return generateAliasRoot(description) + '_';
+ }
+
+ /**
+ * Generate a nice alias for the given class name or collection role
+ * name and unique integer. Subclasses of Loader do <em>not</em> have
+ * to use aliases of this form.
+ * @return an alias of the form <tt>foo1_</tt>
+ */
+ public static String generateAlias(String description, int unique) {
+ return generateAliasRoot(description) +
+ Integer.toString(unique) +
+ '_';
+ }
+
+ /**
+ * Generates a root alias by truncating the "root name" defined by
+ * the incoming decription and removing/modifying any non-valid
+ * alias characters.
+ *
+ * @param description The root name from which to generate a root alias.
+ * @return The generated root alias.
+ */
+ private static String generateAliasRoot(String description) {
+ String result = truncate( unqualifyEntityName(description), ALIAS_TRUNCATE_LENGTH )
+ .toLowerCase()
+ .replace( '/', '_' ) // entityNames may now include slashes for the representations
+ .replace( '$', '_' ); //classname may be an inner class
+ result = cleanAlias( result );
+ if ( Character.isDigit( result.charAt(result.length()-1) ) ) {
+ return result + "x"; //ick!
+ }
+ else {
+ return result;
+ }
+ }
+
+ /**
+ * Clean the generated alias by removing any non-alpha characters from the
+ * beginning.
+ *
+ * @param alias The generated alias to be cleaned.
+ * @return The cleaned alias, stripped of any leading non-alpha characters.
+ */
+ private static String cleanAlias(String alias) {
+ char[] chars = alias.toCharArray();
+ // short cut check...
+ if ( !Character.isLetter( chars[0] ) ) {
+ for ( int i = 1; i < chars.length; i++ ) {
+ // as soon as we encounter our first letter, return the substring
+ // from that position
+ if ( Character.isLetter( chars[i] ) ) {
+ return alias.substring( i );
+ }
+ }
+ }
+ return alias;
+ }
+
+ public static String unqualifyEntityName(String entityName) {
+ String result = unqualify(entityName);
+ int slashPos = result.indexOf( '/' );
+ if ( slashPos > 0 ) {
+ result = result.substring( 0, slashPos - 1 );
+ }
+ return result;
+ }
+
+ public static String toUpperCase(String str) {
+ return str==null ? null : str.toUpperCase();
+ }
+
+ public static String toLowerCase(String str) {
+ return str==null ? null : str.toLowerCase();
+ }
+
+ public static String moveAndToBeginning(String filter) {
+ if ( filter.trim().length()>0 ){
+ filter += " and ";
+ if ( filter.startsWith(" and ") ) filter = filter.substring(4);
+ }
+ return filter;
+ }
+
+ //TODO Copy from ArrayHelper in Hibernate Core
+ public static int[] toIntArray(Collection coll) {
+ Iterator iter = coll.iterator();
+ int[] arr = new int[ coll.size() ];
+ int i=0;
+ while( iter.hasNext() ) {
+ arr[i++] = ( (Integer) iter.next() ).intValue();
+ }
+ return arr;
+ }
+
+ public static boolean isQuoted(String name) {
+ return name != null && name.length() != 0 && name.charAt( 0 ) == '`';
+ }
+
+ public static String quote(String name) {
+ if ( name == null || name.length() == 0 || isQuoted( name ) ) {
+ return name;
+ }
+ else {
+ return new StringBuilder( name.length() + 2 ).append('`').append( name ).append( '`' ).toString();
+ }
+ }
+
+ public static String unquote(String name) {
+ if ( isQuoted( name ) ) {
+ return name.substring( 1, name.length() - 1 );
+ }
+ else {
+ return name;
+ }
+ }
+
+}
Copied: trunk/HibernateExt/commons-annotations/src/test (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test)
Copied: trunk/HibernateExt/commons-annotations/src/test/org (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org)
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate)
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations)
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common)
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test)
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory)
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationFactoryTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationFactoryTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationFactoryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-package org.hibernate.annotations.common.test.annotationfactory;
-
-import junit.framework.TestCase;
-import org.hibernate.annotations.common.annotationfactory.AnnotationDescriptor;
-import org.hibernate.annotations.common.annotationfactory.AnnotationFactory;
-
-/**
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-public class AnnotationFactoryTest extends TestCase {
-
- public void testCreatesProxyInstancesOfAnnotations() {
- // Step 1: define the annotation descriptor.
- //
- // What you can/must do:
- // - You can assign values with the wrong type to the annotation
- // elements. The code won't check that the values are the same
- // types as required by the Annotation interface. You will
- // end up receiving an exception when you access the value, though.
- // - You must assign a value in the descriptor to all the elements
- // defined in the Annotation interface that do not have a default
- // value.
- // - You can ignore in the descriptor those Annotation elements that
- // have default values, or you can set them to override their
- // default values.
- AnnotationDescriptor descriptor = new AnnotationDescriptor( TestAnnotation.class );
- descriptor.setValue( "booleanElement", false );
- descriptor.setValue( "stringElement", "abc" );
- descriptor.setValue( "someOtherElement", "xyz" );
-
- // Step 2: create the annotation from its descriptor.
- TestAnnotation ann = AnnotationFactory.create( descriptor );
-
- assertFalse( ann.booleanElement() );
- assertEquals( "abc", ann.stringElement() );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationFactoryTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationFactoryTest.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationFactoryTest.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationFactoryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+package org.hibernate.annotations.common.test.annotationfactory;
+
+import junit.framework.TestCase;
+import org.hibernate.annotations.common.annotationfactory.AnnotationDescriptor;
+import org.hibernate.annotations.common.annotationfactory.AnnotationFactory;
+
+/**
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+public class AnnotationFactoryTest extends TestCase {
+
+ public void testCreatesProxyInstancesOfAnnotations() {
+ // Step 1: define the annotation descriptor.
+ //
+ // What you can/must do:
+ // - You can assign values with the wrong type to the annotation
+ // elements. The code won't check that the values are the same
+ // types as required by the Annotation interface. You will
+ // end up receiving an exception when you access the value, though.
+ // - You must assign a value in the descriptor to all the elements
+ // defined in the Annotation interface that do not have a default
+ // value.
+ // - You can ignore in the descriptor those Annotation elements that
+ // have default values, or you can set them to override their
+ // default values.
+ AnnotationDescriptor descriptor = new AnnotationDescriptor( TestAnnotation.class );
+ descriptor.setValue( "booleanElement", false );
+ descriptor.setValue( "stringElement", "abc" );
+ descriptor.setValue( "someOtherElement", "xyz" );
+
+ // Step 2: create the annotation from its descriptor.
+ TestAnnotation ann = AnnotationFactory.create( descriptor );
+
+ assertFalse( ann.booleanElement() );
+ assertEquals( "abc", ann.stringElement() );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationProxyTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationProxyTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationProxyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,108 +0,0 @@
-package org.hibernate.annotations.common.test.annotationfactory;
-
-import java.lang.reflect.Method;
-
-import junit.framework.TestCase;
-import org.hibernate.annotations.common.annotationfactory.AnnotationDescriptor;
-import org.hibernate.annotations.common.annotationfactory.AnnotationProxy;
-
-/**
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
-public class AnnotationProxyTest extends TestCase {
-
- private AnnotationProxy ann;
- private AnnotationDescriptor descriptor;
-
- public void setUp() {
- descriptor = new AnnotationDescriptor( TestAnnotation.class );
- descriptor.setValue( "stringElement", "x" );
- descriptor.setValue( "booleanElement", false );
- descriptor.setValue( "someOtherElement", "y" );
- ann = new AnnotationProxy( descriptor );
- }
-
- public void testConstructionFailsIfYouDoNotAssignValuesToAllTheElementsWithoutADefault() {
- try {
- AnnotationDescriptor desc = new AnnotationDescriptor( TestAnnotation.class );
- desc.setValue( "stringElement", "x" );
- desc.setValue( "booleanElement", false );
- new AnnotationProxy( desc );
- fail();
- }
- catch (Exception e) {
- assertEquals( "No value provided for someOtherElement", e.getMessage() );
- }
- }
-
- public void testConstructionFailsIfYouDefineElementsThatAreNotInTheAnnotationInterface() {
- try {
- AnnotationDescriptor desc = new AnnotationDescriptor( Deprecated.class );
- desc.setValue( "wrongElement", "xxx" );
- new AnnotationProxy( desc );
- fail();
- }
- catch (Exception e) {
- assertTrue( e.getMessage().contains( "unknown elements" ) );
- }
- }
-
- public void testSupportsGenericCallsToAllElements() throws Throwable {
- assertEquals( "x", invoke( ann, "stringElement" ) );
- assertFalse( (Boolean) invoke( ann, "booleanElement" ) );
- }
-
- public void testPretendsThatItHasTheGivenType() {
- assertSame( TestAnnotation.class, ann.annotationType() );
- }
-
- public void testItsToStringConformsToTheJavaAnnotationDocumentation() throws Throwable {
- String expectedString = "@org.hibernate.annotations.common.test.annotationfactory.TestAnnotation(booleanElement=false, elementWithDefault=abc, someOtherElement=y, stringElement=x)";
- assertEquals( expectedString, invoke( ann, "toString" ) );
- }
-
- public void testSupportsGenericCallsToMethods() throws Throwable {
- assertEquals( ann.annotationType(), invoke( ann, "annotationType" ) );
- assertEquals( ann.toString(), invoke( ann, "toString" ) );
- }
-
- public void testThrowsARuntimeExceptionIfYouUseAnElementWhichIsNotInTheAnnotationInterface() {
- AnnotationDescriptor elements = new AnnotationDescriptor( TestAnnotation.class );
- elements.setValue( "anOddElement", "x" );
- try {
- new AnnotationProxy( elements );
- fail();
- }
- catch (RuntimeException e) {
- }
- }
-
- public void testUsesTheDefaultValueForUndefinedElementsWhenAvailable() throws Throwable {
- assertEquals( "abc", invoke( ann, "elementWithDefault" ) );
- }
-
- public void testThrowsANoSuchMethodExceptionWhenAccessingAnUndefinedMethod() throws Throwable {
- try {
- invoke( ann, "anElementThatDoesNotExist" );
- fail();
- }
- catch (NoSuchMethodException e) {
- }
- try {
- invoke( ann, "anOddElement", "arg1", "arg2" );
- fail();
- }
- catch (NoSuchMethodException e) {
- }
- }
-
- private Object invoke(AnnotationProxy proxy, String methodName, Object... args) throws Throwable {
- Class[] parameterTypes = new Class[args.length];
- for ( int i = 0; i < args.length ; i++ ) {
- parameterTypes[i] = args[i].getClass();
- }
- Method method = TestAnnotation.class.getMethod( methodName, parameterTypes );
- return proxy.invoke( proxy, method, parameterTypes );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationProxyTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationProxyTest.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationProxyTest.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/AnnotationProxyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,108 @@
+package org.hibernate.annotations.common.test.annotationfactory;
+
+import java.lang.reflect.Method;
+
+import junit.framework.TestCase;
+import org.hibernate.annotations.common.annotationfactory.AnnotationDescriptor;
+import org.hibernate.annotations.common.annotationfactory.AnnotationProxy;
+
+/**
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+public class AnnotationProxyTest extends TestCase {
+
+ private AnnotationProxy ann;
+ private AnnotationDescriptor descriptor;
+
+ public void setUp() {
+ descriptor = new AnnotationDescriptor( TestAnnotation.class );
+ descriptor.setValue( "stringElement", "x" );
+ descriptor.setValue( "booleanElement", false );
+ descriptor.setValue( "someOtherElement", "y" );
+ ann = new AnnotationProxy( descriptor );
+ }
+
+ public void testConstructionFailsIfYouDoNotAssignValuesToAllTheElementsWithoutADefault() {
+ try {
+ AnnotationDescriptor desc = new AnnotationDescriptor( TestAnnotation.class );
+ desc.setValue( "stringElement", "x" );
+ desc.setValue( "booleanElement", false );
+ new AnnotationProxy( desc );
+ fail();
+ }
+ catch (Exception e) {
+ assertEquals( "No value provided for someOtherElement", e.getMessage() );
+ }
+ }
+
+ public void testConstructionFailsIfYouDefineElementsThatAreNotInTheAnnotationInterface() {
+ try {
+ AnnotationDescriptor desc = new AnnotationDescriptor( Deprecated.class );
+ desc.setValue( "wrongElement", "xxx" );
+ new AnnotationProxy( desc );
+ fail();
+ }
+ catch (Exception e) {
+ assertTrue( e.getMessage().contains( "unknown elements" ) );
+ }
+ }
+
+ public void testSupportsGenericCallsToAllElements() throws Throwable {
+ assertEquals( "x", invoke( ann, "stringElement" ) );
+ assertFalse( (Boolean) invoke( ann, "booleanElement" ) );
+ }
+
+ public void testPretendsThatItHasTheGivenType() {
+ assertSame( TestAnnotation.class, ann.annotationType() );
+ }
+
+ public void testItsToStringConformsToTheJavaAnnotationDocumentation() throws Throwable {
+ String expectedString = "@org.hibernate.annotations.common.test.annotationfactory.TestAnnotation(booleanElement=false, elementWithDefault=abc, someOtherElement=y, stringElement=x)";
+ assertEquals( expectedString, invoke( ann, "toString" ) );
+ }
+
+ public void testSupportsGenericCallsToMethods() throws Throwable {
+ assertEquals( ann.annotationType(), invoke( ann, "annotationType" ) );
+ assertEquals( ann.toString(), invoke( ann, "toString" ) );
+ }
+
+ public void testThrowsARuntimeExceptionIfYouUseAnElementWhichIsNotInTheAnnotationInterface() {
+ AnnotationDescriptor elements = new AnnotationDescriptor( TestAnnotation.class );
+ elements.setValue( "anOddElement", "x" );
+ try {
+ new AnnotationProxy( elements );
+ fail();
+ }
+ catch (RuntimeException e) {
+ }
+ }
+
+ public void testUsesTheDefaultValueForUndefinedElementsWhenAvailable() throws Throwable {
+ assertEquals( "abc", invoke( ann, "elementWithDefault" ) );
+ }
+
+ public void testThrowsANoSuchMethodExceptionWhenAccessingAnUndefinedMethod() throws Throwable {
+ try {
+ invoke( ann, "anElementThatDoesNotExist" );
+ fail();
+ }
+ catch (NoSuchMethodException e) {
+ }
+ try {
+ invoke( ann, "anOddElement", "arg1", "arg2" );
+ fail();
+ }
+ catch (NoSuchMethodException e) {
+ }
+ }
+
+ private Object invoke(AnnotationProxy proxy, String methodName, Object... args) throws Throwable {
+ Class[] parameterTypes = new Class[args.length];
+ for ( int i = 0; i < args.length ; i++ ) {
+ parameterTypes[i] = args[i].getClass();
+ }
+ Method method = TestAnnotation.class.getMethod( methodName, parameterTypes );
+ return proxy.invoke( proxy, method, parameterTypes );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/TestAnnotation.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/TestAnnotation.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/TestAnnotation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-/**
- *
- */
-package org.hibernate.annotations.common.test.annotationfactory;
-
-/**
- * @author Paolo Perrotta
- * @author Davide Marchignoli
- */
- at interface TestAnnotation {
- String stringElement();
-
- String elementWithDefault() default "abc";
-
- boolean booleanElement();
-
- String someOtherElement();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/TestAnnotation.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/TestAnnotation.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/TestAnnotation.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/annotationfactory/TestAnnotation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+/**
+ *
+ */
+package org.hibernate.annotations.common.test.annotationfactory;
+
+/**
+ * @author Paolo Perrotta
+ * @author Davide Marchignoli
+ */
+ at interface TestAnnotation {
+ String stringElement();
+
+ String elementWithDefault() default "abc";
+
+ boolean booleanElement();
+
+ String someOtherElement();
+}
\ No newline at end of file
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection)
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java)
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Foo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Foo.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Foo.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java;
-
-import java.util.List;
-
-/**
- * @author Paolo Perrotta
- */
- at TestAnnotation(name = "xyz")
-public class Foo extends FooFather {
-
- public static Integer staticField;
-
- Integer fieldProperty;
-
- public List<String> getCollectionProperty() {
- return null;
- }
-
- @TestAnnotation(name = "xyz")
- public Integer getMethodProperty() {
- return null;
- }
-
- public int getPrimitiveProperty() {
- return 0;
- }
-
- public static Integer getStaticThing() {
- return null;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Foo.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Foo.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Foo.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Foo.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+package org.hibernate.annotations.common.test.reflection.java;
+
+import java.util.List;
+
+/**
+ * @author Paolo Perrotta
+ */
+ at TestAnnotation(name = "xyz")
+public class Foo extends FooFather {
+
+ public static Integer staticField;
+
+ Integer fieldProperty;
+
+ public List<String> getCollectionProperty() {
+ return null;
+ }
+
+ @TestAnnotation(name = "xyz")
+ public Integer getMethodProperty() {
+ return null;
+ }
+
+ public int getPrimitiveProperty() {
+ return 0;
+ }
+
+ public static Integer getStaticThing() {
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/FooFather.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/FooFather.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/FooFather.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java;
-
-import java.util.List;
-
-/**
- * @author Paolo Perrotta
- */
-public abstract class FooFather<T> {
-
- public Integer fatherField;
-
- public Boolean isFatherMethod() {
- return null;
- }
-
- public T getParameterizedProperty() {
- return null;
- }
-
- public List<T> getParameterizedCollectionProperty() {
- return null;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/FooFather.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/FooFather.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/FooFather.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/FooFather.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+package org.hibernate.annotations.common.test.reflection.java;
+
+import java.util.List;
+
+/**
+ * @author Paolo Perrotta
+ */
+public abstract class FooFather<T> {
+
+ public Integer fatherField;
+
+ public Boolean isFatherMethod() {
+ return null;
+ }
+
+ public T getParameterizedProperty() {
+ return null;
+ }
+
+ public List<T> getParameterizedCollectionProperty() {
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaReflectionManagerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaReflectionManagerTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaReflectionManagerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java;
-
-import com.sun.org.apache.xpath.internal.operations.Number;
-import junit.framework.TestCase;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-
-/**
- * @author Paolo Perrotta
- */
-public class JavaReflectionManagerTest extends TestCase {
-
- private ReflectionManager rm = new JavaReflectionManager();
-
- public void testReturnsAnXClassThatWrapsTheGivenClass() {
- XClass xc = rm.toXClass( Integer.class );
- assertEquals( "java.lang.Integer", xc.getName() );
- }
-
- public void testReturnsSameXClassForSameClass() {
- XClass xc1 = rm.toXClass( void.class );
- XClass xc2 = rm.toXClass( void.class );
- assertSame( xc2, xc1 );
- }
-
- public void testReturnsNullForANullClass() {
- assertNull( rm.toXClass( null ) );
- }
-
- public void testComparesXClassesWithClasses() {
- XClass xc = rm.toXClass( Integer.class );
- assertTrue( rm.equals( xc, Integer.class ) );
- }
-
- public void testSupportsNullsInComparisons() {
- XClass xc = rm.toXClass( Integer.class );
- assertFalse( rm.equals( null, Number.class ) );
- assertFalse( rm.equals( xc, null ) );
- assertTrue( rm.equals( null, null ) );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaReflectionManagerTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaReflectionManagerTest.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaReflectionManagerTest.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaReflectionManagerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+package org.hibernate.annotations.common.test.reflection.java;
+
+import com.sun.org.apache.xpath.internal.operations.Number;
+import junit.framework.TestCase;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+
+/**
+ * @author Paolo Perrotta
+ */
+public class JavaReflectionManagerTest extends TestCase {
+
+ private ReflectionManager rm = new JavaReflectionManager();
+
+ public void testReturnsAnXClassThatWrapsTheGivenClass() {
+ XClass xc = rm.toXClass( Integer.class );
+ assertEquals( "java.lang.Integer", xc.getName() );
+ }
+
+ public void testReturnsSameXClassForSameClass() {
+ XClass xc1 = rm.toXClass( void.class );
+ XClass xc2 = rm.toXClass( void.class );
+ assertSame( xc2, xc1 );
+ }
+
+ public void testReturnsNullForANullClass() {
+ assertNull( rm.toXClass( null ) );
+ }
+
+ public void testComparesXClassesWithClasses() {
+ XClass xc = rm.toXClass( Integer.class );
+ assertTrue( rm.equals( xc, Integer.class ) );
+ }
+
+ public void testSupportsNullsInComparisons() {
+ XClass xc = rm.toXClass( Integer.class );
+ assertFalse( rm.equals( null, Number.class ) );
+ assertFalse( rm.equals( xc, null ) );
+ assertTrue( rm.equals( null, null ) );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXClassTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXClassTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXClassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,90 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java;
-
-import java.io.Serializable;
-import java.util.List;
-
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XAnnotatedElement;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-import org.hibernate.annotations.common.test.reflection.java.generics.Dad;
-import org.hibernate.annotations.common.test.reflection.java.generics.Grandpa;
-import org.hibernate.annotations.common.test.reflection.java.generics.Language;
-import org.hibernate.annotations.common.test.reflection.java.generics.Son;
-
-/**
- * @author Paolo Perrotta
- */
-public class JavaXClassTest extends XAnnotatedElementTestCase {
- ReflectionManager factory = new JavaReflectionManager();
-
- XClass fatherAsSeenFromSon = factory.toXClass( Son.class ).getSuperclass();
- XClass grandpa = factory.toXClass( Grandpa.class );
-
- public void testHasAPointOfViewClass() {
- // Since Dad is an Entity, getting it through Son.getSuperclass() gives
- // us a view of properties from Dad with Son as a point of view.
- XClass sameView = factory.toXClass( Son.class ).getSuperclass();
- XClass differentView = factory.toXClass( Dad.class );
- assertSame( "Should be the same instance: same owner", sameView, fatherAsSeenFromSon );
- assertNotSame( "Should be a different instance: different owner", differentView, fatherAsSeenFromSon );
- assertEquals( ".equals() should show equality", sameView, differentView );
- }
-
- public void testHasAName() {
- assertSame( "org.hibernate.annotations.common.test.reflection.java.generics.Dad", fatherAsSeenFromSon.getName() );
- }
-
- public void testHasASuperclass() {
- assertEquals( grandpa, fatherAsSeenFromSon.getSuperclass() );
- }
-
- public void testSuperSuperClass() {
- assertEquals( factory.toXClass( Object.class ), grandpa.getSuperclass() );
- assertEquals( null, grandpa.getSuperclass().getSuperclass() );
- }
-
- public void testHasInterfaces() {
- XClass[] interfaces = fatherAsSeenFromSon.getSuperclass().getInterfaces();
- assertEquals( 2, interfaces.length );
- assertTrue( factory.equals( interfaces[0], Serializable.class ) );
- assertTrue( factory.equals( interfaces[1], Language.class ) );
- }
-
- public void testCanBeAssignableFromAnotherXClass() {
- assertFalse( fatherAsSeenFromSon.isAssignableFrom( grandpa ) );
- assertTrue( grandpa.isAssignableFrom( fatherAsSeenFromSon ) );
- }
-
- public void testExtractsPublicFieldsAsProperties() {
- List<XProperty> fieldProperties = fatherAsSeenFromSon.getDeclaredProperties( "field" );
- assertEquals( 1, fieldProperties.size() );
- }
-
- public void testExtractsPublicMethodsAsProperties() {
- List<XProperty> methodProperties = fatherAsSeenFromSon.getDeclaredProperties( "property" );
- assertEquals( 7, methodProperties.size() );
- }
-
- public void testCanBeAbstract() {
- assertFalse( fatherAsSeenFromSon.isAbstract() );
- assertTrue( factory.toXClass( Grandpa.class ).isAbstract() );
- }
-
- public void testCanBeAPrimitive() {
- assertFalse( fatherAsSeenFromSon.isPrimitive() );
- assertTrue( factory.toXClass( int.class ).isPrimitive() );
- }
-
- public void testCanBeAnEnum() {
- assertFalse( fatherAsSeenFromSon.isEnum() );
- assertTrue( factory.toXClass( Sex.class ).isEnum() );
- }
-
- @Override
- protected XAnnotatedElement getConcreteInstance() {
- return factory.toXClass( Dad.class );
- }
-
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXClassTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXClassTest.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXClassTest.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXClassTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,90 @@
+package org.hibernate.annotations.common.test.reflection.java;
+
+import java.io.Serializable;
+import java.util.List;
+
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XAnnotatedElement;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+import org.hibernate.annotations.common.test.reflection.java.generics.Dad;
+import org.hibernate.annotations.common.test.reflection.java.generics.Grandpa;
+import org.hibernate.annotations.common.test.reflection.java.generics.Language;
+import org.hibernate.annotations.common.test.reflection.java.generics.Son;
+
+/**
+ * @author Paolo Perrotta
+ */
+public class JavaXClassTest extends XAnnotatedElementTestCase {
+ ReflectionManager factory = new JavaReflectionManager();
+
+ XClass fatherAsSeenFromSon = factory.toXClass( Son.class ).getSuperclass();
+ XClass grandpa = factory.toXClass( Grandpa.class );
+
+ public void testHasAPointOfViewClass() {
+ // Since Dad is an Entity, getting it through Son.getSuperclass() gives
+ // us a view of properties from Dad with Son as a point of view.
+ XClass sameView = factory.toXClass( Son.class ).getSuperclass();
+ XClass differentView = factory.toXClass( Dad.class );
+ assertSame( "Should be the same instance: same owner", sameView, fatherAsSeenFromSon );
+ assertNotSame( "Should be a different instance: different owner", differentView, fatherAsSeenFromSon );
+ assertEquals( ".equals() should show equality", sameView, differentView );
+ }
+
+ public void testHasAName() {
+ assertSame( "org.hibernate.annotations.common.test.reflection.java.generics.Dad", fatherAsSeenFromSon.getName() );
+ }
+
+ public void testHasASuperclass() {
+ assertEquals( grandpa, fatherAsSeenFromSon.getSuperclass() );
+ }
+
+ public void testSuperSuperClass() {
+ assertEquals( factory.toXClass( Object.class ), grandpa.getSuperclass() );
+ assertEquals( null, grandpa.getSuperclass().getSuperclass() );
+ }
+
+ public void testHasInterfaces() {
+ XClass[] interfaces = fatherAsSeenFromSon.getSuperclass().getInterfaces();
+ assertEquals( 2, interfaces.length );
+ assertTrue( factory.equals( interfaces[0], Serializable.class ) );
+ assertTrue( factory.equals( interfaces[1], Language.class ) );
+ }
+
+ public void testCanBeAssignableFromAnotherXClass() {
+ assertFalse( fatherAsSeenFromSon.isAssignableFrom( grandpa ) );
+ assertTrue( grandpa.isAssignableFrom( fatherAsSeenFromSon ) );
+ }
+
+ public void testExtractsPublicFieldsAsProperties() {
+ List<XProperty> fieldProperties = fatherAsSeenFromSon.getDeclaredProperties( "field" );
+ assertEquals( 1, fieldProperties.size() );
+ }
+
+ public void testExtractsPublicMethodsAsProperties() {
+ List<XProperty> methodProperties = fatherAsSeenFromSon.getDeclaredProperties( "property" );
+ assertEquals( 7, methodProperties.size() );
+ }
+
+ public void testCanBeAbstract() {
+ assertFalse( fatherAsSeenFromSon.isAbstract() );
+ assertTrue( factory.toXClass( Grandpa.class ).isAbstract() );
+ }
+
+ public void testCanBeAPrimitive() {
+ assertFalse( fatherAsSeenFromSon.isPrimitive() );
+ assertTrue( factory.toXClass( int.class ).isPrimitive() );
+ }
+
+ public void testCanBeAnEnum() {
+ assertFalse( fatherAsSeenFromSon.isEnum() );
+ assertTrue( factory.toXClass( Sex.class ).isEnum() );
+ }
+
+ @Override
+ protected XAnnotatedElement getConcreteInstance() {
+ return factory.toXClass( Dad.class );
+ }
+
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXPropertyTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXPropertyTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXPropertyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,163 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java;
-
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-
-import junit.framework.AssertionFailedError;
-import org.hibernate.annotations.common.reflection.Filter;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-import org.hibernate.annotations.common.test.reflection.java.generics.Dad;
-import org.hibernate.annotations.common.test.reflection.java.generics.Son;
-
-/**
- * @author Paolo Perrotta
- */
-public class JavaXPropertyTest extends XAnnotatedElementTestCase {
-
- private ReflectionManager factory = new JavaReflectionManager();
-
- private XClass dadAsSeenFromItself = factory.toXClass( Dad.class );
-
- private XClass dadAsSeenFromSon = factory.toXClass( Son.class ).getSuperclass();
-
- public void testFollowsJavaBeansConventionsForPropertyNames() throws Exception {
- List<String> properties = new LinkedList<String>();
- properties.add( "collectionProperty" );
- properties.add( "methodProperty" );
- properties.add( "primitiveProperty" );
- properties.add( "primitiveArrayProperty" );
- properties.add( "arrayProperty" );
- properties.add( "propertyStartingWithIs" );
- properties.add( "language" );
- List<XProperty> methodProperties = dadAsSeenFromSon.getDeclaredProperties( "property" );
- assertEquals( properties.size(), methodProperties.size() );
- for ( XProperty member : methodProperties ) {
- assertTrue( properties.contains( member.getName() ) );
- }
- List<XProperty> fieldProperties = dadAsSeenFromSon.getDeclaredProperties( "field" );
- XProperty field = fieldProperties.get( 0 );
- assertEquals( "fieldProperty", field.getName() );
- }
-
- public void testReturnsPropertiesWithUnresolvedParametricTypes() {
- assertEquals( 7, dadAsSeenFromItself.getDeclaredProperties( "property" ).size() );
- }
-
- public void testKnowsWhetherItsTypeIsFullyResolved() {
- XProperty notFullyResolvedProperty = getPropertyNamed_from(
- "collectionProperty", dadAsSeenFromItself
- .getDeclaredProperties( "property" )
- );
- assertFalse( notFullyResolvedProperty.isTypeResolved() );
- XProperty fullyResolvedProperty = getPropertyNamed_from(
- "collectionProperty", dadAsSeenFromSon
- .getDeclaredProperties( "property" )
- );
- assertTrue( fullyResolvedProperty.isTypeResolved() );
- }
-
- public void testCanBeFiltered() {
- assertEquals(
- 8, dadAsSeenFromSon.getDeclaredProperties(
- "property", new Filter() {
-
- public boolean returnStatic() {
- return true;
- }
-
- public boolean returnTransient() {
- return false;
- }
- }
- ).size()
- );
- }
-
- public void testCanBeASimpleType() {
- List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "field" );
- XProperty p = getPropertyNamed_from( "fieldProperty", declaredProperties );
- assertTrue( factory.equals( p.getType(), String.class ) );
- assertTrue( factory.equals( p.getElementClass(), String.class ) );
- assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) );
- assertNull( p.getCollectionClass() );
- assertFalse( p.isArray() );
- assertFalse( p.isCollection() );
- }
-
- public void testResolveInterfaceType() {
- List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" );
- XProperty p = getPropertyNamed_from( "language", declaredProperties );
- assertTrue( factory.equals( p.getType(), String.class ) );
- assertTrue( factory.equals( p.getElementClass(), String.class ) );
- assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) );
- assertNull( p.getCollectionClass() );
- assertNull( p.getMapKey() );
- assertFalse( p.isArray() );
- assertFalse( p.isCollection() );
- }
-
- public void testCanBeAnArray() {
- List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" );
- XProperty p = getPropertyNamed_from( "arrayProperty", declaredProperties );
- assertTrue( factory.equals( p.getType(), String[].class ) );
- assertTrue( factory.equals( p.getElementClass(), String.class ) );
- assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) );
- assertNull( p.getCollectionClass() );
- assertNull( p.getMapKey() );
- assertTrue( p.isArray() );
- assertFalse( p.isCollection() );
- }
-
- public void testCanBeAnArrayOfPrimitives() {
- List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" );
- XProperty p = getPropertyNamed_from( "primitiveArrayProperty", declaredProperties );
- assertTrue( factory.equals( p.getType(), int[].class ) );
- assertTrue( factory.equals( p.getElementClass(), int.class ) );
- assertTrue( factory.equals( p.getClassOrElementClass(), int.class ) );
- assertNull( p.getCollectionClass() );
- assertNull( p.getMapKey() );
- assertTrue( p.isArray() );
- assertFalse( p.isCollection() );
- }
-
- public void testCanBeACollection() {
- List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" );
- XProperty p = getPropertyNamed_from( "collectionProperty", declaredProperties );
- assertTrue( factory.equals( p.getType(), Map.class ) );
- assertTrue( factory.equals( p.getElementClass(), String.class ) );
- assertTrue( factory.equals( p.getClassOrElementClass(), Map.class ) );
- assertTrue( factory.equals( p.getMapKey(), Double.class ) );
- assertEquals( Map.class, p.getCollectionClass() );
- assertFalse( p.isArray() );
- assertTrue( p.isCollection() );
- }
-
- private XProperty getPropertyNamed_from(String name, List<XProperty> properties) {
- for ( XProperty p : properties ) {
- if ( p.getName().equals( name ) ) {
- return p;
- }
- }
- throw new AssertionFailedError( "No property '" + name + "' found" );
- }
-
- public void testSupportsMethodsStartingWithIs() throws Exception {
- assertEquals( "methodProperty", getConcreteInstance().getName() );
- }
-
- @Override
- protected XProperty getConcreteInstance() {
- XClass xClass = factory.toXClass( Dad.class );
- List<XProperty> properties = xClass.getDeclaredProperties( "property" );
- for ( XProperty p : properties ) {
- if ( p.getName().equals( "methodProperty" ) ) {
- return p;
- }
- }
- throw new AssertionFailedError( "Cannot find Foo.getMethodProperty()" );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXPropertyTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXPropertyTest.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXPropertyTest.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/JavaXPropertyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,163 @@
+package org.hibernate.annotations.common.test.reflection.java;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+
+import junit.framework.AssertionFailedError;
+import org.hibernate.annotations.common.reflection.Filter;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+import org.hibernate.annotations.common.test.reflection.java.generics.Dad;
+import org.hibernate.annotations.common.test.reflection.java.generics.Son;
+
+/**
+ * @author Paolo Perrotta
+ */
+public class JavaXPropertyTest extends XAnnotatedElementTestCase {
+
+ private ReflectionManager factory = new JavaReflectionManager();
+
+ private XClass dadAsSeenFromItself = factory.toXClass( Dad.class );
+
+ private XClass dadAsSeenFromSon = factory.toXClass( Son.class ).getSuperclass();
+
+ public void testFollowsJavaBeansConventionsForPropertyNames() throws Exception {
+ List<String> properties = new LinkedList<String>();
+ properties.add( "collectionProperty" );
+ properties.add( "methodProperty" );
+ properties.add( "primitiveProperty" );
+ properties.add( "primitiveArrayProperty" );
+ properties.add( "arrayProperty" );
+ properties.add( "propertyStartingWithIs" );
+ properties.add( "language" );
+ List<XProperty> methodProperties = dadAsSeenFromSon.getDeclaredProperties( "property" );
+ assertEquals( properties.size(), methodProperties.size() );
+ for ( XProperty member : methodProperties ) {
+ assertTrue( properties.contains( member.getName() ) );
+ }
+ List<XProperty> fieldProperties = dadAsSeenFromSon.getDeclaredProperties( "field" );
+ XProperty field = fieldProperties.get( 0 );
+ assertEquals( "fieldProperty", field.getName() );
+ }
+
+ public void testReturnsPropertiesWithUnresolvedParametricTypes() {
+ assertEquals( 7, dadAsSeenFromItself.getDeclaredProperties( "property" ).size() );
+ }
+
+ public void testKnowsWhetherItsTypeIsFullyResolved() {
+ XProperty notFullyResolvedProperty = getPropertyNamed_from(
+ "collectionProperty", dadAsSeenFromItself
+ .getDeclaredProperties( "property" )
+ );
+ assertFalse( notFullyResolvedProperty.isTypeResolved() );
+ XProperty fullyResolvedProperty = getPropertyNamed_from(
+ "collectionProperty", dadAsSeenFromSon
+ .getDeclaredProperties( "property" )
+ );
+ assertTrue( fullyResolvedProperty.isTypeResolved() );
+ }
+
+ public void testCanBeFiltered() {
+ assertEquals(
+ 8, dadAsSeenFromSon.getDeclaredProperties(
+ "property", new Filter() {
+
+ public boolean returnStatic() {
+ return true;
+ }
+
+ public boolean returnTransient() {
+ return false;
+ }
+ }
+ ).size()
+ );
+ }
+
+ public void testCanBeASimpleType() {
+ List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "field" );
+ XProperty p = getPropertyNamed_from( "fieldProperty", declaredProperties );
+ assertTrue( factory.equals( p.getType(), String.class ) );
+ assertTrue( factory.equals( p.getElementClass(), String.class ) );
+ assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) );
+ assertNull( p.getCollectionClass() );
+ assertFalse( p.isArray() );
+ assertFalse( p.isCollection() );
+ }
+
+ public void testResolveInterfaceType() {
+ List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" );
+ XProperty p = getPropertyNamed_from( "language", declaredProperties );
+ assertTrue( factory.equals( p.getType(), String.class ) );
+ assertTrue( factory.equals( p.getElementClass(), String.class ) );
+ assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) );
+ assertNull( p.getCollectionClass() );
+ assertNull( p.getMapKey() );
+ assertFalse( p.isArray() );
+ assertFalse( p.isCollection() );
+ }
+
+ public void testCanBeAnArray() {
+ List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" );
+ XProperty p = getPropertyNamed_from( "arrayProperty", declaredProperties );
+ assertTrue( factory.equals( p.getType(), String[].class ) );
+ assertTrue( factory.equals( p.getElementClass(), String.class ) );
+ assertTrue( factory.equals( p.getClassOrElementClass(), String.class ) );
+ assertNull( p.getCollectionClass() );
+ assertNull( p.getMapKey() );
+ assertTrue( p.isArray() );
+ assertFalse( p.isCollection() );
+ }
+
+ public void testCanBeAnArrayOfPrimitives() {
+ List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" );
+ XProperty p = getPropertyNamed_from( "primitiveArrayProperty", declaredProperties );
+ assertTrue( factory.equals( p.getType(), int[].class ) );
+ assertTrue( factory.equals( p.getElementClass(), int.class ) );
+ assertTrue( factory.equals( p.getClassOrElementClass(), int.class ) );
+ assertNull( p.getCollectionClass() );
+ assertNull( p.getMapKey() );
+ assertTrue( p.isArray() );
+ assertFalse( p.isCollection() );
+ }
+
+ public void testCanBeACollection() {
+ List<XProperty> declaredProperties = dadAsSeenFromSon.getDeclaredProperties( "property" );
+ XProperty p = getPropertyNamed_from( "collectionProperty", declaredProperties );
+ assertTrue( factory.equals( p.getType(), Map.class ) );
+ assertTrue( factory.equals( p.getElementClass(), String.class ) );
+ assertTrue( factory.equals( p.getClassOrElementClass(), Map.class ) );
+ assertTrue( factory.equals( p.getMapKey(), Double.class ) );
+ assertEquals( Map.class, p.getCollectionClass() );
+ assertFalse( p.isArray() );
+ assertTrue( p.isCollection() );
+ }
+
+ private XProperty getPropertyNamed_from(String name, List<XProperty> properties) {
+ for ( XProperty p : properties ) {
+ if ( p.getName().equals( name ) ) {
+ return p;
+ }
+ }
+ throw new AssertionFailedError( "No property '" + name + "' found" );
+ }
+
+ public void testSupportsMethodsStartingWithIs() throws Exception {
+ assertEquals( "methodProperty", getConcreteInstance().getName() );
+ }
+
+ @Override
+ protected XProperty getConcreteInstance() {
+ XClass xClass = factory.toXClass( Dad.class );
+ List<XProperty> properties = xClass.getDeclaredProperties( "property" );
+ for ( XProperty p : properties ) {
+ if ( p.getName().equals( "methodProperty" ) ) {
+ return p;
+ }
+ }
+ throw new AssertionFailedError( "Cannot find Foo.getMethodProperty()" );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Sex.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Sex.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Sex.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-//$Id: $
-package org.hibernate.annotations.common.test.reflection.java;
-
-/**
- * @author Emmanuel Bernard
- */
-public enum Sex {
- MALE,
- FEMALE
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Sex.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Sex.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Sex.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/Sex.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.annotations.common.test.reflection.java;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum Sex {
+ MALE,
+ FEMALE
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/TestAnnotation.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/TestAnnotation.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/TestAnnotation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
- at Target({TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface TestAnnotation {
- String name() default "abc";
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/TestAnnotation.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/TestAnnotation.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/TestAnnotation.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/TestAnnotation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+package org.hibernate.annotations.common.test.reflection.java;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+ at Target({TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface TestAnnotation {
+ String name() default "abc";
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/XAnnotatedElementTestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/XAnnotatedElementTestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/XAnnotatedElementTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java;
-
-import javax.persistence.Transient;
-
-import junit.framework.TestCase;
-import org.hibernate.annotations.common.reflection.XAnnotatedElement;
-import org.hibernate.annotations.common.test.reflection.java.generics.TestAnnotation;
-
-/**
- * @author Paolo Perrotta
- */
-public abstract class XAnnotatedElementTestCase extends TestCase {
-
- public void testKnowsWhetherAnAnnotationIsPresent() {
- assertTrue( getConcreteInstance().isAnnotationPresent( TestAnnotation.class ) );
- assertFalse( getConcreteInstance().isAnnotationPresent( Transient.class ) );
- }
-
- public void testReturnsSpecificAnnotations() {
- TestAnnotation ent = getConcreteInstance().getAnnotation( TestAnnotation.class );
- assertEquals( "xyz", ent.name() );
- }
-
- protected abstract XAnnotatedElement getConcreteInstance();
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/XAnnotatedElementTestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/XAnnotatedElementTestCase.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/XAnnotatedElementTestCase.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/XAnnotatedElementTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+package org.hibernate.annotations.common.test.reflection.java;
+
+import javax.persistence.Transient;
+
+import junit.framework.TestCase;
+import org.hibernate.annotations.common.reflection.XAnnotatedElement;
+import org.hibernate.annotations.common.test.reflection.java.generics.TestAnnotation;
+
+/**
+ * @author Paolo Perrotta
+ */
+public abstract class XAnnotatedElementTestCase extends TestCase {
+
+ public void testKnowsWhetherAnAnnotationIsPresent() {
+ assertTrue( getConcreteInstance().isAnnotationPresent( TestAnnotation.class ) );
+ assertFalse( getConcreteInstance().isAnnotationPresent( Transient.class ) );
+ }
+
+ public void testReturnsSpecificAnnotations() {
+ TestAnnotation ent = getConcreteInstance().getAnnotation( TestAnnotation.class );
+ assertEquals( "xyz", ent.name() );
+ }
+
+ protected abstract XAnnotatedElement getConcreteInstance();
+}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics)
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,70 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.util.Collection;
-import java.util.Map;
-
-import junit.framework.TestCase;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironmentFactory;
-
-public class ApproximatingTypeEnvironmentTest extends TestCase {
-
- TypeEnvironmentFactory teFactory = new TypeEnvironmentFactory();
- TypeEnvironment unboundContext = teFactory.getEnvironment( BigBlob.class );
- TypeEnvironment approximatingUnboundContext = teFactory.toApproximatingEnvironment( unboundContext );
-
- TypeEnvironment boundContext = teFactory.getEnvironment( SonOfBlob.class );
- TypeEnvironment approximatingBoundContext = teFactory.toApproximatingEnvironment( boundContext );
-
- public void testDoesNothingOnClasses() throws SecurityException, NoSuchMethodException {
- assertEquals( String[].class, approximatingUnboundContext.bind( String[].class ) );
- }
-
- public void testDoesNothingOnWildcards() throws Exception {
- Type type = BigBlob.class.getMethod( "genericClass", new Class[0] ).getGenericReturnType();
- Type approxType = approximatingBoundContext.bind( type );
- assertEquals( "java.lang.Class<?>", approxType.toString() );
- }
-
- public void testDoesNothingOnParameterizedTypesThatAreAlreadyFullyBound() throws Exception {
- Type type = BigBlob.class.getMethod( "simpleGenericType", new Class[0] ).getGenericReturnType();
- assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) );
- }
-
- public void testDoesNothingOnComplexParameterizedTypesThatAreNotCollections() throws Exception {
- Type type = BigBlob.class.getMethod( "genericType", new Class[0] ).getGenericReturnType();
- assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) );
- }
-
- public void testDoesNothingOnGenericArraysThatAreAlreadyFullyBound() throws Exception {
- Type type = BigBlob.class.getMethod( "array", new Class[0] ).getGenericReturnType();
- assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) );
- }
-
- public void testApproximatesSimpleGenericTypesToTheirUpperBound() throws Exception {
- Type type = BigBlob.class.getMethod( "simpleGenericType", new Class[0] ).getGenericReturnType();
- assertEquals( "java.util.List<java.lang.String>", approximatingBoundContext.bind( type ).toString() );
- }
-
- public void testApproximatesGenericsInArraysToTheirUpperBounds() throws Exception {
- Type type = BigBlob.class.getMethod( "array", new Class[0] ).getGenericReturnType();
- assertEquals( Collection[].class, approximatingUnboundContext.bind( type ) );
- }
-
- public void testApproximatesArraysOfComplexTypesToArraysOfObjects() throws Exception {
- Type type = BigBlob.class.getMethod( "complexGenericArray", new Class[0] ).getGenericReturnType();
- assertEquals( Object[].class, approximatingUnboundContext.bind( type ) );
- }
-
- public void testApproximatesGenericsAndWildcardsInCollectionsToTheirUpperBounds() throws Exception {
- Type type = BigBlob.class.getMethod( "genericCollection", new Class[0] ).getGenericReturnType();
- ParameterizedType approxType = (ParameterizedType) approximatingUnboundContext.bind( type );
- assertEquals( Map.class, approxType.getRawType() );
- assertNull( approxType.getOwnerType() );
- assertEquals( 2, approxType.getActualTypeArguments().length );
- assertEquals( Object.class, approxType.getActualTypeArguments()[0] );
- assertEquals( Collection.class, approxType.getActualTypeArguments()[1] );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/ApproximatingTypeEnvironmentTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,70 @@
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.util.Collection;
+import java.util.Map;
+
+import junit.framework.TestCase;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironmentFactory;
+
+public class ApproximatingTypeEnvironmentTest extends TestCase {
+
+ TypeEnvironmentFactory teFactory = new TypeEnvironmentFactory();
+ TypeEnvironment unboundContext = teFactory.getEnvironment( BigBlob.class );
+ TypeEnvironment approximatingUnboundContext = teFactory.toApproximatingEnvironment( unboundContext );
+
+ TypeEnvironment boundContext = teFactory.getEnvironment( SonOfBlob.class );
+ TypeEnvironment approximatingBoundContext = teFactory.toApproximatingEnvironment( boundContext );
+
+ public void testDoesNothingOnClasses() throws SecurityException, NoSuchMethodException {
+ assertEquals( String[].class, approximatingUnboundContext.bind( String[].class ) );
+ }
+
+ public void testDoesNothingOnWildcards() throws Exception {
+ Type type = BigBlob.class.getMethod( "genericClass", new Class[0] ).getGenericReturnType();
+ Type approxType = approximatingBoundContext.bind( type );
+ assertEquals( "java.lang.Class<?>", approxType.toString() );
+ }
+
+ public void testDoesNothingOnParameterizedTypesThatAreAlreadyFullyBound() throws Exception {
+ Type type = BigBlob.class.getMethod( "simpleGenericType", new Class[0] ).getGenericReturnType();
+ assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) );
+ }
+
+ public void testDoesNothingOnComplexParameterizedTypesThatAreNotCollections() throws Exception {
+ Type type = BigBlob.class.getMethod( "genericType", new Class[0] ).getGenericReturnType();
+ assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) );
+ }
+
+ public void testDoesNothingOnGenericArraysThatAreAlreadyFullyBound() throws Exception {
+ Type type = BigBlob.class.getMethod( "array", new Class[0] ).getGenericReturnType();
+ assertEquals( boundContext.bind( type ), approximatingBoundContext.bind( type ) );
+ }
+
+ public void testApproximatesSimpleGenericTypesToTheirUpperBound() throws Exception {
+ Type type = BigBlob.class.getMethod( "simpleGenericType", new Class[0] ).getGenericReturnType();
+ assertEquals( "java.util.List<java.lang.String>", approximatingBoundContext.bind( type ).toString() );
+ }
+
+ public void testApproximatesGenericsInArraysToTheirUpperBounds() throws Exception {
+ Type type = BigBlob.class.getMethod( "array", new Class[0] ).getGenericReturnType();
+ assertEquals( Collection[].class, approximatingUnboundContext.bind( type ) );
+ }
+
+ public void testApproximatesArraysOfComplexTypesToArraysOfObjects() throws Exception {
+ Type type = BigBlob.class.getMethod( "complexGenericArray", new Class[0] ).getGenericReturnType();
+ assertEquals( Object[].class, approximatingUnboundContext.bind( type ) );
+ }
+
+ public void testApproximatesGenericsAndWildcardsInCollectionsToTheirUpperBounds() throws Exception {
+ Type type = BigBlob.class.getMethod( "genericCollection", new Class[0] ).getGenericReturnType();
+ ParameterizedType approxType = (ParameterizedType) approximatingUnboundContext.bind( type );
+ assertEquals( Map.class, approxType.getRawType() );
+ assertNull( approxType.getOwnerType() );
+ assertEquals( 2, approxType.getActualTypeArguments().length );
+ assertEquals( Object.class, approxType.getActualTypeArguments()[0] );
+ assertEquals( Collection.class, approxType.getActualTypeArguments()[1] );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/BigBlob.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/BigBlob.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/BigBlob.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-public class BigBlob<T, E extends Collection> {
-
- public E simpleGenericType() {
- return null;
- }
-
- public Class<?> genericClass() {
- return null;
- }
-
- public Class<T> genericType() {
- return null;
- }
-
- public Map<T, ? extends E> genericCollection() {
- return null;
- }
-
- public E[] array() {
- return null;
- }
-
- public List<? extends T>[] complexGenericArray() {
- return null;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/BigBlob.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/BigBlob.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/BigBlob.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/BigBlob.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
+public class BigBlob<T, E extends Collection> {
+
+ public E simpleGenericType() {
+ return null;
+ }
+
+ public Class<?> genericClass() {
+ return null;
+ }
+
+ public Class<T> genericType() {
+ return null;
+ }
+
+ public Map<T, ? extends E> genericCollection() {
+ return null;
+ }
+
+ public E[] array() {
+ return null;
+ }
+
+ public List<? extends T>[] complexGenericArray() {
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Dad.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Dad.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Dad.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-import java.util.List;
-import java.util.Map;
-import javax.persistence.Entity;
-
-/**
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
- at TestAnnotation(name = "xyz")
- at Entity
-public class Dad<T> extends Grandpa<List<T>, Integer> {
-
- static Integer staticField;
-
- T fieldProperty;
-
- public Map<Double, T> getCollectionProperty() {
- return null;
- }
-
- @TestAnnotation(name = "xyz")
- public Integer getMethodProperty() {
- return null;
- }
-
- public int getPrimitiveProperty() {
- return 0;
- }
-
- public boolean isPropertyStartingWithIs() {
- return false;
- }
-
- public int[] getPrimitiveArrayProperty() {
- return null;
- }
-
- public T[] getArrayProperty() {
- return null;
- }
-
- public static Integer getStaticThing() {
- return null;
- }
-
- public String getLanguage() {
- return null;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Dad.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Dad.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Dad.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Dad.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+import java.util.List;
+import java.util.Map;
+import javax.persistence.Entity;
+
+/**
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+ at TestAnnotation(name = "xyz")
+ at Entity
+public class Dad<T> extends Grandpa<List<T>, Integer> {
+
+ static Integer staticField;
+
+ T fieldProperty;
+
+ public Map<Double, T> getCollectionProperty() {
+ return null;
+ }
+
+ @TestAnnotation(name = "xyz")
+ public Integer getMethodProperty() {
+ return null;
+ }
+
+ public int getPrimitiveProperty() {
+ return 0;
+ }
+
+ public boolean isPropertyStartingWithIs() {
+ return false;
+ }
+
+ public int[] getPrimitiveArrayProperty() {
+ return null;
+ }
+
+ public T[] getArrayProperty() {
+ return null;
+ }
+
+ public static Integer getStaticThing() {
+ return null;
+ }
+
+ public String getLanguage() {
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Grandpa.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Grandpa.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Grandpa.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-import java.io.Serializable;
-
-/**
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
-public abstract class Grandpa<T, U> implements Serializable, Language<String> {
-
- Integer grandpaField;
-
- public T returnsGeneric() {
- return null;
- }
-
- // generic embedded value
- public Neighbour<U> getFriend() {
- return null;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Grandpa.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Grandpa.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Grandpa.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Grandpa.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+import java.io.Serializable;
+
+/**
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+public abstract class Grandpa<T, U> implements Serializable, Language<String> {
+
+ Integer grandpaField;
+
+ public T returnsGeneric() {
+ return null;
+ }
+
+ // generic embedded value
+ public Neighbour<U> getFriend() {
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Language.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Language.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Language.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,9 +0,0 @@
-//$Id$
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Language<T> {
- T getLanguage();
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Language.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Language.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Language.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Language.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,9 @@
+//$Id$
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Language<T> {
+ T getLanguage();
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Neighbour.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Neighbour.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Neighbour.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-import java.util.Set;
-
-/**
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
-public class Neighbour<T> {
-
- public Set<T> embeddedProperty() {
- return null;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Neighbour.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Neighbour.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Neighbour.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Neighbour.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+import java.util.Set;
+
+/**
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+public class Neighbour<T> {
+
+ public Set<T> embeddedProperty() {
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Son.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Son.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Son.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,8 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-/**
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
-public class Son extends Dad<String> {
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Son.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Son.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Son.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/Son.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,8 @@
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+/**
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+public class Son extends Dad<String> {
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/SonOfBlob.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/SonOfBlob.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/SonOfBlob.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,8 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-import java.util.List;
-
-
-public class SonOfBlob extends BigBlob<String, List<String>> {
-
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/SonOfBlob.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/SonOfBlob.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/SonOfBlob.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/SonOfBlob.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,8 @@
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+import java.util.List;
+
+
+public class SonOfBlob extends BigBlob<String, List<String>> {
+
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TestAnnotation.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TestAnnotation.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TestAnnotation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
- at Target({TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface TestAnnotation {
- String name() default "abc";
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TestAnnotation.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TestAnnotation.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TestAnnotation.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TestAnnotation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+ at Target({TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface TestAnnotation {
+ String name() default "abc";
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeEnvironmentFactoryTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeEnvironmentFactoryTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeEnvironmentFactoryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,59 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.lang.reflect.TypeVariable;
-import java.util.List;
-import java.util.Set;
-
-import junit.framework.TestCase;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironmentFactory;
-
-/**
- * @author Davide Marchignoli
- * @author Paolo Perrotta
- */
-public class TypeEnvironmentFactoryTest extends TestCase {
-
- public void testBindsGenericsToSuperclassEnvironment() throws SecurityException, NoSuchMethodException {
- TypeEnvironmentFactory env = new TypeEnvironmentFactory();
- Type type = Grandpa.class.getMethod( "returnsGeneric", new Class[0] ).getGenericReturnType();
-
- Type asSeenFromGrandpa = env.getEnvironment( Grandpa.class ).bind( type );
- assertTrue( asSeenFromGrandpa instanceof TypeVariable );
- assertEquals( "T", asSeenFromGrandpa.toString() );
-
- Type asSeenFromDad = env.getEnvironment( Dad.class ).bind( type );
- assertTrue( asSeenFromDad instanceof ParameterizedType );
- assertEquals( "java.util.List<T>", asSeenFromDad.toString() );
-
- ParameterizedType asSeenFromSon = (ParameterizedType) env.getEnvironment( Son.class ).bind( type );
- assertType_isCollectionOfClass_withElementsOfClass( asSeenFromSon, List.class, String.class );
- }
-
- public void testBindsGenericsToOwnerEnvironment() throws SecurityException, NoSuchMethodException {
- TypeEnvironmentFactory env = new TypeEnvironmentFactory();
-
- Type friendType = Dad.class.getMethod( "getFriend", new Class[0] ).getGenericReturnType();
- ParameterizedType friendTypeAsSeenFromDad = (ParameterizedType) env.getEnvironment( Dad.class ).bind(
- friendType
- );
-
- Class friendClass = (Class) friendTypeAsSeenFromDad.getRawType();
- Type returnType = friendClass.getMethod( "embeddedProperty", new Class[0] ).getGenericReturnType();
-
- ParameterizedType boundType = (ParameterizedType) env.getEnvironment( friendTypeAsSeenFromDad ).bind(
- returnType
- );
- assertType_isCollectionOfClass_withElementsOfClass( boundType, Set.class, Integer.class );
- }
-
- private void assertType_isCollectionOfClass_withElementsOfClass(
- ParameterizedType t, Class collectionClass,
- Class elementClass
- ) {
- assertEquals( collectionClass, t.getRawType() );
- assertEquals( 1, t.getActualTypeArguments().length );
- assertEquals( elementClass, t.getActualTypeArguments()[0] );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeEnvironmentFactoryTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeEnvironmentFactoryTest.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeEnvironmentFactoryTest.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeEnvironmentFactoryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,59 @@
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.lang.reflect.TypeVariable;
+import java.util.List;
+import java.util.Set;
+
+import junit.framework.TestCase;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironmentFactory;
+
+/**
+ * @author Davide Marchignoli
+ * @author Paolo Perrotta
+ */
+public class TypeEnvironmentFactoryTest extends TestCase {
+
+ public void testBindsGenericsToSuperclassEnvironment() throws SecurityException, NoSuchMethodException {
+ TypeEnvironmentFactory env = new TypeEnvironmentFactory();
+ Type type = Grandpa.class.getMethod( "returnsGeneric", new Class[0] ).getGenericReturnType();
+
+ Type asSeenFromGrandpa = env.getEnvironment( Grandpa.class ).bind( type );
+ assertTrue( asSeenFromGrandpa instanceof TypeVariable );
+ assertEquals( "T", asSeenFromGrandpa.toString() );
+
+ Type asSeenFromDad = env.getEnvironment( Dad.class ).bind( type );
+ assertTrue( asSeenFromDad instanceof ParameterizedType );
+ assertEquals( "java.util.List<T>", asSeenFromDad.toString() );
+
+ ParameterizedType asSeenFromSon = (ParameterizedType) env.getEnvironment( Son.class ).bind( type );
+ assertType_isCollectionOfClass_withElementsOfClass( asSeenFromSon, List.class, String.class );
+ }
+
+ public void testBindsGenericsToOwnerEnvironment() throws SecurityException, NoSuchMethodException {
+ TypeEnvironmentFactory env = new TypeEnvironmentFactory();
+
+ Type friendType = Dad.class.getMethod( "getFriend", new Class[0] ).getGenericReturnType();
+ ParameterizedType friendTypeAsSeenFromDad = (ParameterizedType) env.getEnvironment( Dad.class ).bind(
+ friendType
+ );
+
+ Class friendClass = (Class) friendTypeAsSeenFromDad.getRawType();
+ Type returnType = friendClass.getMethod( "embeddedProperty", new Class[0] ).getGenericReturnType();
+
+ ParameterizedType boundType = (ParameterizedType) env.getEnvironment( friendTypeAsSeenFromDad ).bind(
+ returnType
+ );
+ assertType_isCollectionOfClass_withElementsOfClass( boundType, Set.class, Integer.class );
+ }
+
+ private void assertType_isCollectionOfClass_withElementsOfClass(
+ ParameterizedType t, Class collectionClass,
+ Class elementClass
+ ) {
+ assertEquals( collectionClass, t.getRawType() );
+ assertEquals( 1, t.getActualTypeArguments().length );
+ assertEquals( elementClass, t.getActualTypeArguments()[0] );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeUtilsTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeUtilsTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeUtilsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics;
-
-import java.lang.reflect.Type;
-
-import junit.framework.TestCase;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
-import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironmentFactory;
-import org.hibernate.annotations.common.reflection.java.generics.TypeUtils;
-
-public class TypeUtilsTest extends TestCase {
-
- TypeEnvironmentFactory env = new TypeEnvironmentFactory();
- TypeEnvironment dadContext = env.getEnvironment( Dad.class );
- TypeEnvironment sonContext = env.getEnvironment( Son.class );
-
- public void testAClassIsAlwaysFullyResolved() throws Exception {
- assertTrue( TypeUtils.isResolved( Dad.class ) );
- }
-
- public void testKnowsIfAParametricTypeIsFullyResolved() throws Exception {
- Type simpleType = Dad.class.getMethod( "returnsGeneric", new Class[0] ).getGenericReturnType();
- assertFalse( TypeUtils.isResolved( dadContext.bind( simpleType ) ) );
- assertTrue( TypeUtils.isResolved( sonContext.bind( simpleType ) ) );
- }
-
- public void testKnowsIfAnArrayTypeIsFullyResolved() throws Exception {
- Type arrayType = Dad.class.getMethod( "getArrayProperty", new Class[0] ).getGenericReturnType();
- assertFalse( TypeUtils.isResolved( dadContext.bind( arrayType ) ) );
- assertTrue( TypeUtils.isResolved( sonContext.bind( arrayType ) ) );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeUtilsTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeUtilsTest.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeUtilsTest.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/TypeUtilsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+package org.hibernate.annotations.common.test.reflection.java.generics;
+
+import java.lang.reflect.Type;
+
+import junit.framework.TestCase;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironment;
+import org.hibernate.annotations.common.reflection.java.generics.TypeEnvironmentFactory;
+import org.hibernate.annotations.common.reflection.java.generics.TypeUtils;
+
+public class TypeUtilsTest extends TestCase {
+
+ TypeEnvironmentFactory env = new TypeEnvironmentFactory();
+ TypeEnvironment dadContext = env.getEnvironment( Dad.class );
+ TypeEnvironment sonContext = env.getEnvironment( Son.class );
+
+ public void testAClassIsAlwaysFullyResolved() throws Exception {
+ assertTrue( TypeUtils.isResolved( Dad.class ) );
+ }
+
+ public void testKnowsIfAParametricTypeIsFullyResolved() throws Exception {
+ Type simpleType = Dad.class.getMethod( "returnsGeneric", new Class[0] ).getGenericReturnType();
+ assertFalse( TypeUtils.isResolved( dadContext.bind( simpleType ) ) );
+ assertTrue( TypeUtils.isResolved( sonContext.bind( simpleType ) ) );
+ }
+
+ public void testKnowsIfAnArrayTypeIsFullyResolved() throws Exception {
+ Type arrayType = Dad.class.getMethod( "getArrayProperty", new Class[0] ).getGenericReturnType();
+ assertFalse( TypeUtils.isResolved( dadContext.bind( arrayType ) ) );
+ assertTrue( TypeUtils.isResolved( sonContext.bind( arrayType ) ) );
+ }
+}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep)
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsContainment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsContainment.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsContainment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,48 +0,0 @@
-//$Id: $
-package org.hibernate.annotations.common.test.reflection.java.generics.deep;
-
-import java.util.List;
-
-import junit.framework.TestCase;
-
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-
-
-/**
- * @author Paolo Perrotta
- */
-public class DeepGenericsContainment extends TestCase {
-
- public static class Contained<T> {
- T generic;
- }
-
- public static class Container {
- Contained<String> contained;
- }
-
- public static class ContainerWithCollection {
- List<Contained<String>> contained;
- }
-
- public void test2StepsGenerics() throws Exception {
- JavaReflectionManager factory = new JavaReflectionManager();
- XClass container = factory.toXClass( Container.class );
- XProperty contained = container.getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
- assertTrue( contained.isTypeResolved() );
- XProperty generic = contained.getType().getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
- assertTrue( generic.isTypeResolved() );
- }
-
- public void test2StepsGenericsCollection() throws Exception {
- JavaReflectionManager factory = new JavaReflectionManager();
- XClass container = factory.toXClass( ContainerWithCollection.class );
- XProperty collection = container.getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
- assertTrue( collection.isTypeResolved() );
- XClass elementClass = collection.getElementClass();
- XProperty generic = elementClass.getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
- assertTrue( generic.isTypeResolved() );
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsContainment.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsContainment.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsContainment.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsContainment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,48 @@
+//$Id: $
+package org.hibernate.annotations.common.test.reflection.java.generics.deep;
+
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+
+
+/**
+ * @author Paolo Perrotta
+ */
+public class DeepGenericsContainment extends TestCase {
+
+ public static class Contained<T> {
+ T generic;
+ }
+
+ public static class Container {
+ Contained<String> contained;
+ }
+
+ public static class ContainerWithCollection {
+ List<Contained<String>> contained;
+ }
+
+ public void test2StepsGenerics() throws Exception {
+ JavaReflectionManager factory = new JavaReflectionManager();
+ XClass container = factory.toXClass( Container.class );
+ XProperty contained = container.getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
+ assertTrue( contained.isTypeResolved() );
+ XProperty generic = contained.getType().getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
+ assertTrue( generic.isTypeResolved() );
+ }
+
+ public void test2StepsGenericsCollection() throws Exception {
+ JavaReflectionManager factory = new JavaReflectionManager();
+ XClass container = factory.toXClass( ContainerWithCollection.class );
+ XProperty collection = container.getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
+ assertTrue( collection.isTypeResolved() );
+ XClass elementClass = collection.getElementClass();
+ XProperty generic = elementClass.getDeclaredProperties( XClass.ACCESS_FIELD ).get( 0 );
+ assertTrue( generic.isTypeResolved() );
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsInheritance.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsInheritance.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsInheritance.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id: $
-package org.hibernate.annotations.common.test.reflection.java.generics.deep;
-
-import junit.framework.TestCase;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-
-
-/**
- * @author Emmanuel Bernard
- */
-public class DeepGenericsInheritance extends TestCase {
- public void test2StepsGenerics() throws Exception {
- JavaReflectionManager factory = new JavaReflectionManager();
- XClass subclass2 = factory.toXClass( Subclass2.class );
- XClass dummySubclass = factory.toXClass( DummySubclass.class );
- XClass superclass = subclass2.getSuperclass();
- XClass supersuperclass = superclass.getSuperclass();
- assertTrue( supersuperclass.getDeclaredProperties( "field" ).get( 1 ).isTypeResolved() );
- assertEquals( dummySubclass, supersuperclass.getDeclaredProperties( "field" ).get( 1 ).getType() );
-
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsInheritance.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsInheritance.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsInheritance.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DeepGenericsInheritance.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id: $
+package org.hibernate.annotations.common.test.reflection.java.generics.deep;
+
+import junit.framework.TestCase;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DeepGenericsInheritance extends TestCase {
+ public void test2StepsGenerics() throws Exception {
+ JavaReflectionManager factory = new JavaReflectionManager();
+ XClass subclass2 = factory.toXClass( Subclass2.class );
+ XClass dummySubclass = factory.toXClass( DummySubclass.class );
+ XClass superclass = subclass2.getSuperclass();
+ XClass supersuperclass = superclass.getSuperclass();
+ assertTrue( supersuperclass.getDeclaredProperties( "field" ).get( 1 ).isTypeResolved() );
+ assertEquals( dummySubclass, supersuperclass.getDeclaredProperties( "field" ).get( 1 ).getType() );
+
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Dummy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Dummy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Dummy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics.deep;
-
-import javax.persistence.MappedSuperclass;
-import javax.persistence.Id;
-
-/**
- *
- */
- at MappedSuperclass
-public class Dummy {
- @Id
- protected Long id;
-
- private String name;
-
-
- public Long getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Dummy.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Dummy.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Dummy.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Dummy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+package org.hibernate.annotations.common.test.reflection.java.generics.deep;
+
+import javax.persistence.MappedSuperclass;
+import javax.persistence.Id;
+
+/**
+ *
+ */
+ at MappedSuperclass
+public class Dummy {
+ @Id
+ protected Long id;
+
+ private String name;
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DummySubclass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DummySubclass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DummySubclass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics.deep;
-
-import javax.persistence.Entity;
-
-import org.hibernate.annotations.common.test.reflection.java.generics.deep.Dummy;
-
-/**
- *
- */
- at Entity
-public class DummySubclass extends Dummy {
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DummySubclass.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DummySubclass.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DummySubclass.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/DummySubclass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+package org.hibernate.annotations.common.test.reflection.java.generics.deep;
+
+import javax.persistence.Entity;
+
+import org.hibernate.annotations.common.test.reflection.java.generics.deep.Dummy;
+
+/**
+ *
+ */
+ at Entity
+public class DummySubclass extends Dummy {
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass1.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass1.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics.deep;
-
-import javax.persistence.MappedSuperclass;
-import javax.persistence.OneToOne;
-import javax.persistence.Id;
-
-import org.hibernate.annotations.common.test.reflection.java.generics.deep.Dummy;
-
-/**
- *
- */
- at MappedSuperclass
-public class GenericSuperclass1<T extends Dummy> {
- @Id
- protected Long id;
-
- @OneToOne
- protected T dummy;
-
-
- public Long getId() {
- return id;
- }
-
- public T getDummy() {
- return dummy;
- }
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass1.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass1.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass1.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+package org.hibernate.annotations.common.test.reflection.java.generics.deep;
+
+import javax.persistence.MappedSuperclass;
+import javax.persistence.OneToOne;
+import javax.persistence.Id;
+
+import org.hibernate.annotations.common.test.reflection.java.generics.deep.Dummy;
+
+/**
+ *
+ */
+ at MappedSuperclass
+public class GenericSuperclass1<T extends Dummy> {
+ @Id
+ protected Long id;
+
+ @OneToOne
+ protected T dummy;
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public T getDummy() {
+ return dummy;
+ }
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass2.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass2.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics.deep;
-
-import javax.persistence.MappedSuperclass;
-
-import org.hibernate.annotations.common.test.reflection.java.generics.deep.Dummy;
-import org.hibernate.annotations.common.test.reflection.java.generics.deep.GenericSuperclass1;
-
-/**
- *
- */
- at MappedSuperclass
-public class GenericSuperclass2<T extends Dummy> extends GenericSuperclass1<T> {
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass2.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass2.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass2.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/GenericSuperclass2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+package org.hibernate.annotations.common.test.reflection.java.generics.deep;
+
+import javax.persistence.MappedSuperclass;
+
+import org.hibernate.annotations.common.test.reflection.java.generics.deep.Dummy;
+import org.hibernate.annotations.common.test.reflection.java.generics.deep.GenericSuperclass1;
+
+/**
+ *
+ */
+ at MappedSuperclass
+public class GenericSuperclass2<T extends Dummy> extends GenericSuperclass1<T> {
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass1.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass1.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics.deep;
-
-import javax.persistence.Entity;
-
-import org.hibernate.annotations.common.test.reflection.java.generics.deep.DummySubclass;
-import org.hibernate.annotations.common.test.reflection.java.generics.deep.GenericSuperclass1;
-
-/**
- *
- */
- at Entity
-public class Subclass1 extends GenericSuperclass1<DummySubclass> {
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass1.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass1.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass1.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+package org.hibernate.annotations.common.test.reflection.java.generics.deep;
+
+import javax.persistence.Entity;
+
+import org.hibernate.annotations.common.test.reflection.java.generics.deep.DummySubclass;
+import org.hibernate.annotations.common.test.reflection.java.generics.deep.GenericSuperclass1;
+
+/**
+ *
+ */
+ at Entity
+public class Subclass1 extends GenericSuperclass1<DummySubclass> {
+}
Deleted: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass2.java
===================================================================
--- branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass2.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-package org.hibernate.annotations.common.test.reflection.java.generics.deep;
-
-import javax.persistence.Entity;
-
-import org.hibernate.annotations.common.test.reflection.java.generics.deep.DummySubclass;
-import org.hibernate.annotations.common.test.reflection.java.generics.deep.GenericSuperclass2;
-
-/**
- *
- */
- at Entity
-public class Subclass2 extends GenericSuperclass2<DummySubclass> {
-}
Copied: trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass2.java (from rev 11279, branches/Branch_3_2/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass2.java)
===================================================================
--- trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass2.java (rev 0)
+++ trunk/HibernateExt/commons-annotations/src/test/org/hibernate/annotations/common/test/reflection/java/generics/deep/Subclass2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+package org.hibernate.annotations.common.test.reflection.java.generics.deep;
+
+import javax.persistence.Entity;
+
+import org.hibernate.annotations.common.test.reflection.java.generics.deep.DummySubclass;
+import org.hibernate.annotations.common.test.reflection.java.generics.deep.GenericSuperclass2;
+
+/**
+ *
+ */
+ at Entity
+public class Subclass2 extends GenericSuperclass2<DummySubclass> {
+}
Copied: trunk/HibernateExt/entitymanager (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager)
Property changes on: trunk/HibernateExt/entitymanager
___________________________________________________________________
Name: svn:ignore
+ build.properties
build
target
test_output
classes
Deleted: trunk/HibernateExt/entitymanager/.cvsignore
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/.cvsignore 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/.cvsignore 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,4 +0,0 @@
-build.properties
-build
-target
-test_output
Copied: trunk/HibernateExt/entitymanager/.cvsignore (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/.cvsignore)
===================================================================
--- trunk/HibernateExt/entitymanager/.cvsignore (rev 0)
+++ trunk/HibernateExt/entitymanager/.cvsignore 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,4 @@
+build.properties
+build
+target
+test_output
Deleted: trunk/HibernateExt/entitymanager/build.properties.dist
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/build.properties.dist 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/build.properties.dist 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-common.dir=.
-src.dir=src
-test.dir=test
-resources.dir=resources
-testresources.dir=test-resources
-hibernate-core.home=../hibernate-3.2
-
-
-#locally present jars
-jpa-api.jar=./lib/ejb3-persistence.jar
-validator.jar=./lib/hibernate-validator.jar
-commons-annotations.jar=./lib/hibernate-commons-annotations.jar
-annotations.jar=./lib/hibernate-annotations.jar
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/build.properties.dist (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/build.properties.dist)
===================================================================
--- trunk/HibernateExt/entitymanager/build.properties.dist (rev 0)
+++ trunk/HibernateExt/entitymanager/build.properties.dist 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+common.dir=.
+src.dir=src
+test.dir=test
+resources.dir=resources
+testresources.dir=test-resources
+hibernate-core.home=../hibernate-3.2
+
+
+#locally present jars
+jpa-api.jar=./lib/ejb3-persistence.jar
+validator.jar=./lib/hibernate-validator.jar
+commons-annotations.jar=./lib/hibernate-commons-annotations.jar
+annotations.jar=./lib/hibernate-annotations.jar
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/build.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/build.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,378 +0,0 @@
-<!--
-
- Hibernate Annotations ANT build script.
-
- You need JDK 5.0 installed to build Hibernate EntityManager.
-
--->
-
-<project name="HibernateEntityManager" default="dist" basedir=".">
-
- <!-- Give user a chance to override without editing this file
- (and without typing -D each time it compiles it) -->
- <property file="build.properties"/>
- <property file="${user.home}/.ant.properties"/>
-
- <!-- Name of project and version, used to create filenames -->
- <property name="Name" value="Hibernate EntityManager"/>
- <property name="name" value="hibernate-entitymanager"/>
- <property name="version" value="3.2.2.GA"/>
- <property name="javadoc.packagenames" value="org.hibernate.ejb.*"/>
- <property name="jdbc.dir" value="jdbc"/>
- <property name="copy.test" value="true"/>
- <property name="javac.source" value="1.5"/>
- <property name="javac.target" value="1.5"/>
- <property name="common.dir" value="../common"/>
-
- <available property="jpa-present" file="${basedir}/../jpa-api" type="dir"/>
- <property name="jpa-api.jar" value="${basedir}/../jpa-api/build/ejb3-persistence.jar"/>
- <property name="annotations.jar"
- value="${basedir}/../annotations/target/hibernate-annotations/hibernate-annotations.jar"/>
- <property name="validator.jar"
- value="${basedir}/../validator/target/hibernate-validator/hibernate-validator.jar"/>
- <property name="commons-annotations.jar"
- value="${basedir}/../commons-annotations/target/hibernate-commons-annotations/hibernate-commons-annotations.jar"/>
-
- <import file="${common.dir}/common-build.xml"/>
- <property name="jpa-javadoc.dir" value="${dist.doc.dir}/jpa-api"/>
-
-
- <property name="resources.dir" value="src/resources"/>
- <property name="testresources.dir" value="src/test-resources"/>
- <property name="build.testresources.dir" value="${build.dir}/testresources"/>
- <property name="build.temp.dir" value="${build.dir}/temp"/>
-
- <path id="lib.moduleclass.path">
- <pathelement location="${jpa-api.jar}"/>
- <pathelement location="${commons-annotations.jar}"/>
- <pathelement location="${annotations.jar}"/>
- <pathelement location="${validator.jar}"/>
- </path>
- <path id="junit.moduleclasspath">
- <pathelement location="${src.dir}"/>
- <pathelement location="${test.dir}"/>
- <fileset dir="${jdbc.dir}">
- <include name="*.jar"/>
- <include name="*.zip"/>
- </fileset>
- <fileset dir="${lib.dir}/test">
- <include name="*.jar"/>
- <include name="*.zip"/>
- </fileset>
- </path>
-
- <target name="init">
- <antcall target="common-build.init"/>
- <!-- check for dependency artefacts -->
- <available file="${jpa-api.jar}" type="file" property="jpa-api.jar.available"/>
- <available file="${commons-annotations.jar}" type="file" property="commons-annotations.jar.available"/>
- <available file="${annotations.jar}" type="file" property="annotations.jar.available"/>
- <available file="${validator.jar}" type="file" property="validator.jar.available"/>
- <mkdir dir="${lib.dir}/test"/>
- </target>
-
- <target name="get.jpa-api" depends="init" unless="jpa-api.jar.available">
- <ant inheritall="false" dir="${basedir}/../jpa-api" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../jpa-api" target="jar"/>
- </target>
-
- <target name="get.commons-annotations" depends="init" unless="commons-annotations.jar.available">
- <ant inheritall="false" dir="${basedir}/../commons-annotations" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../commons-annotations" target="jar"/>
- </target>
-
- <target name="get.annotations" depends="init" unless="annotations.jar.available">
- <ant inheritall="false" dir="${basedir}/../annotations" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../annotations" target="jar"/>
- </target>
-
- <target name="get.validator" depends="init" unless="validator.jar.available">
- <ant inheritall="false" dir="${basedir}/../validator" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../validator" target="jar"/>
- </target>
-
- <target name="compile" depends="init,get.jpa-api,get.commons-annotations,get.annotations,get.validator" description="Compile the Java source code">
- <available
- classname="org.eclipse.core.launcher.Main"
- property="build.compiler"
- value="org.eclipse.jdt.core.JDTCompilerAdapter"
- classpath="${java.class.path}"/>
- <javac
- srcdir="${src.dir}"
- destdir="${classes.dir}"
- classpathref="lib.class.path"
- debug="${javac.debug}"
- optimize="${javac.optimize}"
- nowarn="on"
- source="${javac.source}"
- target="${javac.target}"
- >
- </javac>
- </target>
-
- <target name="packjar">
- <property name="extension" value="jar"/>
- <property name="packagename" value="${jarname}"/>
- <!-- property name="jarname"/ -->
- <mkdir dir="${build.testresources.dir}"/>
- <jar destfile="${build.testresources.dir}/${jarname}.${extension}">
- <!-- fileset dir="${build.temp.dir}"/ -->
- <fileset dir="${classes.dir}">
- <include name="**/test/pack/${packagename}/**.*"/>
- </fileset>
- <fileset dir="${testresources.dir}/${jarname}">
- <include name="**/*.*"/>
- </fileset>
- </jar>
- <delete dir="${build.temp.dir}"/>
- </target>
-
- <target name="packexploded">
- <property name="extension" value="jar"/>
- <!-- property name="jarname"/ -->
- <mkdir dir="${build.testresources.dir}/${jarname}.${extension}"/>
- <copy todir="${build.testresources.dir}/${jarname}.${extension}">
- <!-- fileset dir="${build.temp.dir}"/ -->
- <fileset dir="${classes.dir}">
- <include name="**/test/pack/${jarname}/**.*"/>
- </fileset>
- <fileset dir="${testresources.dir}/${jarname}">
- <include name="**/*.*"/>
- </fileset>
- </copy>
- <delete dir="${build.temp.dir}"/>
- </target>
-
- <target name="test-resources" description="Prepare all needed jars and pars">
- <antcall target="packjar" inheritall="true">
- <param name="extension" value="par"/>
- <param name="jarname" value="defaultpar"/>
- </antcall>
- <antcall target="packjar" inheritall="true">
- <param name="extension" value="par"/>
- <param name="jarname" value="space par"/>
- <param name="packagename" value="spacepar"/>
- </antcall>
- <antcall target="packjar" inheritall="true">
- <param name="extension" value="par"/>
- <param name="jarname" value="explicitpar"/>
- </antcall>
- <antcall target="packjar" inheritall="true">
- <param name="extension" value="par"/>
- <param name="jarname" value="excludehbmpar"/>
- </antcall>
- <antcall target="packjar" inheritall="true">
- <param name="extension" value="jar"/>
- <param name="jarname" value="externaljar"/>
- </antcall>
- <antcall target="packjar" inheritall="true">
- <param name="extension" value="par"/>
- <param name="jarname" value="cfgxmlpar"/>
- </antcall>
- <antcall target="packjar" inheritall="true">
- <param name="extension" value="jar"/>
- <param name="jarname" value="overridenpar"/>
- </antcall>
-
- <antcall target="packexploded" inheritall="true">
- <param name="extension" value="par"/>
- <param name="jarname" value="explodedpar"/>
- </antcall>
- </target>
-
- <target name="compiletest" depends="compile" description="Compile the tests">
- <available
- classname="org.eclipse.core.launcher.Main"
- property="build.compiler"
- value="org.eclipse.jdt.core.JDTCompilerAdapter"
- classpath="${java.class.path}"/>
- <javac
- srcdir="${test.dir}"
- destdir="${classes.dir}"
- debug="${javac.debug}"
- optimize="${javac.optimize}"
- nowarn="on"
- source="${javac.source}"
- target="${javac.target}">
- <classpath>
- <path refid="lib.class.path"/>
- </classpath>
- </javac>
- </target>
-
- <target name="junit" depends="compiletest,test-resources">
- <mkdir dir="test_output"/>
- <mkdir dir="${classes.dir}/META-INF/services"/>
- <copy todir="${classes.dir}">
- <fileset dir="${resources.dir}">
- <include name="**/*.*"/>
- </fileset>
- </copy>
- <junit fork="once" printsummary="yes" haltonfailure="yes">
- <classpath>
- <fileset dir="${jdbc.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.zip"/>
- </fileset>
- <dirset dir="${build.testresources.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.par"/>
- </dirset>
-
- <fileset dir="${build.testresources.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.par"/>
- </fileset>
- <path refid="lib.class.path"/>
- <!-- pathelement path="${classes.dir}"/ -->
- <dirset dir="${classes.dir}">
- <exclude name="**/pack/**.*"/>
- </dirset>
-
- <!-- pathelement path="build/test.par"/ -->
- <pathelement path="${src.dir}"/>
- <!-- pick up properties from here -->
- <pathelement path="${test.dir}"/>
- <!-- pick up mappings from here -->
- </classpath>
- <formatter type="plain"/>
- <formatter type="xml"/>
- <batchtest fork="yes" todir="test_output" haltonfailure="no">
- <fileset dir="${classes.dir}">
- <include name="**/*Test.class"/>
- </fileset>
- </batchtest>
- </junit>
- </target>
-
- <!-- Run a single unit test. -->
- <target name="junitsingle" depends="compiletest"
- description="Run a single test suite (requires testname and jdbc.driver properties)">
- <mkdir dir="test_output"/>
- <junit printsummary="yes" fork="yes" haltonfailure="yes">
- <classpath>
- <fileset dir="${jdbc.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.zip"/>
- </fileset>
- <path refid="lib.class.path"/>
- <pathelement path="build/test.par"/>
- <pathelement path="target/hibernate-entitymanager/hibernate-entitymanager.jar"/>
- <pathelement path="${src.dir}"/>
- <!-- pick up properties from here -->
- <pathelement path="${test.dir}"/>
- <!-- pick up mappings from here -->
- </classpath>
- <formatter type="plain"/>
- <formatter type="xml"/>
- <test fork="yes" todir="test_output" haltonfailure="no" name="${testname}"/>
- </junit>
- </target>
-
- <target name="jar" depends="compile" description="Build the distribution .jar file">
- <mkdir dir="${classes.dir}/META-INF/services"/>
- <copy todir="${classes.dir}">
- <fileset dir="${resources.dir}">
- <include name="**/*.*"/>
- </fileset>
- </copy>
- <manifest file="${classes.dir}/META-INF/MANIFEST.MF">
- <attribute name="Product" value="${Name}"/>
- <attribute name="Version" value="${version}"/>
- </manifest>
- <antcall target="common-build.jar"/>
- </target>
-
- <!-- target name="javadoc" description="Compile the Javadoc API documentation to dist dir">
- <echo>Skipping java doc since ant's javadoc task cannot handle an alternative javadoc</echo>
- </target -->
-
- <target name="jpa-javadoc" if="jpa-present">
- <mkdir dir="${jpa-javadoc.dir}"/>
- <ant dir="../jpa-api" target="javadoc" inheritAll="false"/>
- <copy todir="${jpa-javadoc.dir}">
- <fileset dir="${basedir}/../jpa-api/build/api">
- <include name="**/*.*"/>
- </fileset>
- </copy>
- </target>
-
- <!-- Some of this can probably be moved to common-build... -->
- <target name="dist" depends="jar,javadoc,jpa-javadoc,copysource,copytest,copylib,extras" description="Build everything">
-
- <ant inheritall="false" dir="${basedir}/doc/reference"/>
- <copy todir="${dist.dir}/doc/reference" failonerror="false">
- <fileset dir="${basedir}/doc/reference/build">
- <include name="**/*.*"/>
- </fileset>
- </copy>
-
- <copy todir="${dist.dir}/resources" failonerror="false">
- <fileset dir="${resources.dir}">
- <include name="**/*.*"/>
- </fileset>
- </copy>
- <copy todir="${dist.dir}/test-resources" failonerror="false">
- <fileset dir="${testresources.dir}">
- <include name="**/*.*"/>
- </fileset>
- </copy>
- <copy todir="${dist.dir}" failonerror="false">
- <fileset dir="${common.dir}">
- <include name="common-build.xml"/>
- </fileset>
- </copy>
-
- <!-- copy dependencies -->
- <copy todir="${dist.lib.dir}" failonerror="false">
- <fileset file="${jpa-api.jar}"/>
- <fileset file="${commons-annotations.jar}"/>
- <fileset file="${annotations.jar}"/>
- <fileset file="${validator.jar}"/>
- </copy>
- <mkdir dir="${dist.lib.dir}/test"/>
-
- <copy file="${basedir}/build.properties.dist" tofile="${dist.dir}/build.properties" failonerror="false">
- </copy>
- <antcall target="common-build.dist"/>
- </target>
-
- <target name="zip-dist" description="zip the dist">
- <zip zipfile="${dist.dir}-${version}.zip">
- <zipfileset prefix="${name}-${version}" dir="${dist.dir}"/>
- </zip>
- <tar compression="gzip" tarfile="${dist.dir}-${version}.tar.gz">
- <tarfileset prefix="${name}-${version}" dir="${dist.dir}"/>
- </tar>
- </target>
-
- <target name="profile" depends="compiletest">
- <java classname="org.hibernate.ejb.test.Profile" fork="true">
- <jvmarg value="-XrunjbossInspector:c:\profiler\data,include=org.hibernate.ejb,ignore=*,wakeupOnStartup=true"/>
- <classpath>
- <fileset dir="${jdbc.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.zip"/>
- </fileset>
- <dirset dir="${build.testresources.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.par"/>
- </dirset>
-
- <fileset dir="${build.testresources.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.par"/>
- </fileset>
- <path refid="lib.class.path"/>
- <pathelement path="${classes.dir}"/>
- <!-- pathelement path="build/test.par"/ -->
- <pathelement path="${src.dir}"/>
- <!-- pick up properties from here -->
- <pathelement path="${test.dir}"/>
- <!-- pick up mappings from here -->
- </classpath>
- </java>
- </target>
-
-
-</project>
Copied: trunk/HibernateExt/entitymanager/build.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/build.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/build.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,378 @@
+<!--
+
+ Hibernate Annotations ANT build script.
+
+ You need JDK 5.0 installed to build Hibernate EntityManager.
+
+-->
+
+<project name="HibernateEntityManager" default="dist" basedir=".">
+
+ <!-- Give user a chance to override without editing this file
+ (and without typing -D each time it compiles it) -->
+ <property file="build.properties"/>
+ <property file="${user.home}/.ant.properties"/>
+
+ <!-- Name of project and version, used to create filenames -->
+ <property name="Name" value="Hibernate EntityManager"/>
+ <property name="name" value="hibernate-entitymanager"/>
+ <property name="version" value="3.2.2.GA"/>
+ <property name="javadoc.packagenames" value="org.hibernate.ejb.*"/>
+ <property name="jdbc.dir" value="jdbc"/>
+ <property name="copy.test" value="true"/>
+ <property name="javac.source" value="1.5"/>
+ <property name="javac.target" value="1.5"/>
+ <property name="common.dir" value="../common"/>
+
+ <available property="jpa-present" file="${basedir}/../jpa-api" type="dir"/>
+ <property name="jpa-api.jar" value="${basedir}/../jpa-api/build/ejb3-persistence.jar"/>
+ <property name="annotations.jar"
+ value="${basedir}/../annotations/target/hibernate-annotations/hibernate-annotations.jar"/>
+ <property name="validator.jar"
+ value="${basedir}/../validator/target/hibernate-validator/hibernate-validator.jar"/>
+ <property name="commons-annotations.jar"
+ value="${basedir}/../commons-annotations/target/hibernate-commons-annotations/hibernate-commons-annotations.jar"/>
+
+ <import file="${common.dir}/common-build.xml"/>
+ <property name="jpa-javadoc.dir" value="${dist.doc.dir}/jpa-api"/>
+
+
+ <property name="resources.dir" value="src/resources"/>
+ <property name="testresources.dir" value="src/test-resources"/>
+ <property name="build.testresources.dir" value="${build.dir}/testresources"/>
+ <property name="build.temp.dir" value="${build.dir}/temp"/>
+
+ <path id="lib.moduleclass.path">
+ <pathelement location="${jpa-api.jar}"/>
+ <pathelement location="${commons-annotations.jar}"/>
+ <pathelement location="${annotations.jar}"/>
+ <pathelement location="${validator.jar}"/>
+ </path>
+ <path id="junit.moduleclasspath">
+ <pathelement location="${src.dir}"/>
+ <pathelement location="${test.dir}"/>
+ <fileset dir="${jdbc.dir}">
+ <include name="*.jar"/>
+ <include name="*.zip"/>
+ </fileset>
+ <fileset dir="${lib.dir}/test">
+ <include name="*.jar"/>
+ <include name="*.zip"/>
+ </fileset>
+ </path>
+
+ <target name="init">
+ <antcall target="common-build.init"/>
+ <!-- check for dependency artefacts -->
+ <available file="${jpa-api.jar}" type="file" property="jpa-api.jar.available"/>
+ <available file="${commons-annotations.jar}" type="file" property="commons-annotations.jar.available"/>
+ <available file="${annotations.jar}" type="file" property="annotations.jar.available"/>
+ <available file="${validator.jar}" type="file" property="validator.jar.available"/>
+ <mkdir dir="${lib.dir}/test"/>
+ </target>
+
+ <target name="get.jpa-api" depends="init" unless="jpa-api.jar.available">
+ <ant inheritall="false" dir="${basedir}/../jpa-api" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../jpa-api" target="jar"/>
+ </target>
+
+ <target name="get.commons-annotations" depends="init" unless="commons-annotations.jar.available">
+ <ant inheritall="false" dir="${basedir}/../commons-annotations" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../commons-annotations" target="jar"/>
+ </target>
+
+ <target name="get.annotations" depends="init" unless="annotations.jar.available">
+ <ant inheritall="false" dir="${basedir}/../annotations" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../annotations" target="jar"/>
+ </target>
+
+ <target name="get.validator" depends="init" unless="validator.jar.available">
+ <ant inheritall="false" dir="${basedir}/../validator" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../validator" target="jar"/>
+ </target>
+
+ <target name="compile" depends="init,get.jpa-api,get.commons-annotations,get.annotations,get.validator" description="Compile the Java source code">
+ <available
+ classname="org.eclipse.core.launcher.Main"
+ property="build.compiler"
+ value="org.eclipse.jdt.core.JDTCompilerAdapter"
+ classpath="${java.class.path}"/>
+ <javac
+ srcdir="${src.dir}"
+ destdir="${classes.dir}"
+ classpathref="lib.class.path"
+ debug="${javac.debug}"
+ optimize="${javac.optimize}"
+ nowarn="on"
+ source="${javac.source}"
+ target="${javac.target}"
+ >
+ </javac>
+ </target>
+
+ <target name="packjar">
+ <property name="extension" value="jar"/>
+ <property name="packagename" value="${jarname}"/>
+ <!-- property name="jarname"/ -->
+ <mkdir dir="${build.testresources.dir}"/>
+ <jar destfile="${build.testresources.dir}/${jarname}.${extension}">
+ <!-- fileset dir="${build.temp.dir}"/ -->
+ <fileset dir="${classes.dir}">
+ <include name="**/test/pack/${packagename}/**.*"/>
+ </fileset>
+ <fileset dir="${testresources.dir}/${jarname}">
+ <include name="**/*.*"/>
+ </fileset>
+ </jar>
+ <delete dir="${build.temp.dir}"/>
+ </target>
+
+ <target name="packexploded">
+ <property name="extension" value="jar"/>
+ <!-- property name="jarname"/ -->
+ <mkdir dir="${build.testresources.dir}/${jarname}.${extension}"/>
+ <copy todir="${build.testresources.dir}/${jarname}.${extension}">
+ <!-- fileset dir="${build.temp.dir}"/ -->
+ <fileset dir="${classes.dir}">
+ <include name="**/test/pack/${jarname}/**.*"/>
+ </fileset>
+ <fileset dir="${testresources.dir}/${jarname}">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+ <delete dir="${build.temp.dir}"/>
+ </target>
+
+ <target name="test-resources" description="Prepare all needed jars and pars">
+ <antcall target="packjar" inheritall="true">
+ <param name="extension" value="par"/>
+ <param name="jarname" value="defaultpar"/>
+ </antcall>
+ <antcall target="packjar" inheritall="true">
+ <param name="extension" value="par"/>
+ <param name="jarname" value="space par"/>
+ <param name="packagename" value="spacepar"/>
+ </antcall>
+ <antcall target="packjar" inheritall="true">
+ <param name="extension" value="par"/>
+ <param name="jarname" value="explicitpar"/>
+ </antcall>
+ <antcall target="packjar" inheritall="true">
+ <param name="extension" value="par"/>
+ <param name="jarname" value="excludehbmpar"/>
+ </antcall>
+ <antcall target="packjar" inheritall="true">
+ <param name="extension" value="jar"/>
+ <param name="jarname" value="externaljar"/>
+ </antcall>
+ <antcall target="packjar" inheritall="true">
+ <param name="extension" value="par"/>
+ <param name="jarname" value="cfgxmlpar"/>
+ </antcall>
+ <antcall target="packjar" inheritall="true">
+ <param name="extension" value="jar"/>
+ <param name="jarname" value="overridenpar"/>
+ </antcall>
+
+ <antcall target="packexploded" inheritall="true">
+ <param name="extension" value="par"/>
+ <param name="jarname" value="explodedpar"/>
+ </antcall>
+ </target>
+
+ <target name="compiletest" depends="compile" description="Compile the tests">
+ <available
+ classname="org.eclipse.core.launcher.Main"
+ property="build.compiler"
+ value="org.eclipse.jdt.core.JDTCompilerAdapter"
+ classpath="${java.class.path}"/>
+ <javac
+ srcdir="${test.dir}"
+ destdir="${classes.dir}"
+ debug="${javac.debug}"
+ optimize="${javac.optimize}"
+ nowarn="on"
+ source="${javac.source}"
+ target="${javac.target}">
+ <classpath>
+ <path refid="lib.class.path"/>
+ </classpath>
+ </javac>
+ </target>
+
+ <target name="junit" depends="compiletest,test-resources">
+ <mkdir dir="test_output"/>
+ <mkdir dir="${classes.dir}/META-INF/services"/>
+ <copy todir="${classes.dir}">
+ <fileset dir="${resources.dir}">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+ <junit fork="once" printsummary="yes" haltonfailure="yes">
+ <classpath>
+ <fileset dir="${jdbc.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.zip"/>
+ </fileset>
+ <dirset dir="${build.testresources.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.par"/>
+ </dirset>
+
+ <fileset dir="${build.testresources.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.par"/>
+ </fileset>
+ <path refid="lib.class.path"/>
+ <!-- pathelement path="${classes.dir}"/ -->
+ <dirset dir="${classes.dir}">
+ <exclude name="**/pack/**.*"/>
+ </dirset>
+
+ <!-- pathelement path="build/test.par"/ -->
+ <pathelement path="${src.dir}"/>
+ <!-- pick up properties from here -->
+ <pathelement path="${test.dir}"/>
+ <!-- pick up mappings from here -->
+ </classpath>
+ <formatter type="plain"/>
+ <formatter type="xml"/>
+ <batchtest fork="yes" todir="test_output" haltonfailure="no">
+ <fileset dir="${classes.dir}">
+ <include name="**/*Test.class"/>
+ </fileset>
+ </batchtest>
+ </junit>
+ </target>
+
+ <!-- Run a single unit test. -->
+ <target name="junitsingle" depends="compiletest"
+ description="Run a single test suite (requires testname and jdbc.driver properties)">
+ <mkdir dir="test_output"/>
+ <junit printsummary="yes" fork="yes" haltonfailure="yes">
+ <classpath>
+ <fileset dir="${jdbc.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.zip"/>
+ </fileset>
+ <path refid="lib.class.path"/>
+ <pathelement path="build/test.par"/>
+ <pathelement path="target/hibernate-entitymanager/hibernate-entitymanager.jar"/>
+ <pathelement path="${src.dir}"/>
+ <!-- pick up properties from here -->
+ <pathelement path="${test.dir}"/>
+ <!-- pick up mappings from here -->
+ </classpath>
+ <formatter type="plain"/>
+ <formatter type="xml"/>
+ <test fork="yes" todir="test_output" haltonfailure="no" name="${testname}"/>
+ </junit>
+ </target>
+
+ <target name="jar" depends="compile" description="Build the distribution .jar file">
+ <mkdir dir="${classes.dir}/META-INF/services"/>
+ <copy todir="${classes.dir}">
+ <fileset dir="${resources.dir}">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+ <manifest file="${classes.dir}/META-INF/MANIFEST.MF">
+ <attribute name="Product" value="${Name}"/>
+ <attribute name="Version" value="${version}"/>
+ </manifest>
+ <antcall target="common-build.jar"/>
+ </target>
+
+ <!-- target name="javadoc" description="Compile the Javadoc API documentation to dist dir">
+ <echo>Skipping java doc since ant's javadoc task cannot handle an alternative javadoc</echo>
+ </target -->
+
+ <target name="jpa-javadoc" if="jpa-present">
+ <mkdir dir="${jpa-javadoc.dir}"/>
+ <ant dir="../jpa-api" target="javadoc" inheritAll="false"/>
+ <copy todir="${jpa-javadoc.dir}">
+ <fileset dir="${basedir}/../jpa-api/build/api">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <!-- Some of this can probably be moved to common-build... -->
+ <target name="dist" depends="jar,javadoc,jpa-javadoc,copysource,copytest,copylib,extras" description="Build everything">
+
+ <ant inheritall="false" dir="${basedir}/doc/reference"/>
+ <copy todir="${dist.dir}/doc/reference" failonerror="false">
+ <fileset dir="${basedir}/doc/reference/build">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+
+ <copy todir="${dist.dir}/resources" failonerror="false">
+ <fileset dir="${resources.dir}">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+ <copy todir="${dist.dir}/test-resources" failonerror="false">
+ <fileset dir="${testresources.dir}">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+ <copy todir="${dist.dir}" failonerror="false">
+ <fileset dir="${common.dir}">
+ <include name="common-build.xml"/>
+ </fileset>
+ </copy>
+
+ <!-- copy dependencies -->
+ <copy todir="${dist.lib.dir}" failonerror="false">
+ <fileset file="${jpa-api.jar}"/>
+ <fileset file="${commons-annotations.jar}"/>
+ <fileset file="${annotations.jar}"/>
+ <fileset file="${validator.jar}"/>
+ </copy>
+ <mkdir dir="${dist.lib.dir}/test"/>
+
+ <copy file="${basedir}/build.properties.dist" tofile="${dist.dir}/build.properties" failonerror="false">
+ </copy>
+ <antcall target="common-build.dist"/>
+ </target>
+
+ <target name="zip-dist" description="zip the dist">
+ <zip zipfile="${dist.dir}-${version}.zip">
+ <zipfileset prefix="${name}-${version}" dir="${dist.dir}"/>
+ </zip>
+ <tar compression="gzip" tarfile="${dist.dir}-${version}.tar.gz">
+ <tarfileset prefix="${name}-${version}" dir="${dist.dir}"/>
+ </tar>
+ </target>
+
+ <target name="profile" depends="compiletest">
+ <java classname="org.hibernate.ejb.test.Profile" fork="true">
+ <jvmarg value="-XrunjbossInspector:c:\profiler\data,include=org.hibernate.ejb,ignore=*,wakeupOnStartup=true"/>
+ <classpath>
+ <fileset dir="${jdbc.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.zip"/>
+ </fileset>
+ <dirset dir="${build.testresources.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.par"/>
+ </dirset>
+
+ <fileset dir="${build.testresources.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.par"/>
+ </fileset>
+ <path refid="lib.class.path"/>
+ <pathelement path="${classes.dir}"/>
+ <!-- pathelement path="build/test.par"/ -->
+ <pathelement path="${src.dir}"/>
+ <!-- pick up properties from here -->
+ <pathelement path="${test.dir}"/>
+ <!-- pick up mappings from here -->
+ </classpath>
+ </java>
+ </target>
+
+
+</project>
Deleted: trunk/HibernateExt/entitymanager/changelog.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/changelog.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/changelog.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,269 +0,0 @@
-Hibernate EntityManager Changelog
-==================================
-
-3.2.1.GA (8-12-2006)
---------------------
-
-** Bug
- * [EJB-226] - JarVistor.getVisitor does not handle paths containing spaces correctly for an exploded par
- * [EJB-229] - merge fails with detached obj in 1:1 relationship
- * [EJB-237] - merge() causes version to increase
- * [EJB-240] - attribute-override and embedded in orm.xml not working
- * [EJB-244] - JarVisitor fails on exploded archives with spaces in path
- * [EJB-247] - HibernatePersistence does not play well with other PersistenceProviders
- * [EJB-252] - Clarify documentation on package use in persistence.xml <class> (and it's meaning)
- * [EJB-253] - Support Weblogic JAR URL in JavaSE mode
-
-
-** Improvement
- * [EJB-232] - Better documentation for <jar-file> and scanning outside of PU root
- * [EJB-243] - Error in Documentation: persistence.xml for typical Java SE Environment
- * [EJB-246] - Consider being in a JavaEE container when jta-datasource is used
- * [EJB-248] - Wrap StaleStateException into an OptimisticLockException during em.getTransaction().commit()
- * [EJB-254] - Allow DataSource overriding through createEntityManager(String, Map override)
- * [EJB-256] - Avoid JAR locking on Windows and Tomcat due to URLConnection caching
-
-
-3.2.0.GA (16-10-2006)
----------------------
-Same code base as 3.2.0.CR3
-
-** Task
- * [EJB-239] - Add EJB 3.0 JavaDoc to the distribution
-
-
-3.2.0.CR3 (04-10-2006)
-----------------------
-** Bug
- * [EJB-150] - JarVisitor.addElement does not close passed input streams
- * [EJB-221] - TransientObjectException with FetchType.LAZY on @ManyToOne and field access on target entity
- * [EJB-231] - Optimistic locking exception could lead to java.lang.IllegalArgumentException: id to load is required for loading
-
-
-** Improvement
- * [EJB-234] - Inefficiency during the flush operation
-
-
-3.2.0.CR2 (16-09-2006)
-----------------------
-** Bug
- * [EJB-98] - EntityManager.find() throws an org.hibernate.ObjectDeletedException if you find something deleted in the same TXA
- * [EJB-148] - Incorrect exception when @CollectionOfElement is used with @Where and FetchType is EAGER
- * [EJB-174] - Ejb3Configuration can't open EJB Jar file with persistence.xml in Oracle OC4J server (Jifeng Liu)
- * [EJB-181] - ExplodedJarVisitor and paths with white spaces
- * [EJB-185] - Some EJB3 exceptions does not support nested exceptions
- * [EJB-187] - RuntimeException raised in CallBack methods should be left as is
- * [EJB-188] - @PostUpdate can be called even if @PreUpdate is not when object is in DELETED state
- * [EJB-189] - em.getReference() should raise IllegalArgumentException if the id is of the wrong type
- * [EJB-190] - Query.setParameter() should raise an IllegalArgumentException if the parameter does not exist
- * [EJB-191] - Incoherent usage of getResultList(), executeUpdate() or getSingleResult() regarding the DML/Select style should raise an IllegalStateException
- * [EJB-194] - Removing a detached instance is not allowed
- * [EJB-195] - Wrong query should raise an IllegalArgumentException
- * [EJB-196] - referencing a transient instance while flushing an association non cascaded should raise IllegalStateException
- * [EJB-198] - On em.close(), tries to register the transaction even if the transaction is marked for rollback
- * [EJB-202] - Inaccurate exception message for setFirstResult in QueryImpl
- * [EJB-203] - exception when using top-level <access>PROPERTY</access> in orm.xml
- * [EJB-204] - ClassCastException when using <mapped-superclass> in orm.xml
- * [EJB-205] - refresh() should raise IllegalArgumentException if the entity is not managed
- * [EJB-207] - em.lock(..., WRITE) raise NPE on some DBs
- * [EJB-212] - excludeUnlistedClasses ignored in SE case
- * [EJB-214] - Native Query can not be used with parameter
- * [EJB-215] - EntityManager fails during transaction commit after it has been closed
- * [EJB-216] - Query.getSingleResult() whose state-field is null raise an EntityNotFoundException rather than returning null
- * [EJB-218] - markForRollback() should not swallow the original exception
- * [EJB-220] - Entity listener documentation contradicts EJB3 specification
- * [EJB-223] - EntityNotFoundDelegate not Serializable
-
-
-** Improvement
- * [EJB-82] - Query interface should support parameter lists for positions
- * [EJB-182] - Add Websphere proprietary jar protocol
- * [EJB-186] - Set the default cache provider to NoCache to prevent PU misuse to raise exceptions
- * [EJB-201] - Ejb3Configuration should output a warning if no persistence.xml is found
- * [EJB-210] - OptimisticLockStrategy should expose the underlying stale entity
- * [EJB-211] - JavaDoc the EJB 3 API
-
-** New Feature
- * [EJB-154] - Allow to create/configure an EJB3Configuration without building a sessionfactory
- * [EJB-160] - Push EJB3Configuration and SessionFactory into JNDI
- * [EJB-184] - Add EM property for FlushMode
-
-
-3.2.0.CR1 (13-05-2006)
-----------------------
-** Bug
- * [EJB-9] - Proxied instances should raise ENFE not LIE
- * [EJB-59] - count(*) return Integer and not Long
- * [EJB-101] - callback method overriding should avoid supermethod calls
- * [EJB-116] - The EntityManager's configuration overwites configurations from the hibernate.cfg.xml file
- * [EJB-167] - EntityManager must return null, if entity does not exist.
- * [EJB-168] - Do not register Synchronization on Transaction marked as rollback
- * [EJB-169] - MappingException thrown when META-INF/orm.xml is not found
- * [EJB-173] - Resetting joined transaction state on a closed entity manager raise an exception
- * [EJB-177] - in beforeCompletion phase, the transaction might not be returned causing an NPE
-
-
-** Improvement
- * [EJB-84] - Integrate the ClassFileTransformer and pass the appropriate entities to enhance
- * [EJB-159] - RESOURCE_LOCAL should be default in JavaSE
- * [EJB-172] - Use Hibernate abstraction of the ByteCodeEnhancer for class file transformation
- * [EJB-175] - Support for createNativeQuery.executeUpdate()
-
-** New Feature
- * [EJB-165] - Support interceptor and callback XML overriding
- * [EJB-170] - Try to find <mapping-file/> in the parsed JAR before delegating to the regular resource locator
-
-
-3.1.0.Beta8b (27-04-2006)
--------------------------
-
-** Bug
- * [EJB-121] - FileZippedJarVisitor can not handle URL with white spaces in windows XP professional.
- * [EJB-155] - assumes Map.Entry where string is returned
- * [EJB-156] - Setting a transaction factory raise an assertion failure
- * [EJB-166] - StaleObjectStaleException not wrapped into an optimisticLockException when merge is used
-
-
-
-** New Feature
- * [EJB-157] - Display the version number at init time to avoid user confusion regarding the version used
- * [EJB-164] - Support for EJB3 mapping files and META-INF/orm.xml
-
-
-3.1beta7 (27-03-2006)
----------------------
-
-** Bug
- * [EJB-37] - Check all the spec exceptions to be sure we raise the right ones
- * [EJB-80] - EMF bootstrapping doesn't work as documented
- * [EJB-96] - Spelling error in 2.4 section of reference doc
- * [EJB-114] - NPE when Persistence.createEntityManager(String) is used
- * [EJB-115] - wrong loglevel in PersistenceXmlLoader.java (line 101)
- * [EJB-118] - PersistenceXmlLoader logging a fail message
- * [EJB-119] - @EntityResult definition is not correct
- * [EJB-123] - Exception "EntityManager is closed" throwed when trying to check isOpen()
- * [EJB-125] - Can't use Hibernate's FlushMode.NEVER with an EntityManager
- * [EJB-134] - javax.persistence.OptimisticLockException not thrown
- * [EJB-139] - em.getTransaction() should raise IllegalStateException if accessed on a JTA EM
- * [EJB-145] - Support EntityManager.joinTransaction()
-
-
-** Improvement
- * [EJB-77] - Getting access to the annotationconfiguration behind a Ejb3Configuration
- * [EJB-135] - em.close() should close the API but let the EM in sync with the attached transaction
- * [EJB-147] - Validate persistence.xml file from persistence_1_0.xsd
-
-** New Feature
- * [EJB-90] - Mark transaction for Rollbacked on PersistenceException
- * [EJB-106] - EntityManager.lock( , LockModeType.WRITE)
- * [EJB-117] - extra persist() queue
- * [EJB-137] - Implements EntityExistsException
- * [EJB-138] - Implements EntityTransaction.setRollbackOnly()
- * [EJB-141] - Update EntityManagerFactory interface by removing PersistenceContextType and adding the overriding map
- * [EJB-142] - RollbackTransaction on JTA should clear the persistence context
- * [EJB-143] - Set the transaction_factory automatically from Transaction_type unless explicitly set
- * [EJB-144] - Failure of EntityTransaction.commit() should rollback();
-
-
-** Task
- * [EJB-107] - Check use of persistenceUnitInfo.getClassLoader()
-
-
-3.1beta6 (20-01-2006)
----------------------
-** Bug
- * [EJB-93] - @PrePersist callback not called on cascade
- * [EJB-110] - misnamed method in PersistenceUnitInfo
- * [EJB-111] - close() throws IllegalStateException( "transaction in progress")
-
-** New Feature
- * [EJB-50] - Entity callbacks should handle subclassing
- * [EJB-83] - PersistentUnitInfo and new persistence.xml schema as per the pfd
- * [EJB-85] - Support CUD operations out of transactions
- * [EJB-86] - EntityManager.getFlushMode()
- * [EJB-87] - EntityManager.lock( , LockModeType.READ)
- * [EJB-88] - EntityManager.clear()
- * [EJB-89] - Replace EntityNotFoundException to NoResultException for query.getSingleResult()
- * [EJB-91] - persistence.xml structure changes as per the PFD
- * [EJB-92] - Implements transactional-type
- * [EJB-104] - Flag for class file transformation
- * [EJB-108] - Support EJB3 overriding properties (provider, jta / non-jta datasource, transactionType) over persistence.xml
-
-
-** Improvement
- * [EJB-100] - Multiple lifecycle per event
- * [EJB-102] - EJB3 no longer requires to rollback the ids
-
-
-** Deprecation
- * [EJB-105] - Implicit positional parameters for EJBQL queries is no longer supported
-
-3.1beta5 (13-12-2005)
----------------------
-** Bug
- * [EJB-52] - PERSIST cascade loads unilitialized elements at flush time
- * [EJB-68] - hibernate.ejb.interceptor property in persistence.xml is ignored
- * [EJB-73] - Id is not set in @PostPersist
- * [EJB-76] - JarVisitor unqualify algorithm fails when the name ends with 'ar' and is less than 4 chars
- * [EJB-78] - default value for hibernate.transaction.flush_before_completion
-
-** New Feature
- * [EJB-58] - Support @MyAnnotation annotated with an @EntityListener
- * [EJB-71] - Support custom event listeners
-
-
-** Improvement
- * [EJB-35] - Support custom NamingStrategy as property.
- * [EJB-72] - Make setDataSource() more out of container friendly
- * [EJB-75] - Fall back to <property name="blah">blah</property> when the value attribute is empty
- * [EJB-79] - Package.getPackage() returns null on some classloaders
-
-
-3.1beta4 (07-10-2005)
----------------------
- * EJB-67 Lazy access to the stream in JarVisitor leading to a non access when filters are empty (ie no filters)
- * EJB-65 handle eclipse bundleresource url protocol during metadata search
- * EJB-66 Support all url protocols that returns zip streams for jars like http
- * EJB-62 Error during stateful session bean passivation
- * EJB-61 implicit parameter ? no longer supported
- * EJB-63 Positional parameters should start from index 1 to say sort of consistent with the spec
-
-3.1beta3 (14-09-2005)
----------------------
- * EJB-6 Support ?1, ?2 style positional parameters
- * EJB-60 Support byte code instrumentation via a ClassFileTransformer
- * EJB-55 Problems using a .par file with Tomcat
- * EJB-56 Support exploded jar files *not* ending with .xar
- * EJB-51 Support persistence.xml declaration and hibernate.cfg.xml
- * EJB-53 DELETE_ORPHAN not executed at flush time
- * EJB-52 Persist cascade loads uninitialized elements at flush time
- * EJB-43 Autodetection magic leads to duplicate imports
- * EJB-24 ByteArrayBlobType incompatible with Oracle
- * EJB-28 create an EMF through PersistenceInfo
- * EJB-44 Support Hibernate Interceptors in EJB3 imlementation as an extension
- * EJB-40 Entity callbacks should cast away access modifiers
- * EJB-48 Plug Validator framework into HEM
- * EJB-47 Validator and Jacc event listeners clashes
-
-3.1beta2 (04-08-2005)
----------------------
- * Support package names in <class></class>
- * EJB-42 Autodetection magic ignores hibernate.cfg.xml
- * EJB-45 Allow to disable autodetection in .par through a property
- * EJB-41 Short-circuit dirty checking when no callback are actually called
- * EJB-38 Standalone EM should search for package-info files
- * EJB-31 Out-of-container should search for .hbm.xml files
- * EJB-29 Lifecycle callbacks and dirty checking clash
- * EJB-36 proxied instances raise an exception in em.contains()
- * EJB-28 support injected DataSource
- * EJB-34 EMF.isOpen() is wrong
- * EJB-27 Support transaction-less operations with getEntityManager()
- * EJB-23 No lifecycle interceptor used when getCurrentSession() is called
- * EJB-20 Sync Hibernate *state* and entity on lifecycle @Callbacks
- * EJB-21 NPE in TransactionImpl.isActive() when tx is not initialized (Shane Bryzak)
- * EJB-19 <jar-file/> analysed, but the resource path is mandatory and not only the jar name
- * EJB-18 get mapped classes from .par files both exploded and regular zip
-
-3.1beta1 Preview (24-06-2005)
------------------------------
-Initial release
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/changelog.txt (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/changelog.txt)
===================================================================
--- trunk/HibernateExt/entitymanager/changelog.txt (rev 0)
+++ trunk/HibernateExt/entitymanager/changelog.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,269 @@
+Hibernate EntityManager Changelog
+==================================
+
+3.2.1.GA (8-12-2006)
+--------------------
+
+** Bug
+ * [EJB-226] - JarVistor.getVisitor does not handle paths containing spaces correctly for an exploded par
+ * [EJB-229] - merge fails with detached obj in 1:1 relationship
+ * [EJB-237] - merge() causes version to increase
+ * [EJB-240] - attribute-override and embedded in orm.xml not working
+ * [EJB-244] - JarVisitor fails on exploded archives with spaces in path
+ * [EJB-247] - HibernatePersistence does not play well with other PersistenceProviders
+ * [EJB-252] - Clarify documentation on package use in persistence.xml <class> (and it's meaning)
+ * [EJB-253] - Support Weblogic JAR URL in JavaSE mode
+
+
+** Improvement
+ * [EJB-232] - Better documentation for <jar-file> and scanning outside of PU root
+ * [EJB-243] - Error in Documentation: persistence.xml for typical Java SE Environment
+ * [EJB-246] - Consider being in a JavaEE container when jta-datasource is used
+ * [EJB-248] - Wrap StaleStateException into an OptimisticLockException during em.getTransaction().commit()
+ * [EJB-254] - Allow DataSource overriding through createEntityManager(String, Map override)
+ * [EJB-256] - Avoid JAR locking on Windows and Tomcat due to URLConnection caching
+
+
+3.2.0.GA (16-10-2006)
+---------------------
+Same code base as 3.2.0.CR3
+
+** Task
+ * [EJB-239] - Add EJB 3.0 JavaDoc to the distribution
+
+
+3.2.0.CR3 (04-10-2006)
+----------------------
+** Bug
+ * [EJB-150] - JarVisitor.addElement does not close passed input streams
+ * [EJB-221] - TransientObjectException with FetchType.LAZY on @ManyToOne and field access on target entity
+ * [EJB-231] - Optimistic locking exception could lead to java.lang.IllegalArgumentException: id to load is required for loading
+
+
+** Improvement
+ * [EJB-234] - Inefficiency during the flush operation
+
+
+3.2.0.CR2 (16-09-2006)
+----------------------
+** Bug
+ * [EJB-98] - EntityManager.find() throws an org.hibernate.ObjectDeletedException if you find something deleted in the same TXA
+ * [EJB-148] - Incorrect exception when @CollectionOfElement is used with @Where and FetchType is EAGER
+ * [EJB-174] - Ejb3Configuration can't open EJB Jar file with persistence.xml in Oracle OC4J server (Jifeng Liu)
+ * [EJB-181] - ExplodedJarVisitor and paths with white spaces
+ * [EJB-185] - Some EJB3 exceptions does not support nested exceptions
+ * [EJB-187] - RuntimeException raised in CallBack methods should be left as is
+ * [EJB-188] - @PostUpdate can be called even if @PreUpdate is not when object is in DELETED state
+ * [EJB-189] - em.getReference() should raise IllegalArgumentException if the id is of the wrong type
+ * [EJB-190] - Query.setParameter() should raise an IllegalArgumentException if the parameter does not exist
+ * [EJB-191] - Incoherent usage of getResultList(), executeUpdate() or getSingleResult() regarding the DML/Select style should raise an IllegalStateException
+ * [EJB-194] - Removing a detached instance is not allowed
+ * [EJB-195] - Wrong query should raise an IllegalArgumentException
+ * [EJB-196] - referencing a transient instance while flushing an association non cascaded should raise IllegalStateException
+ * [EJB-198] - On em.close(), tries to register the transaction even if the transaction is marked for rollback
+ * [EJB-202] - Inaccurate exception message for setFirstResult in QueryImpl
+ * [EJB-203] - exception when using top-level <access>PROPERTY</access> in orm.xml
+ * [EJB-204] - ClassCastException when using <mapped-superclass> in orm.xml
+ * [EJB-205] - refresh() should raise IllegalArgumentException if the entity is not managed
+ * [EJB-207] - em.lock(..., WRITE) raise NPE on some DBs
+ * [EJB-212] - excludeUnlistedClasses ignored in SE case
+ * [EJB-214] - Native Query can not be used with parameter
+ * [EJB-215] - EntityManager fails during transaction commit after it has been closed
+ * [EJB-216] - Query.getSingleResult() whose state-field is null raise an EntityNotFoundException rather than returning null
+ * [EJB-218] - markForRollback() should not swallow the original exception
+ * [EJB-220] - Entity listener documentation contradicts EJB3 specification
+ * [EJB-223] - EntityNotFoundDelegate not Serializable
+
+
+** Improvement
+ * [EJB-82] - Query interface should support parameter lists for positions
+ * [EJB-182] - Add Websphere proprietary jar protocol
+ * [EJB-186] - Set the default cache provider to NoCache to prevent PU misuse to raise exceptions
+ * [EJB-201] - Ejb3Configuration should output a warning if no persistence.xml is found
+ * [EJB-210] - OptimisticLockStrategy should expose the underlying stale entity
+ * [EJB-211] - JavaDoc the EJB 3 API
+
+** New Feature
+ * [EJB-154] - Allow to create/configure an EJB3Configuration without building a sessionfactory
+ * [EJB-160] - Push EJB3Configuration and SessionFactory into JNDI
+ * [EJB-184] - Add EM property for FlushMode
+
+
+3.2.0.CR1 (13-05-2006)
+----------------------
+** Bug
+ * [EJB-9] - Proxied instances should raise ENFE not LIE
+ * [EJB-59] - count(*) return Integer and not Long
+ * [EJB-101] - callback method overriding should avoid supermethod calls
+ * [EJB-116] - The EntityManager's configuration overwites configurations from the hibernate.cfg.xml file
+ * [EJB-167] - EntityManager must return null, if entity does not exist.
+ * [EJB-168] - Do not register Synchronization on Transaction marked as rollback
+ * [EJB-169] - MappingException thrown when META-INF/orm.xml is not found
+ * [EJB-173] - Resetting joined transaction state on a closed entity manager raise an exception
+ * [EJB-177] - in beforeCompletion phase, the transaction might not be returned causing an NPE
+
+
+** Improvement
+ * [EJB-84] - Integrate the ClassFileTransformer and pass the appropriate entities to enhance
+ * [EJB-159] - RESOURCE_LOCAL should be default in JavaSE
+ * [EJB-172] - Use Hibernate abstraction of the ByteCodeEnhancer for class file transformation
+ * [EJB-175] - Support for createNativeQuery.executeUpdate()
+
+** New Feature
+ * [EJB-165] - Support interceptor and callback XML overriding
+ * [EJB-170] - Try to find <mapping-file/> in the parsed JAR before delegating to the regular resource locator
+
+
+3.1.0.Beta8b (27-04-2006)
+-------------------------
+
+** Bug
+ * [EJB-121] - FileZippedJarVisitor can not handle URL with white spaces in windows XP professional.
+ * [EJB-155] - assumes Map.Entry where string is returned
+ * [EJB-156] - Setting a transaction factory raise an assertion failure
+ * [EJB-166] - StaleObjectStaleException not wrapped into an optimisticLockException when merge is used
+
+
+
+** New Feature
+ * [EJB-157] - Display the version number at init time to avoid user confusion regarding the version used
+ * [EJB-164] - Support for EJB3 mapping files and META-INF/orm.xml
+
+
+3.1beta7 (27-03-2006)
+---------------------
+
+** Bug
+ * [EJB-37] - Check all the spec exceptions to be sure we raise the right ones
+ * [EJB-80] - EMF bootstrapping doesn't work as documented
+ * [EJB-96] - Spelling error in 2.4 section of reference doc
+ * [EJB-114] - NPE when Persistence.createEntityManager(String) is used
+ * [EJB-115] - wrong loglevel in PersistenceXmlLoader.java (line 101)
+ * [EJB-118] - PersistenceXmlLoader logging a fail message
+ * [EJB-119] - @EntityResult definition is not correct
+ * [EJB-123] - Exception "EntityManager is closed" throwed when trying to check isOpen()
+ * [EJB-125] - Can't use Hibernate's FlushMode.NEVER with an EntityManager
+ * [EJB-134] - javax.persistence.OptimisticLockException not thrown
+ * [EJB-139] - em.getTransaction() should raise IllegalStateException if accessed on a JTA EM
+ * [EJB-145] - Support EntityManager.joinTransaction()
+
+
+** Improvement
+ * [EJB-77] - Getting access to the annotationconfiguration behind a Ejb3Configuration
+ * [EJB-135] - em.close() should close the API but let the EM in sync with the attached transaction
+ * [EJB-147] - Validate persistence.xml file from persistence_1_0.xsd
+
+** New Feature
+ * [EJB-90] - Mark transaction for Rollbacked on PersistenceException
+ * [EJB-106] - EntityManager.lock( , LockModeType.WRITE)
+ * [EJB-117] - extra persist() queue
+ * [EJB-137] - Implements EntityExistsException
+ * [EJB-138] - Implements EntityTransaction.setRollbackOnly()
+ * [EJB-141] - Update EntityManagerFactory interface by removing PersistenceContextType and adding the overriding map
+ * [EJB-142] - RollbackTransaction on JTA should clear the persistence context
+ * [EJB-143] - Set the transaction_factory automatically from Transaction_type unless explicitly set
+ * [EJB-144] - Failure of EntityTransaction.commit() should rollback();
+
+
+** Task
+ * [EJB-107] - Check use of persistenceUnitInfo.getClassLoader()
+
+
+3.1beta6 (20-01-2006)
+---------------------
+** Bug
+ * [EJB-93] - @PrePersist callback not called on cascade
+ * [EJB-110] - misnamed method in PersistenceUnitInfo
+ * [EJB-111] - close() throws IllegalStateException( "transaction in progress")
+
+** New Feature
+ * [EJB-50] - Entity callbacks should handle subclassing
+ * [EJB-83] - PersistentUnitInfo and new persistence.xml schema as per the pfd
+ * [EJB-85] - Support CUD operations out of transactions
+ * [EJB-86] - EntityManager.getFlushMode()
+ * [EJB-87] - EntityManager.lock( , LockModeType.READ)
+ * [EJB-88] - EntityManager.clear()
+ * [EJB-89] - Replace EntityNotFoundException to NoResultException for query.getSingleResult()
+ * [EJB-91] - persistence.xml structure changes as per the PFD
+ * [EJB-92] - Implements transactional-type
+ * [EJB-104] - Flag for class file transformation
+ * [EJB-108] - Support EJB3 overriding properties (provider, jta / non-jta datasource, transactionType) over persistence.xml
+
+
+** Improvement
+ * [EJB-100] - Multiple lifecycle per event
+ * [EJB-102] - EJB3 no longer requires to rollback the ids
+
+
+** Deprecation
+ * [EJB-105] - Implicit positional parameters for EJBQL queries is no longer supported
+
+3.1beta5 (13-12-2005)
+---------------------
+** Bug
+ * [EJB-52] - PERSIST cascade loads unilitialized elements at flush time
+ * [EJB-68] - hibernate.ejb.interceptor property in persistence.xml is ignored
+ * [EJB-73] - Id is not set in @PostPersist
+ * [EJB-76] - JarVisitor unqualify algorithm fails when the name ends with 'ar' and is less than 4 chars
+ * [EJB-78] - default value for hibernate.transaction.flush_before_completion
+
+** New Feature
+ * [EJB-58] - Support @MyAnnotation annotated with an @EntityListener
+ * [EJB-71] - Support custom event listeners
+
+
+** Improvement
+ * [EJB-35] - Support custom NamingStrategy as property.
+ * [EJB-72] - Make setDataSource() more out of container friendly
+ * [EJB-75] - Fall back to <property name="blah">blah</property> when the value attribute is empty
+ * [EJB-79] - Package.getPackage() returns null on some classloaders
+
+
+3.1beta4 (07-10-2005)
+---------------------
+ * EJB-67 Lazy access to the stream in JarVisitor leading to a non access when filters are empty (ie no filters)
+ * EJB-65 handle eclipse bundleresource url protocol during metadata search
+ * EJB-66 Support all url protocols that returns zip streams for jars like http
+ * EJB-62 Error during stateful session bean passivation
+ * EJB-61 implicit parameter ? no longer supported
+ * EJB-63 Positional parameters should start from index 1 to say sort of consistent with the spec
+
+3.1beta3 (14-09-2005)
+---------------------
+ * EJB-6 Support ?1, ?2 style positional parameters
+ * EJB-60 Support byte code instrumentation via a ClassFileTransformer
+ * EJB-55 Problems using a .par file with Tomcat
+ * EJB-56 Support exploded jar files *not* ending with .xar
+ * EJB-51 Support persistence.xml declaration and hibernate.cfg.xml
+ * EJB-53 DELETE_ORPHAN not executed at flush time
+ * EJB-52 Persist cascade loads uninitialized elements at flush time
+ * EJB-43 Autodetection magic leads to duplicate imports
+ * EJB-24 ByteArrayBlobType incompatible with Oracle
+ * EJB-28 create an EMF through PersistenceInfo
+ * EJB-44 Support Hibernate Interceptors in EJB3 imlementation as an extension
+ * EJB-40 Entity callbacks should cast away access modifiers
+ * EJB-48 Plug Validator framework into HEM
+ * EJB-47 Validator and Jacc event listeners clashes
+
+3.1beta2 (04-08-2005)
+---------------------
+ * Support package names in <class></class>
+ * EJB-42 Autodetection magic ignores hibernate.cfg.xml
+ * EJB-45 Allow to disable autodetection in .par through a property
+ * EJB-41 Short-circuit dirty checking when no callback are actually called
+ * EJB-38 Standalone EM should search for package-info files
+ * EJB-31 Out-of-container should search for .hbm.xml files
+ * EJB-29 Lifecycle callbacks and dirty checking clash
+ * EJB-36 proxied instances raise an exception in em.contains()
+ * EJB-28 support injected DataSource
+ * EJB-34 EMF.isOpen() is wrong
+ * EJB-27 Support transaction-less operations with getEntityManager()
+ * EJB-23 No lifecycle interceptor used when getCurrentSession() is called
+ * EJB-20 Sync Hibernate *state* and entity on lifecycle @Callbacks
+ * EJB-21 NPE in TransactionImpl.isActive() when tx is not initialized (Shane Bryzak)
+ * EJB-19 <jar-file/> analysed, but the resource path is mandatory and not only the jar name
+ * EJB-18 get mapped classes from .par files both exploded and regular zip
+
+3.1beta1 Preview (24-06-2005)
+-----------------------------
+Initial release
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc)
Copied: trunk/HibernateExt/entitymanager/doc/reference (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference)
Property changes on: trunk/HibernateExt/entitymanager/doc/reference
___________________________________________________________________
Name: svn:ignore
+ build
Deleted: trunk/HibernateExt/entitymanager/doc/reference/.cvsignore
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/entitymanager/doc/reference/.cvsignore (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/.cvsignore)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/entitymanager/doc/reference/build.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/build.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-<project name="Documentation" default="all.doc" basedir=".">
-
- <!-- Use the core Hibernate3 doc build system -->
- <import file="../../../common/common-build.xml"/>
- <import file="${hibernate-cvs.doc.reference}/build.xml"/>
-
-
- <target name="all.doc" depends="clean">
-
- <!-- TRANSLATOR: Duplicate this call for your language -->
- <antcall target="lang.all">
- <param name="docname" value="hibernate_entitymanager"/>
- <param name="lang" value="en"/>
- </antcall>
-
- </target>
-
-</project>
Copied: trunk/HibernateExt/entitymanager/doc/reference/build.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/build.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/build.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+<project name="Documentation" default="all.doc" basedir=".">
+
+ <!-- Use the core Hibernate3 doc build system -->
+ <import file="../../../common/common-build.xml"/>
+ <import file="${hibernate-cvs.doc.reference}/build.xml"/>
+
+
+ <target name="all.doc" depends="clean">
+
+ <!-- TRANSLATOR: Duplicate this call for your language -->
+ <antcall target="lang.all">
+ <param name="docname" value="hibernate_entitymanager"/>
+ <param name="lang" value="en"/>
+ </antcall>
+
+ </target>
+
+</project>
Copied: trunk/HibernateExt/entitymanager/doc/reference/en (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en)
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/images (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/images)
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/images/hibernate_logo_a.png
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/images/hibernate_logo_a.png (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/images/hibernate_logo_a.png)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/master.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/master.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,63 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
-"../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
-<!ENTITY architecture SYSTEM "modules/architecture.xml">
-<!ENTITY configuration SYSTEM "modules/configuration.xml">
-<!ENTITY entitymanagerapi SYSTEM "modules/entitymanagerapi.xml">
-<!ENTITY transactions SYSTEM "modules/transactions.xml">
-<!ENTITY listeners SYSTEM "modules/listeners.xml">
-<!ENTITY batch SYSTEM "modules/batch.xml">
-<!ENTITY query-ejbql SYSTEM "modules/query_ejbql.xml">
-<!ENTITY native SYSTEM "modules/query_native.xml">
-]>
-<book lang="en">
- <bookinfo>
- <title>Hibernate EntityManager</title>
-
- <subtitle>User guide</subtitle>
-
- <releaseinfo>3.2.1.GA</releaseinfo>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="images/hibernate_logo_a.png" format="png" />
- </imageobject>
- </mediaobject>
- </bookinfo>
-
- <toc></toc>
-
- <preface>
- <title>Introducing EJB3 Persistence</title>
-
- <para>The EJB3 specification recognizes the interest and the success of
- the transparent object/relational mapping paradigm. The EJB3 specification
- standardizes the basic APIs and the metadata needed for any
- object/relational persistence mechanism. <emphasis>Hibernate
- EntityManager</emphasis> implements the programming interfaces and
- lifecycle rules as defined by the EJB3 persistence specification. Together
- with <emphasis>Hibernate Annotations</emphasis>, this wrapper implements a
- complete (and standalone) EJB3 persistence solution on top of the mature
- Hibernate core. You may use a combination of all three together,
- annotations without EJB3 programming interfaces and lifecycle, or even
- pure native Hibernate, depending on the business and technical needs of
- your project. You can at all times fall back to Hibernate native APIs, or
- if required, even to native JDBC and SQL.</para>
- </preface>
-
- &architecture;
-
- &configuration;
-
- &entitymanagerapi;
-
- &transactions;
-
- &listeners;
-
- &batch;
-
- &query-ejbql;
-
- &native;
-</book>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/master.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/master.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/master.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
+"../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
+<!ENTITY architecture SYSTEM "modules/architecture.xml">
+<!ENTITY configuration SYSTEM "modules/configuration.xml">
+<!ENTITY entitymanagerapi SYSTEM "modules/entitymanagerapi.xml">
+<!ENTITY transactions SYSTEM "modules/transactions.xml">
+<!ENTITY listeners SYSTEM "modules/listeners.xml">
+<!ENTITY batch SYSTEM "modules/batch.xml">
+<!ENTITY query-ejbql SYSTEM "modules/query_ejbql.xml">
+<!ENTITY native SYSTEM "modules/query_native.xml">
+]>
+<book lang="en">
+ <bookinfo>
+ <title>Hibernate EntityManager</title>
+
+ <subtitle>User guide</subtitle>
+
+ <releaseinfo>3.2.1.GA</releaseinfo>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/hibernate_logo_a.png" format="png" />
+ </imageobject>
+ </mediaobject>
+ </bookinfo>
+
+ <toc></toc>
+
+ <preface>
+ <title>Introducing EJB3 Persistence</title>
+
+ <para>The EJB3 specification recognizes the interest and the success of
+ the transparent object/relational mapping paradigm. The EJB3 specification
+ standardizes the basic APIs and the metadata needed for any
+ object/relational persistence mechanism. <emphasis>Hibernate
+ EntityManager</emphasis> implements the programming interfaces and
+ lifecycle rules as defined by the EJB3 persistence specification. Together
+ with <emphasis>Hibernate Annotations</emphasis>, this wrapper implements a
+ complete (and standalone) EJB3 persistence solution on top of the mature
+ Hibernate core. You may use a combination of all three together,
+ annotations without EJB3 programming interfaces and lifecycle, or even
+ pure native Hibernate, depending on the business and technical needs of
+ your project. You can at all times fall back to Hibernate native APIs, or
+ if required, even to native JDBC and SQL.</para>
+ </preface>
+
+ &architecture;
+
+ &configuration;
+
+ &entitymanagerapi;
+
+ &transactions;
+
+ &listeners;
+
+ &batch;
+
+ &query-ejbql;
+
+ &native;
+</book>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/modules (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules)
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/modules/architecture.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/architecture.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/architecture.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,266 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="architecture">
- <title>Architecture</title>
-
- <section>
- <title>Definitions</title>
-
- <para>EJB3 is part of the Java EE 5.0 platform. Persistence in EJB3 is
- available in EJB3 containers, as well as for standalone J2SE applications
- that execute outside of a particular container. The following programming
- interfaces and artifacts are available in both environments.</para>
-
- <variablelist spacing="compact">
- <varlistentry>
- <term>
- <literal>EntityManagerFactory</literal>
- </term>
-
- <listitem>
- <para>An entity manager factory provides entity manager instances,
- all instances are configured to connect to the same database, to use
- the same default settings as defined by the particular
- implementation, etc. You can prepare several entity manager
- factories to access several data stores. This interface is similar
- to the <literal>SessionFactory</literal> in native Hibernate.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <literal>EntityManager</literal>
- </term>
-
- <listitem>
- <para>The <literal>EntityManager</literal> API is used to access a
- database in a particular unit of work. It is used to create and
- remove persistent entity instances, to find entities by their
- primary key identity, and to query over all entities. This interface
- is similar to the <literal>Session</literal> in Hibernate.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Persistence context</term>
-
- <listitem>
- <para>A persistence context is a set of entity instances in which
- for any persistent entity identity there is a unique entity
- instance. Within the persistence context, the entity instances and
- their lifecycle is managed by a particular entity manager. The scope
- of this context can either be the transaction, or an extended unit
- of work.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Persistence unit</term>
-
- <listitem>
- <para>The set of entity types that can be managed by a given entity
- manager is defined by a persistence unit. A persistence unit defines
- the set of all classes that are related or grouped by the
- application, and which must be collocated in their mapping to a
- single data store.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Container-managed entity manager</term>
-
- <listitem>
- <para>An Entity Manager whose lifecycle is managed by the
- container</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Application-managed entity manager</term>
-
- <listitem>
- <para>An Entity Manager whose lifecycle is managed by the
- application.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>JTA entity manager</term>
-
- <listitem>
- <para>Entity manager involved in a JTA transaction</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>Resource-local entity manager</term>
-
- <listitem>
- <para>Entity manager using a resource transaction (not a JTA
- transaction).</para>
- </listitem>
- </varlistentry>
- </variablelist>
- </section>
-
- <section>
- <title>EJB container environment</title>
-
- <section>
- <title>Container-managed entity manager</title>
-
- <para>The most common and widely used entity manager in a Java EE
- environment is the container-managed entity manager. In this mode, the
- container is responsible for the opening and closing of the entity
- manager (this is transparent to the application). It is also responsible
- for transaction boundaries. A container-managed entity manager is
- obtained in an application through dependency injection or through JNDI
- lookup, A container-managed entity manger requires the use of a JTA
- transaction.</para>
- </section>
-
- <section>
- <title>Application-managed entity manager</title>
-
- <para>An application-managed entity manager allows you to control the
- entity manager in application code. This entity manager is retrieved
- through the <literal>EntityManagerFactory</literal> API. An application
- managed entity manager can be either involved in the current JTA
- transaction (a JTA entity manager), or the transaction may be controlled
- through the <literal>EntityTransaction</literal> API (a resource-local
- entity manager). The resource-local entity manager transaction maps to a
- direct resource transaction (i. e. in Hibernate's case a JDBC
- transaction). The entity manager type (JTA or resource-local) is defined
- at configuration time, when setting up the entity manager
- factory.</para>
- </section>
-
- <section id="architecture-ejb-persistctxscope">
- <title>Persistence context scope</title>
-
- <para>An entity manager is the API to interact with the persistence
- context. Two common strategies can be used: binding the persistence
- context to the transaction boundaries, or keeping the persistence
- context available across several transactions.</para>
-
- <para>The most common case is to bind the persistence context scope to
- the current transaction scope. This is only doable when JTA transactions
- are used: the persistence context is associated with the JTA transaction
- life cycle. When a entity manager is invoked, the persistence context is
- also opened, if there is no persistence context associated with the
- current JTA transaction. Otherwise, the associated persistence context
- is used. The persistence context ends when the JTA transaction
- completes. This means that during the JTA transaction, an application
- will be able to work on managed entities of the same persistence
- context. In other words, you don't have to pass the entity manager's
- persistence context across your EJB method calls, but simply use
- dependency injection or lookup whenever you need an entity
- manager.</para>
-
- <para>You can also use an extended persistence context. This can be
- combined with stateful session beans, if you use a container-managed
- entity manager: the persistence context is created when an entity
- manager is retrieved from dependency injection or JNDI lookup , and is
- kept until the container closes it after the completion of the
- <literal>Remove</literal> stateful session bean method. This is a
- perfect mechanism for implementing a "long" unit of work pattern. For
- example, if you have to deal with multiple user interaction cycles as a
- single unit of work (e.g. a wizard dialog that has to be fully
- completed), you usually model this as a unit of work from the point of
- view of the application user, and implement it using an extended
- persistence context. Please refer to the Hibernate reference manual or
- the book Hibernate In Action for more information about this pattern.
- JBoss Seam is a framework tht link together JSF and EJB3 around the
- notion of conversation and unit of work. For an application-managed
- entity manager the persistence context is created when the entity
- manager is created and kept until the entity manager is closed. In an
- extended persistence context, all modification operations (persist,
- merge, remove) executed outside a transaction are queued until the
- persistence context is attached to a transaction. The transaction
- typically occurs at the user process end, allowing the whole process to
- be commited or rollbacked. For application-managed entity manager only
- support the exctended persistence context.</para>
-
- <para>A resource-local entity manager or an entity manager created with
- <literal>EntityManagerFactory.createEntityManager()</literal>
- (application-managed) has a one-to-one relationship with a persistence
- context. In other situations <emphasis>persistence context
- propagation</emphasis> occurs.</para>
- </section>
-
- <section id="architecture-ejb-persistctxpropagation">
- <title>Persistence context propagation</title>
-
- <para>Persistence context propagation occurs for container-managed
- entity managers.</para>
-
- <para>In a transaction-scoped container managed entity manager (common
- case in a Java EE environment), the JTA transaction propagation is the
- same as the persistence context resource propagation. In other words,
- container-managed transaction-scoped entity managers retrieved within a
- given JTA transaction all share the same persistence context. In
- Hibernate terms, this means all managers share the same session.</para>
-
- <para>Important: persistence context are never shared between different
- JTA transactions or between entity manager that do not came from the
- same entity manager factory. There are some noteworthy exceptions for
- context propagation when using extended persistence contexts:</para>
-
- <itemizedlist>
- <listitem>
- <para>If a stateless session bean, message-driven bean, or stateful
- session bean with a transaction-scoped persistence context calls a
- stateful session bean with an extended persistence context in the
- same JTA transaction, an IllegalStateException is thrown.</para>
- </listitem>
-
- <listitem>
- <para>If a stateful session bean with an extended persistence
- context calls as stateless session bean or a stateful session bean
- with a transaction-scoped persistence context in the same JTA
- transaction, the persistence context is propagated.</para>
- </listitem>
-
- <listitem>
- <para>If a stateful session bean with an extended persistence
- context calls a stateless or stateful session bean in a different
- JTA transaction context, the persistence context is not
- propagated.</para>
- </listitem>
-
- <listitem>
- <para>If a stateful session bean with an extended persistence
- context instantiates another stateful session bean with an extended
- persistence context, the extended persistence context is inherited
- by the second stateful session bean. If the second stateful session
- bean is called with a different transaction context than the first,
- an IllegalStateException is thrown.</para>
- </listitem>
-
- <listitem>
- <para>If a stateful session bean with an extended persistence
- context calls a stateful session bean with a different extended
- persistence context in the same transaction, an
- IllegalStateException is thrown.</para>
- </listitem>
- </itemizedlist>
- </section>
- </section>
-
- <section id="architecture-javase" revision="1">
- <title>Java SE environments</title>
-
- <para>In a Java SE environment only extented context application-managed
- entity managers are available. You can retrieve an entity manger using the
- <literal>EntityManagerFactory</literal> API. Only resource-local entity
- managers are available. In other words, JTA transactions and persistence
- context propagation are not supported in Java SE (you will have to
- propagate the persistence context yourself, e.g. using the thread local
- session pattern popular in the Hibernate community).</para>
-
- <para>Extended context means that a persistence context is created when
- the entity manager is retrieved (using
- <literal>EntityManagerFactory.createEntityManager(...)</literal> ) and
- closed when the entity manager is closed. Many resource-local transaction
- share the same persistence context, in this case.</para>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/modules/architecture.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/architecture.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/modules/architecture.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/architecture.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,266 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="architecture">
+ <title>Architecture</title>
+
+ <section>
+ <title>Definitions</title>
+
+ <para>EJB3 is part of the Java EE 5.0 platform. Persistence in EJB3 is
+ available in EJB3 containers, as well as for standalone J2SE applications
+ that execute outside of a particular container. The following programming
+ interfaces and artifacts are available in both environments.</para>
+
+ <variablelist spacing="compact">
+ <varlistentry>
+ <term>
+ <literal>EntityManagerFactory</literal>
+ </term>
+
+ <listitem>
+ <para>An entity manager factory provides entity manager instances,
+ all instances are configured to connect to the same database, to use
+ the same default settings as defined by the particular
+ implementation, etc. You can prepare several entity manager
+ factories to access several data stores. This interface is similar
+ to the <literal>SessionFactory</literal> in native Hibernate.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <literal>EntityManager</literal>
+ </term>
+
+ <listitem>
+ <para>The <literal>EntityManager</literal> API is used to access a
+ database in a particular unit of work. It is used to create and
+ remove persistent entity instances, to find entities by their
+ primary key identity, and to query over all entities. This interface
+ is similar to the <literal>Session</literal> in Hibernate.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Persistence context</term>
+
+ <listitem>
+ <para>A persistence context is a set of entity instances in which
+ for any persistent entity identity there is a unique entity
+ instance. Within the persistence context, the entity instances and
+ their lifecycle is managed by a particular entity manager. The scope
+ of this context can either be the transaction, or an extended unit
+ of work.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Persistence unit</term>
+
+ <listitem>
+ <para>The set of entity types that can be managed by a given entity
+ manager is defined by a persistence unit. A persistence unit defines
+ the set of all classes that are related or grouped by the
+ application, and which must be collocated in their mapping to a
+ single data store.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Container-managed entity manager</term>
+
+ <listitem>
+ <para>An Entity Manager whose lifecycle is managed by the
+ container</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Application-managed entity manager</term>
+
+ <listitem>
+ <para>An Entity Manager whose lifecycle is managed by the
+ application.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>JTA entity manager</term>
+
+ <listitem>
+ <para>Entity manager involved in a JTA transaction</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>Resource-local entity manager</term>
+
+ <listitem>
+ <para>Entity manager using a resource transaction (not a JTA
+ transaction).</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+ </section>
+
+ <section>
+ <title>EJB container environment</title>
+
+ <section>
+ <title>Container-managed entity manager</title>
+
+ <para>The most common and widely used entity manager in a Java EE
+ environment is the container-managed entity manager. In this mode, the
+ container is responsible for the opening and closing of the entity
+ manager (this is transparent to the application). It is also responsible
+ for transaction boundaries. A container-managed entity manager is
+ obtained in an application through dependency injection or through JNDI
+ lookup, A container-managed entity manger requires the use of a JTA
+ transaction.</para>
+ </section>
+
+ <section>
+ <title>Application-managed entity manager</title>
+
+ <para>An application-managed entity manager allows you to control the
+ entity manager in application code. This entity manager is retrieved
+ through the <literal>EntityManagerFactory</literal> API. An application
+ managed entity manager can be either involved in the current JTA
+ transaction (a JTA entity manager), or the transaction may be controlled
+ through the <literal>EntityTransaction</literal> API (a resource-local
+ entity manager). The resource-local entity manager transaction maps to a
+ direct resource transaction (i. e. in Hibernate's case a JDBC
+ transaction). The entity manager type (JTA or resource-local) is defined
+ at configuration time, when setting up the entity manager
+ factory.</para>
+ </section>
+
+ <section id="architecture-ejb-persistctxscope">
+ <title>Persistence context scope</title>
+
+ <para>An entity manager is the API to interact with the persistence
+ context. Two common strategies can be used: binding the persistence
+ context to the transaction boundaries, or keeping the persistence
+ context available across several transactions.</para>
+
+ <para>The most common case is to bind the persistence context scope to
+ the current transaction scope. This is only doable when JTA transactions
+ are used: the persistence context is associated with the JTA transaction
+ life cycle. When a entity manager is invoked, the persistence context is
+ also opened, if there is no persistence context associated with the
+ current JTA transaction. Otherwise, the associated persistence context
+ is used. The persistence context ends when the JTA transaction
+ completes. This means that during the JTA transaction, an application
+ will be able to work on managed entities of the same persistence
+ context. In other words, you don't have to pass the entity manager's
+ persistence context across your EJB method calls, but simply use
+ dependency injection or lookup whenever you need an entity
+ manager.</para>
+
+ <para>You can also use an extended persistence context. This can be
+ combined with stateful session beans, if you use a container-managed
+ entity manager: the persistence context is created when an entity
+ manager is retrieved from dependency injection or JNDI lookup , and is
+ kept until the container closes it after the completion of the
+ <literal>Remove</literal> stateful session bean method. This is a
+ perfect mechanism for implementing a "long" unit of work pattern. For
+ example, if you have to deal with multiple user interaction cycles as a
+ single unit of work (e.g. a wizard dialog that has to be fully
+ completed), you usually model this as a unit of work from the point of
+ view of the application user, and implement it using an extended
+ persistence context. Please refer to the Hibernate reference manual or
+ the book Hibernate In Action for more information about this pattern.
+ JBoss Seam is a framework tht link together JSF and EJB3 around the
+ notion of conversation and unit of work. For an application-managed
+ entity manager the persistence context is created when the entity
+ manager is created and kept until the entity manager is closed. In an
+ extended persistence context, all modification operations (persist,
+ merge, remove) executed outside a transaction are queued until the
+ persistence context is attached to a transaction. The transaction
+ typically occurs at the user process end, allowing the whole process to
+ be commited or rollbacked. For application-managed entity manager only
+ support the exctended persistence context.</para>
+
+ <para>A resource-local entity manager or an entity manager created with
+ <literal>EntityManagerFactory.createEntityManager()</literal>
+ (application-managed) has a one-to-one relationship with a persistence
+ context. In other situations <emphasis>persistence context
+ propagation</emphasis> occurs.</para>
+ </section>
+
+ <section id="architecture-ejb-persistctxpropagation">
+ <title>Persistence context propagation</title>
+
+ <para>Persistence context propagation occurs for container-managed
+ entity managers.</para>
+
+ <para>In a transaction-scoped container managed entity manager (common
+ case in a Java EE environment), the JTA transaction propagation is the
+ same as the persistence context resource propagation. In other words,
+ container-managed transaction-scoped entity managers retrieved within a
+ given JTA transaction all share the same persistence context. In
+ Hibernate terms, this means all managers share the same session.</para>
+
+ <para>Important: persistence context are never shared between different
+ JTA transactions or between entity manager that do not came from the
+ same entity manager factory. There are some noteworthy exceptions for
+ context propagation when using extended persistence contexts:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>If a stateless session bean, message-driven bean, or stateful
+ session bean with a transaction-scoped persistence context calls a
+ stateful session bean with an extended persistence context in the
+ same JTA transaction, an IllegalStateException is thrown.</para>
+ </listitem>
+
+ <listitem>
+ <para>If a stateful session bean with an extended persistence
+ context calls as stateless session bean or a stateful session bean
+ with a transaction-scoped persistence context in the same JTA
+ transaction, the persistence context is propagated.</para>
+ </listitem>
+
+ <listitem>
+ <para>If a stateful session bean with an extended persistence
+ context calls a stateless or stateful session bean in a different
+ JTA transaction context, the persistence context is not
+ propagated.</para>
+ </listitem>
+
+ <listitem>
+ <para>If a stateful session bean with an extended persistence
+ context instantiates another stateful session bean with an extended
+ persistence context, the extended persistence context is inherited
+ by the second stateful session bean. If the second stateful session
+ bean is called with a different transaction context than the first,
+ an IllegalStateException is thrown.</para>
+ </listitem>
+
+ <listitem>
+ <para>If a stateful session bean with an extended persistence
+ context calls a stateful session bean with a different extended
+ persistence context in the same transaction, an
+ IllegalStateException is thrown.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+ </section>
+
+ <section id="architecture-javase" revision="1">
+ <title>Java SE environments</title>
+
+ <para>In a Java SE environment only extented context application-managed
+ entity managers are available. You can retrieve an entity manger using the
+ <literal>EntityManagerFactory</literal> API. Only resource-local entity
+ managers are available. In other words, JTA transactions and persistence
+ context propagation are not supported in Java SE (you will have to
+ propagate the persistence context yourself, e.g. using the thread local
+ session pattern popular in the Hibernate community).</para>
+
+ <para>Extended context means that a persistence context is created when
+ the entity manager is retrieved (using
+ <literal>EntityManagerFactory.createEntityManager(...)</literal> ) and
+ closed when the entity manager is closed. Many resource-local transaction
+ share the same persistence context, in this case.</para>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/modules/batch.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/batch.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/batch.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,90 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="batch">
- <title>Batch processing</title>
-
- <para>Batch processing has traditionally been difficult in full
- object/relational mapping. ORM is all about object state management, which
- implies that object state is available in memory. However, Hibernate has
- some features to optimize batch processing which are discussed in the
- Hibernate reference guide, however, EJB3 persistence differs
- slightly.</para>
-
- <sect1 id="batch-direct">
- <title>Bulk update/delete</title>
-
- <para>As already discussed, automatic and transparent object/relational
- mapping is concerned with the management of object state. This implies
- that the object state is available in memory, hence updating or deleting
- (using SQL <literal>UPDATE</literal> and <literal>DELETE</literal>) data
- directly in the database will not affect in-memory state. However,
- Hibernate provides methods for bulk SQL-style <literal>UPDATE</literal>
- and <literal>DELETE</literal> statement execution which are performed
- through EJB-QL (<xref linkend="queryhql" />).</para>
-
- <para>The pseudo-syntax for <literal>UPDATE</literal> and
- <literal>DELETE</literal> statements is: <literal>( UPDATE | DELETE )
- FROM? ClassName (WHERE WHERE_CONDITIONS)?</literal>. Note that:</para>
-
- <itemizedlist spacing="compact">
- <listitem>
- <para>In the from-clause, the FROM keyword is optional.</para>
- </listitem>
-
- <listitem>
- <para>There can only be a single class named in the from-clause, and
- it <emphasis>cannot</emphasis> have an alias (this is a current
- Hibernate limitation and will be removed soon).</para>
- </listitem>
-
- <listitem>
- <para>No joins (either implicit or explicit) can be specified in a
- bulk EJB-QL query. Sub-queries may be used in the where-clause.</para>
- </listitem>
-
- <listitem>
- <para>The where-clause is also optional.</para>
- </listitem>
- </itemizedlist>
-
- <para>As an example, to execute an EJB-QL <literal>UPDATE</literal>, use
- the <literal>Query.executeUpdate()</literal> method:</para>
-
- <programlisting>EntityManager entityManager = entityManagerFactory.createEntityManager();
-entityManager.getTransaction().begin();
-
-String ejbqlUpdate = "update Customer set name = :newName where name = :oldName"
-int updatedEntities = entityManager.createQuery( hqlUpdate )
- .setParameter( "newName", newName )
- .setParameter( "oldName", oldName )
- .executeUpdate();
-entityManager.getTransaction().commit();
-entityManager.close();</programlisting>
-
- <para>To execute an EJB-QL <literal>DELETE</literal>, use the same
- <literal>Query.executeUpdate()</literal> method (the method is named for
- those familiar with JDBC's
- <literal>PreparedStatement.executeUpdate()</literal>):</para>
-
- <programlisting>EntityManager entityManager = entityManagerFactory.createEntityManager();
-entityManager.getTransaction().begin();
-
-String hqlDelete = "delete Customer where name = :oldName";
-int deletedEntities = entityManager.createQuery( hqlDelete )
- .setParameter( "oldName", oldName )
- .executeUpdate();
-entityManager.getTransaction().commit();
-entityManager.close();</programlisting>
-
- <para>The <literal>int</literal> value returned by the
- <literal>Query.executeUpdate()</literal> method indicate the number of
- entities effected by the operation. This may or may not correlate with the
- number of rows effected in the database. An EJB-QL bulk operation might
- result in multiple actual SQL statements being executed, for
- joined-subclass, for example. The returned number indicates the number of
- actual entities affected by the statement. Going back to the example of
- joined-subclass, a delete against one of the subclasses may actually
- result in deletes against not just the table to which that subclass is
- mapped, but also the "root" table and potentially joined-subclass tables
- further down the inheritence hierarchy.</para>
- </sect1>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/modules/batch.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/batch.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/modules/batch.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/batch.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="batch">
+ <title>Batch processing</title>
+
+ <para>Batch processing has traditionally been difficult in full
+ object/relational mapping. ORM is all about object state management, which
+ implies that object state is available in memory. However, Hibernate has
+ some features to optimize batch processing which are discussed in the
+ Hibernate reference guide, however, EJB3 persistence differs
+ slightly.</para>
+
+ <sect1 id="batch-direct">
+ <title>Bulk update/delete</title>
+
+ <para>As already discussed, automatic and transparent object/relational
+ mapping is concerned with the management of object state. This implies
+ that the object state is available in memory, hence updating or deleting
+ (using SQL <literal>UPDATE</literal> and <literal>DELETE</literal>) data
+ directly in the database will not affect in-memory state. However,
+ Hibernate provides methods for bulk SQL-style <literal>UPDATE</literal>
+ and <literal>DELETE</literal> statement execution which are performed
+ through EJB-QL (<xref linkend="queryhql" />).</para>
+
+ <para>The pseudo-syntax for <literal>UPDATE</literal> and
+ <literal>DELETE</literal> statements is: <literal>( UPDATE | DELETE )
+ FROM? ClassName (WHERE WHERE_CONDITIONS)?</literal>. Note that:</para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>In the from-clause, the FROM keyword is optional.</para>
+ </listitem>
+
+ <listitem>
+ <para>There can only be a single class named in the from-clause, and
+ it <emphasis>cannot</emphasis> have an alias (this is a current
+ Hibernate limitation and will be removed soon).</para>
+ </listitem>
+
+ <listitem>
+ <para>No joins (either implicit or explicit) can be specified in a
+ bulk EJB-QL query. Sub-queries may be used in the where-clause.</para>
+ </listitem>
+
+ <listitem>
+ <para>The where-clause is also optional.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>As an example, to execute an EJB-QL <literal>UPDATE</literal>, use
+ the <literal>Query.executeUpdate()</literal> method:</para>
+
+ <programlisting>EntityManager entityManager = entityManagerFactory.createEntityManager();
+entityManager.getTransaction().begin();
+
+String ejbqlUpdate = "update Customer set name = :newName where name = :oldName"
+int updatedEntities = entityManager.createQuery( hqlUpdate )
+ .setParameter( "newName", newName )
+ .setParameter( "oldName", oldName )
+ .executeUpdate();
+entityManager.getTransaction().commit();
+entityManager.close();</programlisting>
+
+ <para>To execute an EJB-QL <literal>DELETE</literal>, use the same
+ <literal>Query.executeUpdate()</literal> method (the method is named for
+ those familiar with JDBC's
+ <literal>PreparedStatement.executeUpdate()</literal>):</para>
+
+ <programlisting>EntityManager entityManager = entityManagerFactory.createEntityManager();
+entityManager.getTransaction().begin();
+
+String hqlDelete = "delete Customer where name = :oldName";
+int deletedEntities = entityManager.createQuery( hqlDelete )
+ .setParameter( "oldName", oldName )
+ .executeUpdate();
+entityManager.getTransaction().commit();
+entityManager.close();</programlisting>
+
+ <para>The <literal>int</literal> value returned by the
+ <literal>Query.executeUpdate()</literal> method indicate the number of
+ entities effected by the operation. This may or may not correlate with the
+ number of rows effected in the database. An EJB-QL bulk operation might
+ result in multiple actual SQL statements being executed, for
+ joined-subclass, for example. The returned number indicates the number of
+ actual entities affected by the statement. Going back to the example of
+ joined-subclass, a delete against one of the subclasses may actually
+ result in deletes against not just the table to which that subclass is
+ mapped, but also the "root" table and potentially joined-subclass tables
+ further down the inheritence hierarchy.</para>
+ </sect1>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/modules/configuration.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/configuration.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/configuration.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,633 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="configuration">
- <title id="setup">Setup and configuration</title>
-
- <section>
- <title>Setup</title>
-
- <para>The EJB 3.0 / JPA compatible Hibernate EntityManager is built on top
- of Hibernate core and Hibernate Annotations. You have to use compatible
- versions of each module. This version is known to work on Hibernate Core
- 3.2.0.CR5, 3.2.0.GA, 3.2.1.GA and Hibernate Annotations 3.2.0.CR3, 3.2.0.GA, 3.2.1.GA.
- The following libraries have to be in your classpath: hibernate3.jar,
- hibernate-annotations.jar, hibernate-entitymanager.jar and all needed
- third party libraries for each package.(incl. ejb-persistence.jar).</para>
- </section>
-
- <section id="setup-configuration"
- xreflabel="Configuration and bootstrapping">
- <title>Configuration and bootstrapping</title>
-
- <section id="setup-configuration-packaging" revision="1">
- <title>Packaging</title>
-
- <para>The configuration for entity managers both inside an application
- server and in a standalone application reside in a persistence archive.
- A persistence archive is a JAR file which must define a
- <literal>persistence.xml</literal> file that resides in the
- <filename>META-INF</filename> folder. All properly annotated classes
- included in the archive (ie having an <literal>@Entity</literal>
- annotation), all annotated packages and all Hibernate hbm.xml files
- included in the archive will be added to the persistence unit
- configuration, so by default, your persistence.xml will be quite
- minimalist:</para>
-
- <programlisting><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_1_0.xsd"
- version="1.0">
- <persistence-unit name="sample">
- <jta-data-source>java:/DefaultDS</jta-data-source>
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
- <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
- </properties>
- </persistence-unit>
-</persistence></programlisting>
-
- <para>Here's a more complete example of a
- <filename><literal>persistence.xml</literal></filename> file</para>
-
- <programlisting><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_1_0.xsd"
- version="1.0">
- <persistence-unit name="manager1" transaction-type="JTA">
- <provider>org.hibernate.ejb.HibernatePersistence</provider>
- <jta-data-source>java:/DefaultDS</jta-data-source>
- <mapping-file>ormap.xml</mapping-file>
- <jar-file>MyApp.jar</jar-file>
- <class>org.acme.Employee</class>
- <class>org.acme.Person</class>
- <class>org.acme.Address</class>
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
- <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
- </properties>
- </persistence-unit>
-</persistence></programlisting>
-
- <variablelist spacing="compact">
- <varlistentry>
- <term>
- <code>name</code>
- </term>
-
- <listitem>
- <para>(attribute) Every entity manager must have a name.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <code>transaction-type</code>
- </term>
-
- <listitem>
- <para>(attribute) Transaction type used. Either JTA or
- RESOURCE_LOCAL (default to JTA in a JavaEE environment and to
- RESOURCE_LOCAL in a JavaSE environment). When a jta-datasource is
- used, the default is JTA, if non-jta-datasource is used,
- RESOURCE_LOCAL is used.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <code>provider</code>
- </term>
-
- <listitem>
- <para>The provider is a fully-qualified class name of the EJB
- Persistence provider. You do not have to define it if you don't
- work with several EJB3 implementations. This is needed when you
- are using multiple vendor implementations of EJB
- Persistence.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term><code>jta-data-source</code>,
- <code>non-jta-data-source</code></term>
-
- <listitem>
- <para>This is the JNDI name of where the javax.sql.DataSource is
- located. When running without a JNDI available Datasource, you
- must specify JDBC connections with Hibernate specific properties
- (see below).</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <code>mapping-file</code>
- </term>
-
- <listitem>
- <para>The class element specifies a EJB3 compliant XML mapping
- file that you will map. The file has to be in the classpath. As
- per the EJB3 specification, Hibernate EntityManager will try to
- load the mapping file located in the jar file at
- <literal>META_INF/orm.xml</literal>. Of course any explicit
- mapping file will be loaded too. As a matter of fact, you can
- provides any XML file in the mapping file element ie. either hbm
- files or EJB3 deployment descriptor.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <code>jar-file</code>
- </term>
-
- <listitem>
- <para>The jar-file elements specifies a jar to analyse. All
- properly annotated classes, annotated packages and all hbm.xml
- files part of this jar file will be added to the persistence unit
- configuration. This element is mainly used in Java EE environment.
- Use of this one in Java SE should be considered as non portable,
- in this case a absolute url is needed. You can alternatively point
- to a directory (This is especially useful when in your test
- environment, the persistence.xml file is not under the same root
- directory or jar than your domain model).</para>
-
- <programlisting> <jar-file>file:/home/turin/work/local/lab8/build/classes</jar-file></programlisting>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <code>exclude-unlisted-classes</code>
- </term>
-
- <listitem>
- <para>Do not check the main jar file for annotated classes. Only
- explicit classes will be part of the persistence unit.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <code>class</code>
- </term>
-
- <listitem>
- <para>The class element specifies a fully qualified class name
- that you will map. By default all properly annotated classes and
- all hbm.xml files found inside the archive are added to the
- persistence unit configuration. You can add some external entity
- through the class element though. As an extension to the
- specification, you can add a package name in the
- <literal><class></literal> element (eg
- <code><class>org.hibernate.eg</class></code>).
- Caution, the package will include the metadata defined at the
- package level (ie in <filename>package-info.java</filename>), it
- will not include all the classes of a given package.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>
- <code>properties</code>
- </term>
-
- <listitem>
- <para>The properties element is used to specify vendor specific
- properties. This is where you will define your Hibernate specific
- configurations. This is also where you will have to specify JDBC
- connection information as well.</para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Be sure to define the grammar definition in the
- <literal>persistence</literal> element since the EJB3 specification
- requires the schema validation. If the systemId ends with
- <literal>persistence_1_0.xsd</literal>, Hibernate entityManager will use
- the version embedded in the hibernate-entitymanager.jar. No internet
- access will be processed.</para>
-
- <programlisting><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_1_0.xsd"
- version="1.0"></programlisting>
- </section>
-
- <section id="setup-configuration-bootstrapping" revision="1">
- <title>Bootstrapping</title>
-
- <para>The EJB3 specification defines a bootstrap procedure to access the
- <classname>EntityManagerFactory</classname> and the
- <classname>EntityManager</classname>. The bootstrap class is
- <classname>javax.persistence.Persistence</classname>, e.g.</para>
-
- <programlisting>EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1");
-//or
-Map configOverrides = new HashMap();
-configOverrides.put("hibernate.hbm2ddl.auto", "create-drop");
-EntityManagerFactory programmaticEmf =
- Persistence.createEntityManagerFactory("manager1", configOverrides);</programlisting>
-
- <para>The first version is equivalent to the second with an empty map.
- The map version is a set of overrides that will take precedence over any
- properties defined in your persistence.xml files. There are a couple of
- EJB3 properties usable in the map:</para>
-
- <itemizedlist>
- <listitem>
- <para>javax.persistence.provider to define the provider class
- used</para>
- </listitem>
-
- <listitem>
- <para>javax.persistence.transactionType to define the transaction
- type used (either JTA or RESOURCE_LOCAL)</para>
- </listitem>
-
- <listitem>
- <para>javax.persistence.jtaDataSource to define the JTA datasource
- name in JNDI</para>
- </listitem>
-
- <listitem>
- <para>javax.persistence.nonJtaDataSource to define the non JTA
- datasource name in JNDI</para>
- </listitem>
- </itemizedlist>
-
- <para>When <code>Persistence.createEntityManagerFactory()</code> is
- called, the persistence implementation will search your classpath for
- any <code>META-INF/persistence.xml</code> files using the
- <code>ClassLoader.getResource("META-INF/persistence.xml")</code> method.
- Actually the <classname>Persistence</classname> class will look at all
- the Persistence Providers available in the classpath and ask each of
- them if they are responsible for the creation of the entity manager
- factory <literal>manager1</literal>. Each provider, from this list of
- resources, it will try to find an entity manager that matches the name
- you specify in the command line with what is specified in the
- persistence.xml file (of course the provider <literal>element</literal>
- must match the current persistent provider). If no persistence.xml with
- the correct name are found or if the expected persistence provider is
- not found, a <classname>PersistenceException</classname> is
- raised.</para>
-
- <para>Apart from Hibernate system-level settings, all the properties
- available in Hibernate can be set in <code>properties</code> element of
- the persistence.xml file or as an override in the map you pass to
- <code>createEntityManagerFactory()</code>. Please refer to the Hibernate
- reference documentation for a complete listing. There are however a
- couple of properties available in the EJB3 provider only.</para>
-
- <para></para>
-
- <table>
- <title>Hibernate Entity Manager specific properties</title>
-
- <tgroup cols="2">
- <colspec align="left" colname="c1" />
-
- <colspec colname="c2" colwidth="2*" />
-
- <thead>
- <row>
- <entry>Property name</entry>
-
- <entry>Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>hibernate.ejb.classcache.<classname></entry>
-
- <entry>class cache strategy [comma cache region] of the class
- Default to no cache, and default region cache to
- fully.qualified.classname (eg.
- hibernate.ejb.classcache.com.acme.Cat read-write or
- hibernate.ejb.classcache.com.acme.Cat read-write,
- MyRegion).</entry>
- </row>
-
- <row>
- <entry>hibernate.ejb.collectioncache.<collectionrole></entry>
-
- <entry>collection cache strategy [comma cache region] of the
- class Default to no cache, and default region cache to
- fully.qualified.classname.role (eg.
- hibernate.ejb.classcache.com.acme.Cat read-write or
- hibernate.ejb.classcache.com.acme.Cat read-write,
- MyRegion).</entry>
- </row>
-
- <row>
- <entry>hibernate.ejb.cfgfile</entry>
-
- <entry>XML configuration file to use to configure Hibernate (eg.
- <filename>/hibernate.cfg.xml</filename>).</entry>
- </row>
-
- <row>
- <entry>hibernate.archive.autodetection</entry>
-
- <entry>Determine which element is auto discovered by Hibernate
- Entity Manager while parsing the .par archive. (default to
- <literal>class,hbm</literal>).</entry>
- </row>
-
- <row>
- <entry>hibernate.ejb.interceptor</entry>
-
- <entry>An optional Hibernate interceptor. This interceptor has
- to implement <classname>org.hibernate.Interceptor</classname>
- and have a no-arg constructor.</entry>
- </row>
-
- <row>
- <entry>hibernate.ejb.naming_strategy</entry>
-
- <entry>An optional naming strategy. The default naming strategy
- used is <classname>EJB3NamingStrategy</classname>. You also
- might want to consider the
- <classname>DefaultComponentSafeNamingStrategy</classname>.</entry>
- </row>
-
- <row>
- <entry>hibernate.ejb.event.<eventtype></entry>
-
- <entry>Event listener list for a given eventtype. The list of
- event listeners is a comma separated fully qualified class name
- list (eg. hibernate.ejb.event.pre-load
- com.acme.SecurityListener, com.acme.AuditListener)</entry>
- </row>
-
- <row>
- <entry>hibernate.ejb.use_class_enhancer</entry>
-
- <entry>Whether or not use Application server class enhancement
- at deployment time (default to false)</entry>
- </row>
-
- <row>
- <entry>hibernate.ejb.discard_pc_on_close</entry>
-
- <entry>If true, the persistence context will be discarded (think
- clear() when the method is called. Otherwise the persistence
- context will stay alive till the transaction completion: all
- objects will remain managed, and any change will be sy,chronized
- with the database (default to false, ie wait the transaction
- completion)</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>Note that you can mix XML <literal><class></literal>
- declaration and <literal>hibernate.ejb.cfgfile</literal> usage in the
- same configuration. Be aware of the potential clashed. The properties
- set in <filename>persistence.xml</filename> will override the one in the
- defined <filename>hibernate.cfg.xml</filename>.</para>
-
- <note>
- <para>It is important that you do not override
- <literal>hibernate.transaction.factory_class</literal>, Hibernate
- EntityManager automatically set the appropriate transaction factory
- depending on the EntityManager type (ie <literal>JTA</literal> versus
- <literal>RESOURSE_LOCAL</literal>). If you are working in a Java EE
- environment, you might want to set the
- <literal>hibernate.transaction.manager_lookup_class</literal>
- though.</para>
- </note>
-
- <para>Here is a typical configuration in a J2SE environment</para>
-
- <programlisting><persistence>
- <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL">
- <class>org.hibernate.ejb.test.Cat</class>
- <class>org.hibernate.ejb.test.Distributor</class>
- <class>org.hibernate.ejb.test.Item</class>
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
- <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
- <property name="hibernate.connection.username" value="sa"/>
- <property name="hibernate.connection.password" value=""/>
- <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
- <property name="hibernate.max_fetch_depth" value="3"/>
-
- <!-- cache configuration -->
- <property name="hibernate.ejb.classcache.org.hibernate.ejb.test.Item" value="read-write"/>
- <property name="hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributors" value="read-write, RegionName"/>
-
- <!-- alternatively to <class> and <property> declarations, you can use a regular hibernate.cfg.xml file -->
- <!-- property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/hibernate.cfg.xml"/ -->
- </properties>
- </persistence-unit>
-</persistence></programlisting>
-
- <para>To ease the programmatic configuration, Hibernate Entity Manager
- provide a proprietary API. This API is very similar to the
- <classname>Configuration</classname> API and share the same concepts:
- <classname>Ejb3Configuration</classname>. Refer to the JavaDoc and the
- Hibernate reference guide for more detailed informations on how to use
- it.</para>
-
- <para>TODO: me more descriptive on some APIs like setDatasource()</para>
-
- <programlisting>Ejb3Configuration cfg = new Ejb3Configuration();
-EntityManagerFactory emf =
- cfg.configure("/mypath/hibernate.cfg.xml") //add a regular hibernate.cfg.xml
- .addProperties( properties ) //add some properties
- .setInterceptor( myInterceptorImpl ) // set an interceptor
- .addAnnotatedClass( MyAnnotatedClass.class ) //add a class to be mapped
- .addClass( NonAnnotatedClass.class ) //add an hbm.xml file using the Hibernate convention
- .addRerousce( "mypath/MyOtherCLass.hbm.xml ) //add an hbm.xml file
- .addRerousce( "mypath/orm.xml ) //add an EJB3 deployment descriptor
- .buildEntityManagerFactory(); //Create the entity manager factory</programlisting>
- </section>
- </section>
-
- <section>
- <title>Event listeners</title>
-
- <para>Hibernate Entity Manager needs to enhance Hibernate core to
- implements all the EJB3 semantics. It does that through the event listener
- system of Hibernate. Be careful when you use the event system yourself,
- you might override some of the EJB3 semantics. A safe way is to add your
- event listeners to the list given below.</para>
-
- <table>
- <title>Hibernate Entity Manager default event listeners</title>
-
- <tgroup cols="2">
- <colspec align="left" colname="c1" />
-
- <colspec colname="c2" colwidth="2*" />
-
- <thead>
- <row>
- <entry>Event</entry>
-
- <entry>Listeners</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>flush</entry>
-
- <entry>org.hibernate.ejb.event.EJB3FlushEventListener</entry>
- </row>
-
- <row>
- <entry>auto-flush</entry>
-
- <entry>org.hibernate.ejb.event.EJB3AutoFlushEventListener</entry>
- </row>
-
- <row>
- <entry>delete</entry>
-
- <entry>org.hibernate.ejb.event.EJB3DeleteEventListener</entry>
- </row>
-
- <row>
- <entry>flush-entity</entry>
-
- <entry>org.hibernate.ejb.event.EJB3FlushEntityEventListener</entry>
- </row>
-
- <row>
- <entry>merge</entry>
-
- <entry>org.hibernate.ejb.event.EJB3MergeEventListener</entry>
- </row>
-
- <row>
- <entry>create</entry>
-
- <entry>org.hibernate.ejb.event.EJB3PersistEventListener</entry>
- </row>
-
- <row>
- <entry>create-onflush</entry>
-
- <entry>org.hibernate.ejb.event.EJB3PersistOnFlushEventListener</entry>
- </row>
-
- <row>
- <entry>save</entry>
-
- <entry>org.hibernate.ejb.event.EJB3SaveEventListener</entry>
- </row>
-
- <row>
- <entry>save-update</entry>
-
- <entry>org.hibernate.ejb.event.EJB3SaveOrUpdateEventListener</entry>
- </row>
-
- <row>
- <entry>pre-insert</entry>
-
- <entry>org.hibernate.secure.JACCPreInsertEventListener,
- org.hibernate.valitator.event.ValidateEventListener</entry>
- </row>
-
- <row>
- <entry>pre-insert</entry>
-
- <entry>org.hibernate.secure.JACCPreUpdateEventListener,
- org.hibernate.valitator.event.ValidateEventListener</entry>
- </row>
-
- <row>
- <entry>pre-delete</entry>
-
- <entry>org.hibernate.secure.JACCPreDeleteEventListener</entry>
- </row>
-
- <row>
- <entry>pre-load</entry>
-
- <entry>org.hibernate.secure.JACCPreLoadEventListener</entry>
- </row>
-
- <row>
- <entry>post-delete</entry>
-
- <entry>org.hibernate.ejb.event.EJB3PostDeleteEventListener</entry>
- </row>
-
- <row>
- <entry>post-insert</entry>
-
- <entry>org.hibernate.ejb.event.EJB3PostInsertEventListener</entry>
- </row>
-
- <row>
- <entry>post-load</entry>
-
- <entry>org.hibernate.ejb.event.EJB3PostLoadEventListener</entry>
- </row>
-
- <row>
- <entry>post-update</entry>
-
- <entry>org.hibernate.ejb.event.EJB3PostUpdateEventListener</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>Note that the JACC*EventListeners are removed if the security is not
- enabled.</para>
-
- <para>You can configure the event listeners either through the properties
- (see <xref linkend="setup-configuration" />) or through the
- <methodname>ejb3configuration.getEventListeners()</methodname> API.</para>
- </section>
-
- <section>
- <title>Obtaining an EntityManager in a Java SE environment</title>
-
- <para>An entity manager factory should be considered as an immutable
- configuration holder, it is defined to point to a single datasource and to
- map a defined set of entities. This is the entry point to create and
- manage <classname>EntityManager</classname>s. The
- <classname>Persistence</classname> class is bootstrap class to create an
- entity manager factory.</para>
-
- <programlisting>// Use persistence.xml configuration
-EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1")
-EntityManager em = emf.createEntityManager(); // Retrieve an application managed entity manager
-// Work with the EM
-em.close();
-...
-emf.close(); //close at application end</programlisting>
-
- <para>An entity manager factory is typically create at application
- initialization time and closed at application end. It's creation is an
- expensive process. For those who are familiar with Hibernate, an entity
- manager factory is very much like a session factory. Actually, an entity
- manager factory is a wrapper on top of a session factory. Calls to the
- entityManagerFactory are thread safe.</para>
-
- <para>Thanks to the EntityManagerFactory, you can retrieve an extended
- entity manager. The extended entity manager keep the same persistence
- context for the lifetime of the entity manager: in other words, the
- entities are still managed between two transactions (unless you call
- entityManager.clear() in between). You can see an entity manager as a
- small wrapper on top of an Hibernate session.</para>
-
- <para>TODO explains emf.createEntityManager(Map)</para>
- </section>
-
- <section>
- <title>Various</title>
-
- <para>Hibernate Entity Manager comes with Hibernate Validator configured
- out of the box. You don't have to override any event yourself. If you do
- not use Hibernate Validator annotations in your domain model, there will
- be no performance cost. For more information on Hibernate Validator,
- please refer to the Hibernate Annotations reference guide.</para>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/modules/configuration.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/configuration.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/modules/configuration.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/configuration.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,633 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="configuration">
+ <title id="setup">Setup and configuration</title>
+
+ <section>
+ <title>Setup</title>
+
+ <para>The EJB 3.0 / JPA compatible Hibernate EntityManager is built on top
+ of Hibernate core and Hibernate Annotations. You have to use compatible
+ versions of each module. This version is known to work on Hibernate Core
+ 3.2.0.CR5, 3.2.0.GA, 3.2.1.GA and Hibernate Annotations 3.2.0.CR3, 3.2.0.GA, 3.2.1.GA.
+ The following libraries have to be in your classpath: hibernate3.jar,
+ hibernate-annotations.jar, hibernate-entitymanager.jar and all needed
+ third party libraries for each package.(incl. ejb-persistence.jar).</para>
+ </section>
+
+ <section id="setup-configuration"
+ xreflabel="Configuration and bootstrapping">
+ <title>Configuration and bootstrapping</title>
+
+ <section id="setup-configuration-packaging" revision="1">
+ <title>Packaging</title>
+
+ <para>The configuration for entity managers both inside an application
+ server and in a standalone application reside in a persistence archive.
+ A persistence archive is a JAR file which must define a
+ <literal>persistence.xml</literal> file that resides in the
+ <filename>META-INF</filename> folder. All properly annotated classes
+ included in the archive (ie having an <literal>@Entity</literal>
+ annotation), all annotated packages and all Hibernate hbm.xml files
+ included in the archive will be added to the persistence unit
+ configuration, so by default, your persistence.xml will be quite
+ minimalist:</para>
+
+ <programlisting><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_1_0.xsd"
+ version="1.0">
+ <persistence-unit name="sample">
+ <jta-data-source>java:/DefaultDS</jta-data-source>
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ </properties>
+ </persistence-unit>
+</persistence></programlisting>
+
+ <para>Here's a more complete example of a
+ <filename><literal>persistence.xml</literal></filename> file</para>
+
+ <programlisting><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_1_0.xsd"
+ version="1.0">
+ <persistence-unit name="manager1" transaction-type="JTA">
+ <provider>org.hibernate.ejb.HibernatePersistence</provider>
+ <jta-data-source>java:/DefaultDS</jta-data-source>
+ <mapping-file>ormap.xml</mapping-file>
+ <jar-file>MyApp.jar</jar-file>
+ <class>org.acme.Employee</class>
+ <class>org.acme.Person</class>
+ <class>org.acme.Address</class>
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ </properties>
+ </persistence-unit>
+</persistence></programlisting>
+
+ <variablelist spacing="compact">
+ <varlistentry>
+ <term>
+ <code>name</code>
+ </term>
+
+ <listitem>
+ <para>(attribute) Every entity manager must have a name.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <code>transaction-type</code>
+ </term>
+
+ <listitem>
+ <para>(attribute) Transaction type used. Either JTA or
+ RESOURCE_LOCAL (default to JTA in a JavaEE environment and to
+ RESOURCE_LOCAL in a JavaSE environment). When a jta-datasource is
+ used, the default is JTA, if non-jta-datasource is used,
+ RESOURCE_LOCAL is used.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <code>provider</code>
+ </term>
+
+ <listitem>
+ <para>The provider is a fully-qualified class name of the EJB
+ Persistence provider. You do not have to define it if you don't
+ work with several EJB3 implementations. This is needed when you
+ are using multiple vendor implementations of EJB
+ Persistence.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term><code>jta-data-source</code>,
+ <code>non-jta-data-source</code></term>
+
+ <listitem>
+ <para>This is the JNDI name of where the javax.sql.DataSource is
+ located. When running without a JNDI available Datasource, you
+ must specify JDBC connections with Hibernate specific properties
+ (see below).</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <code>mapping-file</code>
+ </term>
+
+ <listitem>
+ <para>The class element specifies a EJB3 compliant XML mapping
+ file that you will map. The file has to be in the classpath. As
+ per the EJB3 specification, Hibernate EntityManager will try to
+ load the mapping file located in the jar file at
+ <literal>META_INF/orm.xml</literal>. Of course any explicit
+ mapping file will be loaded too. As a matter of fact, you can
+ provides any XML file in the mapping file element ie. either hbm
+ files or EJB3 deployment descriptor.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <code>jar-file</code>
+ </term>
+
+ <listitem>
+ <para>The jar-file elements specifies a jar to analyse. All
+ properly annotated classes, annotated packages and all hbm.xml
+ files part of this jar file will be added to the persistence unit
+ configuration. This element is mainly used in Java EE environment.
+ Use of this one in Java SE should be considered as non portable,
+ in this case a absolute url is needed. You can alternatively point
+ to a directory (This is especially useful when in your test
+ environment, the persistence.xml file is not under the same root
+ directory or jar than your domain model).</para>
+
+ <programlisting> <jar-file>file:/home/turin/work/local/lab8/build/classes</jar-file></programlisting>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <code>exclude-unlisted-classes</code>
+ </term>
+
+ <listitem>
+ <para>Do not check the main jar file for annotated classes. Only
+ explicit classes will be part of the persistence unit.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <code>class</code>
+ </term>
+
+ <listitem>
+ <para>The class element specifies a fully qualified class name
+ that you will map. By default all properly annotated classes and
+ all hbm.xml files found inside the archive are added to the
+ persistence unit configuration. You can add some external entity
+ through the class element though. As an extension to the
+ specification, you can add a package name in the
+ <literal><class></literal> element (eg
+ <code><class>org.hibernate.eg</class></code>).
+ Caution, the package will include the metadata defined at the
+ package level (ie in <filename>package-info.java</filename>), it
+ will not include all the classes of a given package.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>
+ <code>properties</code>
+ </term>
+
+ <listitem>
+ <para>The properties element is used to specify vendor specific
+ properties. This is where you will define your Hibernate specific
+ configurations. This is also where you will have to specify JDBC
+ connection information as well.</para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>Be sure to define the grammar definition in the
+ <literal>persistence</literal> element since the EJB3 specification
+ requires the schema validation. If the systemId ends with
+ <literal>persistence_1_0.xsd</literal>, Hibernate entityManager will use
+ the version embedded in the hibernate-entitymanager.jar. No internet
+ access will be processed.</para>
+
+ <programlisting><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_1_0.xsd"
+ version="1.0"></programlisting>
+ </section>
+
+ <section id="setup-configuration-bootstrapping" revision="1">
+ <title>Bootstrapping</title>
+
+ <para>The EJB3 specification defines a bootstrap procedure to access the
+ <classname>EntityManagerFactory</classname> and the
+ <classname>EntityManager</classname>. The bootstrap class is
+ <classname>javax.persistence.Persistence</classname>, e.g.</para>
+
+ <programlisting>EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1");
+//or
+Map configOverrides = new HashMap();
+configOverrides.put("hibernate.hbm2ddl.auto", "create-drop");
+EntityManagerFactory programmaticEmf =
+ Persistence.createEntityManagerFactory("manager1", configOverrides);</programlisting>
+
+ <para>The first version is equivalent to the second with an empty map.
+ The map version is a set of overrides that will take precedence over any
+ properties defined in your persistence.xml files. There are a couple of
+ EJB3 properties usable in the map:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>javax.persistence.provider to define the provider class
+ used</para>
+ </listitem>
+
+ <listitem>
+ <para>javax.persistence.transactionType to define the transaction
+ type used (either JTA or RESOURCE_LOCAL)</para>
+ </listitem>
+
+ <listitem>
+ <para>javax.persistence.jtaDataSource to define the JTA datasource
+ name in JNDI</para>
+ </listitem>
+
+ <listitem>
+ <para>javax.persistence.nonJtaDataSource to define the non JTA
+ datasource name in JNDI</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>When <code>Persistence.createEntityManagerFactory()</code> is
+ called, the persistence implementation will search your classpath for
+ any <code>META-INF/persistence.xml</code> files using the
+ <code>ClassLoader.getResource("META-INF/persistence.xml")</code> method.
+ Actually the <classname>Persistence</classname> class will look at all
+ the Persistence Providers available in the classpath and ask each of
+ them if they are responsible for the creation of the entity manager
+ factory <literal>manager1</literal>. Each provider, from this list of
+ resources, it will try to find an entity manager that matches the name
+ you specify in the command line with what is specified in the
+ persistence.xml file (of course the provider <literal>element</literal>
+ must match the current persistent provider). If no persistence.xml with
+ the correct name are found or if the expected persistence provider is
+ not found, a <classname>PersistenceException</classname> is
+ raised.</para>
+
+ <para>Apart from Hibernate system-level settings, all the properties
+ available in Hibernate can be set in <code>properties</code> element of
+ the persistence.xml file or as an override in the map you pass to
+ <code>createEntityManagerFactory()</code>. Please refer to the Hibernate
+ reference documentation for a complete listing. There are however a
+ couple of properties available in the EJB3 provider only.</para>
+
+ <para></para>
+
+ <table>
+ <title>Hibernate Entity Manager specific properties</title>
+
+ <tgroup cols="2">
+ <colspec align="left" colname="c1" />
+
+ <colspec colname="c2" colwidth="2*" />
+
+ <thead>
+ <row>
+ <entry>Property name</entry>
+
+ <entry>Description</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>hibernate.ejb.classcache.<classname></entry>
+
+ <entry>class cache strategy [comma cache region] of the class
+ Default to no cache, and default region cache to
+ fully.qualified.classname (eg.
+ hibernate.ejb.classcache.com.acme.Cat read-write or
+ hibernate.ejb.classcache.com.acme.Cat read-write,
+ MyRegion).</entry>
+ </row>
+
+ <row>
+ <entry>hibernate.ejb.collectioncache.<collectionrole></entry>
+
+ <entry>collection cache strategy [comma cache region] of the
+ class Default to no cache, and default region cache to
+ fully.qualified.classname.role (eg.
+ hibernate.ejb.classcache.com.acme.Cat read-write or
+ hibernate.ejb.classcache.com.acme.Cat read-write,
+ MyRegion).</entry>
+ </row>
+
+ <row>
+ <entry>hibernate.ejb.cfgfile</entry>
+
+ <entry>XML configuration file to use to configure Hibernate (eg.
+ <filename>/hibernate.cfg.xml</filename>).</entry>
+ </row>
+
+ <row>
+ <entry>hibernate.archive.autodetection</entry>
+
+ <entry>Determine which element is auto discovered by Hibernate
+ Entity Manager while parsing the .par archive. (default to
+ <literal>class,hbm</literal>).</entry>
+ </row>
+
+ <row>
+ <entry>hibernate.ejb.interceptor</entry>
+
+ <entry>An optional Hibernate interceptor. This interceptor has
+ to implement <classname>org.hibernate.Interceptor</classname>
+ and have a no-arg constructor.</entry>
+ </row>
+
+ <row>
+ <entry>hibernate.ejb.naming_strategy</entry>
+
+ <entry>An optional naming strategy. The default naming strategy
+ used is <classname>EJB3NamingStrategy</classname>. You also
+ might want to consider the
+ <classname>DefaultComponentSafeNamingStrategy</classname>.</entry>
+ </row>
+
+ <row>
+ <entry>hibernate.ejb.event.<eventtype></entry>
+
+ <entry>Event listener list for a given eventtype. The list of
+ event listeners is a comma separated fully qualified class name
+ list (eg. hibernate.ejb.event.pre-load
+ com.acme.SecurityListener, com.acme.AuditListener)</entry>
+ </row>
+
+ <row>
+ <entry>hibernate.ejb.use_class_enhancer</entry>
+
+ <entry>Whether or not use Application server class enhancement
+ at deployment time (default to false)</entry>
+ </row>
+
+ <row>
+ <entry>hibernate.ejb.discard_pc_on_close</entry>
+
+ <entry>If true, the persistence context will be discarded (think
+ clear() when the method is called. Otherwise the persistence
+ context will stay alive till the transaction completion: all
+ objects will remain managed, and any change will be sy,chronized
+ with the database (default to false, ie wait the transaction
+ completion)</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>Note that you can mix XML <literal><class></literal>
+ declaration and <literal>hibernate.ejb.cfgfile</literal> usage in the
+ same configuration. Be aware of the potential clashed. The properties
+ set in <filename>persistence.xml</filename> will override the one in the
+ defined <filename>hibernate.cfg.xml</filename>.</para>
+
+ <note>
+ <para>It is important that you do not override
+ <literal>hibernate.transaction.factory_class</literal>, Hibernate
+ EntityManager automatically set the appropriate transaction factory
+ depending on the EntityManager type (ie <literal>JTA</literal> versus
+ <literal>RESOURSE_LOCAL</literal>). If you are working in a Java EE
+ environment, you might want to set the
+ <literal>hibernate.transaction.manager_lookup_class</literal>
+ though.</para>
+ </note>
+
+ <para>Here is a typical configuration in a J2SE environment</para>
+
+ <programlisting><persistence>
+ <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL">
+ <class>org.hibernate.ejb.test.Cat</class>
+ <class>org.hibernate.ejb.test.Distributor</class>
+ <class>org.hibernate.ejb.test.Item</class>
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+ <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
+ <property name="hibernate.connection.username" value="sa"/>
+ <property name="hibernate.connection.password" value=""/>
+ <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
+ <property name="hibernate.max_fetch_depth" value="3"/>
+
+ <!-- cache configuration -->
+ <property name="hibernate.ejb.classcache.org.hibernate.ejb.test.Item" value="read-write"/>
+ <property name="hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributors" value="read-write, RegionName"/>
+
+ <!-- alternatively to <class> and <property> declarations, you can use a regular hibernate.cfg.xml file -->
+ <!-- property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/hibernate.cfg.xml"/ -->
+ </properties>
+ </persistence-unit>
+</persistence></programlisting>
+
+ <para>To ease the programmatic configuration, Hibernate Entity Manager
+ provide a proprietary API. This API is very similar to the
+ <classname>Configuration</classname> API and share the same concepts:
+ <classname>Ejb3Configuration</classname>. Refer to the JavaDoc and the
+ Hibernate reference guide for more detailed informations on how to use
+ it.</para>
+
+ <para>TODO: me more descriptive on some APIs like setDatasource()</para>
+
+ <programlisting>Ejb3Configuration cfg = new Ejb3Configuration();
+EntityManagerFactory emf =
+ cfg.configure("/mypath/hibernate.cfg.xml") //add a regular hibernate.cfg.xml
+ .addProperties( properties ) //add some properties
+ .setInterceptor( myInterceptorImpl ) // set an interceptor
+ .addAnnotatedClass( MyAnnotatedClass.class ) //add a class to be mapped
+ .addClass( NonAnnotatedClass.class ) //add an hbm.xml file using the Hibernate convention
+ .addRerousce( "mypath/MyOtherCLass.hbm.xml ) //add an hbm.xml file
+ .addRerousce( "mypath/orm.xml ) //add an EJB3 deployment descriptor
+ .buildEntityManagerFactory(); //Create the entity manager factory</programlisting>
+ </section>
+ </section>
+
+ <section>
+ <title>Event listeners</title>
+
+ <para>Hibernate Entity Manager needs to enhance Hibernate core to
+ implements all the EJB3 semantics. It does that through the event listener
+ system of Hibernate. Be careful when you use the event system yourself,
+ you might override some of the EJB3 semantics. A safe way is to add your
+ event listeners to the list given below.</para>
+
+ <table>
+ <title>Hibernate Entity Manager default event listeners</title>
+
+ <tgroup cols="2">
+ <colspec align="left" colname="c1" />
+
+ <colspec colname="c2" colwidth="2*" />
+
+ <thead>
+ <row>
+ <entry>Event</entry>
+
+ <entry>Listeners</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>flush</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3FlushEventListener</entry>
+ </row>
+
+ <row>
+ <entry>auto-flush</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3AutoFlushEventListener</entry>
+ </row>
+
+ <row>
+ <entry>delete</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3DeleteEventListener</entry>
+ </row>
+
+ <row>
+ <entry>flush-entity</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3FlushEntityEventListener</entry>
+ </row>
+
+ <row>
+ <entry>merge</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3MergeEventListener</entry>
+ </row>
+
+ <row>
+ <entry>create</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3PersistEventListener</entry>
+ </row>
+
+ <row>
+ <entry>create-onflush</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3PersistOnFlushEventListener</entry>
+ </row>
+
+ <row>
+ <entry>save</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3SaveEventListener</entry>
+ </row>
+
+ <row>
+ <entry>save-update</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3SaveOrUpdateEventListener</entry>
+ </row>
+
+ <row>
+ <entry>pre-insert</entry>
+
+ <entry>org.hibernate.secure.JACCPreInsertEventListener,
+ org.hibernate.valitator.event.ValidateEventListener</entry>
+ </row>
+
+ <row>
+ <entry>pre-insert</entry>
+
+ <entry>org.hibernate.secure.JACCPreUpdateEventListener,
+ org.hibernate.valitator.event.ValidateEventListener</entry>
+ </row>
+
+ <row>
+ <entry>pre-delete</entry>
+
+ <entry>org.hibernate.secure.JACCPreDeleteEventListener</entry>
+ </row>
+
+ <row>
+ <entry>pre-load</entry>
+
+ <entry>org.hibernate.secure.JACCPreLoadEventListener</entry>
+ </row>
+
+ <row>
+ <entry>post-delete</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3PostDeleteEventListener</entry>
+ </row>
+
+ <row>
+ <entry>post-insert</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3PostInsertEventListener</entry>
+ </row>
+
+ <row>
+ <entry>post-load</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3PostLoadEventListener</entry>
+ </row>
+
+ <row>
+ <entry>post-update</entry>
+
+ <entry>org.hibernate.ejb.event.EJB3PostUpdateEventListener</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>Note that the JACC*EventListeners are removed if the security is not
+ enabled.</para>
+
+ <para>You can configure the event listeners either through the properties
+ (see <xref linkend="setup-configuration" />) or through the
+ <methodname>ejb3configuration.getEventListeners()</methodname> API.</para>
+ </section>
+
+ <section>
+ <title>Obtaining an EntityManager in a Java SE environment</title>
+
+ <para>An entity manager factory should be considered as an immutable
+ configuration holder, it is defined to point to a single datasource and to
+ map a defined set of entities. This is the entry point to create and
+ manage <classname>EntityManager</classname>s. The
+ <classname>Persistence</classname> class is bootstrap class to create an
+ entity manager factory.</para>
+
+ <programlisting>// Use persistence.xml configuration
+EntityManagerFactory emf = Persistence.createEntityManagerFactory("manager1")
+EntityManager em = emf.createEntityManager(); // Retrieve an application managed entity manager
+// Work with the EM
+em.close();
+...
+emf.close(); //close at application end</programlisting>
+
+ <para>An entity manager factory is typically create at application
+ initialization time and closed at application end. It's creation is an
+ expensive process. For those who are familiar with Hibernate, an entity
+ manager factory is very much like a session factory. Actually, an entity
+ manager factory is a wrapper on top of a session factory. Calls to the
+ entityManagerFactory are thread safe.</para>
+
+ <para>Thanks to the EntityManagerFactory, you can retrieve an extended
+ entity manager. The extended entity manager keep the same persistence
+ context for the lifetime of the entity manager: in other words, the
+ entities are still managed between two transactions (unless you call
+ entityManager.clear() in between). You can see an entity manager as a
+ small wrapper on top of an Hibernate session.</para>
+
+ <para>TODO explains emf.createEntityManager(Map)</para>
+ </section>
+
+ <section>
+ <title>Various</title>
+
+ <para>Hibernate Entity Manager comes with Hibernate Validator configured
+ out of the box. You don't have to override any event yourself. If you do
+ not use Hibernate Validator annotations in your domain model, there will
+ be no performance cost. For more information on Hibernate Validator,
+ please refer to the Hibernate Annotations reference guide.</para>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/modules/entitymanagerapi.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/entitymanagerapi.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/entitymanagerapi.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,777 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="objectstate">
- <title>Working with objects</title>
-
- <section>
- <title>Entity states</title>
-
- <para>Like in Hibernate (comparable terms in parantheses), an entity
- instance is in one of the following states:</para>
-
- <itemizedlist>
- <listitem>
- <para>New (transient): an entity is new if it has just been
- instantiated using the new operator, and it is not associated with a
- persistence context. It has no persistent representation in the
- database and no identifier value has been assigned.</para>
- </listitem>
-
- <listitem>
- <para>Managed (persistent): a managed entity instance is an instance
- with a persistent identity that is currently associated with a
- persistence context.</para>
- </listitem>
-
- <listitem>
- <para>Detached: the entity instance is an instance with a persistent
- identity that is no longer associated with a persistence context,
- usually because the persistence context was closed or the instance was
- evicted from the context.</para>
- </listitem>
-
- <listitem>
- <para>Removed: a removed entity instance is an instance with a
- persistent identity, associated with a persistence context, but
- scheduled for removal from the database.</para>
- </listitem>
- </itemizedlist>
-
- <para>The <classname>EntityManager</classname> API allows you to change
- the state of an entity, or in other words, to load and store objects. You
- will find persistence with EJB3 easier to understand if you think about
- object state management, not managing of SQL statements.</para>
- </section>
-
- <section>
- <title>Making objects persistent</title>
-
- <para>Once you've created a new entity instance (using the common
- <literal>new</literal> operator) it is in <literal>new</literal> state.
- You can make it persistent by associating it to an entity manager:</para>
-
- <programlisting>DomesticCat fritz = new DomesticCat();
-fritz.setColor(Color.GINGER);
-fritz.setSex('M');
-fritz.setName("Fritz");
-em.persist(fritz);</programlisting>
-
- <para>If the <literal>DomesticCat</literal> entity type has a generated
- identifier, the value is associated to the instance when
- <code>persist()</code> is called. If the identifier is not automatically
- generated, the application-assigned (usually natural) key value has to be
- set on the instance before <code>persist()</code> is called.</para>
- </section>
-
- <section>
- <title>Loading an object</title>
-
- <para>Load an entity instance by its identifier value with the entity
- manager's <code>find()</code> method:</para>
-
- <programlisting>cat = em.find(Cat.class, catId);
-
-// You may need to wrap the primitive identifiers
-long catId = 1234;
-em.find( Cat.class, new Long(catId) );</programlisting>
-
- <para>In some cases, you don't really want to load the object state, but
- just having a reference to it (ie a proxy). You can get this reference
- using the <literal>getReference()</literal> method. This is especially
- useful to link a child to its parent wo having to load the parent.</para>
-
- <programlisting>child = new Child();
-child.SetName("Henry");
-Parent parent = em.getReference(Parent.class, parentId); //no query to the DB
-child.setParent(parent);
-em.persist(child);</programlisting>
-
- <para>You can reload an entity instance and it's collections at any time
- using the <code>em.refresh()</code> operation. This is useful when
- database triggers are used to initialize some of the properties of the
- entity. Note that only the entity instance and its collections are
- refreshed unless you specify <literal>REFRESH</literal> as a cascade style
- of any associations:</para>
-
- <programlisting>em.persist(cat);
-em.flush(); // force the SQL insert and triggers to run
-em.refresh(cat); //re-read the state (after the trigger executes)</programlisting>
- </section>
-
- <section>
- <title>Querying objects</title>
-
- <para>If you don't know the identifier values of the objects you are
- looking for, you need a query. The Hibernate EntityManager implementation
- supports an easy-to-use but powerful object-oriented query language
- (EJB3-QL) which has been inspired by HQL (and vice-versa). Both query
- languages are portable across databases, the use entity and property names
- as identifiers (instead of table and column names). You may also express
- your query in the native SQL of your database, with optional support from
- EJB3 for result set conversion into Java business objects.</para>
-
- <section>
- <title>Executing queries</title>
-
- <para>EJB3QL and SQL queries are represented by an instance of
- <classname>javax.persistence.Query</classname>. This interface offers
- methods for parameter binding, result set handling, and for execution of
- the query. Queries are always created using the current entity
- manager:</para>
-
- <programlisting>List cats = em.createQuery(
- "select cat from Cat as cat where cat.birthdate < ?1")
- .setParameter(1, date, TemporalType.DATE)
- .getResultList();
-
-List mothers = em.createQuery(
- "select mother from Cat as cat join cat.mother as mother where cat.name = ?1")
- .setParameter(1, name)
- .getResultList();
-
-List kittens = em.createQuery(
- "from Cat as cat where cat.mother = ?1")
- .setEntity(1, pk)
- .getResultList();
-
-Cat mother = (Cat) em.createQuery(
- "select cat.mother from Cat as cat where cat = ?1")
- .setParameter(1, izi)
- .getSingleResult();</programlisting>
-
- <para>A query is usually executed by invoking
- <methodname>getResultList()</methodname>. This method loads the
- resulting instances of the query completly into memory. Entity instances
- retrieved by a query are in persistent state. The
- <methodname>getSingleResult() </methodname>method offers a shortcut if
- you know your query will only return a single object.</para>
-
- <section>
- <title>Projection</title>
-
- <para>An EJB3QL query queries can return tuples of objects if
- projection is used. Each result tuple is returned as an object
- array:</para>
-
- <programlisting>Iterator kittensAndMothers = sess.createQuery(
- "select kitten, mother from Cat kitten join kitten.mother mother")
- .getResultList()
- .iterator();
-
-while ( kittensAndMothers.hasNext() ) {
- Object[] tuple = (Object[]) kittensAndMothers.next();
- Cat kitten = tuple[0];
- Cat mother = tuple[1];
- ....
-}</programlisting>
- </section>
-
- <section>
- <title>Scalar results</title>
-
- <para>Queries may specify a particular property of an entity in the
- select clause, instead of an entity alias. You may call SQL aggregate
- functions as well. Returned non-transactional objects or aggregation
- results are considered "scalar" results and are not entities in
- persistent state (in other words, they are considered "read
- only"):</para>
-
- <programlisting>Iterator results = em.createQuery(
- "select cat.color, min(cat.birthdate), count(cat) from Cat cat " +
- "group by cat.color")
- .getResultList()
- .iterator();
-
-while ( results.hasNext() ) {
- Object[] row = results.next();
- Color type = (Color) row[0];
- Date oldest = (Date) row[1];
- Integer count = (Integer) row[2];
- .....
-}</programlisting>
- </section>
-
- <section>
- <title>Bind parameters</title>
-
- <para>Both named and positional query parameters are supported, the
- <literal>Query</literal> API offers several methods to bind arguments.
- The EJB3 specification numbers positional parameters from one. Named
- parameters are identifiers of the form <literal>:paramname</literal>
- in the query string. Named parameters should be prefered, they are
- more robust and easier to read and understand:</para>
-
- <programlisting>// Named parameter (preferred)
-Query q = em.createQuery("select cat from DomesticCat cat where cat.name = :name");
-q.setParameter("name", "Fritz");
-List cats = q.getResultList();
-
-// Positional parameter
-Query q = em.createQuery("select cat from DomesticCat cat where cat.name = ?1");
-q.setParameter(1, "Izi");
-List cats = q.getResultList();
-
-// Named parameter list
-List names = new ArrayList();
-names.add("Izi");
-names.add("Fritz");
-Query q = em.createQuery("select cat from DomesticCat cat where cat.name in (:namesList)");
-q.setParameter("namesList", names);
-List cats = q.list();</programlisting>
- </section>
-
- <section>
- <title>Pagination</title>
-
- <para>If you need to specify bounds upon your result set (the maximum
- number of rows you want to retrieve and/or the first row you want to
- retrieve), use the following methods:</para>
-
- <programlisting>Query q = em.createQuery("select cat from DomesticCat cat");
-q.setFirstResult(20);
-q.setMaxResults(10);
-List cats = q.getResultList(); //return cats from the 20th position to 29th</programlisting>
-
- <para>Hibernate knows how to translate this limit query into the
- native SQL of your DBMS.</para>
- </section>
-
- <section>
- <title>Externalizing named queries</title>
-
- <para>You may also define named queries through annotations:</para>
-
- <programlisting>@javax.persistence.NamedQuery(name="eg.DomesticCat.by.name.and.minimum.weight",
- query="select cat from eg.DomesticCat as cat where cat.name = ?1 and cat.weight > ?2")</programlisting>
-
- <para>Parameters are bound programatically to the named query, before
- it is executed:</para>
-
- <programlisting>Query q = em.createNamedQuery("eg.DomesticCat.by.name.and.minimum.weight");
-q.setString(1, name);
-q.setInt(2, minWeight);
-List cats = q.getResultList();</programlisting>
-
- <para>Note that the actual program code is independent of the query
- language that is used, you may also define native SQL queries in
- metadata, or use Hibernate's native facilities by placing them in XML
- mapping files.</para>
- </section>
-
- <section>
- <title>Native queries</title>
-
- <para>You may express a query in SQL, using
- <methodname>createNativeQuery()</methodname> and let Hibernate take
- care mapping from JDBC result sets to business objects. Use the
- <literal>@SqlResultSetMapping</literal> (please see the Hibernate
- Annotations reference documentation on how to map a SQL resultset
- mapping) or the entity mapping (if the column names of the query
- result are the same as the names declared in the entity mapping;
- remember that all entity columns have to be returned for this
- mechanism to work):</para>
-
- <programlisting>@SqlResultSetMapping(name="getItem", entities =
- @EntityResult(entityClass=org.hibernate.ejb.test.Item.class, fields= {
- @FieldResult(name="name", column="itemname"),
- @FieldResult(name="descr", column="itemdescription")
- })
-)
-
-Query q = em.createNativeQuery("select name as itemname, descr as itemdescription from Item", "getItem");
-item = (Item) q.getSingleResult(); //from a resultset
-
-Query q = em.createNativeQuery("select * from Item", Item.class);
-item = (Item) q.getSingleResult(); //from a class columns names match the mapping</programlisting>
-
- <note>
- <para>For more information about scalar support in named queries,
- please refers to the Hibenate Annotations documentation</para>
- </note>
- </section>
-
- <section>
- <title>Query hints</title>
-
- <para>Query hints (for performance optimization, usually) are
- implementation specific. Hints are declared using the
- <methodname>query.setHint(String name, Object value)</methodname>
- method, or through the <literal>@Named(Native)Query(hints)</literal>
- annotation Note that these are not SQL query hints! The Hibernate EJB3
- implementation offers the following query hints:</para>
-
- <table>
- <title>Hibernate query hints</title>
-
- <tgroup cols="2">
- <thead>
- <colspec colname="C1" colwidth="1*" />
-
- <colspec colname="c2" colwidth="3*" />
-
- <row>
- <entry align="center">Hint</entry>
-
- <entry align="center">Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>org.hibernate.timeout</entry>
-
- <entry>Query timeout in seconds ( eg. new Integer(10)
- )</entry>
- </row>
-
- <row>
- <entry>org.hibernate.fetchSize</entry>
-
- <entry>Number of rows fetched by the JDBC driver per roundtrip
- ( eg. new Integer(50) )</entry>
- </row>
-
- <row>
- <entry>org.hibernate.comment</entry>
-
- <entry>Add a comment to the SQL query, useful for the DBA (
- e.g. new String("fetch all orders in 1 statement") )</entry>
- </row>
-
- <row>
- <entry>org.hibernate.cacheable</entry>
-
- <entry>Whether or not a query is cacheable ( eg. new
- Boolean(true) ), defaults to false</entry>
- </row>
-
- <row>
- <entry>org.hibernate.cacheMode</entry>
-
- <entry>Override the cache mode for this query ( eg.
- CacheMode.REFRESH )</entry>
- </row>
-
- <row>
- <entry>org.hibernate.cacheRegion</entry>
-
- <entry>Cache region of this query ( eg. new
- String("regionName") )</entry>
- </row>
-
- <row>
- <entry>org.hibernate.readOnly</entry>
-
- <entry>Entities retrieved by this query will be loaded in a
- read-only mode where Hibernate will never dirty-check them or
- make changes persistent ( eg. new Boolean(true) ), default to
- false</entry>
- </row>
-
- <row>
- <entry>org.hibernate.flushMode</entry>
-
- <entry>Flush mode used for this query</entry>
- </row>
-
- <row>
- <entry>org.hibernate.cacheMode</entry>
-
- <entry>Cache mode used for this query</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>Please refer to the Hibernate reference documentation for more
- information.</para>
- </section>
- </section>
- </section>
-
- <section>
- <title>Modifying persistent objects</title>
-
- <para>Transactional managed instances (ie. objects loaded, saved, created
- or queried by the entity manager) may be manipulated by the application
- and any changes to persistent state will be persisted when the Entity
- manager is flushed (discussed later in this chapter). There is no need to
- call a particular method to make your modifications persistent. A
- straightforward wayt to update the state of an entity instance is to
- <methodname>find()</methodname> it, and then manipulate it directly, while
- the persistence context is open:</para>
-
- <programlisting>Cat cat = em.find( Cat.class, new Long(69) );
-cat.setName("PK");
-em.flush(); // changes to cat are automatically detected and persisted</programlisting>
-
- <para>Sometimes this programming model is inefficient since it would
- require both an SQL SELECT (to load an object) and an SQL UPDATE (to
- persist its updated state) in the same session. Therefore Hibernate offers
- an alternate approach, using detached instances.</para>
- </section>
-
- <section>
- <title>Modifying detached objects</title>
-
- <para>Many applications need to retrieve an object in one transaction,
- send it to the presentation layer for manipulation, and later save the
- changes in a new transaction. There can be significant user think and
- waiting time between both transactions. Applications that use this kind of
- approach in a high-concurrency environment usually use versioned data to
- ensure isolation for the "long" unit of work.</para>
-
- <para>The EJB3 specifications supports this development model by providing
- for persistence of modifications made to detached instances using the
- <methodname>EntityManager.merge()</methodname> method:</para>
-
- <programlisting>// in the first entity manager
-Cat cat = firstEntityManager.find(Cat.class, catId);
-Cat potentialMate = new Cat();
-firstEntityManager.persist(potentialMate);
-
-// in a higher layer of the application
-cat.setMate(potentialMate);
-
-// later, in a new entity manager
-secondEntityManager.merge(cat); // update cat
-secondEntityManager.merge(mate); // update mate</programlisting>
-
- <para>The <literal>merge()</literal> method merges modifications made to
- the detached instance into the corresponding managed instance, if any,
- without consideration of the state of the persistence context. In other
- words, the merged objects state overrides the persistent entity state in
- the persistence context, if one is already present. The application should
- individually <methodname>merge()</methodname> detached instances reachable
- from the given detached instance if and only if it wants their state also
- to be persistent. This can be cascaded to associated entities and
- collections, using transitive persistence, see <xref
- linkend="objectstate-transitive" />.</para>
- </section>
-
- <section>
- <title>Automatic state detection</title>
-
- <para>The merge operation is clever enough to automatically detect whether
- the merging of the detached instance has to result in an insert or update.
- In other words, you don't have to worry about passing a new instance (and
- not a detached instance) to <literal>merge()</literal>, the entity manager
- will figure this out for you:</para>
-
- <programlisting>// In the first entity manager
-Cat cat = firstEntityManager.find(Cat.class, catID);
-
-// In a higher layer of the application, detached
-Cat mate = new Cat();
-cat.setMate(mate);
-
-// Later, in a new entity manager
-secondEntityManager.merge(cat); // update existing state
-secondEntityManager.merge(mate); // save the new instance</programlisting>
-
- <para>The usage and semantics of <literal>merge()</literal> seems to be
- confusing for new users. Firstly, as long as you are not trying to use
- object state loaded in one entity manager in another new entity manager,
- you should not need to use <methodname>merge()</methodname> at all. Some
- whole applications will never use this method.</para>
-
- <para>Usually <methodname>merge()</methodname> is used in the following
- scenario:</para>
-
- <itemizedlist>
- <listitem>
- <para>the application loads an object in the first entity
- manager</para>
- </listitem>
-
- <listitem>
- <para>the object is passed up to the presentation layer</para>
- </listitem>
-
- <listitem>
- <para>some modifications are made to the object</para>
- </listitem>
-
- <listitem>
- <para>the object is passed back down to the business logic
- layer</para>
- </listitem>
-
- <listitem>
- <para>the application persists these modifications by calling
- <methodname>merge()</methodname> in a second entity manager</para>
- </listitem>
- </itemizedlist>
-
- <para>Here is the exact semantic of
- <methodname>merge()</methodname>:</para>
-
- <itemizedlist>
- <listitem>
- <para>if there is a managed instance with the same identifier
- currently associated with the persistence context, copy the state of
- the given object onto the managed instance</para>
- </listitem>
-
- <listitem>
- <para>if there is no managed instance currently associated with the
- persistence context, try to load it from the database, or create a new
- managed instance</para>
- </listitem>
-
- <listitem>
- <para>the managed instance is returned</para>
- </listitem>
-
- <listitem>
- <para>the given instance does not become associated with the
- persistence context, it remains detached and is usually
- discarded</para>
- </listitem>
- </itemizedlist>
-
- <note>
- <title>Merging vs. saveOrUpdate/saveOrUpdateCopy</title>
-
- <para>Merging in EJB3 is similar to the
- <literal>saveOrUpdateCopy()</literal> method in native Hibernate.
- However, it is not the same as the <literal>saveOrUpdate()</literal>
- method, the given instance is not reattached with the persistence
- context, but a managed instance is returned by the
- <methodname>merge()</methodname> method.</para>
- </note>
- </section>
-
- <section>
- <title>Deleting managed objects</title>
-
- <para><methodname>EntityManager.remove()</methodname> will remove an
- objects state from the database. Of course, your application might still
- hold a reference to a deleted object. You can think of
- <methodname>remove()</methodname> as making a persistent instance new (aka
- transient) again. It is not detached, and a merge would result in an
- insertion.</para>
- </section>
-
- <section>
- <title>Flush the persistence context</title>
-
- <section>
- <title>In a transaction</title>
-
- <para>From time to time the entity manager will execute the SQL DML
- statements needed to synchronize the data store with the state of
- objects held in memory. This process, flush, occurs by default (this is
- Hibernate specific and not defined by the specification) at the
- following points:</para>
-
- <itemizedlist>
- <listitem>
- <para>before query execution*</para>
- </listitem>
-
- <listitem>
- <para>from
- <methodname>javax.persistence.EntityTransaction.commit()*</methodname></para>
- </listitem>
-
- <listitem>
- <para>when <methodname>EntityManager.flush()</methodname> is
- called*</para>
- </listitem>
- </itemizedlist>
-
- <para>(*) if a transaction is active</para>
-
- <para>The SQL statements are issued in the following order</para>
-
- <itemizedlist>
- <listitem>
- <para>all entity insertions, in the same order the corresponding
- objects were saved using
- <methodname>EntityManager.persist()</methodname></para>
- </listitem>
-
- <listitem>
- <para>all entity updates</para>
- </listitem>
-
- <listitem>
- <para>all collection deletions</para>
- </listitem>
-
- <listitem>
- <para>all collection element deletions, updates and
- insertions</para>
- </listitem>
-
- <listitem>
- <para>all collection insertions</para>
- </listitem>
-
- <listitem>
- <para>all entity deletions, in the same order the corresponding
- objects were deleted using
- <methodname>EntityManager.remove()</methodname></para>
- </listitem>
- </itemizedlist>
-
- <para>(Exception: entity instances using application-assigned
- identifiers are inserted when they are saved.)</para>
-
- <para>Except when you explicity <methodname>flush()</methodname>, there
- are absolutely no guarantees about when the entity manager executes the
- JDBC calls, only the order in which they are executed. However,
- Hibernate does guarantee that the
- <methodname>Query.getResultList()</methodname>/<methodname>Query.getSingleResult()</methodname>
- will never return stale data; nor will they return wrong data if
- executed in an active transaction.</para>
-
- <para>It is possible to change the default behavior so that flush occurs
- less frequently. The <classname>FlushModeType</classname> for an entity
- manager defines two different modes: only flush at commit time or flush
- automatically using the explained routine unless
- <methodname>flush()</methodname> is called explicitly.</para>
-
- <programlisting>em = emf.createEntityManager();
-Transaction tx = em.getTransaction().begin();
-em.setFlushMode(FlushModeType.COMMIT); // allow queries to return stale state
-
-Cat izi = em.find(Cat.class, id);
-izi.setName(iznizi);
-
-// might return stale data
-em.createQuery("from Cat as cat left outer join cat.kittens kitten").getResultList();
-
-// change to izi is not flushed!
-...
-em.getTransaction().commit(); // flush occurs</programlisting>
-
- <para>During flush, an exception might happen (e.g. if a DML operation
- violates a constraint). TODO: Add link to exception handling.</para>
-
- <para>Hibernate provides more flush modes than the one described in the
- EJB3 specification. Please refer to the Hibernate core reference
- documentation for more informations.</para>
- </section>
-
- <section>
- <title>Outside a transaction</title>
-
- <para>In an <literal>EXTENDED</literal> persistence context, all read
- only operations of the entity manager can be executed outside a
- transaction (<literal>find()</literal>,
- <literal>getReference()</literal>, <literal>refresh()</literal>, and
- read queries). Some modifications operations can be executed outside a
- transaction, but they are queued until the persistence context join a
- transaction. This is the case of <literal>persist()</literal>,
- <literal><literal>merge()</literal></literal>,
- <literal>remove()</literal>. Some operations cannot be called outside a
- transaction: <literal>flush()</literal>, <literal>lock()</literal>, and
- update/delete queries.</para>
- </section>
- </section>
-
- <section id="objectstate-transitive" revision="1"
- xreflabel="Transitive persistence">
- <title>Transitive persistence</title>
-
- <para>It is quite cumbersome to save, delete, or reattach individual
- objects, especially if you deal with a graph of associated objects. A
- common case is a parent/child relationship. Consider the following
- example:</para>
-
- <para>If the children in a parent/child relationship would be value typed
- (e.g. a collection of addresses or strings), their lifecycle would depend
- on the parent and no further action would be required for convenient
- "cascading" of state changes. When the parent is persisted, the
- value-typed child objects are persisted as well, when the parent is
- removed, the children will be removed, etc. This even works for operations
- such as the removal of a child from the collection; Hibernate will detect
- this and, since value-typed objects can't have shared references, remove
- the child from the database.</para>
-
- <para>Now consider the same scenario with parent and child objects being
- entities, not value-types (e.g. categories and items, or parent and child
- cats). Entities have their own lifecycle, support shared references (so
- removing an entity from the collection does not mean it can be deleted),
- and there is by default no cascading of state from one entity to any other
- associated entities. The EJB3 specification does not require persistence
- by reachability. It supports a more flexible model of transitive
- persistence, as first seen in Hibernate.</para>
-
- <para>For each basic operation of the entity manager - including
- <methodname>persist()</methodname>, <methodname>merge()</methodname>,
- <methodname>remove()</methodname>, <methodname>refresh()</methodname> -
- there is a corresponding cascade style. Respectively, the cascade styles
- are named PERSIST, MERGE, REMOVE, REFRESH. If you want an operation to be
- cascaded to associated entity (or collection of entities), you must
- indicate that in the association annotation:</para>
-
- <programlisting>@OneToOne(cascade=CascadeType.PERSIST)</programlisting>
-
- <para>Cascading options can be combined:</para>
-
- <programlisting>@OneToOne(cascade= { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.REFRESH } )</programlisting>
-
- <para>You may even use CascadeType.ALL to specify that all operations
- should be cascaded for a particular association. Remember that by default,
- no operation is cascaded.</para>
-
- <para>Hibernate offers more native cascading options, please refer to the
- Hibernate Annotations manual and the Hibernate reference guide for more
- informations.</para>
-
- <para>Recommendations:</para>
-
- <itemizedlist>
- <listitem>
- <para>It doesn't usually make sense to enable cascade on a
- <literal>@ManyToOne</literal> or <literal>@ManyToMany</literal>
- association. Cascade is often useful for <literal>@OneToOne</literal>
- and <literal>@OneToMany</literal> associations.</para>
- </listitem>
-
- <listitem>
- <para>If the child object's lifespan is bounded by the lifespan of the
- parent object, make the parent a full lifecycle object by specifying
- <literal>CascadeType.ALL</literal> and
- <literal>org.hibernate.annotations.CascadeType.DELETE_ORPHAN</literal>
- (please refer to the Hibernate reference guide for the semantics of
- orphan delete)</para>
- </listitem>
-
- <listitem>
- <para>Otherwise, you might not need cascade at all. But if you think
- that you will often be working with the parent and children together
- in the same transaction, and you want to save yourself some typing,
- consider using <code>cascade={PERSIST, MERGE}</code>. These options
- can even make sense for a many-to-many association.</para>
- </listitem>
- </itemizedlist>
- </section>
-
- <section>
- <title>Locking</title>
-
- <para>The default locking system in EJB3 is mostly based on optimistic
- locking (ie using a version column to check any concurrency issues). EJB3
- has defined an additional mechanism to increase the concurrency
- guaranties. You can apply a lock on a given entity (and it's associated
- entities if <literal>LOCK</literal> is cascaded) through the
- <methodname>lock(Object entity)</methodname> method. Depending on the
- concurrency guaranties you requires, you choose a lock mode:</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>LockMode.READ</literal> prevents dirty-reads and non
- repeatable read on a given entity.</para>
- </listitem>
-
- <listitem>
- <para><literal>LockMode.WRITE</literal> prevents dirty-reads and non
- repeatable read on a given entity and force an increase of the version
- number if any.</para>
- </listitem>
- </itemizedlist>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/modules/entitymanagerapi.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/entitymanagerapi.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/modules/entitymanagerapi.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/entitymanagerapi.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,777 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="objectstate">
+ <title>Working with objects</title>
+
+ <section>
+ <title>Entity states</title>
+
+ <para>Like in Hibernate (comparable terms in parantheses), an entity
+ instance is in one of the following states:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>New (transient): an entity is new if it has just been
+ instantiated using the new operator, and it is not associated with a
+ persistence context. It has no persistent representation in the
+ database and no identifier value has been assigned.</para>
+ </listitem>
+
+ <listitem>
+ <para>Managed (persistent): a managed entity instance is an instance
+ with a persistent identity that is currently associated with a
+ persistence context.</para>
+ </listitem>
+
+ <listitem>
+ <para>Detached: the entity instance is an instance with a persistent
+ identity that is no longer associated with a persistence context,
+ usually because the persistence context was closed or the instance was
+ evicted from the context.</para>
+ </listitem>
+
+ <listitem>
+ <para>Removed: a removed entity instance is an instance with a
+ persistent identity, associated with a persistence context, but
+ scheduled for removal from the database.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The <classname>EntityManager</classname> API allows you to change
+ the state of an entity, or in other words, to load and store objects. You
+ will find persistence with EJB3 easier to understand if you think about
+ object state management, not managing of SQL statements.</para>
+ </section>
+
+ <section>
+ <title>Making objects persistent</title>
+
+ <para>Once you've created a new entity instance (using the common
+ <literal>new</literal> operator) it is in <literal>new</literal> state.
+ You can make it persistent by associating it to an entity manager:</para>
+
+ <programlisting>DomesticCat fritz = new DomesticCat();
+fritz.setColor(Color.GINGER);
+fritz.setSex('M');
+fritz.setName("Fritz");
+em.persist(fritz);</programlisting>
+
+ <para>If the <literal>DomesticCat</literal> entity type has a generated
+ identifier, the value is associated to the instance when
+ <code>persist()</code> is called. If the identifier is not automatically
+ generated, the application-assigned (usually natural) key value has to be
+ set on the instance before <code>persist()</code> is called.</para>
+ </section>
+
+ <section>
+ <title>Loading an object</title>
+
+ <para>Load an entity instance by its identifier value with the entity
+ manager's <code>find()</code> method:</para>
+
+ <programlisting>cat = em.find(Cat.class, catId);
+
+// You may need to wrap the primitive identifiers
+long catId = 1234;
+em.find( Cat.class, new Long(catId) );</programlisting>
+
+ <para>In some cases, you don't really want to load the object state, but
+ just having a reference to it (ie a proxy). You can get this reference
+ using the <literal>getReference()</literal> method. This is especially
+ useful to link a child to its parent wo having to load the parent.</para>
+
+ <programlisting>child = new Child();
+child.SetName("Henry");
+Parent parent = em.getReference(Parent.class, parentId); //no query to the DB
+child.setParent(parent);
+em.persist(child);</programlisting>
+
+ <para>You can reload an entity instance and it's collections at any time
+ using the <code>em.refresh()</code> operation. This is useful when
+ database triggers are used to initialize some of the properties of the
+ entity. Note that only the entity instance and its collections are
+ refreshed unless you specify <literal>REFRESH</literal> as a cascade style
+ of any associations:</para>
+
+ <programlisting>em.persist(cat);
+em.flush(); // force the SQL insert and triggers to run
+em.refresh(cat); //re-read the state (after the trigger executes)</programlisting>
+ </section>
+
+ <section>
+ <title>Querying objects</title>
+
+ <para>If you don't know the identifier values of the objects you are
+ looking for, you need a query. The Hibernate EntityManager implementation
+ supports an easy-to-use but powerful object-oriented query language
+ (EJB3-QL) which has been inspired by HQL (and vice-versa). Both query
+ languages are portable across databases, the use entity and property names
+ as identifiers (instead of table and column names). You may also express
+ your query in the native SQL of your database, with optional support from
+ EJB3 for result set conversion into Java business objects.</para>
+
+ <section>
+ <title>Executing queries</title>
+
+ <para>EJB3QL and SQL queries are represented by an instance of
+ <classname>javax.persistence.Query</classname>. This interface offers
+ methods for parameter binding, result set handling, and for execution of
+ the query. Queries are always created using the current entity
+ manager:</para>
+
+ <programlisting>List cats = em.createQuery(
+ "select cat from Cat as cat where cat.birthdate < ?1")
+ .setParameter(1, date, TemporalType.DATE)
+ .getResultList();
+
+List mothers = em.createQuery(
+ "select mother from Cat as cat join cat.mother as mother where cat.name = ?1")
+ .setParameter(1, name)
+ .getResultList();
+
+List kittens = em.createQuery(
+ "from Cat as cat where cat.mother = ?1")
+ .setEntity(1, pk)
+ .getResultList();
+
+Cat mother = (Cat) em.createQuery(
+ "select cat.mother from Cat as cat where cat = ?1")
+ .setParameter(1, izi)
+ .getSingleResult();</programlisting>
+
+ <para>A query is usually executed by invoking
+ <methodname>getResultList()</methodname>. This method loads the
+ resulting instances of the query completly into memory. Entity instances
+ retrieved by a query are in persistent state. The
+ <methodname>getSingleResult() </methodname>method offers a shortcut if
+ you know your query will only return a single object.</para>
+
+ <section>
+ <title>Projection</title>
+
+ <para>An EJB3QL query queries can return tuples of objects if
+ projection is used. Each result tuple is returned as an object
+ array:</para>
+
+ <programlisting>Iterator kittensAndMothers = sess.createQuery(
+ "select kitten, mother from Cat kitten join kitten.mother mother")
+ .getResultList()
+ .iterator();
+
+while ( kittensAndMothers.hasNext() ) {
+ Object[] tuple = (Object[]) kittensAndMothers.next();
+ Cat kitten = tuple[0];
+ Cat mother = tuple[1];
+ ....
+}</programlisting>
+ </section>
+
+ <section>
+ <title>Scalar results</title>
+
+ <para>Queries may specify a particular property of an entity in the
+ select clause, instead of an entity alias. You may call SQL aggregate
+ functions as well. Returned non-transactional objects or aggregation
+ results are considered "scalar" results and are not entities in
+ persistent state (in other words, they are considered "read
+ only"):</para>
+
+ <programlisting>Iterator results = em.createQuery(
+ "select cat.color, min(cat.birthdate), count(cat) from Cat cat " +
+ "group by cat.color")
+ .getResultList()
+ .iterator();
+
+while ( results.hasNext() ) {
+ Object[] row = results.next();
+ Color type = (Color) row[0];
+ Date oldest = (Date) row[1];
+ Integer count = (Integer) row[2];
+ .....
+}</programlisting>
+ </section>
+
+ <section>
+ <title>Bind parameters</title>
+
+ <para>Both named and positional query parameters are supported, the
+ <literal>Query</literal> API offers several methods to bind arguments.
+ The EJB3 specification numbers positional parameters from one. Named
+ parameters are identifiers of the form <literal>:paramname</literal>
+ in the query string. Named parameters should be prefered, they are
+ more robust and easier to read and understand:</para>
+
+ <programlisting>// Named parameter (preferred)
+Query q = em.createQuery("select cat from DomesticCat cat where cat.name = :name");
+q.setParameter("name", "Fritz");
+List cats = q.getResultList();
+
+// Positional parameter
+Query q = em.createQuery("select cat from DomesticCat cat where cat.name = ?1");
+q.setParameter(1, "Izi");
+List cats = q.getResultList();
+
+// Named parameter list
+List names = new ArrayList();
+names.add("Izi");
+names.add("Fritz");
+Query q = em.createQuery("select cat from DomesticCat cat where cat.name in (:namesList)");
+q.setParameter("namesList", names);
+List cats = q.list();</programlisting>
+ </section>
+
+ <section>
+ <title>Pagination</title>
+
+ <para>If you need to specify bounds upon your result set (the maximum
+ number of rows you want to retrieve and/or the first row you want to
+ retrieve), use the following methods:</para>
+
+ <programlisting>Query q = em.createQuery("select cat from DomesticCat cat");
+q.setFirstResult(20);
+q.setMaxResults(10);
+List cats = q.getResultList(); //return cats from the 20th position to 29th</programlisting>
+
+ <para>Hibernate knows how to translate this limit query into the
+ native SQL of your DBMS.</para>
+ </section>
+
+ <section>
+ <title>Externalizing named queries</title>
+
+ <para>You may also define named queries through annotations:</para>
+
+ <programlisting>@javax.persistence.NamedQuery(name="eg.DomesticCat.by.name.and.minimum.weight",
+ query="select cat from eg.DomesticCat as cat where cat.name = ?1 and cat.weight > ?2")</programlisting>
+
+ <para>Parameters are bound programatically to the named query, before
+ it is executed:</para>
+
+ <programlisting>Query q = em.createNamedQuery("eg.DomesticCat.by.name.and.minimum.weight");
+q.setString(1, name);
+q.setInt(2, minWeight);
+List cats = q.getResultList();</programlisting>
+
+ <para>Note that the actual program code is independent of the query
+ language that is used, you may also define native SQL queries in
+ metadata, or use Hibernate's native facilities by placing them in XML
+ mapping files.</para>
+ </section>
+
+ <section>
+ <title>Native queries</title>
+
+ <para>You may express a query in SQL, using
+ <methodname>createNativeQuery()</methodname> and let Hibernate take
+ care mapping from JDBC result sets to business objects. Use the
+ <literal>@SqlResultSetMapping</literal> (please see the Hibernate
+ Annotations reference documentation on how to map a SQL resultset
+ mapping) or the entity mapping (if the column names of the query
+ result are the same as the names declared in the entity mapping;
+ remember that all entity columns have to be returned for this
+ mechanism to work):</para>
+
+ <programlisting>@SqlResultSetMapping(name="getItem", entities =
+ @EntityResult(entityClass=org.hibernate.ejb.test.Item.class, fields= {
+ @FieldResult(name="name", column="itemname"),
+ @FieldResult(name="descr", column="itemdescription")
+ })
+)
+
+Query q = em.createNativeQuery("select name as itemname, descr as itemdescription from Item", "getItem");
+item = (Item) q.getSingleResult(); //from a resultset
+
+Query q = em.createNativeQuery("select * from Item", Item.class);
+item = (Item) q.getSingleResult(); //from a class columns names match the mapping</programlisting>
+
+ <note>
+ <para>For more information about scalar support in named queries,
+ please refers to the Hibenate Annotations documentation</para>
+ </note>
+ </section>
+
+ <section>
+ <title>Query hints</title>
+
+ <para>Query hints (for performance optimization, usually) are
+ implementation specific. Hints are declared using the
+ <methodname>query.setHint(String name, Object value)</methodname>
+ method, or through the <literal>@Named(Native)Query(hints)</literal>
+ annotation Note that these are not SQL query hints! The Hibernate EJB3
+ implementation offers the following query hints:</para>
+
+ <table>
+ <title>Hibernate query hints</title>
+
+ <tgroup cols="2">
+ <thead>
+ <colspec colname="C1" colwidth="1*" />
+
+ <colspec colname="c2" colwidth="3*" />
+
+ <row>
+ <entry align="center">Hint</entry>
+
+ <entry align="center">Description</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>org.hibernate.timeout</entry>
+
+ <entry>Query timeout in seconds ( eg. new Integer(10)
+ )</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.fetchSize</entry>
+
+ <entry>Number of rows fetched by the JDBC driver per roundtrip
+ ( eg. new Integer(50) )</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.comment</entry>
+
+ <entry>Add a comment to the SQL query, useful for the DBA (
+ e.g. new String("fetch all orders in 1 statement") )</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.cacheable</entry>
+
+ <entry>Whether or not a query is cacheable ( eg. new
+ Boolean(true) ), defaults to false</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.cacheMode</entry>
+
+ <entry>Override the cache mode for this query ( eg.
+ CacheMode.REFRESH )</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.cacheRegion</entry>
+
+ <entry>Cache region of this query ( eg. new
+ String("regionName") )</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.readOnly</entry>
+
+ <entry>Entities retrieved by this query will be loaded in a
+ read-only mode where Hibernate will never dirty-check them or
+ make changes persistent ( eg. new Boolean(true) ), default to
+ false</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.flushMode</entry>
+
+ <entry>Flush mode used for this query</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.cacheMode</entry>
+
+ <entry>Cache mode used for this query</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>Please refer to the Hibernate reference documentation for more
+ information.</para>
+ </section>
+ </section>
+ </section>
+
+ <section>
+ <title>Modifying persistent objects</title>
+
+ <para>Transactional managed instances (ie. objects loaded, saved, created
+ or queried by the entity manager) may be manipulated by the application
+ and any changes to persistent state will be persisted when the Entity
+ manager is flushed (discussed later in this chapter). There is no need to
+ call a particular method to make your modifications persistent. A
+ straightforward wayt to update the state of an entity instance is to
+ <methodname>find()</methodname> it, and then manipulate it directly, while
+ the persistence context is open:</para>
+
+ <programlisting>Cat cat = em.find( Cat.class, new Long(69) );
+cat.setName("PK");
+em.flush(); // changes to cat are automatically detected and persisted</programlisting>
+
+ <para>Sometimes this programming model is inefficient since it would
+ require both an SQL SELECT (to load an object) and an SQL UPDATE (to
+ persist its updated state) in the same session. Therefore Hibernate offers
+ an alternate approach, using detached instances.</para>
+ </section>
+
+ <section>
+ <title>Modifying detached objects</title>
+
+ <para>Many applications need to retrieve an object in one transaction,
+ send it to the presentation layer for manipulation, and later save the
+ changes in a new transaction. There can be significant user think and
+ waiting time between both transactions. Applications that use this kind of
+ approach in a high-concurrency environment usually use versioned data to
+ ensure isolation for the "long" unit of work.</para>
+
+ <para>The EJB3 specifications supports this development model by providing
+ for persistence of modifications made to detached instances using the
+ <methodname>EntityManager.merge()</methodname> method:</para>
+
+ <programlisting>// in the first entity manager
+Cat cat = firstEntityManager.find(Cat.class, catId);
+Cat potentialMate = new Cat();
+firstEntityManager.persist(potentialMate);
+
+// in a higher layer of the application
+cat.setMate(potentialMate);
+
+// later, in a new entity manager
+secondEntityManager.merge(cat); // update cat
+secondEntityManager.merge(mate); // update mate</programlisting>
+
+ <para>The <literal>merge()</literal> method merges modifications made to
+ the detached instance into the corresponding managed instance, if any,
+ without consideration of the state of the persistence context. In other
+ words, the merged objects state overrides the persistent entity state in
+ the persistence context, if one is already present. The application should
+ individually <methodname>merge()</methodname> detached instances reachable
+ from the given detached instance if and only if it wants their state also
+ to be persistent. This can be cascaded to associated entities and
+ collections, using transitive persistence, see <xref
+ linkend="objectstate-transitive" />.</para>
+ </section>
+
+ <section>
+ <title>Automatic state detection</title>
+
+ <para>The merge operation is clever enough to automatically detect whether
+ the merging of the detached instance has to result in an insert or update.
+ In other words, you don't have to worry about passing a new instance (and
+ not a detached instance) to <literal>merge()</literal>, the entity manager
+ will figure this out for you:</para>
+
+ <programlisting>// In the first entity manager
+Cat cat = firstEntityManager.find(Cat.class, catID);
+
+// In a higher layer of the application, detached
+Cat mate = new Cat();
+cat.setMate(mate);
+
+// Later, in a new entity manager
+secondEntityManager.merge(cat); // update existing state
+secondEntityManager.merge(mate); // save the new instance</programlisting>
+
+ <para>The usage and semantics of <literal>merge()</literal> seems to be
+ confusing for new users. Firstly, as long as you are not trying to use
+ object state loaded in one entity manager in another new entity manager,
+ you should not need to use <methodname>merge()</methodname> at all. Some
+ whole applications will never use this method.</para>
+
+ <para>Usually <methodname>merge()</methodname> is used in the following
+ scenario:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>the application loads an object in the first entity
+ manager</para>
+ </listitem>
+
+ <listitem>
+ <para>the object is passed up to the presentation layer</para>
+ </listitem>
+
+ <listitem>
+ <para>some modifications are made to the object</para>
+ </listitem>
+
+ <listitem>
+ <para>the object is passed back down to the business logic
+ layer</para>
+ </listitem>
+
+ <listitem>
+ <para>the application persists these modifications by calling
+ <methodname>merge()</methodname> in a second entity manager</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Here is the exact semantic of
+ <methodname>merge()</methodname>:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>if there is a managed instance with the same identifier
+ currently associated with the persistence context, copy the state of
+ the given object onto the managed instance</para>
+ </listitem>
+
+ <listitem>
+ <para>if there is no managed instance currently associated with the
+ persistence context, try to load it from the database, or create a new
+ managed instance</para>
+ </listitem>
+
+ <listitem>
+ <para>the managed instance is returned</para>
+ </listitem>
+
+ <listitem>
+ <para>the given instance does not become associated with the
+ persistence context, it remains detached and is usually
+ discarded</para>
+ </listitem>
+ </itemizedlist>
+
+ <note>
+ <title>Merging vs. saveOrUpdate/saveOrUpdateCopy</title>
+
+ <para>Merging in EJB3 is similar to the
+ <literal>saveOrUpdateCopy()</literal> method in native Hibernate.
+ However, it is not the same as the <literal>saveOrUpdate()</literal>
+ method, the given instance is not reattached with the persistence
+ context, but a managed instance is returned by the
+ <methodname>merge()</methodname> method.</para>
+ </note>
+ </section>
+
+ <section>
+ <title>Deleting managed objects</title>
+
+ <para><methodname>EntityManager.remove()</methodname> will remove an
+ objects state from the database. Of course, your application might still
+ hold a reference to a deleted object. You can think of
+ <methodname>remove()</methodname> as making a persistent instance new (aka
+ transient) again. It is not detached, and a merge would result in an
+ insertion.</para>
+ </section>
+
+ <section>
+ <title>Flush the persistence context</title>
+
+ <section>
+ <title>In a transaction</title>
+
+ <para>From time to time the entity manager will execute the SQL DML
+ statements needed to synchronize the data store with the state of
+ objects held in memory. This process, flush, occurs by default (this is
+ Hibernate specific and not defined by the specification) at the
+ following points:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>before query execution*</para>
+ </listitem>
+
+ <listitem>
+ <para>from
+ <methodname>javax.persistence.EntityTransaction.commit()*</methodname></para>
+ </listitem>
+
+ <listitem>
+ <para>when <methodname>EntityManager.flush()</methodname> is
+ called*</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>(*) if a transaction is active</para>
+
+ <para>The SQL statements are issued in the following order</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>all entity insertions, in the same order the corresponding
+ objects were saved using
+ <methodname>EntityManager.persist()</methodname></para>
+ </listitem>
+
+ <listitem>
+ <para>all entity updates</para>
+ </listitem>
+
+ <listitem>
+ <para>all collection deletions</para>
+ </listitem>
+
+ <listitem>
+ <para>all collection element deletions, updates and
+ insertions</para>
+ </listitem>
+
+ <listitem>
+ <para>all collection insertions</para>
+ </listitem>
+
+ <listitem>
+ <para>all entity deletions, in the same order the corresponding
+ objects were deleted using
+ <methodname>EntityManager.remove()</methodname></para>
+ </listitem>
+ </itemizedlist>
+
+ <para>(Exception: entity instances using application-assigned
+ identifiers are inserted when they are saved.)</para>
+
+ <para>Except when you explicity <methodname>flush()</methodname>, there
+ are absolutely no guarantees about when the entity manager executes the
+ JDBC calls, only the order in which they are executed. However,
+ Hibernate does guarantee that the
+ <methodname>Query.getResultList()</methodname>/<methodname>Query.getSingleResult()</methodname>
+ will never return stale data; nor will they return wrong data if
+ executed in an active transaction.</para>
+
+ <para>It is possible to change the default behavior so that flush occurs
+ less frequently. The <classname>FlushModeType</classname> for an entity
+ manager defines two different modes: only flush at commit time or flush
+ automatically using the explained routine unless
+ <methodname>flush()</methodname> is called explicitly.</para>
+
+ <programlisting>em = emf.createEntityManager();
+Transaction tx = em.getTransaction().begin();
+em.setFlushMode(FlushModeType.COMMIT); // allow queries to return stale state
+
+Cat izi = em.find(Cat.class, id);
+izi.setName(iznizi);
+
+// might return stale data
+em.createQuery("from Cat as cat left outer join cat.kittens kitten").getResultList();
+
+// change to izi is not flushed!
+...
+em.getTransaction().commit(); // flush occurs</programlisting>
+
+ <para>During flush, an exception might happen (e.g. if a DML operation
+ violates a constraint). TODO: Add link to exception handling.</para>
+
+ <para>Hibernate provides more flush modes than the one described in the
+ EJB3 specification. Please refer to the Hibernate core reference
+ documentation for more informations.</para>
+ </section>
+
+ <section>
+ <title>Outside a transaction</title>
+
+ <para>In an <literal>EXTENDED</literal> persistence context, all read
+ only operations of the entity manager can be executed outside a
+ transaction (<literal>find()</literal>,
+ <literal>getReference()</literal>, <literal>refresh()</literal>, and
+ read queries). Some modifications operations can be executed outside a
+ transaction, but they are queued until the persistence context join a
+ transaction. This is the case of <literal>persist()</literal>,
+ <literal><literal>merge()</literal></literal>,
+ <literal>remove()</literal>. Some operations cannot be called outside a
+ transaction: <literal>flush()</literal>, <literal>lock()</literal>, and
+ update/delete queries.</para>
+ </section>
+ </section>
+
+ <section id="objectstate-transitive" revision="1"
+ xreflabel="Transitive persistence">
+ <title>Transitive persistence</title>
+
+ <para>It is quite cumbersome to save, delete, or reattach individual
+ objects, especially if you deal with a graph of associated objects. A
+ common case is a parent/child relationship. Consider the following
+ example:</para>
+
+ <para>If the children in a parent/child relationship would be value typed
+ (e.g. a collection of addresses or strings), their lifecycle would depend
+ on the parent and no further action would be required for convenient
+ "cascading" of state changes. When the parent is persisted, the
+ value-typed child objects are persisted as well, when the parent is
+ removed, the children will be removed, etc. This even works for operations
+ such as the removal of a child from the collection; Hibernate will detect
+ this and, since value-typed objects can't have shared references, remove
+ the child from the database.</para>
+
+ <para>Now consider the same scenario with parent and child objects being
+ entities, not value-types (e.g. categories and items, or parent and child
+ cats). Entities have their own lifecycle, support shared references (so
+ removing an entity from the collection does not mean it can be deleted),
+ and there is by default no cascading of state from one entity to any other
+ associated entities. The EJB3 specification does not require persistence
+ by reachability. It supports a more flexible model of transitive
+ persistence, as first seen in Hibernate.</para>
+
+ <para>For each basic operation of the entity manager - including
+ <methodname>persist()</methodname>, <methodname>merge()</methodname>,
+ <methodname>remove()</methodname>, <methodname>refresh()</methodname> -
+ there is a corresponding cascade style. Respectively, the cascade styles
+ are named PERSIST, MERGE, REMOVE, REFRESH. If you want an operation to be
+ cascaded to associated entity (or collection of entities), you must
+ indicate that in the association annotation:</para>
+
+ <programlisting>@OneToOne(cascade=CascadeType.PERSIST)</programlisting>
+
+ <para>Cascading options can be combined:</para>
+
+ <programlisting>@OneToOne(cascade= { CascadeType.PERSIST, CascadeType.REMOVE, CascadeType.REFRESH } )</programlisting>
+
+ <para>You may even use CascadeType.ALL to specify that all operations
+ should be cascaded for a particular association. Remember that by default,
+ no operation is cascaded.</para>
+
+ <para>Hibernate offers more native cascading options, please refer to the
+ Hibernate Annotations manual and the Hibernate reference guide for more
+ informations.</para>
+
+ <para>Recommendations:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>It doesn't usually make sense to enable cascade on a
+ <literal>@ManyToOne</literal> or <literal>@ManyToMany</literal>
+ association. Cascade is often useful for <literal>@OneToOne</literal>
+ and <literal>@OneToMany</literal> associations.</para>
+ </listitem>
+
+ <listitem>
+ <para>If the child object's lifespan is bounded by the lifespan of the
+ parent object, make the parent a full lifecycle object by specifying
+ <literal>CascadeType.ALL</literal> and
+ <literal>org.hibernate.annotations.CascadeType.DELETE_ORPHAN</literal>
+ (please refer to the Hibernate reference guide for the semantics of
+ orphan delete)</para>
+ </listitem>
+
+ <listitem>
+ <para>Otherwise, you might not need cascade at all. But if you think
+ that you will often be working with the parent and children together
+ in the same transaction, and you want to save yourself some typing,
+ consider using <code>cascade={PERSIST, MERGE}</code>. These options
+ can even make sense for a many-to-many association.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+
+ <section>
+ <title>Locking</title>
+
+ <para>The default locking system in EJB3 is mostly based on optimistic
+ locking (ie using a version column to check any concurrency issues). EJB3
+ has defined an additional mechanism to increase the concurrency
+ guaranties. You can apply a lock on a given entity (and it's associated
+ entities if <literal>LOCK</literal> is cascaded) through the
+ <methodname>lock(Object entity)</methodname> method. Depending on the
+ concurrency guaranties you requires, you choose a lock mode:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>LockMode.READ</literal> prevents dirty-reads and non
+ repeatable read on a given entity.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>LockMode.WRITE</literal> prevents dirty-reads and non
+ repeatable read on a given entity and force an increase of the version
+ number if any.</para>
+ </listitem>
+ </itemizedlist>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/modules/listeners.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/listeners.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/listeners.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,239 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="listeners">
- <title>Entity listeners and Callback methods</title>
-
- <section>
- <title>Definition</title>
-
- <para>It is often useful for the application to react to certain events
- that occur inside the persistence mechanism. This allows the
- implementation of certain kinds of generic functionality, and extension of
- built-in functionality. The EJB3 specification provides two related
- mechanisms for this purpose.</para>
-
- <para>A method of the entity may be designated as a callback method to
- receive notification of a particular entity life cycle event. Callbacks
- methods are annotated by a callback annotation. You can also define an
- entity listener class to be used instead of the callback methods defined
- directly inside the entity class. An entity listener is a stateless class
- with a no-arg constructor. An entity listener is defined by annotating the
- entity class with the <literal>@EntityListeners</literal>
- annotation:</para>
-
- <programlisting>@Entity
- at EntityListeners(class=Audit.class)
-public class Cat {
- @Id private Integer id;
- private String name;
- private Calendar dateOfBirth;
- @Transient private int age;
- private Date lastUpdate;
- //getters and setters
-
- /**
- * Set my transient property at load time based on a calculation,
- * note that a native Hibernate formula mapping is better for this purpose.
- */
- @PostLoad
- public void calculateAge() {
- Calendar birth = new GregorianCalendar();
- birth.setTime(dateOfBirth);
- Calendar now = new GregorianCalendar();
- now.setTime( new Date() );
- int adjust = 0;
- if ( now.get(Calendar.DAY_OF_YEAR) - birth.get(Calendar.DAY_OF_YEAR) < 0) {
- adjust = -1;
- }
- age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR) + adjust;
- }
-}
-
-public class LastUpdateListener {
- /**
- * automatic property set before any database persistence
- */
- @PreUpdate
- @PrePersist
- public void setLastUpdate(Cat o) {
- o.setLastUpdate( new Date() );
- }
-}</programlisting>
-
- <para>The same callback method or entity listener method can be annotated
- with more than one callback annotation. For a given entity, you cannot
- have two methods being annotated by the same callback annotation whether
- it is a callback method or an entity listener method. A callback method is
- a no-arg method with no return type and any arbitrary name. An entity
- listener has the signature <code>void <METHOD>(Object)</code>
- where Object is of the actual entity type (note that Hibernate Entity
- Manager relaxed this constraint and allows <literal>Object</literal> of
- <literal>java.lang.Object</literal> type (allowing sharing of listeners
- accross several entities.)</para>
-
- <para>A callback method can raise a
- <classname>RuntimeException</classname>. The current transaction, if any,
- must be rolled back. The following callbacks are defined:</para>
-
- <table>
- <title>Callbacks</title>
-
- <tgroup cols="2">
- <thead>
- <colspec colname="c1" colwidth="1*" />
-
- <colspec colname="c2" colwidth="3*" />
-
- <row>
- <entry align="center">Type</entry>
-
- <entry align="center">Description</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>@PrePersist</entry>
-
- <entry>Executed before the entity manager persist operation is
- actually executed or cascaded. This call is synchronous with the
- persist operation.</entry>
- </row>
-
- <row>
- <entry>@PreRemove</entry>
-
- <entry>Executed before the entity manager remove operation is
- actually executed or cascaded. This call is synchronous with the
- remove operation.</entry>
- </row>
-
- <row>
- <entry>@PostPersist</entry>
-
- <entry>Executed after the entity manager persist operation is
- actually executed or cascaded. This call is invoked after the
- database INSERT is executed.</entry>
- </row>
-
- <row>
- <entry>@PostRemove</entry>
-
- <entry>Executed after the entity manager remove operation is
- actually executed or cascaded. This call is synchronous with the
- remove operation.</entry>
- </row>
-
- <row>
- <entry>@PreUpdate</entry>
-
- <entry>Executed before the database UPDATE operation.</entry>
- </row>
-
- <row>
- <entry>@PostUpdate</entry>
-
- <entry>Executed after the database UPDATE operation.</entry>
- </row>
-
- <row>
- <entry>@PostLoad</entry>
-
- <entry>Eexecuted after an entity has been loaded into the current
- persistence context or an entity has been refreshed.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>A callback method must not invoke
- <classname>EntityManager</classname> or <classname>Query</classname>
- methods!</para>
- </section>
-
- <section>
- <title>Callbacks and listeners inheritance</title>
-
- <para>You can define several entity listeners per entity at different
- level of the hierarchy.You can also define several callbacks at different
- level of the hierarchy. But you cannot define two listeners for the same
- event in the same entity or the same entity listener.</para>
-
- <para>When an event is raised, the listeners are executed in this
- order:</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>@EntityListeners</literal> for a given entity or
- superclass in the array order</para>
- </listitem>
-
- <listitem>
- <para>Entity listeners for the superclasses (highest first)</para>
- </listitem>
-
- <listitem>
- <para>Entity Listeners for the entity</para>
- </listitem>
-
- <listitem>
- <para>Callbacks of the superclasses (highest first)</para>
- </listitem>
-
- <listitem>
- <para>Callbacks of the entity</para>
- </listitem>
- </itemizedlist>
-
- <para>You can stop the entity listeners inheritance by using the
- <literal>@ExcludeSuperclassListeners</literal>, all superclasses
- <literal>@EntityListeners</literal> will then be ignored.</para>
- </section>
-
- <section>
- <title>XML definition</title>
-
- <para>The EJB3 specification allows annotation overriding through EJB3
- deployment descriptor. There is also an additional feature that can be
- useful: default event listeners.</para>
-
- <programlisting><?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"
- >
- <persistence-unit-metadata>
- <persistence-unit-defaults>
- <entity-listeners>
- <entity-listener class="org.hibernate.ejb.test.pack.defaultpar.IncrementListener">
- <pre-persist method-name="increment"/>
- </entity-listener>
- </entity-listeners>
- </persistence-unit-defaults>
- </persistence-unit-metadata>
- <package>org.hibernate.ejb.test.pack.defaultpar</package>
- <entity class="ApplicationServer">
- <entity-listeners>
- <entity-listener class="OtherIncrementListener">
- <pre-persist method-name="increment"/>
- </entity-listener>
- </entity-listeners>
-
-
- <pre-persist method-name="calculate"/>
- </entity>
-</entity-mappings></programlisting>
-
- <para>You can override entity listeners on a given entity. An entity
- listener correspond to a given class and one or several event fire a given
- method call. You can also define event on the entity itself to describe
- the callbacks.</para>
-
- <para>Last but not least, you can define some default entity listeners
- that will apply first on the entity listener stack of all the mapped
- entities of a given persistence unit. If you don't want an entity to
- inherit the default listeners, you can use @ExcludeDefaultListeners (or
- <exclude-default-listeners/>).</para>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/modules/listeners.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/listeners.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/modules/listeners.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/listeners.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,239 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="listeners">
+ <title>Entity listeners and Callback methods</title>
+
+ <section>
+ <title>Definition</title>
+
+ <para>It is often useful for the application to react to certain events
+ that occur inside the persistence mechanism. This allows the
+ implementation of certain kinds of generic functionality, and extension of
+ built-in functionality. The EJB3 specification provides two related
+ mechanisms for this purpose.</para>
+
+ <para>A method of the entity may be designated as a callback method to
+ receive notification of a particular entity life cycle event. Callbacks
+ methods are annotated by a callback annotation. You can also define an
+ entity listener class to be used instead of the callback methods defined
+ directly inside the entity class. An entity listener is a stateless class
+ with a no-arg constructor. An entity listener is defined by annotating the
+ entity class with the <literal>@EntityListeners</literal>
+ annotation:</para>
+
+ <programlisting>@Entity
+ at EntityListeners(class=Audit.class)
+public class Cat {
+ @Id private Integer id;
+ private String name;
+ private Calendar dateOfBirth;
+ @Transient private int age;
+ private Date lastUpdate;
+ //getters and setters
+
+ /**
+ * Set my transient property at load time based on a calculation,
+ * note that a native Hibernate formula mapping is better for this purpose.
+ */
+ @PostLoad
+ public void calculateAge() {
+ Calendar birth = new GregorianCalendar();
+ birth.setTime(dateOfBirth);
+ Calendar now = new GregorianCalendar();
+ now.setTime( new Date() );
+ int adjust = 0;
+ if ( now.get(Calendar.DAY_OF_YEAR) - birth.get(Calendar.DAY_OF_YEAR) < 0) {
+ adjust = -1;
+ }
+ age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR) + adjust;
+ }
+}
+
+public class LastUpdateListener {
+ /**
+ * automatic property set before any database persistence
+ */
+ @PreUpdate
+ @PrePersist
+ public void setLastUpdate(Cat o) {
+ o.setLastUpdate( new Date() );
+ }
+}</programlisting>
+
+ <para>The same callback method or entity listener method can be annotated
+ with more than one callback annotation. For a given entity, you cannot
+ have two methods being annotated by the same callback annotation whether
+ it is a callback method or an entity listener method. A callback method is
+ a no-arg method with no return type and any arbitrary name. An entity
+ listener has the signature <code>void <METHOD>(Object)</code>
+ where Object is of the actual entity type (note that Hibernate Entity
+ Manager relaxed this constraint and allows <literal>Object</literal> of
+ <literal>java.lang.Object</literal> type (allowing sharing of listeners
+ accross several entities.)</para>
+
+ <para>A callback method can raise a
+ <classname>RuntimeException</classname>. The current transaction, if any,
+ must be rolled back. The following callbacks are defined:</para>
+
+ <table>
+ <title>Callbacks</title>
+
+ <tgroup cols="2">
+ <thead>
+ <colspec colname="c1" colwidth="1*" />
+
+ <colspec colname="c2" colwidth="3*" />
+
+ <row>
+ <entry align="center">Type</entry>
+
+ <entry align="center">Description</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>@PrePersist</entry>
+
+ <entry>Executed before the entity manager persist operation is
+ actually executed or cascaded. This call is synchronous with the
+ persist operation.</entry>
+ </row>
+
+ <row>
+ <entry>@PreRemove</entry>
+
+ <entry>Executed before the entity manager remove operation is
+ actually executed or cascaded. This call is synchronous with the
+ remove operation.</entry>
+ </row>
+
+ <row>
+ <entry>@PostPersist</entry>
+
+ <entry>Executed after the entity manager persist operation is
+ actually executed or cascaded. This call is invoked after the
+ database INSERT is executed.</entry>
+ </row>
+
+ <row>
+ <entry>@PostRemove</entry>
+
+ <entry>Executed after the entity manager remove operation is
+ actually executed or cascaded. This call is synchronous with the
+ remove operation.</entry>
+ </row>
+
+ <row>
+ <entry>@PreUpdate</entry>
+
+ <entry>Executed before the database UPDATE operation.</entry>
+ </row>
+
+ <row>
+ <entry>@PostUpdate</entry>
+
+ <entry>Executed after the database UPDATE operation.</entry>
+ </row>
+
+ <row>
+ <entry>@PostLoad</entry>
+
+ <entry>Eexecuted after an entity has been loaded into the current
+ persistence context or an entity has been refreshed.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>A callback method must not invoke
+ <classname>EntityManager</classname> or <classname>Query</classname>
+ methods!</para>
+ </section>
+
+ <section>
+ <title>Callbacks and listeners inheritance</title>
+
+ <para>You can define several entity listeners per entity at different
+ level of the hierarchy.You can also define several callbacks at different
+ level of the hierarchy. But you cannot define two listeners for the same
+ event in the same entity or the same entity listener.</para>
+
+ <para>When an event is raised, the listeners are executed in this
+ order:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>@EntityListeners</literal> for a given entity or
+ superclass in the array order</para>
+ </listitem>
+
+ <listitem>
+ <para>Entity listeners for the superclasses (highest first)</para>
+ </listitem>
+
+ <listitem>
+ <para>Entity Listeners for the entity</para>
+ </listitem>
+
+ <listitem>
+ <para>Callbacks of the superclasses (highest first)</para>
+ </listitem>
+
+ <listitem>
+ <para>Callbacks of the entity</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>You can stop the entity listeners inheritance by using the
+ <literal>@ExcludeSuperclassListeners</literal>, all superclasses
+ <literal>@EntityListeners</literal> will then be ignored.</para>
+ </section>
+
+ <section>
+ <title>XML definition</title>
+
+ <para>The EJB3 specification allows annotation overriding through EJB3
+ deployment descriptor. There is also an additional feature that can be
+ useful: default event listeners.</para>
+
+ <programlisting><?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"
+ >
+ <persistence-unit-metadata>
+ <persistence-unit-defaults>
+ <entity-listeners>
+ <entity-listener class="org.hibernate.ejb.test.pack.defaultpar.IncrementListener">
+ <pre-persist method-name="increment"/>
+ </entity-listener>
+ </entity-listeners>
+ </persistence-unit-defaults>
+ </persistence-unit-metadata>
+ <package>org.hibernate.ejb.test.pack.defaultpar</package>
+ <entity class="ApplicationServer">
+ <entity-listeners>
+ <entity-listener class="OtherIncrementListener">
+ <pre-persist method-name="increment"/>
+ </entity-listener>
+ </entity-listeners>
+
+
+ <pre-persist method-name="calculate"/>
+ </entity>
+</entity-mappings></programlisting>
+
+ <para>You can override entity listeners on a given entity. An entity
+ listener correspond to a given class and one or several event fire a given
+ method call. You can also define event on the entity itself to describe
+ the callbacks.</para>
+
+ <para>Last but not least, you can define some default entity listeners
+ that will apply first on the entity listener stack of all the mapped
+ entities of a given persistence unit. If you don't want an entity to
+ inherit the default listeners, you can use @ExcludeDefaultListeners (or
+ <exclude-default-listeners/>).</para>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_ejbql.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/query_ejbql.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_ejbql.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,866 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="queryhql">
- <title>EJB-QL: The Object Query Language</title>
-
- <para>
- EJB3-QL has been heavily inspired by HQL, the native Hibernate Query Language. Both
- are therefore very close to SQL, but portable and independent of the database schema.
- People familiar with HQL shouldn't have any problem using EJB-QL. Actually, you
- use the same query API for EJB-QL and HQL queries. Portable EJB3 applications however
- should stick to EJB-QL or similar vendor extensions are needed.
- </para>
-
- <sect1 id="queryhql-casesensitivity">
- <title>Case Sensitivity</title>
-
- <para>Queries are case-insensitive, except for names of Java classes and
- properties. So <literal>SeLeCT</literal> is the same as
- <literal>sELEct</literal> is the same as <literal>SELECT</literal> but
- <literal>org.hibernate.eg.FOO</literal> is not
- <literal>org.hibernate.eg.Foo</literal> and <literal>foo.barSet</literal>
- is not <literal>foo.BARSET</literal>.</para>
-
- <para>This manual uses lowercase EJBQL keywords. Some users find queries
- with uppercase keywords more readable, but we find this convention ugly
- when embedded in Java code.</para>
- </sect1>
-
- <sect1 id="queryhql-from">
- <title>The from clause</title>
-
- <para>The simplest possible EJB-QL query is of the form:</para>
-
- <programlisting>select c from eg.Cat c</programlisting>
-
- <para>which simply returns all instances of the class
- <literal>eg.Cat</literal>. Unlike HQL, the select clause is not optional
- in EJB-QL. We don't usually need to qualify the class name, since the
- entity name defaults to the unqualified class name
- (<literal>@Entity</literal>). So we almost always just write:</para>
-
- <programlisting>select c from Cat c</programlisting>
-
- <para>As you may have noticed you can assign aliases to classes, the
- <literal>as</literal> keywork is optional. An alias allows you to refer
- to <literal>Cat</literal> in other parts of the query.</para>
-
- <programlisting>select cat from Cat as cat</programlisting>
-
- <para>Multiple classes may appear, resulting in a cartesian product or
- "cross" join.</para>
-
- <programlisting>select form, param from Formula as form, Parameter as param</programlisting>
-
- <para>It is considered good practice to name query aliases using an
- initial lowercase, consistent with Java naming standards for local
- variables (eg. <literal>domesticCat</literal>).</para>
- </sect1>
-
- <sect1 id="queryhql-joins" revision="1">
- <title>Associations and joins</title>
-
- <para>You may also assign aliases to associated entities, or even to
- elements of a collection of values, using a
- <literal>join</literal>.</para>
-
- <programlisting>select cat, mate, kitten from Cat as cat
- inner join cat.mate as mate
- left outer join cat.kittens as kitten</programlisting>
-
- <programlisting>select cat from Cat as cat left join cat.mate.kittens as kittens</programlisting>
-
- <para>The supported join types are borrowed from ANSI SQL</para>
-
- <itemizedlist spacing="compact">
- <listitem>
- <para><literal>inner join</literal></para>
- </listitem>
-
- <listitem>
- <para><literal>left outer join</literal></para>
- </listitem>
- </itemizedlist>
-
- <para>The <literal>inner join</literal>, <literal>left outer
- join</literal> constructs may be abbreviated.</para>
-
- <programlisting>select cat, mate, kitten from Cat as cat
- join cat.mate as mate
- left join cat.kittens as kitten</programlisting>
-
- <para>In addition, a "fetch" join allows associations or collections of
- values to be initialized along with their parent objects, using a single
- select. This is particularly useful in the case of a collection. It
- effectively overrides the fetching options in the associations and collection
- mapping metadata. See the Performance chapter of the Hibernate reference guide
- for more information.</para>
-
- <programlisting>select cat from Cat as cat
- inner join fetch cat.mate
- left join fetch cat.kittens</programlisting>
-
- <para>A fetch join does not usually need to assign an alias, because the
- associated objects should not be used in the <literal>where</literal>
- clause (or any other clause). Also, the associated objects are not
- returned directly in the query results. Instead, they may be accessed via
- the parent object. The only reason we might need an alias is if we are
- recursively join fetching a further collection:</para>
-
- <programlisting>select cat from Cat as cat
- inner join fetch cat.mate
- left join fetch cat.kittens child
- left join fetch child.kittens</programlisting>
-
- <para>Note that the <literal>fetch</literal> construct may not be used in
- queries called using <literal>scroll()</literal> or
- <literal>iterate()</literal>. Nor should <literal>fetch</literal> be used
- together with <literal>setMaxResults()</literal> or
- <literal>setFirstResult()</literal>. It is possible to create a cartesian
- product by join fetching more than one collection in a query (as in the example
- above), be careful the result of this product isn't bigger than you expect.
- Join fetching multiple collection roles also sometimes gives unexpected results for
- bag mappings, so be careful about how you formulate your queries in this case.</para>
-
- <para>
- TODO: The last statement is useless and typical developer thinking, please elaborate.
- The word "sometimes" should never appear in any technical documentation.
- </para>
-
- <para>If you are using property-level lazy fetching (with bytecode
- instrumentation), it is possible to force Hibernate to fetch the lazy
- properties immediately (in the first query) using <literal>fetch all
- properties</literal>. This is Hibernate specific option:</para>
-
- <programlisting>select doc from Document doc fetch all properties order by doc.name</programlisting>
-
- <programlisting>select doc from Document doc fetch all properties where lower(doc.name) like '%cats%'</programlisting>
- </sect1>
-
- <sect1 id="queryhql-select">
- <title>The select clause</title>
-
- <para>The <literal>select</literal> clause picks which objects and
- properties to return in the query result set. Consider:</para>
-
- <programlisting>select mate
-from Cat as cat
- inner join cat.mate as mate</programlisting>
-
- <para>The query will select <literal>mate</literal>s of other
- <literal>Cat</literal>s. Actually, you may express this query more
- compactly as:</para>
-
- <programlisting>select cat.mate from Cat cat</programlisting>
-
- <para>Queries may return properties of any value type including properties
- of component type:</para>
-
- <programlisting>select cat.name from DomesticCat cat
-where cat.name like 'fri%'</programlisting>
-
- <programlisting>select cust.name.firstName from Customer as cust</programlisting>
-
- <para>Queries may return multiple objects and/or properties as an array of
- type <literal>Object[]</literal>,</para>
-
- <programlisting>select mother, offspr, mate.name
-from DomesticCat as mother
- inner join mother.mate as mate
- left outer join mother.kittens as offspr</programlisting>
-
- <para>or as a <literal>List</literal> (HQL specific feature)</para>
-
- <programlisting>select new list(mother, offspr, mate.name)
-from DomesticCat as mother
- inner join mother.mate as mate
- left outer join mother.kittens as offspr</programlisting>
-
- <para>or as an actual typesafe Java object,</para>
-
- <programlisting>select new Family(mother, mate, offspr)
-from DomesticCat as mother
- join mother.mate as mate
- left join mother.kittens as offspr</programlisting>
-
- <para>assuming that the class <literal>Family</literal> has an appropriate
- constructor.</para>
-
- <para>You may assign aliases to selected expressions using
- <literal>as</literal>:</para>
-
- <programlisting>select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
-from Cat cat</programlisting>
-
- <para>This is most useful when used together with <literal>select new
- map</literal> (HQL specific feature):</para>
-
- <programlisting>select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
-from Cat cat</programlisting>
-
- <para>This query returns a <literal>Map</literal> from aliases to selected
- values.</para>
- </sect1>
-
- <sect1 id="queryhql-aggregation">
- <title>Aggregate functions</title>
-
- <para>HQL queries may even return the results of aggregate functions on
- properties:</para>
-
- <programlisting>select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)
-from Cat cat</programlisting>
-
- <para>The supported aggregate functions are</para>
-
- <itemizedlist spacing="compact">
- <listitem>
- <para><literal>avg(...), avg(distinct ...), sum(...), sum(distinct
- ...), min(...), max(...)</literal></para>
- </listitem>
-
- <listitem>
- <para><literal>count(*)</literal></para>
- </listitem>
-
- <listitem>
- <para><literal>count(...), count(distinct ...),
- count(all...)</literal></para>
- </listitem>
- </itemizedlist>
-
- <para>You may use arithmetic operators, concatenation, and recognized SQL
- functions in the select clause (dpending on configured dialect, HQL specific feature):</para>
-
- <programlisting>select cat.weight + sum(kitten.weight)
-from Cat cat
- join cat.kittens kitten
-group by cat.id, cat.weight</programlisting>
-
- <programlisting>select firstName||' '||initial||' '||upper(lastName) from Person</programlisting>
-
- <para>The <literal>distinct</literal> and <literal>all</literal> keywords
- may be used and have the same semantics as in SQL.</para>
-
- <programlisting>select distinct cat.name from Cat cat
-
-select count(distinct cat.name), count(cat) from Cat cat</programlisting>
- </sect1>
-
- <sect1 id="queryhql-polymorphism">
- <title>Polymorphic queries</title>
-
- <para>A query like:</para>
-
- <programlisting>select cat from Cat as cat</programlisting>
-
- <para>returns instances not only of <literal>Cat</literal>, but also of
- subclasses like <literal>DomesticCat</literal>. Hibernate queries may name
- <emphasis>any</emphasis> Java class or interface in the
- <literal>from</literal> clause (portable EJB-QL queries should only name
- mapped entities). The query will return instances of all persistent
- classes that extend that class or implement the interface. The following
- query would return all persistent objects:</para>
-
- <programlisting>from java.lang.Object o // HQL only</programlisting>
-
- <para>The interface <literal>Named</literal> might be implemented by
- various persistent classes:</para>
-
- <programlisting>from Named n, Named m where n.name = m.name // HQL only</programlisting>
-
- <para>Note that these last two queries will require more than one SQL
- <literal>SELECT</literal>. This means that the <literal>order by</literal>
- clause does not correctly order the whole result set. (It also means you
- can't call these queries using <literal>Query.scroll()</literal>.)</para>
- </sect1>
-
- <sect1 id="queryhql-where">
- <title>The where clause</title>
-
- <para>The <literal>where</literal> clause allows you to narrow the list of
- instances returned. If no alias exists, you may refer to properties by
- name:</para>
-
- <programlisting>select cat from Cat cat where cat.name='Fritz'</programlisting>
-
- <para>returns instances of <literal>Cat</literal> named 'Fritz'.</para>
-
- <programlisting>select foo
-from Foo foo, Bar bar
-where foo.startDate = bar.date</programlisting>
-
- <para>will return all instances of <literal>Foo</literal> for which there
- exists an instance of <literal>bar</literal> with a
- <literal>date</literal> property equal to the <literal>startDate</literal>
- property of the <literal>Foo</literal>. Compound path expressions make the
- <literal>where</literal> clause extremely powerful. Consider:</para>
-
- <programlisting>select cat from Cat cat where cat.mate.name is not null</programlisting>
-
- <para>This query translates to an SQL query with a table (inner) join. If
- you were to write something like</para>
-
- <programlisting>select foo from Foo foo
-where foo.bar.baz.customer.address.city is not null</programlisting>
-
- <para>you would end up with a query that would require four table joins in
- SQL.</para>
-
- <para>The <literal>=</literal> operator may be used to compare not only
- properties, but also instances:</para>
-
- <programlisting>select cat, rival from Cat cat, Cat rival where cat.mate = rival.mate</programlisting>
-
- <programlisting>select cat, mate
-from Cat cat, Cat mate
-where cat.mate = mate</programlisting>
-
- <para>The special property (lowercase) <literal>id</literal> may be used
- to reference the unique identifier of an object. (You may also use its
- mapped identifer property name.). Note that this keyword is specific to HQL.</para>
-
- <programlisting>select cat from Cat as cat where cat.id = 123
-
-select cat from Cat as cat where cat.mate.id = 69</programlisting>
-
- <para>The second query is efficient. No table join is required!</para>
-
- <para>Properties of composite identifiers may also be used. Suppose
- <literal>Person</literal> has a composite identifier consisting of
- <literal>country</literal> and <literal>medicareNumber</literal>.</para>
-
- <programlisting>select person from bank.Person person
-where person.id.country = 'AU'
- and person.id.medicareNumber = 123456</programlisting>
-
- <programlisting>select account from bank.Account account
-where account.owner.id.country = 'AU'
- and account.owner.id.medicareNumber = 123456</programlisting>
-
- <para>Once again, the second query requires no table join.</para>
-
- <para>Likewise, the special property <literal>class</literal> accesses the
- discriminator value of an instance in the case of polymorphic persistence.
- A Java class name embedded in the where clause will be translated to its
- discriminator value. Once again, this is specific to HQL.</para>
-
- <programlisting>select cat from Cat cat where cat.class = DomesticCat</programlisting>
-
- <para>You may also specify properties of components or composite user
- types (and of components of components, etc). Never try to use a
- path-expression that ends in a property of component type (as opposed to a
- property of a component). For example, if <literal>store.owner</literal>
- is an entity with a component <literal>address</literal></para>
-
- <programlisting>store.owner.address.city // okay
-store.owner.address // error!</programlisting>
-
- <para>An "any" type has the special properties <literal>id</literal> and
- <literal>class</literal>, allowing us to express a join in the following
- way (where <literal>AuditLog.item</literal> is a property mapped with
- <literal><any></literal>). <literal>Any</literal> is specific to
- Hibernate</para>
-
- <programlisting>from AuditLog log, Payment payment
-where log.item.class = 'Payment' and log.item.id = payment.id</programlisting>
-
- <para>Notice that <literal>log.item.class</literal> and
- <literal>payment.class</literal> would refer to the values of completely
- different database columns in the above query.</para>
- </sect1>
-
- <sect1 id="queryhql-expressions">
- <title>Expressions</title>
-
- <para>Expressions allowed in the <literal>where</literal> clause include
- most of the kind of things you could write in SQL:</para>
-
- <itemizedlist spacing="compact">
- <listitem>
- <para>mathematical operators <literal>+, -, *, /</literal></para>
- </listitem>
-
- <listitem>
- <para>binary comparison operators <literal>=, >=, <=, <>,
- !=, like</literal></para>
- </listitem>
-
- <listitem>
- <para>logical operations <literal>and, or, not</literal></para>
- </listitem>
-
- <listitem>
- <para>Parentheses <literal>( )</literal>, indicating grouping</para>
- </listitem>
-
- <listitem>
- <para><literal>in</literal>, <literal>not in</literal>,
- <literal>between</literal>, <literal>is null</literal>, <literal>is
- not null</literal>, <literal>is empty</literal>, <literal>is not
- empty</literal>, <literal>member of</literal> and <literal>not member
- of</literal></para>
- </listitem>
-
- <listitem>
- <para>"Simple" case, <literal>case ... when ... then ... else ...
- end</literal>, and "searched" case, <literal>case when ... then ...
- else ... end (specific to HQL)</literal></para>
- </listitem>
-
- <listitem>
- <para>string concatenation <literal>...||...</literal> or
- <literal>concat(...,...) (use concat() for portable EJB-QL
- queries)</literal></para>
- </listitem>
-
- <listitem>
- <para><literal>current_date()</literal>,
- <literal>current_time()</literal>,
- <literal>current_timestamp()</literal></para>
- </listitem>
-
- <listitem>
- <para><literal>second(...)</literal>, <literal>minute(...)</literal>,
- <literal>hour(...)</literal>, <literal>day(...)</literal>,
- <literal>month(...)</literal>, <literal>year(...)</literal>, (specific
- to HQL)</para>
- </listitem>
-
- <listitem>
- <para>Any function or operator defined by EJB-QL 3.0:
- <literal>substring(), trim(), lower(), upper(), length(), locate(),
- abs(), sqrt(), bit_length()</literal></para>
- </listitem>
-
- <listitem>
- <para><literal>coalesce()</literal> and
- <literal>nullif()</literal></para>
- </listitem>
-
- <listitem>
- <para><literal>cast(... as ...)</literal>, where the second argument
- is the name of a Hibernate type, and <literal>extract(... from
- ...)</literal> if ANSI <literal>cast()</literal> and
- <literal>extract()</literal> is supported by the underlying
- database</para>
- </listitem>
-
- <listitem>
- <para>Any database-supported SQL scalar function like
- <literal>sign()</literal>, <literal>trunc()</literal>,
- <literal>rtrim()</literal>, <literal>sin()</literal></para>
- </listitem>
-
- <listitem>
- <para>JDBC IN parameters <literal>?</literal></para>
- </listitem>
-
- <listitem>
- <para>named parameters <literal>:name</literal>,
- <literal>:start_date</literal>, <literal>:x1</literal></para>
- </listitem>
-
- <listitem>
- <para>SQL literals <literal>'foo'</literal>, <literal>69</literal>,
- <literal>'1970-01-01 10:00:01.0'</literal></para>
- </listitem>
-
- <listitem>
- <para>Java <literal>public static final</literal> constants
- <literal>eg.Color.TABBY</literal></para>
- </listitem>
- </itemizedlist>
-
- <para><literal>in</literal> and <literal>between</literal> may be used as
- follows:</para>
-
- <programlisting>select cat from DomesticCat cat where cat.name between 'A' and 'B'</programlisting>
-
- <programlisting>select cat from DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )</programlisting>
-
- <para>and the negated forms may be written</para>
-
- <programlisting>select cat from DomesticCat cat where cat.name not between 'A' and 'B'</programlisting>
-
- <programlisting>select cat from DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )</programlisting>
-
- <para>Likewise, <literal>is null</literal> and <literal>is not
- null</literal> may be used to test for null values.</para>
-
- <para>Booleans may be easily used in expressions by declaring HQL query
- substitutions in Hibernate configuration:</para>
-
- <programlisting>hibernate.query.substitutions true 1, false 0</programlisting>
-
- <para>This will replace the keywords <literal>true</literal> and
- <literal>false</literal> with the literals <literal>1</literal> and
- <literal>0</literal> in the translated SQL from this HQL:</para>
-
- <programlisting>select cat from Cat cat where cat.alive = true</programlisting>
-
- <para>You may test the size of a collection with the special property
- <literal>size</literal>, or the special <literal>size()</literal> function
- (HQL specific feature).</para>
-
- <programlisting>select cat from Cat cat where cat.kittens.size > 0</programlisting>
-
- <programlisting>select cat from Cat cat where size(cat.kittens) > 0</programlisting>
-
- <para>For indexed collections, you may refer to the minimum and maximum
- indices using <literal>minindex</literal> and <literal>maxindex</literal>
- functions. Similarly, you may refer to the minimum and maximum elements of
- a collection of basic type using the <literal>minelement</literal> and
- <literal>maxelement</literal> functions. These are HQL specific
- features.</para>
-
- <programlisting>select cal from Calendar cal where maxelement(cal.holidays) > current date</programlisting>
-
- <programlisting>select order from Order order where maxindex(order.items) > 100</programlisting>
-
- <programlisting>select order from Order order where minelement(order.items) > 10000</programlisting>
-
- <para>The SQL functions <literal>any, some, all, exists, in</literal> are
- supported when passed the element or index set of a collection
- (<literal>elements</literal> and <literal>indices</literal> functions) or
- the result of a subquery (see below). While subqueries are supported by
- EJB-QL, <literal>elements</literal> and <literal>indices</literal> are
- specific HQL features.</para>
-
- <programlisting>select mother from Cat as mother, Cat as kit
-where kit in elements(foo.kittens)</programlisting>
-
- <programlisting>select p from NameList list, Person p
-where p.name = some elements(list.names)</programlisting>
-
- <programlisting>select cat from Cat cat where exists elements(cat.kittens)</programlisting>
-
- <programlisting>select cat from Player p where 3 > all elements(p.scores)</programlisting>
-
- <programlisting>select cat from Show show where 'fizard' in indices(show.acts)</programlisting>
-
- <para>Note that these constructs - <literal>size</literal>,
- <literal>elements</literal>, <literal>indices</literal>,
- <literal>minindex</literal>, <literal>maxindex</literal>,
- <literal>minelement</literal>, <literal>maxelement</literal> - may only be
- used in the where clause in Hibernate3.</para>
-
- <para>In HQL, elements of indexed collections (arrays, lists, maps) may be
- referred to by index (in a where clause only):</para>
-
- <programlisting>select order from Order order where order.items[0].id = 1234</programlisting>
-
- <programlisting>select person from Person person, Calendar calendar
-where calendar.holidays['national day'] = person.birthDay
- and person.nationality.calendar = calendar</programlisting>
-
- <programlisting>select item from Item item, Order order
-where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11</programlisting>
-
- <programlisting>select item from Item item, Order order
-where order.items[ maxindex(order.items) ] = item and order.id = 11</programlisting>
-
- <para>The expression inside <literal>[]</literal> may even be an
- arithmetic expression.</para>
-
- <programlisting>select item from Item item, Order order
-where order.items[ size(order.items) - 1 ] = item</programlisting>
-
- <para>HQL also provides the built-in <literal>index()</literal> function,
- for elements of a one-to-many association or collection of values.</para>
-
- <programlisting>select item, index(item) from Order order
- join order.items item
-where index(item) < 5</programlisting>
-
- <para>Scalar SQL functions supported by the underlying database may be
- used</para>
-
- <programlisting>select cat from DomesticCat cat where upper(cat.name) like 'FRI%'</programlisting>
-
- <para>If you are not yet convinced by all this, think how much longer and
- less readable the following query would be in SQL:</para>
-
- <programlisting>select cust
-from Product prod,
- Store store
- inner join store.customers cust
-where prod.name = 'widget'
- and store.location.name in ( 'Melbourne', 'Sydney' )
- and prod = all elements(cust.currentOrder.lineItems)</programlisting>
-
- <para><emphasis>Hint:</emphasis> something like</para>
-
- <programlisting>SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order
-FROM customers cust,
- stores store,
- locations loc,
- store_customers sc,
- product prod
-WHERE prod.name = 'widget'
- AND store.loc_id = loc.id
- AND loc.name IN ( 'Melbourne', 'Sydney' )
- AND sc.store_id = store.id
- AND sc.cust_id = cust.id
- AND prod.id = ALL(
- SELECT item.prod_id
- FROM line_items item, orders o
- WHERE item.order_id = o.id
- AND cust.current_order = o.id
- )</programlisting>
- </sect1>
-
- <sect1 id="queryhql-ordering">
- <title>The order by clause</title>
-
- <para>The list returned by a query may be ordered by any property of a
- returned class or components:</para>
-
- <programlisting>select cat from DomesticCat cat
-order by cat.name asc, cat.weight desc, cat.birthdate</programlisting>
-
- <para>The optional <literal>asc</literal> or <literal>desc</literal>
- indicate ascending or descending order respectively.</para>
- </sect1>
-
- <sect1 id="queryhql-grouping">
- <title>The group by clause</title>
-
- <para>A query that returns aggregate values may be grouped by any property
- of a returned class or components:</para>
-
- <programlisting>select cat.color, sum(cat.weight), count(cat)
-from Cat cat
-group by cat.color</programlisting>
-
- <programlisting>select foo.id, avg(name), max(name)
-from Foo foo join foo.names name
-group by foo.id</programlisting>
-
- <para>A <literal>having</literal> clause is also allowed.</para>
-
- <programlisting>select cat.color, sum(cat.weight), count(cat)
-from Cat cat
-group by cat.color
-having cat.color in (eg.Color.TABBY, eg.Color.BLACK)</programlisting>
-
- <para>SQL functions and aggregate functions are allowed in the
- <literal>having</literal> and <literal>order by</literal> clauses, if
- supported by the underlying database (eg. not in MySQL).</para>
-
- <programlisting>select cat
-from Cat cat
- join cat.kittens kitten
-group by cat
-having avg(kitten.weight) > 100
-order by count(kitten) asc, sum(kitten.weight) desc</programlisting>
-
- <para>Note that neither the <literal>group by</literal> clause nor the
- <literal>order by</literal> clause may contain arithmetic
- expressions.</para>
- </sect1>
-
- <sect1 id="queryhql-subqueries">
- <title>Subqueries</title>
-
- <para>For databases that support subselects, EJB-QL supports subqueries
- within queries. A subquery must be surrounded by parentheses (often by an
- SQL aggregate function call). Even correlated subqueries (subqueries that
- refer to an alias in the outer query) are allowed.</para>
-
- <programlisting>select fatcat from Cat as fatcat
-where fatcat.weight > (
- select avg(cat.weight) from DomesticCat cat
-)</programlisting>
-
- <programlisting>select cat from DomesticCat as cat
-where cat.name = some (
- select name.nickName from Name as name
-)</programlisting>
-
- <programlisting>select cat from Cat as cat
-where not exists (
- from Cat as mate where mate.mate = cat
-)</programlisting>
-
- <programlisting>select cat from DomesticCat as cat
-where cat.name not in (
- select name.nickName from Name as name
-)</programlisting>
-
- <para>For subqueries with more than one expression in the select list, you
- can use a tuple constructor:</para>
-
- <programlisting>select cat from Cat as cat
-where not ( cat.name, cat.color ) in (
- select cat.name, cat.color from DomesticCat cat
-)</programlisting>
-
- <para>Note that on some databases (but not Oracle or HSQLDB), you can use
- tuple constructors in other contexts, for example when querying components
- or composite user types:</para>
-
- <programlisting>select cat from Person where name = ('Gavin', 'A', 'King')</programlisting>
-
- <para>Which is equivalent to the more verbose:</para>
-
- <programlisting>select cat from Person where name.first = 'Gavin' and name.initial = 'A' and name.last = 'King')</programlisting>
-
- <para>There are two good reasons you might not want to do this kind of
- thing: first, it is not completely portable between database platforms;
- second, the query is now dependent upon the ordering of properties in the
- mapping document.</para>
- </sect1>
-
- <sect1 id="queryhql-examples">
- <title>EJB-QL examples</title>
-
- <para>Hibernate queries can be quite powerful and complex. In fact, the
- power of the query language is one of Hibernate's main selling points (and
- now EJB-QL). Here are some example queries very similar to queries that I
- used on a recent project. Note that most queries you will write are much
- simpler than these!</para>
-
- <para>The following query returns the order id, number of items and total
- value of the order for all unpaid orders for a particular customer and
- given minimum total value, ordering the results by total value. In
- determining the prices, it uses the current catalog. The resulting SQL
- query, against the <literal>ORDER</literal>,
- <literal>ORDER_LINE</literal>, <literal>PRODUCT</literal>,
- <literal>CATALOG</literal> and <literal>PRICE</literal> tables has four
- inner joins and an (uncorrelated) subselect.</para>
-
- <programlisting>select order.id, sum(price.amount), count(item)
-from Order as order
- join order.lineItems as item
- join item.product as product,
- Catalog as catalog
- join catalog.prices as price
-where order.paid = false
- and order.customer = :customer
- and price.product = product
- and catalog.effectiveDate < sysdate
- and catalog.effectiveDate >= all (
- select cat.effectiveDate
- from Catalog as cat
- where cat.effectiveDate < sysdate
- )
-group by order
-having sum(price.amount) > :minAmount
-order by sum(price.amount) desc</programlisting>
-
- <para>What a monster! Actually, in real life, I'm not very keen on
- subqueries, so my query was really more like this:</para>
-
- <programlisting>select order.id, sum(price.amount), count(item)
-from Order as order
- join order.lineItems as item
- join item.product as product,
- Catalog as catalog
- join catalog.prices as price
-where order.paid = false
- and order.customer = :customer
- and price.product = product
- and catalog = :currentCatalog
-group by order
-having sum(price.amount) > :minAmount
-order by sum(price.amount) desc</programlisting>
-
- <para>The next query counts the number of payments in each status,
- excluding all payments in the <literal>AWAITING_APPROVAL</literal> status
- where the most recent status change was made by the current user. It
- translates to an SQL query with two inner joins and a correlated subselect
- against the <literal>PAYMENT</literal>, <literal>PAYMENT_STATUS</literal>
- and <literal>PAYMENT_STATUS_CHANGE</literal> tables.</para>
-
- <programlisting>select count(payment), status.name
-from Payment as payment
- join payment.currentStatus as status
- join payment.statusChanges as statusChange
-where payment.status.name <> PaymentStatus.AWAITING_APPROVAL
- or (
- statusChange.timeStamp = (
- select max(change.timeStamp)
- from PaymentStatusChange change
- where change.payment = payment
- )
- and statusChange.user <> :currentUser
- )
-group by status.name, status.sortOrder
-order by status.sortOrder</programlisting>
-
- <para>If I would have mapped the <literal>statusChanges</literal>
- collection as a list, instead of a set, the query would have been much
- simpler to write.</para>
-
- <programlisting>select count(payment), status.name
-from Payment as payment
- join payment.currentStatus as status
-where payment.status.name <> PaymentStatus.AWAITING_APPROVAL
- or payment.statusChanges[ maxIndex(payment.statusChanges) ].user <> :currentUser
-group by status.name, status.sortOrder
-order by status.sortOrder</programlisting>
-
- <para>However the query would have been HQL specific.</para>
-
- <para>The next query uses the MS SQL Server <literal>isNull()</literal>
- function to return all the accounts and unpaid payments for the
- organization to which the current user belongs. It translates to an SQL
- query with three inner joins, an outer join and a subselect against the
- <literal>ACCOUNT</literal>, <literal>PAYMENT</literal>,
- <literal>PAYMENT_STATUS</literal>, <literal>ACCOUNT_TYPE</literal>,
- <literal>ORGANIZATION</literal> and <literal>ORG_USER</literal>
- tables.</para>
-
- <programlisting>select account, payment
-from Account as account
- join account.holder.users as user
- left outer join account.payments as payment
-where :currentUser = user
- and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)
-order by account.type.sortOrder, account.accountNumber, payment.dueDate</programlisting>
- </sect1>
-
- <sect1 id="queryhql-bulk">
- <title>Bulk UPDATE & DELETE Statements</title>
-
- <para>Hibernate now supports UPDATE and DELETE statements in HQL/EJB-QL. See <xref
- linkend="batch-direct" /> for details.</para>
- </sect1>
-
- <sect1 id="queryhql-tipstricks">
- <title>Tips & Tricks</title>
-
- <para>To order a result by the size of a collection, use the following
- query:</para>
-
- <programlisting>select usr.id, usr.name
-from User as usr
- left join usr.messages as msg
-group by usr.id, usr.name
-order by count(msg)</programlisting>
-
- <para>If your database supports subselects, you can place a condition upon
- selection size in the where clause of your query:</para>
-
- <programlisting>from User usr where size(usr.messages) >= 1</programlisting>
-
- <para>If your database doesn't support subselects, use the following
- query:</para>
-
- <programlisting>select usr.id, usr.name
-from User usr.name
- join usr.messages msg
-group by usr.id, usr.name
-having count(msg) >= 1</programlisting>
-
- <para>As this solution can't return a <literal>User</literal> with zero
- messages because of the inner join, the following form is also
- useful:</para>
-
- <programlisting>select usr.id, usr.name
-from User as usr
- left join usr.messages as msg
-group by usr.id, usr.name
-having count(msg) = 0</programlisting>
- </sect1>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_ejbql.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/query_ejbql.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_ejbql.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_ejbql.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,866 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="queryhql">
+ <title>EJB-QL: The Object Query Language</title>
+
+ <para>
+ EJB3-QL has been heavily inspired by HQL, the native Hibernate Query Language. Both
+ are therefore very close to SQL, but portable and independent of the database schema.
+ People familiar with HQL shouldn't have any problem using EJB-QL. Actually, you
+ use the same query API for EJB-QL and HQL queries. Portable EJB3 applications however
+ should stick to EJB-QL or similar vendor extensions are needed.
+ </para>
+
+ <sect1 id="queryhql-casesensitivity">
+ <title>Case Sensitivity</title>
+
+ <para>Queries are case-insensitive, except for names of Java classes and
+ properties. So <literal>SeLeCT</literal> is the same as
+ <literal>sELEct</literal> is the same as <literal>SELECT</literal> but
+ <literal>org.hibernate.eg.FOO</literal> is not
+ <literal>org.hibernate.eg.Foo</literal> and <literal>foo.barSet</literal>
+ is not <literal>foo.BARSET</literal>.</para>
+
+ <para>This manual uses lowercase EJBQL keywords. Some users find queries
+ with uppercase keywords more readable, but we find this convention ugly
+ when embedded in Java code.</para>
+ </sect1>
+
+ <sect1 id="queryhql-from">
+ <title>The from clause</title>
+
+ <para>The simplest possible EJB-QL query is of the form:</para>
+
+ <programlisting>select c from eg.Cat c</programlisting>
+
+ <para>which simply returns all instances of the class
+ <literal>eg.Cat</literal>. Unlike HQL, the select clause is not optional
+ in EJB-QL. We don't usually need to qualify the class name, since the
+ entity name defaults to the unqualified class name
+ (<literal>@Entity</literal>). So we almost always just write:</para>
+
+ <programlisting>select c from Cat c</programlisting>
+
+ <para>As you may have noticed you can assign aliases to classes, the
+ <literal>as</literal> keywork is optional. An alias allows you to refer
+ to <literal>Cat</literal> in other parts of the query.</para>
+
+ <programlisting>select cat from Cat as cat</programlisting>
+
+ <para>Multiple classes may appear, resulting in a cartesian product or
+ "cross" join.</para>
+
+ <programlisting>select form, param from Formula as form, Parameter as param</programlisting>
+
+ <para>It is considered good practice to name query aliases using an
+ initial lowercase, consistent with Java naming standards for local
+ variables (eg. <literal>domesticCat</literal>).</para>
+ </sect1>
+
+ <sect1 id="queryhql-joins" revision="1">
+ <title>Associations and joins</title>
+
+ <para>You may also assign aliases to associated entities, or even to
+ elements of a collection of values, using a
+ <literal>join</literal>.</para>
+
+ <programlisting>select cat, mate, kitten from Cat as cat
+ inner join cat.mate as mate
+ left outer join cat.kittens as kitten</programlisting>
+
+ <programlisting>select cat from Cat as cat left join cat.mate.kittens as kittens</programlisting>
+
+ <para>The supported join types are borrowed from ANSI SQL</para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para><literal>inner join</literal></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>left outer join</literal></para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The <literal>inner join</literal>, <literal>left outer
+ join</literal> constructs may be abbreviated.</para>
+
+ <programlisting>select cat, mate, kitten from Cat as cat
+ join cat.mate as mate
+ left join cat.kittens as kitten</programlisting>
+
+ <para>In addition, a "fetch" join allows associations or collections of
+ values to be initialized along with their parent objects, using a single
+ select. This is particularly useful in the case of a collection. It
+ effectively overrides the fetching options in the associations and collection
+ mapping metadata. See the Performance chapter of the Hibernate reference guide
+ for more information.</para>
+
+ <programlisting>select cat from Cat as cat
+ inner join fetch cat.mate
+ left join fetch cat.kittens</programlisting>
+
+ <para>A fetch join does not usually need to assign an alias, because the
+ associated objects should not be used in the <literal>where</literal>
+ clause (or any other clause). Also, the associated objects are not
+ returned directly in the query results. Instead, they may be accessed via
+ the parent object. The only reason we might need an alias is if we are
+ recursively join fetching a further collection:</para>
+
+ <programlisting>select cat from Cat as cat
+ inner join fetch cat.mate
+ left join fetch cat.kittens child
+ left join fetch child.kittens</programlisting>
+
+ <para>Note that the <literal>fetch</literal> construct may not be used in
+ queries called using <literal>scroll()</literal> or
+ <literal>iterate()</literal>. Nor should <literal>fetch</literal> be used
+ together with <literal>setMaxResults()</literal> or
+ <literal>setFirstResult()</literal>. It is possible to create a cartesian
+ product by join fetching more than one collection in a query (as in the example
+ above), be careful the result of this product isn't bigger than you expect.
+ Join fetching multiple collection roles also sometimes gives unexpected results for
+ bag mappings, so be careful about how you formulate your queries in this case.</para>
+
+ <para>
+ TODO: The last statement is useless and typical developer thinking, please elaborate.
+ The word "sometimes" should never appear in any technical documentation.
+ </para>
+
+ <para>If you are using property-level lazy fetching (with bytecode
+ instrumentation), it is possible to force Hibernate to fetch the lazy
+ properties immediately (in the first query) using <literal>fetch all
+ properties</literal>. This is Hibernate specific option:</para>
+
+ <programlisting>select doc from Document doc fetch all properties order by doc.name</programlisting>
+
+ <programlisting>select doc from Document doc fetch all properties where lower(doc.name) like '%cats%'</programlisting>
+ </sect1>
+
+ <sect1 id="queryhql-select">
+ <title>The select clause</title>
+
+ <para>The <literal>select</literal> clause picks which objects and
+ properties to return in the query result set. Consider:</para>
+
+ <programlisting>select mate
+from Cat as cat
+ inner join cat.mate as mate</programlisting>
+
+ <para>The query will select <literal>mate</literal>s of other
+ <literal>Cat</literal>s. Actually, you may express this query more
+ compactly as:</para>
+
+ <programlisting>select cat.mate from Cat cat</programlisting>
+
+ <para>Queries may return properties of any value type including properties
+ of component type:</para>
+
+ <programlisting>select cat.name from DomesticCat cat
+where cat.name like 'fri%'</programlisting>
+
+ <programlisting>select cust.name.firstName from Customer as cust</programlisting>
+
+ <para>Queries may return multiple objects and/or properties as an array of
+ type <literal>Object[]</literal>,</para>
+
+ <programlisting>select mother, offspr, mate.name
+from DomesticCat as mother
+ inner join mother.mate as mate
+ left outer join mother.kittens as offspr</programlisting>
+
+ <para>or as a <literal>List</literal> (HQL specific feature)</para>
+
+ <programlisting>select new list(mother, offspr, mate.name)
+from DomesticCat as mother
+ inner join mother.mate as mate
+ left outer join mother.kittens as offspr</programlisting>
+
+ <para>or as an actual typesafe Java object,</para>
+
+ <programlisting>select new Family(mother, mate, offspr)
+from DomesticCat as mother
+ join mother.mate as mate
+ left join mother.kittens as offspr</programlisting>
+
+ <para>assuming that the class <literal>Family</literal> has an appropriate
+ constructor.</para>
+
+ <para>You may assign aliases to selected expressions using
+ <literal>as</literal>:</para>
+
+ <programlisting>select max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n
+from Cat cat</programlisting>
+
+ <para>This is most useful when used together with <literal>select new
+ map</literal> (HQL specific feature):</para>
+
+ <programlisting>select new map( max(bodyWeight) as max, min(bodyWeight) as min, count(*) as n )
+from Cat cat</programlisting>
+
+ <para>This query returns a <literal>Map</literal> from aliases to selected
+ values.</para>
+ </sect1>
+
+ <sect1 id="queryhql-aggregation">
+ <title>Aggregate functions</title>
+
+ <para>HQL queries may even return the results of aggregate functions on
+ properties:</para>
+
+ <programlisting>select avg(cat.weight), sum(cat.weight), max(cat.weight), count(cat)
+from Cat cat</programlisting>
+
+ <para>The supported aggregate functions are</para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para><literal>avg(...), avg(distinct ...), sum(...), sum(distinct
+ ...), min(...), max(...)</literal></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>count(*)</literal></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>count(...), count(distinct ...),
+ count(all...)</literal></para>
+ </listitem>
+ </itemizedlist>
+
+ <para>You may use arithmetic operators, concatenation, and recognized SQL
+ functions in the select clause (dpending on configured dialect, HQL specific feature):</para>
+
+ <programlisting>select cat.weight + sum(kitten.weight)
+from Cat cat
+ join cat.kittens kitten
+group by cat.id, cat.weight</programlisting>
+
+ <programlisting>select firstName||' '||initial||' '||upper(lastName) from Person</programlisting>
+
+ <para>The <literal>distinct</literal> and <literal>all</literal> keywords
+ may be used and have the same semantics as in SQL.</para>
+
+ <programlisting>select distinct cat.name from Cat cat
+
+select count(distinct cat.name), count(cat) from Cat cat</programlisting>
+ </sect1>
+
+ <sect1 id="queryhql-polymorphism">
+ <title>Polymorphic queries</title>
+
+ <para>A query like:</para>
+
+ <programlisting>select cat from Cat as cat</programlisting>
+
+ <para>returns instances not only of <literal>Cat</literal>, but also of
+ subclasses like <literal>DomesticCat</literal>. Hibernate queries may name
+ <emphasis>any</emphasis> Java class or interface in the
+ <literal>from</literal> clause (portable EJB-QL queries should only name
+ mapped entities). The query will return instances of all persistent
+ classes that extend that class or implement the interface. The following
+ query would return all persistent objects:</para>
+
+ <programlisting>from java.lang.Object o // HQL only</programlisting>
+
+ <para>The interface <literal>Named</literal> might be implemented by
+ various persistent classes:</para>
+
+ <programlisting>from Named n, Named m where n.name = m.name // HQL only</programlisting>
+
+ <para>Note that these last two queries will require more than one SQL
+ <literal>SELECT</literal>. This means that the <literal>order by</literal>
+ clause does not correctly order the whole result set. (It also means you
+ can't call these queries using <literal>Query.scroll()</literal>.)</para>
+ </sect1>
+
+ <sect1 id="queryhql-where">
+ <title>The where clause</title>
+
+ <para>The <literal>where</literal> clause allows you to narrow the list of
+ instances returned. If no alias exists, you may refer to properties by
+ name:</para>
+
+ <programlisting>select cat from Cat cat where cat.name='Fritz'</programlisting>
+
+ <para>returns instances of <literal>Cat</literal> named 'Fritz'.</para>
+
+ <programlisting>select foo
+from Foo foo, Bar bar
+where foo.startDate = bar.date</programlisting>
+
+ <para>will return all instances of <literal>Foo</literal> for which there
+ exists an instance of <literal>bar</literal> with a
+ <literal>date</literal> property equal to the <literal>startDate</literal>
+ property of the <literal>Foo</literal>. Compound path expressions make the
+ <literal>where</literal> clause extremely powerful. Consider:</para>
+
+ <programlisting>select cat from Cat cat where cat.mate.name is not null</programlisting>
+
+ <para>This query translates to an SQL query with a table (inner) join. If
+ you were to write something like</para>
+
+ <programlisting>select foo from Foo foo
+where foo.bar.baz.customer.address.city is not null</programlisting>
+
+ <para>you would end up with a query that would require four table joins in
+ SQL.</para>
+
+ <para>The <literal>=</literal> operator may be used to compare not only
+ properties, but also instances:</para>
+
+ <programlisting>select cat, rival from Cat cat, Cat rival where cat.mate = rival.mate</programlisting>
+
+ <programlisting>select cat, mate
+from Cat cat, Cat mate
+where cat.mate = mate</programlisting>
+
+ <para>The special property (lowercase) <literal>id</literal> may be used
+ to reference the unique identifier of an object. (You may also use its
+ mapped identifer property name.). Note that this keyword is specific to HQL.</para>
+
+ <programlisting>select cat from Cat as cat where cat.id = 123
+
+select cat from Cat as cat where cat.mate.id = 69</programlisting>
+
+ <para>The second query is efficient. No table join is required!</para>
+
+ <para>Properties of composite identifiers may also be used. Suppose
+ <literal>Person</literal> has a composite identifier consisting of
+ <literal>country</literal> and <literal>medicareNumber</literal>.</para>
+
+ <programlisting>select person from bank.Person person
+where person.id.country = 'AU'
+ and person.id.medicareNumber = 123456</programlisting>
+
+ <programlisting>select account from bank.Account account
+where account.owner.id.country = 'AU'
+ and account.owner.id.medicareNumber = 123456</programlisting>
+
+ <para>Once again, the second query requires no table join.</para>
+
+ <para>Likewise, the special property <literal>class</literal> accesses the
+ discriminator value of an instance in the case of polymorphic persistence.
+ A Java class name embedded in the where clause will be translated to its
+ discriminator value. Once again, this is specific to HQL.</para>
+
+ <programlisting>select cat from Cat cat where cat.class = DomesticCat</programlisting>
+
+ <para>You may also specify properties of components or composite user
+ types (and of components of components, etc). Never try to use a
+ path-expression that ends in a property of component type (as opposed to a
+ property of a component). For example, if <literal>store.owner</literal>
+ is an entity with a component <literal>address</literal></para>
+
+ <programlisting>store.owner.address.city // okay
+store.owner.address // error!</programlisting>
+
+ <para>An "any" type has the special properties <literal>id</literal> and
+ <literal>class</literal>, allowing us to express a join in the following
+ way (where <literal>AuditLog.item</literal> is a property mapped with
+ <literal><any></literal>). <literal>Any</literal> is specific to
+ Hibernate</para>
+
+ <programlisting>from AuditLog log, Payment payment
+where log.item.class = 'Payment' and log.item.id = payment.id</programlisting>
+
+ <para>Notice that <literal>log.item.class</literal> and
+ <literal>payment.class</literal> would refer to the values of completely
+ different database columns in the above query.</para>
+ </sect1>
+
+ <sect1 id="queryhql-expressions">
+ <title>Expressions</title>
+
+ <para>Expressions allowed in the <literal>where</literal> clause include
+ most of the kind of things you could write in SQL:</para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>mathematical operators <literal>+, -, *, /</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>binary comparison operators <literal>=, >=, <=, <>,
+ !=, like</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>logical operations <literal>and, or, not</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>Parentheses <literal>( )</literal>, indicating grouping</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>in</literal>, <literal>not in</literal>,
+ <literal>between</literal>, <literal>is null</literal>, <literal>is
+ not null</literal>, <literal>is empty</literal>, <literal>is not
+ empty</literal>, <literal>member of</literal> and <literal>not member
+ of</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>"Simple" case, <literal>case ... when ... then ... else ...
+ end</literal>, and "searched" case, <literal>case when ... then ...
+ else ... end (specific to HQL)</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>string concatenation <literal>...||...</literal> or
+ <literal>concat(...,...) (use concat() for portable EJB-QL
+ queries)</literal></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>current_date()</literal>,
+ <literal>current_time()</literal>,
+ <literal>current_timestamp()</literal></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>second(...)</literal>, <literal>minute(...)</literal>,
+ <literal>hour(...)</literal>, <literal>day(...)</literal>,
+ <literal>month(...)</literal>, <literal>year(...)</literal>, (specific
+ to HQL)</para>
+ </listitem>
+
+ <listitem>
+ <para>Any function or operator defined by EJB-QL 3.0:
+ <literal>substring(), trim(), lower(), upper(), length(), locate(),
+ abs(), sqrt(), bit_length()</literal></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>coalesce()</literal> and
+ <literal>nullif()</literal></para>
+ </listitem>
+
+ <listitem>
+ <para><literal>cast(... as ...)</literal>, where the second argument
+ is the name of a Hibernate type, and <literal>extract(... from
+ ...)</literal> if ANSI <literal>cast()</literal> and
+ <literal>extract()</literal> is supported by the underlying
+ database</para>
+ </listitem>
+
+ <listitem>
+ <para>Any database-supported SQL scalar function like
+ <literal>sign()</literal>, <literal>trunc()</literal>,
+ <literal>rtrim()</literal>, <literal>sin()</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>JDBC IN parameters <literal>?</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>named parameters <literal>:name</literal>,
+ <literal>:start_date</literal>, <literal>:x1</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>SQL literals <literal>'foo'</literal>, <literal>69</literal>,
+ <literal>'1970-01-01 10:00:01.0'</literal></para>
+ </listitem>
+
+ <listitem>
+ <para>Java <literal>public static final</literal> constants
+ <literal>eg.Color.TABBY</literal></para>
+ </listitem>
+ </itemizedlist>
+
+ <para><literal>in</literal> and <literal>between</literal> may be used as
+ follows:</para>
+
+ <programlisting>select cat from DomesticCat cat where cat.name between 'A' and 'B'</programlisting>
+
+ <programlisting>select cat from DomesticCat cat where cat.name in ( 'Foo', 'Bar', 'Baz' )</programlisting>
+
+ <para>and the negated forms may be written</para>
+
+ <programlisting>select cat from DomesticCat cat where cat.name not between 'A' and 'B'</programlisting>
+
+ <programlisting>select cat from DomesticCat cat where cat.name not in ( 'Foo', 'Bar', 'Baz' )</programlisting>
+
+ <para>Likewise, <literal>is null</literal> and <literal>is not
+ null</literal> may be used to test for null values.</para>
+
+ <para>Booleans may be easily used in expressions by declaring HQL query
+ substitutions in Hibernate configuration:</para>
+
+ <programlisting>hibernate.query.substitutions true 1, false 0</programlisting>
+
+ <para>This will replace the keywords <literal>true</literal> and
+ <literal>false</literal> with the literals <literal>1</literal> and
+ <literal>0</literal> in the translated SQL from this HQL:</para>
+
+ <programlisting>select cat from Cat cat where cat.alive = true</programlisting>
+
+ <para>You may test the size of a collection with the special property
+ <literal>size</literal>, or the special <literal>size()</literal> function
+ (HQL specific feature).</para>
+
+ <programlisting>select cat from Cat cat where cat.kittens.size > 0</programlisting>
+
+ <programlisting>select cat from Cat cat where size(cat.kittens) > 0</programlisting>
+
+ <para>For indexed collections, you may refer to the minimum and maximum
+ indices using <literal>minindex</literal> and <literal>maxindex</literal>
+ functions. Similarly, you may refer to the minimum and maximum elements of
+ a collection of basic type using the <literal>minelement</literal> and
+ <literal>maxelement</literal> functions. These are HQL specific
+ features.</para>
+
+ <programlisting>select cal from Calendar cal where maxelement(cal.holidays) > current date</programlisting>
+
+ <programlisting>select order from Order order where maxindex(order.items) > 100</programlisting>
+
+ <programlisting>select order from Order order where minelement(order.items) > 10000</programlisting>
+
+ <para>The SQL functions <literal>any, some, all, exists, in</literal> are
+ supported when passed the element or index set of a collection
+ (<literal>elements</literal> and <literal>indices</literal> functions) or
+ the result of a subquery (see below). While subqueries are supported by
+ EJB-QL, <literal>elements</literal> and <literal>indices</literal> are
+ specific HQL features.</para>
+
+ <programlisting>select mother from Cat as mother, Cat as kit
+where kit in elements(foo.kittens)</programlisting>
+
+ <programlisting>select p from NameList list, Person p
+where p.name = some elements(list.names)</programlisting>
+
+ <programlisting>select cat from Cat cat where exists elements(cat.kittens)</programlisting>
+
+ <programlisting>select cat from Player p where 3 > all elements(p.scores)</programlisting>
+
+ <programlisting>select cat from Show show where 'fizard' in indices(show.acts)</programlisting>
+
+ <para>Note that these constructs - <literal>size</literal>,
+ <literal>elements</literal>, <literal>indices</literal>,
+ <literal>minindex</literal>, <literal>maxindex</literal>,
+ <literal>minelement</literal>, <literal>maxelement</literal> - may only be
+ used in the where clause in Hibernate3.</para>
+
+ <para>In HQL, elements of indexed collections (arrays, lists, maps) may be
+ referred to by index (in a where clause only):</para>
+
+ <programlisting>select order from Order order where order.items[0].id = 1234</programlisting>
+
+ <programlisting>select person from Person person, Calendar calendar
+where calendar.holidays['national day'] = person.birthDay
+ and person.nationality.calendar = calendar</programlisting>
+
+ <programlisting>select item from Item item, Order order
+where order.items[ order.deliveredItemIndices[0] ] = item and order.id = 11</programlisting>
+
+ <programlisting>select item from Item item, Order order
+where order.items[ maxindex(order.items) ] = item and order.id = 11</programlisting>
+
+ <para>The expression inside <literal>[]</literal> may even be an
+ arithmetic expression.</para>
+
+ <programlisting>select item from Item item, Order order
+where order.items[ size(order.items) - 1 ] = item</programlisting>
+
+ <para>HQL also provides the built-in <literal>index()</literal> function,
+ for elements of a one-to-many association or collection of values.</para>
+
+ <programlisting>select item, index(item) from Order order
+ join order.items item
+where index(item) < 5</programlisting>
+
+ <para>Scalar SQL functions supported by the underlying database may be
+ used</para>
+
+ <programlisting>select cat from DomesticCat cat where upper(cat.name) like 'FRI%'</programlisting>
+
+ <para>If you are not yet convinced by all this, think how much longer and
+ less readable the following query would be in SQL:</para>
+
+ <programlisting>select cust
+from Product prod,
+ Store store
+ inner join store.customers cust
+where prod.name = 'widget'
+ and store.location.name in ( 'Melbourne', 'Sydney' )
+ and prod = all elements(cust.currentOrder.lineItems)</programlisting>
+
+ <para><emphasis>Hint:</emphasis> something like</para>
+
+ <programlisting>SELECT cust.name, cust.address, cust.phone, cust.id, cust.current_order
+FROM customers cust,
+ stores store,
+ locations loc,
+ store_customers sc,
+ product prod
+WHERE prod.name = 'widget'
+ AND store.loc_id = loc.id
+ AND loc.name IN ( 'Melbourne', 'Sydney' )
+ AND sc.store_id = store.id
+ AND sc.cust_id = cust.id
+ AND prod.id = ALL(
+ SELECT item.prod_id
+ FROM line_items item, orders o
+ WHERE item.order_id = o.id
+ AND cust.current_order = o.id
+ )</programlisting>
+ </sect1>
+
+ <sect1 id="queryhql-ordering">
+ <title>The order by clause</title>
+
+ <para>The list returned by a query may be ordered by any property of a
+ returned class or components:</para>
+
+ <programlisting>select cat from DomesticCat cat
+order by cat.name asc, cat.weight desc, cat.birthdate</programlisting>
+
+ <para>The optional <literal>asc</literal> or <literal>desc</literal>
+ indicate ascending or descending order respectively.</para>
+ </sect1>
+
+ <sect1 id="queryhql-grouping">
+ <title>The group by clause</title>
+
+ <para>A query that returns aggregate values may be grouped by any property
+ of a returned class or components:</para>
+
+ <programlisting>select cat.color, sum(cat.weight), count(cat)
+from Cat cat
+group by cat.color</programlisting>
+
+ <programlisting>select foo.id, avg(name), max(name)
+from Foo foo join foo.names name
+group by foo.id</programlisting>
+
+ <para>A <literal>having</literal> clause is also allowed.</para>
+
+ <programlisting>select cat.color, sum(cat.weight), count(cat)
+from Cat cat
+group by cat.color
+having cat.color in (eg.Color.TABBY, eg.Color.BLACK)</programlisting>
+
+ <para>SQL functions and aggregate functions are allowed in the
+ <literal>having</literal> and <literal>order by</literal> clauses, if
+ supported by the underlying database (eg. not in MySQL).</para>
+
+ <programlisting>select cat
+from Cat cat
+ join cat.kittens kitten
+group by cat
+having avg(kitten.weight) > 100
+order by count(kitten) asc, sum(kitten.weight) desc</programlisting>
+
+ <para>Note that neither the <literal>group by</literal> clause nor the
+ <literal>order by</literal> clause may contain arithmetic
+ expressions.</para>
+ </sect1>
+
+ <sect1 id="queryhql-subqueries">
+ <title>Subqueries</title>
+
+ <para>For databases that support subselects, EJB-QL supports subqueries
+ within queries. A subquery must be surrounded by parentheses (often by an
+ SQL aggregate function call). Even correlated subqueries (subqueries that
+ refer to an alias in the outer query) are allowed.</para>
+
+ <programlisting>select fatcat from Cat as fatcat
+where fatcat.weight > (
+ select avg(cat.weight) from DomesticCat cat
+)</programlisting>
+
+ <programlisting>select cat from DomesticCat as cat
+where cat.name = some (
+ select name.nickName from Name as name
+)</programlisting>
+
+ <programlisting>select cat from Cat as cat
+where not exists (
+ from Cat as mate where mate.mate = cat
+)</programlisting>
+
+ <programlisting>select cat from DomesticCat as cat
+where cat.name not in (
+ select name.nickName from Name as name
+)</programlisting>
+
+ <para>For subqueries with more than one expression in the select list, you
+ can use a tuple constructor:</para>
+
+ <programlisting>select cat from Cat as cat
+where not ( cat.name, cat.color ) in (
+ select cat.name, cat.color from DomesticCat cat
+)</programlisting>
+
+ <para>Note that on some databases (but not Oracle or HSQLDB), you can use
+ tuple constructors in other contexts, for example when querying components
+ or composite user types:</para>
+
+ <programlisting>select cat from Person where name = ('Gavin', 'A', 'King')</programlisting>
+
+ <para>Which is equivalent to the more verbose:</para>
+
+ <programlisting>select cat from Person where name.first = 'Gavin' and name.initial = 'A' and name.last = 'King')</programlisting>
+
+ <para>There are two good reasons you might not want to do this kind of
+ thing: first, it is not completely portable between database platforms;
+ second, the query is now dependent upon the ordering of properties in the
+ mapping document.</para>
+ </sect1>
+
+ <sect1 id="queryhql-examples">
+ <title>EJB-QL examples</title>
+
+ <para>Hibernate queries can be quite powerful and complex. In fact, the
+ power of the query language is one of Hibernate's main selling points (and
+ now EJB-QL). Here are some example queries very similar to queries that I
+ used on a recent project. Note that most queries you will write are much
+ simpler than these!</para>
+
+ <para>The following query returns the order id, number of items and total
+ value of the order for all unpaid orders for a particular customer and
+ given minimum total value, ordering the results by total value. In
+ determining the prices, it uses the current catalog. The resulting SQL
+ query, against the <literal>ORDER</literal>,
+ <literal>ORDER_LINE</literal>, <literal>PRODUCT</literal>,
+ <literal>CATALOG</literal> and <literal>PRICE</literal> tables has four
+ inner joins and an (uncorrelated) subselect.</para>
+
+ <programlisting>select order.id, sum(price.amount), count(item)
+from Order as order
+ join order.lineItems as item
+ join item.product as product,
+ Catalog as catalog
+ join catalog.prices as price
+where order.paid = false
+ and order.customer = :customer
+ and price.product = product
+ and catalog.effectiveDate < sysdate
+ and catalog.effectiveDate >= all (
+ select cat.effectiveDate
+ from Catalog as cat
+ where cat.effectiveDate < sysdate
+ )
+group by order
+having sum(price.amount) > :minAmount
+order by sum(price.amount) desc</programlisting>
+
+ <para>What a monster! Actually, in real life, I'm not very keen on
+ subqueries, so my query was really more like this:</para>
+
+ <programlisting>select order.id, sum(price.amount), count(item)
+from Order as order
+ join order.lineItems as item
+ join item.product as product,
+ Catalog as catalog
+ join catalog.prices as price
+where order.paid = false
+ and order.customer = :customer
+ and price.product = product
+ and catalog = :currentCatalog
+group by order
+having sum(price.amount) > :minAmount
+order by sum(price.amount) desc</programlisting>
+
+ <para>The next query counts the number of payments in each status,
+ excluding all payments in the <literal>AWAITING_APPROVAL</literal> status
+ where the most recent status change was made by the current user. It
+ translates to an SQL query with two inner joins and a correlated subselect
+ against the <literal>PAYMENT</literal>, <literal>PAYMENT_STATUS</literal>
+ and <literal>PAYMENT_STATUS_CHANGE</literal> tables.</para>
+
+ <programlisting>select count(payment), status.name
+from Payment as payment
+ join payment.currentStatus as status
+ join payment.statusChanges as statusChange
+where payment.status.name <> PaymentStatus.AWAITING_APPROVAL
+ or (
+ statusChange.timeStamp = (
+ select max(change.timeStamp)
+ from PaymentStatusChange change
+ where change.payment = payment
+ )
+ and statusChange.user <> :currentUser
+ )
+group by status.name, status.sortOrder
+order by status.sortOrder</programlisting>
+
+ <para>If I would have mapped the <literal>statusChanges</literal>
+ collection as a list, instead of a set, the query would have been much
+ simpler to write.</para>
+
+ <programlisting>select count(payment), status.name
+from Payment as payment
+ join payment.currentStatus as status
+where payment.status.name <> PaymentStatus.AWAITING_APPROVAL
+ or payment.statusChanges[ maxIndex(payment.statusChanges) ].user <> :currentUser
+group by status.name, status.sortOrder
+order by status.sortOrder</programlisting>
+
+ <para>However the query would have been HQL specific.</para>
+
+ <para>The next query uses the MS SQL Server <literal>isNull()</literal>
+ function to return all the accounts and unpaid payments for the
+ organization to which the current user belongs. It translates to an SQL
+ query with three inner joins, an outer join and a subselect against the
+ <literal>ACCOUNT</literal>, <literal>PAYMENT</literal>,
+ <literal>PAYMENT_STATUS</literal>, <literal>ACCOUNT_TYPE</literal>,
+ <literal>ORGANIZATION</literal> and <literal>ORG_USER</literal>
+ tables.</para>
+
+ <programlisting>select account, payment
+from Account as account
+ join account.holder.users as user
+ left outer join account.payments as payment
+where :currentUser = user
+ and PaymentStatus.UNPAID = isNull(payment.currentStatus.name, PaymentStatus.UNPAID)
+order by account.type.sortOrder, account.accountNumber, payment.dueDate</programlisting>
+ </sect1>
+
+ <sect1 id="queryhql-bulk">
+ <title>Bulk UPDATE & DELETE Statements</title>
+
+ <para>Hibernate now supports UPDATE and DELETE statements in HQL/EJB-QL. See <xref
+ linkend="batch-direct" /> for details.</para>
+ </sect1>
+
+ <sect1 id="queryhql-tipstricks">
+ <title>Tips & Tricks</title>
+
+ <para>To order a result by the size of a collection, use the following
+ query:</para>
+
+ <programlisting>select usr.id, usr.name
+from User as usr
+ left join usr.messages as msg
+group by usr.id, usr.name
+order by count(msg)</programlisting>
+
+ <para>If your database supports subselects, you can place a condition upon
+ selection size in the where clause of your query:</para>
+
+ <programlisting>from User usr where size(usr.messages) >= 1</programlisting>
+
+ <para>If your database doesn't support subselects, use the following
+ query:</para>
+
+ <programlisting>select usr.id, usr.name
+from User usr.name
+ join usr.messages msg
+group by usr.id, usr.name
+having count(msg) >= 1</programlisting>
+
+ <para>As this solution can't return a <literal>User</literal> with zero
+ messages because of the inner join, the following form is also
+ useful:</para>
+
+ <programlisting>select usr.id, usr.name
+from User as usr
+ left join usr.messages as msg
+group by usr.id, usr.name
+having count(msg) = 0</programlisting>
+ </sect1>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_native.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/query_native.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_native.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,111 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="query_native">
- <title>Native query</title>
-
- <para>You may also express queries in the native SQL dialect of your
- database. This is useful if you want to utilize database specific features
- such as query hints or the CONNECT BY option in Oracle. It also provides a
- clean migration path from a direct SQL/JDBC based application to Hibernate.
- Note that Hibernate3 allows you to specify handwritten SQL (including stored
- procedures) for all create, update, delete, and load operations (please
- refer to the reference guide for more information.)</para>
-
- <sect1>
- <title>Expressing the resultset</title>
-
- <para>To use a SQL query, you need to describe the SQL resultset, this
- description will help the <literal>EntityManager</literal> to map your
- columns onto entity properties. This is done using the
- <literal>@SqlResultSetMapping</literal> annotation. Each
- <literal>@SqlResultSetMapping </literal>has a name wich is used when
- creating a SQL query on <literal>EntityManager</literal>.</para>
-
- <programlisting>@SqlResultSetMapping(name="GetNightAndArea", entities={
- @EntityResult(name="org.hibernate.test.annotations.query.Night", fields = {
- @FieldResult(name="id", column="nid"),
- @FieldResult(name="duration", column="night_duration"),
- @FieldResult(name="date", column="night_date"),
- @FieldResult(name="area", column="area_id")
- }),
- @EntityResult(name="org.hibernate.test.annotations.query.Area", fields = {
- @FieldResult(name="id", column="aid"),
- @FieldResult(name="name", column="name")
- })
- }
-)
-
-//or
- at SqlResultSetMapping(name="defaultSpaceShip", entities=@EntityResult(name="org.hibernate.test.annotations.query.SpaceShip"))</programlisting>
-
- <para>You can also define scalar results and even mix entity results and
- scalar results</para>
-
- <programlisting>@SqlResultSetMapping(name="ScalarAndEntities",
- entities={
- @EntityResult(name="org.hibernate.test.annotations.query.Night", fields = {
- @FieldResult(name="id", column="nid"),
- @FieldResult(name="duration", column="night_duration"),
- @FieldResult(name="date", column="night_date"),
- @FieldResult(name="area", column="area_id")
- }),
- @EntityResult(name="org.hibernate.test.annotations.query.Area", fields = {
- @FieldResult(name="id", column="aid"),
- @FieldResult(name="name", column="name")
- })
- },
- columns={
- @ColumnResult(name="durationInSec")
- }
-)</programlisting>
-
- <para>The SQL query will then have to return a column alias
- <literal>durationInSec</literal>.</para>
-
- <para>Please refer to the Hibernate Annotations reference guide for more
- information about <literal>@SqlResultSetMapping.</literal></para>
- </sect1>
-
- <sect1>
- <title>Using native SQL Queries</title>
-
- <para>TODO: This sounds like a dupe...</para>
-
- <para>Now that the result set is described, we are capable of executing
- the native SQL query. <literal>EntityManager</literal> provides all the
- needed APIs. The first method is to use a SQL resultset name to do the
- binding, the second one uses the entity default mapping (the column
- returned has to have the same names as the one used in the mapping). A
- third one (not yet supported by Hibernate entity manager), returns pure
- scalar results.</para>
-
- <programlisting>String sqlQuery = "select night.id nid, night.night_duration, night.night_date, area.id aid, "
- + "night.area_id, area.name from Night night, Area area where night.area_id = area.id "
- + "and night.night_duration >= ?";
-Query q = entityManager.createNativeQuery(sqlQuery, "GetNightAndArea");
-q.setParameter( 1, expectedDuration );
-q.getResultList();</programlisting>
-
- <para>This native query returns nights and area based on the
- <literal>GetNightAndArea</literal> result set.</para>
-
- <programlisting>String sqlQuery = "select * from tbl_spaceship where owner = ?";
-Query q = entityManager.createNativeQuery(sqlQuery, SpaceShip.class);
-q.setParameter( 1, "Han" );
-q.getResultList();</programlisting>
-
- <para>The second version is useful when your SQL query returns one entity
- reusing the same columns as the ones mapped in metadata.</para>
- </sect1>
-
- <sect1>
- <title>Named queries</title>
-
- <para>Native named queries share the same calling API than EJB-QL named
- queries. Your code doesn't need to know the difference between the two.
- This is very useful for migration from SQL to EJB-QL:</para>
-
- <programlisting>Query q = entityManager.createNamedQuery("getSeasonByNativeQuery");
-q.setParameter( 1, name );
-Season season = (Season) q.getSingleResult();</programlisting>
- </sect1>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_native.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/query_native.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_native.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/query_native.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="query_native">
+ <title>Native query</title>
+
+ <para>You may also express queries in the native SQL dialect of your
+ database. This is useful if you want to utilize database specific features
+ such as query hints or the CONNECT BY option in Oracle. It also provides a
+ clean migration path from a direct SQL/JDBC based application to Hibernate.
+ Note that Hibernate3 allows you to specify handwritten SQL (including stored
+ procedures) for all create, update, delete, and load operations (please
+ refer to the reference guide for more information.)</para>
+
+ <sect1>
+ <title>Expressing the resultset</title>
+
+ <para>To use a SQL query, you need to describe the SQL resultset, this
+ description will help the <literal>EntityManager</literal> to map your
+ columns onto entity properties. This is done using the
+ <literal>@SqlResultSetMapping</literal> annotation. Each
+ <literal>@SqlResultSetMapping </literal>has a name wich is used when
+ creating a SQL query on <literal>EntityManager</literal>.</para>
+
+ <programlisting>@SqlResultSetMapping(name="GetNightAndArea", entities={
+ @EntityResult(name="org.hibernate.test.annotations.query.Night", fields = {
+ @FieldResult(name="id", column="nid"),
+ @FieldResult(name="duration", column="night_duration"),
+ @FieldResult(name="date", column="night_date"),
+ @FieldResult(name="area", column="area_id")
+ }),
+ @EntityResult(name="org.hibernate.test.annotations.query.Area", fields = {
+ @FieldResult(name="id", column="aid"),
+ @FieldResult(name="name", column="name")
+ })
+ }
+)
+
+//or
+ at SqlResultSetMapping(name="defaultSpaceShip", entities=@EntityResult(name="org.hibernate.test.annotations.query.SpaceShip"))</programlisting>
+
+ <para>You can also define scalar results and even mix entity results and
+ scalar results</para>
+
+ <programlisting>@SqlResultSetMapping(name="ScalarAndEntities",
+ entities={
+ @EntityResult(name="org.hibernate.test.annotations.query.Night", fields = {
+ @FieldResult(name="id", column="nid"),
+ @FieldResult(name="duration", column="night_duration"),
+ @FieldResult(name="date", column="night_date"),
+ @FieldResult(name="area", column="area_id")
+ }),
+ @EntityResult(name="org.hibernate.test.annotations.query.Area", fields = {
+ @FieldResult(name="id", column="aid"),
+ @FieldResult(name="name", column="name")
+ })
+ },
+ columns={
+ @ColumnResult(name="durationInSec")
+ }
+)</programlisting>
+
+ <para>The SQL query will then have to return a column alias
+ <literal>durationInSec</literal>.</para>
+
+ <para>Please refer to the Hibernate Annotations reference guide for more
+ information about <literal>@SqlResultSetMapping.</literal></para>
+ </sect1>
+
+ <sect1>
+ <title>Using native SQL Queries</title>
+
+ <para>TODO: This sounds like a dupe...</para>
+
+ <para>Now that the result set is described, we are capable of executing
+ the native SQL query. <literal>EntityManager</literal> provides all the
+ needed APIs. The first method is to use a SQL resultset name to do the
+ binding, the second one uses the entity default mapping (the column
+ returned has to have the same names as the one used in the mapping). A
+ third one (not yet supported by Hibernate entity manager), returns pure
+ scalar results.</para>
+
+ <programlisting>String sqlQuery = "select night.id nid, night.night_duration, night.night_date, area.id aid, "
+ + "night.area_id, area.name from Night night, Area area where night.area_id = area.id "
+ + "and night.night_duration >= ?";
+Query q = entityManager.createNativeQuery(sqlQuery, "GetNightAndArea");
+q.setParameter( 1, expectedDuration );
+q.getResultList();</programlisting>
+
+ <para>This native query returns nights and area based on the
+ <literal>GetNightAndArea</literal> result set.</para>
+
+ <programlisting>String sqlQuery = "select * from tbl_spaceship where owner = ?";
+Query q = entityManager.createNativeQuery(sqlQuery, SpaceShip.class);
+q.setParameter( 1, "Han" );
+q.getResultList();</programlisting>
+
+ <para>The second version is useful when your SQL query returns one entity
+ reusing the same columns as the ones mapped in metadata.</para>
+ </sect1>
+
+ <sect1>
+ <title>Named queries</title>
+
+ <para>Native named queries share the same calling API than EJB-QL named
+ queries. Your code doesn't need to know the difference between the two.
+ This is very useful for migration from SQL to EJB-QL:</para>
+
+ <programlisting>Query q = entityManager.createNamedQuery("getSeasonByNativeQuery");
+q.setParameter( 1, name );
+Season season = (Season) q.getSingleResult();</programlisting>
+ </sect1>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/modules/transactions.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/transactions.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/transactions.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,878 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<chapter id="transactions" revision="1">
- <title>Transactions and Concurrency</title>
-
- <para>The most important point about Hibernate Entity Manager and
- concurrency control is that it is very easy to understand. Hibernate Entity
- Manager directly uses JDBC connections and JTA resources without adding any
- additional locking behavior. We highly recommend you spend some time with
- the JDBC, ANSI, and transaction isolation specification of your database
- management system. Hibernate Entity Manager only adds automatic versioning
- but does not lock objects in memory or change the isolation level of your
- database transactions. Basically, use Hibernate Entity Manager like you
- would use direct JDBC (or JTA/CMT) with your database resources.</para>
-
- <para>We start the discussion of concurrency control in Hibernate with the
- granularity of <literal>EntityManagerFactory</literal>, and
- <literal>EntityManager</literal>, as well as database transactions and long
- units of work..</para>
-
- <para>In this chapter, and unless explicitly expressed, we will mix and
- match the concept of entity manager and persistence context. One is an API
- and programming object, the other a definition of scope. However, keep in
- mind the essential difference. A persistence context is usually bound to a
- JTA transaction in Java EE, and a persistence context starts and ends at
- transaction boundaries (transaction-scoped) unless you use an extended
- entity manager. Please refer to <xref
- linkend="architecture-ejb-persistctxscope" /> for more information.</para>
-
- <sect1 id="transactions-basics">
- <title>Entity manager and transaction scopes</title>
-
- <para>A <literal>EntityManagerFactory</literal> is an expensive-to-create,
- threadsafe object intended to be shared by all application threads. It is
- created once, usually on application startup.</para>
-
- <para>An <literal>EntityManager</literal> is an inexpensive,
- non-threadsafe object that should be used once, for a single business
- process, a single unit of work, and then discarded. An
- <literal>EntityManager</literal> will not obtain a JDBC
- <literal>Connection</literal> (or a <literal>Datasource</literal>) unless
- it is needed, so you may safely open and close an
- <literal>EntityManager</literal> even if you are not sure that data access
- will be needed to serve a particular request. (This becomes important as
- soon as you are implementing some of the following patterns using request
- interception.)</para>
-
- <para>To complete this picture you also have to think about database
- transactions. A database transaction has to be as short as possible, to
- reduce lock contention in the database. Long database transactions will
- prevent your application from scaling to highly concurrent load.</para>
-
- <para>What is the scope of a unit of work? Can a single Hibernate
- <literal>EntityManager</literal> span several database transactions or is
- this a one-to-one relationship of scopes? When should you open and close a
- <literal>Session</literal> and how do you demarcate the database
- transaction boundaries?</para>
-
- <sect2 id="transactions-basics-uow">
- <title>Unit of work</title>
-
- <para>First, don't use the
- <emphasis>entitymanager-per-operation</emphasis> antipattern, that is,
- don't open and close an <literal>EntityManager</literal> for every
- simple database call in a single thread! Of course, the same is true for
- database transactions. Database calls in an application are made using a
- planned sequence, they are grouped into atomic units of work. (Note that
- this also means that auto-commit after every single SQL statement is
- useless in an application, this mode is intended for ad-hoc SQL console
- work.)</para>
-
- <para>The most common pattern in a multi-user client/server application
- is <emphasis>entitymanager-per-request</emphasis>. In this model, a
- request from the client is send to the server (where the EJB3
- persistence layer runs), a new <literal>EntityManager</literal> is
- opened, and all database operations are executed in this unit of work.
- Once the work has been completed (and the response for the client has
- been prepared), the persistence context is flushed and closed, as well
- as the entity manager object. You would also use a single database
- transaction to serve the clients request. The relationship between the
- two is one-to-one and this model is a perfect fit for many
- applications.</para>
-
- <para>This is the default EJB3 persistence model in a Java EE
- environment (JTA bounded, transaction-scoped persistence context);
- injected (or looked up) entity managers share the same persistence
- context for a particular JTA transaction. The beauty of EJB3 is that you
- don't have to care about that anymore and just see data access through
- entity manager and demaraction of transaction scope on session beans as
- completely orthogonal.</para>
-
- <para>The challenge is the implementation of this (and other) behavior
- outside an EJB3 container: not only has the
- <literal>EntityManager</literal> and resource-local transaction to be
- started and ended correctly, but they also have to be accessible for
- data access operations. The demarcation of a unit of work is ideally
- implemented using an interceptor that runs when a request hits the
- non-EJB3 container server and before the response will be send (i.e. a
- <literal>ServletFilter</literal> if you are using a standalone servlet
- container). We recommend to bind the <literal>EntityManager</literal> to
- the thread that serves the request, using a
- <literal>ThreadLocal</literal> variable. This allows easy access (like
- accessing a static variable) in all code that runs in this thread.
- Depending on the database transaction demarcation mechanism you chose,
- you might also keep the transaction context in a
- <literal>ThreadLocal</literal> variable. The implementation patterns for
- this are known as <emphasis>ThreadLocal Session</emphasis> and
- <emphasis>Open Session in View</emphasis> in the Hibernate community.
- You can easily extend the <literal>HibernateUtil</literal> shown in the
- Hibernate reference documentation to implement this pattern, you don't
- need any external software (it's in fact very trivial). Of course, you'd
- have to find a way to implement an interceptor and set it up in your
- environment. See the Hibernate website for tips and examples. Once
- again, remember that your first choice is naturally an EJB3 container -
- preferably a light and modular one such as JBoss application
- server.</para>
- </sect2>
-
- <sect2 id="transactions-basics-apptx">
- <title>Long units of work</title>
-
- <para>The entitymanager-per-request pattern is not the only useful
- concept you can use to design units of work. Many business processes
- require a whole series of interactions with the user interleaved with
- database accesses. In web and enterprise applications it is not
- acceptable for a database transaction to span a user interaction with
- possibly long waiting time between requests. Consider the following
- example:</para>
-
- <itemizedlist>
- <listitem>
- <para>The first screen of a dialog opens, the data seen by the user
- has been loaded in a particular <literal>EntityManager</literal> and
- resource-local transaction. The user is free to modify the detached
- objects.</para>
- </listitem>
-
- <listitem>
- <para>The user clicks "Save" after 5 minutes and expects his
- modifications to be made persistent; he also expects that he was the
- only person editing this information and that no conflicting
- modification can occur.</para>
- </listitem>
- </itemizedlist>
-
- <para>We call this unit of work, from the point of view of the user, a
- long running <emphasis>application transaction</emphasis>. There are
- many ways how you can implement this in your application.</para>
-
- <para>A first naive implementation might keep the
- <literal>EntityManager</literal> and database transaction open during
- user think time, with locks held in the database to prevent concurrent
- modification, and to guarantee isolation and atomicity. This is of
- course an anti-pattern, a pessimistic approach, since lock contention
- would not allow the application to scale with the number of concurrent
- users.</para>
-
- <para>Clearly, we have to use several database transactions to implement
- the application transaction. In this case, maintaining isolation of
- business processes becomes the partial responsibility of the application
- tier. A single application transaction usually spans several database
- transactions. It will be atomic if only one of these database
- transactions (the last one) stores the updated data, all others simply
- read data (e.g. in a wizard-style dialog spanning several
- request/response cycles). This is easier to implement than it might
- sound, especially if you use EJB3 entity manager and persistence context
- features:</para>
-
- <itemizedlist>
- <listitem>
- <para><emphasis>Automatic Versioning</emphasis> - An entity manager
- can do automatic optimistic concurrency control for you, it can
- automatically detect if a concurrent modification occured during
- user think time (usually by comparing version numbers or timestamps
- when updating the data in the final resource-local
- transaction).</para>
- </listitem>
-
- <listitem>
- <para><emphasis>Detached Entities</emphasis> - If you decide to use
- the already discussed <emphasis>entity-per-request</emphasis>
- pattern, all loaded instances will be in detached state during user
- think time. The entity manager allows you to merge the detached
- (modified) state and persist the modifications, the pattern is
- called
- <emphasis>entitymanager-per-request-with-detached-entities</emphasis>.
- Automatic versioning is used to isolate concurrent
- modifications.</para>
- </listitem>
-
- <listitem>
- <para><emphasis>Extended Entity Manager</emphasis> - The Hibernate
- Entity Manager may be disconnected from the underlying JDBC
- connection between two client calls and reconnected when a new
- client request occurs. This pattern is known as
- <emphasis>entitymanager-per-application-transaction</emphasis> and
- makes even merging unnecessary. An extend persistence context is
- responsible to collect and retain any modification (persist, merge,
- remove) made outside a transaction. The next client call made inside
- an active transaction (typically the last operation of a user
- conversation) will execute all queued modifications. Automatic
- versioning is used to isolate concurrent modifications.</para>
- </listitem>
- </itemizedlist>
-
- <para>Both
- <emphasis>entitymanager-per-request-with-detached-objects</emphasis> and
- <emphasis>entitymanager-per-application-transaction</emphasis> have
- advantages and disadvantages, we discuss them later in this chapter in
- the context of optimistic concurrency control.</para>
-
- <para>TODO: This note should probably come later.</para>
- </sect2>
-
- <sect2 id="transactions-basics-identity">
- <title>Considering object identity</title>
-
- <para>An application may concurrently access the same persistent state
- in two different persistence contexts. However, an instance of a managed
- class is never shared between two persistence contexts. Hence there are
- two different notions of identity:</para>
-
- <variablelist spacing="compact">
- <varlistentry>
- <term>Database Identity</term>
-
- <listitem>
- <para>
- <literal>foo.getId().equals( bar.getId() )</literal>
- </para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>JVM Identity</term>
-
- <listitem>
- <para>
- <literal>foo==bar</literal>
- </para>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para>Then for objects attached to a <emphasis>particular</emphasis>
- persistence context (i.e. in the scope of an
- <literal>EntityManager</literal>) the two notions are equivalent, and
- JVM identity for database identity is guaranteed by the Hibernate Entity
- Manager. However, while the application might concurrently access the
- "same" (persistent identity) business object in two different
- persistence contexts, the two instances will actually be "different"
- (JVM identity). Conflicts are resolved using (automatic versioning) at
- flush/commit time, using an optimistic approach.</para>
-
- <para>This approach leaves Hibernate and the database to worry about
- concurrency; it also provides the best scalability, since guaranteeing
- identity in single-threaded units of work only doesn't need expensive
- locking or other means of synchronization. The application never needs
- to synchronize on any business object, as long as it sticks to a single
- thread per <literal>EntityManager</literal>. Within a persistence
- context, the application may safely use <literal>==</literal> to compare
- entities.</para>
-
- <para>However, an application that uses <literal>==</literal> outside of
- a persistence context might see unexpected results. This might occur
- even in some unexpected places, for example, if you put two detached
- instances into the same <literal>Set</literal>. Both might have the same
- database identity (i.e. they represent the same row), but JVM identity
- is by definition not guaranteed for instances in detached state. The
- developer has to override the <literal>equals()</literal> and
- <literal>hashCode()</literal> methods in persistent classes and
- implement his own notion of object equality. There is one caveat: Never
- use the database identifier to implement equality, use a business key, a
- combination of unique, usually immutable, attributes. The database
- identifier will change if a transient entity is made persistent (see the
- contract of the <literal>persist()</literal> operation). If the
- transient instance (usually together with detached instances) is held in
- a <literal>Set</literal>, changing the hashcode breaks the contract of
- the <literal>Set</literal>. Attributes for good business keys don't have
- to be as stable as database primary keys, you only have to guarantee
- stability as long as the objects are in the same <literal>Set</literal>.
- See the Hibernate website for a more thorough discussion of this issue.
- Also note that this is not a Hibernate issue, but simply how Java object
- identity and equality has to be implemented.</para>
- </sect2>
-
- <sect2 id="transactions-basics-issues">
- <title>Common concurrency control issues</title>
-
- <para>Never use the anti-patterns
- <emphasis>entitymanager-per-user-session</emphasis> or
- <emphasis>entitymanager-per-application</emphasis> (of course, there are
- rare exceptions to this rule, e.g. entitymanager-per-application might
- be acceptable in a desktop application, with manual flushing of the
- persistence context). Note that some of the following issues might also
- appear with the recommended patterns, make sure you understand the
- implications before making a design decision:</para>
-
- <itemizedlist>
- <listitem>
- <para>An entity manager is not thread-safe. Things which are
- supposed to work concurrently, like HTTP requests, session beans, or
- Swing workers, will cause race conditions if an
- <literal>EntityManager</literal> instance would be shared. If you
- keep your Hibernate <literal>EntityManager</literal> in your
- <literal>HttpSession</literal> (discussed later), you should
- consider synchronizing access to your Http session. Otherwise, a
- user that clicks reload fast enough may use the same
- <literal>EntityManager</literal> in two concurrently running
- threads. You will very likely have provisions for this case already
- in place, for other non-threadsafe but session-scoped
- objects.</para>
- </listitem>
-
- <listitem>
- <para>An exception thrown by the Entity Manager means you have to
- rollback your database transaction and close the
- <literal>EntityManager</literal> immediately (discussed later in
- more detail). If your <literal>EntityManager</literal> is bound to
- the application, you have to stop the application. Rolling back the
- database transaction doesn't put your business objects back into the
- state they were at the start of the transaction. This means the
- database state and the business objects do get out of sync. Usually
- this is not a problem, because exceptions are not recoverable and
- you have to start over your unit of work after rollback
- anyway.</para>
- </listitem>
-
- <listitem>
- <para>The persistence context caches every object that is in managed
- state (watched and checked for dirty state by Hibernate). This means
- it grows endlessly until you get an
- <classname>OutOfMemoryException</classname>, if you keep it open for
- a long time or simply load too much data. One solution for this is
- some kind batch processing with regular flushing of the persistence
- context, but you should consider using a database stored procedure
- if you need mass data operations. Some solutions for this problem
- are shown in <xref linkend="batch" />. Keeping a persistence context
- open for the duration of a user session also means a high
- probability of stale data, which you have to know about and control
- appropriately.</para>
- </listitem>
- </itemizedlist>
- </sect2>
- </sect1>
-
- <sect1 id="transactions-demarcation">
- <title>Database transaction demarcation</title>
-
- <para>Datatabase (or system) transaction boundaries are always necessary.
- No communication with the database can occur outside of a database
- transaction (this seems to confuse many developers who are used to the
- auto-commit mode). Always use clear transaction boundaries, even for
- read-only operations. Depending on your isolation level and database
- capabilities this might not be required but there is no downside if you
- always demarcate transactions explicitly. You'll have to do operations
- outside a transaction, though, when you'll need to retain modifications in
- an <literal>EXTENDED</literal> persistence context.</para>
-
- <para>An EJB3 application can run in non-managed (i.e. standalone, simple
- Web- or Swing applications) and managed J2EE environments. In a
- non-managed environment, an <literal>EntityManagerFactory</literal> is
- usually responsible for its own database connection pool. The application
- developer has to manually set transaction boundaries, in other words,
- begin, commit, or rollback database transactions itself. A managed
- environment usually provides container-managed transactions, with the
- transaction assembly defined declaratively through annotations of EJB
- session beans, for example. Programmatic transaction demarcation is then
- no longer necessary, even flushing the <literal>EntityManager</literal> is
- done automatically.</para>
-
- <para>Usually, ending a unit of work involves four distinct phases:</para>
-
- <itemizedlist spacing="compact">
- <listitem>
- <para>commit the (resource-local or JTA) transaction (this
- automatically flushes the entity manager and persistence
- context)</para>
- </listitem>
-
- <listitem>
- <para>close the entity manager (if using an application-managed entity
- manager)</para>
- </listitem>
-
- <listitem>
- <para>handle exceptions</para>
- </listitem>
- </itemizedlist>
-
- <para>We'll now have a closer look at transaction demarcation and
- exception handling in both managed- and non-managed environments.</para>
-
- <sect2 id="transactions-demarcation-nonmanaged">
- <title>Non-managed environment</title>
-
- <para>If an EJB3 persistence layer runs in a non-managed environment,
- database connections are usually handled by Hibernate's pooling
- mechanism behind the scenes. The common entity manager and transaction
- handling idiom looks like this:</para>
-
- <programlisting>// Non-managed environment idiom
-EntityManager em = emf.createEntityManager();
-EntityTransaction tx = null;
-try {
- tx = em.getTransaction();
- tx.begin();
-
- // do some work
- ...
-
- tx.commit();
-}
-catch (RuntimeException e) {
- if ( tx != null && tx.isActive() ) tx.rollback();
- throw e; // or display error message
-}
-finally {
- em.close();
-}</programlisting>
-
- <para>You don't have to <literal>flush()</literal> the
- <literal>EntityManager</literal> explicitly - the call to
- <literal>commit()</literal> automatically triggers the
- synchronization.</para>
-
- <para>A call to <literal>close()</literal> marks the end of an
- <literal>EntityManager</literal>. The main implication of
- <literal>close()</literal> is the release of resources - make sure you
- always close and never outside of guaranteed finally block.</para>
-
- <para>You will very likely never see this idiom in business code in a
- normal application; fatal (system) exceptions should always be caught at
- the "top". In other words, the code that executes entity manager calls
- (in the persistence layer) and the code that handles
- <literal>RuntimeException</literal> (and usually can only clean up and
- exit) are in different layers. This can be a challenge to design
- yourself and you should use J2EE/EJB container services whenever they
- are available. Exception handling is discussed later in this
- chapter.</para>
-
- <sect3>
- <title>EntityTransaction</title>
-
- <para>In a JTA environment, you don't need any extra API to interact
- with the transaction in your environment. Simply use transaction
- declaration or the JTA APIs.</para>
-
- <para>If you are using a <literal>RESOURCE_LOCAL</literal> entity
- manager, you need to demarcate your transaction boundaries through the
- <literal>EntityTransaction</literal> API. You can get an
- <literal>EntityTransaction</literal> through
- <literal>entityManager.getTransaction()</literal>. This
- <literal>EntityTransaction</literal> API provides the regular
- <methodname>begin()</methodname>, <methodname>commit()</methodname>,
- <methodname>rollback()</methodname> and
- <methodname>isActive()</methodname> methods. It also provide a way to
- mark a transaction as rollback only, ie force the transaction to
- rollback. This is very similar to the JTA operation
- <methodname>setRollbackOnly()</methodname>. When a
- <literal>commit()</literal> operation fail and/or if the transaction
- is marked as <literal>setRollbackOnly()</literal>, the
- <literal>commit()</literal> method will try to rollback the
- transaction and raise a
- <literal>javax.transaction.RollbackException</literal>.</para>
-
- <para>In a <literal>JTA</literal> entity manager,
- <literal>entityManager.getTransaction()</literal> calls are not
- permitted.</para>
- </sect3>
- </sect2>
-
- <sect2 id="transactions-demarcation-jta">
- <title>Using JTA</title>
-
- <para>If your persistence layer runs in an application server (e.g.
- behind EJB3 session beans), every datasource connection obtained
- internally by the entity manager will automatically be part of the
- global JTA transaction. Hibernate offers two strategies for this
- integration.</para>
-
- <para>If you use bean-managed transactions (BMT), the code will look
- like this:</para>
-
- <programlisting>// BMT idiom
- at Resource public UserTransaction utx;
- at Resource public EntityManagerFactory factory;
-
-public void doBusiness() {
- EntityManager em = factory.createEntityManager();
- try {
-
- // do some work
- ...
-
- utx.commit();
-}
-catch (RuntimeException e) {
- if (utx != null) utx.rollback();
- throw e; // or display error message
-}
-finally {
- em.close();
-}</programlisting>
-
- <para>With Container Managed Transactions (CMT) in an EJB3 container,
- transaction demarcation is done in session bean annotations or
- deployment descriptors, not programatically. The
- <literal>EntityManager</literal> will automatically be flushed on
- transaction completion (and if you have injected or lookup the
- <literal>EntityManager</literal>, it will be also closed automatically).
- If an exception occurs during the <literal>EntityManager</literal> use,
- transaction rollback occurs automatically if you don't catch the
- exception. Since <literal>EntityManager</literal> exceptions are
- <literal>RuntimeException</literal>s they will rollback the transaction
- as per the EJB specification (system exception vs. application
- exception).</para>
-
- <para>It is important to let Hibernate EntityManager define the
- <literal>hibernate.transaction.factory_class</literal> (ie not
- overriding this value). Remember to also set
- <literal>org.hibernate.transaction.manager_lookup_class</literal>.</para>
-
- <para>If you work in a CMT environment, you might also want to use the
- same entity manager in different parts of your code. Typically, in a
- non-managed environment you would use a <literal>ThreadLocal</literal>
- variable to hold the entity manager, but a single EJB request might
- execute in different threads (e.g. session bean calling another session
- bean). The EJB3 container takes care of the persistence context
- propagation for you. Either using injection or lookup, the EJB3
- container will return an entity manager with the same persistence
- context bound to the JTA context if any, or create a new one and bind it
- (see <xref linkend="architecture-ejb-persistctxpropagation" /> .)</para>
-
- <para>Our entity manager/transaction management idiom for CMT and EJB3
- container-use is reduced to this:</para>
-
- <programlisting>//CMT idiom through injection
- at PersistenceContext(name="sample") EntityManager em;</programlisting>
-
- <para>In other words, all you have to do in a managed environment is to
- inject the <literal>EntityManager</literal>, do your data access work,
- and leave the rest to the container. Transaction boundaries are set
- declaratively in the annotations or deployment descriptors of your
- session beans. The lifecycle of the entity manager and persistence
- context is completely managed by the container.</para>
-
- <para>TODO: The following paragraph is very confusing, especially the
- beginning...</para>
-
- <para>When using particular Hibernate native APIs, one caveat has to be
- remembered: <literal>after_statement</literal> connection release mode.
- Due to a silly limitation of the JTA spec, it is not possible for
- Hibernate to automatically clean up any unclosed
- <literal>ScrollableResults</literal> or <literal>Iterator</literal>
- instances returned by <literal>scroll()</literal> or
- <literal>iterate()</literal>. You <emphasis>must</emphasis> release the
- underlying database cursor by calling
- <literal>ScrollableResults.close()</literal> or
- <literal>Hibernate.close(Iterator)</literal> explicity from a
- <literal>finally</literal> block. (Of course, most applications can
- easily avoid using <literal>scroll()</literal> or
- <literal>iterate()</literal> at all from the CMT code.)</para>
- </sect2>
-
- <sect2 id="transactions-demarcation-exceptions">
- <title>Exception handling</title>
-
- <para>If the <literal>EntityManager</literal> throws an exception
- (including any <literal>SQLException</literal>), you should immediately
- rollback the database transaction, call
- <literal>EntityManager.close()</literal> (if
- <methodname>createEntityManager()</methodname> has been called) and
- discard the <literal>EntityManager</literal> instance. Certain methods
- of <literal>EntityManager</literal> will <emphasis>not</emphasis> leave
- the persistence context in a consistent state. No exception thrown by an
- entity manager can be treated as recoverable. Ensure that the
- <literal>EntityManager</literal> will be closed by calling
- <literal>close()</literal> in a <literal>finally</literal> block. Note
- that a container managed entity manager will do that for you. You just
- have to let the RuntimeException propagate up to the container.</para>
-
- <para>The Hibernate entity manager generally raises exceptions which
- encapsulate the Hibernate core exception. Common exceptions raised by
- the <literal>EntityManager</literal> API are</para>
-
- <itemizedlist>
- <listitem>
- <para>IllegalArgumentException: something wrong happen</para>
- </listitem>
-
- <listitem>
- <para>EntityNotFoundException: an entity was expected but none match
- the requirement</para>
- </listitem>
-
- <listitem>
- <para>TransactionRequiredException: this operation has to be in a
- transaction</para>
- </listitem>
-
- <listitem>
- <para>IllegalStateException: the entity manager is used in a wrong
- way</para>
- </listitem>
- </itemizedlist>
-
- <para>The <literal>HibernateException</literal>, which wraps most of the
- errors that can occur in a Hibernate persistence layer, is an unchecked
- exception. Note that Hibernate might also throw other unchecked
- exceptions which are not a <literal>HibernateException</literal>. These
- are, again, not recoverable and appropriate action should be
- taken.</para>
-
- <para>Hibernate wraps <literal>SQLException</literal>s thrown while
- interacting with the database in a <literal>JDBCException</literal>. In
- fact, Hibernate will attempt to convert the eexception into a more
- meningful subclass of <literal>JDBCException</literal>. The underlying
- <literal>SQLException</literal> is always available via
- <literal>JDBCException.getCause()</literal>. Hibernate converts the
- <literal>SQLException</literal> into an appropriate
- <literal>JDBCException</literal> subclass using the
- <literal>SQLExceptionConverter</literal> attached to the
- <literal>SessionFactory</literal>. By default, the
- <literal>SQLExceptionConverter</literal> is defined by the configured
- dialect; however, it is also possible to plug in a custom implementation
- (see the javadocs for the
- <literal>SQLExceptionConverterFactory</literal> class for details). The
- standard <literal>JDBCException</literal> subtypes are:</para>
-
- <itemizedlist spacing="compact">
- <listitem>
- <para><literal>JDBCConnectionException</literal> - indicates an
- error with the underlying JDBC communication.</para>
- </listitem>
-
- <listitem>
- <para><literal>SQLGrammarException</literal> - indicates a grammar
- or syntax problem with the issued SQL.</para>
- </listitem>
-
- <listitem>
- <para><literal>ConstraintViolationException</literal> - indicates
- some form of integrity constraint violation.</para>
- </listitem>
-
- <listitem>
- <para><literal>LockAcquisitionException</literal> - indicates an
- error acquiring a lock level necessary to perform the requested
- operation.</para>
- </listitem>
-
- <listitem>
- <para><literal>GenericJDBCException</literal> - a generic exception
- which did not fall into any of the other categories.</para>
- </listitem>
- </itemizedlist>
- </sect2>
- </sect1>
-
- <sect1>
- <title>EXTENDED Persistence Context</title>
-
- <para>All application managed entity manager and container managed
- persistence contexts defined as such are <literal>EXTENDED</literal>. This
- means that the persistence context type goes beyond the transaction life
- cycle. We should then understand what happens to operations made outside
- the scope of a transaction.</para>
-
- <para>In an <literal>EXTENDED</literal> persistence context, all read only
- operations of the entity manager can be executed outside a transaction
- (<literal>find()</literal>, <literal>getReference()</literal>,
- <literal>refresh()</literal>, and read queries). Some modifications
- operations can be executed outside a transaction, but they are queued
- until the persistence context join a transaction: this is the case of
- <literal>persist()</literal>,
- <literal><literal>merge()</literal></literal>,
- <literal>remove()</literal>. Some operations cannot be called outside a
- transaction: <literal>flush()</literal>, <literal>lock()</literal>, and
- update/delete queries.</para>
-
- <sect2>
- <title>Container Managed Entity Manager</title>
-
- <para>When using an EXTENDED persistence context with a container
- managed entity manager, the lifecycle of the persistence context is
- binded to the lifecycle of the Stateful Session Bean. Plus if the entity
- manager is created outside a transaction, modifications operations
- (persist, merge, remove) are queued in the persistence context and not
- executed to the database.</para>
-
- <para>When a method of the stateful session bean involved or starting a
- transaction is later called, the entity manager join the transaction.
- All queued operation will then be executed to synchronize the
- persistence context.</para>
-
- <para>This is perfect to implement the
- <literal>entitymanager-per-conversation</literal> pattern. A stateful
- session bean represents the conversation implementation. All
- intermediate conversation work will be processed in methods not
- involving transaction. The end of the conversation will be processed
- inside a <literal>JTA</literal> transaction. Hence all queued operations
- will be executed to the database and commited. If you are interested in
- the notion of conversation inside your application, have a look at JBoss
- Seam. Jboss Seam emphasizes the concept of conversation and entity
- manager lifecycle and bind EJB3 and JSF together.</para>
- </sect2>
-
- <sect2>
- <title>Application Managed Entity Manager</title>
-
- <para>Application-managed entity manager are always
- <literal>EXTENDED</literal>. When you create an entity manager inside a
- transaction, the entity manager automatically join the current
- transaction. If the entity manager is created outside a transaction, the
- entity manager will queue the modification operations. When</para>
-
- <itemizedlist>
- <listitem>
- <para><methodname>entityManager.joinTransaction()</methodname> is
- called when a JTA transaction is active for a <literal>JTA</literal>
- entity manager</para>
- </listitem>
-
- <listitem>
- <para><literal>entityManager.getTransaction().begin()</literal> is
- called for a <literal>RESOURCE_LOCAL</literal> entity manager</para>
- </listitem>
- </itemizedlist>
-
- <para>the entity manager join the transaction and all the queued
- operations will then be executed to synchronize the persistence
- context.</para>
-
- <para>It is not legal to call
- <methodname>entityManager.joinTransaction()</methodname> if no JTA
- transaction is involved.</para>
- </sect2>
- </sect1>
-
- <sect1 id="transactions-optimistic">
- <title>Optimistic concurrency control</title>
-
- <para>The only approach that is consistent with high concurrency and high
- scalability is optimistic concurrency control with versioning. Version
- checking uses version numbers, or timestamps, to detect conflicting
- updates (and to prevent lost updates). Hibernate provides for three
- possible approaches to writing application code that uses optimistic
- concurrency. The use cases we show are in the context of long application
- transactions but version checking also has the benefit of preventing lost
- updates in single database transactions.</para>
-
- <sect2 id="transactions-optimistic-manual">
- <title>Application version checking</title>
-
- <para>In an implementation without much help from the persistence
- mechanism, each interaction with the database occurs in a new
- <literal>EntityManager</literal> and the developer is responsible for
- reloading all persistent instances from the database before manipulating
- them. This approach forces the application to carry out its own version
- checking to ensure application transaction isolation. This approach is
- the least efficient in terms of database access. It is the approach most
- similar to EJB2 entities:</para>
-
- <programlisting>// foo is an instance loaded by a previous entity manager
-em = factory.createEntityManager();
-EntityTransaction t = em.getTransaction();
-t.begin();
-int oldVersion = foo.getVersion();
-Foo dbFoo = em.find( foo.getClass(), foo.getKey() ); // load the current state
-if ( dbFoo.getVersion()!=foo.getVersion ) throw new StaleObjectStateException();
-dbFoo.setProperty("bar");
-t.commit();
-em.close();</programlisting>
-
- <para>The <literal>version</literal> property is mapped using
- <literal>@Version</literal>, and the entity manager will automatically
- increment it during flush if the entity is dirty.</para>
-
- <para>Of course, if you are operating in a low-data-concurrency
- environment and don't require version checking, you may use this
- approach and just skip the version check. In that case, <emphasis>last
- commit wins</emphasis> will be the default strategy for your long
- application transactions. Keep in mind that this might confuse the users
- of the application, as they might experience lost updates without error
- messages or a chance to merge conflicting changes.</para>
-
- <para>Clearly, manual version checking is only feasible in very trivial
- circumstances and not practical for most applications. Often not only
- single instances, but complete graphs of modified ojects have to be
- checked. Hibernate offers automatic version checking with either
- detached instances or an extended entity manager and persistence context
- as the design paradigm.</para>
- </sect2>
-
- <sect2 id="transactions-optimistic-longsession">
- <title>Extended entity manager and automatic versioning</title>
-
- <para>A single persistence context is used for the whole application
- transaction. The entity manager checks instance versions at flush time,
- throwing an exception if concurrent modification is detected. It's up to
- the developer to catch and handle this exception (common options are the
- opportunity for the user to merge his changes or to restart the business
- process with non-stale data).</para>
-
- <para>In an <literal>EXTENDED</literal> persistence context, all
- operations made outside an active transaction are queued. The
- <literal>EXTENDED</literal> persistence context is flushed when executed
- in an active transaction (at worse at commit time).</para>
-
- <para>The <literal>Entity Manager</literal> is disconnected from any
- underlying JDBC connection when waiting for user interaction. In an
- application-managed extended entity manager, this occurs automatically
- at transaction completion. In a stateful session bean holding a
- container-managed extended entity manager (i.e. a SFSB annotated with
- <literal>@PersistenceContext(EXTENDED)</literal>), this occurs
- transparently as well. This approach is the most efficient in terms of
- database access. The application need not concern itself with version
- checking or with merging detached instances, nor does it have to reload
- instances in every database transaction. For those who might be
- concerned by the number of connections opened and closed, remember that
- the connection provider should be a connection pool, so there is no
- performance impact. The following examples show the idiom in a
- non-managed environment:</para>
-
- <programlisting>// foo is an instance loaded earlier by the extended entity manager
-em.getTransaction.begin(); // new connection to data store is obtained and tx started
-foo.setProperty("bar");
-em.getTransaction().commit(); // End tx, flush and check version, disconnect</programlisting>
-
- <para>The <literal>foo</literal> object still knows which
- <literal>persistence context</literal> it was loaded in. With
- <literal>getTransaction.begin();</literal> the entity manager obtains a
- new connection and resumes the persistence context. The method
- <literal>getTransaction().commit()</literal> will not only flush and
- check versions, but also disconnects the entity manager from the JDBC
- connection and return the connection to the pool.</para>
-
- <para>This pattern is problematic if the persistence context is too big
- to be stored during user think time, and if you don't know where to
- store it. E.g. the <literal>HttpSession</literal> should be kept as
- small as possible. As the persistence context is also the (mandatory)
- first-level cache and contains all loaded objects, we can probably use
- this strategy only for a few request/response cycles. This is indeed
- recommended, as the persistence context will soon also have stale
- data.</para>
-
- <para>It is up to you where you store the extended entity manager during
- requests, inside an EJB3 container you simply use a stateful session
- bean as described above. Don't transfer it to the web layer (or even
- serialize it to a separate tier) to store it in the
- <literal>HttpSession</literal>. In a non-managed, two-tiered environment
- the <literal>HttpSession</literal> might indeed be the right place to
- store it.</para>
- </sect2>
-
- <sect2 id="transactions-optimistic-detached">
- <title>Detached objects and automatic versioning</title>
-
- <para>With this paradigm, each interaction with the data store occurs in
- a new persistence context. However, the same persistent instances are
- reused for each interaction with the database. The application
- manipulates the state of detached instances originally loaded in another
- persistence context and then merges the changes using
- <literal>EntityManager.merge()</literal>:</para>
-
- <programlisting>// foo is an instance loaded by a non-extended entity manager
-foo.setProperty("bar");
-entityManager = factory.createEntityManager();
-entityManager.getTransaction().begin();
-managedFoo = session.merge(foo); // discard foo and from now on use managedFoo
-entityManager.getTransaction().commit();
-entityManager.close();</programlisting>
-
- <para>Again, the entity manager will check instance versions during
- flush, throwing an exception if conflicting updates occured.</para>
- </sect2>
- </sect1>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/modules/transactions.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/modules/transactions.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/modules/transactions.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/modules/transactions.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,878 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<chapter id="transactions" revision="1">
+ <title>Transactions and Concurrency</title>
+
+ <para>The most important point about Hibernate Entity Manager and
+ concurrency control is that it is very easy to understand. Hibernate Entity
+ Manager directly uses JDBC connections and JTA resources without adding any
+ additional locking behavior. We highly recommend you spend some time with
+ the JDBC, ANSI, and transaction isolation specification of your database
+ management system. Hibernate Entity Manager only adds automatic versioning
+ but does not lock objects in memory or change the isolation level of your
+ database transactions. Basically, use Hibernate Entity Manager like you
+ would use direct JDBC (or JTA/CMT) with your database resources.</para>
+
+ <para>We start the discussion of concurrency control in Hibernate with the
+ granularity of <literal>EntityManagerFactory</literal>, and
+ <literal>EntityManager</literal>, as well as database transactions and long
+ units of work..</para>
+
+ <para>In this chapter, and unless explicitly expressed, we will mix and
+ match the concept of entity manager and persistence context. One is an API
+ and programming object, the other a definition of scope. However, keep in
+ mind the essential difference. A persistence context is usually bound to a
+ JTA transaction in Java EE, and a persistence context starts and ends at
+ transaction boundaries (transaction-scoped) unless you use an extended
+ entity manager. Please refer to <xref
+ linkend="architecture-ejb-persistctxscope" /> for more information.</para>
+
+ <sect1 id="transactions-basics">
+ <title>Entity manager and transaction scopes</title>
+
+ <para>A <literal>EntityManagerFactory</literal> is an expensive-to-create,
+ threadsafe object intended to be shared by all application threads. It is
+ created once, usually on application startup.</para>
+
+ <para>An <literal>EntityManager</literal> is an inexpensive,
+ non-threadsafe object that should be used once, for a single business
+ process, a single unit of work, and then discarded. An
+ <literal>EntityManager</literal> will not obtain a JDBC
+ <literal>Connection</literal> (or a <literal>Datasource</literal>) unless
+ it is needed, so you may safely open and close an
+ <literal>EntityManager</literal> even if you are not sure that data access
+ will be needed to serve a particular request. (This becomes important as
+ soon as you are implementing some of the following patterns using request
+ interception.)</para>
+
+ <para>To complete this picture you also have to think about database
+ transactions. A database transaction has to be as short as possible, to
+ reduce lock contention in the database. Long database transactions will
+ prevent your application from scaling to highly concurrent load.</para>
+
+ <para>What is the scope of a unit of work? Can a single Hibernate
+ <literal>EntityManager</literal> span several database transactions or is
+ this a one-to-one relationship of scopes? When should you open and close a
+ <literal>Session</literal> and how do you demarcate the database
+ transaction boundaries?</para>
+
+ <sect2 id="transactions-basics-uow">
+ <title>Unit of work</title>
+
+ <para>First, don't use the
+ <emphasis>entitymanager-per-operation</emphasis> antipattern, that is,
+ don't open and close an <literal>EntityManager</literal> for every
+ simple database call in a single thread! Of course, the same is true for
+ database transactions. Database calls in an application are made using a
+ planned sequence, they are grouped into atomic units of work. (Note that
+ this also means that auto-commit after every single SQL statement is
+ useless in an application, this mode is intended for ad-hoc SQL console
+ work.)</para>
+
+ <para>The most common pattern in a multi-user client/server application
+ is <emphasis>entitymanager-per-request</emphasis>. In this model, a
+ request from the client is send to the server (where the EJB3
+ persistence layer runs), a new <literal>EntityManager</literal> is
+ opened, and all database operations are executed in this unit of work.
+ Once the work has been completed (and the response for the client has
+ been prepared), the persistence context is flushed and closed, as well
+ as the entity manager object. You would also use a single database
+ transaction to serve the clients request. The relationship between the
+ two is one-to-one and this model is a perfect fit for many
+ applications.</para>
+
+ <para>This is the default EJB3 persistence model in a Java EE
+ environment (JTA bounded, transaction-scoped persistence context);
+ injected (or looked up) entity managers share the same persistence
+ context for a particular JTA transaction. The beauty of EJB3 is that you
+ don't have to care about that anymore and just see data access through
+ entity manager and demaraction of transaction scope on session beans as
+ completely orthogonal.</para>
+
+ <para>The challenge is the implementation of this (and other) behavior
+ outside an EJB3 container: not only has the
+ <literal>EntityManager</literal> and resource-local transaction to be
+ started and ended correctly, but they also have to be accessible for
+ data access operations. The demarcation of a unit of work is ideally
+ implemented using an interceptor that runs when a request hits the
+ non-EJB3 container server and before the response will be send (i.e. a
+ <literal>ServletFilter</literal> if you are using a standalone servlet
+ container). We recommend to bind the <literal>EntityManager</literal> to
+ the thread that serves the request, using a
+ <literal>ThreadLocal</literal> variable. This allows easy access (like
+ accessing a static variable) in all code that runs in this thread.
+ Depending on the database transaction demarcation mechanism you chose,
+ you might also keep the transaction context in a
+ <literal>ThreadLocal</literal> variable. The implementation patterns for
+ this are known as <emphasis>ThreadLocal Session</emphasis> and
+ <emphasis>Open Session in View</emphasis> in the Hibernate community.
+ You can easily extend the <literal>HibernateUtil</literal> shown in the
+ Hibernate reference documentation to implement this pattern, you don't
+ need any external software (it's in fact very trivial). Of course, you'd
+ have to find a way to implement an interceptor and set it up in your
+ environment. See the Hibernate website for tips and examples. Once
+ again, remember that your first choice is naturally an EJB3 container -
+ preferably a light and modular one such as JBoss application
+ server.</para>
+ </sect2>
+
+ <sect2 id="transactions-basics-apptx">
+ <title>Long units of work</title>
+
+ <para>The entitymanager-per-request pattern is not the only useful
+ concept you can use to design units of work. Many business processes
+ require a whole series of interactions with the user interleaved with
+ database accesses. In web and enterprise applications it is not
+ acceptable for a database transaction to span a user interaction with
+ possibly long waiting time between requests. Consider the following
+ example:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>The first screen of a dialog opens, the data seen by the user
+ has been loaded in a particular <literal>EntityManager</literal> and
+ resource-local transaction. The user is free to modify the detached
+ objects.</para>
+ </listitem>
+
+ <listitem>
+ <para>The user clicks "Save" after 5 minutes and expects his
+ modifications to be made persistent; he also expects that he was the
+ only person editing this information and that no conflicting
+ modification can occur.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>We call this unit of work, from the point of view of the user, a
+ long running <emphasis>application transaction</emphasis>. There are
+ many ways how you can implement this in your application.</para>
+
+ <para>A first naive implementation might keep the
+ <literal>EntityManager</literal> and database transaction open during
+ user think time, with locks held in the database to prevent concurrent
+ modification, and to guarantee isolation and atomicity. This is of
+ course an anti-pattern, a pessimistic approach, since lock contention
+ would not allow the application to scale with the number of concurrent
+ users.</para>
+
+ <para>Clearly, we have to use several database transactions to implement
+ the application transaction. In this case, maintaining isolation of
+ business processes becomes the partial responsibility of the application
+ tier. A single application transaction usually spans several database
+ transactions. It will be atomic if only one of these database
+ transactions (the last one) stores the updated data, all others simply
+ read data (e.g. in a wizard-style dialog spanning several
+ request/response cycles). This is easier to implement than it might
+ sound, especially if you use EJB3 entity manager and persistence context
+ features:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><emphasis>Automatic Versioning</emphasis> - An entity manager
+ can do automatic optimistic concurrency control for you, it can
+ automatically detect if a concurrent modification occured during
+ user think time (usually by comparing version numbers or timestamps
+ when updating the data in the final resource-local
+ transaction).</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>Detached Entities</emphasis> - If you decide to use
+ the already discussed <emphasis>entity-per-request</emphasis>
+ pattern, all loaded instances will be in detached state during user
+ think time. The entity manager allows you to merge the detached
+ (modified) state and persist the modifications, the pattern is
+ called
+ <emphasis>entitymanager-per-request-with-detached-entities</emphasis>.
+ Automatic versioning is used to isolate concurrent
+ modifications.</para>
+ </listitem>
+
+ <listitem>
+ <para><emphasis>Extended Entity Manager</emphasis> - The Hibernate
+ Entity Manager may be disconnected from the underlying JDBC
+ connection between two client calls and reconnected when a new
+ client request occurs. This pattern is known as
+ <emphasis>entitymanager-per-application-transaction</emphasis> and
+ makes even merging unnecessary. An extend persistence context is
+ responsible to collect and retain any modification (persist, merge,
+ remove) made outside a transaction. The next client call made inside
+ an active transaction (typically the last operation of a user
+ conversation) will execute all queued modifications. Automatic
+ versioning is used to isolate concurrent modifications.</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>Both
+ <emphasis>entitymanager-per-request-with-detached-objects</emphasis> and
+ <emphasis>entitymanager-per-application-transaction</emphasis> have
+ advantages and disadvantages, we discuss them later in this chapter in
+ the context of optimistic concurrency control.</para>
+
+ <para>TODO: This note should probably come later.</para>
+ </sect2>
+
+ <sect2 id="transactions-basics-identity">
+ <title>Considering object identity</title>
+
+ <para>An application may concurrently access the same persistent state
+ in two different persistence contexts. However, an instance of a managed
+ class is never shared between two persistence contexts. Hence there are
+ two different notions of identity:</para>
+
+ <variablelist spacing="compact">
+ <varlistentry>
+ <term>Database Identity</term>
+
+ <listitem>
+ <para>
+ <literal>foo.getId().equals( bar.getId() )</literal>
+ </para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>JVM Identity</term>
+
+ <listitem>
+ <para>
+ <literal>foo==bar</literal>
+ </para>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para>Then for objects attached to a <emphasis>particular</emphasis>
+ persistence context (i.e. in the scope of an
+ <literal>EntityManager</literal>) the two notions are equivalent, and
+ JVM identity for database identity is guaranteed by the Hibernate Entity
+ Manager. However, while the application might concurrently access the
+ "same" (persistent identity) business object in two different
+ persistence contexts, the two instances will actually be "different"
+ (JVM identity). Conflicts are resolved using (automatic versioning) at
+ flush/commit time, using an optimistic approach.</para>
+
+ <para>This approach leaves Hibernate and the database to worry about
+ concurrency; it also provides the best scalability, since guaranteeing
+ identity in single-threaded units of work only doesn't need expensive
+ locking or other means of synchronization. The application never needs
+ to synchronize on any business object, as long as it sticks to a single
+ thread per <literal>EntityManager</literal>. Within a persistence
+ context, the application may safely use <literal>==</literal> to compare
+ entities.</para>
+
+ <para>However, an application that uses <literal>==</literal> outside of
+ a persistence context might see unexpected results. This might occur
+ even in some unexpected places, for example, if you put two detached
+ instances into the same <literal>Set</literal>. Both might have the same
+ database identity (i.e. they represent the same row), but JVM identity
+ is by definition not guaranteed for instances in detached state. The
+ developer has to override the <literal>equals()</literal> and
+ <literal>hashCode()</literal> methods in persistent classes and
+ implement his own notion of object equality. There is one caveat: Never
+ use the database identifier to implement equality, use a business key, a
+ combination of unique, usually immutable, attributes. The database
+ identifier will change if a transient entity is made persistent (see the
+ contract of the <literal>persist()</literal> operation). If the
+ transient instance (usually together with detached instances) is held in
+ a <literal>Set</literal>, changing the hashcode breaks the contract of
+ the <literal>Set</literal>. Attributes for good business keys don't have
+ to be as stable as database primary keys, you only have to guarantee
+ stability as long as the objects are in the same <literal>Set</literal>.
+ See the Hibernate website for a more thorough discussion of this issue.
+ Also note that this is not a Hibernate issue, but simply how Java object
+ identity and equality has to be implemented.</para>
+ </sect2>
+
+ <sect2 id="transactions-basics-issues">
+ <title>Common concurrency control issues</title>
+
+ <para>Never use the anti-patterns
+ <emphasis>entitymanager-per-user-session</emphasis> or
+ <emphasis>entitymanager-per-application</emphasis> (of course, there are
+ rare exceptions to this rule, e.g. entitymanager-per-application might
+ be acceptable in a desktop application, with manual flushing of the
+ persistence context). Note that some of the following issues might also
+ appear with the recommended patterns, make sure you understand the
+ implications before making a design decision:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>An entity manager is not thread-safe. Things which are
+ supposed to work concurrently, like HTTP requests, session beans, or
+ Swing workers, will cause race conditions if an
+ <literal>EntityManager</literal> instance would be shared. If you
+ keep your Hibernate <literal>EntityManager</literal> in your
+ <literal>HttpSession</literal> (discussed later), you should
+ consider synchronizing access to your Http session. Otherwise, a
+ user that clicks reload fast enough may use the same
+ <literal>EntityManager</literal> in two concurrently running
+ threads. You will very likely have provisions for this case already
+ in place, for other non-threadsafe but session-scoped
+ objects.</para>
+ </listitem>
+
+ <listitem>
+ <para>An exception thrown by the Entity Manager means you have to
+ rollback your database transaction and close the
+ <literal>EntityManager</literal> immediately (discussed later in
+ more detail). If your <literal>EntityManager</literal> is bound to
+ the application, you have to stop the application. Rolling back the
+ database transaction doesn't put your business objects back into the
+ state they were at the start of the transaction. This means the
+ database state and the business objects do get out of sync. Usually
+ this is not a problem, because exceptions are not recoverable and
+ you have to start over your unit of work after rollback
+ anyway.</para>
+ </listitem>
+
+ <listitem>
+ <para>The persistence context caches every object that is in managed
+ state (watched and checked for dirty state by Hibernate). This means
+ it grows endlessly until you get an
+ <classname>OutOfMemoryException</classname>, if you keep it open for
+ a long time or simply load too much data. One solution for this is
+ some kind batch processing with regular flushing of the persistence
+ context, but you should consider using a database stored procedure
+ if you need mass data operations. Some solutions for this problem
+ are shown in <xref linkend="batch" />. Keeping a persistence context
+ open for the duration of a user session also means a high
+ probability of stale data, which you have to know about and control
+ appropriately.</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1 id="transactions-demarcation">
+ <title>Database transaction demarcation</title>
+
+ <para>Datatabase (or system) transaction boundaries are always necessary.
+ No communication with the database can occur outside of a database
+ transaction (this seems to confuse many developers who are used to the
+ auto-commit mode). Always use clear transaction boundaries, even for
+ read-only operations. Depending on your isolation level and database
+ capabilities this might not be required but there is no downside if you
+ always demarcate transactions explicitly. You'll have to do operations
+ outside a transaction, though, when you'll need to retain modifications in
+ an <literal>EXTENDED</literal> persistence context.</para>
+
+ <para>An EJB3 application can run in non-managed (i.e. standalone, simple
+ Web- or Swing applications) and managed J2EE environments. In a
+ non-managed environment, an <literal>EntityManagerFactory</literal> is
+ usually responsible for its own database connection pool. The application
+ developer has to manually set transaction boundaries, in other words,
+ begin, commit, or rollback database transactions itself. A managed
+ environment usually provides container-managed transactions, with the
+ transaction assembly defined declaratively through annotations of EJB
+ session beans, for example. Programmatic transaction demarcation is then
+ no longer necessary, even flushing the <literal>EntityManager</literal> is
+ done automatically.</para>
+
+ <para>Usually, ending a unit of work involves four distinct phases:</para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para>commit the (resource-local or JTA) transaction (this
+ automatically flushes the entity manager and persistence
+ context)</para>
+ </listitem>
+
+ <listitem>
+ <para>close the entity manager (if using an application-managed entity
+ manager)</para>
+ </listitem>
+
+ <listitem>
+ <para>handle exceptions</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>We'll now have a closer look at transaction demarcation and
+ exception handling in both managed- and non-managed environments.</para>
+
+ <sect2 id="transactions-demarcation-nonmanaged">
+ <title>Non-managed environment</title>
+
+ <para>If an EJB3 persistence layer runs in a non-managed environment,
+ database connections are usually handled by Hibernate's pooling
+ mechanism behind the scenes. The common entity manager and transaction
+ handling idiom looks like this:</para>
+
+ <programlisting>// Non-managed environment idiom
+EntityManager em = emf.createEntityManager();
+EntityTransaction tx = null;
+try {
+ tx = em.getTransaction();
+ tx.begin();
+
+ // do some work
+ ...
+
+ tx.commit();
+}
+catch (RuntimeException e) {
+ if ( tx != null && tx.isActive() ) tx.rollback();
+ throw e; // or display error message
+}
+finally {
+ em.close();
+}</programlisting>
+
+ <para>You don't have to <literal>flush()</literal> the
+ <literal>EntityManager</literal> explicitly - the call to
+ <literal>commit()</literal> automatically triggers the
+ synchronization.</para>
+
+ <para>A call to <literal>close()</literal> marks the end of an
+ <literal>EntityManager</literal>. The main implication of
+ <literal>close()</literal> is the release of resources - make sure you
+ always close and never outside of guaranteed finally block.</para>
+
+ <para>You will very likely never see this idiom in business code in a
+ normal application; fatal (system) exceptions should always be caught at
+ the "top". In other words, the code that executes entity manager calls
+ (in the persistence layer) and the code that handles
+ <literal>RuntimeException</literal> (and usually can only clean up and
+ exit) are in different layers. This can be a challenge to design
+ yourself and you should use J2EE/EJB container services whenever they
+ are available. Exception handling is discussed later in this
+ chapter.</para>
+
+ <sect3>
+ <title>EntityTransaction</title>
+
+ <para>In a JTA environment, you don't need any extra API to interact
+ with the transaction in your environment. Simply use transaction
+ declaration or the JTA APIs.</para>
+
+ <para>If you are using a <literal>RESOURCE_LOCAL</literal> entity
+ manager, you need to demarcate your transaction boundaries through the
+ <literal>EntityTransaction</literal> API. You can get an
+ <literal>EntityTransaction</literal> through
+ <literal>entityManager.getTransaction()</literal>. This
+ <literal>EntityTransaction</literal> API provides the regular
+ <methodname>begin()</methodname>, <methodname>commit()</methodname>,
+ <methodname>rollback()</methodname> and
+ <methodname>isActive()</methodname> methods. It also provide a way to
+ mark a transaction as rollback only, ie force the transaction to
+ rollback. This is very similar to the JTA operation
+ <methodname>setRollbackOnly()</methodname>. When a
+ <literal>commit()</literal> operation fail and/or if the transaction
+ is marked as <literal>setRollbackOnly()</literal>, the
+ <literal>commit()</literal> method will try to rollback the
+ transaction and raise a
+ <literal>javax.transaction.RollbackException</literal>.</para>
+
+ <para>In a <literal>JTA</literal> entity manager,
+ <literal>entityManager.getTransaction()</literal> calls are not
+ permitted.</para>
+ </sect3>
+ </sect2>
+
+ <sect2 id="transactions-demarcation-jta">
+ <title>Using JTA</title>
+
+ <para>If your persistence layer runs in an application server (e.g.
+ behind EJB3 session beans), every datasource connection obtained
+ internally by the entity manager will automatically be part of the
+ global JTA transaction. Hibernate offers two strategies for this
+ integration.</para>
+
+ <para>If you use bean-managed transactions (BMT), the code will look
+ like this:</para>
+
+ <programlisting>// BMT idiom
+ at Resource public UserTransaction utx;
+ at Resource public EntityManagerFactory factory;
+
+public void doBusiness() {
+ EntityManager em = factory.createEntityManager();
+ try {
+
+ // do some work
+ ...
+
+ utx.commit();
+}
+catch (RuntimeException e) {
+ if (utx != null) utx.rollback();
+ throw e; // or display error message
+}
+finally {
+ em.close();
+}</programlisting>
+
+ <para>With Container Managed Transactions (CMT) in an EJB3 container,
+ transaction demarcation is done in session bean annotations or
+ deployment descriptors, not programatically. The
+ <literal>EntityManager</literal> will automatically be flushed on
+ transaction completion (and if you have injected or lookup the
+ <literal>EntityManager</literal>, it will be also closed automatically).
+ If an exception occurs during the <literal>EntityManager</literal> use,
+ transaction rollback occurs automatically if you don't catch the
+ exception. Since <literal>EntityManager</literal> exceptions are
+ <literal>RuntimeException</literal>s they will rollback the transaction
+ as per the EJB specification (system exception vs. application
+ exception).</para>
+
+ <para>It is important to let Hibernate EntityManager define the
+ <literal>hibernate.transaction.factory_class</literal> (ie not
+ overriding this value). Remember to also set
+ <literal>org.hibernate.transaction.manager_lookup_class</literal>.</para>
+
+ <para>If you work in a CMT environment, you might also want to use the
+ same entity manager in different parts of your code. Typically, in a
+ non-managed environment you would use a <literal>ThreadLocal</literal>
+ variable to hold the entity manager, but a single EJB request might
+ execute in different threads (e.g. session bean calling another session
+ bean). The EJB3 container takes care of the persistence context
+ propagation for you. Either using injection or lookup, the EJB3
+ container will return an entity manager with the same persistence
+ context bound to the JTA context if any, or create a new one and bind it
+ (see <xref linkend="architecture-ejb-persistctxpropagation" /> .)</para>
+
+ <para>Our entity manager/transaction management idiom for CMT and EJB3
+ container-use is reduced to this:</para>
+
+ <programlisting>//CMT idiom through injection
+ at PersistenceContext(name="sample") EntityManager em;</programlisting>
+
+ <para>In other words, all you have to do in a managed environment is to
+ inject the <literal>EntityManager</literal>, do your data access work,
+ and leave the rest to the container. Transaction boundaries are set
+ declaratively in the annotations or deployment descriptors of your
+ session beans. The lifecycle of the entity manager and persistence
+ context is completely managed by the container.</para>
+
+ <para>TODO: The following paragraph is very confusing, especially the
+ beginning...</para>
+
+ <para>When using particular Hibernate native APIs, one caveat has to be
+ remembered: <literal>after_statement</literal> connection release mode.
+ Due to a silly limitation of the JTA spec, it is not possible for
+ Hibernate to automatically clean up any unclosed
+ <literal>ScrollableResults</literal> or <literal>Iterator</literal>
+ instances returned by <literal>scroll()</literal> or
+ <literal>iterate()</literal>. You <emphasis>must</emphasis> release the
+ underlying database cursor by calling
+ <literal>ScrollableResults.close()</literal> or
+ <literal>Hibernate.close(Iterator)</literal> explicity from a
+ <literal>finally</literal> block. (Of course, most applications can
+ easily avoid using <literal>scroll()</literal> or
+ <literal>iterate()</literal> at all from the CMT code.)</para>
+ </sect2>
+
+ <sect2 id="transactions-demarcation-exceptions">
+ <title>Exception handling</title>
+
+ <para>If the <literal>EntityManager</literal> throws an exception
+ (including any <literal>SQLException</literal>), you should immediately
+ rollback the database transaction, call
+ <literal>EntityManager.close()</literal> (if
+ <methodname>createEntityManager()</methodname> has been called) and
+ discard the <literal>EntityManager</literal> instance. Certain methods
+ of <literal>EntityManager</literal> will <emphasis>not</emphasis> leave
+ the persistence context in a consistent state. No exception thrown by an
+ entity manager can be treated as recoverable. Ensure that the
+ <literal>EntityManager</literal> will be closed by calling
+ <literal>close()</literal> in a <literal>finally</literal> block. Note
+ that a container managed entity manager will do that for you. You just
+ have to let the RuntimeException propagate up to the container.</para>
+
+ <para>The Hibernate entity manager generally raises exceptions which
+ encapsulate the Hibernate core exception. Common exceptions raised by
+ the <literal>EntityManager</literal> API are</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>IllegalArgumentException: something wrong happen</para>
+ </listitem>
+
+ <listitem>
+ <para>EntityNotFoundException: an entity was expected but none match
+ the requirement</para>
+ </listitem>
+
+ <listitem>
+ <para>TransactionRequiredException: this operation has to be in a
+ transaction</para>
+ </listitem>
+
+ <listitem>
+ <para>IllegalStateException: the entity manager is used in a wrong
+ way</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The <literal>HibernateException</literal>, which wraps most of the
+ errors that can occur in a Hibernate persistence layer, is an unchecked
+ exception. Note that Hibernate might also throw other unchecked
+ exceptions which are not a <literal>HibernateException</literal>. These
+ are, again, not recoverable and appropriate action should be
+ taken.</para>
+
+ <para>Hibernate wraps <literal>SQLException</literal>s thrown while
+ interacting with the database in a <literal>JDBCException</literal>. In
+ fact, Hibernate will attempt to convert the eexception into a more
+ meningful subclass of <literal>JDBCException</literal>. The underlying
+ <literal>SQLException</literal> is always available via
+ <literal>JDBCException.getCause()</literal>. Hibernate converts the
+ <literal>SQLException</literal> into an appropriate
+ <literal>JDBCException</literal> subclass using the
+ <literal>SQLExceptionConverter</literal> attached to the
+ <literal>SessionFactory</literal>. By default, the
+ <literal>SQLExceptionConverter</literal> is defined by the configured
+ dialect; however, it is also possible to plug in a custom implementation
+ (see the javadocs for the
+ <literal>SQLExceptionConverterFactory</literal> class for details). The
+ standard <literal>JDBCException</literal> subtypes are:</para>
+
+ <itemizedlist spacing="compact">
+ <listitem>
+ <para><literal>JDBCConnectionException</literal> - indicates an
+ error with the underlying JDBC communication.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>SQLGrammarException</literal> - indicates a grammar
+ or syntax problem with the issued SQL.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>ConstraintViolationException</literal> - indicates
+ some form of integrity constraint violation.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>LockAcquisitionException</literal> - indicates an
+ error acquiring a lock level necessary to perform the requested
+ operation.</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>GenericJDBCException</literal> - a generic exception
+ which did not fall into any of the other categories.</para>
+ </listitem>
+ </itemizedlist>
+ </sect2>
+ </sect1>
+
+ <sect1>
+ <title>EXTENDED Persistence Context</title>
+
+ <para>All application managed entity manager and container managed
+ persistence contexts defined as such are <literal>EXTENDED</literal>. This
+ means that the persistence context type goes beyond the transaction life
+ cycle. We should then understand what happens to operations made outside
+ the scope of a transaction.</para>
+
+ <para>In an <literal>EXTENDED</literal> persistence context, all read only
+ operations of the entity manager can be executed outside a transaction
+ (<literal>find()</literal>, <literal>getReference()</literal>,
+ <literal>refresh()</literal>, and read queries). Some modifications
+ operations can be executed outside a transaction, but they are queued
+ until the persistence context join a transaction: this is the case of
+ <literal>persist()</literal>,
+ <literal><literal>merge()</literal></literal>,
+ <literal>remove()</literal>. Some operations cannot be called outside a
+ transaction: <literal>flush()</literal>, <literal>lock()</literal>, and
+ update/delete queries.</para>
+
+ <sect2>
+ <title>Container Managed Entity Manager</title>
+
+ <para>When using an EXTENDED persistence context with a container
+ managed entity manager, the lifecycle of the persistence context is
+ binded to the lifecycle of the Stateful Session Bean. Plus if the entity
+ manager is created outside a transaction, modifications operations
+ (persist, merge, remove) are queued in the persistence context and not
+ executed to the database.</para>
+
+ <para>When a method of the stateful session bean involved or starting a
+ transaction is later called, the entity manager join the transaction.
+ All queued operation will then be executed to synchronize the
+ persistence context.</para>
+
+ <para>This is perfect to implement the
+ <literal>entitymanager-per-conversation</literal> pattern. A stateful
+ session bean represents the conversation implementation. All
+ intermediate conversation work will be processed in methods not
+ involving transaction. The end of the conversation will be processed
+ inside a <literal>JTA</literal> transaction. Hence all queued operations
+ will be executed to the database and commited. If you are interested in
+ the notion of conversation inside your application, have a look at JBoss
+ Seam. Jboss Seam emphasizes the concept of conversation and entity
+ manager lifecycle and bind EJB3 and JSF together.</para>
+ </sect2>
+
+ <sect2>
+ <title>Application Managed Entity Manager</title>
+
+ <para>Application-managed entity manager are always
+ <literal>EXTENDED</literal>. When you create an entity manager inside a
+ transaction, the entity manager automatically join the current
+ transaction. If the entity manager is created outside a transaction, the
+ entity manager will queue the modification operations. When</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><methodname>entityManager.joinTransaction()</methodname> is
+ called when a JTA transaction is active for a <literal>JTA</literal>
+ entity manager</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>entityManager.getTransaction().begin()</literal> is
+ called for a <literal>RESOURCE_LOCAL</literal> entity manager</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>the entity manager join the transaction and all the queued
+ operations will then be executed to synchronize the persistence
+ context.</para>
+
+ <para>It is not legal to call
+ <methodname>entityManager.joinTransaction()</methodname> if no JTA
+ transaction is involved.</para>
+ </sect2>
+ </sect1>
+
+ <sect1 id="transactions-optimistic">
+ <title>Optimistic concurrency control</title>
+
+ <para>The only approach that is consistent with high concurrency and high
+ scalability is optimistic concurrency control with versioning. Version
+ checking uses version numbers, or timestamps, to detect conflicting
+ updates (and to prevent lost updates). Hibernate provides for three
+ possible approaches to writing application code that uses optimistic
+ concurrency. The use cases we show are in the context of long application
+ transactions but version checking also has the benefit of preventing lost
+ updates in single database transactions.</para>
+
+ <sect2 id="transactions-optimistic-manual">
+ <title>Application version checking</title>
+
+ <para>In an implementation without much help from the persistence
+ mechanism, each interaction with the database occurs in a new
+ <literal>EntityManager</literal> and the developer is responsible for
+ reloading all persistent instances from the database before manipulating
+ them. This approach forces the application to carry out its own version
+ checking to ensure application transaction isolation. This approach is
+ the least efficient in terms of database access. It is the approach most
+ similar to EJB2 entities:</para>
+
+ <programlisting>// foo is an instance loaded by a previous entity manager
+em = factory.createEntityManager();
+EntityTransaction t = em.getTransaction();
+t.begin();
+int oldVersion = foo.getVersion();
+Foo dbFoo = em.find( foo.getClass(), foo.getKey() ); // load the current state
+if ( dbFoo.getVersion()!=foo.getVersion ) throw new StaleObjectStateException();
+dbFoo.setProperty("bar");
+t.commit();
+em.close();</programlisting>
+
+ <para>The <literal>version</literal> property is mapped using
+ <literal>@Version</literal>, and the entity manager will automatically
+ increment it during flush if the entity is dirty.</para>
+
+ <para>Of course, if you are operating in a low-data-concurrency
+ environment and don't require version checking, you may use this
+ approach and just skip the version check. In that case, <emphasis>last
+ commit wins</emphasis> will be the default strategy for your long
+ application transactions. Keep in mind that this might confuse the users
+ of the application, as they might experience lost updates without error
+ messages or a chance to merge conflicting changes.</para>
+
+ <para>Clearly, manual version checking is only feasible in very trivial
+ circumstances and not practical for most applications. Often not only
+ single instances, but complete graphs of modified ojects have to be
+ checked. Hibernate offers automatic version checking with either
+ detached instances or an extended entity manager and persistence context
+ as the design paradigm.</para>
+ </sect2>
+
+ <sect2 id="transactions-optimistic-longsession">
+ <title>Extended entity manager and automatic versioning</title>
+
+ <para>A single persistence context is used for the whole application
+ transaction. The entity manager checks instance versions at flush time,
+ throwing an exception if concurrent modification is detected. It's up to
+ the developer to catch and handle this exception (common options are the
+ opportunity for the user to merge his changes or to restart the business
+ process with non-stale data).</para>
+
+ <para>In an <literal>EXTENDED</literal> persistence context, all
+ operations made outside an active transaction are queued. The
+ <literal>EXTENDED</literal> persistence context is flushed when executed
+ in an active transaction (at worse at commit time).</para>
+
+ <para>The <literal>Entity Manager</literal> is disconnected from any
+ underlying JDBC connection when waiting for user interaction. In an
+ application-managed extended entity manager, this occurs automatically
+ at transaction completion. In a stateful session bean holding a
+ container-managed extended entity manager (i.e. a SFSB annotated with
+ <literal>@PersistenceContext(EXTENDED)</literal>), this occurs
+ transparently as well. This approach is the most efficient in terms of
+ database access. The application need not concern itself with version
+ checking or with merging detached instances, nor does it have to reload
+ instances in every database transaction. For those who might be
+ concerned by the number of connections opened and closed, remember that
+ the connection provider should be a connection pool, so there is no
+ performance impact. The following examples show the idiom in a
+ non-managed environment:</para>
+
+ <programlisting>// foo is an instance loaded earlier by the extended entity manager
+em.getTransaction.begin(); // new connection to data store is obtained and tx started
+foo.setProperty("bar");
+em.getTransaction().commit(); // End tx, flush and check version, disconnect</programlisting>
+
+ <para>The <literal>foo</literal> object still knows which
+ <literal>persistence context</literal> it was loaded in. With
+ <literal>getTransaction.begin();</literal> the entity manager obtains a
+ new connection and resumes the persistence context. The method
+ <literal>getTransaction().commit()</literal> will not only flush and
+ check versions, but also disconnects the entity manager from the JDBC
+ connection and return the connection to the pool.</para>
+
+ <para>This pattern is problematic if the persistence context is too big
+ to be stored during user think time, and if you don't know where to
+ store it. E.g. the <literal>HttpSession</literal> should be kept as
+ small as possible. As the persistence context is also the (mandatory)
+ first-level cache and contains all loaded objects, we can probably use
+ this strategy only for a few request/response cycles. This is indeed
+ recommended, as the persistence context will soon also have stale
+ data.</para>
+
+ <para>It is up to you where you store the extended entity manager during
+ requests, inside an EJB3 container you simply use a stateful session
+ bean as described above. Don't transfer it to the web layer (or even
+ serialize it to a separate tier) to store it in the
+ <literal>HttpSession</literal>. In a non-managed, two-tiered environment
+ the <literal>HttpSession</literal> might indeed be the right place to
+ store it.</para>
+ </sect2>
+
+ <sect2 id="transactions-optimistic-detached">
+ <title>Detached objects and automatic versioning</title>
+
+ <para>With this paradigm, each interaction with the data store occurs in
+ a new persistence context. However, the same persistent instances are
+ reused for each interaction with the database. The application
+ manipulates the state of detached instances originally loaded in another
+ persistence context and then merges the changes using
+ <literal>EntityManager.merge()</literal>:</para>
+
+ <programlisting>// foo is an instance loaded by a non-extended entity manager
+foo.setProperty("bar");
+entityManager = factory.createEntityManager();
+entityManager.getTransaction().begin();
+managedFoo = session.merge(foo); // discard foo and from now on use managedFoo
+entityManager.getTransaction().commit();
+entityManager.close();</programlisting>
+
+ <para>Again, the entity manager will check instance versions during
+ flush, throwing an exception if conflicting updates occured.</para>
+ </sect2>
+ </sect1>
+</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/styles (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/styles)
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/styles/fopdf.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/styles/fopdf.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,519 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL FO configuration file for the Hibernate
- Reference Documentation. It defines a custom titlepage and
- the parameters for the A4 sized PDF printable output.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
-
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- exclude-result-prefixes="#default">
-
- <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
-
- <!--###################################################
- Custom Title Page
- ################################################### -->
-
- <xsl:template name="book.titlepage.recto">
- <fo:block>
- <fo:table table-layout="fixed" width="175mm">
- <fo:table-column column-width="175mm"/>
- <fo:table-body>
- <fo:table-row>
- <fo:table-cell text-align="center">
- <fo:block>
- <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/title"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="18pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/subtitle"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
- Version:
- <xsl:value-of select="bookinfo/releaseinfo"/>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </fo:block>
- </xsl:template>
-
- <!-- Prevent blank pages in output -->
- <xsl:template name="book.titlepage.before.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.separator">
- </xsl:template>
-
- <!--###################################################
- Header
- ################################################### -->
-
- <!-- More space in the center header for long text -->
- <xsl:attribute-set name="header.content.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$body.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="margin-left">-5em</xsl:attribute>
- <xsl:attribute name="margin-right">-5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Custom Footer
- ################################################### -->
-
- <!-- This footer prints the Hibernate version number on the left side -->
- <xsl:template name="footer.content">
- <xsl:param name="pageclass" select="''"/>
- <xsl:param name="sequence" select="''"/>
- <xsl:param name="position" select="''"/>
- <xsl:param name="gentext-key" select="''"/>
-
- <xsl:variable name="Version">
- <xsl:choose>
- <xsl:when test="//releaseinfo">
- <xsl:text>Hibernate </xsl:text>
- <xsl:value-of select="//releaseinfo"/>
- </xsl:when>
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
-
- <xsl:choose>
- <xsl:when test="$sequence='blank'">
- <xsl:choose>
- <xsl:when test="$double.sided != 0 and $position = 'left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position = 'center'">
- <!-- nop -->
- </xsl:when>
-
- <xsl:otherwise>
- <fo:page-number/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
-
- <xsl:when test="$pageclass='titlepage'">
- <!-- nop: other titlepage sequences have no footer -->
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <!--###################################################
- Custom Toc Line
- ################################################### -->
-
- <!-- Improve the TOC. -->
- <xsl:template name="toc.line">
- <xsl:variable name="id">
- <xsl:call-template name="object.id"/>
- </xsl:variable>
-
- <xsl:variable name="label">
- <xsl:apply-templates select="." mode="label.markup"/>
- </xsl:variable>
-
- <fo:block text-align-last="justify"
- end-indent="{$toc.indent.width}pt"
- last-line-end-indent="-{$toc.indent.width}pt">
- <fo:inline keep-with-next.within-line="always">
- <fo:basic-link internal-destination="{$id}">
-
- <!-- Chapter titles should be bold. -->
- <xsl:choose>
- <xsl:when test="local-name(.) = 'chapter'">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="$label != ''">
- <xsl:copy-of select="$label"/>
- <xsl:value-of select="$autotoc.label.separator"/>
- </xsl:if>
- <xsl:apply-templates select="." mode="titleabbrev.markup"/>
- </fo:basic-link>
- </fo:inline>
- <fo:inline keep-together.within-line="always">
- <xsl:text> </xsl:text>
- <fo:leader leader-pattern="dots"
- leader-pattern-width="3pt"
- leader-alignment="reference-area"
- keep-with-next.within-line="always"/>
- <xsl:text> </xsl:text>
- <fo:basic-link internal-destination="{$id}">
- <fo:page-number-citation ref-id="{$id}"/>
- </fo:basic-link>
- </fo:inline>
- </fo:block>
- </xsl:template>
-
- <!--###################################################
- Extensions
- ################################################### -->
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <!-- FOP provide only PDF Bookmarks at the moment -->
- <xsl:param name="fop.extensions">1</xsl:param>
-
- <!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
- <!-- Dot and Whitespace as separator in TOC between Label and Title-->
- <xsl:param name="autotoc.label.separator" select="'. '"/>
-
-
- <!--###################################################
- Paper & Page Size
- ################################################### -->
-
- <!-- Paper type, no headers on blank pages, no double sided printing -->
- <xsl:param name="paper.type" select="'A4'"/>
- <xsl:param name="double.sided">0</xsl:param>
- <xsl:param name="headers.on.blank.pages">0</xsl:param>
- <xsl:param name="footers.on.blank.pages">0</xsl:param>
-
- <!-- Space between paper border and content (chaotic stuff, don't touch) -->
- <xsl:param name="page.margin.top">5mm</xsl:param>
- <xsl:param name="region.before.extent">10mm</xsl:param>
- <xsl:param name="body.margin.top">10mm</xsl:param>
-
- <xsl:param name="body.margin.bottom">15mm</xsl:param>
- <xsl:param name="region.after.extent">10mm</xsl:param>
- <xsl:param name="page.margin.bottom">0mm</xsl:param>
-
- <xsl:param name="page.margin.outer">18mm</xsl:param>
- <xsl:param name="page.margin.inner">18mm</xsl:param>
-
- <!-- No intendation of Titles -->
- <xsl:param name="title.margin.left">0pc</xsl:param>
-
- <!--###################################################
- Fonts & Styles
- ################################################### -->
-
- <!-- Default Font size -->
- <xsl:param name="body.font.master">11</xsl:param>
-
- <!-- Line height in body text -->
- <xsl:param name="line-height">1.4</xsl:param>
-
- <!-- Monospaced fonts are smaller than regular text -->
- <xsl:attribute-set name="monospace.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$monospace.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="font-size">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Tables
- ################################################### -->
-
- <!-- The table width should be adapted to the paper size -->
- <xsl:param name="default.table.width">17.4cm</xsl:param>
-
- <!-- Some padding inside tables -->
- <xsl:attribute-set name="table.cell.padding">
- <xsl:attribute name="padding-left">4pt</xsl:attribute>
- <xsl:attribute name="padding-right">4pt</xsl:attribute>
- <xsl:attribute name="padding-top">4pt</xsl:attribute>
- <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Only hairlines as frame and cell borders in tables -->
- <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
- <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
-
- <!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
- <!-- Label only Sections up to level 2 -->
- <xsl:param name="local.l10n.xml" select="document('')"/>
- <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
- <l:l10n language="en">
- <l:context name="title-numbered">
- <l:template name="sect3" text="%t"/>
- <l:template name="sect4" text="%t"/>
- <l:template name="sect5" text="%t"/>
- </l:context>
- <l:context name="section-xref-numbered">
- <l:template name="sect3" text="the section called %t"/>
- <l:template name="sect4" text="the section called %t"/>
- <l:template name="sect5" text="the section called %t"/>
- </l:context>
- </l:l10n>
- </l:i18n>
-
- <!--###################################################
- Titles
- ################################################### -->
-
- <!-- Chapter title size -->
- <xsl:attribute-set name="chapter.titlepage.recto.style">
- <xsl:attribute name="text-align">left</xsl:attribute>
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.8"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
- Let's remove it, so this sucker can use our attribute-set only... -->
- <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
- <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xsl:use-attribute-sets="chapter.titlepage.recto.style">
- <xsl:call-template name="component.title">
- <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
- </xsl:call-template>
- </fo:block>
- </xsl:template>
-
- <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
- <xsl:attribute-set name="section.title.level1.properties">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.5"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level2.properties">
- <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.25"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level3.properties">
- <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.0"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Titles of formal objects (tables, examples, ...) -->
- <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="hyphenate">false</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Programlistings
- ################################################### -->
-
- <!-- Verbatim text formatting (programlistings) -->
- <xsl:attribute-set name="verbatim.properties">
- <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- <xsl:attribute name="border-color">#444444</xsl:attribute>
- <xsl:attribute name="border-style">solid</xsl:attribute>
- <xsl:attribute name="border-width">0.1pt</xsl:attribute>
- <xsl:attribute name="padding-top">0.5em</xsl:attribute>
- <xsl:attribute name="padding-left">0.5em</xsl:attribute>
- <xsl:attribute name="padding-right">0.5em</xsl:attribute>
- <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
- <xsl:attribute name="margin-left">0.5em</xsl:attribute>
- <xsl:attribute name="margin-right">0.5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Shade (background) programlistings -->
- <xsl:param name="shade.verbatim">1</xsl:param>
- <xsl:attribute-set name="shade.verbatim.style">
- <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Callouts
- ################################################### -->
-
- <!-- We want to use callouts... -->
- <xsl:param name="callout.extensions">1</xsl:param>
-
- <!-- Place callout bullets at this column in programmlisting.-->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
- <!--
- No, don't use crappy graphics for the callout bullets. This setting
- enables some weird Unicode rendering for some fancy bullet points
- in callouts. By default, this can only count to 10 and produces
- strange results if you ever have more than 10 callouts for one
- programlisting. We will fix that next.
- -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!--
- Again, fun with DocBook XSL: The callout bullets are rendered in
- two places: In the programlisting itself and in the list below
- the listing, with the actual callout text. The rendering in the
- programlisting is some XSL transformer extension (e.g. a Saxon
- extension), so we can't change that without messing with the
- extensions. We only can turn it off by setting this limit to
- zero, then, a simple bracket style like "(3)" and "(4)" will
- be used in the programlisting.
- -->
- <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
-
- <!--
- The callout bullets in the actual callout list will be rendered
- with an XSL FO template. The default template is broken: limited to 10
- nice looking Unicode bullet points and then it doesn't print anything,
- the fallback doesn't work. We implement our own template, which is not
- as complicated, more ugly, but works. As always, function is more
- important than form.
- -->
- <xsl:template name="callout-bug">
- <xsl:param name="conum" select='1'/>
- <fo:inline
- color="black"
- padding-top="0.1em"
- padding-bottom="0.1em"
- padding-start="0.2em"
- padding-end="0.2em"
- baseline-shift="0.1em"
- font-family="{$monospace.font.family}"
- font-weight="bold"
- font-size="75%">
- <xsl:text>(</xsl:text>
- <xsl:value-of select="$conum"/>
- <xsl:text>)</xsl:text>
- </fo:inline>
-
- </xsl:template>
-
- <!--###################################################
- Misc
- ################################################### -->
-
- <!-- Correct placement of titles for figures and examples. -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
- <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
- <xsl:param name="variablelist.as.blocks">1</xsl:param>
-
- <!-- The horrible list spacing problems, this is much better. -->
- <xsl:attribute-set name="list.block.spacing">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Newer DocBook XSL apparently thinks that some sections are by
- default "draft" status, and this idiotic thing is by default
- also set to "maybe", so it spits out a lot of errors with the
- latest FOP as the XSL/FO styles have references to some draft
- watermarks, which you actually don't want in the first place.
- Turn this crap off. If you have to work with the "status"
- attribute, don't.
- -->
- <xsl:param name="draft.mode" select="'no'"/>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/styles/fopdf.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/styles/fopdf.xsl)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/styles/fopdf.xsl (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,519 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL FO configuration file for the Hibernate
+ Reference Documentation. It defines a custom titlepage and
+ the parameters for the A4 sized PDF printable output.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ exclude-result-prefixes="#default">
+
+ <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
+
+ <!--###################################################
+ Custom Title Page
+ ################################################### -->
+
+ <xsl:template name="book.titlepage.recto">
+ <fo:block>
+ <fo:table table-layout="fixed" width="175mm">
+ <fo:table-column column-width="175mm"/>
+ <fo:table-body>
+ <fo:table-row>
+ <fo:table-cell text-align="center">
+ <fo:block>
+ <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/title"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="18pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/subtitle"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
+ Version:
+ <xsl:value-of select="bookinfo/releaseinfo"/>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Prevent blank pages in output -->
+ <xsl:template name="book.titlepage.before.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.separator">
+ </xsl:template>
+
+ <!--###################################################
+ Header
+ ################################################### -->
+
+ <!-- More space in the center header for long text -->
+ <xsl:attribute-set name="header.content.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-left">-5em</xsl:attribute>
+ <xsl:attribute name="margin-right">-5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Custom Footer
+ ################################################### -->
+
+ <!-- This footer prints the Hibernate version number on the left side -->
+ <xsl:template name="footer.content">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="position" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+ <xsl:variable name="Version">
+ <xsl:choose>
+ <xsl:when test="//releaseinfo">
+ <xsl:text>Hibernate </xsl:text>
+ <xsl:value-of select="//releaseinfo"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$sequence='blank'">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0 and $position = 'left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position = 'center'">
+ <!-- nop -->
+ </xsl:when>
+
+ <xsl:otherwise>
+ <fo:page-number/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$pageclass='titlepage'">
+ <!-- nop: other titlepage sequences have no footer -->
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!--###################################################
+ Custom Toc Line
+ ################################################### -->
+
+ <!-- Improve the TOC. -->
+ <xsl:template name="toc.line">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+
+ <fo:block text-align-last="justify"
+ end-indent="{$toc.indent.width}pt"
+ last-line-end-indent="-{$toc.indent.width}pt">
+ <fo:inline keep-with-next.within-line="always">
+ <fo:basic-link internal-destination="{$id}">
+
+ <!-- Chapter titles should be bold. -->
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'chapter'">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$label != ''">
+ <xsl:copy-of select="$label"/>
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </fo:basic-link>
+ </fo:inline>
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="dots"
+ leader-pattern-width="3pt"
+ leader-alignment="reference-area"
+ keep-with-next.within-line="always"/>
+ <xsl:text> </xsl:text>
+ <fo:basic-link internal-destination="{$id}">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ </fo:inline>
+ </fo:block>
+ </xsl:template>
+
+ <!--###################################################
+ Extensions
+ ################################################### -->
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <!-- FOP provide only PDF Bookmarks at the moment -->
+ <xsl:param name="fop.extensions">1</xsl:param>
+
+ <!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+ <!-- Dot and Whitespace as separator in TOC between Label and Title-->
+ <xsl:param name="autotoc.label.separator" select="'. '"/>
+
+
+ <!--###################################################
+ Paper & Page Size
+ ################################################### -->
+
+ <!-- Paper type, no headers on blank pages, no double sided printing -->
+ <xsl:param name="paper.type" select="'A4'"/>
+ <xsl:param name="double.sided">0</xsl:param>
+ <xsl:param name="headers.on.blank.pages">0</xsl:param>
+ <xsl:param name="footers.on.blank.pages">0</xsl:param>
+
+ <!-- Space between paper border and content (chaotic stuff, don't touch) -->
+ <xsl:param name="page.margin.top">5mm</xsl:param>
+ <xsl:param name="region.before.extent">10mm</xsl:param>
+ <xsl:param name="body.margin.top">10mm</xsl:param>
+
+ <xsl:param name="body.margin.bottom">15mm</xsl:param>
+ <xsl:param name="region.after.extent">10mm</xsl:param>
+ <xsl:param name="page.margin.bottom">0mm</xsl:param>
+
+ <xsl:param name="page.margin.outer">18mm</xsl:param>
+ <xsl:param name="page.margin.inner">18mm</xsl:param>
+
+ <!-- No intendation of Titles -->
+ <xsl:param name="title.margin.left">0pc</xsl:param>
+
+ <!--###################################################
+ Fonts & Styles
+ ################################################### -->
+
+ <!-- Default Font size -->
+ <xsl:param name="body.font.master">11</xsl:param>
+
+ <!-- Line height in body text -->
+ <xsl:param name="line-height">1.4</xsl:param>
+
+ <!-- Monospaced fonts are smaller than regular text -->
+ <xsl:attribute-set name="monospace.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$monospace.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Tables
+ ################################################### -->
+
+ <!-- The table width should be adapted to the paper size -->
+ <xsl:param name="default.table.width">17.4cm</xsl:param>
+
+ <!-- Some padding inside tables -->
+ <xsl:attribute-set name="table.cell.padding">
+ <xsl:attribute name="padding-left">4pt</xsl:attribute>
+ <xsl:attribute name="padding-right">4pt</xsl:attribute>
+ <xsl:attribute name="padding-top">4pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Only hairlines as frame and cell borders in tables -->
+ <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
+ <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
+
+ <!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+ <!-- Label only Sections up to level 2 -->
+ <xsl:param name="local.l10n.xml" select="document('')"/>
+ <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+ <l:l10n language="en">
+ <l:context name="title-numbered">
+ <l:template name="sect3" text="%t"/>
+ <l:template name="sect4" text="%t"/>
+ <l:template name="sect5" text="%t"/>
+ </l:context>
+ <l:context name="section-xref-numbered">
+ <l:template name="sect3" text="the section called %t"/>
+ <l:template name="sect4" text="the section called %t"/>
+ <l:template name="sect5" text="the section called %t"/>
+ </l:context>
+ </l:l10n>
+ </l:i18n>
+
+ <!--###################################################
+ Titles
+ ################################################### -->
+
+ <!-- Chapter title size -->
+ <xsl:attribute-set name="chapter.titlepage.recto.style">
+ <xsl:attribute name="text-align">left</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.8"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
+ Let's remove it, so this sucker can use our attribute-set only... -->
+ <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xsl:use-attribute-sets="chapter.titlepage.recto.style">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
+ <xsl:attribute-set name="section.title.level1.properties">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.5"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level2.properties">
+ <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.25"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level3.properties">
+ <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.0"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Titles of formal objects (tables, examples, ...) -->
+ <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Programlistings
+ ################################################### -->
+
+ <!-- Verbatim text formatting (programlistings) -->
+ <xsl:attribute-set name="verbatim.properties">
+ <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ <xsl:attribute name="border-color">#444444</xsl:attribute>
+ <xsl:attribute name="border-style">solid</xsl:attribute>
+ <xsl:attribute name="border-width">0.1pt</xsl:attribute>
+ <xsl:attribute name="padding-top">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-left">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-right">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-left">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-right">0.5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Shade (background) programlistings -->
+ <xsl:param name="shade.verbatim">1</xsl:param>
+ <xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- We want to use callouts... -->
+ <xsl:param name="callout.extensions">1</xsl:param>
+
+ <!-- Place callout bullets at this column in programmlisting.-->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+ <!--
+ No, don't use crappy graphics for the callout bullets. This setting
+ enables some weird Unicode rendering for some fancy bullet points
+ in callouts. By default, this can only count to 10 and produces
+ strange results if you ever have more than 10 callouts for one
+ programlisting. We will fix that next.
+ -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!--
+ Again, fun with DocBook XSL: The callout bullets are rendered in
+ two places: In the programlisting itself and in the list below
+ the listing, with the actual callout text. The rendering in the
+ programlisting is some XSL transformer extension (e.g. a Saxon
+ extension), so we can't change that without messing with the
+ extensions. We only can turn it off by setting this limit to
+ zero, then, a simple bracket style like "(3)" and "(4)" will
+ be used in the programlisting.
+ -->
+ <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
+
+ <!--
+ The callout bullets in the actual callout list will be rendered
+ with an XSL FO template. The default template is broken: limited to 10
+ nice looking Unicode bullet points and then it doesn't print anything,
+ the fallback doesn't work. We implement our own template, which is not
+ as complicated, more ugly, but works. As always, function is more
+ important than form.
+ -->
+ <xsl:template name="callout-bug">
+ <xsl:param name="conum" select='1'/>
+ <fo:inline
+ color="black"
+ padding-top="0.1em"
+ padding-bottom="0.1em"
+ padding-start="0.2em"
+ padding-end="0.2em"
+ baseline-shift="0.1em"
+ font-family="{$monospace.font.family}"
+ font-weight="bold"
+ font-size="75%">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </fo:inline>
+
+ </xsl:template>
+
+ <!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Correct placement of titles for figures and examples. -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+ <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
+ <xsl:param name="variablelist.as.blocks">1</xsl:param>
+
+ <!-- The horrible list spacing problems, this is much better. -->
+ <xsl:attribute-set name="list.block.spacing">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Newer DocBook XSL apparently thinks that some sections are by
+ default "draft" status, and this idiotic thing is by default
+ also set to "maybe", so it spits out a lot of errors with the
+ latest FOP as the XSL/FO styles have references to some draft
+ watermarks, which you actually don't want in the first place.
+ Turn this crap off. If you have to work with the "status"
+ attribute, don't.
+ -->
+ <xsl:param name="draft.mode" select="'no'"/>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.css
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/styles/html.css 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,97 +0,0 @@
-A {
- color: #003399;
-}
-
-A:active {
- color: #003399;
-}
-
-A:visited {
- color: #888888;
-}
-
-P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
- color: #000000;
-}
-
-TD, TH, SPAN {
- color: #000000;
-}
-
-BLOCKQUOTE {
- margin-right: 0px;
-}
-
-
-H1, H2, H3, H4, H5, H6 {
- color: #000000;
- font-weight:500;
- margin-top:10px;
- padding-top:15px;
-}
-
-TABLE {
- border-collapse: collapse;
- border-spacing:0;
- border: 1px thin black;
- empty-cells: hide;
-}
-
-TD {
- padding: 4pt;
-}
-
-H1 { font-size: 150%; }
-H2 { font-size: 140%; }
-H3 { font-size: 110%; font-weight: bold; }
-H4 { font-size: 110%; font-weight: bold;}
-H5 { font-size: 100%; font-style: italic; }
-H6 { font-size: 100%; font-style: italic; }
-
-TT {
-font-size: 90%;
- font-family: "Courier New", Courier, monospace;
- color: #000000;
-}
-
-PRE {
-font-size: 100%;
- padding: 5px;
- border-style: solid;
- border-width: 1px;
- border-color: #CCCCCC;
- background-color: #F4F4F4;
-}
-
-UL, OL, LI {
- list-style: disc;
-}
-
-HR {
- width: 100%;
- height: 1px;
- background-color: #CCCCCC;
- border-width: 0px;
- padding: 0px;
- color: #CCCCCC;
-}
-
-.variablelist {
- padding-top: 10;
- padding-bottom:10;
- margin:0;
-}
-
-.itemizedlist, UL {
- padding-top: 0;
- padding-bottom:0;
- margin:0;
-}
-
-.term {
- font-weight:bold;
-}
-
-
-
-
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.css (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/styles/html.css)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.css (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,97 @@
+A {
+ color: #003399;
+}
+
+A:active {
+ color: #003399;
+}
+
+A:visited {
+ color: #888888;
+}
+
+P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
+ color: #000000;
+}
+
+TD, TH, SPAN {
+ color: #000000;
+}
+
+BLOCKQUOTE {
+ margin-right: 0px;
+}
+
+
+H1, H2, H3, H4, H5, H6 {
+ color: #000000;
+ font-weight:500;
+ margin-top:10px;
+ padding-top:15px;
+}
+
+TABLE {
+ border-collapse: collapse;
+ border-spacing:0;
+ border: 1px thin black;
+ empty-cells: hide;
+}
+
+TD {
+ padding: 4pt;
+}
+
+H1 { font-size: 150%; }
+H2 { font-size: 140%; }
+H3 { font-size: 110%; font-weight: bold; }
+H4 { font-size: 110%; font-weight: bold;}
+H5 { font-size: 100%; font-style: italic; }
+H6 { font-size: 100%; font-style: italic; }
+
+TT {
+font-size: 90%;
+ font-family: "Courier New", Courier, monospace;
+ color: #000000;
+}
+
+PRE {
+font-size: 100%;
+ padding: 5px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #CCCCCC;
+ background-color: #F4F4F4;
+}
+
+UL, OL, LI {
+ list-style: disc;
+}
+
+HR {
+ width: 100%;
+ height: 1px;
+ background-color: #CCCCCC;
+ border-width: 0px;
+ padding: 0px;
+ color: #CCCCCC;
+}
+
+.variablelist {
+ padding-top: 10;
+ padding-bottom:10;
+ margin:0;
+}
+
+.itemizedlist, UL {
+ padding-top: 0;
+ padding-bottom:0;
+ margin:0;
+}
+
+.term {
+ font-weight:bold;
+}
+
+
+
+
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/styles/html.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,84 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/styles/html.xsl)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.xsl (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/entitymanager/doc/reference/en/styles/html_chunk.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/styles/html_chunk.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="chunk.section.depth">'5'</xsl:param>
- <xsl:param name="use.id.as.filename">'1'</xsl:param>
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/entitymanager/doc/reference/en/styles/html_chunk.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/doc/reference/en/styles/html_chunk.xsl)
===================================================================
--- trunk/HibernateExt/entitymanager/doc/reference/en/styles/html_chunk.xsl (rev 0)
+++ trunk/HibernateExt/entitymanager/doc/reference/en/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="chunk.section.depth">'5'</xsl:param>
+ <xsl:param name="use.id.as.filename">'1'</xsl:param>
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Copied: trunk/HibernateExt/entitymanager/jdbc (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/jdbc)
Deleted: trunk/HibernateExt/entitymanager/jdbc/hsqldb.jar
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/entitymanager/jdbc/hsqldb.jar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/jdbc/hsqldb.jar)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/entitymanager/lgpl.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/lgpl.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/lgpl.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
Copied: trunk/HibernateExt/entitymanager/lgpl.txt (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/lgpl.txt)
===================================================================
--- trunk/HibernateExt/entitymanager/lgpl.txt (rev 0)
+++ trunk/HibernateExt/entitymanager/lgpl.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Copied: trunk/HibernateExt/entitymanager/lib (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/lib)
Deleted: trunk/HibernateExt/entitymanager/lib/README.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/lib/README.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/lib/README.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-Hibernate Entity Manager dependencies
-=====================================
-
-
-Core
-====
-hibernate-commons-annotations.jar: required
-ejb3-persistence.jar: required
-hibernate-annotations: required
-hibernate-validator: required
-hibernate3.jar: required
-hibernate core dependencies: required (see Hibernate Core for more information)
-javassist.jar: required (part of Hibernate Core dependencies)
-jboss-archive-browsing (jboss-common-core 2.0.2.Alpha): required
-
-
-Test
-====
-(no extra dependency)
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/lib/README.txt (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/lib/README.txt)
===================================================================
--- trunk/HibernateExt/entitymanager/lib/README.txt (rev 0)
+++ trunk/HibernateExt/entitymanager/lib/README.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+Hibernate Entity Manager dependencies
+=====================================
+
+
+Core
+====
+hibernate-commons-annotations.jar: required
+ejb3-persistence.jar: required
+hibernate-annotations: required
+hibernate-validator: required
+hibernate3.jar: required
+hibernate core dependencies: required (see Hibernate Core for more information)
+javassist.jar: required (part of Hibernate Core dependencies)
+jboss-archive-browsing (jboss-common-core 2.0.2.Alpha): required
+
+
+Test
+====
+(no extra dependency)
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/lib/jboss-archive-browsing.jar
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/entitymanager/lib/jboss-archive-browsing.jar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/lib/jboss-archive-browsing.jar)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/entitymanager/readme.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/readme.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/readme.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-Hibernate EntityManager
-==================================================
-Version: 3.2.1.GA, 8.12.2006
-
-THIS RELEASE OF HIBERNATE ENTITYMANAGER REQUIRES HIBERNATE CORE 3.2.0.GA (and above) AND
-DOES NOT WORK WITH HIBERNATE 3.1.x OR ANY OLDER VERSION OF HIBERNATE.
-
-
-Description
------------
-
-The EJB3 specification recognizes the interest and the success of
-the transparent object/relational mapping paradigm. The EJB3 specification
-standardizes the basic APIs and the metadata needed for any object/relational
-persistence mechanism.
-
-Hibernate EntityManager implements the programming interfaces and lifecycle rules
-as defined by the EJB3 persistence specification. Together with Hibernate Annotations
-this wrapper implements a complete (and standalone) EJB3 persistence solution on
-top of the mature Hibernate core. You may use a combination of all three together,
-annotations without EJB3 programming interfaces and lifecycle, or even pure native
-Hibernate, depending on the business and technical needs of your project. You can
-at all times fall back to Hibernate native APIs, or if required, even to native
-JDBC and SQL.
-
-
-Instructions
-------------
-
-Unzip to installation directory, read doc/reference
-
-
-Contact
-------------
-
-Latest Documentation:
-
- http://hibernate.org
- http://annotations.hibernate.org
-
-Bug Reports:
-
- Hibernate JIRA (preferred)
- hibernate-devel at lists.sourceforge.net
-
-Free Technical Support:
-
- http://forum.hibernate.org
-
-
-Notes
------------
-
-If you want to contribute, go to http://www.hibernate.org/
-
-This software and its documentation are distributed under the terms of the
-FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/readme.txt (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/readme.txt)
===================================================================
--- trunk/HibernateExt/entitymanager/readme.txt (rev 0)
+++ trunk/HibernateExt/entitymanager/readme.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+Hibernate EntityManager
+==================================================
+Version: 3.2.1.GA, 8.12.2006
+
+THIS RELEASE OF HIBERNATE ENTITYMANAGER REQUIRES HIBERNATE CORE 3.2.0.GA (and above) AND
+DOES NOT WORK WITH HIBERNATE 3.1.x OR ANY OLDER VERSION OF HIBERNATE.
+
+
+Description
+-----------
+
+The EJB3 specification recognizes the interest and the success of
+the transparent object/relational mapping paradigm. The EJB3 specification
+standardizes the basic APIs and the metadata needed for any object/relational
+persistence mechanism.
+
+Hibernate EntityManager implements the programming interfaces and lifecycle rules
+as defined by the EJB3 persistence specification. Together with Hibernate Annotations
+this wrapper implements a complete (and standalone) EJB3 persistence solution on
+top of the mature Hibernate core. You may use a combination of all three together,
+annotations without EJB3 programming interfaces and lifecycle, or even pure native
+Hibernate, depending on the business and technical needs of your project. You can
+at all times fall back to Hibernate native APIs, or if required, even to native
+JDBC and SQL.
+
+
+Instructions
+------------
+
+Unzip to installation directory, read doc/reference
+
+
+Contact
+------------
+
+Latest Documentation:
+
+ http://hibernate.org
+ http://annotations.hibernate.org
+
+Bug Reports:
+
+ Hibernate JIRA (preferred)
+ hibernate-devel at lists.sourceforge.net
+
+Free Technical Support:
+
+ http://forum.hibernate.org
+
+
+Notes
+-----------
+
+If you want to contribute, go to http://www.hibernate.org/
+
+This software and its documentation are distributed under the terms of the
+FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src)
Copied: trunk/HibernateExt/entitymanager/src/java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java)
Copied: trunk/HibernateExt/entitymanager/src/java/org (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org)
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate)
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb)
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,658 +0,0 @@
-/*
- * JBoss, the OpenSource EJB server Distributable under LGPL license. See terms of license at
- * gnu.org.
- */
-package org.hibernate.ejb;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.util.Map;
-import javax.persistence.EntityExistsException;
-import javax.persistence.EntityNotFoundException;
-import javax.persistence.EntityTransaction;
-import javax.persistence.FlushModeType;
-import javax.persistence.LockModeType;
-import javax.persistence.NoResultException;
-import javax.persistence.NonUniqueResultException;
-import javax.persistence.OptimisticLockException;
-import javax.persistence.PersistenceContextType;
-import javax.persistence.PersistenceException;
-import javax.persistence.Query;
-import javax.persistence.TransactionRequiredException;
-import javax.persistence.spi.PersistenceUnitTransactionType;
-import javax.transaction.Status;
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.TransactionManager;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AssertionFailure;
-import org.hibernate.FlushMode;
-import org.hibernate.HibernateException;
-import org.hibernate.LockMode;
-import org.hibernate.MappingException;
-import org.hibernate.ObjectDeletedException;
-import org.hibernate.ObjectNotFoundException;
-import org.hibernate.SQLQuery;
-import org.hibernate.Session;
-import org.hibernate.StaleStateException;
-import org.hibernate.Transaction;
-import org.hibernate.UnresolvableObjectException;
-import org.hibernate.TypeMismatchException;
-import org.hibernate.QueryException;
-import org.hibernate.TransientObjectException;
-import org.hibernate.StaleObjectStateException;
-import org.hibernate.cfg.Environment;
-import org.hibernate.ejb.transaction.JoinableCMTTransaction;
-import org.hibernate.ejb.util.ConfigurationHelper;
-import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.exception.ConstraintViolationException;
-import org.hibernate.proxy.HibernateProxy;
-import org.hibernate.transaction.TransactionFactory;
-import org.hibernate.util.JTAHelper;
-import org.hibernate.util.CollectionHelper;
-
-/**
- * @author <a href="mailto:gavin at hibernate.org">Gavin King</a>
- * @author Emmanuel Bernard
- */
-public abstract class AbstractEntityManagerImpl implements HibernateEntityManagerImplementor, Serializable {
- private static Log log = LogFactory.getLog( AbstractEntityManagerImpl.class );
-
- protected transient TransactionImpl tx = new TransactionImpl( this );
- protected PersistenceContextType persistenceContextType;
- private FlushModeType flushModeType = FlushModeType.AUTO;
- private PersistenceUnitTransactionType transactionType;
- private Map properties;
-
- protected AbstractEntityManagerImpl(
- PersistenceContextType type, PersistenceUnitTransactionType transactionType, Map properties
- ) {
- this.persistenceContextType = type;
- this.transactionType = transactionType;
- this.properties = properties != null ? properties : CollectionHelper.EMPTY_MAP;
- }
-
- protected void postInit() {
- //register in Sync if needed
- if ( PersistenceUnitTransactionType.JTA.equals( transactionType ) ) joinTransaction( true );
- Object flushMode = properties.get( "org.hibernate.flushMode" );
- if (flushMode != null) {
- getSession().setFlushMode( ConfigurationHelper.getFlushMode( flushMode ) );
- }
- this.properties = null;
- }
-
- public Query createQuery(String ejbqlString) {
- //adjustFlushMode();
- try {
- return new QueryImpl( getSession().createQuery( ejbqlString ), this );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- return null;
- }
- }
-
- public Query createNamedQuery(String name) {
- //adjustFlushMode();
- try {
- return new QueryImpl( getSession().getNamedQuery( name ), this );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- return null;
- }
- }
-
- public Query createNativeQuery(String sqlString) {
- //adjustFlushMode();
- try {
- SQLQuery q = getSession().createSQLQuery( sqlString );
- return new QueryImpl( q, this );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- return null;
- }
- }
-
- public Query createNativeQuery(String sqlString, Class resultClass) {
- //adjustFlushMode();
- try {
- SQLQuery q = getSession().createSQLQuery( sqlString );
- q.addEntity( "alias1", resultClass.getName(), LockMode.READ );
- return new QueryImpl( q, this );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- return null;
- }
- }
-
- public Query createNativeQuery(String sqlString, String resultSetMapping) {
- //adjustFlushMode();
- try {
- SQLQuery q = getSession().createSQLQuery( sqlString );
- q.setResultSetMapping( resultSetMapping );
- return new QueryImpl( q, this );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- return null;
- }
- }
-
- @SuppressWarnings("unchecked")
- public <T> T getReference(Class<T> entityClass, Object primaryKey) {
- //adjustFlushMode();
- try {
- return (T) getSession().load( entityClass, (Serializable) primaryKey );
- }
- catch (MappingException e) {
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (TypeMismatchException e ) {
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (ClassCastException e) {
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- return null;
- }
- }
-
- @SuppressWarnings("unchecked")
- public <A> A find(Class<A> entityClass, Object primaryKey) {
- //adjustFlushMode();
- try {
- return (A) getSession().get( entityClass, (Serializable) primaryKey );
- }
- catch (ObjectDeletedException e) {
- //the spec is silent about people doing remove() find() on the same PC
- return null;
- }
- catch (ObjectNotFoundException e) {
- //should not happen on the entity itself with get
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (MappingException e) {
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (TypeMismatchException e ) {
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (ClassCastException e) {
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- return null;
- }
- }
-
- private void checkTransactionNeeded() {
- if ( persistenceContextType == PersistenceContextType.TRANSACTION && ! isTransactionInProgress() ) {
- //no need to mark as rollback, no tx in progress
- throw new TransactionRequiredException(
- "no transaction is in progress for a TRANSACTION type persistence context"
- );
- }
- }
-
- public void persist(Object entity) {
- checkTransactionNeeded();
- //adjustFlushMode();
- try {
- getSession().persist( entity );
- }
- catch (MappingException e) {
- throw new IllegalArgumentException( e.getMessage() );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- }
- }
-
- @SuppressWarnings("unchecked")
- public <A> A merge(A entity) {
- checkTransactionNeeded();
- //adjustFlushMode();
- try {
- return (A) getSession().merge( entity );
- }
- catch (ObjectDeletedException sse) {
- throw new IllegalArgumentException( sse );
- }
- catch (MappingException e) {
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- return null;
- }
- }
-
- public void remove(Object entity) {
- checkTransactionNeeded();
- //adjustFlushMode();
- try {
- getSession().delete( entity );
- }
- catch (MappingException e) {
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- }
- }
-
- public void refresh(Object entity) {
- checkTransactionNeeded();
- //adjustFlushMode();
- try {
- if ( ! getSession().contains( entity ) ) {
- throw new IllegalArgumentException( "Entity not managed" );
- }
- getSession().refresh( entity );
- }
- catch (MappingException e) {
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- }
- }
-
- public boolean contains(Object entity) {
- try {
- if ( entity != null
- && ! ( entity instanceof HibernateProxy )
- && getSession().getSessionFactory().getClassMetadata( entity.getClass() ) == null ) {
- throw new IllegalArgumentException( "Not an entity:" + entity.getClass() );
- }
- return getSession().contains( entity );
- }
- catch (MappingException e) {
- throw new IllegalArgumentException( e.getMessage(), e );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- return false;
- }
- }
-
- public void flush() {
- try {
- if ( ! isTransactionInProgress() ) {
- throw new TransactionRequiredException( "no transaction is in progress" );
- }
- //adjustFlushMode();
- getSession().flush();
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- }
- }
-
- /**
- * return a Session
- * @throws IllegalStateException if the entity manager is closed
- */
- public abstract Session getSession();
-
- /**
- * Return a Session (even if the entity manager is closed
- */
- protected abstract Session getRawSession();
-
- public EntityTransaction getTransaction() {
- if ( transactionType == PersistenceUnitTransactionType.JTA ) {
- throw new IllegalStateException( "A JTA EntityManager cannot use getTransaction()" );
- }
- return tx;
- }
-
- public void setFlushMode(FlushModeType flushModeType) {
- this.flushModeType = flushModeType;
- if ( flushModeType == FlushModeType.AUTO ) {
- getSession().setFlushMode( FlushMode.AUTO );
- }
- else if ( flushModeType == FlushModeType.COMMIT ) {
- getSession().setFlushMode( FlushMode.COMMIT );
- }
- else {
- throw new AssertionFailure( "Unknown FlushModeType: " + flushModeType );
- }
- }
-
- public void clear() {
- //adjustFlushMode();
- try {
- getSession().clear();
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- }
- }
-
- public FlushModeType getFlushMode() {
- FlushMode mode = getSession().getFlushMode();
- if ( mode == FlushMode.AUTO ) {
- this.flushModeType = FlushModeType.AUTO;
- }
- else if ( mode == FlushMode.COMMIT ) {
- this.flushModeType = FlushModeType.COMMIT;
- }
-// else if ( mode == FlushMode.NEVER ) {
-// if ( PersistenceContextType.EXTENDED == persistenceContextType && !isTransactionInProgress() ) {
-// //we are in flushMode none for EXTENDED
-// return flushMode;
-// }
-// else {
-// return null; //TODO exception?
-// }
-// }
- else {
- return null; //TODO exception?
- }
- //otherwise this is an unknown mode for EJB3
- return flushModeType;
- }
-
- public void lock(Object entity, LockModeType lockMode) {
- try {
- if ( ! isTransactionInProgress() ) {
- throw new TransactionRequiredException( "no transaction is in progress" );
- }
- //adjustFlushMode();
- if ( !contains( entity ) ) throw new IllegalArgumentException( "entity not in the persistence context" );
- getSession().lock( entity, getLockMode( lockMode ) );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- }
- }
-
- private LockMode getLockMode(LockModeType lockMode) {
- switch ( lockMode ) {
- case READ:
- return LockMode.UPGRADE; //assuming we are on read-commited and we need to prevent non repeteable read
- case WRITE:
- return LockMode.FORCE;
- default:
- throw new AssertionFailure( "Unknown LockModeType: " + lockMode );
- }
- }
-
- /**
- * adjust the flush mode to match the no tx / no flush behavior
- */
- //remove
- private void adjustFlushMode() {
- Session session = getSession();
-
- boolean isTransactionActive = isTransactionInProgress();
-
- if ( isTransactionActive && session.getFlushMode() == FlushMode.MANUAL ) {
- log.debug( "Transaction activated, move to FlushMode " + flushModeType );
- setFlushMode( flushModeType );
- }
- else if ( ! isTransactionActive && session.getFlushMode() != FlushMode.MANUAL ) {
- log.debug( "Transaction not active, move to FlushMode NEVER" );
- session.setFlushMode( FlushMode.MANUAL );
- }
- }
-
- public boolean isTransactionInProgress() {
- return ( (SessionImplementor) getRawSession() ).isTransactionInProgress();
- }
-
- protected void markAsRollback() {
- log.debug( "mark transaction for rollback");
- if ( tx.isActive() ) {
- tx.setRollbackOnly();
- }
- else {
- //no explicit use of the tx. boudaries methods
- if ( PersistenceUnitTransactionType.JTA == transactionType ) {
- TransactionManager transactionManager =
- ( (SessionFactoryImplementor) getRawSession().getSessionFactory() ).getTransactionManager();
- if ( transactionManager == null ) {
- throw new PersistenceException(
- "Using a JTA persistence context wo setting hibernate.transaction.manager_lookup_class"
- );
- }
- try {
- transactionManager.setRollbackOnly();
- }
- catch (SystemException e) {
- throw new PersistenceException( "Unable to set the JTA transaction as RollbackOnly", e );
- }
- }
- }
- }
-
- public void joinTransaction() {
- joinTransaction( false );
- }
-
- private void joinTransaction(boolean ignoreNotJoining) {
- //set the joined status
- getSession().isOpen(); //for sync
- if ( transactionType == PersistenceUnitTransactionType.JTA ) {
- try {
- log.debug( "Looking for a JTA transaction to join" );
- final Session session = getSession();
- final Transaction transaction = session.getTransaction();
- if ( transaction != null && transaction instanceof JoinableCMTTransaction ) {
- //can't handle it if not a joinnable transaction
- final JoinableCMTTransaction joinableCMTTransaction = (JoinableCMTTransaction) transaction;
-
- if ( joinableCMTTransaction.getStatus() == JoinableCMTTransaction.JoinStatus.JOINED ) {
- log.debug( "Transaction already joined" );
- return; //no-op
- }
- joinableCMTTransaction.markForJoined();
- session.isOpen(); //register to the Tx
- if ( joinableCMTTransaction.getStatus() == JoinableCMTTransaction.JoinStatus.NOT_JOINED ) {
- if ( ignoreNotJoining ) {
- log.debug( "No JTA transaction found" );
- return;
- }
- else {
- throw new TransactionRequiredException(
- "No active JTA transaction on joinTransaction call"
- );
- }
- }
- else
- if ( joinableCMTTransaction.getStatus() == JoinableCMTTransaction.JoinStatus.MARKED_FOR_JOINED ) {
- throw new AssertionFailure( "Transaction MARKED_FOR_JOINED after isOpen() call" );
- }
- //flush before completion and
- //register clear on rollback
- log.trace( "Adding flush() and close() synchronization" );
- joinableCMTTransaction.registerSynchronization(
- new Synchronization() {
- public void beforeCompletion() {
- boolean flush = false;
- TransactionFactory.Context ctx = null;
- try {
- ctx = (TransactionFactory.Context) session;
- JoinableCMTTransaction joinable = (JoinableCMTTransaction) session.getTransaction();
- javax.transaction.Transaction transaction = joinable.getTransaction();
- if ( transaction == null )
- log.warn( "Transaction not available on beforeCompletionPhase: assuming valid" );
- flush = !ctx.isFlushModeNever() &&
- //ctx.isFlushBeforeCompletionEnabled() &&
- //TODO probably make it ! isFlushBeforecompletion()
- ( transaction == null || !JTAHelper.isRollback( transaction.getStatus() ) );
- //transaction == null workaround a JBoss TMBug
- }
- catch (SystemException se) {
- log.error( "could not determine transaction status", se );
- //throwPersistenceException will mark the transaction as rollbacked
- throwPersistenceException(
- new PersistenceException(
- "could not determine transaction status in beforeCompletion()",
- se
- )
- );
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- }
-
- try {
- if ( flush ) {
- log.trace( "automatically flushing session" );
- ctx.managedFlush();
- }
- else {
- log.trace( "skipping managed flushing" );
- }
- }
- catch (RuntimeException re) {
- //throwPersistenceException will mark the transaction as rollbacked
- if ( re instanceof HibernateException ) {
- throwPersistenceException( (HibernateException) re );
- }
- else {
- throwPersistenceException( new PersistenceException( re ) );
- }
- }
- }
-
- public void afterCompletion(int status) {
- try {
- if ( Status.STATUS_ROLLEDBACK == status
- && transactionType == PersistenceUnitTransactionType.JTA ) {
- if ( session.isOpen() ) {
- session.clear();
- }
- }
- if ( session.isOpen() ) {
- //only reset if the session is opened since you can't get the Transaction otherwise
- JoinableCMTTransaction joinable = (JoinableCMTTransaction) session.getTransaction();
- joinable.resetStatus();
- }
- }
- catch (HibernateException e) {
- throwPersistenceException( e );
- }
- }
- }
- );
- }
- else {
- log.warn( "Cannot join transaction: do not override " + Environment.TRANSACTION_STRATEGY );
- }
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- }
- }
- else {
- if ( !ignoreNotJoining ) log.warn( "Calling joinTransaction() on a non JTA EntityManager" );
- }
- }
-
- /**
- * returns the underlying session
- */
- public Object getDelegate() {
- return getSession();
- }
-
- ;
-
- private void writeObject(ObjectOutputStream oos) throws IOException {
- oos.defaultWriteObject();
- }
-
- private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
- ois.defaultReadObject();
- tx = new TransactionImpl( this );
- }
-
- public void throwPersistenceException(PersistenceException e) {
- if ( ! ( e instanceof NoResultException || e instanceof NonUniqueResultException ) ) {
- try {
- markAsRollback();
- }
- catch (Exception ne) {
- //we do not want the subsequent exception to swallow the original one
- log.error( "Unable to mark for rollback on PersistenceException: ", ne);
- }
- }
- throw e;
- }
-
- public void throwPersistenceException(HibernateException e) {
- if ( e instanceof StaleStateException ) {
- PersistenceException pe = wrapStaleStateException( (StaleStateException) e );
- throwPersistenceException( pe );
- }
- else if ( e instanceof ConstraintViolationException ) {
- //FIXME this is bad cause ConstraintViolationException happens in other circumstances
- throwPersistenceException( new EntityExistsException( e ) );
- }
- else if ( e instanceof ObjectNotFoundException ) {
- throwPersistenceException( new EntityNotFoundException( e.getMessage() ) );
- }
- else if ( e instanceof org.hibernate.NonUniqueResultException ) {
- throwPersistenceException( new NonUniqueResultException( e.getMessage() ) );
- }
- else if ( e instanceof UnresolvableObjectException ) {
- throwPersistenceException( new EntityNotFoundException( e.getMessage() ) );
- }
- else if ( e instanceof QueryException ) {
- throw new IllegalArgumentException( e );
- }
- else if ( e instanceof TransientObjectException ) {
- try {
- markAsRollback();
- }
- catch (Exception ne) {
- //we do not want the subsequent exception to swallow the original one
- log.error( "Unable to mark for rollback on TransientObjectException: ", ne);
- }
- throw new IllegalStateException( e ); //Spec 3.2.3 Synchronization rules
- }
- else {
- throwPersistenceException( new PersistenceException( e ) );
- }
- }
-
- public PersistenceException wrapStaleStateException(StaleStateException e) {
- PersistenceException pe;
- if ( e instanceof StaleObjectStateException ) {
- StaleObjectStateException sose = (StaleObjectStateException) e;
- Serializable identifier = sose.getIdentifier();
- if (identifier != null) {
- Object entity = getRawSession().load( sose.getEntityName(), identifier );
- if ( entity instanceof Serializable ) {
- //avoid some user errors regarding boundary crossing
- pe = new OptimisticLockException( null, e, entity );
- }
- else {
- pe = new OptimisticLockException( e );
- }
- }
- else {
- pe = new OptimisticLockException( e );
- }
- }
- else {
- pe = new OptimisticLockException( e );
- }
- return pe;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/AbstractEntityManagerImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,658 @@
+/*
+ * JBoss, the OpenSource EJB server Distributable under LGPL license. See terms of license at
+ * gnu.org.
+ */
+package org.hibernate.ejb;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.Map;
+import javax.persistence.EntityExistsException;
+import javax.persistence.EntityNotFoundException;
+import javax.persistence.EntityTransaction;
+import javax.persistence.FlushModeType;
+import javax.persistence.LockModeType;
+import javax.persistence.NoResultException;
+import javax.persistence.NonUniqueResultException;
+import javax.persistence.OptimisticLockException;
+import javax.persistence.PersistenceContextType;
+import javax.persistence.PersistenceException;
+import javax.persistence.Query;
+import javax.persistence.TransactionRequiredException;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.TransactionManager;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AssertionFailure;
+import org.hibernate.FlushMode;
+import org.hibernate.HibernateException;
+import org.hibernate.LockMode;
+import org.hibernate.MappingException;
+import org.hibernate.ObjectDeletedException;
+import org.hibernate.ObjectNotFoundException;
+import org.hibernate.SQLQuery;
+import org.hibernate.Session;
+import org.hibernate.StaleStateException;
+import org.hibernate.Transaction;
+import org.hibernate.UnresolvableObjectException;
+import org.hibernate.TypeMismatchException;
+import org.hibernate.QueryException;
+import org.hibernate.TransientObjectException;
+import org.hibernate.StaleObjectStateException;
+import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.transaction.JoinableCMTTransaction;
+import org.hibernate.ejb.util.ConfigurationHelper;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.exception.ConstraintViolationException;
+import org.hibernate.proxy.HibernateProxy;
+import org.hibernate.transaction.TransactionFactory;
+import org.hibernate.util.JTAHelper;
+import org.hibernate.util.CollectionHelper;
+
+/**
+ * @author <a href="mailto:gavin at hibernate.org">Gavin King</a>
+ * @author Emmanuel Bernard
+ */
+public abstract class AbstractEntityManagerImpl implements HibernateEntityManagerImplementor, Serializable {
+ private static Log log = LogFactory.getLog( AbstractEntityManagerImpl.class );
+
+ protected transient TransactionImpl tx = new TransactionImpl( this );
+ protected PersistenceContextType persistenceContextType;
+ private FlushModeType flushModeType = FlushModeType.AUTO;
+ private PersistenceUnitTransactionType transactionType;
+ private Map properties;
+
+ protected AbstractEntityManagerImpl(
+ PersistenceContextType type, PersistenceUnitTransactionType transactionType, Map properties
+ ) {
+ this.persistenceContextType = type;
+ this.transactionType = transactionType;
+ this.properties = properties != null ? properties : CollectionHelper.EMPTY_MAP;
+ }
+
+ protected void postInit() {
+ //register in Sync if needed
+ if ( PersistenceUnitTransactionType.JTA.equals( transactionType ) ) joinTransaction( true );
+ Object flushMode = properties.get( "org.hibernate.flushMode" );
+ if (flushMode != null) {
+ getSession().setFlushMode( ConfigurationHelper.getFlushMode( flushMode ) );
+ }
+ this.properties = null;
+ }
+
+ public Query createQuery(String ejbqlString) {
+ //adjustFlushMode();
+ try {
+ return new QueryImpl( getSession().createQuery( ejbqlString ), this );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Query createNamedQuery(String name) {
+ //adjustFlushMode();
+ try {
+ return new QueryImpl( getSession().getNamedQuery( name ), this );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Query createNativeQuery(String sqlString) {
+ //adjustFlushMode();
+ try {
+ SQLQuery q = getSession().createSQLQuery( sqlString );
+ return new QueryImpl( q, this );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Query createNativeQuery(String sqlString, Class resultClass) {
+ //adjustFlushMode();
+ try {
+ SQLQuery q = getSession().createSQLQuery( sqlString );
+ q.addEntity( "alias1", resultClass.getName(), LockMode.READ );
+ return new QueryImpl( q, this );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Query createNativeQuery(String sqlString, String resultSetMapping) {
+ //adjustFlushMode();
+ try {
+ SQLQuery q = getSession().createSQLQuery( sqlString );
+ q.setResultSetMapping( resultSetMapping );
+ return new QueryImpl( q, this );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public <T> T getReference(Class<T> entityClass, Object primaryKey) {
+ //adjustFlushMode();
+ try {
+ return (T) getSession().load( entityClass, (Serializable) primaryKey );
+ }
+ catch (MappingException e) {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (TypeMismatchException e ) {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (ClassCastException e) {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public <A> A find(Class<A> entityClass, Object primaryKey) {
+ //adjustFlushMode();
+ try {
+ return (A) getSession().get( entityClass, (Serializable) primaryKey );
+ }
+ catch (ObjectDeletedException e) {
+ //the spec is silent about people doing remove() find() on the same PC
+ return null;
+ }
+ catch (ObjectNotFoundException e) {
+ //should not happen on the entity itself with get
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (MappingException e) {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (TypeMismatchException e ) {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (ClassCastException e) {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ private void checkTransactionNeeded() {
+ if ( persistenceContextType == PersistenceContextType.TRANSACTION && ! isTransactionInProgress() ) {
+ //no need to mark as rollback, no tx in progress
+ throw new TransactionRequiredException(
+ "no transaction is in progress for a TRANSACTION type persistence context"
+ );
+ }
+ }
+
+ public void persist(Object entity) {
+ checkTransactionNeeded();
+ //adjustFlushMode();
+ try {
+ getSession().persist( entity );
+ }
+ catch (MappingException e) {
+ throw new IllegalArgumentException( e.getMessage() );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public <A> A merge(A entity) {
+ checkTransactionNeeded();
+ //adjustFlushMode();
+ try {
+ return (A) getSession().merge( entity );
+ }
+ catch (ObjectDeletedException sse) {
+ throw new IllegalArgumentException( sse );
+ }
+ catch (MappingException e) {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public void remove(Object entity) {
+ checkTransactionNeeded();
+ //adjustFlushMode();
+ try {
+ getSession().delete( entity );
+ }
+ catch (MappingException e) {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ }
+ }
+
+ public void refresh(Object entity) {
+ checkTransactionNeeded();
+ //adjustFlushMode();
+ try {
+ if ( ! getSession().contains( entity ) ) {
+ throw new IllegalArgumentException( "Entity not managed" );
+ }
+ getSession().refresh( entity );
+ }
+ catch (MappingException e) {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ }
+ }
+
+ public boolean contains(Object entity) {
+ try {
+ if ( entity != null
+ && ! ( entity instanceof HibernateProxy )
+ && getSession().getSessionFactory().getClassMetadata( entity.getClass() ) == null ) {
+ throw new IllegalArgumentException( "Not an entity:" + entity.getClass() );
+ }
+ return getSession().contains( entity );
+ }
+ catch (MappingException e) {
+ throw new IllegalArgumentException( e.getMessage(), e );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ return false;
+ }
+ }
+
+ public void flush() {
+ try {
+ if ( ! isTransactionInProgress() ) {
+ throw new TransactionRequiredException( "no transaction is in progress" );
+ }
+ //adjustFlushMode();
+ getSession().flush();
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ }
+ }
+
+ /**
+ * return a Session
+ * @throws IllegalStateException if the entity manager is closed
+ */
+ public abstract Session getSession();
+
+ /**
+ * Return a Session (even if the entity manager is closed
+ */
+ protected abstract Session getRawSession();
+
+ public EntityTransaction getTransaction() {
+ if ( transactionType == PersistenceUnitTransactionType.JTA ) {
+ throw new IllegalStateException( "A JTA EntityManager cannot use getTransaction()" );
+ }
+ return tx;
+ }
+
+ public void setFlushMode(FlushModeType flushModeType) {
+ this.flushModeType = flushModeType;
+ if ( flushModeType == FlushModeType.AUTO ) {
+ getSession().setFlushMode( FlushMode.AUTO );
+ }
+ else if ( flushModeType == FlushModeType.COMMIT ) {
+ getSession().setFlushMode( FlushMode.COMMIT );
+ }
+ else {
+ throw new AssertionFailure( "Unknown FlushModeType: " + flushModeType );
+ }
+ }
+
+ public void clear() {
+ //adjustFlushMode();
+ try {
+ getSession().clear();
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ }
+ }
+
+ public FlushModeType getFlushMode() {
+ FlushMode mode = getSession().getFlushMode();
+ if ( mode == FlushMode.AUTO ) {
+ this.flushModeType = FlushModeType.AUTO;
+ }
+ else if ( mode == FlushMode.COMMIT ) {
+ this.flushModeType = FlushModeType.COMMIT;
+ }
+// else if ( mode == FlushMode.NEVER ) {
+// if ( PersistenceContextType.EXTENDED == persistenceContextType && !isTransactionInProgress() ) {
+// //we are in flushMode none for EXTENDED
+// return flushMode;
+// }
+// else {
+// return null; //TODO exception?
+// }
+// }
+ else {
+ return null; //TODO exception?
+ }
+ //otherwise this is an unknown mode for EJB3
+ return flushModeType;
+ }
+
+ public void lock(Object entity, LockModeType lockMode) {
+ try {
+ if ( ! isTransactionInProgress() ) {
+ throw new TransactionRequiredException( "no transaction is in progress" );
+ }
+ //adjustFlushMode();
+ if ( !contains( entity ) ) throw new IllegalArgumentException( "entity not in the persistence context" );
+ getSession().lock( entity, getLockMode( lockMode ) );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ }
+ }
+
+ private LockMode getLockMode(LockModeType lockMode) {
+ switch ( lockMode ) {
+ case READ:
+ return LockMode.UPGRADE; //assuming we are on read-commited and we need to prevent non repeteable read
+ case WRITE:
+ return LockMode.FORCE;
+ default:
+ throw new AssertionFailure( "Unknown LockModeType: " + lockMode );
+ }
+ }
+
+ /**
+ * adjust the flush mode to match the no tx / no flush behavior
+ */
+ //remove
+ private void adjustFlushMode() {
+ Session session = getSession();
+
+ boolean isTransactionActive = isTransactionInProgress();
+
+ if ( isTransactionActive && session.getFlushMode() == FlushMode.MANUAL ) {
+ log.debug( "Transaction activated, move to FlushMode " + flushModeType );
+ setFlushMode( flushModeType );
+ }
+ else if ( ! isTransactionActive && session.getFlushMode() != FlushMode.MANUAL ) {
+ log.debug( "Transaction not active, move to FlushMode NEVER" );
+ session.setFlushMode( FlushMode.MANUAL );
+ }
+ }
+
+ public boolean isTransactionInProgress() {
+ return ( (SessionImplementor) getRawSession() ).isTransactionInProgress();
+ }
+
+ protected void markAsRollback() {
+ log.debug( "mark transaction for rollback");
+ if ( tx.isActive() ) {
+ tx.setRollbackOnly();
+ }
+ else {
+ //no explicit use of the tx. boudaries methods
+ if ( PersistenceUnitTransactionType.JTA == transactionType ) {
+ TransactionManager transactionManager =
+ ( (SessionFactoryImplementor) getRawSession().getSessionFactory() ).getTransactionManager();
+ if ( transactionManager == null ) {
+ throw new PersistenceException(
+ "Using a JTA persistence context wo setting hibernate.transaction.manager_lookup_class"
+ );
+ }
+ try {
+ transactionManager.setRollbackOnly();
+ }
+ catch (SystemException e) {
+ throw new PersistenceException( "Unable to set the JTA transaction as RollbackOnly", e );
+ }
+ }
+ }
+ }
+
+ public void joinTransaction() {
+ joinTransaction( false );
+ }
+
+ private void joinTransaction(boolean ignoreNotJoining) {
+ //set the joined status
+ getSession().isOpen(); //for sync
+ if ( transactionType == PersistenceUnitTransactionType.JTA ) {
+ try {
+ log.debug( "Looking for a JTA transaction to join" );
+ final Session session = getSession();
+ final Transaction transaction = session.getTransaction();
+ if ( transaction != null && transaction instanceof JoinableCMTTransaction ) {
+ //can't handle it if not a joinnable transaction
+ final JoinableCMTTransaction joinableCMTTransaction = (JoinableCMTTransaction) transaction;
+
+ if ( joinableCMTTransaction.getStatus() == JoinableCMTTransaction.JoinStatus.JOINED ) {
+ log.debug( "Transaction already joined" );
+ return; //no-op
+ }
+ joinableCMTTransaction.markForJoined();
+ session.isOpen(); //register to the Tx
+ if ( joinableCMTTransaction.getStatus() == JoinableCMTTransaction.JoinStatus.NOT_JOINED ) {
+ if ( ignoreNotJoining ) {
+ log.debug( "No JTA transaction found" );
+ return;
+ }
+ else {
+ throw new TransactionRequiredException(
+ "No active JTA transaction on joinTransaction call"
+ );
+ }
+ }
+ else
+ if ( joinableCMTTransaction.getStatus() == JoinableCMTTransaction.JoinStatus.MARKED_FOR_JOINED ) {
+ throw new AssertionFailure( "Transaction MARKED_FOR_JOINED after isOpen() call" );
+ }
+ //flush before completion and
+ //register clear on rollback
+ log.trace( "Adding flush() and close() synchronization" );
+ joinableCMTTransaction.registerSynchronization(
+ new Synchronization() {
+ public void beforeCompletion() {
+ boolean flush = false;
+ TransactionFactory.Context ctx = null;
+ try {
+ ctx = (TransactionFactory.Context) session;
+ JoinableCMTTransaction joinable = (JoinableCMTTransaction) session.getTransaction();
+ javax.transaction.Transaction transaction = joinable.getTransaction();
+ if ( transaction == null )
+ log.warn( "Transaction not available on beforeCompletionPhase: assuming valid" );
+ flush = !ctx.isFlushModeNever() &&
+ //ctx.isFlushBeforeCompletionEnabled() &&
+ //TODO probably make it ! isFlushBeforecompletion()
+ ( transaction == null || !JTAHelper.isRollback( transaction.getStatus() ) );
+ //transaction == null workaround a JBoss TMBug
+ }
+ catch (SystemException se) {
+ log.error( "could not determine transaction status", se );
+ //throwPersistenceException will mark the transaction as rollbacked
+ throwPersistenceException(
+ new PersistenceException(
+ "could not determine transaction status in beforeCompletion()",
+ se
+ )
+ );
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ }
+
+ try {
+ if ( flush ) {
+ log.trace( "automatically flushing session" );
+ ctx.managedFlush();
+ }
+ else {
+ log.trace( "skipping managed flushing" );
+ }
+ }
+ catch (RuntimeException re) {
+ //throwPersistenceException will mark the transaction as rollbacked
+ if ( re instanceof HibernateException ) {
+ throwPersistenceException( (HibernateException) re );
+ }
+ else {
+ throwPersistenceException( new PersistenceException( re ) );
+ }
+ }
+ }
+
+ public void afterCompletion(int status) {
+ try {
+ if ( Status.STATUS_ROLLEDBACK == status
+ && transactionType == PersistenceUnitTransactionType.JTA ) {
+ if ( session.isOpen() ) {
+ session.clear();
+ }
+ }
+ if ( session.isOpen() ) {
+ //only reset if the session is opened since you can't get the Transaction otherwise
+ JoinableCMTTransaction joinable = (JoinableCMTTransaction) session.getTransaction();
+ joinable.resetStatus();
+ }
+ }
+ catch (HibernateException e) {
+ throwPersistenceException( e );
+ }
+ }
+ }
+ );
+ }
+ else {
+ log.warn( "Cannot join transaction: do not override " + Environment.TRANSACTION_STRATEGY );
+ }
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ }
+ }
+ else {
+ if ( !ignoreNotJoining ) log.warn( "Calling joinTransaction() on a non JTA EntityManager" );
+ }
+ }
+
+ /**
+ * returns the underlying session
+ */
+ public Object getDelegate() {
+ return getSession();
+ }
+
+ ;
+
+ private void writeObject(ObjectOutputStream oos) throws IOException {
+ oos.defaultWriteObject();
+ }
+
+ private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+ ois.defaultReadObject();
+ tx = new TransactionImpl( this );
+ }
+
+ public void throwPersistenceException(PersistenceException e) {
+ if ( ! ( e instanceof NoResultException || e instanceof NonUniqueResultException ) ) {
+ try {
+ markAsRollback();
+ }
+ catch (Exception ne) {
+ //we do not want the subsequent exception to swallow the original one
+ log.error( "Unable to mark for rollback on PersistenceException: ", ne);
+ }
+ }
+ throw e;
+ }
+
+ public void throwPersistenceException(HibernateException e) {
+ if ( e instanceof StaleStateException ) {
+ PersistenceException pe = wrapStaleStateException( (StaleStateException) e );
+ throwPersistenceException( pe );
+ }
+ else if ( e instanceof ConstraintViolationException ) {
+ //FIXME this is bad cause ConstraintViolationException happens in other circumstances
+ throwPersistenceException( new EntityExistsException( e ) );
+ }
+ else if ( e instanceof ObjectNotFoundException ) {
+ throwPersistenceException( new EntityNotFoundException( e.getMessage() ) );
+ }
+ else if ( e instanceof org.hibernate.NonUniqueResultException ) {
+ throwPersistenceException( new NonUniqueResultException( e.getMessage() ) );
+ }
+ else if ( e instanceof UnresolvableObjectException ) {
+ throwPersistenceException( new EntityNotFoundException( e.getMessage() ) );
+ }
+ else if ( e instanceof QueryException ) {
+ throw new IllegalArgumentException( e );
+ }
+ else if ( e instanceof TransientObjectException ) {
+ try {
+ markAsRollback();
+ }
+ catch (Exception ne) {
+ //we do not want the subsequent exception to swallow the original one
+ log.error( "Unable to mark for rollback on TransientObjectException: ", ne);
+ }
+ throw new IllegalStateException( e ); //Spec 3.2.3 Synchronization rules
+ }
+ else {
+ throwPersistenceException( new PersistenceException( e ) );
+ }
+ }
+
+ public PersistenceException wrapStaleStateException(StaleStateException e) {
+ PersistenceException pe;
+ if ( e instanceof StaleObjectStateException ) {
+ StaleObjectStateException sose = (StaleObjectStateException) e;
+ Serializable identifier = sose.getIdentifier();
+ if (identifier != null) {
+ Object entity = getRawSession().load( sose.getEntityName(), identifier );
+ if ( entity instanceof Serializable ) {
+ //avoid some user errors regarding boundary crossing
+ pe = new OptimisticLockException( null, e, entity );
+ }
+ else {
+ pe = new OptimisticLockException( e );
+ }
+ }
+ else {
+ pe = new OptimisticLockException( e );
+ }
+ }
+ else {
+ pe = new OptimisticLockException( e );
+ }
+ return pe;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,64 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import java.util.Map;
-import javax.persistence.PersistenceContextType;
-import javax.persistence.spi.PersistenceUnitTransactionType;
-
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.util.JTAHelper;
-
-/**
- * @author Gavin King
- * @author Emmanuel Bernard
- * @deprecated no longer used since getEntityManager is no longer here
- */
-public class CurrentEntityManagerImpl extends AbstractEntityManagerImpl {
-
- private SessionFactory sessionFactory;
-
- public CurrentEntityManagerImpl(SessionFactory sessionFactory, PersistenceUnitTransactionType transactionType, Map properties) {
- super( PersistenceContextType.TRANSACTION, transactionType, properties );
- this.sessionFactory = sessionFactory;
- postInit();
- }
-
- public Session getSession() {
- /**
- * Handle non transactional mode by requesting a temporary session to the session factory
- * This session, will aggressively use the AFTER_STATEMENT connection release mode to be
- * sure the conenctions are released. Be aware that the session will not be closed explicitly.
- */
-
- Session s;
- SessionFactoryImplementor sfi = (SessionFactoryImplementor) sessionFactory;
- if ( !JTAHelper.isTransactionInProgress( sfi ) ) {
- s = sfi.openTemporarySession();
- ( (SessionImplementor) s ).setAutoClear( true );
- }
- else {
- s = sessionFactory.getCurrentSession();
- }
- return s;
- }
-
- protected Session getRawSession() {
- return getSession();
- }
-
- public void close() {
- throw new UnsupportedOperationException( "cannot close the JTA-bound EntityManager" );
- }
-
- public boolean isOpen() {
- //TODO Hum contradictory comments, I'm getting mad
- //no need to force enlistment in the tx, a current session is always enlisted
- //adjustFlushMode(); //don't adjust, can't be done on closed EM
- getRawSession().isOpen(); //to force enlistment in tx
- return true;
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/CurrentEntityManagerImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,64 @@
+//$Id$
+package org.hibernate.ejb;
+
+import java.util.Map;
+import javax.persistence.PersistenceContextType;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.util.JTAHelper;
+
+/**
+ * @author Gavin King
+ * @author Emmanuel Bernard
+ * @deprecated no longer used since getEntityManager is no longer here
+ */
+public class CurrentEntityManagerImpl extends AbstractEntityManagerImpl {
+
+ private SessionFactory sessionFactory;
+
+ public CurrentEntityManagerImpl(SessionFactory sessionFactory, PersistenceUnitTransactionType transactionType, Map properties) {
+ super( PersistenceContextType.TRANSACTION, transactionType, properties );
+ this.sessionFactory = sessionFactory;
+ postInit();
+ }
+
+ public Session getSession() {
+ /**
+ * Handle non transactional mode by requesting a temporary session to the session factory
+ * This session, will aggressively use the AFTER_STATEMENT connection release mode to be
+ * sure the conenctions are released. Be aware that the session will not be closed explicitly.
+ */
+
+ Session s;
+ SessionFactoryImplementor sfi = (SessionFactoryImplementor) sessionFactory;
+ if ( !JTAHelper.isTransactionInProgress( sfi ) ) {
+ s = sfi.openTemporarySession();
+ ( (SessionImplementor) s ).setAutoClear( true );
+ }
+ else {
+ s = sessionFactory.getCurrentSession();
+ }
+ return s;
+ }
+
+ protected Session getRawSession() {
+ return getSession();
+ }
+
+ public void close() {
+ throw new UnsupportedOperationException( "cannot close the JTA-bound EntityManager" );
+ }
+
+ public boolean isOpen() {
+ //TODO Hum contradictory comments, I'm getting mad
+ //no need to force enlistment in the tx, a current session is always enlisted
+ //adjustFlushMode(); //don't adjust, can't be done on closed EM
+ getRawSession().isOpen(); //to force enlistment in tx
+ return true;
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3Configuration.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3Configuration.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3Configuration.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,1412 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import java.io.BufferedInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-import java.util.StringTokenizer;
-import javax.naming.BinaryRefAddr;
-import javax.naming.NamingException;
-import javax.naming.Reference;
-import javax.naming.Referenceable;
-import javax.persistence.Embeddable;
-import javax.persistence.Entity;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.EntityNotFoundException;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.PersistenceException;
-import javax.persistence.spi.PersistenceUnitInfo;
-import javax.persistence.spi.PersistenceUnitTransactionType;
-import javax.sql.DataSource;
-
-import javassist.bytecode.AnnotationsAttribute;
-import javassist.bytecode.ClassFile;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-import org.hibernate.HibernateException;
-import org.hibernate.Interceptor;
-import org.hibernate.MappingException;
-import org.hibernate.MappingNotFoundException;
-import org.hibernate.SessionFactory;
-import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.cfg.NamingStrategy;
-import org.hibernate.cfg.Settings;
-import org.hibernate.cfg.SettingsFactory;
-import org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider;
-import org.hibernate.ejb.instrument.InterceptFieldClassFileTransformer;
-import org.hibernate.ejb.packaging.JarVisitor;
-import org.hibernate.ejb.packaging.PersistenceMetadata;
-import org.hibernate.ejb.packaging.PersistenceXmlLoader;
-import org.hibernate.ejb.packaging.NamedInputStream;
-import org.hibernate.ejb.transaction.JoinableCMTTransactionFactory;
-import org.hibernate.ejb.util.ConfigurationHelper;
-import org.hibernate.ejb.util.LogHelper;
-import org.hibernate.ejb.util.NamingHelper;
-import org.hibernate.engine.FilterDefinition;
-import org.hibernate.event.EventListeners;
-import org.hibernate.mapping.AuxiliaryDatabaseObject;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.proxy.EntityNotFoundDelegate;
-import org.hibernate.cfg.annotations.reflection.XMLContext;
-import org.hibernate.secure.JACCConfiguration;
-import org.hibernate.transaction.JDBCTransactionFactory;
-import org.hibernate.util.CollectionHelper;
-import org.hibernate.util.ReflectHelper;
-import org.hibernate.util.StringHelper;
-import org.hibernate.util.XMLHelper;
-import org.jboss.util.file.ArchiveBrowser;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.SAXException;
-
-/**
- * Allow a fine tuned configuration of an EJB 3.0 EntityManagerFactory
- *
- * A Ejb3Configuration object is only guaranteed to create one EntityManagerFactory.
- * Multiple usage of #buildEntityManagerFactory() is not guaranteed.
- *
- * After #buildEntityManagerFactory() has been called, you no longer can change the configuration
- * state (no class adding, no property change etc)
- *
- * When serialized / deserialized or retrieved from the JNDI, you no longer can change the
- * configuration state (no class adding, no property change etc)
- *
- * Putting the configuration in the JNDI is an expensive operation that requires a partial
- * serialization
- *
- * @author Emmanuel Bernard
- */
-public class Ejb3Configuration implements Serializable, Referenceable {
- private static final String IMPLEMENTATION_NAME = HibernatePersistence.class.getName();
- private static final String META_INF_ORM_XML = "META-INF/orm.xml";
- private static Log log = LogFactory.getLog( Ejb3Configuration.class );
- private static EntityNotFoundDelegate ejb3EntityNotFoundDelegate = new Ejb3EntityNotFoundDelegate();
- private static Configuration DEFAULT_CONFIGURATION = new AnnotationConfiguration();
-
- private static class Ejb3EntityNotFoundDelegate implements EntityNotFoundDelegate, Serializable {
- public void handleEntityNotFound(String entityName, Serializable id) {
- throw new EntityNotFoundException("Unable to find " + entityName + " with id " + id);
- }
- }
-
- static {
- Version.touch();
- }
-
- private AnnotationConfiguration cfg;
- private SettingsFactory settingsFactory;
- //made transient and not restored in deserialization on purpose, should no longer be called after restoration
- private transient EventListenerConfigurator listenerConfigurator;
- private PersistenceUnitTransactionType transactionType;
- private boolean discardOnClose;
- //made transient and not restored in deserialization on purpose, should no longer be called after restoration
- private transient ClassLoader overridenClassLoader;
- private boolean isConfigurationProcessed = false;
-
-
- public Ejb3Configuration() {
- settingsFactory = new InjectionSettingsFactory();
- cfg = new AnnotationConfiguration( settingsFactory );
- cfg.setEntityNotFoundDelegate( ejb3EntityNotFoundDelegate );
- listenerConfigurator = new EventListenerConfigurator( this );
- }
-
- /**
- * Used to inject a datasource object as the connection provider.
- * If used, be sure to <b>not override</b> the hibernate.connection.provider_class
- * property
- */
- public void setDataSource(DataSource ds) {
- if ( ds != null ) {
- Map cpInjection = new HashMap();
- cpInjection.put( "dataSource", ds );
- ( (InjectionSettingsFactory) settingsFactory ).setConnectionProviderInjectionData( cpInjection );
- this.setProperty( Environment.CONNECTION_PROVIDER, InjectedDataSourceConnectionProvider.class.getName() );
- }
- }
-
- /**
- * create a factory from a parsed persistence.xml
- * Especially the scanning of classes and additional jars is done already at this point.
- */
- private Ejb3Configuration configure(PersistenceMetadata metadata, Map overrides) {
- log.debug( "Creating Factory: " + metadata.getName() );
-
- Map workingVars = new HashMap();
- workingVars.put( HibernatePersistence.PERSISTENCE_UNIT_NAME, metadata.getName() );
-
- if ( StringHelper.isNotEmpty( metadata.getJtaDatasource() ) ) {
- this.setProperty( Environment.DATASOURCE, metadata.getJtaDatasource() );
- }
- else if ( StringHelper.isNotEmpty( metadata.getNonJtaDatasource() ) ) {
- this.setProperty( Environment.DATASOURCE, metadata.getNonJtaDatasource() );
- }
- defineTransactionType( metadata.getTransactionType(), workingVars );
- if ( metadata.getClasses().size() > 0 ) {
- workingVars.put( HibernatePersistence.CLASS_NAMES, metadata.getClasses() );
- }
- if ( metadata.getPackages().size() > 0 ) {
- workingVars.put( HibernatePersistence.PACKAGE_NAMES, metadata.getPackages() );
- }
- if ( metadata.getMappingFiles().size() > 0 ) {
- workingVars.put( HibernatePersistence.XML_FILE_NAMES, metadata.getMappingFiles() );
- }
- if ( metadata.getHbmfiles().size() > 0 ) {
- workingVars.put( HibernatePersistence.HBXML_FILES, metadata.getHbmfiles() );
- }
- Properties props = new Properties();
- props.putAll( metadata.getProps() );
- if ( overrides != null ) {
- for ( Map.Entry entry : (Set<Map.Entry>) overrides.entrySet() ) {
- Object value = entry.getValue();
- props.put( entry.getKey(), value == null ? "" : value ); //alter null, not allowed in properties
- }
- }
- configure( props, workingVars );
- return this;
- }
-
- /**
- * Build the configuration from an entity manager name and given the
- * appropriate extra properties. Those properties override the one get through
- * the peristence.xml file.
- * If the persistence unit name is not found or does not match the Persistence Provider, null is returned
- *
- * @param persistenceUnitName persistence unit name
- * @param integration properties passed to the persistence provider
- * @return configured Ejb3Configuration or null if no persistence unit match
- */
- public Ejb3Configuration configure(String persistenceUnitName, Map integration) {
- try {
- log.debug( "Look up for persistence unit: " + persistenceUnitName );
- integration = integration == null ?
- CollectionHelper.EMPTY_MAP :
- Collections.unmodifiableMap( integration );
- Enumeration<URL> xmls = Thread.currentThread()
- .getContextClassLoader()
- .getResources( "META-INF/persistence.xml" );
- if ( ! xmls.hasMoreElements() ) {
- log.info( "Could not find any META-INF/persistence.xml file in the classpath");
- }
- while ( xmls.hasMoreElements() ) {
- URL url = xmls.nextElement();
- log.trace( "Analyse of persistence.xml: " + url );
- List<PersistenceMetadata> metadataFiles = PersistenceXmlLoader.deploy(
- url,
- integration,
- cfg.getEntityResolver(),
- PersistenceUnitTransactionType.RESOURCE_LOCAL );
- for ( PersistenceMetadata metadata : metadataFiles ) {
- log.trace( metadata.toString() );
-
- if ( metadata.getProvider() == null || IMPLEMENTATION_NAME.equalsIgnoreCase(
- metadata.getProvider()
- ) ) {
- //correct provider
-
- //lazy compute the visitor if possible to avoid useless exceptions if an unexpected state happens
- JarVisitor visitor = null;
-
- if ( metadata.getName() == null ) {
- visitor = getMainJarVisitor( url, metadata, integration );
- metadata.setName( visitor.getUnqualifiedJarName() );
- }
- if ( persistenceUnitName == null && xmls.hasMoreElements() ) {
- throw new PersistenceException( "No name provided and several persistence units found" );
- }
- else if ( persistenceUnitName == null || metadata.getName().equals( persistenceUnitName ) ) {
- if (visitor == null) visitor = getMainJarVisitor( url, metadata, integration );
- addMetadataFromVisitor( visitor, metadata );
- JarVisitor.Filter[] otherXmlFilter = getFilters( metadata, integration, false );
- for ( String jarFile : metadata.getJarFiles() ) {
- visitor = JarVisitor.getVisitor( jarFile, otherXmlFilter );
- addMetadataFromVisitor( visitor, metadata );
- }
- return configure( metadata, integration );
- }
- }
- }
- }
- return null;
- }
- catch (Exception e) {
- if ( e instanceof PersistenceException) {
- throw (PersistenceException) e;
- }
- else {
- throw new PersistenceException( e );
- }
- }
- }
-
- private JarVisitor getMainJarVisitor(URL url, PersistenceMetadata metadata, Map integration) {
- URL jarURL = JarVisitor.getJarURLFromURLEntry( url, "/META-INF/persistence.xml" );
- JarVisitor.Filter[] persistenceXmlFilter = getFilters( metadata, integration, metadata.getExcludeUnlistedClasses() );
- JarVisitor visitor = JarVisitor.getVisitor( jarURL, persistenceXmlFilter );
- return visitor;
- }
-
- private static void addMetadataFromVisitor(JarVisitor visitor, PersistenceMetadata metadata) throws IOException {
- Set[] entries = visitor.getMatchingEntries();
- JarVisitor.Filter[] filters = visitor.getFilters();
- int size = filters.length;
- List<String> classes = metadata.getClasses();
- List<String> packages = metadata.getPackages();
- List<NamedInputStream> hbmFiles = metadata.getHbmfiles();
- for ( int index = 0; index < size ; index++ ) {
- Iterator homogeneousEntry = entries[index].iterator();
- while ( homogeneousEntry.hasNext() ) {
- JarVisitor.Entry entry = (JarVisitor.Entry) homogeneousEntry.next();
- if ( filters[index] instanceof JarVisitor.ClassFilter ) {
- //TODO only add entry if there is annotations (Javassist)
- classes.add( entry.getName() );
- }
- else if ( filters[index] instanceof JarVisitor.PackageFilter ) {
- packages.add( entry.getName() );
- }
- else if ( filters[index] instanceof JarVisitor.FileFilter ) {
- hbmFiles.add( new NamedInputStream( entry.getName(), entry.getInputStream() ) );
- metadata.getMappingFiles().remove( entry.getName() );
- }
- }
- }
- }
-
- /**
- * Process configuration from a PersistenceUnitInfo object
- * Typically called by the container
- */
- public Ejb3Configuration configure(PersistenceUnitInfo info, Map integration) {
- if ( log.isDebugEnabled() ) {
- log.debug( "Processing " + LogHelper.logPersistenceUnitInfo( info ) );
- }
- else {
- log.info( "Processing PersistenceUnitInfo [\n\tname: " + info.getPersistenceUnitName() + "\n\t...]" );
- }
-
- integration = integration != null ? Collections.unmodifiableMap( integration ) : CollectionHelper.EMPTY_MAP;
- String provider = (String) integration.get( HibernatePersistence.PROVIDER );
- if ( provider == null ) provider = info.getPersistenceProviderClassName();
- if ( provider != null && ! provider.trim().startsWith( IMPLEMENTATION_NAME ) ) {
- log.info( "Required a different provider: " + provider );
- return null;
- }
- if ( info.getClassLoader() == null ) {
- throw new IllegalStateException(
- "[PersistenceUnit: " + info.getPersistenceUnitName() == null ? "" : info.getPersistenceUnitName()
- + "] " + "PersistenceUnitInfo.getClassLoader() id null" );
- }
- //set the classloader
- Thread thread = Thread.currentThread();
- ClassLoader contextClassLoader = thread.getContextClassLoader();
- boolean sameClassLoader = info.getClassLoader().equals( contextClassLoader );
- if ( ! sameClassLoader ) {
- overridenClassLoader = info.getClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- else {
- overridenClassLoader = null;
- }
-
- try {
- Map workingVars = new HashMap();
- workingVars.put( HibernatePersistence.PERSISTENCE_UNIT_NAME, info.getPersistenceUnitName() );
- List<String> entities = new ArrayList<String>( 50 );
- if ( info.getManagedClassNames() != null ) entities.addAll( info.getManagedClassNames() );
- List<NamedInputStream> hbmFiles = new ArrayList<NamedInputStream>();
- List<String> packages = new ArrayList<String>();
- List<String> xmlFiles = new ArrayList<String>( 50 );
- if ( info.getMappingFileNames() != null ) xmlFiles.addAll( info.getMappingFileNames() );
- //Should always be true if the container is not dump
- boolean searchForORMFiles = ! xmlFiles.contains( META_INF_ORM_XML );
-
- boolean[] detectArtifactForOtherJars = getDetectedArtifacts( info.getProperties(), null, false );
- boolean[] detectArtifactForMainJar = getDetectedArtifacts( info.getProperties(), null, info.excludeUnlistedClasses() );
- for ( URL jar : info.getJarFileUrls() ) {
- if ( detectArtifactForOtherJars[0] ) scanForClasses( jar, packages, entities );
- if ( detectArtifactForOtherJars[1] ) scanForXmlFiles( jar, hbmFiles, searchForORMFiles );
- }
- if ( detectArtifactForMainJar[0] ) scanForClasses( info.getPersistenceUnitRootUrl(), packages, entities );
- if ( detectArtifactForMainJar[1] )
- scanForXmlFiles( info.getPersistenceUnitRootUrl(), hbmFiles, searchForORMFiles );
-
- Properties properties = info.getProperties() != null ?
- info.getProperties() :
- new Properties();
- ConfigurationHelper.overrideProperties( properties, integration );
-
- //FIXME entities is used to enhance classes and to collect annotated entities this should not be mixed
- //fill up entities with the on found in xml files
- addXMLEntities( xmlFiles, info, entities );
-
- //FIXME send the appropriate entites.
- if ( "true".equalsIgnoreCase( properties.getProperty( HibernatePersistence.USE_CLASS_ENHANCER ) ) ) {
- info.addTransformer( new InterceptFieldClassFileTransformer( entities ) );
- }
-
- workingVars.put( HibernatePersistence.CLASS_NAMES, entities );
- workingVars.put( HibernatePersistence.PACKAGE_NAMES, packages );
- workingVars.put( HibernatePersistence.XML_FILE_NAMES, xmlFiles );
- if ( hbmFiles.size() > 0 ) workingVars.put( HibernatePersistence.HBXML_FILES, hbmFiles );
-
- //datasources
- Boolean isJTA = null;
- boolean overridenDatasource = false;
- if ( integration.containsKey( HibernatePersistence.JTA_DATASOURCE ) ) {
- String dataSource = (String) integration.get( HibernatePersistence.JTA_DATASOURCE );
- overridenDatasource = true;
- properties.setProperty( Environment.DATASOURCE, dataSource );
- isJTA = Boolean.TRUE;
- }
- if ( integration.containsKey( HibernatePersistence.NON_JTA_DATASOURCE ) ) {
- String dataSource = (String) integration.get( HibernatePersistence.NON_JTA_DATASOURCE );
- overridenDatasource = true;
- properties.setProperty( Environment.DATASOURCE, dataSource );
- if (isJTA == null) isJTA = Boolean.FALSE;
- }
-
- if ( ! overridenDatasource && ( info.getJtaDataSource() != null || info.getNonJtaDataSource() != null ) ) {
- isJTA = info.getJtaDataSource() != null ? Boolean.TRUE : Boolean.FALSE;
- this.setDataSource(
- isJTA ? info.getJtaDataSource() : info.getNonJtaDataSource()
- );
- this.setProperty(
- Environment.CONNECTION_PROVIDER, InjectedDataSourceConnectionProvider.class.getName()
- );
- }
- /*
- * If explicit type => use it
- * If a JTA DS is used => JTA transaction,
- * if a non JTA DS is used => RESOURCe_LOCAL
- * if none, set to JavaEE default => JTA transaction
- */
- PersistenceUnitTransactionType transactionType = info.getTransactionType();
- if (transactionType == null) {
- if (isJTA == Boolean.TRUE) {
- transactionType = PersistenceUnitTransactionType.JTA;
- }
- else if ( isJTA == Boolean.FALSE ) {
- transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
- }
- else {
- transactionType = PersistenceUnitTransactionType.JTA;
- }
- }
- defineTransactionType( transactionType, workingVars );
- configure( properties, workingVars );
- }
- finally {
- //After EMF, set the CCL back
- if ( ! sameClassLoader ) {
- thread.setContextClassLoader( contextClassLoader );
- }
- }
- return this;
- }
-
- private void addXMLEntities(List<String> xmlFiles, PersistenceUnitInfo info, List<String> entities) {
- //TODO handle inputstream related hbm files
- ClassLoader newTempClassLoader = info.getNewTempClassLoader();
- if (newTempClassLoader == null) {
- log.warn( "Persistence provider caller does not implements the EJB3 spec correctly. PersistenceUnitInfo.getNewTempClassLoader() is null." );
- return;
- }
- XMLHelper xmlHelper = new XMLHelper();
- List errors = new ArrayList();
- SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, cfg.getEntityResolver() );
- try {
- saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
- //saxReader.setFeature( "http://apache.org/xml/features/validation/dynamic", true );
- //set the default schema locators
- saxReader.setProperty( "http://apache.org/xml/properties/schema/external-schemaLocation",
- "http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd");
- }
- catch (SAXException e) {
- saxReader.setValidation( false );
- }
-
- for ( String xmlFile : xmlFiles ) {
-
- InputStream resourceAsStream = newTempClassLoader.getResourceAsStream( xmlFile );
- if (resourceAsStream == null) continue;
- BufferedInputStream is = new BufferedInputStream( resourceAsStream );
- try {
- errors.clear();
- org.dom4j.Document doc = saxReader.read( is );
- if ( errors.size() != 0 ) {
- throw new MappingException( "invalid mapping: " + xmlFile, (Throwable) errors.get( 0 ) );
- }
- Element rootElement = doc.getRootElement();
- if ( rootElement != null && "entity-mappings".equals( rootElement.getName() ) ) {
- Element element = rootElement.element( "package" );
- String defaultPackage = element != null ? element.getTextTrim() : null;
- List<Element> elements = rootElement.elements( "entity" );
- for (Element subelement : elements ) {
- String classname = XMLContext.buildSafeClassName( subelement.attributeValue( "class" ), defaultPackage );
- if ( ! entities.contains( classname ) ) {
- entities.add( classname );
- }
- }
- elements = rootElement.elements( "mapped-superclass" );
- for (Element subelement : elements ) {
- String classname = XMLContext.buildSafeClassName( subelement.attributeValue( "class" ), defaultPackage );
- if ( ! entities.contains( classname ) ) {
- entities.add( classname );
- }
- }
- elements = rootElement.elements( "embeddable" );
- for (Element subelement : elements ) {
- String classname = XMLContext.buildSafeClassName( subelement.attributeValue( "class" ), defaultPackage );
- if ( ! entities.contains( classname ) ) {
- entities.add( classname );
- }
- }
- }
- else if ( rootElement != null && "hibernate-mappings".equals( rootElement.getName() ) ) {
- //FIXME include hbm xml entities to enhance them but entities is also used to collect annotated entities
- }
- }
- catch (DocumentException e) {
- throw new MappingException( "Could not parse mapping document in input stream", e );
- }
- finally {
- try {
- is.close();
- }
- catch (IOException ioe) {
- log.warn( "Could not close input stream", ioe );
- }
- }
- }
- }
-
- private void defineTransactionType(Object overridenTxType, Map workingVars) {
- if ( overridenTxType == null ) {
-// if ( transactionType == null ) {
-// transactionType = PersistenceUnitTransactionType.JTA; //this is the default value
-// }
- //nothing to override
- }
- else if ( overridenTxType instanceof String ) {
- transactionType = PersistenceXmlLoader.getTransactionType( (String) overridenTxType );
- }
- else if ( overridenTxType instanceof PersistenceUnitTransactionType ) {
- transactionType = (PersistenceUnitTransactionType) overridenTxType;
- }
- else {
- throw new PersistenceException( getExceptionHeader( workingVars ) +
- HibernatePersistence.TRANSACTION_TYPE + " of the wrong class type"
- + ": " + overridenTxType.getClass()
- );
- }
-
- }
-
- public Ejb3Configuration setProperty(String key, String value) {
- cfg.setProperty( key, value );
- return this;
- }
-
- private boolean[] getDetectedArtifacts(Properties properties, Map overridenProperties, boolean excludeIfNotOverriden) {
- boolean[] result = new boolean[2];
- result[0] = false; //detect classes
- result[1] = false; //detect hbm
- String detect = overridenProperties != null ?
- (String) overridenProperties.get( HibernatePersistence.AUTODETECTION ) :
- null;
- detect = detect == null ?
- properties.getProperty( HibernatePersistence.AUTODETECTION) :
- detect;
- if (detect == null && excludeIfNotOverriden) {
- //not overriden through HibernatePersistence.AUTODETECTION so we comply with the spec excludeUnlistedClasses
- return result;
- }
- else if (detect == null){
- detect = "class,hbm";
- }
- StringTokenizer st = new StringTokenizer( detect, ", ", false );
- while ( st.hasMoreElements() ) {
- String element = (String) st.nextElement();
- if ( "class".equalsIgnoreCase( element ) ) result[0] = true;
- if ( "hbm".equalsIgnoreCase( element ) ) result[1] = true;
- }
- log.debug( "Detect class: " + result[0] + "; detect hbm: " + result[1] );
- return result;
- }
-
- private JarVisitor.Filter[] getFilters(PersistenceMetadata metadata, Map overridenProperties, boolean excludeIfNotOverriden) {
- Properties properties = metadata.getProps();
- final List<String> mappingFiles = metadata.getMappingFiles();
- boolean[] result = getDetectedArtifacts( properties, overridenProperties, excludeIfNotOverriden );
-
- int size = ( result[0] ? 2 : 0 ) + 1; //class involves classes and packages, xml files are always involved because of orm.xml
- JarVisitor.Filter[] filters = new JarVisitor.Filter[size];
- if ( result[0] ) {
- filters[0] = new JarVisitor.PackageFilter( false, null ) {
- public boolean accept(String javaElementName) {
- return true;
- }
- };
- filters[1] = new JarVisitor.ClassFilter(
- false, new Class[]{
- Entity.class,
- MappedSuperclass.class,
- Embeddable.class}
- ) {
- public boolean accept(String javaElementName) {
- return true;
- }
- };
- }
- if ( result[1] ) {
- filters[size - 1] = new JarVisitor.FileFilter( true ) {
- public boolean accept(String javaElementName) {
- return javaElementName.endsWith( "hbm.xml" )
- || javaElementName.endsWith( META_INF_ORM_XML )
- || mappingFiles.contains( javaElementName );
- }
- };
- }
- else {
- filters[size - 1] = new JarVisitor.FileFilter( true ) {
- public boolean accept(String javaElementName) {
- return javaElementName.endsWith( META_INF_ORM_XML )
- || mappingFiles.contains( javaElementName );
- }
- };
- }
- return filters;
- }
-
- private void scanForXmlFiles(URL jar, List<NamedInputStream> hbmxmls, final boolean searchforORMFiles) {
- Iterator it = ArchiveBrowser.getBrowser(
- jar, new ArchiveBrowser.Filter() {
- public boolean accept(String filename) {
- return filename.endsWith( ".hbm.xml" )
- || (searchforORMFiles && filename.endsWith( META_INF_ORM_XML ) )
- ;
- }
- }
- );
-
- while ( it.hasNext() ) {
- InputStream stream = (InputStream) it.next();
- hbmxmls.add( new NamedInputStream("", stream) );
- }
- }
-
- private void scanForClasses(URL jar, List<String> packages, List<String> entities) {
- Iterator it = null;
- try {
- it = ArchiveBrowser.getBrowser(
- jar, new ArchiveBrowser.Filter() {
- public boolean accept(String filename) {
- return filename.endsWith( ".class" );
- }
- }
- );
- }
- catch (RuntimeException e) {
- throw new RuntimeException( "error trying to scan <jar-file>: " + jar.toString(), e );
- }
-
- // need to look into every entry in the archive to see if anybody has tags
- // defined.
- while ( it.hasNext() ) {
- InputStream stream = (InputStream) it.next();
- DataInputStream dstream = new DataInputStream( new BufferedInputStream( stream ) );
- ClassFile cf = null;
- try {
- try {
- cf = new ClassFile( dstream );
- }
- finally {
- dstream.close();
- stream.close();
- }
- }
- catch (IOException e) {
- throw new RuntimeException( e );
- }
- if ( cf.getName().endsWith( ".package-info" ) ) {
- int idx = cf.getName().indexOf( ".package-info" );
- String pkgName = cf.getName().substring( 0, idx );
- log.info( "found package: " + pkgName );
- packages.add( pkgName );
- continue;
- }
-
- AnnotationsAttribute visible = (AnnotationsAttribute) cf.getAttribute( AnnotationsAttribute.visibleTag );
- if ( visible != null ) {
- boolean isEntity = visible.getAnnotation( Entity.class.getName() ) != null;
- if ( isEntity ) {
- log.info( "found EJB3 Entity bean: " + cf.getName() );
- entities.add( cf.getName() );
- }
- boolean isEmbeddable = visible.getAnnotation( Embeddable.class.getName() ) != null;
- if ( isEmbeddable ) {
- log.info( "found EJB3 @Embeddable: " + cf.getName() );
- entities.add( cf.getName() );
- }
- boolean isEmbeddableSuperclass = visible.getAnnotation( MappedSuperclass.class.getName() ) != null;
- if ( isEmbeddableSuperclass ) {
- log.info( "found EJB3 @MappedSuperclass: " + cf.getName() );
- entities.add( cf.getName() );
- }
- }
- }
- }
-
- /**
- * create a factory from a list of properties and
- * HibernatePersistence.CLASS_NAMES -> Collection<String> (use to list the classes from config files
- * HibernatePersistence.PACKAGE_NAMES -> Collection<String> (use to list the mappings from config files
- * HibernatePersistence.HBXML_FILES -> Collection<InputStream> (input streams of hbm files)
- * HibernatePersistence.LOADED_CLASSES -> Collection<Class> (list of loaded classes)
- * <p/>
- * <b>Used by JBoss AS only</b>
- * @deprecated use the Java Persistence API
- */
- // This is used directly by JBoss so don't remove until further notice. bill at jboss.org
- public EntityManagerFactory createEntityManagerFactory(Map workingVars) {
- Properties props = new Properties();
- if ( workingVars != null ) {
- props.putAll( workingVars );
- //remove huge non String elements for a clean props
- props.remove( HibernatePersistence.CLASS_NAMES );
- props.remove( HibernatePersistence.PACKAGE_NAMES );
- props.remove( HibernatePersistence.HBXML_FILES );
- props.remove( HibernatePersistence.LOADED_CLASSES );
- }
- configure( props, workingVars );
- return buildEntityManagerFactory();
- }
-
- /**
- * Process configuration and build an EntityManagerFactory <b>when</b> the configuration is ready
- * @deprecated
- */
- public EntityManagerFactory createEntityManagerFactory() {
- configure( cfg.getProperties(), new HashMap() );
- return buildEntityManagerFactory();
- }
-
- public EntityManagerFactory buildEntityManagerFactory() {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- configure( (Properties)null, null );
- NamingHelper.bind(this);
- return new EntityManagerFactoryImpl(
- cfg.buildSessionFactory(),
- transactionType,
- discardOnClose
- );
- }
- catch (HibernateException e) {
- throw new PersistenceException( e );
- }
- finally {
- if (thread != null) {
- thread.setContextClassLoader( contextClassLoader );
- }
- }
- }
-
- public Reference getReference() throws NamingException {
- log.debug("Returning a Reference to the Ejb3Configuration");
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- ObjectOutput out = null;
- byte[] serialized;
- try {
- out = new ObjectOutputStream( stream );
- out.writeObject( this );
- out.close();
- serialized = stream.toByteArray();
- stream.close();
- }
- catch (IOException e) {
- NamingException namingException = new NamingException( "Unable to serialize Ejb3Configuration" );
- namingException.setRootCause( e );
- throw namingException;
- }
-
- return new Reference(
- Ejb3Configuration.class.getName(),
- new BinaryRefAddr("object", serialized ),
- Ejb3ConfigurationObjectFactory.class.getName(),
- null
- );
- }
-
- /**
- * create a factory from a canonical workingVars map and the overriden properties
- *
- */
- private Ejb3Configuration configure(
- Properties properties, Map workingVars
- ) {
- //TODO check for people calling more than once this method (except buildEMF)
- if (isConfigurationProcessed) return this;
- isConfigurationProcessed = true;
- Properties preparedProperties = prepareProperties( properties, workingVars );
- if ( workingVars == null ) workingVars = CollectionHelper.EMPTY_MAP;
-
- if ( preparedProperties.containsKey( HibernatePersistence.CFG_FILE ) ) {
- String cfgFileName = preparedProperties.getProperty( HibernatePersistence.CFG_FILE );
- cfg.configure( cfgFileName );
- }
-
- cfg.addProperties( preparedProperties ); //persistence.xml has priority over hibernate.Cfg.xml
-
- addClassesToSessionFactory( workingVars );
-
- //processes specific properties
- List<String> jaccKeys = new ArrayList<String>();
-
-
- Interceptor defaultInterceptor = DEFAULT_CONFIGURATION.getInterceptor();
- NamingStrategy defaultNamingStrategy = DEFAULT_CONFIGURATION.getNamingStrategy();
-
- Iterator propertyIt = preparedProperties.keySet().iterator();
- while ( propertyIt.hasNext() ) {
- Object uncastObject = propertyIt.next();
- //had to be safe
- if ( uncastObject != null && uncastObject instanceof String ) {
- String propertyKey = (String) uncastObject;
- if ( propertyKey.startsWith( HibernatePersistence.CLASS_CACHE_PREFIX ) ) {
- setCacheStrategy( propertyKey, preparedProperties, true, workingVars );
- }
- else if ( propertyKey.startsWith( HibernatePersistence.COLLECTION_CACHE_PREFIX ) ) {
- setCacheStrategy( propertyKey, preparedProperties, false, workingVars );
- }
- else if ( propertyKey.startsWith( HibernatePersistence.JACC_PREFIX )
- && ! ( propertyKey.equals( HibernatePersistence.JACC_CONTEXT_ID )
- || propertyKey.equals( HibernatePersistence.JACC_ENABLED ) ) ) {
- jaccKeys.add( propertyKey );
- }
- }
- }
- if ( preparedProperties.containsKey( HibernatePersistence.INTERCEPTOR )
- && ( cfg.getInterceptor() == null
- || cfg.getInterceptor().equals( defaultInterceptor ) ) ) {
- //cfg.setInterceptor has precedence over configuration file
- String interceptorName = preparedProperties.getProperty( HibernatePersistence.INTERCEPTOR );
- try {
- Class interceptor = classForName( interceptorName );
- cfg.setInterceptor( (Interceptor) interceptor.newInstance() );
- }
- catch (ClassNotFoundException e) {
- throw new PersistenceException(
- getExceptionHeader(workingVars) + "Unable to find interceptor class: " + interceptorName, e
- );
- }
- catch (IllegalAccessException e) {
- throw new PersistenceException(
- getExceptionHeader(workingVars) + "Unable to access interceptor class: " + interceptorName, e
- );
- }
- catch (InstantiationException e) {
- throw new PersistenceException(
- getExceptionHeader(workingVars) + "Unable to instanciate interceptor class: " + interceptorName, e
- );
- }
- catch (ClassCastException e) {
- throw new PersistenceException(
- getExceptionHeader(workingVars) + "Interceptor class does not implement Interceptor interface: " + interceptorName, e
- );
- }
- }
- if ( preparedProperties.containsKey( HibernatePersistence.NAMING_STRATEGY )
- && ( cfg.getNamingStrategy() == null
- || cfg.getNamingStrategy().equals( defaultNamingStrategy ) ) ) {
- //cfg.setNamingStrategy has precedence over configuration file
- String namingStrategyName = preparedProperties.getProperty( HibernatePersistence.NAMING_STRATEGY );
- try {
- Class namingStragegy = classForName( namingStrategyName );
- cfg.setNamingStrategy( (NamingStrategy) namingStragegy.newInstance() );
- }
- catch (ClassNotFoundException e) {
- throw new PersistenceException(
- getExceptionHeader(workingVars) + "Unable to find naming strategy class: " + namingStrategyName, e
- );
- }
- catch (IllegalAccessException e) {
- throw new PersistenceException(
- getExceptionHeader(workingVars) + "Unable to access naming strategy class: " + namingStrategyName, e
- );
- }
- catch (InstantiationException e) {
- throw new PersistenceException(
- getExceptionHeader(workingVars) + "Unable to instanciate naming strategy class: " + namingStrategyName, e
- );
- }
- catch (ClassCastException e) {
- throw new PersistenceException(
- getExceptionHeader(workingVars) + "Naming strategyy class does not implement NmaingStrategy interface: " + namingStrategyName,
- e
- );
- }
- }
-
- if ( jaccKeys.size() > 0 ) {
- addSecurity( jaccKeys, preparedProperties, workingVars );
- }
-
- //initialize listeners
- listenerConfigurator.setProperties( preparedProperties );
- listenerConfigurator.configure();
-
- //some spec compliance checking
- //TODO centralize that?
- if ( ! "true".equalsIgnoreCase( cfg.getProperty( Environment.AUTOCOMMIT ) ) ) {
- log.warn( Environment.AUTOCOMMIT + " = false break the EJB3 specification" );
- }
- discardOnClose = preparedProperties.getProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE )
- .equals( "true" );
- return this;
- }
-
- private void addClassesToSessionFactory(Map workingVars) {
- if ( workingVars.containsKey( HibernatePersistence.CLASS_NAMES ) ) {
- Collection<String> classNames = (Collection<String>) workingVars.get(
- HibernatePersistence.CLASS_NAMES
- );
- addNamedAnnotatedClasses( this, classNames, workingVars );
- }
- //TODO apparently only used for Tests, get rid of it?
- if ( workingVars.containsKey( HibernatePersistence.LOADED_CLASSES ) ) {
- Collection<Class> classes = (Collection<Class>) workingVars.get( HibernatePersistence.LOADED_CLASSES );
- for ( Class clazz : classes ) {
- cfg.addAnnotatedClass( clazz );
- }
- }
- if ( workingVars.containsKey( HibernatePersistence.PACKAGE_NAMES ) ) {
- Collection<String> packages = (Collection<String>) workingVars.get(
- HibernatePersistence.PACKAGE_NAMES
- );
- for ( String pkg : packages ) {
- cfg.addPackage( pkg );
- }
- }
- if ( workingVars.containsKey( HibernatePersistence.XML_FILE_NAMES ) ) {
- Collection<String> xmlFiles = (Collection<String>) workingVars.get(
- HibernatePersistence.XML_FILE_NAMES
- );
- for ( String xmlFile : xmlFiles ) {
- Boolean useMetaInf = null;
- try {
- if ( xmlFile.endsWith( META_INF_ORM_XML ) ) useMetaInf = true;
- cfg.addResource( xmlFile );
- }
- catch( MappingNotFoundException e ) {
- if ( ! xmlFile.endsWith( META_INF_ORM_XML ) ) {
- throw new PersistenceException( getExceptionHeader(workingVars)
- + "Unable to find XML mapping file in classpath: " + xmlFile);
- }
- else {
- useMetaInf = false;
- //swallow it, the META-INF/orm.xml is optional
- }
- }
- catch( MappingException me ) {
- throw new PersistenceException( getExceptionHeader(workingVars)
- + "Error while reading JPA XML file: " + xmlFile, me);
- }
- if ( log.isInfoEnabled() ) {
- if ( Boolean.TRUE.equals( useMetaInf ) ) {
- log.info( getExceptionHeader( workingVars ) + META_INF_ORM_XML + " found");
- }
- else if (Boolean.FALSE.equals( useMetaInf ) ) {
- log.info( getExceptionHeader( workingVars ) + "no " + META_INF_ORM_XML + " found");
- }
- }
- }
- }
- if ( workingVars.containsKey( HibernatePersistence.HBXML_FILES ) ) {
- Collection<NamedInputStream> hbmXmlFiles = (Collection<NamedInputStream>) workingVars.get(
- HibernatePersistence.HBXML_FILES
- );
- for ( NamedInputStream is : hbmXmlFiles ) {
- try {
- //addInputStream has the responsibility to close the stream
- cfg.addInputStream( new BufferedInputStream( is.getStream() ) );
- }
- catch (MappingException me) {
- //try our best to give the file name
- if ( StringHelper.isEmpty( is.getName() ) ) {
- throw me;
- }
- else {
- throw new MappingException("Error while parsing file: " + is.getName(), me );
- }
- }
- }
- }
- }
-
- private String getExceptionHeader(Map workingVars) {
- if ( workingVars != null ) {
- String puName = (String) workingVars.get( HibernatePersistence.PERSISTENCE_UNIT_NAME);
- puName = puName == null ? "" : puName;
- String header = "[PersistenceUnit: " + puName + "] ";
- return header;
- }
- else {
- return "";
- }
- }
-
- private Properties prepareProperties(Properties properties, Map workingVars) {
- Properties preparedProperties = new Properties();
-
- //defaults different to Hibernate
- preparedProperties.setProperty( Environment.RELEASE_CONNECTIONS, "auto" );
- preparedProperties.setProperty( Environment.JPAQL_STRICT_COMPLIANCE, "true" );
- //settings that always apply to a compliant EJB3
- preparedProperties.setProperty( Environment.AUTOCOMMIT, "true" );
- preparedProperties.setProperty( Environment.USE_IDENTIFIER_ROLLBACK, "false" );
- preparedProperties.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "false" );
- preparedProperties.setProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE, "false" );
-
- //override the new defaults with the user defined ones
- //copy programmatically defined properties
- if ( cfg.getProperties() != null ) preparedProperties.putAll( cfg.getProperties() );
- //copy them co;ing from configuration
- if ( properties != null ) preparedProperties.putAll( properties );
- //note we don't copy cfg.xml properties, since they have to be overriden
-
- if (transactionType == null) {
- //if it has not been set, the user use a programmatic way
- transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
- }
- defineTransactionType(
- preparedProperties.getProperty( HibernatePersistence.TRANSACTION_TYPE ),
- workingVars
- );
- boolean hasTxStrategy = StringHelper.isNotEmpty(
- preparedProperties.getProperty( Environment.TRANSACTION_STRATEGY )
- );
- if ( ! hasTxStrategy && transactionType == PersistenceUnitTransactionType.JTA ) {
- preparedProperties.setProperty(
- Environment.TRANSACTION_STRATEGY, JoinableCMTTransactionFactory.class.getName()
- );
- }
- else if ( ! hasTxStrategy && transactionType == PersistenceUnitTransactionType.RESOURCE_LOCAL ) {
- preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JDBCTransactionFactory.class.getName() );
- }
- if ( hasTxStrategy ) {
- log.warn(
- "Overriding " + Environment.TRANSACTION_STRATEGY + " is dangerous, this might break the EJB3 specification implementation"
- );
- }
- if ( preparedProperties.getProperty( Environment.FLUSH_BEFORE_COMPLETION ).equals( "true" ) ) {
- preparedProperties.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "false" );
- log.warn( "Defining " + Environment.FLUSH_BEFORE_COMPLETION + "=true ignored in HEM" );
- }
- return preparedProperties;
- }
-
- private Class classForName(String className) throws ClassNotFoundException {
- return ReflectHelper.classForName( className, this.getClass() );
- }
-
- private void setCacheStrategy(String propertyKey, Map properties, boolean isClass, Map workingVars) {
- String role = propertyKey.substring(
- ( isClass ? HibernatePersistence.CLASS_CACHE_PREFIX
- .length() : HibernatePersistence.COLLECTION_CACHE_PREFIX.length() )
- + 1
- );
- //dot size added
- String value = (String) properties.get( propertyKey );
- StringTokenizer params = new StringTokenizer( value, ";, " );
- if ( !params.hasMoreTokens() ) {
- StringBuilder error = new StringBuilder( "Illegal usage of " );
- error.append(
- isClass ? HibernatePersistence.CLASS_CACHE_PREFIX : HibernatePersistence.COLLECTION_CACHE_PREFIX
- );
- error.append( ": " ).append( propertyKey ).append( " " ).append( value );
- throw new PersistenceException( getExceptionHeader(workingVars) + error.toString() );
- }
- String usage = params.nextToken();
- String region = null;
- if ( params.hasMoreTokens() ) {
- region = params.nextToken();
- }
- if ( isClass ) {
- boolean lazyProperty = true;
- if ( params.hasMoreTokens() ) {
- lazyProperty = "all".equalsIgnoreCase( params.nextToken() );
- }
- cfg.setCacheConcurrencyStrategy( role, usage, region, lazyProperty );
- }
- else {
- cfg.setCollectionCacheConcurrencyStrategy( role, usage, region );
- }
- }
-
- private void addSecurity(List<String> keys, Map properties, Map workingVars) {
- log.debug( "Adding security" );
- if ( !properties.containsKey( HibernatePersistence.JACC_CONTEXT_ID ) ) {
- throw new PersistenceException( getExceptionHeader(workingVars) +
- "Entities have been configured for JACC, but "
- + HibernatePersistence.JACC_CONTEXT_ID
- + " has not been set"
- );
- }
- String contextId = (String) properties.get( HibernatePersistence.JACC_CONTEXT_ID );
- setProperty( Environment.JACC_CONTEXTID, contextId );
-
- int roleStart = HibernatePersistence.JACC_PREFIX.length() + 1;
-
- for ( String key : keys ) {
- JACCConfiguration jaccCfg = new JACCConfiguration( contextId );
- try {
- String role = key.substring( roleStart, key.indexOf( '.', roleStart ) );
- int classStart = roleStart + role.length() + 1;
- String clazz = key.substring( classStart, key.length() );
- String actions = (String) properties.get( key );
- jaccCfg.addPermission( role, clazz, actions );
- }
- catch (IndexOutOfBoundsException e) {
- throw new PersistenceException( getExceptionHeader(workingVars) +
- "Illegal usage of " + HibernatePersistence.JACC_PREFIX + ": " + key );
- }
- }
- }
-
- private void addNamedAnnotatedClasses(
- Ejb3Configuration cfg, Collection<String> classNames, Map workingVars
- ) {
- for ( String name : classNames ) {
- try {
- Class clazz = classForName( name );
- cfg.addAnnotatedClass( clazz );
- }
- catch (ClassNotFoundException cnfe) {
- Package pkg;
- try {
- pkg = classForName( name + ".package-info" ).getPackage();
- }
- catch (ClassNotFoundException e) {
- pkg = null;
- }
- if ( pkg == null ) {
- throw new PersistenceException( getExceptionHeader(workingVars) + "class or package not found", cnfe );
- }
- else {
- cfg.addPackage( name );
- }
- }
- }
- }
-
-
- public Settings buildSettings() throws HibernateException {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- return settingsFactory.buildSettings( cfg.getProperties() );
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public Ejb3Configuration addProperties(Properties props) {
- cfg.addProperties( props );
- return this;
- }
-
- public Ejb3Configuration addAnnotatedClass(Class persistentClass) throws MappingException {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- cfg.addAnnotatedClass( persistentClass );
- return this;
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public Ejb3Configuration configure(String resource) throws HibernateException {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- Properties properties = new Properties();
- properties.setProperty( HibernatePersistence.CFG_FILE, resource);
- configure( properties, new HashMap() );
- return this;
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public Ejb3Configuration addPackage(String packageName) throws MappingException {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- cfg.addPackage( packageName );
- return this;
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public Ejb3Configuration addFile(String xmlFile) throws MappingException {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- cfg.addFile( xmlFile );
- return this;
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public Ejb3Configuration addClass(Class persistentClass) throws MappingException {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- cfg.addClass( persistentClass );
- return this;
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public Ejb3Configuration addFile(File xmlFile) throws MappingException {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- cfg.addFile( xmlFile );
- return this;
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public void buildMappings() {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- cfg.buildMappings();
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public Iterator getClassMappings() {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- return cfg.getClassMappings();
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public EventListeners getEventListeners() {
- return cfg.getEventListeners();
- }
-
- SessionFactory buildSessionFactory() throws HibernateException {
- return cfg.buildSessionFactory();
- }
-
- public Iterator getTableMappings() {
- return cfg.getTableMappings();
- }
-
- public PersistentClass getClassMapping(String persistentClass) {
- return cfg.getClassMapping( persistentClass );
- }
-
- public org.hibernate.mapping.Collection getCollectionMapping(String role) {
- return cfg.getCollectionMapping( role );
- }
-
- public void setEntityResolver(EntityResolver entityResolver) {
- cfg.setEntityResolver( entityResolver );
- }
-
- public Map getNamedQueries() {
- return cfg.getNamedQueries();
- }
-
- public Interceptor getInterceptor() {
- return cfg.getInterceptor();
- }
-
- public Properties getProperties() {
- return cfg.getProperties();
- }
-
- public Ejb3Configuration setInterceptor(Interceptor interceptor) {
- cfg.setInterceptor( interceptor );
- return this;
- }
-
- public Ejb3Configuration setProperties(Properties properties) {
- cfg.setProperties( properties );
- return this;
- }
-
- public Map getFilterDefinitions() {
- return cfg.getFilterDefinitions();
- }
-
- public void addFilterDefinition(FilterDefinition definition) {
- cfg.addFilterDefinition( definition );
- }
-
- public void addAuxiliaryDatabaseObject(AuxiliaryDatabaseObject object) {
- cfg.addAuxiliaryDatabaseObject( object );
- }
-
- public NamingStrategy getNamingStrategy() {
- return cfg.getNamingStrategy();
- }
-
- public Ejb3Configuration setNamingStrategy(NamingStrategy namingStrategy) {
- cfg.setNamingStrategy( namingStrategy );
- return this;
- }
-
- public void setListeners(String type, String[] listenerClasses) {
- cfg.setListeners( type, listenerClasses );
- }
-
- public void setListeners(String type, Object[] listeners) {
- cfg.setListeners( type, listeners );
- }
-
- /**
- * This API is intended to give a read-only configuration.
- * It is sueful when working with SchemaExport or any Configuration based
- * tool.
- * DO NOT update configuration through it.
- */
- public AnnotationConfiguration getHibernateConfiguration() {
- //TODO make it really read only (maybe through proxying)
- return cfg;
- }
-
- public Ejb3Configuration addInputStream(InputStream xmlInputStream) throws MappingException {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- cfg.addInputStream( xmlInputStream );
- return this;
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public Ejb3Configuration addResource(String path) throws MappingException {
- Thread thread = null;
- ClassLoader contextClassLoader = null;
- if (overridenClassLoader != null) {
- thread = Thread.currentThread();
- contextClassLoader = thread.getContextClassLoader();
- thread.setContextClassLoader( overridenClassLoader );
- }
- try {
- cfg.addResource( path );
- return this;
- }
- finally {
- if (thread != null) thread.setContextClassLoader( contextClassLoader );
- }
- }
-
- public Ejb3Configuration addResource(String path, ClassLoader classLoader) throws MappingException {
- cfg.addResource( path, classLoader );
- return this;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3Configuration.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3Configuration.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3Configuration.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3Configuration.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,1412 @@
+//$Id$
+package org.hibernate.ejb;
+
+import java.io.BufferedInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+import java.util.StringTokenizer;
+import javax.naming.BinaryRefAddr;
+import javax.naming.NamingException;
+import javax.naming.Reference;
+import javax.naming.Referenceable;
+import javax.persistence.Embeddable;
+import javax.persistence.Entity;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.EntityNotFoundException;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.PersistenceException;
+import javax.persistence.spi.PersistenceUnitInfo;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+import javax.sql.DataSource;
+
+import javassist.bytecode.AnnotationsAttribute;
+import javassist.bytecode.ClassFile;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.dom4j.DocumentException;
+import org.dom4j.Element;
+import org.dom4j.io.SAXReader;
+import org.hibernate.HibernateException;
+import org.hibernate.Interceptor;
+import org.hibernate.MappingException;
+import org.hibernate.MappingNotFoundException;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.cfg.NamingStrategy;
+import org.hibernate.cfg.Settings;
+import org.hibernate.cfg.SettingsFactory;
+import org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider;
+import org.hibernate.ejb.instrument.InterceptFieldClassFileTransformer;
+import org.hibernate.ejb.packaging.JarVisitor;
+import org.hibernate.ejb.packaging.PersistenceMetadata;
+import org.hibernate.ejb.packaging.PersistenceXmlLoader;
+import org.hibernate.ejb.packaging.NamedInputStream;
+import org.hibernate.ejb.transaction.JoinableCMTTransactionFactory;
+import org.hibernate.ejb.util.ConfigurationHelper;
+import org.hibernate.ejb.util.LogHelper;
+import org.hibernate.ejb.util.NamingHelper;
+import org.hibernate.engine.FilterDefinition;
+import org.hibernate.event.EventListeners;
+import org.hibernate.mapping.AuxiliaryDatabaseObject;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.proxy.EntityNotFoundDelegate;
+import org.hibernate.cfg.annotations.reflection.XMLContext;
+import org.hibernate.secure.JACCConfiguration;
+import org.hibernate.transaction.JDBCTransactionFactory;
+import org.hibernate.util.CollectionHelper;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.util.StringHelper;
+import org.hibernate.util.XMLHelper;
+import org.jboss.util.file.ArchiveBrowser;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.SAXException;
+
+/**
+ * Allow a fine tuned configuration of an EJB 3.0 EntityManagerFactory
+ *
+ * A Ejb3Configuration object is only guaranteed to create one EntityManagerFactory.
+ * Multiple usage of #buildEntityManagerFactory() is not guaranteed.
+ *
+ * After #buildEntityManagerFactory() has been called, you no longer can change the configuration
+ * state (no class adding, no property change etc)
+ *
+ * When serialized / deserialized or retrieved from the JNDI, you no longer can change the
+ * configuration state (no class adding, no property change etc)
+ *
+ * Putting the configuration in the JNDI is an expensive operation that requires a partial
+ * serialization
+ *
+ * @author Emmanuel Bernard
+ */
+public class Ejb3Configuration implements Serializable, Referenceable {
+ private static final String IMPLEMENTATION_NAME = HibernatePersistence.class.getName();
+ private static final String META_INF_ORM_XML = "META-INF/orm.xml";
+ private static Log log = LogFactory.getLog( Ejb3Configuration.class );
+ private static EntityNotFoundDelegate ejb3EntityNotFoundDelegate = new Ejb3EntityNotFoundDelegate();
+ private static Configuration DEFAULT_CONFIGURATION = new AnnotationConfiguration();
+
+ private static class Ejb3EntityNotFoundDelegate implements EntityNotFoundDelegate, Serializable {
+ public void handleEntityNotFound(String entityName, Serializable id) {
+ throw new EntityNotFoundException("Unable to find " + entityName + " with id " + id);
+ }
+ }
+
+ static {
+ Version.touch();
+ }
+
+ private AnnotationConfiguration cfg;
+ private SettingsFactory settingsFactory;
+ //made transient and not restored in deserialization on purpose, should no longer be called after restoration
+ private transient EventListenerConfigurator listenerConfigurator;
+ private PersistenceUnitTransactionType transactionType;
+ private boolean discardOnClose;
+ //made transient and not restored in deserialization on purpose, should no longer be called after restoration
+ private transient ClassLoader overridenClassLoader;
+ private boolean isConfigurationProcessed = false;
+
+
+ public Ejb3Configuration() {
+ settingsFactory = new InjectionSettingsFactory();
+ cfg = new AnnotationConfiguration( settingsFactory );
+ cfg.setEntityNotFoundDelegate( ejb3EntityNotFoundDelegate );
+ listenerConfigurator = new EventListenerConfigurator( this );
+ }
+
+ /**
+ * Used to inject a datasource object as the connection provider.
+ * If used, be sure to <b>not override</b> the hibernate.connection.provider_class
+ * property
+ */
+ public void setDataSource(DataSource ds) {
+ if ( ds != null ) {
+ Map cpInjection = new HashMap();
+ cpInjection.put( "dataSource", ds );
+ ( (InjectionSettingsFactory) settingsFactory ).setConnectionProviderInjectionData( cpInjection );
+ this.setProperty( Environment.CONNECTION_PROVIDER, InjectedDataSourceConnectionProvider.class.getName() );
+ }
+ }
+
+ /**
+ * create a factory from a parsed persistence.xml
+ * Especially the scanning of classes and additional jars is done already at this point.
+ */
+ private Ejb3Configuration configure(PersistenceMetadata metadata, Map overrides) {
+ log.debug( "Creating Factory: " + metadata.getName() );
+
+ Map workingVars = new HashMap();
+ workingVars.put( HibernatePersistence.PERSISTENCE_UNIT_NAME, metadata.getName() );
+
+ if ( StringHelper.isNotEmpty( metadata.getJtaDatasource() ) ) {
+ this.setProperty( Environment.DATASOURCE, metadata.getJtaDatasource() );
+ }
+ else if ( StringHelper.isNotEmpty( metadata.getNonJtaDatasource() ) ) {
+ this.setProperty( Environment.DATASOURCE, metadata.getNonJtaDatasource() );
+ }
+ defineTransactionType( metadata.getTransactionType(), workingVars );
+ if ( metadata.getClasses().size() > 0 ) {
+ workingVars.put( HibernatePersistence.CLASS_NAMES, metadata.getClasses() );
+ }
+ if ( metadata.getPackages().size() > 0 ) {
+ workingVars.put( HibernatePersistence.PACKAGE_NAMES, metadata.getPackages() );
+ }
+ if ( metadata.getMappingFiles().size() > 0 ) {
+ workingVars.put( HibernatePersistence.XML_FILE_NAMES, metadata.getMappingFiles() );
+ }
+ if ( metadata.getHbmfiles().size() > 0 ) {
+ workingVars.put( HibernatePersistence.HBXML_FILES, metadata.getHbmfiles() );
+ }
+ Properties props = new Properties();
+ props.putAll( metadata.getProps() );
+ if ( overrides != null ) {
+ for ( Map.Entry entry : (Set<Map.Entry>) overrides.entrySet() ) {
+ Object value = entry.getValue();
+ props.put( entry.getKey(), value == null ? "" : value ); //alter null, not allowed in properties
+ }
+ }
+ configure( props, workingVars );
+ return this;
+ }
+
+ /**
+ * Build the configuration from an entity manager name and given the
+ * appropriate extra properties. Those properties override the one get through
+ * the peristence.xml file.
+ * If the persistence unit name is not found or does not match the Persistence Provider, null is returned
+ *
+ * @param persistenceUnitName persistence unit name
+ * @param integration properties passed to the persistence provider
+ * @return configured Ejb3Configuration or null if no persistence unit match
+ */
+ public Ejb3Configuration configure(String persistenceUnitName, Map integration) {
+ try {
+ log.debug( "Look up for persistence unit: " + persistenceUnitName );
+ integration = integration == null ?
+ CollectionHelper.EMPTY_MAP :
+ Collections.unmodifiableMap( integration );
+ Enumeration<URL> xmls = Thread.currentThread()
+ .getContextClassLoader()
+ .getResources( "META-INF/persistence.xml" );
+ if ( ! xmls.hasMoreElements() ) {
+ log.info( "Could not find any META-INF/persistence.xml file in the classpath");
+ }
+ while ( xmls.hasMoreElements() ) {
+ URL url = xmls.nextElement();
+ log.trace( "Analyse of persistence.xml: " + url );
+ List<PersistenceMetadata> metadataFiles = PersistenceXmlLoader.deploy(
+ url,
+ integration,
+ cfg.getEntityResolver(),
+ PersistenceUnitTransactionType.RESOURCE_LOCAL );
+ for ( PersistenceMetadata metadata : metadataFiles ) {
+ log.trace( metadata.toString() );
+
+ if ( metadata.getProvider() == null || IMPLEMENTATION_NAME.equalsIgnoreCase(
+ metadata.getProvider()
+ ) ) {
+ //correct provider
+
+ //lazy compute the visitor if possible to avoid useless exceptions if an unexpected state happens
+ JarVisitor visitor = null;
+
+ if ( metadata.getName() == null ) {
+ visitor = getMainJarVisitor( url, metadata, integration );
+ metadata.setName( visitor.getUnqualifiedJarName() );
+ }
+ if ( persistenceUnitName == null && xmls.hasMoreElements() ) {
+ throw new PersistenceException( "No name provided and several persistence units found" );
+ }
+ else if ( persistenceUnitName == null || metadata.getName().equals( persistenceUnitName ) ) {
+ if (visitor == null) visitor = getMainJarVisitor( url, metadata, integration );
+ addMetadataFromVisitor( visitor, metadata );
+ JarVisitor.Filter[] otherXmlFilter = getFilters( metadata, integration, false );
+ for ( String jarFile : metadata.getJarFiles() ) {
+ visitor = JarVisitor.getVisitor( jarFile, otherXmlFilter );
+ addMetadataFromVisitor( visitor, metadata );
+ }
+ return configure( metadata, integration );
+ }
+ }
+ }
+ }
+ return null;
+ }
+ catch (Exception e) {
+ if ( e instanceof PersistenceException) {
+ throw (PersistenceException) e;
+ }
+ else {
+ throw new PersistenceException( e );
+ }
+ }
+ }
+
+ private JarVisitor getMainJarVisitor(URL url, PersistenceMetadata metadata, Map integration) {
+ URL jarURL = JarVisitor.getJarURLFromURLEntry( url, "/META-INF/persistence.xml" );
+ JarVisitor.Filter[] persistenceXmlFilter = getFilters( metadata, integration, metadata.getExcludeUnlistedClasses() );
+ JarVisitor visitor = JarVisitor.getVisitor( jarURL, persistenceXmlFilter );
+ return visitor;
+ }
+
+ private static void addMetadataFromVisitor(JarVisitor visitor, PersistenceMetadata metadata) throws IOException {
+ Set[] entries = visitor.getMatchingEntries();
+ JarVisitor.Filter[] filters = visitor.getFilters();
+ int size = filters.length;
+ List<String> classes = metadata.getClasses();
+ List<String> packages = metadata.getPackages();
+ List<NamedInputStream> hbmFiles = metadata.getHbmfiles();
+ for ( int index = 0; index < size ; index++ ) {
+ Iterator homogeneousEntry = entries[index].iterator();
+ while ( homogeneousEntry.hasNext() ) {
+ JarVisitor.Entry entry = (JarVisitor.Entry) homogeneousEntry.next();
+ if ( filters[index] instanceof JarVisitor.ClassFilter ) {
+ //TODO only add entry if there is annotations (Javassist)
+ classes.add( entry.getName() );
+ }
+ else if ( filters[index] instanceof JarVisitor.PackageFilter ) {
+ packages.add( entry.getName() );
+ }
+ else if ( filters[index] instanceof JarVisitor.FileFilter ) {
+ hbmFiles.add( new NamedInputStream( entry.getName(), entry.getInputStream() ) );
+ metadata.getMappingFiles().remove( entry.getName() );
+ }
+ }
+ }
+ }
+
+ /**
+ * Process configuration from a PersistenceUnitInfo object
+ * Typically called by the container
+ */
+ public Ejb3Configuration configure(PersistenceUnitInfo info, Map integration) {
+ if ( log.isDebugEnabled() ) {
+ log.debug( "Processing " + LogHelper.logPersistenceUnitInfo( info ) );
+ }
+ else {
+ log.info( "Processing PersistenceUnitInfo [\n\tname: " + info.getPersistenceUnitName() + "\n\t...]" );
+ }
+
+ integration = integration != null ? Collections.unmodifiableMap( integration ) : CollectionHelper.EMPTY_MAP;
+ String provider = (String) integration.get( HibernatePersistence.PROVIDER );
+ if ( provider == null ) provider = info.getPersistenceProviderClassName();
+ if ( provider != null && ! provider.trim().startsWith( IMPLEMENTATION_NAME ) ) {
+ log.info( "Required a different provider: " + provider );
+ return null;
+ }
+ if ( info.getClassLoader() == null ) {
+ throw new IllegalStateException(
+ "[PersistenceUnit: " + info.getPersistenceUnitName() == null ? "" : info.getPersistenceUnitName()
+ + "] " + "PersistenceUnitInfo.getClassLoader() id null" );
+ }
+ //set the classloader
+ Thread thread = Thread.currentThread();
+ ClassLoader contextClassLoader = thread.getContextClassLoader();
+ boolean sameClassLoader = info.getClassLoader().equals( contextClassLoader );
+ if ( ! sameClassLoader ) {
+ overridenClassLoader = info.getClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ else {
+ overridenClassLoader = null;
+ }
+
+ try {
+ Map workingVars = new HashMap();
+ workingVars.put( HibernatePersistence.PERSISTENCE_UNIT_NAME, info.getPersistenceUnitName() );
+ List<String> entities = new ArrayList<String>( 50 );
+ if ( info.getManagedClassNames() != null ) entities.addAll( info.getManagedClassNames() );
+ List<NamedInputStream> hbmFiles = new ArrayList<NamedInputStream>();
+ List<String> packages = new ArrayList<String>();
+ List<String> xmlFiles = new ArrayList<String>( 50 );
+ if ( info.getMappingFileNames() != null ) xmlFiles.addAll( info.getMappingFileNames() );
+ //Should always be true if the container is not dump
+ boolean searchForORMFiles = ! xmlFiles.contains( META_INF_ORM_XML );
+
+ boolean[] detectArtifactForOtherJars = getDetectedArtifacts( info.getProperties(), null, false );
+ boolean[] detectArtifactForMainJar = getDetectedArtifacts( info.getProperties(), null, info.excludeUnlistedClasses() );
+ for ( URL jar : info.getJarFileUrls() ) {
+ if ( detectArtifactForOtherJars[0] ) scanForClasses( jar, packages, entities );
+ if ( detectArtifactForOtherJars[1] ) scanForXmlFiles( jar, hbmFiles, searchForORMFiles );
+ }
+ if ( detectArtifactForMainJar[0] ) scanForClasses( info.getPersistenceUnitRootUrl(), packages, entities );
+ if ( detectArtifactForMainJar[1] )
+ scanForXmlFiles( info.getPersistenceUnitRootUrl(), hbmFiles, searchForORMFiles );
+
+ Properties properties = info.getProperties() != null ?
+ info.getProperties() :
+ new Properties();
+ ConfigurationHelper.overrideProperties( properties, integration );
+
+ //FIXME entities is used to enhance classes and to collect annotated entities this should not be mixed
+ //fill up entities with the on found in xml files
+ addXMLEntities( xmlFiles, info, entities );
+
+ //FIXME send the appropriate entites.
+ if ( "true".equalsIgnoreCase( properties.getProperty( HibernatePersistence.USE_CLASS_ENHANCER ) ) ) {
+ info.addTransformer( new InterceptFieldClassFileTransformer( entities ) );
+ }
+
+ workingVars.put( HibernatePersistence.CLASS_NAMES, entities );
+ workingVars.put( HibernatePersistence.PACKAGE_NAMES, packages );
+ workingVars.put( HibernatePersistence.XML_FILE_NAMES, xmlFiles );
+ if ( hbmFiles.size() > 0 ) workingVars.put( HibernatePersistence.HBXML_FILES, hbmFiles );
+
+ //datasources
+ Boolean isJTA = null;
+ boolean overridenDatasource = false;
+ if ( integration.containsKey( HibernatePersistence.JTA_DATASOURCE ) ) {
+ String dataSource = (String) integration.get( HibernatePersistence.JTA_DATASOURCE );
+ overridenDatasource = true;
+ properties.setProperty( Environment.DATASOURCE, dataSource );
+ isJTA = Boolean.TRUE;
+ }
+ if ( integration.containsKey( HibernatePersistence.NON_JTA_DATASOURCE ) ) {
+ String dataSource = (String) integration.get( HibernatePersistence.NON_JTA_DATASOURCE );
+ overridenDatasource = true;
+ properties.setProperty( Environment.DATASOURCE, dataSource );
+ if (isJTA == null) isJTA = Boolean.FALSE;
+ }
+
+ if ( ! overridenDatasource && ( info.getJtaDataSource() != null || info.getNonJtaDataSource() != null ) ) {
+ isJTA = info.getJtaDataSource() != null ? Boolean.TRUE : Boolean.FALSE;
+ this.setDataSource(
+ isJTA ? info.getJtaDataSource() : info.getNonJtaDataSource()
+ );
+ this.setProperty(
+ Environment.CONNECTION_PROVIDER, InjectedDataSourceConnectionProvider.class.getName()
+ );
+ }
+ /*
+ * If explicit type => use it
+ * If a JTA DS is used => JTA transaction,
+ * if a non JTA DS is used => RESOURCe_LOCAL
+ * if none, set to JavaEE default => JTA transaction
+ */
+ PersistenceUnitTransactionType transactionType = info.getTransactionType();
+ if (transactionType == null) {
+ if (isJTA == Boolean.TRUE) {
+ transactionType = PersistenceUnitTransactionType.JTA;
+ }
+ else if ( isJTA == Boolean.FALSE ) {
+ transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
+ }
+ else {
+ transactionType = PersistenceUnitTransactionType.JTA;
+ }
+ }
+ defineTransactionType( transactionType, workingVars );
+ configure( properties, workingVars );
+ }
+ finally {
+ //After EMF, set the CCL back
+ if ( ! sameClassLoader ) {
+ thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+ return this;
+ }
+
+ private void addXMLEntities(List<String> xmlFiles, PersistenceUnitInfo info, List<String> entities) {
+ //TODO handle inputstream related hbm files
+ ClassLoader newTempClassLoader = info.getNewTempClassLoader();
+ if (newTempClassLoader == null) {
+ log.warn( "Persistence provider caller does not implements the EJB3 spec correctly. PersistenceUnitInfo.getNewTempClassLoader() is null." );
+ return;
+ }
+ XMLHelper xmlHelper = new XMLHelper();
+ List errors = new ArrayList();
+ SAXReader saxReader = xmlHelper.createSAXReader( "XML InputStream", errors, cfg.getEntityResolver() );
+ try {
+ saxReader.setFeature( "http://apache.org/xml/features/validation/schema", true );
+ //saxReader.setFeature( "http://apache.org/xml/features/validation/dynamic", true );
+ //set the default schema locators
+ saxReader.setProperty( "http://apache.org/xml/properties/schema/external-schemaLocation",
+ "http://java.sun.com/xml/ns/persistence/orm orm_1_0.xsd");
+ }
+ catch (SAXException e) {
+ saxReader.setValidation( false );
+ }
+
+ for ( String xmlFile : xmlFiles ) {
+
+ InputStream resourceAsStream = newTempClassLoader.getResourceAsStream( xmlFile );
+ if (resourceAsStream == null) continue;
+ BufferedInputStream is = new BufferedInputStream( resourceAsStream );
+ try {
+ errors.clear();
+ org.dom4j.Document doc = saxReader.read( is );
+ if ( errors.size() != 0 ) {
+ throw new MappingException( "invalid mapping: " + xmlFile, (Throwable) errors.get( 0 ) );
+ }
+ Element rootElement = doc.getRootElement();
+ if ( rootElement != null && "entity-mappings".equals( rootElement.getName() ) ) {
+ Element element = rootElement.element( "package" );
+ String defaultPackage = element != null ? element.getTextTrim() : null;
+ List<Element> elements = rootElement.elements( "entity" );
+ for (Element subelement : elements ) {
+ String classname = XMLContext.buildSafeClassName( subelement.attributeValue( "class" ), defaultPackage );
+ if ( ! entities.contains( classname ) ) {
+ entities.add( classname );
+ }
+ }
+ elements = rootElement.elements( "mapped-superclass" );
+ for (Element subelement : elements ) {
+ String classname = XMLContext.buildSafeClassName( subelement.attributeValue( "class" ), defaultPackage );
+ if ( ! entities.contains( classname ) ) {
+ entities.add( classname );
+ }
+ }
+ elements = rootElement.elements( "embeddable" );
+ for (Element subelement : elements ) {
+ String classname = XMLContext.buildSafeClassName( subelement.attributeValue( "class" ), defaultPackage );
+ if ( ! entities.contains( classname ) ) {
+ entities.add( classname );
+ }
+ }
+ }
+ else if ( rootElement != null && "hibernate-mappings".equals( rootElement.getName() ) ) {
+ //FIXME include hbm xml entities to enhance them but entities is also used to collect annotated entities
+ }
+ }
+ catch (DocumentException e) {
+ throw new MappingException( "Could not parse mapping document in input stream", e );
+ }
+ finally {
+ try {
+ is.close();
+ }
+ catch (IOException ioe) {
+ log.warn( "Could not close input stream", ioe );
+ }
+ }
+ }
+ }
+
+ private void defineTransactionType(Object overridenTxType, Map workingVars) {
+ if ( overridenTxType == null ) {
+// if ( transactionType == null ) {
+// transactionType = PersistenceUnitTransactionType.JTA; //this is the default value
+// }
+ //nothing to override
+ }
+ else if ( overridenTxType instanceof String ) {
+ transactionType = PersistenceXmlLoader.getTransactionType( (String) overridenTxType );
+ }
+ else if ( overridenTxType instanceof PersistenceUnitTransactionType ) {
+ transactionType = (PersistenceUnitTransactionType) overridenTxType;
+ }
+ else {
+ throw new PersistenceException( getExceptionHeader( workingVars ) +
+ HibernatePersistence.TRANSACTION_TYPE + " of the wrong class type"
+ + ": " + overridenTxType.getClass()
+ );
+ }
+
+ }
+
+ public Ejb3Configuration setProperty(String key, String value) {
+ cfg.setProperty( key, value );
+ return this;
+ }
+
+ private boolean[] getDetectedArtifacts(Properties properties, Map overridenProperties, boolean excludeIfNotOverriden) {
+ boolean[] result = new boolean[2];
+ result[0] = false; //detect classes
+ result[1] = false; //detect hbm
+ String detect = overridenProperties != null ?
+ (String) overridenProperties.get( HibernatePersistence.AUTODETECTION ) :
+ null;
+ detect = detect == null ?
+ properties.getProperty( HibernatePersistence.AUTODETECTION) :
+ detect;
+ if (detect == null && excludeIfNotOverriden) {
+ //not overriden through HibernatePersistence.AUTODETECTION so we comply with the spec excludeUnlistedClasses
+ return result;
+ }
+ else if (detect == null){
+ detect = "class,hbm";
+ }
+ StringTokenizer st = new StringTokenizer( detect, ", ", false );
+ while ( st.hasMoreElements() ) {
+ String element = (String) st.nextElement();
+ if ( "class".equalsIgnoreCase( element ) ) result[0] = true;
+ if ( "hbm".equalsIgnoreCase( element ) ) result[1] = true;
+ }
+ log.debug( "Detect class: " + result[0] + "; detect hbm: " + result[1] );
+ return result;
+ }
+
+ private JarVisitor.Filter[] getFilters(PersistenceMetadata metadata, Map overridenProperties, boolean excludeIfNotOverriden) {
+ Properties properties = metadata.getProps();
+ final List<String> mappingFiles = metadata.getMappingFiles();
+ boolean[] result = getDetectedArtifacts( properties, overridenProperties, excludeIfNotOverriden );
+
+ int size = ( result[0] ? 2 : 0 ) + 1; //class involves classes and packages, xml files are always involved because of orm.xml
+ JarVisitor.Filter[] filters = new JarVisitor.Filter[size];
+ if ( result[0] ) {
+ filters[0] = new JarVisitor.PackageFilter( false, null ) {
+ public boolean accept(String javaElementName) {
+ return true;
+ }
+ };
+ filters[1] = new JarVisitor.ClassFilter(
+ false, new Class[]{
+ Entity.class,
+ MappedSuperclass.class,
+ Embeddable.class}
+ ) {
+ public boolean accept(String javaElementName) {
+ return true;
+ }
+ };
+ }
+ if ( result[1] ) {
+ filters[size - 1] = new JarVisitor.FileFilter( true ) {
+ public boolean accept(String javaElementName) {
+ return javaElementName.endsWith( "hbm.xml" )
+ || javaElementName.endsWith( META_INF_ORM_XML )
+ || mappingFiles.contains( javaElementName );
+ }
+ };
+ }
+ else {
+ filters[size - 1] = new JarVisitor.FileFilter( true ) {
+ public boolean accept(String javaElementName) {
+ return javaElementName.endsWith( META_INF_ORM_XML )
+ || mappingFiles.contains( javaElementName );
+ }
+ };
+ }
+ return filters;
+ }
+
+ private void scanForXmlFiles(URL jar, List<NamedInputStream> hbmxmls, final boolean searchforORMFiles) {
+ Iterator it = ArchiveBrowser.getBrowser(
+ jar, new ArchiveBrowser.Filter() {
+ public boolean accept(String filename) {
+ return filename.endsWith( ".hbm.xml" )
+ || (searchforORMFiles && filename.endsWith( META_INF_ORM_XML ) )
+ ;
+ }
+ }
+ );
+
+ while ( it.hasNext() ) {
+ InputStream stream = (InputStream) it.next();
+ hbmxmls.add( new NamedInputStream("", stream) );
+ }
+ }
+
+ private void scanForClasses(URL jar, List<String> packages, List<String> entities) {
+ Iterator it = null;
+ try {
+ it = ArchiveBrowser.getBrowser(
+ jar, new ArchiveBrowser.Filter() {
+ public boolean accept(String filename) {
+ return filename.endsWith( ".class" );
+ }
+ }
+ );
+ }
+ catch (RuntimeException e) {
+ throw new RuntimeException( "error trying to scan <jar-file>: " + jar.toString(), e );
+ }
+
+ // need to look into every entry in the archive to see if anybody has tags
+ // defined.
+ while ( it.hasNext() ) {
+ InputStream stream = (InputStream) it.next();
+ DataInputStream dstream = new DataInputStream( new BufferedInputStream( stream ) );
+ ClassFile cf = null;
+ try {
+ try {
+ cf = new ClassFile( dstream );
+ }
+ finally {
+ dstream.close();
+ stream.close();
+ }
+ }
+ catch (IOException e) {
+ throw new RuntimeException( e );
+ }
+ if ( cf.getName().endsWith( ".package-info" ) ) {
+ int idx = cf.getName().indexOf( ".package-info" );
+ String pkgName = cf.getName().substring( 0, idx );
+ log.info( "found package: " + pkgName );
+ packages.add( pkgName );
+ continue;
+ }
+
+ AnnotationsAttribute visible = (AnnotationsAttribute) cf.getAttribute( AnnotationsAttribute.visibleTag );
+ if ( visible != null ) {
+ boolean isEntity = visible.getAnnotation( Entity.class.getName() ) != null;
+ if ( isEntity ) {
+ log.info( "found EJB3 Entity bean: " + cf.getName() );
+ entities.add( cf.getName() );
+ }
+ boolean isEmbeddable = visible.getAnnotation( Embeddable.class.getName() ) != null;
+ if ( isEmbeddable ) {
+ log.info( "found EJB3 @Embeddable: " + cf.getName() );
+ entities.add( cf.getName() );
+ }
+ boolean isEmbeddableSuperclass = visible.getAnnotation( MappedSuperclass.class.getName() ) != null;
+ if ( isEmbeddableSuperclass ) {
+ log.info( "found EJB3 @MappedSuperclass: " + cf.getName() );
+ entities.add( cf.getName() );
+ }
+ }
+ }
+ }
+
+ /**
+ * create a factory from a list of properties and
+ * HibernatePersistence.CLASS_NAMES -> Collection<String> (use to list the classes from config files
+ * HibernatePersistence.PACKAGE_NAMES -> Collection<String> (use to list the mappings from config files
+ * HibernatePersistence.HBXML_FILES -> Collection<InputStream> (input streams of hbm files)
+ * HibernatePersistence.LOADED_CLASSES -> Collection<Class> (list of loaded classes)
+ * <p/>
+ * <b>Used by JBoss AS only</b>
+ * @deprecated use the Java Persistence API
+ */
+ // This is used directly by JBoss so don't remove until further notice. bill at jboss.org
+ public EntityManagerFactory createEntityManagerFactory(Map workingVars) {
+ Properties props = new Properties();
+ if ( workingVars != null ) {
+ props.putAll( workingVars );
+ //remove huge non String elements for a clean props
+ props.remove( HibernatePersistence.CLASS_NAMES );
+ props.remove( HibernatePersistence.PACKAGE_NAMES );
+ props.remove( HibernatePersistence.HBXML_FILES );
+ props.remove( HibernatePersistence.LOADED_CLASSES );
+ }
+ configure( props, workingVars );
+ return buildEntityManagerFactory();
+ }
+
+ /**
+ * Process configuration and build an EntityManagerFactory <b>when</b> the configuration is ready
+ * @deprecated
+ */
+ public EntityManagerFactory createEntityManagerFactory() {
+ configure( cfg.getProperties(), new HashMap() );
+ return buildEntityManagerFactory();
+ }
+
+ public EntityManagerFactory buildEntityManagerFactory() {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ configure( (Properties)null, null );
+ NamingHelper.bind(this);
+ return new EntityManagerFactoryImpl(
+ cfg.buildSessionFactory(),
+ transactionType,
+ discardOnClose
+ );
+ }
+ catch (HibernateException e) {
+ throw new PersistenceException( e );
+ }
+ finally {
+ if (thread != null) {
+ thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+ }
+
+ public Reference getReference() throws NamingException {
+ log.debug("Returning a Reference to the Ejb3Configuration");
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ ObjectOutput out = null;
+ byte[] serialized;
+ try {
+ out = new ObjectOutputStream( stream );
+ out.writeObject( this );
+ out.close();
+ serialized = stream.toByteArray();
+ stream.close();
+ }
+ catch (IOException e) {
+ NamingException namingException = new NamingException( "Unable to serialize Ejb3Configuration" );
+ namingException.setRootCause( e );
+ throw namingException;
+ }
+
+ return new Reference(
+ Ejb3Configuration.class.getName(),
+ new BinaryRefAddr("object", serialized ),
+ Ejb3ConfigurationObjectFactory.class.getName(),
+ null
+ );
+ }
+
+ /**
+ * create a factory from a canonical workingVars map and the overriden properties
+ *
+ */
+ private Ejb3Configuration configure(
+ Properties properties, Map workingVars
+ ) {
+ //TODO check for people calling more than once this method (except buildEMF)
+ if (isConfigurationProcessed) return this;
+ isConfigurationProcessed = true;
+ Properties preparedProperties = prepareProperties( properties, workingVars );
+ if ( workingVars == null ) workingVars = CollectionHelper.EMPTY_MAP;
+
+ if ( preparedProperties.containsKey( HibernatePersistence.CFG_FILE ) ) {
+ String cfgFileName = preparedProperties.getProperty( HibernatePersistence.CFG_FILE );
+ cfg.configure( cfgFileName );
+ }
+
+ cfg.addProperties( preparedProperties ); //persistence.xml has priority over hibernate.Cfg.xml
+
+ addClassesToSessionFactory( workingVars );
+
+ //processes specific properties
+ List<String> jaccKeys = new ArrayList<String>();
+
+
+ Interceptor defaultInterceptor = DEFAULT_CONFIGURATION.getInterceptor();
+ NamingStrategy defaultNamingStrategy = DEFAULT_CONFIGURATION.getNamingStrategy();
+
+ Iterator propertyIt = preparedProperties.keySet().iterator();
+ while ( propertyIt.hasNext() ) {
+ Object uncastObject = propertyIt.next();
+ //had to be safe
+ if ( uncastObject != null && uncastObject instanceof String ) {
+ String propertyKey = (String) uncastObject;
+ if ( propertyKey.startsWith( HibernatePersistence.CLASS_CACHE_PREFIX ) ) {
+ setCacheStrategy( propertyKey, preparedProperties, true, workingVars );
+ }
+ else if ( propertyKey.startsWith( HibernatePersistence.COLLECTION_CACHE_PREFIX ) ) {
+ setCacheStrategy( propertyKey, preparedProperties, false, workingVars );
+ }
+ else if ( propertyKey.startsWith( HibernatePersistence.JACC_PREFIX )
+ && ! ( propertyKey.equals( HibernatePersistence.JACC_CONTEXT_ID )
+ || propertyKey.equals( HibernatePersistence.JACC_ENABLED ) ) ) {
+ jaccKeys.add( propertyKey );
+ }
+ }
+ }
+ if ( preparedProperties.containsKey( HibernatePersistence.INTERCEPTOR )
+ && ( cfg.getInterceptor() == null
+ || cfg.getInterceptor().equals( defaultInterceptor ) ) ) {
+ //cfg.setInterceptor has precedence over configuration file
+ String interceptorName = preparedProperties.getProperty( HibernatePersistence.INTERCEPTOR );
+ try {
+ Class interceptor = classForName( interceptorName );
+ cfg.setInterceptor( (Interceptor) interceptor.newInstance() );
+ }
+ catch (ClassNotFoundException e) {
+ throw new PersistenceException(
+ getExceptionHeader(workingVars) + "Unable to find interceptor class: " + interceptorName, e
+ );
+ }
+ catch (IllegalAccessException e) {
+ throw new PersistenceException(
+ getExceptionHeader(workingVars) + "Unable to access interceptor class: " + interceptorName, e
+ );
+ }
+ catch (InstantiationException e) {
+ throw new PersistenceException(
+ getExceptionHeader(workingVars) + "Unable to instanciate interceptor class: " + interceptorName, e
+ );
+ }
+ catch (ClassCastException e) {
+ throw new PersistenceException(
+ getExceptionHeader(workingVars) + "Interceptor class does not implement Interceptor interface: " + interceptorName, e
+ );
+ }
+ }
+ if ( preparedProperties.containsKey( HibernatePersistence.NAMING_STRATEGY )
+ && ( cfg.getNamingStrategy() == null
+ || cfg.getNamingStrategy().equals( defaultNamingStrategy ) ) ) {
+ //cfg.setNamingStrategy has precedence over configuration file
+ String namingStrategyName = preparedProperties.getProperty( HibernatePersistence.NAMING_STRATEGY );
+ try {
+ Class namingStragegy = classForName( namingStrategyName );
+ cfg.setNamingStrategy( (NamingStrategy) namingStragegy.newInstance() );
+ }
+ catch (ClassNotFoundException e) {
+ throw new PersistenceException(
+ getExceptionHeader(workingVars) + "Unable to find naming strategy class: " + namingStrategyName, e
+ );
+ }
+ catch (IllegalAccessException e) {
+ throw new PersistenceException(
+ getExceptionHeader(workingVars) + "Unable to access naming strategy class: " + namingStrategyName, e
+ );
+ }
+ catch (InstantiationException e) {
+ throw new PersistenceException(
+ getExceptionHeader(workingVars) + "Unable to instanciate naming strategy class: " + namingStrategyName, e
+ );
+ }
+ catch (ClassCastException e) {
+ throw new PersistenceException(
+ getExceptionHeader(workingVars) + "Naming strategyy class does not implement NmaingStrategy interface: " + namingStrategyName,
+ e
+ );
+ }
+ }
+
+ if ( jaccKeys.size() > 0 ) {
+ addSecurity( jaccKeys, preparedProperties, workingVars );
+ }
+
+ //initialize listeners
+ listenerConfigurator.setProperties( preparedProperties );
+ listenerConfigurator.configure();
+
+ //some spec compliance checking
+ //TODO centralize that?
+ if ( ! "true".equalsIgnoreCase( cfg.getProperty( Environment.AUTOCOMMIT ) ) ) {
+ log.warn( Environment.AUTOCOMMIT + " = false break the EJB3 specification" );
+ }
+ discardOnClose = preparedProperties.getProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE )
+ .equals( "true" );
+ return this;
+ }
+
+ private void addClassesToSessionFactory(Map workingVars) {
+ if ( workingVars.containsKey( HibernatePersistence.CLASS_NAMES ) ) {
+ Collection<String> classNames = (Collection<String>) workingVars.get(
+ HibernatePersistence.CLASS_NAMES
+ );
+ addNamedAnnotatedClasses( this, classNames, workingVars );
+ }
+ //TODO apparently only used for Tests, get rid of it?
+ if ( workingVars.containsKey( HibernatePersistence.LOADED_CLASSES ) ) {
+ Collection<Class> classes = (Collection<Class>) workingVars.get( HibernatePersistence.LOADED_CLASSES );
+ for ( Class clazz : classes ) {
+ cfg.addAnnotatedClass( clazz );
+ }
+ }
+ if ( workingVars.containsKey( HibernatePersistence.PACKAGE_NAMES ) ) {
+ Collection<String> packages = (Collection<String>) workingVars.get(
+ HibernatePersistence.PACKAGE_NAMES
+ );
+ for ( String pkg : packages ) {
+ cfg.addPackage( pkg );
+ }
+ }
+ if ( workingVars.containsKey( HibernatePersistence.XML_FILE_NAMES ) ) {
+ Collection<String> xmlFiles = (Collection<String>) workingVars.get(
+ HibernatePersistence.XML_FILE_NAMES
+ );
+ for ( String xmlFile : xmlFiles ) {
+ Boolean useMetaInf = null;
+ try {
+ if ( xmlFile.endsWith( META_INF_ORM_XML ) ) useMetaInf = true;
+ cfg.addResource( xmlFile );
+ }
+ catch( MappingNotFoundException e ) {
+ if ( ! xmlFile.endsWith( META_INF_ORM_XML ) ) {
+ throw new PersistenceException( getExceptionHeader(workingVars)
+ + "Unable to find XML mapping file in classpath: " + xmlFile);
+ }
+ else {
+ useMetaInf = false;
+ //swallow it, the META-INF/orm.xml is optional
+ }
+ }
+ catch( MappingException me ) {
+ throw new PersistenceException( getExceptionHeader(workingVars)
+ + "Error while reading JPA XML file: " + xmlFile, me);
+ }
+ if ( log.isInfoEnabled() ) {
+ if ( Boolean.TRUE.equals( useMetaInf ) ) {
+ log.info( getExceptionHeader( workingVars ) + META_INF_ORM_XML + " found");
+ }
+ else if (Boolean.FALSE.equals( useMetaInf ) ) {
+ log.info( getExceptionHeader( workingVars ) + "no " + META_INF_ORM_XML + " found");
+ }
+ }
+ }
+ }
+ if ( workingVars.containsKey( HibernatePersistence.HBXML_FILES ) ) {
+ Collection<NamedInputStream> hbmXmlFiles = (Collection<NamedInputStream>) workingVars.get(
+ HibernatePersistence.HBXML_FILES
+ );
+ for ( NamedInputStream is : hbmXmlFiles ) {
+ try {
+ //addInputStream has the responsibility to close the stream
+ cfg.addInputStream( new BufferedInputStream( is.getStream() ) );
+ }
+ catch (MappingException me) {
+ //try our best to give the file name
+ if ( StringHelper.isEmpty( is.getName() ) ) {
+ throw me;
+ }
+ else {
+ throw new MappingException("Error while parsing file: " + is.getName(), me );
+ }
+ }
+ }
+ }
+ }
+
+ private String getExceptionHeader(Map workingVars) {
+ if ( workingVars != null ) {
+ String puName = (String) workingVars.get( HibernatePersistence.PERSISTENCE_UNIT_NAME);
+ puName = puName == null ? "" : puName;
+ String header = "[PersistenceUnit: " + puName + "] ";
+ return header;
+ }
+ else {
+ return "";
+ }
+ }
+
+ private Properties prepareProperties(Properties properties, Map workingVars) {
+ Properties preparedProperties = new Properties();
+
+ //defaults different to Hibernate
+ preparedProperties.setProperty( Environment.RELEASE_CONNECTIONS, "auto" );
+ preparedProperties.setProperty( Environment.JPAQL_STRICT_COMPLIANCE, "true" );
+ //settings that always apply to a compliant EJB3
+ preparedProperties.setProperty( Environment.AUTOCOMMIT, "true" );
+ preparedProperties.setProperty( Environment.USE_IDENTIFIER_ROLLBACK, "false" );
+ preparedProperties.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "false" );
+ preparedProperties.setProperty( HibernatePersistence.DISCARD_PC_ON_CLOSE, "false" );
+
+ //override the new defaults with the user defined ones
+ //copy programmatically defined properties
+ if ( cfg.getProperties() != null ) preparedProperties.putAll( cfg.getProperties() );
+ //copy them co;ing from configuration
+ if ( properties != null ) preparedProperties.putAll( properties );
+ //note we don't copy cfg.xml properties, since they have to be overriden
+
+ if (transactionType == null) {
+ //if it has not been set, the user use a programmatic way
+ transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
+ }
+ defineTransactionType(
+ preparedProperties.getProperty( HibernatePersistence.TRANSACTION_TYPE ),
+ workingVars
+ );
+ boolean hasTxStrategy = StringHelper.isNotEmpty(
+ preparedProperties.getProperty( Environment.TRANSACTION_STRATEGY )
+ );
+ if ( ! hasTxStrategy && transactionType == PersistenceUnitTransactionType.JTA ) {
+ preparedProperties.setProperty(
+ Environment.TRANSACTION_STRATEGY, JoinableCMTTransactionFactory.class.getName()
+ );
+ }
+ else if ( ! hasTxStrategy && transactionType == PersistenceUnitTransactionType.RESOURCE_LOCAL ) {
+ preparedProperties.setProperty( Environment.TRANSACTION_STRATEGY, JDBCTransactionFactory.class.getName() );
+ }
+ if ( hasTxStrategy ) {
+ log.warn(
+ "Overriding " + Environment.TRANSACTION_STRATEGY + " is dangerous, this might break the EJB3 specification implementation"
+ );
+ }
+ if ( preparedProperties.getProperty( Environment.FLUSH_BEFORE_COMPLETION ).equals( "true" ) ) {
+ preparedProperties.setProperty( Environment.FLUSH_BEFORE_COMPLETION, "false" );
+ log.warn( "Defining " + Environment.FLUSH_BEFORE_COMPLETION + "=true ignored in HEM" );
+ }
+ return preparedProperties;
+ }
+
+ private Class classForName(String className) throws ClassNotFoundException {
+ return ReflectHelper.classForName( className, this.getClass() );
+ }
+
+ private void setCacheStrategy(String propertyKey, Map properties, boolean isClass, Map workingVars) {
+ String role = propertyKey.substring(
+ ( isClass ? HibernatePersistence.CLASS_CACHE_PREFIX
+ .length() : HibernatePersistence.COLLECTION_CACHE_PREFIX.length() )
+ + 1
+ );
+ //dot size added
+ String value = (String) properties.get( propertyKey );
+ StringTokenizer params = new StringTokenizer( value, ";, " );
+ if ( !params.hasMoreTokens() ) {
+ StringBuilder error = new StringBuilder( "Illegal usage of " );
+ error.append(
+ isClass ? HibernatePersistence.CLASS_CACHE_PREFIX : HibernatePersistence.COLLECTION_CACHE_PREFIX
+ );
+ error.append( ": " ).append( propertyKey ).append( " " ).append( value );
+ throw new PersistenceException( getExceptionHeader(workingVars) + error.toString() );
+ }
+ String usage = params.nextToken();
+ String region = null;
+ if ( params.hasMoreTokens() ) {
+ region = params.nextToken();
+ }
+ if ( isClass ) {
+ boolean lazyProperty = true;
+ if ( params.hasMoreTokens() ) {
+ lazyProperty = "all".equalsIgnoreCase( params.nextToken() );
+ }
+ cfg.setCacheConcurrencyStrategy( role, usage, region, lazyProperty );
+ }
+ else {
+ cfg.setCollectionCacheConcurrencyStrategy( role, usage, region );
+ }
+ }
+
+ private void addSecurity(List<String> keys, Map properties, Map workingVars) {
+ log.debug( "Adding security" );
+ if ( !properties.containsKey( HibernatePersistence.JACC_CONTEXT_ID ) ) {
+ throw new PersistenceException( getExceptionHeader(workingVars) +
+ "Entities have been configured for JACC, but "
+ + HibernatePersistence.JACC_CONTEXT_ID
+ + " has not been set"
+ );
+ }
+ String contextId = (String) properties.get( HibernatePersistence.JACC_CONTEXT_ID );
+ setProperty( Environment.JACC_CONTEXTID, contextId );
+
+ int roleStart = HibernatePersistence.JACC_PREFIX.length() + 1;
+
+ for ( String key : keys ) {
+ JACCConfiguration jaccCfg = new JACCConfiguration( contextId );
+ try {
+ String role = key.substring( roleStart, key.indexOf( '.', roleStart ) );
+ int classStart = roleStart + role.length() + 1;
+ String clazz = key.substring( classStart, key.length() );
+ String actions = (String) properties.get( key );
+ jaccCfg.addPermission( role, clazz, actions );
+ }
+ catch (IndexOutOfBoundsException e) {
+ throw new PersistenceException( getExceptionHeader(workingVars) +
+ "Illegal usage of " + HibernatePersistence.JACC_PREFIX + ": " + key );
+ }
+ }
+ }
+
+ private void addNamedAnnotatedClasses(
+ Ejb3Configuration cfg, Collection<String> classNames, Map workingVars
+ ) {
+ for ( String name : classNames ) {
+ try {
+ Class clazz = classForName( name );
+ cfg.addAnnotatedClass( clazz );
+ }
+ catch (ClassNotFoundException cnfe) {
+ Package pkg;
+ try {
+ pkg = classForName( name + ".package-info" ).getPackage();
+ }
+ catch (ClassNotFoundException e) {
+ pkg = null;
+ }
+ if ( pkg == null ) {
+ throw new PersistenceException( getExceptionHeader(workingVars) + "class or package not found", cnfe );
+ }
+ else {
+ cfg.addPackage( name );
+ }
+ }
+ }
+ }
+
+
+ public Settings buildSettings() throws HibernateException {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ return settingsFactory.buildSettings( cfg.getProperties() );
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public Ejb3Configuration addProperties(Properties props) {
+ cfg.addProperties( props );
+ return this;
+ }
+
+ public Ejb3Configuration addAnnotatedClass(Class persistentClass) throws MappingException {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ cfg.addAnnotatedClass( persistentClass );
+ return this;
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public Ejb3Configuration configure(String resource) throws HibernateException {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ Properties properties = new Properties();
+ properties.setProperty( HibernatePersistence.CFG_FILE, resource);
+ configure( properties, new HashMap() );
+ return this;
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public Ejb3Configuration addPackage(String packageName) throws MappingException {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ cfg.addPackage( packageName );
+ return this;
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public Ejb3Configuration addFile(String xmlFile) throws MappingException {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ cfg.addFile( xmlFile );
+ return this;
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public Ejb3Configuration addClass(Class persistentClass) throws MappingException {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ cfg.addClass( persistentClass );
+ return this;
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public Ejb3Configuration addFile(File xmlFile) throws MappingException {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ cfg.addFile( xmlFile );
+ return this;
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public void buildMappings() {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ cfg.buildMappings();
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public Iterator getClassMappings() {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ return cfg.getClassMappings();
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public EventListeners getEventListeners() {
+ return cfg.getEventListeners();
+ }
+
+ SessionFactory buildSessionFactory() throws HibernateException {
+ return cfg.buildSessionFactory();
+ }
+
+ public Iterator getTableMappings() {
+ return cfg.getTableMappings();
+ }
+
+ public PersistentClass getClassMapping(String persistentClass) {
+ return cfg.getClassMapping( persistentClass );
+ }
+
+ public org.hibernate.mapping.Collection getCollectionMapping(String role) {
+ return cfg.getCollectionMapping( role );
+ }
+
+ public void setEntityResolver(EntityResolver entityResolver) {
+ cfg.setEntityResolver( entityResolver );
+ }
+
+ public Map getNamedQueries() {
+ return cfg.getNamedQueries();
+ }
+
+ public Interceptor getInterceptor() {
+ return cfg.getInterceptor();
+ }
+
+ public Properties getProperties() {
+ return cfg.getProperties();
+ }
+
+ public Ejb3Configuration setInterceptor(Interceptor interceptor) {
+ cfg.setInterceptor( interceptor );
+ return this;
+ }
+
+ public Ejb3Configuration setProperties(Properties properties) {
+ cfg.setProperties( properties );
+ return this;
+ }
+
+ public Map getFilterDefinitions() {
+ return cfg.getFilterDefinitions();
+ }
+
+ public void addFilterDefinition(FilterDefinition definition) {
+ cfg.addFilterDefinition( definition );
+ }
+
+ public void addAuxiliaryDatabaseObject(AuxiliaryDatabaseObject object) {
+ cfg.addAuxiliaryDatabaseObject( object );
+ }
+
+ public NamingStrategy getNamingStrategy() {
+ return cfg.getNamingStrategy();
+ }
+
+ public Ejb3Configuration setNamingStrategy(NamingStrategy namingStrategy) {
+ cfg.setNamingStrategy( namingStrategy );
+ return this;
+ }
+
+ public void setListeners(String type, String[] listenerClasses) {
+ cfg.setListeners( type, listenerClasses );
+ }
+
+ public void setListeners(String type, Object[] listeners) {
+ cfg.setListeners( type, listeners );
+ }
+
+ /**
+ * This API is intended to give a read-only configuration.
+ * It is sueful when working with SchemaExport or any Configuration based
+ * tool.
+ * DO NOT update configuration through it.
+ */
+ public AnnotationConfiguration getHibernateConfiguration() {
+ //TODO make it really read only (maybe through proxying)
+ return cfg;
+ }
+
+ public Ejb3Configuration addInputStream(InputStream xmlInputStream) throws MappingException {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ cfg.addInputStream( xmlInputStream );
+ return this;
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public Ejb3Configuration addResource(String path) throws MappingException {
+ Thread thread = null;
+ ClassLoader contextClassLoader = null;
+ if (overridenClassLoader != null) {
+ thread = Thread.currentThread();
+ contextClassLoader = thread.getContextClassLoader();
+ thread.setContextClassLoader( overridenClassLoader );
+ }
+ try {
+ cfg.addResource( path );
+ return this;
+ }
+ finally {
+ if (thread != null) thread.setContextClassLoader( contextClassLoader );
+ }
+ }
+
+ public Ejb3Configuration addResource(String path, ClassLoader classLoader) throws MappingException {
+ cfg.addResource( path, classLoader );
+ return this;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3ConfigurationObjectFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3ConfigurationObjectFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3ConfigurationObjectFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id: $
-package org.hibernate.ejb;
-
-import java.io.ByteArrayInputStream;
-import java.io.ObjectInputStream;
-import java.util.Hashtable;
-import javax.naming.Context;
-import javax.naming.Name;
-import javax.naming.Reference;
-import javax.naming.spi.ObjectFactory;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Ejb3ConfigurationObjectFactory implements ObjectFactory {
- public Object getObjectInstance(
- Object reference, Name name, Context nameCtx, Hashtable<?, ?> environment
- ) throws Exception {
- byte[] serialized = (byte[]) ( (Reference) reference ).get(0).getContent();
- ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
- ObjectInputStream in = new ObjectInputStream( byteIn );
- Ejb3Configuration cfg = (Ejb3Configuration) in.readObject();
- in.close();
- byteIn.close();
- return cfg;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3ConfigurationObjectFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3ConfigurationObjectFactory.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3ConfigurationObjectFactory.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Ejb3ConfigurationObjectFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id: $
+package org.hibernate.ejb;
+
+import java.io.ByteArrayInputStream;
+import java.io.ObjectInputStream;
+import java.util.Hashtable;
+import javax.naming.Context;
+import javax.naming.Name;
+import javax.naming.Reference;
+import javax.naming.spi.ObjectFactory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Ejb3ConfigurationObjectFactory implements ObjectFactory {
+ public Object getObjectInstance(
+ Object reference, Name name, Context nameCtx, Hashtable<?, ?> environment
+ ) throws Exception {
+ byte[] serialized = (byte[]) ( (Reference) reference ).get(0).getContent();
+ ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
+ ObjectInputStream in = new ObjectInputStream( byteIn );
+ Ejb3Configuration cfg = (Ejb3Configuration) in.readObject();
+ in.close();
+ byteIn.close();
+ return cfg;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,54 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import java.util.Map;
-import javax.persistence.EntityManager;
-import javax.persistence.PersistenceContextType;
-import javax.persistence.spi.PersistenceUnitTransactionType;
-
-import org.hibernate.SessionFactory;
-
-/**
- * @author Gavin King
- * @author Emmanuel Bernard
- */
-public class EntityManagerFactoryImpl implements HibernateEntityManagerFactory {
-
- private SessionFactory sessionFactory;
- private PersistenceUnitTransactionType transactionType;
- private boolean discardOnClose;
-
- public EntityManagerFactoryImpl(
- SessionFactory sessionFactory,
- PersistenceUnitTransactionType transactionType,
- boolean discardOnClose
- ) {
- this.sessionFactory = sessionFactory;
- this.transactionType = transactionType;
- this.discardOnClose = discardOnClose;
- }
-
- public EntityManager createEntityManager() {
- return createEntityManager( null );
- }
-
- public EntityManager createEntityManager(Map map) {
- //TODO support discardOnClose, persistencecontexttype?, interceptor,
- return new EntityManagerImpl(
- sessionFactory, PersistenceContextType.EXTENDED, transactionType, discardOnClose, map
- );
- }
-
- public void close() {
- sessionFactory.close();
- }
-
- public boolean isOpen() {
- return ! sessionFactory.isClosed();
- }
-
- public SessionFactory getSessionFactory() {
- return sessionFactory;
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerFactoryImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,54 @@
+//$Id$
+package org.hibernate.ejb;
+
+import java.util.Map;
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContextType;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+
+import org.hibernate.SessionFactory;
+
+/**
+ * @author Gavin King
+ * @author Emmanuel Bernard
+ */
+public class EntityManagerFactoryImpl implements HibernateEntityManagerFactory {
+
+ private SessionFactory sessionFactory;
+ private PersistenceUnitTransactionType transactionType;
+ private boolean discardOnClose;
+
+ public EntityManagerFactoryImpl(
+ SessionFactory sessionFactory,
+ PersistenceUnitTransactionType transactionType,
+ boolean discardOnClose
+ ) {
+ this.sessionFactory = sessionFactory;
+ this.transactionType = transactionType;
+ this.discardOnClose = discardOnClose;
+ }
+
+ public EntityManager createEntityManager() {
+ return createEntityManager( null );
+ }
+
+ public EntityManager createEntityManager(Map map) {
+ //TODO support discardOnClose, persistencecontexttype?, interceptor,
+ return new EntityManagerImpl(
+ sessionFactory, PersistenceContextType.EXTENDED, transactionType, discardOnClose, map
+ );
+ }
+
+ public void close() {
+ sessionFactory.close();
+ }
+
+ public boolean isOpen() {
+ return ! sessionFactory.isClosed();
+ }
+
+ public SessionFactory getSessionFactory() {
+ return sessionFactory;
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,103 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import java.util.Map;
-import javax.persistence.PersistenceContextType;
-import javax.persistence.spi.PersistenceUnitTransactionType;
-import javax.transaction.Synchronization;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.cfg.Environment;
-import org.hibernate.engine.SessionImplementor;
-
-/**
- * @author Gavin King
- */
-public class EntityManagerImpl extends AbstractEntityManagerImpl {
-
- private static Log log = LogFactory.getLog( EntityManagerImpl.class );
- protected Session session;
- protected SessionFactory sessionFactory;
- protected boolean open;
- protected boolean discardOnClose;
-
- public EntityManagerImpl(
- SessionFactory sessionFactory, PersistenceContextType pcType,
- PersistenceUnitTransactionType transactionType,
- boolean discardOnClose, Map properties
- ) {
- super( pcType, transactionType, properties );
- this.sessionFactory = sessionFactory;
- this.open = true;
- this.discardOnClose = discardOnClose;
- postInit();
- }
-
- public Session getSession() {
-
- if ( !open ) throw new IllegalStateException( "EntityManager is closed" );
- return getRawSession();
- }
-
- protected Session getRawSession() {
- if ( session == null ) {
- session = sessionFactory.openSession();
- if ( persistenceContextType == PersistenceContextType.TRANSACTION ) {
- ( (SessionImplementor) session ).setAutoClear( true );
- }
- }
- return session;
- }
-
- public void close() {
-
- if ( !open ) throw new IllegalStateException( "EntityManager is closed" );
- if ( !discardOnClose && isTransactionInProgress() ) {
- //delay the closing till the end of the enlisted transaction
- getSession().getTransaction().registerSynchronization(
- new Synchronization() {
- public void beforeCompletion() {
- //nothing to do
- }
-
- public void afterCompletion(int i) {
- if ( session != null ) {
- if ( session.isOpen() ) {
- log.debug( "Closing entity manager after transaction completion" );
- session.close();
- }
- else {
- log.warn( "Entity Manager closed by someone else ("
- + Environment.AUTO_CLOSE_SESSION
- + " must not be used)");
- }
- }
- //TODO session == null should not happen
- }
- }
- );
- }
- else {
- //close right now
- if ( session != null ) session.close();
- }
- open = false;
- }
-
- public boolean isOpen() {
- //adjustFlushMode(); //don't adjust, can't be done on closed EM
- try {
- if ( open ) getSession().isOpen(); //to force enlistment in tx
- return open;
- }
- catch (HibernateException he) {
- throwPersistenceException( he );
- return false;
- }
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerImpl.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerImpl.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EntityManagerImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,103 @@
+//$Id$
+package org.hibernate.ejb;
+
+import java.util.Map;
+import javax.persistence.PersistenceContextType;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+import javax.transaction.Synchronization;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Environment;
+import org.hibernate.engine.SessionImplementor;
+
+/**
+ * @author Gavin King
+ */
+public class EntityManagerImpl extends AbstractEntityManagerImpl {
+
+ private static Log log = LogFactory.getLog( EntityManagerImpl.class );
+ protected Session session;
+ protected SessionFactory sessionFactory;
+ protected boolean open;
+ protected boolean discardOnClose;
+
+ public EntityManagerImpl(
+ SessionFactory sessionFactory, PersistenceContextType pcType,
+ PersistenceUnitTransactionType transactionType,
+ boolean discardOnClose, Map properties
+ ) {
+ super( pcType, transactionType, properties );
+ this.sessionFactory = sessionFactory;
+ this.open = true;
+ this.discardOnClose = discardOnClose;
+ postInit();
+ }
+
+ public Session getSession() {
+
+ if ( !open ) throw new IllegalStateException( "EntityManager is closed" );
+ return getRawSession();
+ }
+
+ protected Session getRawSession() {
+ if ( session == null ) {
+ session = sessionFactory.openSession();
+ if ( persistenceContextType == PersistenceContextType.TRANSACTION ) {
+ ( (SessionImplementor) session ).setAutoClear( true );
+ }
+ }
+ return session;
+ }
+
+ public void close() {
+
+ if ( !open ) throw new IllegalStateException( "EntityManager is closed" );
+ if ( !discardOnClose && isTransactionInProgress() ) {
+ //delay the closing till the end of the enlisted transaction
+ getSession().getTransaction().registerSynchronization(
+ new Synchronization() {
+ public void beforeCompletion() {
+ //nothing to do
+ }
+
+ public void afterCompletion(int i) {
+ if ( session != null ) {
+ if ( session.isOpen() ) {
+ log.debug( "Closing entity manager after transaction completion" );
+ session.close();
+ }
+ else {
+ log.warn( "Entity Manager closed by someone else ("
+ + Environment.AUTO_CLOSE_SESSION
+ + " must not be used)");
+ }
+ }
+ //TODO session == null should not happen
+ }
+ }
+ );
+ }
+ else {
+ //close right now
+ if ( session != null ) session.close();
+ }
+ open = false;
+ }
+
+ public boolean isOpen() {
+ //adjustFlushMode(); //don't adjust, can't be done on closed EM
+ try {
+ if ( open ) getSession().isOpen(); //to force enlistment in tx
+ return open;
+ }
+ catch (HibernateException he) {
+ throwPersistenceException( he );
+ return false;
+ }
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,223 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import java.beans.BeanInfo;
-import java.beans.Introspector;
-import java.beans.PropertyDescriptor;
-import java.lang.reflect.Array;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import java.util.StringTokenizer;
-
-import org.hibernate.HibernateException;
-import org.hibernate.MappingException;
-import org.hibernate.ejb.event.CallbackHandlerConsumer;
-import org.hibernate.ejb.event.EJB3AutoFlushEventListener;
-import org.hibernate.ejb.event.EJB3DeleteEventListener;
-import org.hibernate.ejb.event.EJB3FlushEntityEventListener;
-import org.hibernate.ejb.event.EJB3FlushEventListener;
-import org.hibernate.ejb.event.EJB3MergeEventListener;
-import org.hibernate.ejb.event.EJB3PersistEventListener;
-import org.hibernate.ejb.event.EJB3PersistOnFlushEventListener;
-import org.hibernate.ejb.event.EJB3PostDeleteEventListener;
-import org.hibernate.ejb.event.EJB3PostInsertEventListener;
-import org.hibernate.ejb.event.EJB3PostLoadEventListener;
-import org.hibernate.ejb.event.EJB3PostUpdateEventListener;
-import org.hibernate.ejb.event.EJB3SaveEventListener;
-import org.hibernate.ejb.event.EJB3SaveOrUpdateEventListener;
-import org.hibernate.ejb.event.EntityCallbackHandler;
-import org.hibernate.event.AutoFlushEventListener;
-import org.hibernate.event.DeleteEventListener;
-import org.hibernate.event.EventListeners;
-import org.hibernate.event.FlushEntityEventListener;
-import org.hibernate.event.FlushEventListener;
-import org.hibernate.event.MergeEventListener;
-import org.hibernate.event.PersistEventListener;
-import org.hibernate.event.PostDeleteEventListener;
-import org.hibernate.event.PostInsertEventListener;
-import org.hibernate.event.PostLoadEventListener;
-import org.hibernate.event.PostUpdateEventListener;
-import org.hibernate.event.PreDeleteEventListener;
-import org.hibernate.event.PreInsertEventListener;
-import org.hibernate.event.PreLoadEventListener;
-import org.hibernate.event.PreUpdateEventListener;
-import org.hibernate.event.SaveOrUpdateEventListener;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.secure.JACCPreDeleteEventListener;
-import org.hibernate.secure.JACCPreInsertEventListener;
-import org.hibernate.secure.JACCPreLoadEventListener;
-import org.hibernate.secure.JACCPreUpdateEventListener;
-import org.hibernate.secure.JACCSecurityListener;
-import org.hibernate.validator.event.ValidateEventListener;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EventListenerConfigurator {
- private static final Object[] READER_METHOD_ARGS = new Object[0];
-
- private Ejb3Configuration configuration;
- private boolean isSecurity;
-
- public EventListenerConfigurator(Ejb3Configuration configuration) {
- this.configuration = configuration;
- EventListeners listenerConfig = configuration.getEventListeners();
-
- //Action event
- //EJB3-specific ops listeners
- listenerConfig.setFlushEventListeners( new FlushEventListener[]{EJB3FlushEventListener.INSTANCE} );
- //EJB3-specific ops listeners
- listenerConfig.setAutoFlushEventListeners( new AutoFlushEventListener[]{EJB3AutoFlushEventListener.INSTANCE} );
- listenerConfig.setDeleteEventListeners( new DeleteEventListener[]{new EJB3DeleteEventListener()} );
- listenerConfig.setFlushEntityEventListeners(
- new FlushEntityEventListener[]{new EJB3FlushEntityEventListener()}
- );
- listenerConfig.setMergeEventListeners( new MergeEventListener[]{new EJB3MergeEventListener()} );
- listenerConfig.setPersistEventListeners( new PersistEventListener[]{new EJB3PersistEventListener()} );
- listenerConfig.setPersistOnFlushEventListeners(
- new PersistEventListener[]{new EJB3PersistOnFlushEventListener()}
- );
- listenerConfig.setSaveEventListeners( new SaveOrUpdateEventListener[]{new EJB3SaveEventListener()} );
- listenerConfig.setSaveOrUpdateEventListeners(
- new SaveOrUpdateEventListener[]{new EJB3SaveOrUpdateEventListener()}
- );
-
- //Pre events
- listenerConfig.setPreInsertEventListeners(
- new PreInsertEventListener[]{
- new JACCPreInsertEventListener(),
- }
- );
- listenerConfig.setPreUpdateEventListeners(
- new PreUpdateEventListener[]{
- new JACCPreUpdateEventListener(),
- }
- );
- listenerConfig.setPreDeleteEventListeners(
- new PreDeleteEventListener[]{
- new JACCPreDeleteEventListener()
- }
- );
- listenerConfig.setPreLoadEventListeners(
- new PreLoadEventListener[]{
- new JACCPreLoadEventListener()
- }
- );
-
- //post events
- listenerConfig.setPostDeleteEventListeners(
- new PostDeleteEventListener[]{new EJB3PostDeleteEventListener()}
- );
- listenerConfig.setPostInsertEventListeners(
- new PostInsertEventListener[]{new EJB3PostInsertEventListener()}
- );
- listenerConfig.setPostLoadEventListeners(
- new PostLoadEventListener[]{new EJB3PostLoadEventListener()}
- );
- listenerConfig.setPostUpdateEventListeners(
- new PostUpdateEventListener[]{new EJB3PostUpdateEventListener()}
- );
- }
-
- public void setProperties(Properties properties) {
- if ( properties.containsKey( HibernatePersistence.JACC_ENABLED ) ) {
- isSecurity = true;
- }
- //override events if needed
- Enumeration<?> enumeration = properties.propertyNames();
- while ( enumeration.hasMoreElements() ) {
- String name = (String) enumeration.nextElement();
- if ( name.startsWith( HibernatePersistence.EVENT_LISTENER_PREFIX ) ) {
- String type = name.substring( HibernatePersistence.EVENT_LISTENER_PREFIX.length() + 1 );
- StringTokenizer st = new StringTokenizer( properties.getProperty( name ), " ,", false );
- List<String> listeners = new ArrayList<String>();
- while ( st.hasMoreElements() ) {
- listeners.add( (String) st.nextElement() );
- }
- configuration.setListeners( type, listeners.toArray( new String[ listeners.size() ] ) );
- }
- }
- }
-
- public void configure() {
- //TODO exclude pure hbm file classes?
- //TODO move it to each event listener initialize()?
- EntityCallbackHandler callbackHandler = new EntityCallbackHandler();
- configuration.buildMappings(); //needed to get all the classes
- Iterator classes = configuration.getClassMappings();
- ReflectionManager reflectionManager = configuration.getHibernateConfiguration().getReflectionManager();
- while ( classes.hasNext() ) {
- PersistentClass clazz = (PersistentClass) classes.next();
- if ( clazz.getClassName() != null ) {
- //we can have non java class persisted by hibernate
- try {
- callbackHandler.add( reflectionManager.classForName( clazz.getClassName(), this.getClass() ), reflectionManager );
- }
- catch (ClassNotFoundException e) {
- throw new MappingException("entity class not found: " + clazz.getNodeName(), e);
- }
- }
- }
-
- EventListeners listenerConfig = configuration.getEventListeners();
-
- BeanInfo beanInfo = null;
- try {
- beanInfo = Introspector.getBeanInfo( listenerConfig.getClass(), Object.class );
- PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
- try {
- for ( int i = 0, max = pds.length; i < max ; i++ ) {
- final Object listeners = pds[i].getReadMethod().invoke( listenerConfig, READER_METHOD_ARGS );
- if ( listeners == null ) {
- throw new HibernateException( "Listener [" + pds[i].getName() + "] was null" );
- }
- if ( listeners instanceof Object[] ) {
- int securityListenersNbr = 0;
- Object[] listenersArray = (Object[]) listeners;
- for ( Object listener : listenersArray ) {
- if ( listener != null && listener instanceof CallbackHandlerConsumer ) {
- ( (CallbackHandlerConsumer) listener ).setCallbackHandler( callbackHandler );
- }
- if ( listener != null && listener instanceof JACCSecurityListener ) {
- if ( !isSecurity ) {
- securityListenersNbr++;
- }
- }
- }
- if ( !isSecurity ) {
- Class clazz = pds[i].getReadMethod().getReturnType().getComponentType();
- Object newArray = Array.newInstance( clazz, listenersArray.length - securityListenersNbr );
- int index = 0;
- for ( Object listener : listenersArray ) {
- if ( ! ( listener != null && listener instanceof JACCSecurityListener ) ) {
- Array.set( newArray, index++, listener );
- }
- }
- pds[i].getWriteMethod().invoke( listenerConfig, newArray );
- }
- }
- }
- }
- catch (HibernateException e) {
- throw e;
- }
- catch (Throwable t) {
- throw new HibernateException( "Unable to validate listener config", t );
- }
- }
- catch (Exception t) {
- throw new HibernateException( "Unable to copy listeners", t );
- }
- finally {
- if ( beanInfo != null ) {
- // release the jdk internal caches everytime to ensure this
- // plays nicely with destroyable class-loaders
- Introspector.flushFromCaches( getClass() );
- }
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/EventListenerConfigurator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,223 @@
+//$Id$
+package org.hibernate.ejb;
+
+import java.beans.BeanInfo;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import java.util.StringTokenizer;
+
+import org.hibernate.HibernateException;
+import org.hibernate.MappingException;
+import org.hibernate.ejb.event.CallbackHandlerConsumer;
+import org.hibernate.ejb.event.EJB3AutoFlushEventListener;
+import org.hibernate.ejb.event.EJB3DeleteEventListener;
+import org.hibernate.ejb.event.EJB3FlushEntityEventListener;
+import org.hibernate.ejb.event.EJB3FlushEventListener;
+import org.hibernate.ejb.event.EJB3MergeEventListener;
+import org.hibernate.ejb.event.EJB3PersistEventListener;
+import org.hibernate.ejb.event.EJB3PersistOnFlushEventListener;
+import org.hibernate.ejb.event.EJB3PostDeleteEventListener;
+import org.hibernate.ejb.event.EJB3PostInsertEventListener;
+import org.hibernate.ejb.event.EJB3PostLoadEventListener;
+import org.hibernate.ejb.event.EJB3PostUpdateEventListener;
+import org.hibernate.ejb.event.EJB3SaveEventListener;
+import org.hibernate.ejb.event.EJB3SaveOrUpdateEventListener;
+import org.hibernate.ejb.event.EntityCallbackHandler;
+import org.hibernate.event.AutoFlushEventListener;
+import org.hibernate.event.DeleteEventListener;
+import org.hibernate.event.EventListeners;
+import org.hibernate.event.FlushEntityEventListener;
+import org.hibernate.event.FlushEventListener;
+import org.hibernate.event.MergeEventListener;
+import org.hibernate.event.PersistEventListener;
+import org.hibernate.event.PostDeleteEventListener;
+import org.hibernate.event.PostInsertEventListener;
+import org.hibernate.event.PostLoadEventListener;
+import org.hibernate.event.PostUpdateEventListener;
+import org.hibernate.event.PreDeleteEventListener;
+import org.hibernate.event.PreInsertEventListener;
+import org.hibernate.event.PreLoadEventListener;
+import org.hibernate.event.PreUpdateEventListener;
+import org.hibernate.event.SaveOrUpdateEventListener;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.secure.JACCPreDeleteEventListener;
+import org.hibernate.secure.JACCPreInsertEventListener;
+import org.hibernate.secure.JACCPreLoadEventListener;
+import org.hibernate.secure.JACCPreUpdateEventListener;
+import org.hibernate.secure.JACCSecurityListener;
+import org.hibernate.validator.event.ValidateEventListener;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EventListenerConfigurator {
+ private static final Object[] READER_METHOD_ARGS = new Object[0];
+
+ private Ejb3Configuration configuration;
+ private boolean isSecurity;
+
+ public EventListenerConfigurator(Ejb3Configuration configuration) {
+ this.configuration = configuration;
+ EventListeners listenerConfig = configuration.getEventListeners();
+
+ //Action event
+ //EJB3-specific ops listeners
+ listenerConfig.setFlushEventListeners( new FlushEventListener[]{EJB3FlushEventListener.INSTANCE} );
+ //EJB3-specific ops listeners
+ listenerConfig.setAutoFlushEventListeners( new AutoFlushEventListener[]{EJB3AutoFlushEventListener.INSTANCE} );
+ listenerConfig.setDeleteEventListeners( new DeleteEventListener[]{new EJB3DeleteEventListener()} );
+ listenerConfig.setFlushEntityEventListeners(
+ new FlushEntityEventListener[]{new EJB3FlushEntityEventListener()}
+ );
+ listenerConfig.setMergeEventListeners( new MergeEventListener[]{new EJB3MergeEventListener()} );
+ listenerConfig.setPersistEventListeners( new PersistEventListener[]{new EJB3PersistEventListener()} );
+ listenerConfig.setPersistOnFlushEventListeners(
+ new PersistEventListener[]{new EJB3PersistOnFlushEventListener()}
+ );
+ listenerConfig.setSaveEventListeners( new SaveOrUpdateEventListener[]{new EJB3SaveEventListener()} );
+ listenerConfig.setSaveOrUpdateEventListeners(
+ new SaveOrUpdateEventListener[]{new EJB3SaveOrUpdateEventListener()}
+ );
+
+ //Pre events
+ listenerConfig.setPreInsertEventListeners(
+ new PreInsertEventListener[]{
+ new JACCPreInsertEventListener(),
+ }
+ );
+ listenerConfig.setPreUpdateEventListeners(
+ new PreUpdateEventListener[]{
+ new JACCPreUpdateEventListener(),
+ }
+ );
+ listenerConfig.setPreDeleteEventListeners(
+ new PreDeleteEventListener[]{
+ new JACCPreDeleteEventListener()
+ }
+ );
+ listenerConfig.setPreLoadEventListeners(
+ new PreLoadEventListener[]{
+ new JACCPreLoadEventListener()
+ }
+ );
+
+ //post events
+ listenerConfig.setPostDeleteEventListeners(
+ new PostDeleteEventListener[]{new EJB3PostDeleteEventListener()}
+ );
+ listenerConfig.setPostInsertEventListeners(
+ new PostInsertEventListener[]{new EJB3PostInsertEventListener()}
+ );
+ listenerConfig.setPostLoadEventListeners(
+ new PostLoadEventListener[]{new EJB3PostLoadEventListener()}
+ );
+ listenerConfig.setPostUpdateEventListeners(
+ new PostUpdateEventListener[]{new EJB3PostUpdateEventListener()}
+ );
+ }
+
+ public void setProperties(Properties properties) {
+ if ( properties.containsKey( HibernatePersistence.JACC_ENABLED ) ) {
+ isSecurity = true;
+ }
+ //override events if needed
+ Enumeration<?> enumeration = properties.propertyNames();
+ while ( enumeration.hasMoreElements() ) {
+ String name = (String) enumeration.nextElement();
+ if ( name.startsWith( HibernatePersistence.EVENT_LISTENER_PREFIX ) ) {
+ String type = name.substring( HibernatePersistence.EVENT_LISTENER_PREFIX.length() + 1 );
+ StringTokenizer st = new StringTokenizer( properties.getProperty( name ), " ,", false );
+ List<String> listeners = new ArrayList<String>();
+ while ( st.hasMoreElements() ) {
+ listeners.add( (String) st.nextElement() );
+ }
+ configuration.setListeners( type, listeners.toArray( new String[ listeners.size() ] ) );
+ }
+ }
+ }
+
+ public void configure() {
+ //TODO exclude pure hbm file classes?
+ //TODO move it to each event listener initialize()?
+ EntityCallbackHandler callbackHandler = new EntityCallbackHandler();
+ configuration.buildMappings(); //needed to get all the classes
+ Iterator classes = configuration.getClassMappings();
+ ReflectionManager reflectionManager = configuration.getHibernateConfiguration().getReflectionManager();
+ while ( classes.hasNext() ) {
+ PersistentClass clazz = (PersistentClass) classes.next();
+ if ( clazz.getClassName() != null ) {
+ //we can have non java class persisted by hibernate
+ try {
+ callbackHandler.add( reflectionManager.classForName( clazz.getClassName(), this.getClass() ), reflectionManager );
+ }
+ catch (ClassNotFoundException e) {
+ throw new MappingException("entity class not found: " + clazz.getNodeName(), e);
+ }
+ }
+ }
+
+ EventListeners listenerConfig = configuration.getEventListeners();
+
+ BeanInfo beanInfo = null;
+ try {
+ beanInfo = Introspector.getBeanInfo( listenerConfig.getClass(), Object.class );
+ PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();
+ try {
+ for ( int i = 0, max = pds.length; i < max ; i++ ) {
+ final Object listeners = pds[i].getReadMethod().invoke( listenerConfig, READER_METHOD_ARGS );
+ if ( listeners == null ) {
+ throw new HibernateException( "Listener [" + pds[i].getName() + "] was null" );
+ }
+ if ( listeners instanceof Object[] ) {
+ int securityListenersNbr = 0;
+ Object[] listenersArray = (Object[]) listeners;
+ for ( Object listener : listenersArray ) {
+ if ( listener != null && listener instanceof CallbackHandlerConsumer ) {
+ ( (CallbackHandlerConsumer) listener ).setCallbackHandler( callbackHandler );
+ }
+ if ( listener != null && listener instanceof JACCSecurityListener ) {
+ if ( !isSecurity ) {
+ securityListenersNbr++;
+ }
+ }
+ }
+ if ( !isSecurity ) {
+ Class clazz = pds[i].getReadMethod().getReturnType().getComponentType();
+ Object newArray = Array.newInstance( clazz, listenersArray.length - securityListenersNbr );
+ int index = 0;
+ for ( Object listener : listenersArray ) {
+ if ( ! ( listener != null && listener instanceof JACCSecurityListener ) ) {
+ Array.set( newArray, index++, listener );
+ }
+ }
+ pds[i].getWriteMethod().invoke( listenerConfig, newArray );
+ }
+ }
+ }
+ }
+ catch (HibernateException e) {
+ throw e;
+ }
+ catch (Throwable t) {
+ throw new HibernateException( "Unable to validate listener config", t );
+ }
+ }
+ catch (Exception t) {
+ throw new HibernateException( "Unable to copy listeners", t );
+ }
+ finally {
+ if ( beanInfo != null ) {
+ // release the jdk internal caches everytime to ensure this
+ // plays nicely with destroyable class-loaders
+ Introspector.flushFromCaches( getClass() );
+ }
+ }
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManager.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManager.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.Session;
-
-/**
- * @author Gavin King
- */
-public interface HibernateEntityManager extends EntityManager {
- public Session getSession();
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManager.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManager.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManager.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id$
+package org.hibernate.ejb;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.Session;
+
+/**
+ * @author Gavin King
+ */
+public interface HibernateEntityManager extends EntityManager {
+ public Session getSession();
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import java.io.Serializable;
-import javax.persistence.EntityManagerFactory;
-
-import org.hibernate.SessionFactory;
-
-/**
- * @author Gavin King
- */
-public interface HibernateEntityManagerFactory extends EntityManagerFactory, Serializable {
- public SessionFactory getSessionFactory();
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerFactory.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerFactory.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id$
+package org.hibernate.ejb;
+
+import java.io.Serializable;
+import javax.persistence.EntityManagerFactory;
+
+import org.hibernate.SessionFactory;
+
+/**
+ * @author Gavin King
+ */
+public interface HibernateEntityManagerFactory extends EntityManagerFactory, Serializable {
+ public SessionFactory getSessionFactory();
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import javax.persistence.PersistenceException;
-
-import org.hibernate.HibernateException;
-import org.hibernate.StaleStateException;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface HibernateEntityManagerImplementor extends HibernateEntityManager {
- boolean isTransactionInProgress();
-
- public void throwPersistenceException(PersistenceException e);
-
- public void throwPersistenceException(HibernateException e);
-
- public PersistenceException wrapStaleStateException(StaleStateException e);
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateEntityManagerImplementor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.ejb;
+
+import javax.persistence.PersistenceException;
+
+import org.hibernate.HibernateException;
+import org.hibernate.StaleStateException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface HibernateEntityManagerImplementor extends HibernateEntityManager {
+ boolean isTransactionInProgress();
+
+ public void throwPersistenceException(PersistenceException e);
+
+ public void throwPersistenceException(HibernateException e);
+
+ public PersistenceException wrapStaleStateException(StaleStateException e);
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernatePersistence.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernatePersistence.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernatePersistence.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,140 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import java.util.Map;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.spi.PersistenceUnitInfo;
-
-/**
- * Hibernate EJB3 persistence provider implementation
- *
- * @author Gavin King
- */
-public class HibernatePersistence implements javax.persistence.spi.PersistenceProvider {
-
- /**
- * Provider
- */
- public static final String PROVIDER = "javax.persistence.provider";
- /**
- * ²
- * transaction type
- */
- public static final String TRANSACTION_TYPE = "javax.persistence.transactionType";
- /**
- * JTA datasource name
- */
- public static final String JTA_DATASOURCE = "javax.persistence.jtaDataSource";
- /**
- * Non JTA datasource name
- */
- public static final String NON_JTA_DATASOURCE = "javax.persistence.nonJtaDataSource";
- /**
- * JAR autodetection artifacts class, hbm
- */
- public static final String AUTODETECTION = "hibernate.archive.autodetection";
- /**
- * cfg.xml configuration file used
- */
- public static final String CFG_FILE = "hibernate.ejb.cfgfile";
- /**
- * Caching configuration should follow the following pattern
- * hibernate.ejb.classcache.<fully.qualified.Classname> usage[, region]
- * where usage is the cache strategy used and region the cache region name
- */
- public static final String CLASS_CACHE_PREFIX = "hibernate.ejb.classcache";
- /**
- * Caching configuration should follow the following pattern
- * hibernate.ejb.collectioncache.<fully.qualified.Classname>.<role> usage[, region]
- * where usage is the cache strategy used and region the cache region name
- */
- public static final String COLLECTION_CACHE_PREFIX = "hibernate.ejb.collectioncache";
- /**
- * Interceptor class name, the class has to have a no-arg constructor
- */
- public static final String INTERCEPTOR = "hibernate.ejb.interceptor";
- /**
- * Naming strategy class name, the class has to have a no-arg constructor
- */
- public static final String NAMING_STRATEGY = "hibernate.ejb.naming_strategy";
- /**
- * Event configuration should follow the following pattern
- * hibernate.ejb.event.[eventType] f.q.c.n.EventListener1, f.q.c.n.EventListener12 ...
- */
- public static final String EVENT_LISTENER_PREFIX = "hibernate.ejb.event";
- /**
- * Enable the class file enhancement
- */
- public static final String USE_CLASS_ENHANCER = "hibernate.ejb.use_class_enhancer";
- /**
- * Whether or not discard persistent context on entityManager.close()
- * The EJB3 compliant and default choice is false
- */
- public static final String DISCARD_PC_ON_CLOSE = "hibernate.ejb.discard_pc_on_close";
- /**
- * Consider this as experimental
- * It is not recommended to set up this property, the configuration is stored
- * in the JNDI in a serialized form
- */
- public static final String CONFIGURATION_JNDI_NAME = "hibernate.ejb.configuration_jndi_name";
-
- //The following properties are for Internal use only
- /**
- * link to the alternative Hibernate configuration file
- * Internal use only
- */
- /**
- * List of classes names
- * Internal use only
- */
- public static final String CLASS_NAMES = "hibernate.ejb.classes";
- /**
- * List of annotated packages
- * Internal use only
- */
- public static final String PACKAGE_NAMES = "hibernate.ejb.packages";
- /**
- * List of classes names
- * Internal use only
- */
- public static final String XML_FILE_NAMES = "hibernate.ejb.xml_files";
- public static final String HBXML_FILES = "hibernate.hbmxml.files";
- public static final String LOADED_CLASSES = "hibernate.ejb.loaded.classes";
- public static final String JACC_CONTEXT_ID = "hibernate.jacc.ctx.id";
- public static final String JACC_PREFIX = "hibernate.jacc";
- public static final String JACC_ENABLED = "hibernate.jacc.enabled";
- public static final String PERSISTENCE_UNIT_NAME = "hibernate.ejb.persistenceUnitName";
-
-
- /**
- * Get an entity manager factory by its entity manager name and given the
- * appropriate extra properties. Those proeprties override the one get through
- * the peristence.xml file.
- *
- * @param persistenceUnitName entity manager name
- * @param overridenProperties properties passed to the persistence provider
- * @return initialized EntityManagerFactory
- */
- public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map overridenProperties) {
- Ejb3Configuration cfg = new Ejb3Configuration();
- Ejb3Configuration configured = cfg.configure( persistenceUnitName, overridenProperties );
- return configured != null ? configured.buildEntityManagerFactory() : null;
- }
-
- public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) {
- Ejb3Configuration cfg = new Ejb3Configuration();
- Ejb3Configuration configured = cfg.configure( info, map );
- return configured != null ? configured.buildEntityManagerFactory() : null;
- }
-
- /**
- * create a factory from a canonical version
- * @deprecated
- */
- // This is used directly by JBoss so don't remove until further notice. bill at jboss.org
- public EntityManagerFactory createEntityManagerFactory(Map properties) {
- Ejb3Configuration cfg = new Ejb3Configuration();
- return cfg.createEntityManagerFactory( properties );
- }
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernatePersistence.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernatePersistence.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernatePersistence.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernatePersistence.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,140 @@
+//$Id$
+package org.hibernate.ejb;
+
+import java.util.Map;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.spi.PersistenceUnitInfo;
+
+/**
+ * Hibernate EJB3 persistence provider implementation
+ *
+ * @author Gavin King
+ */
+public class HibernatePersistence implements javax.persistence.spi.PersistenceProvider {
+
+ /**
+ * Provider
+ */
+ public static final String PROVIDER = "javax.persistence.provider";
+ /**
+ * ²
+ * transaction type
+ */
+ public static final String TRANSACTION_TYPE = "javax.persistence.transactionType";
+ /**
+ * JTA datasource name
+ */
+ public static final String JTA_DATASOURCE = "javax.persistence.jtaDataSource";
+ /**
+ * Non JTA datasource name
+ */
+ public static final String NON_JTA_DATASOURCE = "javax.persistence.nonJtaDataSource";
+ /**
+ * JAR autodetection artifacts class, hbm
+ */
+ public static final String AUTODETECTION = "hibernate.archive.autodetection";
+ /**
+ * cfg.xml configuration file used
+ */
+ public static final String CFG_FILE = "hibernate.ejb.cfgfile";
+ /**
+ * Caching configuration should follow the following pattern
+ * hibernate.ejb.classcache.<fully.qualified.Classname> usage[, region]
+ * where usage is the cache strategy used and region the cache region name
+ */
+ public static final String CLASS_CACHE_PREFIX = "hibernate.ejb.classcache";
+ /**
+ * Caching configuration should follow the following pattern
+ * hibernate.ejb.collectioncache.<fully.qualified.Classname>.<role> usage[, region]
+ * where usage is the cache strategy used and region the cache region name
+ */
+ public static final String COLLECTION_CACHE_PREFIX = "hibernate.ejb.collectioncache";
+ /**
+ * Interceptor class name, the class has to have a no-arg constructor
+ */
+ public static final String INTERCEPTOR = "hibernate.ejb.interceptor";
+ /**
+ * Naming strategy class name, the class has to have a no-arg constructor
+ */
+ public static final String NAMING_STRATEGY = "hibernate.ejb.naming_strategy";
+ /**
+ * Event configuration should follow the following pattern
+ * hibernate.ejb.event.[eventType] f.q.c.n.EventListener1, f.q.c.n.EventListener12 ...
+ */
+ public static final String EVENT_LISTENER_PREFIX = "hibernate.ejb.event";
+ /**
+ * Enable the class file enhancement
+ */
+ public static final String USE_CLASS_ENHANCER = "hibernate.ejb.use_class_enhancer";
+ /**
+ * Whether or not discard persistent context on entityManager.close()
+ * The EJB3 compliant and default choice is false
+ */
+ public static final String DISCARD_PC_ON_CLOSE = "hibernate.ejb.discard_pc_on_close";
+ /**
+ * Consider this as experimental
+ * It is not recommended to set up this property, the configuration is stored
+ * in the JNDI in a serialized form
+ */
+ public static final String CONFIGURATION_JNDI_NAME = "hibernate.ejb.configuration_jndi_name";
+
+ //The following properties are for Internal use only
+ /**
+ * link to the alternative Hibernate configuration file
+ * Internal use only
+ */
+ /**
+ * List of classes names
+ * Internal use only
+ */
+ public static final String CLASS_NAMES = "hibernate.ejb.classes";
+ /**
+ * List of annotated packages
+ * Internal use only
+ */
+ public static final String PACKAGE_NAMES = "hibernate.ejb.packages";
+ /**
+ * List of classes names
+ * Internal use only
+ */
+ public static final String XML_FILE_NAMES = "hibernate.ejb.xml_files";
+ public static final String HBXML_FILES = "hibernate.hbmxml.files";
+ public static final String LOADED_CLASSES = "hibernate.ejb.loaded.classes";
+ public static final String JACC_CONTEXT_ID = "hibernate.jacc.ctx.id";
+ public static final String JACC_PREFIX = "hibernate.jacc";
+ public static final String JACC_ENABLED = "hibernate.jacc.enabled";
+ public static final String PERSISTENCE_UNIT_NAME = "hibernate.ejb.persistenceUnitName";
+
+
+ /**
+ * Get an entity manager factory by its entity manager name and given the
+ * appropriate extra properties. Those proeprties override the one get through
+ * the peristence.xml file.
+ *
+ * @param persistenceUnitName entity manager name
+ * @param overridenProperties properties passed to the persistence provider
+ * @return initialized EntityManagerFactory
+ */
+ public EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map overridenProperties) {
+ Ejb3Configuration cfg = new Ejb3Configuration();
+ Ejb3Configuration configured = cfg.configure( persistenceUnitName, overridenProperties );
+ return configured != null ? configured.buildEntityManagerFactory() : null;
+ }
+
+ public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map) {
+ Ejb3Configuration cfg = new Ejb3Configuration();
+ Ejb3Configuration configured = cfg.configure( info, map );
+ return configured != null ? configured.buildEntityManagerFactory() : null;
+ }
+
+ /**
+ * create a factory from a canonical version
+ * @deprecated
+ */
+ // This is used directly by JBoss so don't remove until further notice. bill at jboss.org
+ public EntityManagerFactory createEntityManagerFactory(Map properties) {
+ Ejb3Configuration cfg = new Ejb3Configuration();
+ return cfg.createEntityManagerFactory( properties );
+ }
+
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateQuery.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateQuery.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateQuery.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,8 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import javax.persistence.Query;
-
-public interface HibernateQuery extends Query {
- public org.hibernate.Query getHibernateQuery();
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateQuery.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateQuery.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateQuery.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/HibernateQuery.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,8 @@
+//$Id$
+package org.hibernate.ejb;
+
+import javax.persistence.Query;
+
+public interface HibernateQuery extends Query {
+ public org.hibernate.Query getHibernateQuery();
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/InjectionSettingsFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/InjectionSettingsFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/InjectionSettingsFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import java.util.Map;
-import java.util.Properties;
-
-import org.hibernate.cfg.SettingsFactory;
-import org.hibernate.connection.ConnectionProvider;
-import org.hibernate.connection.ConnectionProviderFactory;
-
-/**
- * @author Emmanuel Bernard
- */
-public class InjectionSettingsFactory extends SettingsFactory {
- private Map connectionProviderInjectionData;
-
- /**
- * Map<String,Object> where the key represents the javabean property in witch
- * Object will be injected
- *
- * @param connectionProviderInjectionData
- *
- */
- public void setConnectionProviderInjectionData(Map connectionProviderInjectionData) {
- this.connectionProviderInjectionData = connectionProviderInjectionData;
- }
-
- protected ConnectionProvider createConnectionProvider(Properties properties) {
- return ConnectionProviderFactory.newConnectionProvider( properties, connectionProviderInjectionData );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/InjectionSettingsFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/InjectionSettingsFactory.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/InjectionSettingsFactory.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/InjectionSettingsFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.ejb;
+
+import java.util.Map;
+import java.util.Properties;
+
+import org.hibernate.cfg.SettingsFactory;
+import org.hibernate.connection.ConnectionProvider;
+import org.hibernate.connection.ConnectionProviderFactory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class InjectionSettingsFactory extends SettingsFactory {
+ private Map connectionProviderInjectionData;
+
+ /**
+ * Map<String,Object> where the key represents the javabean property in witch
+ * Object will be injected
+ *
+ * @param connectionProviderInjectionData
+ *
+ */
+ public void setConnectionProviderInjectionData(Map connectionProviderInjectionData) {
+ this.connectionProviderInjectionData = connectionProviderInjectionData;
+ }
+
+ protected ConnectionProvider createConnectionProvider(Properties properties) {
+ return ConnectionProviderFactory.newConnectionProvider( properties, connectionProviderInjectionData );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/QueryImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/QueryImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/QueryImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,342 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.FlushModeType;
-import javax.persistence.NoResultException;
-import javax.persistence.NonUniqueResultException;
-import javax.persistence.Query;
-import javax.persistence.TemporalType;
-import static javax.persistence.TemporalType.*;
-import javax.persistence.TransactionRequiredException;
-
-import org.hibernate.CacheMode;
-import org.hibernate.FlushMode;
-import org.hibernate.HibernateException;
-import org.hibernate.QueryParameterException;
-import org.hibernate.TypeMismatchException;
-import org.hibernate.ejb.util.ConfigurationHelper;
-import org.hibernate.hql.QueryExecutionRequestException;
-
-/**
- * @author <a href="mailto:gavin at hibernate.org">Gavin King</a>
- * @author Emmanuel Bernard
- */
-public class QueryImpl implements Query, HibernateQuery {
- private org.hibernate.Query query;
- private HibernateEntityManagerImplementor em;
- private Boolean isPositional = null;
-
- public QueryImpl(org.hibernate.Query query, AbstractEntityManagerImpl em) {
- this.query = query;
- this.em = em;
- }
-
- public org.hibernate.Query getHibernateQuery() {
- return query;
- }
-
- public int executeUpdate() {
- try {
- if ( ! em.isTransactionInProgress() ) {
- em.throwPersistenceException( new TransactionRequiredException( "Executing an update/delete query" ) );
- return 0;
- }
- return query.executeUpdate();
- }
- catch (QueryExecutionRequestException he) {
- throw new IllegalStateException(he);
- }
- catch( TypeMismatchException e ) {
- throw new IllegalArgumentException(e);
- }
- catch (HibernateException he) {
- em.throwPersistenceException( he );
- return 0;
- }
- }
-
- public List getResultList() {
- try {
- return query.list();
- }
- catch (QueryExecutionRequestException he) {
- throw new IllegalStateException(he);
- }
- catch( TypeMismatchException e ) {
- throw new IllegalArgumentException(e);
- }
- catch (HibernateException he) {
- em.throwPersistenceException( he );
- return null;
- }
- }
-
- public Object getSingleResult() {
- try {
- List result = query.list();
- if ( result.size() == 0 ) {
- em.throwPersistenceException( new NoResultException( "No entity found for query" ) );
- }
- else if ( result.size() > 1 ) {
- Set uniqueResult = new HashSet(result);
- if ( uniqueResult.size() > 1 ) {
- em.throwPersistenceException( new NonUniqueResultException( "result returns " + uniqueResult.size() + " elements") );
- }
- else {
- return uniqueResult.iterator().next();
- }
-
- }
- else {
- return result.get(0);
- }
- return null; //should never happen
- }
- catch (QueryExecutionRequestException he) {
- throw new IllegalStateException(he);
- }
- catch( TypeMismatchException e ) {
- throw new IllegalArgumentException(e);
- }
- catch (HibernateException he) {
- em.throwPersistenceException( he );
- return null;
- }
- }
-
- public Query setMaxResults(int maxResult) {
- if ( maxResult < 0 ) {
- throw new IllegalArgumentException(
- "Negative ("
- + maxResult
- + ") parameter passed in to setMaxResults"
- );
- }
- query.setMaxResults( maxResult );
- return this;
- }
-
- public Query setFirstResult(int firstResult) {
- if ( firstResult < 0 ) {
- throw new IllegalArgumentException(
- "Negative ("
- + firstResult
- + ") parameter passed in to setFirstResult"
- );
- }
- query.setFirstResult( firstResult );
- return this;
- }
-
- public Query setHint(String hintName, Object value) {
- try {
- if ( "org.hibernate.timeout".equals( hintName ) ) {
- query.setTimeout( (Integer) value );
- }
- else if ( "org.hibernate.comment".equals( hintName ) ) {
- query.setComment( (String) value );
- }
- else if ( "org.hibernate.fetchSize".equals( hintName ) ) {
- query.setFetchSize( (Integer) value );
- }
- else if ( "org.hibernate.cacheRegion".equals( hintName ) ) {
- query.setCacheRegion( (String) value );
- }
- else if ( "org.hibernate.cacheable".equals( hintName ) ) {
- query.setCacheable( (Boolean) value );
- }
- else if ( "org.hibernate.readOnly".equals( hintName ) ) {
- query.setReadOnly( (Boolean) value );
- }
- else if ( "org.hibernate.cacheMode".equals( hintName ) ) {
- query.setCacheMode( (CacheMode) value );
- }
- else if ( "org.hibernate.flushMode".equals( hintName ) ) {
- query.setFlushMode( ConfigurationHelper.getFlushMode( value ) );
- }
- //TODO:
- /*else if ( "org.hibernate.lockMode".equals( hintName ) ) {
- query.setLockMode( alias, lockMode );
- }*/
- }
- catch (ClassCastException e) {
- throw new IllegalArgumentException( "Value for hint" );
- }
- return this;
- }
-
- public Query setParameter(String name, Object value) {
- try {
- if ( value instanceof Collection ) {
- query.setParameterList( name, (Collection) value );
- }
- else {
- query.setParameter( name, value );
- }
- return this;
- }
- catch (QueryParameterException e) {
- throw new IllegalArgumentException( e );
- }
- catch (HibernateException he) {
- em.throwPersistenceException( he );
- return null;
- }
- }
-
- public Query setParameter(String name, Date value, TemporalType temporalType) {
- try {
- if ( temporalType == DATE ) {
- query.setDate( name, value );
- }
- else if ( temporalType == TIME ) {
- query.setTime( name, value );
- }
- else if ( temporalType == TIMESTAMP ) {
- query.setTimestamp( name, value );
- }
- return this;
- }
- catch (QueryParameterException e) {
- throw new IllegalArgumentException( e );
- }
- catch (HibernateException he) {
- em.throwPersistenceException( he );
- return null;
- }
- }
-
- public Query setParameter(String name, Calendar value, TemporalType temporalType) {
- try {
- if ( temporalType == DATE ) {
- query.setCalendarDate( name, value );
- }
- else if ( temporalType == TIME ) {
- throw new IllegalArgumentException( "not yet implemented" );
- }
- else if ( temporalType == TIMESTAMP ) {
- query.setCalendar( name, value );
- }
- return this;
- }
- catch (QueryParameterException e) {
- throw new IllegalArgumentException( e );
- }
- catch (HibernateException he) {
- em.throwPersistenceException( he );
- return null;
- }
- }
-
- public Query setParameter(int position, Object value) {
- try {
- if ( isPositionalParameter() ) {
- this.setParameter( Integer.toString( position ), value );
- }
- else {
- query.setParameter( position - 1, value );
- }
- return this;
- }
- catch (QueryParameterException e) {
- throw new IllegalArgumentException( e );
- }
- catch (HibernateException he) {
- em.throwPersistenceException( he );
- return null;
- }
- }
-
- private boolean isPositionalParameter() {
- if (isPositional == null) {
- //compute it
- String queryString = query.getQueryString();
- int index = queryString.indexOf( '?' );
- //there is a ? and the following char is a digit
- if (index == -1) {
- //no ?
- isPositional = true;
- }
- else if ( index == queryString.length() - 1 ) {
- // "... ?"
- isPositional = false;
- }
- else {
- isPositional = Character.isDigit( queryString.charAt( index + 1 ) );
- }
- }
- return isPositional;
- }
-
- public Query setParameter(int position, Date value, TemporalType temporalType) {
- try {
- if ( isPositionalParameter() ) {
- String name = Integer.toString( position );
- this.setParameter( name, value, temporalType );
- }
- else {
- if ( temporalType == DATE ) {
- query.setDate( position - 1, value );
- }
- else if ( temporalType == TIME ) {
- query.setTime( position - 1, value );
- }
- else if ( temporalType == TIMESTAMP ) {
- query.setTimestamp( position - 1, value );
- }
- }
- return this;
- }
- catch (QueryParameterException e) {
- throw new IllegalArgumentException( e );
- }
- catch (HibernateException he) {
- em.throwPersistenceException( he );
- return null;
- }
- }
-
- public Query setParameter(int position, Calendar value, TemporalType temporalType) {
- try {
- if ( isPositionalParameter() ) {
- String name = Integer.toString( position );
- this.setParameter( name, value, temporalType );
- }
- else {
- if ( temporalType == DATE ) {
- query.setCalendarDate( position - 1, value );
- }
- else if ( temporalType == TIME ) {
- throw new IllegalArgumentException( "not yet implemented" );
- }
- else if ( temporalType == TIMESTAMP ) {
- query.setCalendar( position - 1, value );
- }
- }
- return this;
- }
- catch (QueryParameterException e) {
- throw new IllegalArgumentException( e );
- }
- catch (HibernateException he) {
- em.throwPersistenceException( he );
- return null;
- }
- }
-
- public Query setFlushMode(FlushModeType flushMode) {
- if ( flushMode == FlushModeType.AUTO ) {
- query.setFlushMode( FlushMode.AUTO );
- }
- else if ( flushMode == FlushModeType.COMMIT ) {
- query.setFlushMode( FlushMode.COMMIT );
- }
- return this;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/QueryImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/QueryImpl.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/QueryImpl.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/QueryImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,342 @@
+//$Id$
+package org.hibernate.ejb;
+
+import java.util.Calendar;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.FlushModeType;
+import javax.persistence.NoResultException;
+import javax.persistence.NonUniqueResultException;
+import javax.persistence.Query;
+import javax.persistence.TemporalType;
+import static javax.persistence.TemporalType.*;
+import javax.persistence.TransactionRequiredException;
+
+import org.hibernate.CacheMode;
+import org.hibernate.FlushMode;
+import org.hibernate.HibernateException;
+import org.hibernate.QueryParameterException;
+import org.hibernate.TypeMismatchException;
+import org.hibernate.ejb.util.ConfigurationHelper;
+import org.hibernate.hql.QueryExecutionRequestException;
+
+/**
+ * @author <a href="mailto:gavin at hibernate.org">Gavin King</a>
+ * @author Emmanuel Bernard
+ */
+public class QueryImpl implements Query, HibernateQuery {
+ private org.hibernate.Query query;
+ private HibernateEntityManagerImplementor em;
+ private Boolean isPositional = null;
+
+ public QueryImpl(org.hibernate.Query query, AbstractEntityManagerImpl em) {
+ this.query = query;
+ this.em = em;
+ }
+
+ public org.hibernate.Query getHibernateQuery() {
+ return query;
+ }
+
+ public int executeUpdate() {
+ try {
+ if ( ! em.isTransactionInProgress() ) {
+ em.throwPersistenceException( new TransactionRequiredException( "Executing an update/delete query" ) );
+ return 0;
+ }
+ return query.executeUpdate();
+ }
+ catch (QueryExecutionRequestException he) {
+ throw new IllegalStateException(he);
+ }
+ catch( TypeMismatchException e ) {
+ throw new IllegalArgumentException(e);
+ }
+ catch (HibernateException he) {
+ em.throwPersistenceException( he );
+ return 0;
+ }
+ }
+
+ public List getResultList() {
+ try {
+ return query.list();
+ }
+ catch (QueryExecutionRequestException he) {
+ throw new IllegalStateException(he);
+ }
+ catch( TypeMismatchException e ) {
+ throw new IllegalArgumentException(e);
+ }
+ catch (HibernateException he) {
+ em.throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Object getSingleResult() {
+ try {
+ List result = query.list();
+ if ( result.size() == 0 ) {
+ em.throwPersistenceException( new NoResultException( "No entity found for query" ) );
+ }
+ else if ( result.size() > 1 ) {
+ Set uniqueResult = new HashSet(result);
+ if ( uniqueResult.size() > 1 ) {
+ em.throwPersistenceException( new NonUniqueResultException( "result returns " + uniqueResult.size() + " elements") );
+ }
+ else {
+ return uniqueResult.iterator().next();
+ }
+
+ }
+ else {
+ return result.get(0);
+ }
+ return null; //should never happen
+ }
+ catch (QueryExecutionRequestException he) {
+ throw new IllegalStateException(he);
+ }
+ catch( TypeMismatchException e ) {
+ throw new IllegalArgumentException(e);
+ }
+ catch (HibernateException he) {
+ em.throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Query setMaxResults(int maxResult) {
+ if ( maxResult < 0 ) {
+ throw new IllegalArgumentException(
+ "Negative ("
+ + maxResult
+ + ") parameter passed in to setMaxResults"
+ );
+ }
+ query.setMaxResults( maxResult );
+ return this;
+ }
+
+ public Query setFirstResult(int firstResult) {
+ if ( firstResult < 0 ) {
+ throw new IllegalArgumentException(
+ "Negative ("
+ + firstResult
+ + ") parameter passed in to setFirstResult"
+ );
+ }
+ query.setFirstResult( firstResult );
+ return this;
+ }
+
+ public Query setHint(String hintName, Object value) {
+ try {
+ if ( "org.hibernate.timeout".equals( hintName ) ) {
+ query.setTimeout( (Integer) value );
+ }
+ else if ( "org.hibernate.comment".equals( hintName ) ) {
+ query.setComment( (String) value );
+ }
+ else if ( "org.hibernate.fetchSize".equals( hintName ) ) {
+ query.setFetchSize( (Integer) value );
+ }
+ else if ( "org.hibernate.cacheRegion".equals( hintName ) ) {
+ query.setCacheRegion( (String) value );
+ }
+ else if ( "org.hibernate.cacheable".equals( hintName ) ) {
+ query.setCacheable( (Boolean) value );
+ }
+ else if ( "org.hibernate.readOnly".equals( hintName ) ) {
+ query.setReadOnly( (Boolean) value );
+ }
+ else if ( "org.hibernate.cacheMode".equals( hintName ) ) {
+ query.setCacheMode( (CacheMode) value );
+ }
+ else if ( "org.hibernate.flushMode".equals( hintName ) ) {
+ query.setFlushMode( ConfigurationHelper.getFlushMode( value ) );
+ }
+ //TODO:
+ /*else if ( "org.hibernate.lockMode".equals( hintName ) ) {
+ query.setLockMode( alias, lockMode );
+ }*/
+ }
+ catch (ClassCastException e) {
+ throw new IllegalArgumentException( "Value for hint" );
+ }
+ return this;
+ }
+
+ public Query setParameter(String name, Object value) {
+ try {
+ if ( value instanceof Collection ) {
+ query.setParameterList( name, (Collection) value );
+ }
+ else {
+ query.setParameter( name, value );
+ }
+ return this;
+ }
+ catch (QueryParameterException e) {
+ throw new IllegalArgumentException( e );
+ }
+ catch (HibernateException he) {
+ em.throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Query setParameter(String name, Date value, TemporalType temporalType) {
+ try {
+ if ( temporalType == DATE ) {
+ query.setDate( name, value );
+ }
+ else if ( temporalType == TIME ) {
+ query.setTime( name, value );
+ }
+ else if ( temporalType == TIMESTAMP ) {
+ query.setTimestamp( name, value );
+ }
+ return this;
+ }
+ catch (QueryParameterException e) {
+ throw new IllegalArgumentException( e );
+ }
+ catch (HibernateException he) {
+ em.throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Query setParameter(String name, Calendar value, TemporalType temporalType) {
+ try {
+ if ( temporalType == DATE ) {
+ query.setCalendarDate( name, value );
+ }
+ else if ( temporalType == TIME ) {
+ throw new IllegalArgumentException( "not yet implemented" );
+ }
+ else if ( temporalType == TIMESTAMP ) {
+ query.setCalendar( name, value );
+ }
+ return this;
+ }
+ catch (QueryParameterException e) {
+ throw new IllegalArgumentException( e );
+ }
+ catch (HibernateException he) {
+ em.throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Query setParameter(int position, Object value) {
+ try {
+ if ( isPositionalParameter() ) {
+ this.setParameter( Integer.toString( position ), value );
+ }
+ else {
+ query.setParameter( position - 1, value );
+ }
+ return this;
+ }
+ catch (QueryParameterException e) {
+ throw new IllegalArgumentException( e );
+ }
+ catch (HibernateException he) {
+ em.throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ private boolean isPositionalParameter() {
+ if (isPositional == null) {
+ //compute it
+ String queryString = query.getQueryString();
+ int index = queryString.indexOf( '?' );
+ //there is a ? and the following char is a digit
+ if (index == -1) {
+ //no ?
+ isPositional = true;
+ }
+ else if ( index == queryString.length() - 1 ) {
+ // "... ?"
+ isPositional = false;
+ }
+ else {
+ isPositional = Character.isDigit( queryString.charAt( index + 1 ) );
+ }
+ }
+ return isPositional;
+ }
+
+ public Query setParameter(int position, Date value, TemporalType temporalType) {
+ try {
+ if ( isPositionalParameter() ) {
+ String name = Integer.toString( position );
+ this.setParameter( name, value, temporalType );
+ }
+ else {
+ if ( temporalType == DATE ) {
+ query.setDate( position - 1, value );
+ }
+ else if ( temporalType == TIME ) {
+ query.setTime( position - 1, value );
+ }
+ else if ( temporalType == TIMESTAMP ) {
+ query.setTimestamp( position - 1, value );
+ }
+ }
+ return this;
+ }
+ catch (QueryParameterException e) {
+ throw new IllegalArgumentException( e );
+ }
+ catch (HibernateException he) {
+ em.throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Query setParameter(int position, Calendar value, TemporalType temporalType) {
+ try {
+ if ( isPositionalParameter() ) {
+ String name = Integer.toString( position );
+ this.setParameter( name, value, temporalType );
+ }
+ else {
+ if ( temporalType == DATE ) {
+ query.setCalendarDate( position - 1, value );
+ }
+ else if ( temporalType == TIME ) {
+ throw new IllegalArgumentException( "not yet implemented" );
+ }
+ else if ( temporalType == TIMESTAMP ) {
+ query.setCalendar( position - 1, value );
+ }
+ }
+ return this;
+ }
+ catch (QueryParameterException e) {
+ throw new IllegalArgumentException( e );
+ }
+ catch (HibernateException he) {
+ em.throwPersistenceException( he );
+ return null;
+ }
+ }
+
+ public Query setFlushMode(FlushModeType flushMode) {
+ if ( flushMode == FlushModeType.AUTO ) {
+ query.setFlushMode( FlushMode.AUTO );
+ }
+ else if ( flushMode == FlushModeType.COMMIT ) {
+ query.setFlushMode( FlushMode.COMMIT );
+ }
+ return this;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/TransactionImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/TransactionImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/TransactionImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,123 +0,0 @@
-//$Id$
-package org.hibernate.ejb;
-
-import javax.persistence.EntityTransaction;
-import javax.persistence.PersistenceException;
-import javax.persistence.RollbackException;
-
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.StaleStateException;
-
-/**
- * @author Gavin King
- * @author Emmanuel Bernard
- */
-public class TransactionImpl implements EntityTransaction {
-
- private HibernateEntityManagerImplementor entityManager;
- private Transaction tx;
- private boolean rollbackOnly;
-
- public TransactionImpl(AbstractEntityManagerImpl entityManager) {
- this.entityManager = entityManager;
- }
-
- private Session getSession() {
- return entityManager.getSession();
- }
-
- public void begin() {
- try {
- rollbackOnly = false;
- if ( tx != null && tx.isActive() ) {
- throw new IllegalStateException( "Transaction already active" );
- }
- //entityManager.adjustFlushMode();
- tx = getSession().beginTransaction();
- }
- catch (HibernateException he) {
- entityManager.throwPersistenceException( he );
- }
- }
-
- public void commit() {
- if ( tx == null || !tx.isActive() ) {
- throw new IllegalStateException( "Transaction not active" );
- }
- if ( rollbackOnly ) {
- tx.rollback();
- throw new RollbackException( "Transaction marked as rollbackOnly" );
- }
- try {
- tx.commit();
- }
- catch (Exception e) {
- Exception wrappedException;
- if (e instanceof StaleStateException) {
- wrappedException = entityManager.wrapStaleStateException( (StaleStateException) e );
- }
- else {
- wrappedException = e;
- }
- try {
- //as per the spec we should rollback if commit fails
- tx.rollback();
- }
- catch (Exception re) {
- //swallow
- }
- throw new RollbackException( "Error while commiting the transaction", wrappedException );
- }
- finally {
- rollbackOnly = false;
- }
- //if closed and we commit, the mode should have been adjusted already
- //if ( entityManager.isOpen() ) entityManager.adjustFlushMode();
- }
-
- public void rollback() {
- if ( tx == null || !tx.isActive() ) {
- throw new IllegalStateException( "Transaction not active" );
- }
- try {
- tx.rollback();
- }
- catch (Exception e) {
- throw new PersistenceException( "unexpected error when rollbacking", e );
- }
- finally {
- try {
- if (entityManager != null) {
- Session session = getSession();
- if ( session != null && session.isOpen() ) session.clear();
- }
- }
- catch (Throwable t) {
- //we don't really care here since it's only for safety purpose
- }
- rollbackOnly = false;
- }
- }
-
- public void setRollbackOnly() {
- if ( ! isActive() ) throw new IllegalStateException( "Transaction not active" );
- this.rollbackOnly = true;
- }
-
- public boolean getRollbackOnly() {
- if ( ! isActive() ) throw new IllegalStateException( "Transaction not active" );
- return rollbackOnly;
- }
-
- public boolean isActive() {
- try {
- return tx != null && tx.isActive();
- }
- catch (RuntimeException e) {
- throw new PersistenceException( "unexpected error when checking transaction status", e );
- }
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/TransactionImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/TransactionImpl.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/TransactionImpl.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/TransactionImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,123 @@
+//$Id$
+package org.hibernate.ejb;
+
+import javax.persistence.EntityTransaction;
+import javax.persistence.PersistenceException;
+import javax.persistence.RollbackException;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.StaleStateException;
+
+/**
+ * @author Gavin King
+ * @author Emmanuel Bernard
+ */
+public class TransactionImpl implements EntityTransaction {
+
+ private HibernateEntityManagerImplementor entityManager;
+ private Transaction tx;
+ private boolean rollbackOnly;
+
+ public TransactionImpl(AbstractEntityManagerImpl entityManager) {
+ this.entityManager = entityManager;
+ }
+
+ private Session getSession() {
+ return entityManager.getSession();
+ }
+
+ public void begin() {
+ try {
+ rollbackOnly = false;
+ if ( tx != null && tx.isActive() ) {
+ throw new IllegalStateException( "Transaction already active" );
+ }
+ //entityManager.adjustFlushMode();
+ tx = getSession().beginTransaction();
+ }
+ catch (HibernateException he) {
+ entityManager.throwPersistenceException( he );
+ }
+ }
+
+ public void commit() {
+ if ( tx == null || !tx.isActive() ) {
+ throw new IllegalStateException( "Transaction not active" );
+ }
+ if ( rollbackOnly ) {
+ tx.rollback();
+ throw new RollbackException( "Transaction marked as rollbackOnly" );
+ }
+ try {
+ tx.commit();
+ }
+ catch (Exception e) {
+ Exception wrappedException;
+ if (e instanceof StaleStateException) {
+ wrappedException = entityManager.wrapStaleStateException( (StaleStateException) e );
+ }
+ else {
+ wrappedException = e;
+ }
+ try {
+ //as per the spec we should rollback if commit fails
+ tx.rollback();
+ }
+ catch (Exception re) {
+ //swallow
+ }
+ throw new RollbackException( "Error while commiting the transaction", wrappedException );
+ }
+ finally {
+ rollbackOnly = false;
+ }
+ //if closed and we commit, the mode should have been adjusted already
+ //if ( entityManager.isOpen() ) entityManager.adjustFlushMode();
+ }
+
+ public void rollback() {
+ if ( tx == null || !tx.isActive() ) {
+ throw new IllegalStateException( "Transaction not active" );
+ }
+ try {
+ tx.rollback();
+ }
+ catch (Exception e) {
+ throw new PersistenceException( "unexpected error when rollbacking", e );
+ }
+ finally {
+ try {
+ if (entityManager != null) {
+ Session session = getSession();
+ if ( session != null && session.isOpen() ) session.clear();
+ }
+ }
+ catch (Throwable t) {
+ //we don't really care here since it's only for safety purpose
+ }
+ rollbackOnly = false;
+ }
+ }
+
+ public void setRollbackOnly() {
+ if ( ! isActive() ) throw new IllegalStateException( "Transaction not active" );
+ this.rollbackOnly = true;
+ }
+
+ public boolean getRollbackOnly() {
+ if ( ! isActive() ) throw new IllegalStateException( "Transaction not active" );
+ return rollbackOnly;
+ }
+
+ public boolean isActive() {
+ try {
+ return tx != null && tx.isActive();
+ }
+ catch (RuntimeException e) {
+ throw new PersistenceException( "unexpected error when checking transaction status", e );
+ }
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Version.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Version.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.ejb;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Version {
- public static final String VERSION = "3.2.1.GA";
- private static Log log = LogFactory.getLog( Version.class );
-
- static {
- log.info( "Hibernate EntityManager " + VERSION );
- }
-
- public static void touch() {
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Version.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Version.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Version.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.ejb;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Version {
+ public static final String VERSION = "3.2.1.GA";
+ private static Log log = LogFactory.getLog( Version.class );
+
+ static {
+ log.info( "Hibernate EntityManager " + VERSION );
+ }
+
+ public static void touch() {
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection)
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/InjectedDataSourceConnectionProvider.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/InjectedDataSourceConnectionProvider.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/InjectedDataSourceConnectionProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-//$Id$
-package org.hibernate.ejb.connection;
-
-import java.util.Properties;
-import java.sql.Connection;
-import java.sql.SQLException;
-import javax.sql.DataSource;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.HibernateException;
-import org.hibernate.cfg.Environment;
-import org.hibernate.connection.DatasourceConnectionProvider;
-
-/**
- * A connection provider that uses an injected <tt>DataSource</tt>.
- * Setters has to be called before configure()
- *
- * @author Emmanuel Bernard
- * @see org.hibernate.connection.ConnectionProvider
- */
-public class InjectedDataSourceConnectionProvider extends DatasourceConnectionProvider {
- //TODO make datasource connection provider properties protected in 3.3
- private String user;
- private String pass;
-
- private static final Log log = LogFactory.getLog( InjectedDataSourceConnectionProvider.class );
-
- public void setDataSource(DataSource ds) {
- super.setDataSource( ds );
- }
-
- public void configure(Properties props) throws HibernateException {
- user = props.getProperty( Environment.USER );
- pass = props.getProperty( Environment.PASS );
-
- if ( getDataSource() == null ) throw new HibernateException( "No datasource provided" );
- log.info( "Using provided datasource" );
- }
-
- @Override
- public Connection getConnection() throws SQLException {
- if (user != null || pass != null) {
- return getDataSource().getConnection(user, pass);
- }
- else {
- return getDataSource().getConnection();
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/InjectedDataSourceConnectionProvider.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/InjectedDataSourceConnectionProvider.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/InjectedDataSourceConnectionProvider.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/connection/InjectedDataSourceConnectionProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+//$Id$
+package org.hibernate.ejb.connection;
+
+import java.util.Properties;
+import java.sql.Connection;
+import java.sql.SQLException;
+import javax.sql.DataSource;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.HibernateException;
+import org.hibernate.cfg.Environment;
+import org.hibernate.connection.DatasourceConnectionProvider;
+
+/**
+ * A connection provider that uses an injected <tt>DataSource</tt>.
+ * Setters has to be called before configure()
+ *
+ * @author Emmanuel Bernard
+ * @see org.hibernate.connection.ConnectionProvider
+ */
+public class InjectedDataSourceConnectionProvider extends DatasourceConnectionProvider {
+ //TODO make datasource connection provider properties protected in 3.3
+ private String user;
+ private String pass;
+
+ private static final Log log = LogFactory.getLog( InjectedDataSourceConnectionProvider.class );
+
+ public void setDataSource(DataSource ds) {
+ super.setDataSource( ds );
+ }
+
+ public void configure(Properties props) throws HibernateException {
+ user = props.getProperty( Environment.USER );
+ pass = props.getProperty( Environment.PASS );
+
+ if ( getDataSource() == null ) throw new HibernateException( "No datasource provided" );
+ log.info( "Using provided datasource" );
+ }
+
+ @Override
+ public Connection getConnection() throws SQLException {
+ if (user != null || pass != null) {
+ return getDataSource().getConnection(user, pass);
+ }
+ else {
+ return getDataSource().getConnection();
+ }
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event)
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/BeanCallback.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/BeanCallback.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/BeanCallback.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-/*
- * JBoss, the OpenSource EJB server
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.hibernate.ejb.event;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-
-/**
- * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
- * @version $Revision$
- */
-public class BeanCallback extends Callback {
- public BeanCallback(Method callbackMethod) {
- super( callbackMethod );
- }
-
- public void invoke(Object bean) {
- try {
- callbackMethod.invoke( bean, new Object[0] );
- }
- catch (InvocationTargetException e) {
- //keep runtime exceptions as is
- if ( e.getTargetException() instanceof RuntimeException ) {
- throw (RuntimeException) e.getTargetException();
- }
- else {
- throw new RuntimeException( e.getTargetException() );
- }
- }
- catch (Exception e) {
- throw new RuntimeException( e );
- }
- }
-
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/BeanCallback.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/BeanCallback.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/BeanCallback.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/BeanCallback.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+/*
+ * JBoss, the OpenSource EJB server
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.hibernate.ejb.event;
+
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
+
+/**
+ * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class BeanCallback extends Callback {
+ public BeanCallback(Method callbackMethod) {
+ super( callbackMethod );
+ }
+
+ public void invoke(Object bean) {
+ try {
+ callbackMethod.invoke( bean, new Object[0] );
+ }
+ catch (InvocationTargetException e) {
+ //keep runtime exceptions as is
+ if ( e.getTargetException() instanceof RuntimeException ) {
+ throw (RuntimeException) e.getTargetException();
+ }
+ else {
+ throw new RuntimeException( e.getTargetException() );
+ }
+ }
+ catch (Exception e) {
+ throw new RuntimeException( e );
+ }
+ }
+
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/Callback.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/Callback.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/Callback.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,74 +0,0 @@
-/*
- * JBoss, the OpenSource EJB server
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.hibernate.ejb.event;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.StringTokenizer;
-
-import org.hibernate.util.ReflectHelper;
-
-/**
- * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
- * @version $Revision$
- */
-public abstract class Callback implements Serializable {
- transient protected Method callbackMethod;
-
- public Callback(Method callbackMethod) {
- this.callbackMethod = callbackMethod;
- }
-
- public Method getCallbackMethod() {
- return callbackMethod;
- }
-
- public abstract void invoke(Object bean);
-
- private void writeObject(ObjectOutputStream oos) throws IOException {
- oos.defaultWriteObject();
- oos.writeObject( callbackMethod.toGenericString() );
- }
-
- private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
- ois.defaultReadObject();
- String signature = (String) ois.readObject();
- StringTokenizer st = new StringTokenizer( signature, " ", false );
- String usefulSignature = null;
- while ( st.hasMoreElements() ) usefulSignature = (String) st.nextElement();
- int parenthesis = usefulSignature.indexOf( "(" );
- String methodAndClass = usefulSignature.substring( 0, parenthesis );
- int lastDot = methodAndClass.lastIndexOf( "." );
- String clazzName = methodAndClass.substring( 0, lastDot );
- Class callbackClass = ReflectHelper.classForName( clazzName, this.getClass() );
- String parametersString = usefulSignature.substring( parenthesis + 1, usefulSignature.length() - 1 );
- st = new StringTokenizer( parametersString, ", ", false );
- List<Class> parameters = new ArrayList<Class>();
- while ( st.hasMoreElements() ) {
- String parameter = (String) st.nextElement();
- parameters.add( ReflectHelper.classForName( parameter, this.getClass() ) );
- }
- String methodName = methodAndClass.substring( lastDot + 1, methodAndClass.length() );
- try {
- callbackMethod = callbackClass.getDeclaredMethod(
- methodName,
- parameters.toArray( new Class[ parameters.size() ] )
- );
- if ( ! callbackMethod.isAccessible() ) {
- callbackMethod.setAccessible( true );
- }
- }
- catch (NoSuchMethodException e) {
- throw new IOException( "Unable to get EJB3 callback method: " + signature + ", cause: " + e );
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/Callback.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/Callback.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/Callback.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/Callback.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,74 @@
+/*
+ * JBoss, the OpenSource EJB server
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.hibernate.ejb.event;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.StringTokenizer;
+
+import org.hibernate.util.ReflectHelper;
+
+/**
+ * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
+ * @version $Revision$
+ */
+public abstract class Callback implements Serializable {
+ transient protected Method callbackMethod;
+
+ public Callback(Method callbackMethod) {
+ this.callbackMethod = callbackMethod;
+ }
+
+ public Method getCallbackMethod() {
+ return callbackMethod;
+ }
+
+ public abstract void invoke(Object bean);
+
+ private void writeObject(ObjectOutputStream oos) throws IOException {
+ oos.defaultWriteObject();
+ oos.writeObject( callbackMethod.toGenericString() );
+ }
+
+ private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+ ois.defaultReadObject();
+ String signature = (String) ois.readObject();
+ StringTokenizer st = new StringTokenizer( signature, " ", false );
+ String usefulSignature = null;
+ while ( st.hasMoreElements() ) usefulSignature = (String) st.nextElement();
+ int parenthesis = usefulSignature.indexOf( "(" );
+ String methodAndClass = usefulSignature.substring( 0, parenthesis );
+ int lastDot = methodAndClass.lastIndexOf( "." );
+ String clazzName = methodAndClass.substring( 0, lastDot );
+ Class callbackClass = ReflectHelper.classForName( clazzName, this.getClass() );
+ String parametersString = usefulSignature.substring( parenthesis + 1, usefulSignature.length() - 1 );
+ st = new StringTokenizer( parametersString, ", ", false );
+ List<Class> parameters = new ArrayList<Class>();
+ while ( st.hasMoreElements() ) {
+ String parameter = (String) st.nextElement();
+ parameters.add( ReflectHelper.classForName( parameter, this.getClass() ) );
+ }
+ String methodName = methodAndClass.substring( lastDot + 1, methodAndClass.length() );
+ try {
+ callbackMethod = callbackClass.getDeclaredMethod(
+ methodName,
+ parameters.toArray( new Class[ parameters.size() ] )
+ );
+ if ( ! callbackMethod.isAccessible() ) {
+ callbackMethod.setAccessible( true );
+ }
+ }
+ catch (NoSuchMethodException e) {
+ throw new IOException( "Unable to get EJB3 callback method: " + signature + ", cause: " + e );
+ }
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackHandlerConsumer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackHandlerConsumer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackHandlerConsumer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,9 +0,0 @@
-//$Id$
-package org.hibernate.ejb.event;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface CallbackHandlerConsumer {
- void setCallbackHandler(EntityCallbackHandler callbackHandler);
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackHandlerConsumer.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackHandlerConsumer.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackHandlerConsumer.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackHandlerConsumer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,9 @@
+//$Id$
+package org.hibernate.ejb.event;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface CallbackHandlerConsumer {
+ void setCallbackHandler(EntityCallbackHandler callbackHandler);
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackResolver.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackResolver.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackResolver.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,203 +0,0 @@
-/*
- * JBoss, the OpenSource EJB server
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.hibernate.ejb.event;
-
-import java.lang.annotation.Annotation;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.List;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.ExcludeDefaultListeners;
-import javax.persistence.ExcludeSuperclassListeners;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.PersistenceException;
-
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XMethod;
-
-/**
- * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
- * @version $Revision$
- */
-public final class CallbackResolver {
- private static boolean useAnnotationAnnotatedByListener;
-
- static {
- //check whether reading annotations of annotations is useful or not
- useAnnotationAnnotatedByListener = false;
- Target target = (Target) EntityListeners.class.getAnnotation( Target.class );
- if ( target != null ) {
- for ( ElementType type : target.value() ) {
- if ( type.equals( ElementType.ANNOTATION_TYPE ) ) useAnnotationAnnotatedByListener = true;
- }
- }
- }
-
- private CallbackResolver() {
- }
-
- public static Callback[] resolveCallback(XClass beanClass, Class annotation, ReflectionManager reflectionManager) {
- List<Callback> callbacks = new ArrayList<Callback>();
- List<String> callbacksMethodNames = new ArrayList<String>(); //used to track overriden methods
- List<Class> orderedListeners = new ArrayList<Class>();
- XClass currentClazz = beanClass;
- boolean stopListeners = false;
- boolean stopDefaultListeners = false;
- do {
- Callback callback = null;
- List<XMethod> methods = currentClazz.getDeclaredMethods();
- final int size = methods.size();
- for ( int i = 0; i < size ; i++ ) {
- final XMethod xMethod = methods.get( i );
- if ( xMethod.isAnnotationPresent( annotation ) ) {
- Method method = reflectionManager.toMethod( xMethod );
- final String methodName = method.getName();
- if ( ! callbacksMethodNames.contains( methodName ) ) {
- //overriden method, remove the superclass overriden method
- if ( callback == null ) {
- callback = new BeanCallback( method );
- Class returnType = method.getReturnType();
- Class[] args = method.getParameterTypes();
- if ( returnType != Void.TYPE || args.length != 0 ) {
- throw new RuntimeException(
- "Callback methods annotated on the bean class must return void and take no arguments: " + annotation
- .getName() + " - " + xMethod
- );
- }
- if ( ! method.isAccessible() ) {
- method.setAccessible( true );
- }
- callbacks.add( 0, callback ); //superclass first
- callbacksMethodNames.add( 0, methodName );
- }
- else {
- throw new PersistenceException(
- "You can only annotate one callback method with "
- + annotation.getName() + " in bean class: " + beanClass.getName()
- );
- }
- }
- }
- }
- if ( !stopListeners ) {
- getListeners( currentClazz, orderedListeners );
- stopListeners = currentClazz.isAnnotationPresent( ExcludeSuperclassListeners.class );
- stopDefaultListeners = currentClazz.isAnnotationPresent( ExcludeDefaultListeners.class );
- }
-
- do {
- currentClazz = currentClazz.getSuperclass();
- }
- while ( currentClazz != null
- && ! ( currentClazz.isAnnotationPresent( Entity.class )
- || currentClazz.isAnnotationPresent( MappedSuperclass.class ) )
- );
- }
- while ( currentClazz != null );
-
- //handle default listeners
- if ( ! stopDefaultListeners ) {
- List<Class> defaultListeners = (List<Class>) reflectionManager.getDefaults().get( EntityListeners.class );
-
- if ( defaultListeners != null ) {
- int defaultListenerSize = defaultListeners.size();
- for ( int i = defaultListenerSize - 1; i >= 0 ; i-- ) {
- orderedListeners.add( defaultListeners.get( i ) );
- }
- }
- }
-
- for ( Class listener : orderedListeners ) {
- Callback callback = null;
- if ( listener != null ) {
- XClass xListener = reflectionManager.toXClass( listener );
- callbacksMethodNames = new ArrayList<String>();
- do {
- List<XMethod> methods = xListener.getDeclaredMethods();
- final int size = methods.size();
- for ( int i = 0; i < size ; i++ ) {
- final XMethod xMethod = methods.get( i );
- if ( xMethod.isAnnotationPresent( annotation ) ) {
- final Method method = reflectionManager.toMethod( xMethod );
- final String methodName = method.getName();
- if ( ! callbacksMethodNames.contains( methodName ) ) {
- //overriden method, remove the superclass overriden method
- if ( callback == null ) {
- try {
- callback = new ListenerCallback( method, listener.newInstance() );
- }
- catch (IllegalAccessException e) {
- throw new PersistenceException(
- "Unable to create instance of " + listener.getName()
- + " as a listener of beanClass", e
- );
- }
- catch (InstantiationException e) {
- throw new PersistenceException(
- "Unable to create instance of " + listener.getName()
- + " as a listener of beanClass", e
- );
- }
- Class returnType = method.getReturnType();
- Class[] args = method.getParameterTypes();
- if ( returnType != Void.TYPE || args.length != 1 ) {
- throw new PersistenceException(
- "Callback methods annotated in a listener bean class must return void and take one argument: " + annotation
- .getName() + " - " + method
- );
- }
- if ( ! method.isAccessible() ) {
- method.setAccessible( true );
- }
- callbacks.add( 0, callback ); // listeners first
- }
- else {
- throw new PersistenceException(
- "You can only annotate one callback method with "
- + annotation.getName() + " in bean class: " + beanClass.getName() + " and callback listener: "
- + listener.getName()
- );
- }
- }
- }
- }
- xListener = null; //xListener.getSuperclass();
- }
- while ( xListener != null );
- }
- }
- return callbacks.toArray( new Callback[ callbacks.size() ] );
- }
-
- private static void getListeners(XClass currentClazz, List<Class> orderedListeners) {
- EntityListeners entityListeners = (EntityListeners) currentClazz.getAnnotation( EntityListeners.class );
- if ( entityListeners != null ) {
- Class[] classes = entityListeners.value();
- int size = classes.length;
- for ( int index = size - 1; index >= 0 ; index-- ) {
- orderedListeners.add( classes[index] );
- }
- }
- if ( useAnnotationAnnotatedByListener ) {
- Annotation[] annotations = currentClazz.getAnnotations();
- for ( Annotation annot : annotations ) {
- entityListeners = annot.getClass().getAnnotation( EntityListeners.class );
- if ( entityListeners != null ) {
- Class[] classes = entityListeners.value();
- int size = classes.length;
- for ( int index = size - 1; index >= 0 ; index-- ) {
- orderedListeners.add( classes[index] );
- }
- }
- }
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackResolver.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackResolver.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackResolver.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/CallbackResolver.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,203 @@
+/*
+ * JBoss, the OpenSource EJB server
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.hibernate.ejb.event;
+
+import java.lang.annotation.Annotation;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.ExcludeDefaultListeners;
+import javax.persistence.ExcludeSuperclassListeners;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.PersistenceException;
+
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XMethod;
+
+/**
+ * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
+ * @version $Revision$
+ */
+public final class CallbackResolver {
+ private static boolean useAnnotationAnnotatedByListener;
+
+ static {
+ //check whether reading annotations of annotations is useful or not
+ useAnnotationAnnotatedByListener = false;
+ Target target = (Target) EntityListeners.class.getAnnotation( Target.class );
+ if ( target != null ) {
+ for ( ElementType type : target.value() ) {
+ if ( type.equals( ElementType.ANNOTATION_TYPE ) ) useAnnotationAnnotatedByListener = true;
+ }
+ }
+ }
+
+ private CallbackResolver() {
+ }
+
+ public static Callback[] resolveCallback(XClass beanClass, Class annotation, ReflectionManager reflectionManager) {
+ List<Callback> callbacks = new ArrayList<Callback>();
+ List<String> callbacksMethodNames = new ArrayList<String>(); //used to track overriden methods
+ List<Class> orderedListeners = new ArrayList<Class>();
+ XClass currentClazz = beanClass;
+ boolean stopListeners = false;
+ boolean stopDefaultListeners = false;
+ do {
+ Callback callback = null;
+ List<XMethod> methods = currentClazz.getDeclaredMethods();
+ final int size = methods.size();
+ for ( int i = 0; i < size ; i++ ) {
+ final XMethod xMethod = methods.get( i );
+ if ( xMethod.isAnnotationPresent( annotation ) ) {
+ Method method = reflectionManager.toMethod( xMethod );
+ final String methodName = method.getName();
+ if ( ! callbacksMethodNames.contains( methodName ) ) {
+ //overriden method, remove the superclass overriden method
+ if ( callback == null ) {
+ callback = new BeanCallback( method );
+ Class returnType = method.getReturnType();
+ Class[] args = method.getParameterTypes();
+ if ( returnType != Void.TYPE || args.length != 0 ) {
+ throw new RuntimeException(
+ "Callback methods annotated on the bean class must return void and take no arguments: " + annotation
+ .getName() + " - " + xMethod
+ );
+ }
+ if ( ! method.isAccessible() ) {
+ method.setAccessible( true );
+ }
+ callbacks.add( 0, callback ); //superclass first
+ callbacksMethodNames.add( 0, methodName );
+ }
+ else {
+ throw new PersistenceException(
+ "You can only annotate one callback method with "
+ + annotation.getName() + " in bean class: " + beanClass.getName()
+ );
+ }
+ }
+ }
+ }
+ if ( !stopListeners ) {
+ getListeners( currentClazz, orderedListeners );
+ stopListeners = currentClazz.isAnnotationPresent( ExcludeSuperclassListeners.class );
+ stopDefaultListeners = currentClazz.isAnnotationPresent( ExcludeDefaultListeners.class );
+ }
+
+ do {
+ currentClazz = currentClazz.getSuperclass();
+ }
+ while ( currentClazz != null
+ && ! ( currentClazz.isAnnotationPresent( Entity.class )
+ || currentClazz.isAnnotationPresent( MappedSuperclass.class ) )
+ );
+ }
+ while ( currentClazz != null );
+
+ //handle default listeners
+ if ( ! stopDefaultListeners ) {
+ List<Class> defaultListeners = (List<Class>) reflectionManager.getDefaults().get( EntityListeners.class );
+
+ if ( defaultListeners != null ) {
+ int defaultListenerSize = defaultListeners.size();
+ for ( int i = defaultListenerSize - 1; i >= 0 ; i-- ) {
+ orderedListeners.add( defaultListeners.get( i ) );
+ }
+ }
+ }
+
+ for ( Class listener : orderedListeners ) {
+ Callback callback = null;
+ if ( listener != null ) {
+ XClass xListener = reflectionManager.toXClass( listener );
+ callbacksMethodNames = new ArrayList<String>();
+ do {
+ List<XMethod> methods = xListener.getDeclaredMethods();
+ final int size = methods.size();
+ for ( int i = 0; i < size ; i++ ) {
+ final XMethod xMethod = methods.get( i );
+ if ( xMethod.isAnnotationPresent( annotation ) ) {
+ final Method method = reflectionManager.toMethod( xMethod );
+ final String methodName = method.getName();
+ if ( ! callbacksMethodNames.contains( methodName ) ) {
+ //overriden method, remove the superclass overriden method
+ if ( callback == null ) {
+ try {
+ callback = new ListenerCallback( method, listener.newInstance() );
+ }
+ catch (IllegalAccessException e) {
+ throw new PersistenceException(
+ "Unable to create instance of " + listener.getName()
+ + " as a listener of beanClass", e
+ );
+ }
+ catch (InstantiationException e) {
+ throw new PersistenceException(
+ "Unable to create instance of " + listener.getName()
+ + " as a listener of beanClass", e
+ );
+ }
+ Class returnType = method.getReturnType();
+ Class[] args = method.getParameterTypes();
+ if ( returnType != Void.TYPE || args.length != 1 ) {
+ throw new PersistenceException(
+ "Callback methods annotated in a listener bean class must return void and take one argument: " + annotation
+ .getName() + " - " + method
+ );
+ }
+ if ( ! method.isAccessible() ) {
+ method.setAccessible( true );
+ }
+ callbacks.add( 0, callback ); // listeners first
+ }
+ else {
+ throw new PersistenceException(
+ "You can only annotate one callback method with "
+ + annotation.getName() + " in bean class: " + beanClass.getName() + " and callback listener: "
+ + listener.getName()
+ );
+ }
+ }
+ }
+ }
+ xListener = null; //xListener.getSuperclass();
+ }
+ while ( xListener != null );
+ }
+ }
+ return callbacks.toArray( new Callback[ callbacks.size() ] );
+ }
+
+ private static void getListeners(XClass currentClazz, List<Class> orderedListeners) {
+ EntityListeners entityListeners = (EntityListeners) currentClazz.getAnnotation( EntityListeners.class );
+ if ( entityListeners != null ) {
+ Class[] classes = entityListeners.value();
+ int size = classes.length;
+ for ( int index = size - 1; index >= 0 ; index-- ) {
+ orderedListeners.add( classes[index] );
+ }
+ }
+ if ( useAnnotationAnnotatedByListener ) {
+ Annotation[] annotations = currentClazz.getAnnotations();
+ for ( Annotation annot : annotations ) {
+ entityListeners = annot.getClass().getAnnotation( EntityListeners.class );
+ if ( entityListeners != null ) {
+ Class[] classes = entityListeners.value();
+ int size = classes.length;
+ for ( int index = size - 1; index >= 0 ; index-- ) {
+ orderedListeners.add( classes[index] );
+ }
+ }
+ }
+ }
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3AutoFlushEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3AutoFlushEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3AutoFlushEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id$
-package org.hibernate.ejb.event;
-
-import org.hibernate.engine.CascadingAction;
-import org.hibernate.event.AutoFlushEventListener;
-import org.hibernate.event.def.DefaultAutoFlushEventListener;
-import org.hibernate.util.IdentityMap;
-
-/**
- * In EJB3, it is the create operation that is cascaded to unmanaged
- * ebtities at flush time (instead of the save-update operation in
- * Hibernate).
- *
- * @author Gavin King
- */
-public class EJB3AutoFlushEventListener extends DefaultAutoFlushEventListener {
-
- public static final AutoFlushEventListener INSTANCE = new EJB3AutoFlushEventListener();
-
- protected CascadingAction getCascadingAction() {
- return CascadingAction.PERSIST_ON_FLUSH;
- }
-
- protected Object getAnything() {
- return IdentityMap.instantiate( 10 );
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3AutoFlushEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3AutoFlushEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3AutoFlushEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3AutoFlushEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id$
+package org.hibernate.ejb.event;
+
+import org.hibernate.engine.CascadingAction;
+import org.hibernate.event.AutoFlushEventListener;
+import org.hibernate.event.def.DefaultAutoFlushEventListener;
+import org.hibernate.util.IdentityMap;
+
+/**
+ * In EJB3, it is the create operation that is cascaded to unmanaged
+ * ebtities at flush time (instead of the save-update operation in
+ * Hibernate).
+ *
+ * @author Gavin King
+ */
+public class EJB3AutoFlushEventListener extends DefaultAutoFlushEventListener {
+
+ public static final AutoFlushEventListener INSTANCE = new EJB3AutoFlushEventListener();
+
+ protected CascadingAction getCascadingAction() {
+ return CascadingAction.PERSIST_ON_FLUSH;
+ }
+
+ protected Object getAnything() {
+ return IdentityMap.instantiate( 10 );
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id$
-package org.hibernate.ejb.event;
-
-import java.io.Serializable;
-
-import org.hibernate.event.EventSource;
-import org.hibernate.event.DeleteEvent;
-import org.hibernate.event.def.DefaultDeleteEventListener;
-import org.hibernate.persister.entity.EntityPersister;
-
-/**
- * Overrides the LifeCycle OnSave call to call the PreRemove operation
- *
- * @author Emmanuel Bernard
- */
-public class EJB3DeleteEventListener extends DefaultDeleteEventListener implements CallbackHandlerConsumer {
- private EntityCallbackHandler callbackHandler;
-
- public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public EJB3DeleteEventListener() {
- super();
- }
-
- public EJB3DeleteEventListener(EntityCallbackHandler callbackHandler) {
- this();
- this.callbackHandler = callbackHandler;
- }
-
- @Override
- protected boolean invokeDeleteLifecycle(EventSource session, Object entity, EntityPersister persister) {
- callbackHandler.preRemove( entity );
- return super.invokeDeleteLifecycle( session, entity, persister );
- }
-
- @Override
- protected void performDetachedEntityDeletionCheck(DeleteEvent event) {
- EventSource source = event.getSession();
- String entityName = event.getEntityName();
- EntityPersister persister = source.getEntityPersister( entityName, event.getObject() );
- Serializable id = persister.getIdentifier( event.getObject(), source.getEntityMode() );
- entityName = entityName == null ? source.guessEntityName( event.getObject() ) : entityName;
- throw new IllegalArgumentException("Removing a detached instance "+ entityName + "#" + id);
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3DeleteEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id$
+package org.hibernate.ejb.event;
+
+import java.io.Serializable;
+
+import org.hibernate.event.EventSource;
+import org.hibernate.event.DeleteEvent;
+import org.hibernate.event.def.DefaultDeleteEventListener;
+import org.hibernate.persister.entity.EntityPersister;
+
+/**
+ * Overrides the LifeCycle OnSave call to call the PreRemove operation
+ *
+ * @author Emmanuel Bernard
+ */
+public class EJB3DeleteEventListener extends DefaultDeleteEventListener implements CallbackHandlerConsumer {
+ private EntityCallbackHandler callbackHandler;
+
+ public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public EJB3DeleteEventListener() {
+ super();
+ }
+
+ public EJB3DeleteEventListener(EntityCallbackHandler callbackHandler) {
+ this();
+ this.callbackHandler = callbackHandler;
+ }
+
+ @Override
+ protected boolean invokeDeleteLifecycle(EventSource session, Object entity, EntityPersister persister) {
+ callbackHandler.preRemove( entity );
+ return super.invokeDeleteLifecycle( session, entity, persister );
+ }
+
+ @Override
+ protected void performDetachedEntityDeletionCheck(DeleteEvent event) {
+ EventSource source = event.getSession();
+ String entityName = event.getEntityName();
+ EntityPersister persister = source.getEntityPersister( entityName, event.getObject() );
+ Serializable id = persister.getIdentifier( event.getObject(), source.getEntityMode() );
+ entityName = entityName == null ? source.guessEntityName( event.getObject() ) : entityName;
+ throw new IllegalArgumentException("Removing a detached instance "+ entityName + "#" + id);
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEntityEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEntityEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEntityEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,64 +0,0 @@
-//$Id$
-package org.hibernate.ejb.event;
-
-import org.hibernate.EntityMode;
-import org.hibernate.SessionFactory;
-import org.hibernate.engine.EntityEntry;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.engine.Status;
-import org.hibernate.event.def.DefaultFlushEntityEventListener;
-import org.hibernate.metadata.ClassMetadata;
-import org.hibernate.persister.entity.EntityPersister;
-import org.hibernate.type.Type;
-
-/**
- * Overrides the LifeCycle OnSave call to call the PreUpdate operation
- *
- * @author Emmanuel Bernard
- */
-public class EJB3FlushEntityEventListener extends DefaultFlushEntityEventListener implements CallbackHandlerConsumer {
- private EntityCallbackHandler callbackHandler;
-
- public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public EJB3FlushEntityEventListener() {
- super();
- }
-
- public EJB3FlushEntityEventListener(EntityCallbackHandler callbackHandler) {
- super();
- this.callbackHandler = callbackHandler;
- }
-
- @Override
- protected boolean invokeInterceptor(
- SessionImplementor session, Object entity, EntityEntry entry, Object[] values, EntityPersister persister
- ) {
- boolean isDirty = false;
- if ( entry.getStatus() != Status.DELETED ) {
- if ( callbackHandler.preUpdate( entity ) ) {
- isDirty = copyState( entity, persister.getPropertyTypes(), values, session.getFactory() );
- }
- }
- return super.invokeInterceptor( session, entity, entry, values, persister ) || isDirty;
- }
-
- /**
- * copy the entity state into the state array and return true if the state has changed
- */
- private boolean copyState(Object entity, Type[] types, Object[] state, SessionFactory sf) {
- ClassMetadata metadata = sf.getClassMetadata( entity.getClass() );
- Object[] newState = metadata.getPropertyValues( entity, EntityMode.POJO );
- int size = newState.length;
- boolean isDirty = false;
- for ( int index = 0; index < size ; index++ ) {
- if ( !types[index].isEqual( state[index], newState[index], EntityMode.POJO ) ) {
- isDirty = true;
- state[index] = newState[index];
- }
- }
- return isDirty;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEntityEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEntityEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEntityEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEntityEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,64 @@
+//$Id$
+package org.hibernate.ejb.event;
+
+import org.hibernate.EntityMode;
+import org.hibernate.SessionFactory;
+import org.hibernate.engine.EntityEntry;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.engine.Status;
+import org.hibernate.event.def.DefaultFlushEntityEventListener;
+import org.hibernate.metadata.ClassMetadata;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.type.Type;
+
+/**
+ * Overrides the LifeCycle OnSave call to call the PreUpdate operation
+ *
+ * @author Emmanuel Bernard
+ */
+public class EJB3FlushEntityEventListener extends DefaultFlushEntityEventListener implements CallbackHandlerConsumer {
+ private EntityCallbackHandler callbackHandler;
+
+ public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public EJB3FlushEntityEventListener() {
+ super();
+ }
+
+ public EJB3FlushEntityEventListener(EntityCallbackHandler callbackHandler) {
+ super();
+ this.callbackHandler = callbackHandler;
+ }
+
+ @Override
+ protected boolean invokeInterceptor(
+ SessionImplementor session, Object entity, EntityEntry entry, Object[] values, EntityPersister persister
+ ) {
+ boolean isDirty = false;
+ if ( entry.getStatus() != Status.DELETED ) {
+ if ( callbackHandler.preUpdate( entity ) ) {
+ isDirty = copyState( entity, persister.getPropertyTypes(), values, session.getFactory() );
+ }
+ }
+ return super.invokeInterceptor( session, entity, entry, values, persister ) || isDirty;
+ }
+
+ /**
+ * copy the entity state into the state array and return true if the state has changed
+ */
+ private boolean copyState(Object entity, Type[] types, Object[] state, SessionFactory sf) {
+ ClassMetadata metadata = sf.getClassMetadata( entity.getClass() );
+ Object[] newState = metadata.getPropertyValues( entity, EntityMode.POJO );
+ int size = newState.length;
+ boolean isDirty = false;
+ for ( int index = 0; index < size ; index++ ) {
+ if ( !types[index].isEqual( state[index], newState[index], EntityMode.POJO ) ) {
+ isDirty = true;
+ state[index] = newState[index];
+ }
+ }
+ return isDirty;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id$
-package org.hibernate.ejb.event;
-
-import org.hibernate.engine.CascadingAction;
-import org.hibernate.event.FlushEventListener;
-import org.hibernate.event.def.DefaultFlushEventListener;
-import org.hibernate.util.IdentityMap;
-
-/**
- * In EJB3, it is the create operation that is cascaded to unmanaged
- * ebtities at flush time (instead of the save-update operation in
- * Hibernate).
- *
- * @author Gavin King
- */
-public class EJB3FlushEventListener extends DefaultFlushEventListener {
-
- public static final FlushEventListener INSTANCE = new EJB3FlushEventListener();
-
- protected CascadingAction getCascadingAction() {
- return CascadingAction.PERSIST_ON_FLUSH;
- }
-
- protected Object getAnything() {
- return IdentityMap.instantiate( 10 );
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3FlushEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id$
+package org.hibernate.ejb.event;
+
+import org.hibernate.engine.CascadingAction;
+import org.hibernate.event.FlushEventListener;
+import org.hibernate.event.def.DefaultFlushEventListener;
+import org.hibernate.util.IdentityMap;
+
+/**
+ * In EJB3, it is the create operation that is cascaded to unmanaged
+ * ebtities at flush time (instead of the save-update operation in
+ * Hibernate).
+ *
+ * @author Gavin King
+ */
+public class EJB3FlushEventListener extends DefaultFlushEventListener {
+
+ public static final FlushEventListener INSTANCE = new EJB3FlushEventListener();
+
+ protected CascadingAction getCascadingAction() {
+ return CascadingAction.PERSIST_ON_FLUSH;
+ }
+
+ protected Object getAnything() {
+ return IdentityMap.instantiate( 10 );
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3MergeEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3MergeEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3MergeEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,46 +0,0 @@
-//$Id$
-package org.hibernate.ejb.event;
-
-import java.io.Serializable;
-
-import org.hibernate.event.EventSource;
-import org.hibernate.event.def.DefaultMergeEventListener;
-import org.hibernate.persister.entity.EntityPersister;
-
-/**
- * Overrides the LifeCycle OnSave call to call the PrePersist operation
- *
- * @author Emmanuel Bernard
- */
-public class EJB3MergeEventListener extends DefaultMergeEventListener implements CallbackHandlerConsumer {
- private EntityCallbackHandler callbackHandler;
-
- public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public EJB3MergeEventListener() {
- super();
- }
-
- public EJB3MergeEventListener(EntityCallbackHandler callbackHandler) {
- super();
- this.callbackHandler = callbackHandler;
- }
-
- @Override
- protected Serializable saveWithRequestedId(Object entity, Serializable requestedId, String entityName,
- Object anything, EventSource source) {
- callbackHandler.preCreate( entity );
- return super.saveWithRequestedId( entity, requestedId, entityName, anything,
- source );
- }
-
- @Override
- protected Serializable saveWithGeneratedId(Object entity, String entityName, Object anything, EventSource source,
- boolean requiresImmediateIdAccess) {
- callbackHandler.preCreate( entity );
- return super.saveWithGeneratedId( entity, entityName, anything, source,
- requiresImmediateIdAccess );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3MergeEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3MergeEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3MergeEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3MergeEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,46 @@
+//$Id$
+package org.hibernate.ejb.event;
+
+import java.io.Serializable;
+
+import org.hibernate.event.EventSource;
+import org.hibernate.event.def.DefaultMergeEventListener;
+import org.hibernate.persister.entity.EntityPersister;
+
+/**
+ * Overrides the LifeCycle OnSave call to call the PrePersist operation
+ *
+ * @author Emmanuel Bernard
+ */
+public class EJB3MergeEventListener extends DefaultMergeEventListener implements CallbackHandlerConsumer {
+ private EntityCallbackHandler callbackHandler;
+
+ public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public EJB3MergeEventListener() {
+ super();
+ }
+
+ public EJB3MergeEventListener(EntityCallbackHandler callbackHandler) {
+ super();
+ this.callbackHandler = callbackHandler;
+ }
+
+ @Override
+ protected Serializable saveWithRequestedId(Object entity, Serializable requestedId, String entityName,
+ Object anything, EventSource source) {
+ callbackHandler.preCreate( entity );
+ return super.saveWithRequestedId( entity, requestedId, entityName, anything,
+ source );
+ }
+
+ @Override
+ protected Serializable saveWithGeneratedId(Object entity, String entityName, Object anything, EventSource source,
+ boolean requiresImmediateIdAccess) {
+ callbackHandler.preCreate( entity );
+ return super.saveWithGeneratedId( entity, entityName, anything, source,
+ requiresImmediateIdAccess );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id$
-package org.hibernate.ejb.event;
-
-import java.io.Serializable;
-
-import org.hibernate.event.EventSource;
-import org.hibernate.event.def.DefaultPersistEventListener;
-import org.hibernate.engine.CascadingAction;
-import org.hibernate.engine.EJB3CascadingAction;
-import org.hibernate.engine.EJB3CascadeStyle;
-
-/**
- * Overrides the LifeCycle OnSave call to call the PrePersist operation
- *
- * @author Emmanuel Bernard
- */
-public class EJB3PersistEventListener extends DefaultPersistEventListener implements CallbackHandlerConsumer {
- static {
- EJB3CascadeStyle.PERSIST_EJB3.hasOrphanDelete(); //triggers class loading
- }
-
- private EntityCallbackHandler callbackHandler;
-
- public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public EJB3PersistEventListener() {
- super();
- }
-
- public EJB3PersistEventListener(EntityCallbackHandler callbackHandler) {
- super();
- this.callbackHandler = callbackHandler;
- }
-
- @Override
- protected Serializable saveWithRequestedId(Object entity, Serializable requestedId, String entityName,
- Object anything, EventSource source) {
- callbackHandler.preCreate( entity );
- return super.saveWithRequestedId( entity, requestedId, entityName, anything,
- source );
- }
-
- @Override
- protected Serializable saveWithGeneratedId(Object entity, String entityName, Object anything, EventSource source,
- boolean requiresImmediateIdAccess) {
- callbackHandler.preCreate( entity );
- return super.saveWithGeneratedId( entity, entityName, anything, source,
- requiresImmediateIdAccess );
- }
-
- @Override
- protected CascadingAction getCascadeAction() {
- return EJB3CascadingAction.PERSIST_SKIPLAZY;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id$
+package org.hibernate.ejb.event;
+
+import java.io.Serializable;
+
+import org.hibernate.event.EventSource;
+import org.hibernate.event.def.DefaultPersistEventListener;
+import org.hibernate.engine.CascadingAction;
+import org.hibernate.engine.EJB3CascadingAction;
+import org.hibernate.engine.EJB3CascadeStyle;
+
+/**
+ * Overrides the LifeCycle OnSave call to call the PrePersist operation
+ *
+ * @author Emmanuel Bernard
+ */
+public class EJB3PersistEventListener extends DefaultPersistEventListener implements CallbackHandlerConsumer {
+ static {
+ EJB3CascadeStyle.PERSIST_EJB3.hasOrphanDelete(); //triggers class loading
+ }
+
+ private EntityCallbackHandler callbackHandler;
+
+ public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public EJB3PersistEventListener() {
+ super();
+ }
+
+ public EJB3PersistEventListener(EntityCallbackHandler callbackHandler) {
+ super();
+ this.callbackHandler = callbackHandler;
+ }
+
+ @Override
+ protected Serializable saveWithRequestedId(Object entity, Serializable requestedId, String entityName,
+ Object anything, EventSource source) {
+ callbackHandler.preCreate( entity );
+ return super.saveWithRequestedId( entity, requestedId, entityName, anything,
+ source );
+ }
+
+ @Override
+ protected Serializable saveWithGeneratedId(Object entity, String entityName, Object anything, EventSource source,
+ boolean requiresImmediateIdAccess) {
+ callbackHandler.preCreate( entity );
+ return super.saveWithGeneratedId( entity, entityName, anything, source,
+ requiresImmediateIdAccess );
+ }
+
+ @Override
+ protected CascadingAction getCascadeAction() {
+ return EJB3CascadingAction.PERSIST_SKIPLAZY;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistOnFlushEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistOnFlushEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistOnFlushEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id$
-package org.hibernate.ejb.event;
-
-import org.hibernate.engine.CascadingAction;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EJB3PersistOnFlushEventListener extends EJB3PersistEventListener {
- @Override
- protected CascadingAction getCascadeAction() {
- return CascadingAction.PERSIST_ON_FLUSH;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistOnFlushEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistOnFlushEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistOnFlushEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PersistOnFlushEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id$
+package org.hibernate.ejb.event;
+
+import org.hibernate.engine.CascadingAction;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EJB3PersistOnFlushEventListener extends EJB3PersistEventListener {
+ @Override
+ protected CascadingAction getCascadeAction() {
+ return CascadingAction.PERSIST_ON_FLUSH;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostDeleteEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostDeleteEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostDeleteEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-/*
- * JBoss, the OpenSource EJB server
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.hibernate.ejb.event;
-
-import org.hibernate.event.PostDeleteEvent;
-import org.hibernate.event.PostDeleteEventListener;
-
-/**
- * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
- * @version $Revision$
- */
-public class EJB3PostDeleteEventListener implements PostDeleteEventListener, CallbackHandlerConsumer {
- EntityCallbackHandler callbackHandler;
-
- public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public EJB3PostDeleteEventListener() {
- super();
- }
-
- public EJB3PostDeleteEventListener(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public void onPostDelete(PostDeleteEvent event) {
- Object entity = event.getEntity();
- callbackHandler.postRemove( entity );
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostDeleteEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostDeleteEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostDeleteEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostDeleteEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+/*
+ * JBoss, the OpenSource EJB server
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.hibernate.ejb.event;
+
+import org.hibernate.event.PostDeleteEvent;
+import org.hibernate.event.PostDeleteEventListener;
+
+/**
+ * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class EJB3PostDeleteEventListener implements PostDeleteEventListener, CallbackHandlerConsumer {
+ EntityCallbackHandler callbackHandler;
+
+ public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public EJB3PostDeleteEventListener() {
+ super();
+ }
+
+ public EJB3PostDeleteEventListener(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public void onPostDelete(PostDeleteEvent event) {
+ Object entity = event.getEntity();
+ callbackHandler.postRemove( entity );
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostInsertEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostInsertEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostInsertEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-/*
- * JBoss, the OpenSource EJB server
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.hibernate.ejb.event;
-
-import org.hibernate.event.PostInsertEvent;
-import org.hibernate.event.PostInsertEventListener;
-
-/**
- * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
- * @version $Revision$
- */
-public class EJB3PostInsertEventListener implements PostInsertEventListener, CallbackHandlerConsumer {
- EntityCallbackHandler callbackHandler;
-
- public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public EJB3PostInsertEventListener() {
- super();
- }
-
- public EJB3PostInsertEventListener(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public void onPostInsert(PostInsertEvent event) {
- Object entity = event.getEntity();
- callbackHandler.postCreate( entity );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostInsertEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostInsertEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostInsertEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostInsertEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+/*
+ * JBoss, the OpenSource EJB server
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.hibernate.ejb.event;
+
+import org.hibernate.event.PostInsertEvent;
+import org.hibernate.event.PostInsertEventListener;
+
+/**
+ * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class EJB3PostInsertEventListener implements PostInsertEventListener, CallbackHandlerConsumer {
+ EntityCallbackHandler callbackHandler;
+
+ public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public EJB3PostInsertEventListener() {
+ super();
+ }
+
+ public EJB3PostInsertEventListener(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public void onPostInsert(PostInsertEvent event) {
+ Object entity = event.getEntity();
+ callbackHandler.postCreate( entity );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostLoadEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostLoadEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostLoadEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-/*
- * JBoss, the OpenSource EJB server
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.hibernate.ejb.event;
-
-import org.hibernate.event.PostLoadEvent;
-import org.hibernate.event.PostLoadEventListener;
-
-/**
- * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
- * @version $Revision$
- */
-public class EJB3PostLoadEventListener implements PostLoadEventListener, CallbackHandlerConsumer {
- EntityCallbackHandler callbackHandler;
-
- public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public EJB3PostLoadEventListener() {
- super();
- }
-
- public EJB3PostLoadEventListener(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public void onPostLoad(PostLoadEvent event) {
- Object entity = event.getEntity();
- callbackHandler.postLoad( entity );
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostLoadEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostLoadEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostLoadEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostLoadEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+/*
+ * JBoss, the OpenSource EJB server
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.hibernate.ejb.event;
+
+import org.hibernate.event.PostLoadEvent;
+import org.hibernate.event.PostLoadEventListener;
+
+/**
+ * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class EJB3PostLoadEventListener implements PostLoadEventListener, CallbackHandlerConsumer {
+ EntityCallbackHandler callbackHandler;
+
+ public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public EJB3PostLoadEventListener() {
+ super();
+ }
+
+ public EJB3PostLoadEventListener(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public void onPostLoad(PostLoadEvent event) {
+ Object entity = event.getEntity();
+ callbackHandler.postLoad( entity );
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostUpdateEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostUpdateEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostUpdateEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-/*
- * JBoss, the OpenSource EJB server
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.hibernate.ejb.event;
-
-import org.hibernate.event.PostUpdateEvent;
-import org.hibernate.event.PostUpdateEventListener;
-import org.hibernate.engine.EntityEntry;
-import org.hibernate.engine.Status;
-
-/**
- * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
- * @version $Revision$
- */
-public class EJB3PostUpdateEventListener implements PostUpdateEventListener, CallbackHandlerConsumer {
- EntityCallbackHandler callbackHandler;
-
- public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public EJB3PostUpdateEventListener() {
- super();
- }
-
- public EJB3PostUpdateEventListener(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public void onPostUpdate(PostUpdateEvent event) {
- Object entity = event.getEntity();
- EntityEntry entry = (EntityEntry) event.getSession().getPersistenceContext().getEntityEntries().get( entity );
- //mimic the preUpdate filter
- if ( Status.DELETED != entry.getStatus() ) {
- callbackHandler.postUpdate( entity );
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostUpdateEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostUpdateEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostUpdateEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3PostUpdateEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+/*
+ * JBoss, the OpenSource EJB server
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.hibernate.ejb.event;
+
+import org.hibernate.event.PostUpdateEvent;
+import org.hibernate.event.PostUpdateEventListener;
+import org.hibernate.engine.EntityEntry;
+import org.hibernate.engine.Status;
+
+/**
+ * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class EJB3PostUpdateEventListener implements PostUpdateEventListener, CallbackHandlerConsumer {
+ EntityCallbackHandler callbackHandler;
+
+ public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public EJB3PostUpdateEventListener() {
+ super();
+ }
+
+ public EJB3PostUpdateEventListener(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public void onPostUpdate(PostUpdateEvent event) {
+ Object entity = event.getEntity();
+ EntityEntry entry = (EntityEntry) event.getSession().getPersistenceContext().getEntityEntries().get( entity );
+ //mimic the preUpdate filter
+ if ( Status.DELETED != entry.getStatus() ) {
+ callbackHandler.postUpdate( entity );
+ }
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,46 +0,0 @@
-//$Id$
-package org.hibernate.ejb.event;
-
-import java.io.Serializable;
-
-import org.hibernate.event.EventSource;
-import org.hibernate.event.def.DefaultSaveEventListener;
-import org.hibernate.persister.entity.EntityPersister;
-
-/**
- * Overrides the LifeCycle OnSave call to call the PrePersist operation
- *
- * @author Emmanuel Bernard
- */
-public class EJB3SaveEventListener extends DefaultSaveEventListener implements CallbackHandlerConsumer {
- private EntityCallbackHandler callbackHandler;
-
- public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public EJB3SaveEventListener() {
- super();
- }
-
- public EJB3SaveEventListener(EntityCallbackHandler callbackHandler) {
- super();
- this.callbackHandler = callbackHandler;
- }
-
- @Override
- protected Serializable saveWithRequestedId(Object entity, Serializable requestedId, String entityName,
- Object anything, EventSource source) {
- callbackHandler.preCreate( entity );
- return super.saveWithRequestedId( entity, requestedId, entityName, anything,
- source );
- }
-
- @Override
- protected Serializable saveWithGeneratedId(Object entity, String entityName, Object anything, EventSource source,
- boolean requiresImmediateIdAccess) {
- callbackHandler.preCreate( entity );
- return super.saveWithGeneratedId( entity, entityName, anything, source,
- requiresImmediateIdAccess );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,46 @@
+//$Id$
+package org.hibernate.ejb.event;
+
+import java.io.Serializable;
+
+import org.hibernate.event.EventSource;
+import org.hibernate.event.def.DefaultSaveEventListener;
+import org.hibernate.persister.entity.EntityPersister;
+
+/**
+ * Overrides the LifeCycle OnSave call to call the PrePersist operation
+ *
+ * @author Emmanuel Bernard
+ */
+public class EJB3SaveEventListener extends DefaultSaveEventListener implements CallbackHandlerConsumer {
+ private EntityCallbackHandler callbackHandler;
+
+ public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public EJB3SaveEventListener() {
+ super();
+ }
+
+ public EJB3SaveEventListener(EntityCallbackHandler callbackHandler) {
+ super();
+ this.callbackHandler = callbackHandler;
+ }
+
+ @Override
+ protected Serializable saveWithRequestedId(Object entity, Serializable requestedId, String entityName,
+ Object anything, EventSource source) {
+ callbackHandler.preCreate( entity );
+ return super.saveWithRequestedId( entity, requestedId, entityName, anything,
+ source );
+ }
+
+ @Override
+ protected Serializable saveWithGeneratedId(Object entity, String entityName, Object anything, EventSource source,
+ boolean requiresImmediateIdAccess) {
+ callbackHandler.preCreate( entity );
+ return super.saveWithGeneratedId( entity, entityName, anything, source,
+ requiresImmediateIdAccess );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveOrUpdateEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveOrUpdateEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveOrUpdateEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,46 +0,0 @@
-//$Id$
-package org.hibernate.ejb.event;
-
-import java.io.Serializable;
-
-import org.hibernate.event.EventSource;
-import org.hibernate.event.def.DefaultSaveOrUpdateEventListener;
-import org.hibernate.persister.entity.EntityPersister;
-
-/**
- * Overrides the LifeCycle OnSave call to call the PrePersist operation
- *
- * @author Emmanuel Bernard
- */
-public class EJB3SaveOrUpdateEventListener extends DefaultSaveOrUpdateEventListener implements CallbackHandlerConsumer {
- private EntityCallbackHandler callbackHandler;
-
- public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
- this.callbackHandler = callbackHandler;
- }
-
- public EJB3SaveOrUpdateEventListener() {
- super();
- }
-
- public EJB3SaveOrUpdateEventListener(EntityCallbackHandler callbackHandler) {
- super();
- this.callbackHandler = callbackHandler;
- }
-
- @Override
- protected Serializable saveWithRequestedId(Object entity, Serializable requestedId, String entityName,
- Object anything, EventSource source) {
- callbackHandler.preCreate( entity );
- return super.saveWithRequestedId( entity, requestedId, entityName, anything,
- source );
- }
-
- @Override
- protected Serializable saveWithGeneratedId(Object entity, String entityName, Object anything, EventSource source,
- boolean requiresImmediateIdAccess) {
- callbackHandler.preCreate( entity );
- return super.saveWithGeneratedId( entity, entityName, anything, source,
- requiresImmediateIdAccess );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveOrUpdateEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveOrUpdateEventListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveOrUpdateEventListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EJB3SaveOrUpdateEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,46 @@
+//$Id$
+package org.hibernate.ejb.event;
+
+import java.io.Serializable;
+
+import org.hibernate.event.EventSource;
+import org.hibernate.event.def.DefaultSaveOrUpdateEventListener;
+import org.hibernate.persister.entity.EntityPersister;
+
+/**
+ * Overrides the LifeCycle OnSave call to call the PrePersist operation
+ *
+ * @author Emmanuel Bernard
+ */
+public class EJB3SaveOrUpdateEventListener extends DefaultSaveOrUpdateEventListener implements CallbackHandlerConsumer {
+ private EntityCallbackHandler callbackHandler;
+
+ public void setCallbackHandler(EntityCallbackHandler callbackHandler) {
+ this.callbackHandler = callbackHandler;
+ }
+
+ public EJB3SaveOrUpdateEventListener() {
+ super();
+ }
+
+ public EJB3SaveOrUpdateEventListener(EntityCallbackHandler callbackHandler) {
+ super();
+ this.callbackHandler = callbackHandler;
+ }
+
+ @Override
+ protected Serializable saveWithRequestedId(Object entity, Serializable requestedId, String entityName,
+ Object anything, EventSource source) {
+ callbackHandler.preCreate( entity );
+ return super.saveWithRequestedId( entity, requestedId, entityName, anything,
+ source );
+ }
+
+ @Override
+ protected Serializable saveWithGeneratedId(Object entity, String entityName, Object anything, EventSource source,
+ boolean requiresImmediateIdAccess) {
+ callbackHandler.preCreate( entity );
+ return super.saveWithGeneratedId( entity, entityName, anything, source,
+ requiresImmediateIdAccess );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EntityCallbackHandler.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EntityCallbackHandler.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EntityCallbackHandler.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,95 +0,0 @@
-/*
- * JBoss, the OpenSource EJB server
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.hibernate.ejb.event;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import javax.persistence.PostLoad;
-import javax.persistence.PostPersist;
-import javax.persistence.PostRemove;
-import javax.persistence.PostUpdate;
-import javax.persistence.PrePersist;
-import javax.persistence.PreRemove;
-import javax.persistence.PreUpdate;
-
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-
-/**
- * Keep track of all lifecycle callbacks and listeners for a given persistence unit
- *
- * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
- */
-public class EntityCallbackHandler implements Serializable {
- private HashMap<Class, Callback[]> preCreates = new HashMap<Class, Callback[]>();
- private HashMap<Class, Callback[]> postCreates = new HashMap<Class, Callback[]>();
- private HashMap<Class, Callback[]> preRemoves = new HashMap<Class, Callback[]>();
- private HashMap<Class, Callback[]> postRemoves = new HashMap<Class, Callback[]>();
- private HashMap<Class, Callback[]> preUpdates = new HashMap<Class, Callback[]>();
- private HashMap<Class, Callback[]> postUpdates = new HashMap<Class, Callback[]>();
- private HashMap<Class, Callback[]> postLoads = new HashMap<Class, Callback[]>();
-
- public void add(XClass entity, ReflectionManager reflectionManager) {
- addCallback( entity, preCreates, PrePersist.class, reflectionManager );
- addCallback( entity, postCreates, PostPersist.class, reflectionManager );
- addCallback( entity, preRemoves, PreRemove.class, reflectionManager );
- addCallback( entity, postRemoves, PostRemove.class, reflectionManager );
- addCallback( entity, preUpdates, PreUpdate.class, reflectionManager );
- addCallback( entity, postUpdates, PostUpdate.class, reflectionManager );
- addCallback( entity, postLoads, PostLoad.class, reflectionManager );
- }
-
- public boolean preCreate(Object bean) {
- return callback( preCreates.get( bean.getClass() ), bean );
- }
-
- public boolean postCreate(Object bean) {
- return callback( postCreates.get( bean.getClass() ), bean );
- }
-
- public boolean preRemove(Object bean) {
- return callback( preRemoves.get( bean.getClass() ), bean );
- }
-
- public boolean postRemove(Object bean) {
- return callback( postRemoves.get( bean.getClass() ), bean );
- }
-
- public boolean preUpdate(Object bean) {
- return callback( preUpdates.get( bean.getClass() ), bean );
- }
-
- public boolean postUpdate(Object bean) {
- return callback( postUpdates.get( bean.getClass() ), bean );
- }
-
- public boolean postLoad(Object bean) {
- return callback( postLoads.get( bean.getClass() ), bean );
- }
-
-
- private boolean callback(Callback[] callbacks, Object bean) {
- if ( callbacks != null && callbacks.length != 0 ) {
- for ( Callback callback : callbacks ) {
- callback.invoke( bean );
- }
- return true;
- }
- else {
- return false;
- }
- }
-
-
- private void addCallback(
- XClass entity, HashMap<Class, Callback[]> map, Class annotation, ReflectionManager reflectionManager
- ) {
- Callback[] callbacks = null;
- callbacks = CallbackResolver.resolveCallback( entity, annotation, reflectionManager );
- map.put( reflectionManager.toClass( entity ), callbacks );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EntityCallbackHandler.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EntityCallbackHandler.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EntityCallbackHandler.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/EntityCallbackHandler.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,95 @@
+/*
+ * JBoss, the OpenSource EJB server
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.hibernate.ejb.event;
+
+import java.io.Serializable;
+import java.util.HashMap;
+import javax.persistence.PostLoad;
+import javax.persistence.PostPersist;
+import javax.persistence.PostRemove;
+import javax.persistence.PostUpdate;
+import javax.persistence.PrePersist;
+import javax.persistence.PreRemove;
+import javax.persistence.PreUpdate;
+
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+
+/**
+ * Keep track of all lifecycle callbacks and listeners for a given persistence unit
+ *
+ * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
+ */
+public class EntityCallbackHandler implements Serializable {
+ private HashMap<Class, Callback[]> preCreates = new HashMap<Class, Callback[]>();
+ private HashMap<Class, Callback[]> postCreates = new HashMap<Class, Callback[]>();
+ private HashMap<Class, Callback[]> preRemoves = new HashMap<Class, Callback[]>();
+ private HashMap<Class, Callback[]> postRemoves = new HashMap<Class, Callback[]>();
+ private HashMap<Class, Callback[]> preUpdates = new HashMap<Class, Callback[]>();
+ private HashMap<Class, Callback[]> postUpdates = new HashMap<Class, Callback[]>();
+ private HashMap<Class, Callback[]> postLoads = new HashMap<Class, Callback[]>();
+
+ public void add(XClass entity, ReflectionManager reflectionManager) {
+ addCallback( entity, preCreates, PrePersist.class, reflectionManager );
+ addCallback( entity, postCreates, PostPersist.class, reflectionManager );
+ addCallback( entity, preRemoves, PreRemove.class, reflectionManager );
+ addCallback( entity, postRemoves, PostRemove.class, reflectionManager );
+ addCallback( entity, preUpdates, PreUpdate.class, reflectionManager );
+ addCallback( entity, postUpdates, PostUpdate.class, reflectionManager );
+ addCallback( entity, postLoads, PostLoad.class, reflectionManager );
+ }
+
+ public boolean preCreate(Object bean) {
+ return callback( preCreates.get( bean.getClass() ), bean );
+ }
+
+ public boolean postCreate(Object bean) {
+ return callback( postCreates.get( bean.getClass() ), bean );
+ }
+
+ public boolean preRemove(Object bean) {
+ return callback( preRemoves.get( bean.getClass() ), bean );
+ }
+
+ public boolean postRemove(Object bean) {
+ return callback( postRemoves.get( bean.getClass() ), bean );
+ }
+
+ public boolean preUpdate(Object bean) {
+ return callback( preUpdates.get( bean.getClass() ), bean );
+ }
+
+ public boolean postUpdate(Object bean) {
+ return callback( postUpdates.get( bean.getClass() ), bean );
+ }
+
+ public boolean postLoad(Object bean) {
+ return callback( postLoads.get( bean.getClass() ), bean );
+ }
+
+
+ private boolean callback(Callback[] callbacks, Object bean) {
+ if ( callbacks != null && callbacks.length != 0 ) {
+ for ( Callback callback : callbacks ) {
+ callback.invoke( bean );
+ }
+ return true;
+ }
+ else {
+ return false;
+ }
+ }
+
+
+ private void addCallback(
+ XClass entity, HashMap<Class, Callback[]> map, Class annotation, ReflectionManager reflectionManager
+ ) {
+ Callback[] callbacks = null;
+ callbacks = CallbackResolver.resolveCallback( entity, annotation, reflectionManager );
+ map.put( reflectionManager.toClass( entity ), callbacks );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/ListenerCallback.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/ListenerCallback.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/ListenerCallback.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,65 +0,0 @@
-/*
- * JBoss, the OpenSource EJB server
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package org.hibernate.ejb.event;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
-
-import org.hibernate.util.ReflectHelper;
-
-/**
- * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
- * @version $Revision$
- */
-public class ListenerCallback extends Callback {
- protected transient Object listener;
-
- public ListenerCallback(Method callbackMethod, Object listener) {
- super( callbackMethod );
- this.listener = listener;
- }
-
- public void invoke(Object bean) {
- try {
- callbackMethod.invoke( listener, new Object[]{bean} );
- }
- catch (InvocationTargetException e) {
- //keep runtime exceptions as is
- if ( e.getTargetException() instanceof RuntimeException ) {
- throw (RuntimeException) e.getTargetException();
- }
- else {
- throw new RuntimeException( e.getTargetException() );
- }
- }
- catch (Exception e) {
- throw new RuntimeException( e );
- }
- }
-
- private void writeObject(ObjectOutputStream oos) throws IOException {
- oos.defaultWriteObject();
- oos.writeObject( listener.getClass().getName() );
- }
-
- private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
- ois.defaultReadObject();
- String listenerClass = (String) ois.readObject();
- try {
- listener = ReflectHelper.classForName( listenerClass, this.getClass() ).newInstance();
- }
- catch (InstantiationException e) {
- throw new ClassNotFoundException( "Unable to load class:" + listenerClass, e );
- }
- catch (IllegalAccessException e) {
- throw new ClassNotFoundException( "Unable to load class:" + listenerClass, e );
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/ListenerCallback.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/ListenerCallback.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/ListenerCallback.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/event/ListenerCallback.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,65 @@
+/*
+ * JBoss, the OpenSource EJB server
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package org.hibernate.ejb.event;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.lang.reflect.Method;
+import java.lang.reflect.InvocationTargetException;
+
+import org.hibernate.util.ReflectHelper;
+
+/**
+ * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
+ * @version $Revision$
+ */
+public class ListenerCallback extends Callback {
+ protected transient Object listener;
+
+ public ListenerCallback(Method callbackMethod, Object listener) {
+ super( callbackMethod );
+ this.listener = listener;
+ }
+
+ public void invoke(Object bean) {
+ try {
+ callbackMethod.invoke( listener, new Object[]{bean} );
+ }
+ catch (InvocationTargetException e) {
+ //keep runtime exceptions as is
+ if ( e.getTargetException() instanceof RuntimeException ) {
+ throw (RuntimeException) e.getTargetException();
+ }
+ else {
+ throw new RuntimeException( e.getTargetException() );
+ }
+ }
+ catch (Exception e) {
+ throw new RuntimeException( e );
+ }
+ }
+
+ private void writeObject(ObjectOutputStream oos) throws IOException {
+ oos.defaultWriteObject();
+ oos.writeObject( listener.getClass().getName() );
+ }
+
+ private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+ ois.defaultReadObject();
+ String listenerClass = (String) ois.readObject();
+ try {
+ listener = ReflectHelper.classForName( listenerClass, this.getClass() ).newInstance();
+ }
+ catch (InstantiationException e) {
+ throw new ClassNotFoundException( "Unable to load class:" + listenerClass, e );
+ }
+ catch (IllegalAccessException e) {
+ throw new ClassNotFoundException( "Unable to load class:" + listenerClass, e );
+ }
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument)
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,64 +0,0 @@
-//$Id$
-package org.hibernate.ejb.instrument;
-
-import java.lang.instrument.IllegalClassFormatException;
-import java.security.ProtectionDomain;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.hibernate.bytecode.util.ClassFilter;
-import org.hibernate.bytecode.util.FieldFilter;
-import org.hibernate.cfg.Environment;
-
-/**
- * Enhance the classes allowing them to implements InterceptFieldEnabled
- * This interface is then used by Hibernate for some optimizations.
- *
- * @author Emmanuel Bernard
- */
-public class InterceptFieldClassFileTransformer implements javax.persistence.spi.ClassTransformer {
- private org.hibernate.bytecode.ClassTransformer classTransformer;
-
- public InterceptFieldClassFileTransformer(List<String> entities) {
-// classTransformer = Environment.getBytecodeProvider().getEntityClassTransformer(
-// null, entities.toArray( new String[ entities.size() ] )
-// );
- final List<String> copyEntities = new ArrayList<String>( entities.size() );
- copyEntities.addAll( entities );
- classTransformer = Environment.getBytecodeProvider().getTransformer(
- //TODO change it to a static class to make it faster?
- new ClassFilter() {
- public boolean shouldInstrumentClass(String className) {
- return copyEntities.contains( className );
- }
- },
- //TODO change it to a static class to make it faster?
- new FieldFilter() {
-
- public boolean shouldInstrumentField(String className, String fieldName) {
- return true;
- }
-
- public boolean shouldTransformFieldAccess(
- String transformingClassName, String fieldOwnerClassName, String fieldName
- ) {
- return true;
- }
- }
- );
- }
-
- public byte[]
- transform(
- ClassLoader loader, String className, Class<?> classBeingRedefined,
- ProtectionDomain protectionDomain, byte[] classfileBuffer
- ) throws IllegalClassFormatException {
- try {
- return classTransformer.transform( loader, className, classBeingRedefined,
- protectionDomain, classfileBuffer );
- }
- catch (Exception e) {
- throw new IllegalClassFormatException( e.getMessage() );
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/instrument/InterceptFieldClassFileTransformer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,64 @@
+//$Id$
+package org.hibernate.ejb.instrument;
+
+import java.lang.instrument.IllegalClassFormatException;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.hibernate.bytecode.util.ClassFilter;
+import org.hibernate.bytecode.util.FieldFilter;
+import org.hibernate.cfg.Environment;
+
+/**
+ * Enhance the classes allowing them to implements InterceptFieldEnabled
+ * This interface is then used by Hibernate for some optimizations.
+ *
+ * @author Emmanuel Bernard
+ */
+public class InterceptFieldClassFileTransformer implements javax.persistence.spi.ClassTransformer {
+ private org.hibernate.bytecode.ClassTransformer classTransformer;
+
+ public InterceptFieldClassFileTransformer(List<String> entities) {
+// classTransformer = Environment.getBytecodeProvider().getEntityClassTransformer(
+// null, entities.toArray( new String[ entities.size() ] )
+// );
+ final List<String> copyEntities = new ArrayList<String>( entities.size() );
+ copyEntities.addAll( entities );
+ classTransformer = Environment.getBytecodeProvider().getTransformer(
+ //TODO change it to a static class to make it faster?
+ new ClassFilter() {
+ public boolean shouldInstrumentClass(String className) {
+ return copyEntities.contains( className );
+ }
+ },
+ //TODO change it to a static class to make it faster?
+ new FieldFilter() {
+
+ public boolean shouldInstrumentField(String className, String fieldName) {
+ return true;
+ }
+
+ public boolean shouldTransformFieldAccess(
+ String transformingClassName, String fieldOwnerClassName, String fieldName
+ ) {
+ return true;
+ }
+ }
+ );
+ }
+
+ public byte[]
+ transform(
+ ClassLoader loader, String className, Class<?> classBeingRedefined,
+ ProtectionDomain protectionDomain, byte[] classfileBuffer
+ ) throws IllegalClassFormatException {
+ try {
+ return classTransformer.transform( loader, className, classBeingRedefined,
+ protectionDomain, classfileBuffer );
+ }
+ catch (Exception e) {
+ throw new IllegalClassFormatException( e.getMessage() );
+ }
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging)
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/ExplodedJarVisitor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/ExplodedJarVisitor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/ExplodedJarVisitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,66 +0,0 @@
-//$Id$
-package org.hibernate.ejb.packaging;
-
-import java.io.BufferedInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.net.URISyntaxException;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ExplodedJarVisitor extends JarVisitor {
- private static Log log = LogFactory.getLog( ExplodedJarVisitor.class );
-
- public ExplodedJarVisitor(URL url, Filter[] filters) {
- super( url, filters );
- }
-
- public ExplodedJarVisitor(String fileName, Filter[] filters) {
- super( fileName, filters );
- }
-
- protected void doProcessElements() throws IOException {
- File jarFile;
- try {
- jarFile = new File( jarUrl.toURI().getSchemeSpecificPart() );
- }
- catch (URISyntaxException e) {
- log.warn( "Malformed url: " + jarUrl, e );
- return;
- }
- if ( !jarFile.exists() ) {
- log.warn( "Exploded jar does not exists (ignored): " + jarUrl );
- return;
- }
- if ( !jarFile.isDirectory() ) {
- log.warn( "Exploded jar file not a directory (ignored): " + jarUrl );
- return;
- }
- getClassNamesInTree( jarFile, null );
- }
-
- private void getClassNamesInTree(File jarFile, String header) throws IOException {
- File[] files = jarFile.listFiles();
- header = header == null ? "" : header + "/";
- for ( File localFile : files ) {
- if ( !localFile.isDirectory() ) {
- String entryName = localFile.getName();
- addElement(
- header + entryName,
- new BufferedInputStream( new FileInputStream( localFile ) ),
- new BufferedInputStream( new FileInputStream( localFile ) )
- );
-
- }
- else {
- getClassNamesInTree( localFile, header + localFile.getName() );
- }
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/ExplodedJarVisitor.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/ExplodedJarVisitor.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/ExplodedJarVisitor.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/ExplodedJarVisitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,66 @@
+//$Id$
+package org.hibernate.ejb.packaging;
+
+import java.io.BufferedInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URISyntaxException;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ExplodedJarVisitor extends JarVisitor {
+ private static Log log = LogFactory.getLog( ExplodedJarVisitor.class );
+
+ public ExplodedJarVisitor(URL url, Filter[] filters) {
+ super( url, filters );
+ }
+
+ public ExplodedJarVisitor(String fileName, Filter[] filters) {
+ super( fileName, filters );
+ }
+
+ protected void doProcessElements() throws IOException {
+ File jarFile;
+ try {
+ jarFile = new File( jarUrl.toURI().getSchemeSpecificPart() );
+ }
+ catch (URISyntaxException e) {
+ log.warn( "Malformed url: " + jarUrl, e );
+ return;
+ }
+ if ( !jarFile.exists() ) {
+ log.warn( "Exploded jar does not exists (ignored): " + jarUrl );
+ return;
+ }
+ if ( !jarFile.isDirectory() ) {
+ log.warn( "Exploded jar file not a directory (ignored): " + jarUrl );
+ return;
+ }
+ getClassNamesInTree( jarFile, null );
+ }
+
+ private void getClassNamesInTree(File jarFile, String header) throws IOException {
+ File[] files = jarFile.listFiles();
+ header = header == null ? "" : header + "/";
+ for ( File localFile : files ) {
+ if ( !localFile.isDirectory() ) {
+ String entryName = localFile.getName();
+ addElement(
+ header + entryName,
+ new BufferedInputStream( new FileInputStream( localFile ) ),
+ new BufferedInputStream( new FileInputStream( localFile ) )
+ );
+
+ }
+ else {
+ getClassNamesInTree( localFile, header + localFile.getName() );
+ }
+ }
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/FileZippedJarVisitor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/FileZippedJarVisitor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/FileZippedJarVisitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-//$Id$
-package org.hibernate.ejb.packaging;
-
-import java.io.BufferedInputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.net.URISyntaxException;
-import java.util.Enumeration;
-import java.util.jar.JarFile;
-import java.util.zip.ZipEntry;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Work on a JAR that can be accessed through a File
- *
- * @author Emmanuel Bernard
- */
-public class FileZippedJarVisitor extends JarVisitor {
- private static Log log = LogFactory.getLog( FileZippedJarVisitor.class );
-
- public FileZippedJarVisitor(String fileName, Filter[] filters) {
- super( fileName, filters );
- }
-
- public FileZippedJarVisitor(URL url, Filter[] filters) {
- super( url, filters );
- }
-
- protected void doProcessElements() throws IOException {
- JarFile jarFile;
- try {
- jarFile = new JarFile( jarUrl.toURI().getSchemeSpecificPart() );
- }
- catch (IOException ze) {
- log.warn( "Unable to find file (ignored): " + jarUrl, ze );
- return;
- }
- catch (URISyntaxException e) {
- log.warn( "Malformed url: " + jarUrl, e );
- return;
- }
- Enumeration<? extends ZipEntry> entries = jarFile.entries();
- while ( entries.hasMoreElements() ) {
- ZipEntry entry = entries.nextElement();
- if ( !entry.isDirectory() ) {
- addElement(
- entry.getName(),
- new BufferedInputStream( jarFile.getInputStream( entry ) ),
- new BufferedInputStream( jarFile.getInputStream( entry ) )
- );
- }
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/FileZippedJarVisitor.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/FileZippedJarVisitor.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/FileZippedJarVisitor.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/FileZippedJarVisitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+//$Id$
+package org.hibernate.ejb.packaging;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.net.URISyntaxException;
+import java.util.Enumeration;
+import java.util.jar.JarFile;
+import java.util.zip.ZipEntry;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Work on a JAR that can be accessed through a File
+ *
+ * @author Emmanuel Bernard
+ */
+public class FileZippedJarVisitor extends JarVisitor {
+ private static Log log = LogFactory.getLog( FileZippedJarVisitor.class );
+
+ public FileZippedJarVisitor(String fileName, Filter[] filters) {
+ super( fileName, filters );
+ }
+
+ public FileZippedJarVisitor(URL url, Filter[] filters) {
+ super( url, filters );
+ }
+
+ protected void doProcessElements() throws IOException {
+ JarFile jarFile;
+ try {
+ jarFile = new JarFile( jarUrl.toURI().getSchemeSpecificPart() );
+ }
+ catch (IOException ze) {
+ log.warn( "Unable to find file (ignored): " + jarUrl, ze );
+ return;
+ }
+ catch (URISyntaxException e) {
+ log.warn( "Malformed url: " + jarUrl, e );
+ return;
+ }
+ Enumeration<? extends ZipEntry> entries = jarFile.entries();
+ while ( entries.hasMoreElements() ) {
+ ZipEntry entry = entries.nextElement();
+ if ( !entry.isDirectory() ) {
+ addElement(
+ entry.getName(),
+ new BufferedInputStream( jarFile.getInputStream( entry ) ),
+ new BufferedInputStream( jarFile.getInputStream( entry ) )
+ );
+ }
+ }
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/InputStreamZippedJarVisitor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/InputStreamZippedJarVisitor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/InputStreamZippedJarVisitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,64 +0,0 @@
-//$Id$
-package org.hibernate.ejb.packaging;
-
-import java.io.ByteArrayInputStream;
-import java.io.IOException;
-import java.net.URL;
-import java.util.jar.JarEntry;
-import java.util.jar.JarInputStream;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Work on a JAR that can only be accessed through a inputstream
- * This is less efficient than the {@link FileZippedJarVisitor}
- *
- * @author Emmanuel Bernard
- */
-public class InputStreamZippedJarVisitor extends JarVisitor {
- private static Log log = LogFactory.getLog( InputStreamZippedJarVisitor.class );
-
- public InputStreamZippedJarVisitor(URL url, Filter[] filters) {
- super( url, filters );
- }
-
- public InputStreamZippedJarVisitor(String fileName, Filter[] filters) {
- super( fileName, filters );
- }
-
- protected void doProcessElements() throws IOException {
- JarInputStream jis;
- try {
- jis = new JarInputStream( jarUrl.openStream() );
- }
- catch (Exception ze) {
- //really should catch IOException but Eclipse is buggy and raise NPE...
- log.warn( "Unable to find file (ignored): " + jarUrl, ze );
- return;
- }
- JarEntry entry;
- while ( ( entry = jis.getNextJarEntry() ) != null ) {
- if ( !entry.isDirectory() ) {
- int size;
- byte[] tmpByte = new byte[ 4096 ];
- byte[] entryBytes = new byte[0];
- for ( ; ; ) {
- size = jis.read( tmpByte );
- if ( size == -1 ) break;
- byte[] current = new byte[ entryBytes.length + size ];
- System.arraycopy( entryBytes, 0, current, 0, entryBytes.length );
- System.arraycopy( tmpByte, 0, current, entryBytes.length, size );
- entryBytes = current;
- }
- //this is bad cause we actually read everything instead of walking it lazily
- addElement(
- entry.getName(),
- new ByteArrayInputStream( entryBytes ),
- new ByteArrayInputStream( entryBytes )
- );
- }
- }
- jis.close();
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/InputStreamZippedJarVisitor.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/InputStreamZippedJarVisitor.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/InputStreamZippedJarVisitor.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/InputStreamZippedJarVisitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,64 @@
+//$Id$
+package org.hibernate.ejb.packaging;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.URL;
+import java.util.jar.JarEntry;
+import java.util.jar.JarInputStream;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Work on a JAR that can only be accessed through a inputstream
+ * This is less efficient than the {@link FileZippedJarVisitor}
+ *
+ * @author Emmanuel Bernard
+ */
+public class InputStreamZippedJarVisitor extends JarVisitor {
+ private static Log log = LogFactory.getLog( InputStreamZippedJarVisitor.class );
+
+ public InputStreamZippedJarVisitor(URL url, Filter[] filters) {
+ super( url, filters );
+ }
+
+ public InputStreamZippedJarVisitor(String fileName, Filter[] filters) {
+ super( fileName, filters );
+ }
+
+ protected void doProcessElements() throws IOException {
+ JarInputStream jis;
+ try {
+ jis = new JarInputStream( jarUrl.openStream() );
+ }
+ catch (Exception ze) {
+ //really should catch IOException but Eclipse is buggy and raise NPE...
+ log.warn( "Unable to find file (ignored): " + jarUrl, ze );
+ return;
+ }
+ JarEntry entry;
+ while ( ( entry = jis.getNextJarEntry() ) != null ) {
+ if ( !entry.isDirectory() ) {
+ int size;
+ byte[] tmpByte = new byte[ 4096 ];
+ byte[] entryBytes = new byte[0];
+ for ( ; ; ) {
+ size = jis.read( tmpByte );
+ if ( size == -1 ) break;
+ byte[] current = new byte[ entryBytes.length + size ];
+ System.arraycopy( entryBytes, 0, current, 0, entryBytes.length );
+ System.arraycopy( tmpByte, 0, current, entryBytes.length, size );
+ entryBytes = current;
+ }
+ //this is bad cause we actually read everything instead of walking it lazily
+ addElement(
+ entry.getName(),
+ new ByteArrayInputStream( entryBytes ),
+ new ByteArrayInputStream( entryBytes )
+ );
+ }
+ }
+ jis.close();
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/JarVisitor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/JarVisitor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/JarVisitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,473 +0,0 @@
-package org.hibernate.ejb.packaging;
-
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URISyntaxException;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javassist.bytecode.AnnotationsAttribute;
-import javassist.bytecode.ClassFile;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.util.StringHelper;
-
-/**
- * Parse a JAR of any form (zip file, exploded directory, ...)
- * apply a set of filters (File filter, Class filter, Package filter)
- * and return the appropriate matching sets of elements
- *
- * @author Emmanuel Bernard
- */
-//TODO shortcut when filters are null or empty
-public abstract class JarVisitor {
- private static Log log = LogFactory.getLog( JarVisitor.class );
- protected String unqualifiedJarName;
- protected URL jarUrl;
- private boolean done = false;
- private List<Filter> filters = new ArrayList<Filter>();
- private Set<FileFilter> fileFilters = new HashSet<FileFilter>();
- private Set<JavaElementFilter> classFilters = new HashSet<JavaElementFilter>();
- ;
- private Set<JavaElementFilter> packageFilters = new HashSet<JavaElementFilter>();
- private Set[] entries;
-
- /**
- * Get the JAR URL of the JAR containing the given entry
- *
- * @param url
- * @param entry
- * @return the JAR URL
- * @throws IllegalArgumentException if none URL is found
- */
- public static final URL getJarURLFromURLEntry(URL url, String entry) throws IllegalArgumentException {
- URL jarUrl;
- String file = url.getFile();
- if ( ! entry.startsWith( "/" ) ) entry = "/" + entry;
- file = file.substring( 0, file.length() - entry.length() );
- if ( file.endsWith( "!" ) ) file = file.substring( 0, file.length() - 1 );
- try {
- String protocol = url.getProtocol();
-
- if ( "jar".equals( protocol )
- || "wsjar".equals( protocol ) ) { //Websphere has it's own way
- //Original URL is like jar:protocol
- jarUrl = new URL( file );
- if ( "file".equals( jarUrl.getProtocol() ) ) {
- //Do some voodoo magic because WAS doesn't think escaping URL is an interesting feature
- if ( file.indexOf( ' ' ) != -1 ) {
- //not escaped, need to voodoo
- jarUrl = new File( jarUrl.getFile() ).toURI().toURL(); //goes by toURI to escape the path
- }
- } //otherwise left as is
- }
- else if ( "zip".equals( protocol ) //Weblogic has it's own way
- || "code-source".equals( url.getProtocol() ) ) { //OC4J prevent ejb.jar access (ie everything without path)
- //we have extracted the zip file, so it should be read as a file
- //Just in case some containers are as stupid as WAS: luckily WAS is closed source so nobody will dupe the bug
- if ( file.indexOf( ' ' ) != -1 ) {
- //not escaped, need to voodoo
- jarUrl = new File(file).toURI().toURL(); //goes by toURI to escape the path
- }
- else {
- jarUrl = new File(file).toURL();
- }
- }
- else {
- jarUrl = new URL( protocol, url.getHost(), url.getPort(), file );
- }
- }
- catch (MalformedURLException e) {
- throw new IllegalArgumentException(
- "Unable to determine JAR Url from " + url + ". Cause: " + e.getMessage()
- );
- }
- log.trace("JAR URL from URL Entry: " + url + " >> " + jarUrl);
- return jarUrl;
- }
-
- /**
- * Build a JarVisitor on the given JAR URL applying th given filters
- *
- * @throws IllegalArgumentException if the URL is malformed
- */
- public static final JarVisitor getVisitor(URL jarUrl, Filter[] filters) throws IllegalArgumentException {
- String protocol = jarUrl.getProtocol();
- if ( "jar".equals( protocol ) ) {
- //FIXME remove this code, this should not happen
- return new InputStreamZippedJarVisitor( jarUrl, filters );
- }
- else if ( StringHelper.isEmpty( protocol ) || "file".equals( protocol ) ) {
- File file;
- try {
- file = new File( jarUrl.toURI().getSchemeSpecificPart() );
- }
- catch (URISyntaxException e) {
- throw new IllegalArgumentException(
- "Unable to visit JAR " + jarUrl + ". Cause: " + e.getMessage()
- );
- }
- if ( file.isDirectory() ) {
- return new ExplodedJarVisitor( jarUrl, filters );
- }
- else {
- return new FileZippedJarVisitor( jarUrl, filters );
- }
- }
- else {
- //let's assume the url can return the jar as a zip stream
- return new InputStreamZippedJarVisitor( jarUrl, filters );
- }
- }
-
- /**
- * Build a jar visitor from its jar string path
- */
- private JarVisitor(String jarPath) {
- URL jarUrl;
- try {
- //is it an url
- jarUrl = new URL( jarPath );
- }
- catch (MalformedURLException e) {
- try {
- //consider it as a file path
- jarUrl = new URL( "file:" + jarPath );
- }
- catch (MalformedURLException ee) {
- throw new IllegalArgumentException( "Unable to find jar:" + jarPath, ee );
- }
- }
- this.jarUrl = jarUrl;
- unqualify();
- }
-
- protected JarVisitor(String fileName, Filter[] filters) {
- this( fileName );
- initFilters( filters );
- }
-
- private void initFilters(Filter[] filters) {
- for ( Filter filter : filters ) {
- if ( filter instanceof FileFilter ) {
- fileFilters.add( (FileFilter) filter );
- }
- else if ( filter instanceof ClassFilter ) {
- classFilters.add( (ClassFilter) filter );
- }
- else if ( filter instanceof PackageFilter ) {
- packageFilters.add( (PackageFilter) filter );
- }
- else {
- throw new AssertionError( "Unknown filter type: " + filter.getClass().getName() );
- }
- this.filters.add( filter );
- }
- int size = this.filters.size();
- this.entries = new Set[ size ];
- for ( int index = 0; index < size ; index++ ) {
- this.entries[index] = new HashSet<Entry>();
- }
- }
-
- protected JarVisitor(URL url, Filter[] filters) {
- this( url );
- initFilters( filters );
- }
-
- /**
- * Get a JarVisitor to the jar <code>jarPath</code> applying the given filters
- *
- * @throws IllegalArgumentException if the jarPath is incorrect
- */
- public static final JarVisitor getVisitor(String jarPath, Filter[] filters) throws IllegalArgumentException {
- File file = new File( jarPath );
- if ( file.isFile() ) {
- return new InputStreamZippedJarVisitor( jarPath, filters );
- }
- else {
- return new ExplodedJarVisitor( jarPath, filters );
- }
- }
-
- private JarVisitor(URL url) {
- jarUrl = url;
- unqualify();
- }
-
- protected void unqualify() {
- //FIXME weak algorithm subject to AOOBE
- String fileName = jarUrl.getFile();
- int slash = fileName.lastIndexOf( "/" );
- if ( slash != -1 ) {
- fileName = fileName.substring(
- fileName.lastIndexOf( "/" ) + 1,
- fileName.length()
- );
- }
- if ( fileName.length() > 4 && fileName.endsWith( "ar" ) && fileName.charAt( fileName.length() - 4 ) == '.' ) {
- fileName = fileName.substring( 0, fileName.length() - 4 );
- }
- unqualifiedJarName = fileName;
- log.debug( "Searching mapped entities in jar/par: " + jarUrl );
- }
-
- /**
- * Get the unqualified Jar name (ie wo path and wo extension)
- */
- public String getUnqualifiedJarName() {
- return unqualifiedJarName;
- }
-
- public Filter[] getFilters() {
- return filters.toArray( new Filter[ filters.size() ] );
- }
-
- /**
- * Return the matching entries for each filter in the same order the filter where passed
- *
- * @return array of Set of JarVisitor.Entry
- * @throws IOException if something went wrong
- */
- public final Set[] getMatchingEntries() throws IOException {
- if ( !done ) {
- //avoid url access and so on
- if ( filters.size() > 0 ) doProcessElements();
- done = true;
- }
- return entries;
- }
-
- protected abstract void doProcessElements() throws IOException;
-
- //TODO avoid 2 input stream when not needed
- protected final void addElement(String entryName, InputStream is, InputStream secondIs) throws IOException {
- if ( entryName.endsWith( "package-info.class" ) ) {
- String name = entryName.substring( 0, entryName.length() - ".package-info.class".length() )
- .replace( '/', '.' );
- executeJavaElementFilter( name, packageFilters, is, secondIs );
- }
- else if ( entryName.endsWith( ".class" ) ) {
- String name = entryName.substring( 0, entryName.length() - ".class".length() ).replace( '/', '.' );
- log.debug( "Filtering: " + name );
- executeJavaElementFilter( name, classFilters, is, secondIs );
- }
- else {
- String name = entryName;
- boolean accepted = false;
- for ( FileFilter filter : fileFilters ) {
- if ( filter.accept( name ) ) {
- accepted = true;
- InputStream localIs;
- if ( filter.getStream() ) {
- localIs = secondIs;
- }
- else {
- localIs = null;
- secondIs.close();
- }
- is.close();
- log.debug( "File Filter matched for " + name );
- Entry entry = new Entry( name, localIs );
- int index = this.filters.indexOf( filter );
- this.entries[index].add( entry );
- }
- }
- if (!accepted) {
- //not accepted free resources
- is.close();
- secondIs.close();
- }
- }
- }
-
- private void executeJavaElementFilter(
- String name, Set<JavaElementFilter> filters, InputStream is, InputStream secondIs
- ) throws IOException {
- boolean accepted = false;
- for ( JavaElementFilter filter : filters ) {
- if ( filter.accept( name ) ) {
- //FIXME cannot currently have a class filtered twice but matching once
- // need to copy the is
- boolean match = checkAnnotationMatching( is, filter );
- if ( match ) {
- accepted = true;
- InputStream localIs;
- if ( filter.getStream() ) {
- localIs = secondIs;
- }
- else {
- localIs = null;
- secondIs.close();
- }
- log.debug( "Java element filter matched for " + name );
- Entry entry = new Entry( name, localIs );
- int index = this.filters.indexOf( filter );
- this.entries[index].add( entry );
- break; //we matched
- }
- }
- }
- if (!accepted) {
- is.close();
- secondIs.close();
- }
- }
-
- private boolean checkAnnotationMatching(InputStream is, JavaElementFilter filter) throws IOException {
- if ( filter.getAnnotations().length == 0 ) {
- is.close();
- return true;
- }
- DataInputStream dstream = new DataInputStream( is );
- ClassFile cf = null;
-
- try {
- cf = new ClassFile( dstream );
- }
- finally {
- dstream.close();
- is.close();
- }
- boolean match = false;
- AnnotationsAttribute visible = (AnnotationsAttribute) cf.getAttribute( AnnotationsAttribute.visibleTag );
- if ( visible != null ) {
- for ( Class annotation : filter.getAnnotations() ) {
- match = visible.getAnnotation( annotation.getName() ) != null;
- if ( match ) break;
- }
- }
- return match;
- }
-
- /**
- * Filter used when searching elements in a JAR
- */
- public static abstract class Filter {
- private boolean retrieveStream;
-
- protected Filter(boolean retrieveStream) {
- this.retrieveStream = retrieveStream;
- }
-
- public boolean getStream() {
- return retrieveStream;
- }
- }
-
- /**
- * Filter use to match a file by its name
- */
- public static abstract class FileFilter extends Filter {
-
- /**
- * @param retrieveStream Give back an open stream to the matching element or not
- */
- public FileFilter(boolean retrieveStream) {
- super( retrieveStream );
- }
-
- /**
- * Return true if the fully qualified file name match
- */
- public abstract boolean accept(String name);
- }
-
- /**
- * Filter a Java element (class or package per fully qualified name and annotation existence)
- * At least 1 annotation has to annotate the element and the accept method must match
- * If none annotations are passed, only the accept method must pass.
- */
- public static abstract class JavaElementFilter extends Filter {
- private Class[] annotations;
-
- /**
- * @param retrieveStream Give back an open stream to the matching element or not
- * @param annotations Array of annotations that must be present to match (1 of them should annotate the element
- */
- protected JavaElementFilter(boolean retrieveStream, Class[] annotations) {
- super( retrieveStream );
- this.annotations = annotations == null ? new Class[]{} : annotations;
- }
-
- public Class[] getAnnotations() {
- return annotations;
- }
-
- /**
- * Return true if the fully qualified name match
- */
- public abstract boolean accept(String javaElementName);
- }
-
- /**
- * Filter on class elements
- *
- * @see JavaElementFilter
- */
- public static abstract class ClassFilter extends JavaElementFilter {
- /**
- * @see JavaElementFilter#JavaElementFilter(boolean, Class[])
- */
- protected ClassFilter(boolean retrieveStream, Class[] annotations) {
- super( retrieveStream, annotations );
- }
- }
-
- /**
- * Filter on pachage element
- *
- * @see JavaElementFilter
- */
- public static abstract class PackageFilter extends JavaElementFilter {
- /**
- * @see JavaElementFilter#JavaElementFilter(boolean, Class[])
- */
- protected PackageFilter(boolean retrieveStream, Class[] annotations) {
- super( retrieveStream, annotations );
- }
- }
-
- /**
- * Represent a JAR entry
- * Contains a name and an optional Input stream to the entry
- */
- public static class Entry {
- private String name;
- private InputStream is;
-
- public Entry(String name, InputStream is) {
- this.name = name;
- this.is = is;
- }
-
- public String getName() {
- return name;
- }
-
- public InputStream getInputStream() {
- return is;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final Entry entry = (Entry) o;
-
- if ( !name.equals( entry.name ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return name.hashCode();
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/JarVisitor.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/JarVisitor.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/JarVisitor.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/JarVisitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,473 @@
+package org.hibernate.ejb.packaging;
+
+import java.io.DataInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import javassist.bytecode.AnnotationsAttribute;
+import javassist.bytecode.ClassFile;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.util.StringHelper;
+
+/**
+ * Parse a JAR of any form (zip file, exploded directory, ...)
+ * apply a set of filters (File filter, Class filter, Package filter)
+ * and return the appropriate matching sets of elements
+ *
+ * @author Emmanuel Bernard
+ */
+//TODO shortcut when filters are null or empty
+public abstract class JarVisitor {
+ private static Log log = LogFactory.getLog( JarVisitor.class );
+ protected String unqualifiedJarName;
+ protected URL jarUrl;
+ private boolean done = false;
+ private List<Filter> filters = new ArrayList<Filter>();
+ private Set<FileFilter> fileFilters = new HashSet<FileFilter>();
+ private Set<JavaElementFilter> classFilters = new HashSet<JavaElementFilter>();
+ ;
+ private Set<JavaElementFilter> packageFilters = new HashSet<JavaElementFilter>();
+ private Set[] entries;
+
+ /**
+ * Get the JAR URL of the JAR containing the given entry
+ *
+ * @param url
+ * @param entry
+ * @return the JAR URL
+ * @throws IllegalArgumentException if none URL is found
+ */
+ public static final URL getJarURLFromURLEntry(URL url, String entry) throws IllegalArgumentException {
+ URL jarUrl;
+ String file = url.getFile();
+ if ( ! entry.startsWith( "/" ) ) entry = "/" + entry;
+ file = file.substring( 0, file.length() - entry.length() );
+ if ( file.endsWith( "!" ) ) file = file.substring( 0, file.length() - 1 );
+ try {
+ String protocol = url.getProtocol();
+
+ if ( "jar".equals( protocol )
+ || "wsjar".equals( protocol ) ) { //Websphere has it's own way
+ //Original URL is like jar:protocol
+ jarUrl = new URL( file );
+ if ( "file".equals( jarUrl.getProtocol() ) ) {
+ //Do some voodoo magic because WAS doesn't think escaping URL is an interesting feature
+ if ( file.indexOf( ' ' ) != -1 ) {
+ //not escaped, need to voodoo
+ jarUrl = new File( jarUrl.getFile() ).toURI().toURL(); //goes by toURI to escape the path
+ }
+ } //otherwise left as is
+ }
+ else if ( "zip".equals( protocol ) //Weblogic has it's own way
+ || "code-source".equals( url.getProtocol() ) ) { //OC4J prevent ejb.jar access (ie everything without path)
+ //we have extracted the zip file, so it should be read as a file
+ //Just in case some containers are as stupid as WAS: luckily WAS is closed source so nobody will dupe the bug
+ if ( file.indexOf( ' ' ) != -1 ) {
+ //not escaped, need to voodoo
+ jarUrl = new File(file).toURI().toURL(); //goes by toURI to escape the path
+ }
+ else {
+ jarUrl = new File(file).toURL();
+ }
+ }
+ else {
+ jarUrl = new URL( protocol, url.getHost(), url.getPort(), file );
+ }
+ }
+ catch (MalformedURLException e) {
+ throw new IllegalArgumentException(
+ "Unable to determine JAR Url from " + url + ". Cause: " + e.getMessage()
+ );
+ }
+ log.trace("JAR URL from URL Entry: " + url + " >> " + jarUrl);
+ return jarUrl;
+ }
+
+ /**
+ * Build a JarVisitor on the given JAR URL applying th given filters
+ *
+ * @throws IllegalArgumentException if the URL is malformed
+ */
+ public static final JarVisitor getVisitor(URL jarUrl, Filter[] filters) throws IllegalArgumentException {
+ String protocol = jarUrl.getProtocol();
+ if ( "jar".equals( protocol ) ) {
+ //FIXME remove this code, this should not happen
+ return new InputStreamZippedJarVisitor( jarUrl, filters );
+ }
+ else if ( StringHelper.isEmpty( protocol ) || "file".equals( protocol ) ) {
+ File file;
+ try {
+ file = new File( jarUrl.toURI().getSchemeSpecificPart() );
+ }
+ catch (URISyntaxException e) {
+ throw new IllegalArgumentException(
+ "Unable to visit JAR " + jarUrl + ". Cause: " + e.getMessage()
+ );
+ }
+ if ( file.isDirectory() ) {
+ return new ExplodedJarVisitor( jarUrl, filters );
+ }
+ else {
+ return new FileZippedJarVisitor( jarUrl, filters );
+ }
+ }
+ else {
+ //let's assume the url can return the jar as a zip stream
+ return new InputStreamZippedJarVisitor( jarUrl, filters );
+ }
+ }
+
+ /**
+ * Build a jar visitor from its jar string path
+ */
+ private JarVisitor(String jarPath) {
+ URL jarUrl;
+ try {
+ //is it an url
+ jarUrl = new URL( jarPath );
+ }
+ catch (MalformedURLException e) {
+ try {
+ //consider it as a file path
+ jarUrl = new URL( "file:" + jarPath );
+ }
+ catch (MalformedURLException ee) {
+ throw new IllegalArgumentException( "Unable to find jar:" + jarPath, ee );
+ }
+ }
+ this.jarUrl = jarUrl;
+ unqualify();
+ }
+
+ protected JarVisitor(String fileName, Filter[] filters) {
+ this( fileName );
+ initFilters( filters );
+ }
+
+ private void initFilters(Filter[] filters) {
+ for ( Filter filter : filters ) {
+ if ( filter instanceof FileFilter ) {
+ fileFilters.add( (FileFilter) filter );
+ }
+ else if ( filter instanceof ClassFilter ) {
+ classFilters.add( (ClassFilter) filter );
+ }
+ else if ( filter instanceof PackageFilter ) {
+ packageFilters.add( (PackageFilter) filter );
+ }
+ else {
+ throw new AssertionError( "Unknown filter type: " + filter.getClass().getName() );
+ }
+ this.filters.add( filter );
+ }
+ int size = this.filters.size();
+ this.entries = new Set[ size ];
+ for ( int index = 0; index < size ; index++ ) {
+ this.entries[index] = new HashSet<Entry>();
+ }
+ }
+
+ protected JarVisitor(URL url, Filter[] filters) {
+ this( url );
+ initFilters( filters );
+ }
+
+ /**
+ * Get a JarVisitor to the jar <code>jarPath</code> applying the given filters
+ *
+ * @throws IllegalArgumentException if the jarPath is incorrect
+ */
+ public static final JarVisitor getVisitor(String jarPath, Filter[] filters) throws IllegalArgumentException {
+ File file = new File( jarPath );
+ if ( file.isFile() ) {
+ return new InputStreamZippedJarVisitor( jarPath, filters );
+ }
+ else {
+ return new ExplodedJarVisitor( jarPath, filters );
+ }
+ }
+
+ private JarVisitor(URL url) {
+ jarUrl = url;
+ unqualify();
+ }
+
+ protected void unqualify() {
+ //FIXME weak algorithm subject to AOOBE
+ String fileName = jarUrl.getFile();
+ int slash = fileName.lastIndexOf( "/" );
+ if ( slash != -1 ) {
+ fileName = fileName.substring(
+ fileName.lastIndexOf( "/" ) + 1,
+ fileName.length()
+ );
+ }
+ if ( fileName.length() > 4 && fileName.endsWith( "ar" ) && fileName.charAt( fileName.length() - 4 ) == '.' ) {
+ fileName = fileName.substring( 0, fileName.length() - 4 );
+ }
+ unqualifiedJarName = fileName;
+ log.debug( "Searching mapped entities in jar/par: " + jarUrl );
+ }
+
+ /**
+ * Get the unqualified Jar name (ie wo path and wo extension)
+ */
+ public String getUnqualifiedJarName() {
+ return unqualifiedJarName;
+ }
+
+ public Filter[] getFilters() {
+ return filters.toArray( new Filter[ filters.size() ] );
+ }
+
+ /**
+ * Return the matching entries for each filter in the same order the filter where passed
+ *
+ * @return array of Set of JarVisitor.Entry
+ * @throws IOException if something went wrong
+ */
+ public final Set[] getMatchingEntries() throws IOException {
+ if ( !done ) {
+ //avoid url access and so on
+ if ( filters.size() > 0 ) doProcessElements();
+ done = true;
+ }
+ return entries;
+ }
+
+ protected abstract void doProcessElements() throws IOException;
+
+ //TODO avoid 2 input stream when not needed
+ protected final void addElement(String entryName, InputStream is, InputStream secondIs) throws IOException {
+ if ( entryName.endsWith( "package-info.class" ) ) {
+ String name = entryName.substring( 0, entryName.length() - ".package-info.class".length() )
+ .replace( '/', '.' );
+ executeJavaElementFilter( name, packageFilters, is, secondIs );
+ }
+ else if ( entryName.endsWith( ".class" ) ) {
+ String name = entryName.substring( 0, entryName.length() - ".class".length() ).replace( '/', '.' );
+ log.debug( "Filtering: " + name );
+ executeJavaElementFilter( name, classFilters, is, secondIs );
+ }
+ else {
+ String name = entryName;
+ boolean accepted = false;
+ for ( FileFilter filter : fileFilters ) {
+ if ( filter.accept( name ) ) {
+ accepted = true;
+ InputStream localIs;
+ if ( filter.getStream() ) {
+ localIs = secondIs;
+ }
+ else {
+ localIs = null;
+ secondIs.close();
+ }
+ is.close();
+ log.debug( "File Filter matched for " + name );
+ Entry entry = new Entry( name, localIs );
+ int index = this.filters.indexOf( filter );
+ this.entries[index].add( entry );
+ }
+ }
+ if (!accepted) {
+ //not accepted free resources
+ is.close();
+ secondIs.close();
+ }
+ }
+ }
+
+ private void executeJavaElementFilter(
+ String name, Set<JavaElementFilter> filters, InputStream is, InputStream secondIs
+ ) throws IOException {
+ boolean accepted = false;
+ for ( JavaElementFilter filter : filters ) {
+ if ( filter.accept( name ) ) {
+ //FIXME cannot currently have a class filtered twice but matching once
+ // need to copy the is
+ boolean match = checkAnnotationMatching( is, filter );
+ if ( match ) {
+ accepted = true;
+ InputStream localIs;
+ if ( filter.getStream() ) {
+ localIs = secondIs;
+ }
+ else {
+ localIs = null;
+ secondIs.close();
+ }
+ log.debug( "Java element filter matched for " + name );
+ Entry entry = new Entry( name, localIs );
+ int index = this.filters.indexOf( filter );
+ this.entries[index].add( entry );
+ break; //we matched
+ }
+ }
+ }
+ if (!accepted) {
+ is.close();
+ secondIs.close();
+ }
+ }
+
+ private boolean checkAnnotationMatching(InputStream is, JavaElementFilter filter) throws IOException {
+ if ( filter.getAnnotations().length == 0 ) {
+ is.close();
+ return true;
+ }
+ DataInputStream dstream = new DataInputStream( is );
+ ClassFile cf = null;
+
+ try {
+ cf = new ClassFile( dstream );
+ }
+ finally {
+ dstream.close();
+ is.close();
+ }
+ boolean match = false;
+ AnnotationsAttribute visible = (AnnotationsAttribute) cf.getAttribute( AnnotationsAttribute.visibleTag );
+ if ( visible != null ) {
+ for ( Class annotation : filter.getAnnotations() ) {
+ match = visible.getAnnotation( annotation.getName() ) != null;
+ if ( match ) break;
+ }
+ }
+ return match;
+ }
+
+ /**
+ * Filter used when searching elements in a JAR
+ */
+ public static abstract class Filter {
+ private boolean retrieveStream;
+
+ protected Filter(boolean retrieveStream) {
+ this.retrieveStream = retrieveStream;
+ }
+
+ public boolean getStream() {
+ return retrieveStream;
+ }
+ }
+
+ /**
+ * Filter use to match a file by its name
+ */
+ public static abstract class FileFilter extends Filter {
+
+ /**
+ * @param retrieveStream Give back an open stream to the matching element or not
+ */
+ public FileFilter(boolean retrieveStream) {
+ super( retrieveStream );
+ }
+
+ /**
+ * Return true if the fully qualified file name match
+ */
+ public abstract boolean accept(String name);
+ }
+
+ /**
+ * Filter a Java element (class or package per fully qualified name and annotation existence)
+ * At least 1 annotation has to annotate the element and the accept method must match
+ * If none annotations are passed, only the accept method must pass.
+ */
+ public static abstract class JavaElementFilter extends Filter {
+ private Class[] annotations;
+
+ /**
+ * @param retrieveStream Give back an open stream to the matching element or not
+ * @param annotations Array of annotations that must be present to match (1 of them should annotate the element
+ */
+ protected JavaElementFilter(boolean retrieveStream, Class[] annotations) {
+ super( retrieveStream );
+ this.annotations = annotations == null ? new Class[]{} : annotations;
+ }
+
+ public Class[] getAnnotations() {
+ return annotations;
+ }
+
+ /**
+ * Return true if the fully qualified name match
+ */
+ public abstract boolean accept(String javaElementName);
+ }
+
+ /**
+ * Filter on class elements
+ *
+ * @see JavaElementFilter
+ */
+ public static abstract class ClassFilter extends JavaElementFilter {
+ /**
+ * @see JavaElementFilter#JavaElementFilter(boolean, Class[])
+ */
+ protected ClassFilter(boolean retrieveStream, Class[] annotations) {
+ super( retrieveStream, annotations );
+ }
+ }
+
+ /**
+ * Filter on pachage element
+ *
+ * @see JavaElementFilter
+ */
+ public static abstract class PackageFilter extends JavaElementFilter {
+ /**
+ * @see JavaElementFilter#JavaElementFilter(boolean, Class[])
+ */
+ protected PackageFilter(boolean retrieveStream, Class[] annotations) {
+ super( retrieveStream, annotations );
+ }
+ }
+
+ /**
+ * Represent a JAR entry
+ * Contains a name and an optional Input stream to the entry
+ */
+ public static class Entry {
+ private String name;
+ private InputStream is;
+
+ public Entry(String name, InputStream is) {
+ this.name = name;
+ this.is = is;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public InputStream getInputStream() {
+ return is;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final Entry entry = (Entry) o;
+
+ if ( !name.equals( entry.name ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/NamedInputStream.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/NamedInputStream.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/NamedInputStream.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.packaging;
-
-import java.io.InputStream;
-
-/**
- * @author Emmanuel Bernard
- */
-public class NamedInputStream {
- public NamedInputStream(String name, InputStream stream) {
- this.name = name;
- this.stream = stream;
- }
-
- private String name;
- private InputStream stream;
-
- public InputStream getStream() {
- return stream;
- }
-
- public void setStream(InputStream stream) {
- this.stream = stream;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/NamedInputStream.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/NamedInputStream.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/NamedInputStream.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/NamedInputStream.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id: $
+package org.hibernate.ejb.packaging;
+
+import java.io.InputStream;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class NamedInputStream {
+ public NamedInputStream(String name, InputStream stream) {
+ this.name = name;
+ this.stream = stream;
+ }
+
+ private String name;
+ private InputStream stream;
+
+ public InputStream getStream() {
+ return stream;
+ }
+
+ public void setStream(InputStream stream) {
+ this.stream = stream;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,185 +0,0 @@
-package org.hibernate.ejb.packaging;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Properties;
-import java.util.Set;
-import java.util.Map;
-import javax.persistence.spi.PersistenceUnitTransactionType;
-
-/**
- * Simple represenation of persistence.xml
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @version $Revision$
- */
-public class PersistenceMetadata {
-
- private String name;
- private String nonJtaDatasource;
- private String jtaDatasource;
- private String provider;
- private PersistenceUnitTransactionType transactionType;
- private List<String> classes = new ArrayList<String>();
- private List<String> packages = new ArrayList<String>();
- private List<String> mappingFiles = new ArrayList<String>();
- private Set<String> jarFiles = new HashSet<String>();
- private List<NamedInputStream> hbmfiles = new ArrayList<NamedInputStream>();
- private Properties props = new Properties();
- private boolean excludeUnlistedClasses = false;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public PersistenceUnitTransactionType getTransactionType() {
- return transactionType;
- }
-
- public void setTransactionType(PersistenceUnitTransactionType transactionType) {
- this.transactionType = transactionType;
- }
-
- public String getNonJtaDatasource() {
- return nonJtaDatasource;
- }
-
- public void setNonJtaDatasource(String nonJtaDatasource) {
- this.nonJtaDatasource = nonJtaDatasource;
- }
-
- public String getJtaDatasource() {
- return jtaDatasource;
- }
-
- public void setJtaDatasource(String jtaDatasource) {
- this.jtaDatasource = jtaDatasource;
- }
-
- public String getProvider() {
- return provider;
- }
-
- public void setProvider(String provider) {
- if ( provider != null && provider.endsWith( ".class" ) ) {
- this.provider = provider.substring( 0, provider.length() - 6 );
- }
- this.provider = provider;
- }
-
- public List<String> getClasses() {
- return classes;
- }
-
- public void setClasses(List<String> classes) {
- this.classes = classes;
- }
-
- public List<String> getPackages() {
- return packages;
- }
-
- public void setPackages(List<String> packages) {
- this.packages = packages;
- }
-
- public List<String> getMappingFiles() {
- return mappingFiles;
- }
-
- public void setMappingFiles(List<String> mappingFiles) {
- this.mappingFiles = mappingFiles;
- }
-
- public Set<String> getJarFiles() {
- return jarFiles;
- }
-
- public void setJarFiles(Set<String> jarFiles) {
- this.jarFiles = jarFiles;
- }
-
- public Properties getProps() {
- return props;
- }
-
- public void setProps(Properties props) {
- this.props = props;
- }
-
- public List<NamedInputStream> getHbmfiles() {
- return hbmfiles;
- }
-
- /**
- * @deprecated use getHbmfiles() rather
- */
- public void setHbmfiles(List<NamedInputStream> hbmfiles) {
- this.hbmfiles = hbmfiles;
- }
-
- public boolean getExcludeUnlistedClasses() {
- return excludeUnlistedClasses;
- }
-
- public void setExcludeUnlistedClasses(boolean excludeUnlistedClasses) {
- this.excludeUnlistedClasses = excludeUnlistedClasses;
- }
-
- @Override
- public String toString() {
- StringBuilder sb = new StringBuilder();
- sb.append( "PersistenceMetadata [\n")
- .append("\tname: ").append(name).append("\n")
- .append("\tjtaDataSource: ").append(jtaDatasource).append("\n")
- .append("\tnonJtaDataSource: ").append(nonJtaDatasource).append("\n")
- .append("\ttransactionType: ").append(transactionType).append("\n")
- .append("\tprovider: ").append(provider).append("\n")
- .append("\tclasses[\n");
- if (classes != null) {
- for (String elt : classes) {
- sb.append("\t\t").append( elt );
- }
- }
- sb.append( "\t]\n")
- .append("\tpackages[\n");
- if (packages != null) {
- for (String elt : packages) {
- sb.append("\t\t").append( elt ).append("\n");
- }
- }
- sb.append( "\t]\n")
- .append("\tmappingFiles[\n");
- if (mappingFiles != null) {
- for (String elt : mappingFiles) {
- sb.append("\t\t").append( elt ).append("\n");
- }
- }
- sb.append( "\t]\n")
- .append("\tjarFiles[\n");
- if (jarFiles != null) {
- for (String elt : jarFiles) {
- sb.append("\t\t").append( elt ).append("\n");
- }
- }
- sb.append( "\t]\n")
- .append("\thbmfiles: ")
- .append( hbmfiles != null ? hbmfiles.size() : 0 ).append("\n")
- .append("\tproperties[\n");
-
- if (props != null) {
- for ( Map.Entry elt : props.entrySet()) {
- sb.append("\t\t").append( elt.getKey() ).append(": ").append( elt.getValue() ).append("\n");
- }
- }
- sb.append( "\t]").append( "]");
-
- return sb.toString();
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceMetadata.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,185 @@
+package org.hibernate.ejb.packaging;
+
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Properties;
+import java.util.Set;
+import java.util.Map;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+
+/**
+ * Simple represenation of persistence.xml
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @version $Revision$
+ */
+public class PersistenceMetadata {
+
+ private String name;
+ private String nonJtaDatasource;
+ private String jtaDatasource;
+ private String provider;
+ private PersistenceUnitTransactionType transactionType;
+ private List<String> classes = new ArrayList<String>();
+ private List<String> packages = new ArrayList<String>();
+ private List<String> mappingFiles = new ArrayList<String>();
+ private Set<String> jarFiles = new HashSet<String>();
+ private List<NamedInputStream> hbmfiles = new ArrayList<NamedInputStream>();
+ private Properties props = new Properties();
+ private boolean excludeUnlistedClasses = false;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public PersistenceUnitTransactionType getTransactionType() {
+ return transactionType;
+ }
+
+ public void setTransactionType(PersistenceUnitTransactionType transactionType) {
+ this.transactionType = transactionType;
+ }
+
+ public String getNonJtaDatasource() {
+ return nonJtaDatasource;
+ }
+
+ public void setNonJtaDatasource(String nonJtaDatasource) {
+ this.nonJtaDatasource = nonJtaDatasource;
+ }
+
+ public String getJtaDatasource() {
+ return jtaDatasource;
+ }
+
+ public void setJtaDatasource(String jtaDatasource) {
+ this.jtaDatasource = jtaDatasource;
+ }
+
+ public String getProvider() {
+ return provider;
+ }
+
+ public void setProvider(String provider) {
+ if ( provider != null && provider.endsWith( ".class" ) ) {
+ this.provider = provider.substring( 0, provider.length() - 6 );
+ }
+ this.provider = provider;
+ }
+
+ public List<String> getClasses() {
+ return classes;
+ }
+
+ public void setClasses(List<String> classes) {
+ this.classes = classes;
+ }
+
+ public List<String> getPackages() {
+ return packages;
+ }
+
+ public void setPackages(List<String> packages) {
+ this.packages = packages;
+ }
+
+ public List<String> getMappingFiles() {
+ return mappingFiles;
+ }
+
+ public void setMappingFiles(List<String> mappingFiles) {
+ this.mappingFiles = mappingFiles;
+ }
+
+ public Set<String> getJarFiles() {
+ return jarFiles;
+ }
+
+ public void setJarFiles(Set<String> jarFiles) {
+ this.jarFiles = jarFiles;
+ }
+
+ public Properties getProps() {
+ return props;
+ }
+
+ public void setProps(Properties props) {
+ this.props = props;
+ }
+
+ public List<NamedInputStream> getHbmfiles() {
+ return hbmfiles;
+ }
+
+ /**
+ * @deprecated use getHbmfiles() rather
+ */
+ public void setHbmfiles(List<NamedInputStream> hbmfiles) {
+ this.hbmfiles = hbmfiles;
+ }
+
+ public boolean getExcludeUnlistedClasses() {
+ return excludeUnlistedClasses;
+ }
+
+ public void setExcludeUnlistedClasses(boolean excludeUnlistedClasses) {
+ this.excludeUnlistedClasses = excludeUnlistedClasses;
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder sb = new StringBuilder();
+ sb.append( "PersistenceMetadata [\n")
+ .append("\tname: ").append(name).append("\n")
+ .append("\tjtaDataSource: ").append(jtaDatasource).append("\n")
+ .append("\tnonJtaDataSource: ").append(nonJtaDatasource).append("\n")
+ .append("\ttransactionType: ").append(transactionType).append("\n")
+ .append("\tprovider: ").append(provider).append("\n")
+ .append("\tclasses[\n");
+ if (classes != null) {
+ for (String elt : classes) {
+ sb.append("\t\t").append( elt );
+ }
+ }
+ sb.append( "\t]\n")
+ .append("\tpackages[\n");
+ if (packages != null) {
+ for (String elt : packages) {
+ sb.append("\t\t").append( elt ).append("\n");
+ }
+ }
+ sb.append( "\t]\n")
+ .append("\tmappingFiles[\n");
+ if (mappingFiles != null) {
+ for (String elt : mappingFiles) {
+ sb.append("\t\t").append( elt ).append("\n");
+ }
+ }
+ sb.append( "\t]\n")
+ .append("\tjarFiles[\n");
+ if (jarFiles != null) {
+ for (String elt : jarFiles) {
+ sb.append("\t\t").append( elt ).append("\n");
+ }
+ }
+ sb.append( "\t]\n")
+ .append("\thbmfiles: ")
+ .append( hbmfiles != null ? hbmfiles.size() : 0 ).append("\n")
+ .append("\tproperties[\n");
+
+ if (props != null) {
+ for ( Map.Entry elt : props.entrySet()) {
+ sb.append("\t\t").append( elt.getKey() ).append(": ").append( elt.getValue() ).append("\n");
+ }
+ }
+ sb.append( "\t]").append( "]");
+
+ return sb.toString();
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,250 +0,0 @@
-package org.hibernate.ejb.packaging;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-import javax.persistence.PersistenceException;
-import javax.persistence.spi.PersistenceUnitTransactionType;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.cfg.EJB3DTDEntityResolver;
-import org.hibernate.ejb.HibernatePersistence;
-import org.hibernate.ejb.util.ConfigurationHelper;
-import org.hibernate.util.StringHelper;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.ErrorHandler;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXParseException;
-
-/**
- * Persistence.xml handler
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @author Emmanuel Bernard
- */
-public final class PersistenceXmlLoader {
- private static Log log = LogFactory.getLog( PersistenceXmlLoader.class );
-
- private PersistenceXmlLoader() {
- }
-
- private static Document loadURL(URL configURL, EntityResolver resolver) throws Exception {
- InputStream is = null;
- if (configURL != null) {
- URLConnection conn = configURL.openConnection();
- conn.setUseCaches( false ); //avoid JAR locking on Windows and Tomcat
- is = conn.getInputStream();
- }
- if ( is == null ) {
- throw new IOException( "Failed to obtain InputStream from url: " + configURL );
- }
- List errors = new ArrayList();
- DocumentBuilderFactory docBuilderFactory = null;
- docBuilderFactory = DocumentBuilderFactory.newInstance();
- docBuilderFactory.setValidating( true );
- docBuilderFactory.setNamespaceAware( true );
- try {
- //otherwise Xerces fails in validation
- docBuilderFactory.setAttribute( "http://apache.org/xml/features/validation/schema", true );
- }
- catch (IllegalArgumentException e) {
- docBuilderFactory.setValidating( false );
- docBuilderFactory.setNamespaceAware( false );
- }
- InputSource source = new InputSource( is );
- DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
- docBuilder.setEntityResolver( resolver );
- docBuilder.setErrorHandler( new ErrorLogger( "XML InputStream", errors, resolver ) );
- Document doc = docBuilder.parse( source );
- if ( errors.size() != 0 ) {
- throw new PersistenceException( "invalid persistence.xml", (Throwable) errors.get( 0 ) );
- }
- return doc;
- }
-
- public static List<PersistenceMetadata> deploy(URL url, Map overrides, EntityResolver resolver,
- PersistenceUnitTransactionType defaultTransactionType) throws Exception {
- Document doc = loadURL( url, resolver );
- Element top = doc.getDocumentElement();
- NodeList children = top.getChildNodes();
- ArrayList<PersistenceMetadata> units = new ArrayList<PersistenceMetadata>();
- for ( int i = 0; i < children.getLength() ; i++ ) {
- if ( children.item( i ).getNodeType() == Node.ELEMENT_NODE ) {
- Element element = (Element) children.item( i );
- String tag = element.getTagName();
- if ( tag.equals( "persistence-unit" ) ) {
- PersistenceMetadata metadata = parsePersistenceUnit( element );
- //override properties of metadata if needed
- if ( overrides.containsKey( HibernatePersistence.PROVIDER ) ) {
- String provider = (String) overrides.get( HibernatePersistence.PROVIDER );
- metadata.setProvider( provider );
- }
- if ( overrides.containsKey( HibernatePersistence.TRANSACTION_TYPE ) ) {
- String transactionType = (String) overrides.get( HibernatePersistence.TRANSACTION_TYPE );
- metadata.setTransactionType( PersistenceXmlLoader.getTransactionType( transactionType ) );
- }
- if ( overrides.containsKey( HibernatePersistence.JTA_DATASOURCE ) ) {
- String dataSource = (String) overrides.get( HibernatePersistence.JTA_DATASOURCE );
- metadata.setJtaDatasource( dataSource );
- }
- if ( overrides.containsKey( HibernatePersistence.NON_JTA_DATASOURCE ) ) {
- String dataSource = (String) overrides.get( HibernatePersistence.NON_JTA_DATASOURCE );
- metadata.setNonJtaDatasource( dataSource );
- }
- /*
- * if explicit => use it
- * if JTA DS => JTA transaction
- * if non JTA DA => RESOURCE_LOCAL transaction
- * else default JavaSE => RESOURCE_LOCAL
- */
- PersistenceUnitTransactionType transactionType = metadata.getTransactionType();
- Boolean isJTA = null;
- if ( StringHelper.isNotEmpty( metadata.getJtaDatasource() ) ) {
- isJTA = Boolean.TRUE;
- }
- else if ( StringHelper.isNotEmpty( metadata.getNonJtaDatasource() ) ) {
- isJTA = Boolean.FALSE;
- }
- if (transactionType == null) {
- if (isJTA == Boolean.TRUE) {
- transactionType = PersistenceUnitTransactionType.JTA;
- }
- else if (isJTA == Boolean.FALSE) {
- transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
- }
- else {
- transactionType = defaultTransactionType;
- }
- }
- metadata.setTransactionType( transactionType );
- Properties properties = metadata.getProps();
- ConfigurationHelper.overrideProperties( properties, overrides );
- units.add( metadata );
- }
- }
- }
- return units;
- }
-
- private static PersistenceMetadata parsePersistenceUnit(Element top)
- throws Exception {
- PersistenceMetadata metadata = new PersistenceMetadata();
- String puName = top.getAttribute( "name" );
- if ( StringHelper.isNotEmpty( puName ) ) {
- log.trace( "Persistent Unit name from persistence.xml: " + puName );
- metadata.setName( puName );
- }
- NodeList children = top.getChildNodes();
- for ( int i = 0; i < children.getLength() ; i++ ) {
- if ( children.item( i ).getNodeType() == Node.ELEMENT_NODE ) {
- Element element = (Element) children.item( i );
- String tag = element.getTagName();
-// if ( tag.equals( "name" ) ) {
-// String puName = XmlHelper.getElementContent( element );
-// log.trace( "FOUND PU NAME: " + puName );
-// metadata.setName( puName );
-// }
-// else
- if ( tag.equals( "non-jta-data-source" ) ) {
- metadata.setNonJtaDatasource( XmlHelper.getElementContent( element ) );
- }
- else if ( tag.equals( "jta-data-source" ) ) {
- metadata.setJtaDatasource( XmlHelper.getElementContent( element ) );
- }
- else if ( tag.equals( "provider" ) ) {
- metadata.setProvider( XmlHelper.getElementContent( element ) );
- }
- else if ( tag.equals( "class" ) ) {
- metadata.getClasses().add( XmlHelper.getElementContent( element ) );
- }
- else if ( tag.equals( "mapping-file" ) ) {
- metadata.getMappingFiles().add( XmlHelper.getElementContent( element ) );
- }
- else if ( tag.equals( "jar-file" ) ) {
- metadata.getJarFiles().add( XmlHelper.getElementContent( element ) );
- }
- else if ( tag.equals( "exclude-unlisted-classes" ) ) {
- metadata.setExcludeUnlistedClasses( true );
- }
- else if ( tag.equals( "properties" ) ) {
- NodeList props = element.getChildNodes();
- for ( int j = 0; j < props.getLength() ; j++ ) {
- if ( props.item( j ).getNodeType() == Node.ELEMENT_NODE ) {
- Element propElement = (Element) props.item( j );
- if ( !"property".equals( propElement.getTagName() ) ) continue;
- String propName = propElement.getAttribute( "name" ).trim();
- String propValue = propElement.getAttribute( "value" ).trim();
- if ( StringHelper.isEmpty( propValue ) ) {
- //fall back to the natural (Hibernate) way of description
- propValue = XmlHelper.getElementContent( propElement, "" );
- }
- metadata.getProps().put( propName, propValue );
- }
- }
-
- }
- }
- }
- PersistenceUnitTransactionType transactionType = getTransactionType( top.getAttribute( "transaction-type" ) );
- if (transactionType != null) metadata.setTransactionType( transactionType );
-
- return metadata;
- }
-
- public static PersistenceUnitTransactionType getTransactionType(String elementContent) {
- if ( StringHelper.isEmpty( elementContent ) ) {
- return null; //PersistenceUnitTransactionType.JTA;
- }
- else if ( elementContent.equalsIgnoreCase( "JTA" ) ) {
- return PersistenceUnitTransactionType.JTA;
- }
- else if ( elementContent.equalsIgnoreCase( "RESOURCE_LOCAL" ) ) {
- return PersistenceUnitTransactionType.RESOURCE_LOCAL;
- }
- else {
- throw new PersistenceException( "Unknown TransactionType: " + elementContent );
- }
- }
-
- public static class ErrorLogger implements ErrorHandler {
- private String file;
- private List errors;
- private EntityResolver resolver;
-
- ErrorLogger(String file, List errors, EntityResolver resolver) {
- this.file = file;
- this.errors = errors;
- this.resolver = resolver;
- }
-
- public void error(SAXParseException error) {
- if ( resolver instanceof EJB3DTDEntityResolver ) {
- if ( ( (EJB3DTDEntityResolver) resolver ).isResolved() == false ) return;
- }
- log.error( "Error parsing XML: " + file + '(' + error.getLineNumber() + ") " + error.getMessage() );
- errors.add( error );
- }
-
- public void fatalError(SAXParseException error) {
- log.error( "Error parsing XML: " + file + '(' + error.getLineNumber() + ") " + error.getMessage() );
- errors.add( error );
- }
-
- public void warning(SAXParseException warn) {
- log.warn( "Warning parsing XML: " + file + '(' + warn.getLineNumber() + ") " + warn.getMessage() );
- }
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/PersistenceXmlLoader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,250 @@
+package org.hibernate.ejb.packaging;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import javax.persistence.PersistenceException;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.cfg.EJB3DTDEntityResolver;
+import org.hibernate.ejb.HibernatePersistence;
+import org.hibernate.ejb.util.ConfigurationHelper;
+import org.hibernate.util.StringHelper;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.EntityResolver;
+import org.xml.sax.ErrorHandler;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXParseException;
+
+/**
+ * Persistence.xml handler
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @author Emmanuel Bernard
+ */
+public final class PersistenceXmlLoader {
+ private static Log log = LogFactory.getLog( PersistenceXmlLoader.class );
+
+ private PersistenceXmlLoader() {
+ }
+
+ private static Document loadURL(URL configURL, EntityResolver resolver) throws Exception {
+ InputStream is = null;
+ if (configURL != null) {
+ URLConnection conn = configURL.openConnection();
+ conn.setUseCaches( false ); //avoid JAR locking on Windows and Tomcat
+ is = conn.getInputStream();
+ }
+ if ( is == null ) {
+ throw new IOException( "Failed to obtain InputStream from url: " + configURL );
+ }
+ List errors = new ArrayList();
+ DocumentBuilderFactory docBuilderFactory = null;
+ docBuilderFactory = DocumentBuilderFactory.newInstance();
+ docBuilderFactory.setValidating( true );
+ docBuilderFactory.setNamespaceAware( true );
+ try {
+ //otherwise Xerces fails in validation
+ docBuilderFactory.setAttribute( "http://apache.org/xml/features/validation/schema", true );
+ }
+ catch (IllegalArgumentException e) {
+ docBuilderFactory.setValidating( false );
+ docBuilderFactory.setNamespaceAware( false );
+ }
+ InputSource source = new InputSource( is );
+ DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
+ docBuilder.setEntityResolver( resolver );
+ docBuilder.setErrorHandler( new ErrorLogger( "XML InputStream", errors, resolver ) );
+ Document doc = docBuilder.parse( source );
+ if ( errors.size() != 0 ) {
+ throw new PersistenceException( "invalid persistence.xml", (Throwable) errors.get( 0 ) );
+ }
+ return doc;
+ }
+
+ public static List<PersistenceMetadata> deploy(URL url, Map overrides, EntityResolver resolver,
+ PersistenceUnitTransactionType defaultTransactionType) throws Exception {
+ Document doc = loadURL( url, resolver );
+ Element top = doc.getDocumentElement();
+ NodeList children = top.getChildNodes();
+ ArrayList<PersistenceMetadata> units = new ArrayList<PersistenceMetadata>();
+ for ( int i = 0; i < children.getLength() ; i++ ) {
+ if ( children.item( i ).getNodeType() == Node.ELEMENT_NODE ) {
+ Element element = (Element) children.item( i );
+ String tag = element.getTagName();
+ if ( tag.equals( "persistence-unit" ) ) {
+ PersistenceMetadata metadata = parsePersistenceUnit( element );
+ //override properties of metadata if needed
+ if ( overrides.containsKey( HibernatePersistence.PROVIDER ) ) {
+ String provider = (String) overrides.get( HibernatePersistence.PROVIDER );
+ metadata.setProvider( provider );
+ }
+ if ( overrides.containsKey( HibernatePersistence.TRANSACTION_TYPE ) ) {
+ String transactionType = (String) overrides.get( HibernatePersistence.TRANSACTION_TYPE );
+ metadata.setTransactionType( PersistenceXmlLoader.getTransactionType( transactionType ) );
+ }
+ if ( overrides.containsKey( HibernatePersistence.JTA_DATASOURCE ) ) {
+ String dataSource = (String) overrides.get( HibernatePersistence.JTA_DATASOURCE );
+ metadata.setJtaDatasource( dataSource );
+ }
+ if ( overrides.containsKey( HibernatePersistence.NON_JTA_DATASOURCE ) ) {
+ String dataSource = (String) overrides.get( HibernatePersistence.NON_JTA_DATASOURCE );
+ metadata.setNonJtaDatasource( dataSource );
+ }
+ /*
+ * if explicit => use it
+ * if JTA DS => JTA transaction
+ * if non JTA DA => RESOURCE_LOCAL transaction
+ * else default JavaSE => RESOURCE_LOCAL
+ */
+ PersistenceUnitTransactionType transactionType = metadata.getTransactionType();
+ Boolean isJTA = null;
+ if ( StringHelper.isNotEmpty( metadata.getJtaDatasource() ) ) {
+ isJTA = Boolean.TRUE;
+ }
+ else if ( StringHelper.isNotEmpty( metadata.getNonJtaDatasource() ) ) {
+ isJTA = Boolean.FALSE;
+ }
+ if (transactionType == null) {
+ if (isJTA == Boolean.TRUE) {
+ transactionType = PersistenceUnitTransactionType.JTA;
+ }
+ else if (isJTA == Boolean.FALSE) {
+ transactionType = PersistenceUnitTransactionType.RESOURCE_LOCAL;
+ }
+ else {
+ transactionType = defaultTransactionType;
+ }
+ }
+ metadata.setTransactionType( transactionType );
+ Properties properties = metadata.getProps();
+ ConfigurationHelper.overrideProperties( properties, overrides );
+ units.add( metadata );
+ }
+ }
+ }
+ return units;
+ }
+
+ private static PersistenceMetadata parsePersistenceUnit(Element top)
+ throws Exception {
+ PersistenceMetadata metadata = new PersistenceMetadata();
+ String puName = top.getAttribute( "name" );
+ if ( StringHelper.isNotEmpty( puName ) ) {
+ log.trace( "Persistent Unit name from persistence.xml: " + puName );
+ metadata.setName( puName );
+ }
+ NodeList children = top.getChildNodes();
+ for ( int i = 0; i < children.getLength() ; i++ ) {
+ if ( children.item( i ).getNodeType() == Node.ELEMENT_NODE ) {
+ Element element = (Element) children.item( i );
+ String tag = element.getTagName();
+// if ( tag.equals( "name" ) ) {
+// String puName = XmlHelper.getElementContent( element );
+// log.trace( "FOUND PU NAME: " + puName );
+// metadata.setName( puName );
+// }
+// else
+ if ( tag.equals( "non-jta-data-source" ) ) {
+ metadata.setNonJtaDatasource( XmlHelper.getElementContent( element ) );
+ }
+ else if ( tag.equals( "jta-data-source" ) ) {
+ metadata.setJtaDatasource( XmlHelper.getElementContent( element ) );
+ }
+ else if ( tag.equals( "provider" ) ) {
+ metadata.setProvider( XmlHelper.getElementContent( element ) );
+ }
+ else if ( tag.equals( "class" ) ) {
+ metadata.getClasses().add( XmlHelper.getElementContent( element ) );
+ }
+ else if ( tag.equals( "mapping-file" ) ) {
+ metadata.getMappingFiles().add( XmlHelper.getElementContent( element ) );
+ }
+ else if ( tag.equals( "jar-file" ) ) {
+ metadata.getJarFiles().add( XmlHelper.getElementContent( element ) );
+ }
+ else if ( tag.equals( "exclude-unlisted-classes" ) ) {
+ metadata.setExcludeUnlistedClasses( true );
+ }
+ else if ( tag.equals( "properties" ) ) {
+ NodeList props = element.getChildNodes();
+ for ( int j = 0; j < props.getLength() ; j++ ) {
+ if ( props.item( j ).getNodeType() == Node.ELEMENT_NODE ) {
+ Element propElement = (Element) props.item( j );
+ if ( !"property".equals( propElement.getTagName() ) ) continue;
+ String propName = propElement.getAttribute( "name" ).trim();
+ String propValue = propElement.getAttribute( "value" ).trim();
+ if ( StringHelper.isEmpty( propValue ) ) {
+ //fall back to the natural (Hibernate) way of description
+ propValue = XmlHelper.getElementContent( propElement, "" );
+ }
+ metadata.getProps().put( propName, propValue );
+ }
+ }
+
+ }
+ }
+ }
+ PersistenceUnitTransactionType transactionType = getTransactionType( top.getAttribute( "transaction-type" ) );
+ if (transactionType != null) metadata.setTransactionType( transactionType );
+
+ return metadata;
+ }
+
+ public static PersistenceUnitTransactionType getTransactionType(String elementContent) {
+ if ( StringHelper.isEmpty( elementContent ) ) {
+ return null; //PersistenceUnitTransactionType.JTA;
+ }
+ else if ( elementContent.equalsIgnoreCase( "JTA" ) ) {
+ return PersistenceUnitTransactionType.JTA;
+ }
+ else if ( elementContent.equalsIgnoreCase( "RESOURCE_LOCAL" ) ) {
+ return PersistenceUnitTransactionType.RESOURCE_LOCAL;
+ }
+ else {
+ throw new PersistenceException( "Unknown TransactionType: " + elementContent );
+ }
+ }
+
+ public static class ErrorLogger implements ErrorHandler {
+ private String file;
+ private List errors;
+ private EntityResolver resolver;
+
+ ErrorLogger(String file, List errors, EntityResolver resolver) {
+ this.file = file;
+ this.errors = errors;
+ this.resolver = resolver;
+ }
+
+ public void error(SAXParseException error) {
+ if ( resolver instanceof EJB3DTDEntityResolver ) {
+ if ( ( (EJB3DTDEntityResolver) resolver ).isResolved() == false ) return;
+ }
+ log.error( "Error parsing XML: " + file + '(' + error.getLineNumber() + ") " + error.getMessage() );
+ errors.add( error );
+ }
+
+ public void fatalError(SAXParseException error) {
+ log.error( "Error parsing XML: " + file + '(' + error.getLineNumber() + ") " + error.getMessage() );
+ errors.add( error );
+ }
+
+ public void warning(SAXParseException warn) {
+ log.warn( "Warning parsing XML: " + file + '(' + warn.getLineNumber() + ") " + warn.getMessage() );
+ }
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/XmlHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/XmlHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/XmlHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,203 +0,0 @@
-package org.hibernate.ejb.packaging;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-
-/**
- * A utility class to cover up the rough bits of xml parsing
- *
- * @author <a href="mailto:chris at kimptoc.net">Chris Kimpton</a>
- * @version $Revision$
- */
-public final class XmlHelper {
- private XmlHelper() {
- }
-
- /**
- * Returns an iterator over the children of the given element with
- * the given tag name.
- *
- * @param element The parent element
- * @param tagName The name of the desired child
- * @return An interator of children or null if element is null.
- */
- public static Iterator getChildrenByTagName(
- Element element,
- String tagName
- ) {
- if ( element == null ) return null;
- // getElementsByTagName gives the corresponding elements in the whole
- // descendance. We want only children
-
- NodeList children = element.getChildNodes();
- ArrayList goodChildren = new ArrayList();
- for ( int i = 0; i < children.getLength() ; i++ ) {
- Node currentChild = children.item( i );
- if ( currentChild.getNodeType() == Node.ELEMENT_NODE &&
- ( (Element) currentChild ).getTagName().equals( tagName ) ) {
- goodChildren.add( (Element) currentChild );
- }
- }
- return goodChildren.iterator();
- }
-
- /**
- * Gets the child of the specified element having the specified unique
- * name. If there are more than one children elements with the same name
- * and exception is thrown.
- *
- * @param element The parent element
- * @param tagName The name of the desired child
- * @return The named child.
- * @throws Exception Child was not found or was not unique.
- */
- public static Element getUniqueChild(Element element, String tagName)
- throws Exception {
- Iterator goodChildren = getChildrenByTagName( element, tagName );
-
- if ( goodChildren != null && goodChildren.hasNext() ) {
- Element child = (Element) goodChildren.next();
- if ( goodChildren.hasNext() ) {
- throw new Exception
- ( "expected only one " + tagName + " tag" );
- }
- return child;
- }
- else {
- throw new Exception
- ( "expected one " + tagName + " tag" );
- }
- }
-
- /**
- * Gets the child of the specified element having the
- * specified name. If the child with this name doesn't exist
- * then null is returned instead.
- *
- * @param element the parent element
- * @param tagName the name of the desired child
- * @return either the named child or null
- */
- public static Element getOptionalChild(Element element, String tagName)
- throws Exception {
- return getOptionalChild( element, tagName, null );
- }
-
- /**
- * Gets the child of the specified element having the
- * specified name. If the child with this name doesn't exist
- * then the supplied default element is returned instead.
- *
- * @param element the parent element
- * @param tagName the name of the desired child
- * @param defaultElement the element to return if the child
- * doesn't exist
- * @return either the named child or the supplied default
- */
- public static Element getOptionalChild(
- Element element,
- String tagName,
- Element defaultElement
- )
- throws Exception {
- Iterator goodChildren = getChildrenByTagName( element, tagName );
-
- if ( goodChildren != null && goodChildren.hasNext() ) {
- Element child = (Element) goodChildren.next();
- if ( goodChildren.hasNext() ) {
- throw new Exception
- ( "expected only one " + tagName + " tag" );
- }
- return child;
- }
- else {
- return defaultElement;
- }
- }
-
- /**
- * Get the content of the given element.
- *
- * @param element The element to get the content for.
- * @return The content of the element or null.
- */
- public static String getElementContent(final Element element)
- throws Exception {
- return getElementContent( element, null );
- }
-
- /**
- * Get the content of the given element.
- *
- * @param element The element to get the content for.
- * @param defaultStr The default to return when there is no content.
- * @return The content of the element or the default.
- */
- public static String getElementContent(Element element, String defaultStr)
- throws Exception {
- if ( element == null ) {
- return defaultStr;
- }
-
- NodeList children = element.getChildNodes();
- StringBuilder result = new StringBuilder("");
- for ( int i = 0; i < children.getLength() ; i++ ) {
- if ( children.item( i ).getNodeType() == Node.TEXT_NODE ||
- children.item( i ).getNodeType() == Node.CDATA_SECTION_NODE ) {
- result.append( children.item( i ).getNodeValue() );
- }
-// else if ( children.item( i ).getNodeType() == Node.COMMENT_NODE ) {
-// // Ignore comment nodes
-// }
- }
- return result.toString().trim();
- }
-
- /**
- * Macro to get the content of a unique child element.
- *
- * @param element The parent element.
- * @param tagName The name of the desired child.
- * @return The element content or null.
- */
- public static String getUniqueChildContent(
- Element element,
- String tagName
- )
- throws Exception {
- return getElementContent( getUniqueChild( element, tagName ) );
- }
-
- /**
- * Macro to get the content of an optional child element.
- *
- * @param element The parent element.
- * @param tagName The name of the desired child.
- * @return The element content or null.
- */
- public static String getOptionalChildContent(
- Element element,
- String tagName
- )
- throws Exception {
- return getElementContent( getOptionalChild( element, tagName ) );
- }
-
- public static boolean getOptionalChildBooleanContent(Element element, String name) throws Exception {
- Element child = getOptionalChild( element, name );
- if ( child != null ) {
- String value = getElementContent( child ).toLowerCase();
- return value.equals( "true" ) || value.equals( "yes" );
- }
-
- return false;
- }
-
-
-}
-
-
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/XmlHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/XmlHelper.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/XmlHelper.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/packaging/XmlHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,203 @@
+package org.hibernate.ejb.packaging;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * A utility class to cover up the rough bits of xml parsing
+ *
+ * @author <a href="mailto:chris at kimptoc.net">Chris Kimpton</a>
+ * @version $Revision$
+ */
+public final class XmlHelper {
+ private XmlHelper() {
+ }
+
+ /**
+ * Returns an iterator over the children of the given element with
+ * the given tag name.
+ *
+ * @param element The parent element
+ * @param tagName The name of the desired child
+ * @return An interator of children or null if element is null.
+ */
+ public static Iterator getChildrenByTagName(
+ Element element,
+ String tagName
+ ) {
+ if ( element == null ) return null;
+ // getElementsByTagName gives the corresponding elements in the whole
+ // descendance. We want only children
+
+ NodeList children = element.getChildNodes();
+ ArrayList goodChildren = new ArrayList();
+ for ( int i = 0; i < children.getLength() ; i++ ) {
+ Node currentChild = children.item( i );
+ if ( currentChild.getNodeType() == Node.ELEMENT_NODE &&
+ ( (Element) currentChild ).getTagName().equals( tagName ) ) {
+ goodChildren.add( (Element) currentChild );
+ }
+ }
+ return goodChildren.iterator();
+ }
+
+ /**
+ * Gets the child of the specified element having the specified unique
+ * name. If there are more than one children elements with the same name
+ * and exception is thrown.
+ *
+ * @param element The parent element
+ * @param tagName The name of the desired child
+ * @return The named child.
+ * @throws Exception Child was not found or was not unique.
+ */
+ public static Element getUniqueChild(Element element, String tagName)
+ throws Exception {
+ Iterator goodChildren = getChildrenByTagName( element, tagName );
+
+ if ( goodChildren != null && goodChildren.hasNext() ) {
+ Element child = (Element) goodChildren.next();
+ if ( goodChildren.hasNext() ) {
+ throw new Exception
+ ( "expected only one " + tagName + " tag" );
+ }
+ return child;
+ }
+ else {
+ throw new Exception
+ ( "expected one " + tagName + " tag" );
+ }
+ }
+
+ /**
+ * Gets the child of the specified element having the
+ * specified name. If the child with this name doesn't exist
+ * then null is returned instead.
+ *
+ * @param element the parent element
+ * @param tagName the name of the desired child
+ * @return either the named child or null
+ */
+ public static Element getOptionalChild(Element element, String tagName)
+ throws Exception {
+ return getOptionalChild( element, tagName, null );
+ }
+
+ /**
+ * Gets the child of the specified element having the
+ * specified name. If the child with this name doesn't exist
+ * then the supplied default element is returned instead.
+ *
+ * @param element the parent element
+ * @param tagName the name of the desired child
+ * @param defaultElement the element to return if the child
+ * doesn't exist
+ * @return either the named child or the supplied default
+ */
+ public static Element getOptionalChild(
+ Element element,
+ String tagName,
+ Element defaultElement
+ )
+ throws Exception {
+ Iterator goodChildren = getChildrenByTagName( element, tagName );
+
+ if ( goodChildren != null && goodChildren.hasNext() ) {
+ Element child = (Element) goodChildren.next();
+ if ( goodChildren.hasNext() ) {
+ throw new Exception
+ ( "expected only one " + tagName + " tag" );
+ }
+ return child;
+ }
+ else {
+ return defaultElement;
+ }
+ }
+
+ /**
+ * Get the content of the given element.
+ *
+ * @param element The element to get the content for.
+ * @return The content of the element or null.
+ */
+ public static String getElementContent(final Element element)
+ throws Exception {
+ return getElementContent( element, null );
+ }
+
+ /**
+ * Get the content of the given element.
+ *
+ * @param element The element to get the content for.
+ * @param defaultStr The default to return when there is no content.
+ * @return The content of the element or the default.
+ */
+ public static String getElementContent(Element element, String defaultStr)
+ throws Exception {
+ if ( element == null ) {
+ return defaultStr;
+ }
+
+ NodeList children = element.getChildNodes();
+ StringBuilder result = new StringBuilder("");
+ for ( int i = 0; i < children.getLength() ; i++ ) {
+ if ( children.item( i ).getNodeType() == Node.TEXT_NODE ||
+ children.item( i ).getNodeType() == Node.CDATA_SECTION_NODE ) {
+ result.append( children.item( i ).getNodeValue() );
+ }
+// else if ( children.item( i ).getNodeType() == Node.COMMENT_NODE ) {
+// // Ignore comment nodes
+// }
+ }
+ return result.toString().trim();
+ }
+
+ /**
+ * Macro to get the content of a unique child element.
+ *
+ * @param element The parent element.
+ * @param tagName The name of the desired child.
+ * @return The element content or null.
+ */
+ public static String getUniqueChildContent(
+ Element element,
+ String tagName
+ )
+ throws Exception {
+ return getElementContent( getUniqueChild( element, tagName ) );
+ }
+
+ /**
+ * Macro to get the content of an optional child element.
+ *
+ * @param element The parent element.
+ * @param tagName The name of the desired child.
+ * @return The element content or null.
+ */
+ public static String getOptionalChildContent(
+ Element element,
+ String tagName
+ )
+ throws Exception {
+ return getElementContent( getOptionalChild( element, tagName ) );
+ }
+
+ public static boolean getOptionalChildBooleanContent(Element element, String name) throws Exception {
+ Element child = getOptionalChild( element, name );
+ if ( child != null ) {
+ String value = getElementContent( child ).toLowerCase();
+ return value.equals( "true" ) || value.equals( "yes" );
+ }
+
+ return false;
+ }
+
+
+}
+
+
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction)
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransaction.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransaction.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransaction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,102 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.transaction;
-
-import javax.transaction.SystemException;
-import javax.transaction.Transaction;
-
-import org.hibernate.HibernateException;
-import org.hibernate.TransactionException;
-import org.hibernate.jdbc.JDBCContext;
-import org.hibernate.transaction.CMTTransaction;
-import org.hibernate.transaction.TransactionFactory;
-import org.hibernate.util.JTAHelper;
-
-/**
- * Implements a joinable transaction. Until the transaction is marked for joined, the TM.isTransactionInProgress()
- * must return false
- *
- * @author Emmanuel Bernard
- */
-public class JoinableCMTTransaction extends CMTTransaction {
- private JoinStatus status;
-
- public JoinableCMTTransaction(JDBCContext jdbcContext, TransactionFactory.Context transactionContext) {
- super( jdbcContext, transactionContext );
- //status = JoinStatus.MARKED_FOR_JOINED;
- //tryJoiningTransaction();
- }
-
- public boolean isTransactionInProgress(
- JDBCContext jdbcContext,
- TransactionFactory.Context transactionContext
- ) {
- try {
- return status == JoinStatus.JOINED && isTransactionInProgress(
- transactionContext.getFactory().getTransactionManager().getTransaction()
- );
- }
- catch (SystemException se) {
- throw new TransactionException( "Unable to check transaction status", se );
- }
- }
-
- private boolean isTransactionInProgress() {
- try {
- Transaction transaction = transactionContext.getFactory().getTransactionManager().getTransaction();
- return isTransactionInProgress(transaction);
- }
- catch (SystemException se) {
- throw new TransactionException( "Unable to check transaction status", se );
- }
- }
-
- private boolean isTransactionInProgress(Transaction tx) throws SystemException {
- return JTAHelper.isTransactionInProgress(tx) && ! JTAHelper.isRollback( tx.getStatus() );
- }
-
- void tryJoiningTransaction() {
- if ( status == JoinStatus.MARKED_FOR_JOINED ) {
- if ( isTransactionInProgress() ) {
- status = JoinStatus.JOINED;
- }
- else {
- status = JoinStatus.NOT_JOINED;
- }
- }
- }
-
- @Override
- public void begin() throws HibernateException {
- super.begin();
- status = JoinStatus.JOINED;
- }
-
- @Override
- public void commit() throws HibernateException {
- /* this method is not supposed to be called
- * it breaks the flushBeforeCompletion flag optimizeation
- * regarding flushing skip.
- * In its current form, it will generate too much flush() calls
- */
- super.commit();
- }
-
-
- public JoinStatus getStatus() {
- return status;
- }
-
- public void resetStatus() {
- status = JoinStatus.NOT_JOINED;
- }
-
- public void markForJoined() {
- if ( status != JoinStatus.JOINED ) status = JoinStatus.MARKED_FOR_JOINED;
- }
-
- public static enum JoinStatus {
- NOT_JOINED,
- MARKED_FOR_JOINED,
- JOINED
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransaction.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransaction.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransaction.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransaction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,102 @@
+//$Id: $
+package org.hibernate.ejb.transaction;
+
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+
+import org.hibernate.HibernateException;
+import org.hibernate.TransactionException;
+import org.hibernate.jdbc.JDBCContext;
+import org.hibernate.transaction.CMTTransaction;
+import org.hibernate.transaction.TransactionFactory;
+import org.hibernate.util.JTAHelper;
+
+/**
+ * Implements a joinable transaction. Until the transaction is marked for joined, the TM.isTransactionInProgress()
+ * must return false
+ *
+ * @author Emmanuel Bernard
+ */
+public class JoinableCMTTransaction extends CMTTransaction {
+ private JoinStatus status;
+
+ public JoinableCMTTransaction(JDBCContext jdbcContext, TransactionFactory.Context transactionContext) {
+ super( jdbcContext, transactionContext );
+ //status = JoinStatus.MARKED_FOR_JOINED;
+ //tryJoiningTransaction();
+ }
+
+ public boolean isTransactionInProgress(
+ JDBCContext jdbcContext,
+ TransactionFactory.Context transactionContext
+ ) {
+ try {
+ return status == JoinStatus.JOINED && isTransactionInProgress(
+ transactionContext.getFactory().getTransactionManager().getTransaction()
+ );
+ }
+ catch (SystemException se) {
+ throw new TransactionException( "Unable to check transaction status", se );
+ }
+ }
+
+ private boolean isTransactionInProgress() {
+ try {
+ Transaction transaction = transactionContext.getFactory().getTransactionManager().getTransaction();
+ return isTransactionInProgress(transaction);
+ }
+ catch (SystemException se) {
+ throw new TransactionException( "Unable to check transaction status", se );
+ }
+ }
+
+ private boolean isTransactionInProgress(Transaction tx) throws SystemException {
+ return JTAHelper.isTransactionInProgress(tx) && ! JTAHelper.isRollback( tx.getStatus() );
+ }
+
+ void tryJoiningTransaction() {
+ if ( status == JoinStatus.MARKED_FOR_JOINED ) {
+ if ( isTransactionInProgress() ) {
+ status = JoinStatus.JOINED;
+ }
+ else {
+ status = JoinStatus.NOT_JOINED;
+ }
+ }
+ }
+
+ @Override
+ public void begin() throws HibernateException {
+ super.begin();
+ status = JoinStatus.JOINED;
+ }
+
+ @Override
+ public void commit() throws HibernateException {
+ /* this method is not supposed to be called
+ * it breaks the flushBeforeCompletion flag optimizeation
+ * regarding flushing skip.
+ * In its current form, it will generate too much flush() calls
+ */
+ super.commit();
+ }
+
+
+ public JoinStatus getStatus() {
+ return status;
+ }
+
+ public void resetStatus() {
+ status = JoinStatus.NOT_JOINED;
+ }
+
+ public void markForJoined() {
+ if ( status != JoinStatus.JOINED ) status = JoinStatus.MARKED_FOR_JOINED;
+ }
+
+ public static enum JoinStatus {
+ NOT_JOINED,
+ MARKED_FOR_JOINED,
+ JOINED
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransactionFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransactionFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransactionFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.transaction;
-
-import org.hibernate.HibernateException;
-import org.hibernate.Transaction;
-import org.hibernate.jdbc.JDBCContext;
-import org.hibernate.transaction.CMTTransactionFactory;
-
-/**
- * A transaction is in progress if the underlying JTA tx is in progress and if the Tx is marked as
- * MARKED_FOR_JOINED
- *
- * @author Emmanuel Bernard
- */
-public class JoinableCMTTransactionFactory extends CMTTransactionFactory {
- public Transaction createTransaction(JDBCContext jdbcContext, Context transactionContext)
- throws HibernateException {
- return new JoinableCMTTransaction( jdbcContext, transactionContext );
- }
-
- @Override
- public boolean isTransactionInProgress(
- JDBCContext jdbcContext, Context transactionContext, Transaction transaction
- ) {
- if ( transaction == null ) return false; //should not happen though
- JoinableCMTTransaction joinableCMTTransaction = ( (JoinableCMTTransaction) transaction );
- joinableCMTTransaction.tryJoiningTransaction();
- return joinableCMTTransaction.isTransactionInProgress( jdbcContext, transactionContext );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransactionFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransactionFactory.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransactionFactory.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/transaction/JoinableCMTTransactionFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id: $
+package org.hibernate.ejb.transaction;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Transaction;
+import org.hibernate.jdbc.JDBCContext;
+import org.hibernate.transaction.CMTTransactionFactory;
+
+/**
+ * A transaction is in progress if the underlying JTA tx is in progress and if the Tx is marked as
+ * MARKED_FOR_JOINED
+ *
+ * @author Emmanuel Bernard
+ */
+public class JoinableCMTTransactionFactory extends CMTTransactionFactory {
+ public Transaction createTransaction(JDBCContext jdbcContext, Context transactionContext)
+ throws HibernateException {
+ return new JoinableCMTTransaction( jdbcContext, transactionContext );
+ }
+
+ @Override
+ public boolean isTransactionInProgress(
+ JDBCContext jdbcContext, Context transactionContext, Transaction transaction
+ ) {
+ if ( transaction == null ) return false; //should not happen though
+ JoinableCMTTransaction joinableCMTTransaction = ( (JoinableCMTTransaction) transaction );
+ joinableCMTTransaction.tryJoiningTransaction();
+ return joinableCMTTransaction.isTransactionInProgress( jdbcContext, transactionContext );
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util)
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/ConfigurationHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/ConfigurationHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/ConfigurationHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,60 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.util;
-
-import java.util.Map;
-import java.util.Properties;
-import java.util.Set;
-
-import javax.persistence.FlushModeType;
-import javax.persistence.PersistenceException;
-
-import org.hibernate.FlushMode;
-import org.hibernate.AssertionFailure;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class ConfigurationHelper {
- public static void overrideProperties(Properties properties, Map overrides) {
- for ( Map.Entry entry : (Set<Map.Entry>) overrides.entrySet() ) {
- if ( entry.getKey() instanceof String && entry.getValue() instanceof String ) {
- properties.setProperty( (String) entry.getKey(), (String) entry.getValue() );
- }
- }
- }
-
- public static FlushMode getFlushMode(Object value) {
- FlushMode flushMode = null;
- if (value instanceof FlushMode) {
- flushMode = (FlushMode) value;
- }
- else if (value instanceof javax.persistence.FlushModeType) {
- flushMode = ConfigurationHelper.getFlushMode( (javax.persistence.FlushModeType) value);
- }
- else if (value instanceof String) {
- flushMode = ConfigurationHelper.getFlushMode( (String) value);
- }
- if (flushMode == null) {
- throw new PersistenceException("Unable to parse org.hibernate.flushMode: " + value);
- }
- return flushMode;
- }
-
- private static FlushMode getFlushMode(String flushMode) {
- if (flushMode == null) return null;
- flushMode = flushMode.toUpperCase();
- return FlushMode.parse( flushMode );
- }
-
- private static FlushMode getFlushMode(FlushModeType flushMode) {
- switch(flushMode) {
- case AUTO:
- return FlushMode.AUTO;
- case COMMIT:
- return FlushMode.COMMIT;
- default:
- throw new AssertionFailure("Unknown FlushModeType: " + flushMode);
- }
-
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/ConfigurationHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/ConfigurationHelper.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/ConfigurationHelper.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/ConfigurationHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,60 @@
+//$Id: $
+package org.hibernate.ejb.util;
+
+import java.util.Map;
+import java.util.Properties;
+import java.util.Set;
+
+import javax.persistence.FlushModeType;
+import javax.persistence.PersistenceException;
+
+import org.hibernate.FlushMode;
+import org.hibernate.AssertionFailure;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class ConfigurationHelper {
+ public static void overrideProperties(Properties properties, Map overrides) {
+ for ( Map.Entry entry : (Set<Map.Entry>) overrides.entrySet() ) {
+ if ( entry.getKey() instanceof String && entry.getValue() instanceof String ) {
+ properties.setProperty( (String) entry.getKey(), (String) entry.getValue() );
+ }
+ }
+ }
+
+ public static FlushMode getFlushMode(Object value) {
+ FlushMode flushMode = null;
+ if (value instanceof FlushMode) {
+ flushMode = (FlushMode) value;
+ }
+ else if (value instanceof javax.persistence.FlushModeType) {
+ flushMode = ConfigurationHelper.getFlushMode( (javax.persistence.FlushModeType) value);
+ }
+ else if (value instanceof String) {
+ flushMode = ConfigurationHelper.getFlushMode( (String) value);
+ }
+ if (flushMode == null) {
+ throw new PersistenceException("Unable to parse org.hibernate.flushMode: " + value);
+ }
+ return flushMode;
+ }
+
+ private static FlushMode getFlushMode(String flushMode) {
+ if (flushMode == null) return null;
+ flushMode = flushMode.toUpperCase();
+ return FlushMode.parse( flushMode );
+ }
+
+ private static FlushMode getFlushMode(FlushModeType flushMode) {
+ switch(flushMode) {
+ case AUTO:
+ return FlushMode.AUTO;
+ case COMMIT:
+ return FlushMode.COMMIT;
+ default:
+ throw new AssertionFailure("Unknown FlushModeType: " + flushMode);
+ }
+
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/LogHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/LogHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/LogHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,76 +0,0 @@
-//$Id$
-package org.hibernate.ejb.util;
-
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Properties;
-import javax.persistence.spi.PersistenceUnitInfo;
-
-/**
- * @author Emmanuel Bernard
- */
-public final class LogHelper {
- private LogHelper() {
- }
-
- public static String logPersistenceUnitInfo(PersistenceUnitInfo unitInfo) {
- StringBuilder sb = new StringBuilder();
- sb.append( "PersistenceUnitInfo [\n\t" )
- .append( "name: " )
- .append( unitInfo.getPersistenceUnitName() )
- .append( "\n\t" )
- .append( "persistence provider classname: " )
- .append( unitInfo.getPersistenceProviderClassName() )
- .append( "\n\t" )
- .append( "classloader: " )
- .append( unitInfo.getClassLoader() )
- .append( "\n\t" )
- .append( "Temporary classloader: " )
- .append( unitInfo.getNewTempClassLoader() )
- .append( "\n\t" )
- .append( "excludeUnlistedClasses: " )
- .append( unitInfo.excludeUnlistedClasses() )
- .append( "\n\t" )
- .append( "JTA datasource: " )
- .append( unitInfo.getJtaDataSource() )
- .append( "\n\t" )
- .append( "Non JTA datasource: " )
- .append( unitInfo.getNonJtaDataSource() )
- .append( "\n\t" )
- .append( "Transaction type: " )
- .append( unitInfo.getTransactionType() )
- .append( "\n\t" )
- .append( "PU root URL: " )
- .append( unitInfo.getPersistenceUnitRootUrl() )
- .append( "\n\t" );
- sb.append( "Jar files URLs [" );
- List<URL> jarFileUrls = unitInfo.getJarFileUrls();
- for ( URL url : jarFileUrls ) {
- sb.append( "\n\t\t" ).append( url );
- }
- sb.append( "]\n\t" );
- sb.append( "Managed classes names [" );
- List<String> classesNames = unitInfo.getManagedClassNames();
- for ( String clazz : classesNames ) {
- sb.append( "\n\t\t" ).append( clazz );
- }
- sb.append( "]\n\t" );
- sb.append( "Mapping files names [" );
- List<String> mappingFiles = unitInfo.getMappingFileNames();
- for ( String file : mappingFiles ) {
- sb.append( "\n\t\t" ).append( file );
- }
- sb.append( "]\n\t" );
- sb.append( "Properties [" );
- Properties properties = unitInfo.getProperties();
- Enumeration names = properties.propertyNames();
- while ( names.hasMoreElements() ) {
- String name = (String) names.nextElement();
- sb.append( "\n\t\t" ).append( name ).append( ": " ).append( properties.getProperty( name ) );
- }
- sb.append( "]" );
- return sb.toString();
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/LogHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/LogHelper.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/LogHelper.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/LogHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,76 @@
+//$Id$
+package org.hibernate.ejb.util;
+
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Properties;
+import javax.persistence.spi.PersistenceUnitInfo;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public final class LogHelper {
+ private LogHelper() {
+ }
+
+ public static String logPersistenceUnitInfo(PersistenceUnitInfo unitInfo) {
+ StringBuilder sb = new StringBuilder();
+ sb.append( "PersistenceUnitInfo [\n\t" )
+ .append( "name: " )
+ .append( unitInfo.getPersistenceUnitName() )
+ .append( "\n\t" )
+ .append( "persistence provider classname: " )
+ .append( unitInfo.getPersistenceProviderClassName() )
+ .append( "\n\t" )
+ .append( "classloader: " )
+ .append( unitInfo.getClassLoader() )
+ .append( "\n\t" )
+ .append( "Temporary classloader: " )
+ .append( unitInfo.getNewTempClassLoader() )
+ .append( "\n\t" )
+ .append( "excludeUnlistedClasses: " )
+ .append( unitInfo.excludeUnlistedClasses() )
+ .append( "\n\t" )
+ .append( "JTA datasource: " )
+ .append( unitInfo.getJtaDataSource() )
+ .append( "\n\t" )
+ .append( "Non JTA datasource: " )
+ .append( unitInfo.getNonJtaDataSource() )
+ .append( "\n\t" )
+ .append( "Transaction type: " )
+ .append( unitInfo.getTransactionType() )
+ .append( "\n\t" )
+ .append( "PU root URL: " )
+ .append( unitInfo.getPersistenceUnitRootUrl() )
+ .append( "\n\t" );
+ sb.append( "Jar files URLs [" );
+ List<URL> jarFileUrls = unitInfo.getJarFileUrls();
+ for ( URL url : jarFileUrls ) {
+ sb.append( "\n\t\t" ).append( url );
+ }
+ sb.append( "]\n\t" );
+ sb.append( "Managed classes names [" );
+ List<String> classesNames = unitInfo.getManagedClassNames();
+ for ( String clazz : classesNames ) {
+ sb.append( "\n\t\t" ).append( clazz );
+ }
+ sb.append( "]\n\t" );
+ sb.append( "Mapping files names [" );
+ List<String> mappingFiles = unitInfo.getMappingFileNames();
+ for ( String file : mappingFiles ) {
+ sb.append( "\n\t\t" ).append( file );
+ }
+ sb.append( "]\n\t" );
+ sb.append( "Properties [" );
+ Properties properties = unitInfo.getProperties();
+ Enumeration names = properties.propertyNames();
+ while ( names.hasMoreElements() ) {
+ String name = (String) names.nextElement();
+ sb.append( "\n\t\t" ).append( name ).append( ": " ).append( properties.getProperty( name ) );
+ }
+ sb.append( "]" );
+ return sb.toString();
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/NamingHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/NamingHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/NamingHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,74 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.util;
-
-import javax.naming.Context;
-import javax.naming.InvalidNameException;
-import javax.naming.NamingException;
-import javax.naming.event.EventContext;
-import javax.naming.event.NamespaceChangeListener;
-import javax.naming.event.NamingEvent;
-import javax.naming.event.NamingExceptionEvent;
-import javax.naming.event.NamingListener;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.ejb.Ejb3Configuration;
-import org.hibernate.ejb.HibernatePersistence;
-
-/**
- * @author Emmanuel Bernard
- */
-public class NamingHelper {
- private NamingHelper() {};
-
- private static Log log = LogFactory.getLog( NamingHelper.class );
-
- /** bind the configuration to the JNDI */
- public static void bind(Ejb3Configuration cfg) {
- String name = cfg.getHibernateConfiguration().getProperty( HibernatePersistence.CONFIGURATION_JNDI_NAME );
- if ( name == null ) {
- log.debug( "Not Ejb3Configuration to JNDI, no JNDI name configured" );
- }
- else {
- log.info( "Ejb3Configuration name: " + name );
-
- try {
- Context ctx = org.hibernate.util.NamingHelper.getInitialContext( cfg.getProperties() );
- org.hibernate.util.NamingHelper.bind( ctx, name, cfg );
- log.info( "Bound Ejb3Configuration to JNDI name: " + name );
- ( (EventContext) ctx ).addNamingListener( name, EventContext.OBJECT_SCOPE, LISTENER );
- }
- catch (InvalidNameException ine) {
- log.error( "Invalid JNDI name: " + name, ine );
- }
- catch (NamingException ne) {
- log.warn( "Could not bind Ejb3Configuration to JNDI", ne );
- }
- catch (ClassCastException cce) {
- log.warn( "InitialContext did not implement EventContext" );
- }
- }
- }
-
- private static final NamingListener LISTENER = new NamespaceChangeListener() {
- public void objectAdded(NamingEvent evt) {
- log.debug( "An Ejb3Configuration was successfully bound to name: " + evt.getNewBinding().getName() );
- }
-
- public void objectRemoved(NamingEvent evt) {
- String name = evt.getOldBinding().getName();
- log.info( "An Ejb3Configuration was unbound from name: " + name );
- }
-
- public void objectRenamed(NamingEvent evt) {
- String name = evt.getOldBinding().getName();
- log.info( "An Ejb3Configuration was renamed from name: " + name );
- }
-
- public void namingExceptionThrown(NamingExceptionEvent evt) {
- log.warn( "Naming exception occurred accessing Ejb3Configuration: " + evt.getException() );
- }
- };
-
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/NamingHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/NamingHelper.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/NamingHelper.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/ejb/util/NamingHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,74 @@
+//$Id: $
+package org.hibernate.ejb.util;
+
+import javax.naming.Context;
+import javax.naming.InvalidNameException;
+import javax.naming.NamingException;
+import javax.naming.event.EventContext;
+import javax.naming.event.NamespaceChangeListener;
+import javax.naming.event.NamingEvent;
+import javax.naming.event.NamingExceptionEvent;
+import javax.naming.event.NamingListener;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.ejb.HibernatePersistence;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class NamingHelper {
+ private NamingHelper() {};
+
+ private static Log log = LogFactory.getLog( NamingHelper.class );
+
+ /** bind the configuration to the JNDI */
+ public static void bind(Ejb3Configuration cfg) {
+ String name = cfg.getHibernateConfiguration().getProperty( HibernatePersistence.CONFIGURATION_JNDI_NAME );
+ if ( name == null ) {
+ log.debug( "Not Ejb3Configuration to JNDI, no JNDI name configured" );
+ }
+ else {
+ log.info( "Ejb3Configuration name: " + name );
+
+ try {
+ Context ctx = org.hibernate.util.NamingHelper.getInitialContext( cfg.getProperties() );
+ org.hibernate.util.NamingHelper.bind( ctx, name, cfg );
+ log.info( "Bound Ejb3Configuration to JNDI name: " + name );
+ ( (EventContext) ctx ).addNamingListener( name, EventContext.OBJECT_SCOPE, LISTENER );
+ }
+ catch (InvalidNameException ine) {
+ log.error( "Invalid JNDI name: " + name, ine );
+ }
+ catch (NamingException ne) {
+ log.warn( "Could not bind Ejb3Configuration to JNDI", ne );
+ }
+ catch (ClassCastException cce) {
+ log.warn( "InitialContext did not implement EventContext" );
+ }
+ }
+ }
+
+ private static final NamingListener LISTENER = new NamespaceChangeListener() {
+ public void objectAdded(NamingEvent evt) {
+ log.debug( "An Ejb3Configuration was successfully bound to name: " + evt.getNewBinding().getName() );
+ }
+
+ public void objectRemoved(NamingEvent evt) {
+ String name = evt.getOldBinding().getName();
+ log.info( "An Ejb3Configuration was unbound from name: " + name );
+ }
+
+ public void objectRenamed(NamingEvent evt) {
+ String name = evt.getOldBinding().getName();
+ log.info( "An Ejb3Configuration was renamed from name: " + name );
+ }
+
+ public void namingExceptionThrown(NamingExceptionEvent evt) {
+ log.warn( "Naming exception occurred accessing Ejb3Configuration: " + evt.getException() );
+ }
+ };
+
+
+}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/engine)
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadeStyle.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadeStyle.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadeStyle.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id: $
-package org.hibernate.engine;
-
-/**
- * Becasue CascadeStyle is not opened and package protected,
- * I need to subclass and override the persist alias
- *
- * Note that This class has to be triggered by EJB3PersistEventListener at class loading time
- *
- * TODO get rid of it for 3.3
- *
- * @author Emmanuel Bernard
- */
-public abstract class EJB3CascadeStyle extends CascadeStyle {
-
- /**
- * cascade using EJB3CascadingAction
- */
- public static final CascadeStyle PERSIST_EJB3 = new CascadeStyle() {
- public boolean doCascade(CascadingAction action) {
- return action==EJB3CascadingAction.PERSIST_SKIPLAZY
- || action==CascadingAction.PERSIST_ON_FLUSH;
- }
- public String toString() {
- return "STYLE_PERSIST_SKIPLAZY";
- }
- };
-
- static {
- STYLES.put( "persist", PERSIST_EJB3 );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadeStyle.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadeStyle.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadeStyle.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadeStyle.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id: $
+package org.hibernate.engine;
+
+/**
+ * Becasue CascadeStyle is not opened and package protected,
+ * I need to subclass and override the persist alias
+ *
+ * Note that This class has to be triggered by EJB3PersistEventListener at class loading time
+ *
+ * TODO get rid of it for 3.3
+ *
+ * @author Emmanuel Bernard
+ */
+public abstract class EJB3CascadeStyle extends CascadeStyle {
+
+ /**
+ * cascade using EJB3CascadingAction
+ */
+ public static final CascadeStyle PERSIST_EJB3 = new CascadeStyle() {
+ public boolean doCascade(CascadingAction action) {
+ return action==EJB3CascadingAction.PERSIST_SKIPLAZY
+ || action==CascadingAction.PERSIST_ON_FLUSH;
+ }
+ public String toString() {
+ return "STYLE_PERSIST_SKIPLAZY";
+ }
+ };
+
+ static {
+ STYLES.put( "persist", PERSIST_EJB3 );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadingAction.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadingAction.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadingAction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id: $
-package org.hibernate.engine;
-
-import java.util.Map;
-import java.util.Iterator;
-
-import org.hibernate.event.EventSource;
-import org.hibernate.HibernateException;
-import org.hibernate.type.CollectionType;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Because of CascadingAction constructor visibility
- * I need a packaged friendly subclass
- * TODO Get rid of it for 3.3
- * @author Emmanuel Bernard
- */
-public abstract class EJB3CascadingAction extends CascadingAction {
- private static Log log = LogFactory.getLog( CascadingAction.class );
- /**
- * @see org.hibernate.Session#persist(Object)
- */
- public static final CascadingAction PERSIST_SKIPLAZY = new CascadingAction() {
- public void cascade(EventSource session, Object child, String entityName, Object anything, boolean isCascadeDeleteEnabled)
- throws HibernateException {
- if ( log.isTraceEnabled() ) {
- log.trace( "cascading to persist: " + entityName );
- }
- session.persist( entityName, child, (Map) anything );
- }
- public Iterator getCascadableChildrenIterator(EventSource session, CollectionType collectionType, Object collection) {
- // persists don't cascade to uninitialized collections
- return CascadingAction.getLoadedElementsIterator( session, collectionType, collection );
- }
- public boolean deleteOrphans() {
- return false;
- }
- public boolean performOnLazyProperty() {
- return false;
- }
- public String toString() {
- return "ACTION_PERSIST_SKIPLAZY";
- }
- };
-
-}
Copied: trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadingAction.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadingAction.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadingAction.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/java/org/hibernate/engine/EJB3CascadingAction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id: $
+package org.hibernate.engine;
+
+import java.util.Map;
+import java.util.Iterator;
+
+import org.hibernate.event.EventSource;
+import org.hibernate.HibernateException;
+import org.hibernate.type.CollectionType;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Because of CascadingAction constructor visibility
+ * I need a packaged friendly subclass
+ * TODO Get rid of it for 3.3
+ * @author Emmanuel Bernard
+ */
+public abstract class EJB3CascadingAction extends CascadingAction {
+ private static Log log = LogFactory.getLog( CascadingAction.class );
+ /**
+ * @see org.hibernate.Session#persist(Object)
+ */
+ public static final CascadingAction PERSIST_SKIPLAZY = new CascadingAction() {
+ public void cascade(EventSource session, Object child, String entityName, Object anything, boolean isCascadeDeleteEnabled)
+ throws HibernateException {
+ if ( log.isTraceEnabled() ) {
+ log.trace( "cascading to persist: " + entityName );
+ }
+ session.persist( entityName, child, (Map) anything );
+ }
+ public Iterator getCascadableChildrenIterator(EventSource session, CollectionType collectionType, Object collection) {
+ // persists don't cascade to uninitialized collections
+ return CascadingAction.getLoadedElementsIterator( session, collectionType, collection );
+ }
+ public boolean deleteOrphans() {
+ return false;
+ }
+ public boolean performOnLazyProperty() {
+ return false;
+ }
+ public String toString() {
+ return "ACTION_PERSIST_SKIPLAZY";
+ }
+ };
+
+}
Copied: trunk/HibernateExt/entitymanager/src/resources (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/resources)
Copied: trunk/HibernateExt/entitymanager/src/resources/META-INF (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/resources/META-INF)
Copied: trunk/HibernateExt/entitymanager/src/resources/META-INF/services (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/resources/META-INF/services)
Deleted: trunk/HibernateExt/entitymanager/src/resources/META-INF/services/javax.persistence.spi.PersistenceProvider
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/resources/META-INF/services/javax.persistence.spi.PersistenceProvider 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/resources/META-INF/services/javax.persistence.spi.PersistenceProvider 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1 +0,0 @@
-org.hibernate.ejb.HibernatePersistence
Copied: trunk/HibernateExt/entitymanager/src/resources/META-INF/services/javax.persistence.spi.PersistenceProvider (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/resources/META-INF/services/javax.persistence.spi.PersistenceProvider)
===================================================================
--- trunk/HibernateExt/entitymanager/src/resources/META-INF/services/javax.persistence.spi.PersistenceProvider (rev 0)
+++ trunk/HibernateExt/entitymanager/src/resources/META-INF/services/javax.persistence.spi.PersistenceProvider 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1 @@
+org.hibernate.ejb.HibernatePersistence
Copied: trunk/HibernateExt/entitymanager/src/resources/org (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/resources/org)
Copied: trunk/HibernateExt/entitymanager/src/resources/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/resources/org/hibernate)
Copied: trunk/HibernateExt/entitymanager/src/resources/org/hibernate/ejb (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/resources/org/hibernate/ejb)
Deleted: trunk/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/persistence_1_0.xsd
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/persistence_1_0.xsd 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/persistence_1_0.xsd 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,260 +0,0 @@
-<?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="1.0">
-
- <xsd:annotation>
- <xsd:documentation>
- @(#)persistence_1_0.xsd 1.0 Feb 9 2006
- </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_1_0.xsd"
- version="1.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="0" 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>
-
- Textual 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="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="1.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:schema>
-
Copied: trunk/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/persistence_1_0.xsd (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/persistence_1_0.xsd)
===================================================================
--- trunk/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/persistence_1_0.xsd (rev 0)
+++ trunk/HibernateExt/entitymanager/src/resources/org/hibernate/ejb/persistence_1_0.xsd 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,260 @@
+<?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="1.0">
+
+ <xsd:annotation>
+ <xsd:documentation>
+ @(#)persistence_1_0.xsd 1.0 Feb 9 2006
+ </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_1_0.xsd"
+ version="1.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="0" 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>
+
+ Textual 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="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="1.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:schema>
+
Copied: trunk/HibernateExt/entitymanager/src/test (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test)
Deleted: trunk/HibernateExt/entitymanager/src/test/NoPackageEntity.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/NoPackageEntity.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/NoPackageEntity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,9 +0,0 @@
-//$Id: $
-
-/**
- * @author Emmanuel Bernard
- */
-public class NoPackageEntity {
- private Integer id;
- private String name;
-}
Copied: trunk/HibernateExt/entitymanager/src/test/NoPackageEntity.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/NoPackageEntity.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/NoPackageEntity.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/NoPackageEntity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,9 @@
+//$Id: $
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class NoPackageEntity {
+ private Integer id;
+ private String name;
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/hibernate.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/hibernate.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/hibernate.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,491 +0,0 @@
-###############
-### EJB 3.0 ###
-###############
-
-## select Hibernate persistence provider
-
-javax.persistence.provider org.hibernate.ejb.HibernatePersistence
-javax.persistence.transactionType=RESOURCE_LOCAL
-
-## entity bean class name (comma separated)
-
-#hibernate.ejb.classes org.hibernate.ejb.test.Item, org.hibernate.ejb.test.Distributor
-
-## entity caching (strategy, optional region name)
-#hibernate.ejb.classcache.org.hibernate.ejb.test.Item read-write, RegionName
-#hibernate.ejb.classcache.org.hibernate.ejb.test.Item read-write
-
-## collection caching (role, optional region name)
-#hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributors read-write, RegionName
-
-######################
-### Query Language ###
-######################
-
-## define query language constants / function names
-
-hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
-
-
-## select the classic query parser
-
-#hibernate.query.factory_class org.hibernate.hql.classic.ClassicQueryTranslatorFactory
-
-
-
-#################
-### Platforms ###
-#################
-
-## JNDI Datasource
-
-#hibernate.connection.datasource jdbc/test
-#hibernate.connection.username db2
-#hibernate.connection.password db2
-
-
-## HypersonicSQL
-
-hibernate.dialect org.hibernate.dialect.HSQLDialect
-hibernate.connection.driver_class org.hsqldb.jdbcDriver
-hibernate.connection.username sa
-hibernate.connection.password
-hibernate.connection.url jdbc:hsqldb:hsql://localhost
-hibernate.connection.url jdbc:hsqldb:test
-hibernate.connection.url jdbc:hsqldb:.
-
-
-## MySQL
-
-#hibernate.dialect org.hibernate.dialect.MySQLDialect
-#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
-#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
-#hibernate.connection.driver_class org.gjt.mm.mysql.Driver
-#hibernate.connection.driver_class com.mysql.jdbc.Driver
-#hibernate.connection.url jdbc:mysql:///test
-#hibernate.connection.username emmanuel
-#hibernate.connection.password
-
-
-## Oracle
-
-#hibernate.dialect org.hibernate.dialect.OracleDialect
-#hibernate.dialect org.hibernate.dialect.Oracle9Dialect
-#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
-#hibernate.connection.username ora
-#hibernate.connection.password ora
-#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:test
-
-
-## PostgreSQL
-
-#hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
-#hibernate.connection.driver_class org.postgresql.Driver
-#hibernate.connection.url jdbc:postgresql:annotations
-#hibernate.connection.username postgres
-#hibernate.connection.password hibernate
-#hibernate.query.substitutions yes 'Y', no 'N'
-
-
-## DB2
-
-#hibernate.dialect org.hibernate.dialect.DB2Dialect
-#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
-#hibernate.connection.url jdbc:db2:test
-#hibernate.connection.username db2
-#hibernate.connection.password db2
-
-## TimesTen (not supported yet)
-
-#hibernate.dialect org.hibernate.dialect.TimesTenDialect
-#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
-#hibernate.connection.url jdbc:timesten:direct:test
-#hibernate.connection.username
-#hibernate.connection.password
-
-## DB2/400
-
-#hibernate.dialect org.hibernate.dialect.DB2400Dialect
-#hibernate.connection.username user
-#hibernate.connection.password password
-
-## Native driver
-#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
-#hibernate.connection.url jdbc:db2://systemname
-
-## Toolbox driver
-#hibernate.connection.driver_class com.ibm.as400.access.AS400JDBCDriver
-#hibernate.connection.url jdbc:as400://systemname
-
-
-## Derby (Not supported!)
-
-#hibernate.dialect org.hibernate.dialect.DerbyDialect
-#hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver
-#hibernate.connection.username
-#hibernate.connection.password
-#hibernate.connection.url jdbc:derby:/test;create=true
-
-
-## Sybase
-
-#hibernate.dialect org.hibernate.dialect.SybaseDialect
-#hibernate.connection.driver_class com.sybase.jdbc2.jdbc.SybDriver
-#hibernate.connection.username sa
-#hibernate.connection.password sasasa
-#hibernate.connection.url jdbc:sybase:Tds:co3061835-a:5000/tempdb
-
-
-## Mckoi SQL
-
-#hibernate.dialect org.hibernate.dialect.MckoiDialect
-#hibernate.connection.driver_class com.mckoi.JDBCDriver
-#hibernate.connection.url jdbc:mckoi:///
-#hibernate.connection.url jdbc:mckoi:local://C:/mckoi1.00/db.conf
-#hibernate.connection.username admin
-#hibernate.connection.password nimda
-
-
-## SAP DB
-
-#hibernate.dialect org.hibernate.dialect.SAPDBDialect
-#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
-#hibernate.connection.url jdbc:sapdb://localhost/TST
-#hibernate.connection.username TEST
-#hibernate.connection.password TEST
-#hibernate.query.substitutions yes 'Y', no 'N'
-
-
-## MS SQL Server
-
-#hibernate.dialect org.hibernate.dialect.SQLServerDialect
-#hibernate.connection.username sa
-#hibernate.connection.password sa
-
-## JSQL Driver
-#hibernate.connection.driver_class com.jnetdirect.jsql.JSQLDriver
-#hibernate.connection.url jdbc:JSQLConnect://1E1/test
-
-## JTURBO Driver
-#hibernate.connection.driver_class com.newatlanta.jturbo.driver.Driver
-#hibernate.connection.url jdbc:JTurbo://1E1:1433/test
-
-## WebLogic Driver
-#hibernate.connection.driver_class weblogic.jdbc.mssqlserver4.Driver
-#hibernate.connection.url jdbc:weblogic:mssqlserver4:1E1:1433
-
-## Microsoft Driver (not recommended!)
-#hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
-#hibernate.connection.url jdbc:microsoft:sqlserver://1E1;DatabaseName=test;SelectMethod=cursor
-
-## jTDS (since version 0.9)
-#hibernate.connection.driver_class net.sourceforge.jtds.jdbc.Driver
-#hibernate.connection.url jdbc:jtds:sqlserver://1E1/test
-
-## Interbase
-
-#hibernate.dialect org.hibernate.dialect.InterbaseDialect
-#hibernate.connection.username sysdba
-#hibernate.connection.password masterkey
-
-## DO NOT specify hibernate.connection.sqlDialect
-
-## InterClient
-
-#hibernate.connection.driver_class interbase.interclient.Driver
-#hibernate.connection.url jdbc:interbase://localhost:3060/C:/firebird/test.gdb
-
-## Pure Java
-
-#hibernate.connection.driver_class org.firebirdsql.jdbc.FBDriver
-#hibernate.connection.url jdbc:firebirdsql:localhost/3050:/firebird/test.gdb
-
-
-## Pointbase
-
-#hibernate.dialect org.hibernate.dialect.PointbaseDialect
-#hibernate.connection.driver_class com.pointbase.jdbc.jdbcUniversalDriver
-#hibernate.connection.url jdbc:pointbase:embedded:sample
-#hibernate.connection.username PBPUBLIC
-#hibernate.connection.password PBPUBLIC
-
-
-
-#################################
-### Hibernate Connection Pool ###
-#################################
-
-hibernate.connection.pool_size 1
-
-
-
-###########################
-### C3P0 Connection Pool###
-###########################
-
-#hibernate.c3p0.max_size 2
-#hibernate.c3p0.min_size 2
-#hibernate.c3p0.timeout 5000
-#hibernate.c3p0.max_statements 100
-#hibernate.c3p0.idle_test_period 3000
-#hibernate.c3p0.acquire_increment 2
-#hibernate.c3p0.validate false
-
-
-
-##############################
-### Proxool Connection Pool###
-##############################
-
-## Properties for external configuration of Proxool
-
-hibernate.proxool.pool_alias pool1
-
-## Only need one of the following
-
-#hibernate.proxool.existing_pool true
-#hibernate.proxool.xml proxool.xml
-#hibernate.proxool.properties proxool.properties
-
-
-
-#################################
-### Plugin ConnectionProvider ###
-#################################
-
-## use a custom ConnectionProvider (if not set, Hibernate will choose a built-in ConnectionProvider using hueristics)
-
-#hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.ProxoolConnectionProvider
-
-
-
-#######################
-### Transaction API ###
-#######################
-
-## Enable automatic flush during the JTA beforeCompletion() callback
-## (This setting is relevant with or without the Transaction API)
-
-#hibernate.transaction.flush_before_completion
-
-
-## Enable automatic session close at the end of transaction
-## (This setting is relevant with or without the Transaction API)
-
-#hibernate.transaction.auto_close_session
-
-
-## the Transaction API abstracts application code from the underlying JTA or JDBC transactions
-
-#hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
-#hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
-
-
-## to use JTATransactionFactory, Hibernate must be able to locate the UserTransaction in JNDI
-## default is java:comp/UserTransaction
-## you do NOT need this setting if you specify hibernate.transaction.manager_lookup_class
-
-#jta.UserTransaction jta/usertransaction
-#jta.UserTransaction javax.transaction.UserTransaction
-#jta.UserTransaction UserTransaction
-
-
-## to use the second-level cache with JTA, Hibernate must be able to obtain the JTA TransactionManager
-
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.JBossTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WeblogicTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WebSphereTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.OrionTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.ResinTransactionManagerLookup
-
-
-
-##############################
-### Miscellaneous Settings ###
-##############################
-
-## print all generated SQL to the console
-
-#hibernate.show_sql true
-
-
-## add comments to the generated SQL
-
-#hibernate.use_sql_comments true
-
-
-## generate statistics
-
-#hibernate.generate_statistics true
-
-
-## auto schema export
-
-hibernate.hbm2ddl.auto create-drop
-#hibernate.hbm2ddl.auto create
-#hibernate.hbm2ddl.auto update
-
-
-## specify a default schema and catalog for unqualified tablenames
-
-#hibernate.default_schema test
-#hibernate.default_catalog test
-
-
-## enable ordering of SQL UPDATEs by primary key
-
-hibernate.order_updates true
-
-
-## set the maximum depth of the outer join fetch tree
-
-hibernate.max_fetch_depth 1
-
-
-## set the default batch size for batch fetching
-
-hibernate.default_batch_fetch_size 8
-
-
-## rollback generated identifier values of deleted entities to default values
-
-#hibernate.use_identifer_rollback true
-
-
-## enable CGLIB reflection optimizer (enabled by default)
-
-#hibernate.cglib.use_reflection_optimizer false
-
-
-
-#####################
-### JDBC Settings ###
-#####################
-
-## specify a JDBC isolation level
-
-#hibernate.connection.isolation 4
-
-
-## enable JDBC autocommit (not recommended!)
-
-#hibernate.connection.autocommit true
-
-
-## set the JDBC fetch size
-
-#hibernate.jdbc.fetch_size 25
-
-
-## set the maximum JDBC 2 batch size (a nonzero value enables batching)
-
-#hibernate.jdbc.batch_size 5
-
-
-## enable batch updates even for versioned data
-
-hibernate.jdbc.batch_versioned_data true
-
-
-## enable use of JDBC 2 scrollable ResultSets (specifying a Dialect will cause Hibernate to use a sensible default)
-
-#hibernate.jdbc.use_scrollable_resultset true
-
-
-## use streams when writing binary types to / from JDBC
-
-hibernate.jdbc.use_streams_for_binary true
-
-
-## use JDBC 3 PreparedStatement.getGeneratedKeys() to get the identifier of an inserted row
-
-#hibernate.jdbc.use_get_generated_keys false
-
-
-## choose a custom JDBC batcher
-
-# hibernate.jdbc.factory_class
-
-
-## enable JDBC result set column alias caching
-## (minor performance enhancement for broken JDBC drivers)
-
-# hibernate.jdbc.wrap_result_sets
-
-
-## choose a custom SQL exception converter
-
-#hibernate.jdbc.sql_exception_converter
-
-
-
-##########################
-### Second-level Cache ###
-##########################
-
-## optimize chache for minimal "puts" instead of minimal "gets" (good for clustered cache)
-
-#hibernate.cache.use_minimal_puts true
-
-
-## set a prefix for cache region names
-
-hibernate.cache.region_prefix hibernate.test
-
-
-## disable the second-level cache
-
-#hibernate.cache.use_second_level_cache false
-
-
-## enable the query cache
-
-#hibernate.cache.use_query_cache true
-
-
-## store the second-level cache entries in a more human-friendly format
-
-#hibernate.cache.use_structured_entries true
-
-
-## choose a cache implementation
-
-#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
-hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
-
-
-## choose a custom query cache implementation
-
-#hibernate.cache.query_cache_factory
-
-
-
-############
-### JNDI ###
-############
-
-## specify a JNDI name for the SessionFactory
-
-#hibernate.session_factory_name hibernate/session_factory
-
-
-## Hibernate uses JNDI to bind a name to a SessionFactory and to look up the JTA UserTransaction;
-## if hibernate.jndi.* are not specified, Hibernate will use the default InitialContext() which
-## is the best approach in an application server
-
-#file system
-#hibernate.jndi.class com.sun.jndi.fscontext.RefFSContextFactory
-#hibernate.jndi.url file:/
-
-#WebSphere
-#hibernate.jndi.class com.ibm.websphere.naming.WsnInitialContextFactory
-#hibernate.jndi.url iiop://localhost:900/
-
Copied: trunk/HibernateExt/entitymanager/src/test/hibernate.properties (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/hibernate.properties)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/hibernate.properties (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/hibernate.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,491 @@
+###############
+### EJB 3.0 ###
+###############
+
+## select Hibernate persistence provider
+
+javax.persistence.provider org.hibernate.ejb.HibernatePersistence
+javax.persistence.transactionType=RESOURCE_LOCAL
+
+## entity bean class name (comma separated)
+
+#hibernate.ejb.classes org.hibernate.ejb.test.Item, org.hibernate.ejb.test.Distributor
+
+## entity caching (strategy, optional region name)
+#hibernate.ejb.classcache.org.hibernate.ejb.test.Item read-write, RegionName
+#hibernate.ejb.classcache.org.hibernate.ejb.test.Item read-write
+
+## collection caching (role, optional region name)
+#hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributors read-write, RegionName
+
+######################
+### Query Language ###
+######################
+
+## define query language constants / function names
+
+hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
+
+
+## select the classic query parser
+
+#hibernate.query.factory_class org.hibernate.hql.classic.ClassicQueryTranslatorFactory
+
+
+
+#################
+### Platforms ###
+#################
+
+## JNDI Datasource
+
+#hibernate.connection.datasource jdbc/test
+#hibernate.connection.username db2
+#hibernate.connection.password db2
+
+
+## HypersonicSQL
+
+hibernate.dialect org.hibernate.dialect.HSQLDialect
+hibernate.connection.driver_class org.hsqldb.jdbcDriver
+hibernate.connection.username sa
+hibernate.connection.password
+hibernate.connection.url jdbc:hsqldb:hsql://localhost
+hibernate.connection.url jdbc:hsqldb:test
+hibernate.connection.url jdbc:hsqldb:.
+
+
+## MySQL
+
+#hibernate.dialect org.hibernate.dialect.MySQLDialect
+#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
+#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
+#hibernate.connection.driver_class org.gjt.mm.mysql.Driver
+#hibernate.connection.driver_class com.mysql.jdbc.Driver
+#hibernate.connection.url jdbc:mysql:///test
+#hibernate.connection.username emmanuel
+#hibernate.connection.password
+
+
+## Oracle
+
+#hibernate.dialect org.hibernate.dialect.OracleDialect
+#hibernate.dialect org.hibernate.dialect.Oracle9Dialect
+#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
+#hibernate.connection.username ora
+#hibernate.connection.password ora
+#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:test
+
+
+## PostgreSQL
+
+#hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
+#hibernate.connection.driver_class org.postgresql.Driver
+#hibernate.connection.url jdbc:postgresql:annotations
+#hibernate.connection.username postgres
+#hibernate.connection.password hibernate
+#hibernate.query.substitutions yes 'Y', no 'N'
+
+
+## DB2
+
+#hibernate.dialect org.hibernate.dialect.DB2Dialect
+#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
+#hibernate.connection.url jdbc:db2:test
+#hibernate.connection.username db2
+#hibernate.connection.password db2
+
+## TimesTen (not supported yet)
+
+#hibernate.dialect org.hibernate.dialect.TimesTenDialect
+#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
+#hibernate.connection.url jdbc:timesten:direct:test
+#hibernate.connection.username
+#hibernate.connection.password
+
+## DB2/400
+
+#hibernate.dialect org.hibernate.dialect.DB2400Dialect
+#hibernate.connection.username user
+#hibernate.connection.password password
+
+## Native driver
+#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
+#hibernate.connection.url jdbc:db2://systemname
+
+## Toolbox driver
+#hibernate.connection.driver_class com.ibm.as400.access.AS400JDBCDriver
+#hibernate.connection.url jdbc:as400://systemname
+
+
+## Derby (Not supported!)
+
+#hibernate.dialect org.hibernate.dialect.DerbyDialect
+#hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver
+#hibernate.connection.username
+#hibernate.connection.password
+#hibernate.connection.url jdbc:derby:/test;create=true
+
+
+## Sybase
+
+#hibernate.dialect org.hibernate.dialect.SybaseDialect
+#hibernate.connection.driver_class com.sybase.jdbc2.jdbc.SybDriver
+#hibernate.connection.username sa
+#hibernate.connection.password sasasa
+#hibernate.connection.url jdbc:sybase:Tds:co3061835-a:5000/tempdb
+
+
+## Mckoi SQL
+
+#hibernate.dialect org.hibernate.dialect.MckoiDialect
+#hibernate.connection.driver_class com.mckoi.JDBCDriver
+#hibernate.connection.url jdbc:mckoi:///
+#hibernate.connection.url jdbc:mckoi:local://C:/mckoi1.00/db.conf
+#hibernate.connection.username admin
+#hibernate.connection.password nimda
+
+
+## SAP DB
+
+#hibernate.dialect org.hibernate.dialect.SAPDBDialect
+#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
+#hibernate.connection.url jdbc:sapdb://localhost/TST
+#hibernate.connection.username TEST
+#hibernate.connection.password TEST
+#hibernate.query.substitutions yes 'Y', no 'N'
+
+
+## MS SQL Server
+
+#hibernate.dialect org.hibernate.dialect.SQLServerDialect
+#hibernate.connection.username sa
+#hibernate.connection.password sa
+
+## JSQL Driver
+#hibernate.connection.driver_class com.jnetdirect.jsql.JSQLDriver
+#hibernate.connection.url jdbc:JSQLConnect://1E1/test
+
+## JTURBO Driver
+#hibernate.connection.driver_class com.newatlanta.jturbo.driver.Driver
+#hibernate.connection.url jdbc:JTurbo://1E1:1433/test
+
+## WebLogic Driver
+#hibernate.connection.driver_class weblogic.jdbc.mssqlserver4.Driver
+#hibernate.connection.url jdbc:weblogic:mssqlserver4:1E1:1433
+
+## Microsoft Driver (not recommended!)
+#hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
+#hibernate.connection.url jdbc:microsoft:sqlserver://1E1;DatabaseName=test;SelectMethod=cursor
+
+## jTDS (since version 0.9)
+#hibernate.connection.driver_class net.sourceforge.jtds.jdbc.Driver
+#hibernate.connection.url jdbc:jtds:sqlserver://1E1/test
+
+## Interbase
+
+#hibernate.dialect org.hibernate.dialect.InterbaseDialect
+#hibernate.connection.username sysdba
+#hibernate.connection.password masterkey
+
+## DO NOT specify hibernate.connection.sqlDialect
+
+## InterClient
+
+#hibernate.connection.driver_class interbase.interclient.Driver
+#hibernate.connection.url jdbc:interbase://localhost:3060/C:/firebird/test.gdb
+
+## Pure Java
+
+#hibernate.connection.driver_class org.firebirdsql.jdbc.FBDriver
+#hibernate.connection.url jdbc:firebirdsql:localhost/3050:/firebird/test.gdb
+
+
+## Pointbase
+
+#hibernate.dialect org.hibernate.dialect.PointbaseDialect
+#hibernate.connection.driver_class com.pointbase.jdbc.jdbcUniversalDriver
+#hibernate.connection.url jdbc:pointbase:embedded:sample
+#hibernate.connection.username PBPUBLIC
+#hibernate.connection.password PBPUBLIC
+
+
+
+#################################
+### Hibernate Connection Pool ###
+#################################
+
+hibernate.connection.pool_size 1
+
+
+
+###########################
+### C3P0 Connection Pool###
+###########################
+
+#hibernate.c3p0.max_size 2
+#hibernate.c3p0.min_size 2
+#hibernate.c3p0.timeout 5000
+#hibernate.c3p0.max_statements 100
+#hibernate.c3p0.idle_test_period 3000
+#hibernate.c3p0.acquire_increment 2
+#hibernate.c3p0.validate false
+
+
+
+##############################
+### Proxool Connection Pool###
+##############################
+
+## Properties for external configuration of Proxool
+
+hibernate.proxool.pool_alias pool1
+
+## Only need one of the following
+
+#hibernate.proxool.existing_pool true
+#hibernate.proxool.xml proxool.xml
+#hibernate.proxool.properties proxool.properties
+
+
+
+#################################
+### Plugin ConnectionProvider ###
+#################################
+
+## use a custom ConnectionProvider (if not set, Hibernate will choose a built-in ConnectionProvider using hueristics)
+
+#hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.ProxoolConnectionProvider
+
+
+
+#######################
+### Transaction API ###
+#######################
+
+## Enable automatic flush during the JTA beforeCompletion() callback
+## (This setting is relevant with or without the Transaction API)
+
+#hibernate.transaction.flush_before_completion
+
+
+## Enable automatic session close at the end of transaction
+## (This setting is relevant with or without the Transaction API)
+
+#hibernate.transaction.auto_close_session
+
+
+## the Transaction API abstracts application code from the underlying JTA or JDBC transactions
+
+#hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
+#hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
+
+
+## to use JTATransactionFactory, Hibernate must be able to locate the UserTransaction in JNDI
+## default is java:comp/UserTransaction
+## you do NOT need this setting if you specify hibernate.transaction.manager_lookup_class
+
+#jta.UserTransaction jta/usertransaction
+#jta.UserTransaction javax.transaction.UserTransaction
+#jta.UserTransaction UserTransaction
+
+
+## to use the second-level cache with JTA, Hibernate must be able to obtain the JTA TransactionManager
+
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.JBossTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WeblogicTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WebSphereTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.OrionTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.ResinTransactionManagerLookup
+
+
+
+##############################
+### Miscellaneous Settings ###
+##############################
+
+## print all generated SQL to the console
+
+#hibernate.show_sql true
+
+
+## add comments to the generated SQL
+
+#hibernate.use_sql_comments true
+
+
+## generate statistics
+
+#hibernate.generate_statistics true
+
+
+## auto schema export
+
+hibernate.hbm2ddl.auto create-drop
+#hibernate.hbm2ddl.auto create
+#hibernate.hbm2ddl.auto update
+
+
+## specify a default schema and catalog for unqualified tablenames
+
+#hibernate.default_schema test
+#hibernate.default_catalog test
+
+
+## enable ordering of SQL UPDATEs by primary key
+
+hibernate.order_updates true
+
+
+## set the maximum depth of the outer join fetch tree
+
+hibernate.max_fetch_depth 1
+
+
+## set the default batch size for batch fetching
+
+hibernate.default_batch_fetch_size 8
+
+
+## rollback generated identifier values of deleted entities to default values
+
+#hibernate.use_identifer_rollback true
+
+
+## enable CGLIB reflection optimizer (enabled by default)
+
+#hibernate.cglib.use_reflection_optimizer false
+
+
+
+#####################
+### JDBC Settings ###
+#####################
+
+## specify a JDBC isolation level
+
+#hibernate.connection.isolation 4
+
+
+## enable JDBC autocommit (not recommended!)
+
+#hibernate.connection.autocommit true
+
+
+## set the JDBC fetch size
+
+#hibernate.jdbc.fetch_size 25
+
+
+## set the maximum JDBC 2 batch size (a nonzero value enables batching)
+
+#hibernate.jdbc.batch_size 5
+
+
+## enable batch updates even for versioned data
+
+hibernate.jdbc.batch_versioned_data true
+
+
+## enable use of JDBC 2 scrollable ResultSets (specifying a Dialect will cause Hibernate to use a sensible default)
+
+#hibernate.jdbc.use_scrollable_resultset true
+
+
+## use streams when writing binary types to / from JDBC
+
+hibernate.jdbc.use_streams_for_binary true
+
+
+## use JDBC 3 PreparedStatement.getGeneratedKeys() to get the identifier of an inserted row
+
+#hibernate.jdbc.use_get_generated_keys false
+
+
+## choose a custom JDBC batcher
+
+# hibernate.jdbc.factory_class
+
+
+## enable JDBC result set column alias caching
+## (minor performance enhancement for broken JDBC drivers)
+
+# hibernate.jdbc.wrap_result_sets
+
+
+## choose a custom SQL exception converter
+
+#hibernate.jdbc.sql_exception_converter
+
+
+
+##########################
+### Second-level Cache ###
+##########################
+
+## optimize chache for minimal "puts" instead of minimal "gets" (good for clustered cache)
+
+#hibernate.cache.use_minimal_puts true
+
+
+## set a prefix for cache region names
+
+hibernate.cache.region_prefix hibernate.test
+
+
+## disable the second-level cache
+
+#hibernate.cache.use_second_level_cache false
+
+
+## enable the query cache
+
+#hibernate.cache.use_query_cache true
+
+
+## store the second-level cache entries in a more human-friendly format
+
+#hibernate.cache.use_structured_entries true
+
+
+## choose a cache implementation
+
+#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
+hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
+
+
+## choose a custom query cache implementation
+
+#hibernate.cache.query_cache_factory
+
+
+
+############
+### JNDI ###
+############
+
+## specify a JNDI name for the SessionFactory
+
+#hibernate.session_factory_name hibernate/session_factory
+
+
+## Hibernate uses JNDI to bind a name to a SessionFactory and to look up the JTA UserTransaction;
+## if hibernate.jndi.* are not specified, Hibernate will use the default InitialContext() which
+## is the best approach in an application server
+
+#file system
+#hibernate.jndi.class com.sun.jndi.fscontext.RefFSContextFactory
+#hibernate.jndi.url file:/
+
+#WebSphere
+#hibernate.jndi.class com.ibm.websphere.naming.WsnInitialContextFactory
+#hibernate.jndi.url iiop://localhost:900/
+
Deleted: trunk/HibernateExt/entitymanager/src/test/log4j.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/log4j.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/log4j.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,48 +0,0 @@
-### direct log messages to stdout ###
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
-
-### direct messages to file hibernate.log ###
-#log4j.appender.file=org.apache.log4j.FileAppender
-#log4j.appender.file.File=hibernate.log
-#log4j.appender.file.layout=org.apache.log4j.PatternLayout
-#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
-
-### set log levels - for more verbose logging change 'info' to 'debug' ###
-
-log4j.rootLogger=warn, stdout
-
-log4j.logger.org.hibernate=info
-#log4j.logger.org.hibernate=debug
-
-log4j.logger.org.hibernate.ejb=debug
-log4j.logger.org.hibernate.ejb.packaging=debug
-log4j.logger.org.hibernate.reflection=debug
-
-#log4j.logger.org.hibernate.engine.Cascades=debug
-#log4j.logger.org.hibernate.hql=debug
-
-### log just the SQL
-log4j.logger.org.hibernate.SQL=debug
-
-### log JDBC bind parameters ###
-#log4j.logger.org.hibernate.type=info
-log4j.logger.org.hibernate.type=debug
-
-### log schema export/update ###
-log4j.logger.org.hibernate.tool.hbm2ddl=debug
-
-### log HQL parse trees
-#log4j.logger.org.hibernate.hql=debug
-
-### log cache activity ###
-#log4j.logger.org.hibernate.cache=debug
-
-### log JDBC resource acquisition
-#log4j.logger.org.hibernate.jdbc=debug
-
-### enable the following line if you want to track down connection ###
-### leakages when using DriverManagerConnectionProvider ###
-#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
Copied: trunk/HibernateExt/entitymanager/src/test/log4j.properties (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/log4j.properties)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/log4j.properties (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/log4j.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,48 @@
+### direct log messages to stdout ###
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+
+### direct messages to file hibernate.log ###
+#log4j.appender.file=org.apache.log4j.FileAppender
+#log4j.appender.file.File=hibernate.log
+#log4j.appender.file.layout=org.apache.log4j.PatternLayout
+#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+
+### set log levels - for more verbose logging change 'info' to 'debug' ###
+
+log4j.rootLogger=warn, stdout
+
+log4j.logger.org.hibernate=info
+#log4j.logger.org.hibernate=debug
+
+log4j.logger.org.hibernate.ejb=debug
+log4j.logger.org.hibernate.ejb.packaging=debug
+log4j.logger.org.hibernate.reflection=debug
+
+#log4j.logger.org.hibernate.engine.Cascades=debug
+#log4j.logger.org.hibernate.hql=debug
+
+### log just the SQL
+log4j.logger.org.hibernate.SQL=debug
+
+### log JDBC bind parameters ###
+#log4j.logger.org.hibernate.type=info
+log4j.logger.org.hibernate.type=debug
+
+### log schema export/update ###
+log4j.logger.org.hibernate.tool.hbm2ddl=debug
+
+### log HQL parse trees
+#log4j.logger.org.hibernate.hql=debug
+
+### log cache activity ###
+#log4j.logger.org.hibernate.cache=debug
+
+### log JDBC resource acquisition
+#log4j.logger.org.hibernate.jdbc=debug
+
+### enable the following line if you want to track down connection ###
+### leakages when using DriverManagerConnectionProvider ###
+#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
Copied: trunk/HibernateExt/entitymanager/src/test/org (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org)
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate)
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb)
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Cat.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Cat.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Cat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,139 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Calendar;
-import java.util.Collections;
-import java.util.Date;
-import java.util.GregorianCalendar;
-import java.util.List;
-import javax.persistence.Basic;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.PostLoad;
-import javax.persistence.PostPersist;
-import javax.persistence.PostUpdate;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-import javax.persistence.Transient;
-
-import org.hibernate.validator.Length;
-import org.hibernate.validator.Min;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at EntityListeners(LastUpdateListener.class)
-public class Cat implements Serializable {
- private Integer id;
- private String name;
- private Date dateOfBirth;
- private int age;
- private long length;
- private Date lastUpdate;
- private int manualVersion = 0;
- private int postVersion = 0;
- private static final List ids = new ArrayList();
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Length(min = 4)
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Date getDateOfBirth() {
- return dateOfBirth;
- }
-
- public void setDateOfBirth(Date dateOfBirth) {
- this.dateOfBirth = dateOfBirth;
- }
-
- public int getManualVersion() {
- return manualVersion;
- }
-
- public void setManualVersion(int manualVersion) {
- this.manualVersion = manualVersion;
- }
-
- @Transient
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- @Basic
- @Temporal(TemporalType.TIMESTAMP)
- public Date getLastUpdate() {
- return lastUpdate;
- }
-
- public void setLastUpdate(Date lastUpdate) {
- this.lastUpdate = lastUpdate;
- }
-
- public int getPostVersion() {
- return postVersion;
- }
-
- public void setPostVersion(int postVersion) {
- this.postVersion = postVersion;
- }
-
- @PostUpdate
- private void someLateUpdateWorking() {
- this.postVersion++;
- }
-
- @PostLoad
- public void calculateAge() {
- Calendar birth = new GregorianCalendar();
- birth.setTime( dateOfBirth );
- Calendar now = new GregorianCalendar();
- now.setTime( new Date() );
- int adjust = 0;
- if ( now.get( Calendar.DAY_OF_YEAR ) - birth.get( Calendar.DAY_OF_YEAR ) < 0 ) {
- adjust = -1;
- }
- age = now.get( Calendar.YEAR ) - birth.get( Calendar.YEAR ) + adjust;
- }
-
- @PostPersist
- public synchronized void addIdsToList() {
- ids.add( getId() );
- }
-
- public static synchronized List getIdList() {
- return Collections.unmodifiableList( ids );
- }
-
- @Min(0)
- public long getLength() {
- return length;
- }
-
- public void setLength(long length) {
- this.length = length;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Cat.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Cat.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Cat.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Cat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,139 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Collections;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.List;
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.PostLoad;
+import javax.persistence.PostPersist;
+import javax.persistence.PostUpdate;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+import javax.persistence.Transient;
+
+import org.hibernate.validator.Length;
+import org.hibernate.validator.Min;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at EntityListeners(LastUpdateListener.class)
+public class Cat implements Serializable {
+ private Integer id;
+ private String name;
+ private Date dateOfBirth;
+ private int age;
+ private long length;
+ private Date lastUpdate;
+ private int manualVersion = 0;
+ private int postVersion = 0;
+ private static final List ids = new ArrayList();
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Length(min = 4)
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Date getDateOfBirth() {
+ return dateOfBirth;
+ }
+
+ public void setDateOfBirth(Date dateOfBirth) {
+ this.dateOfBirth = dateOfBirth;
+ }
+
+ public int getManualVersion() {
+ return manualVersion;
+ }
+
+ public void setManualVersion(int manualVersion) {
+ this.manualVersion = manualVersion;
+ }
+
+ @Transient
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ @Basic
+ @Temporal(TemporalType.TIMESTAMP)
+ public Date getLastUpdate() {
+ return lastUpdate;
+ }
+
+ public void setLastUpdate(Date lastUpdate) {
+ this.lastUpdate = lastUpdate;
+ }
+
+ public int getPostVersion() {
+ return postVersion;
+ }
+
+ public void setPostVersion(int postVersion) {
+ this.postVersion = postVersion;
+ }
+
+ @PostUpdate
+ private void someLateUpdateWorking() {
+ this.postVersion++;
+ }
+
+ @PostLoad
+ public void calculateAge() {
+ Calendar birth = new GregorianCalendar();
+ birth.setTime( dateOfBirth );
+ Calendar now = new GregorianCalendar();
+ now.setTime( new Date() );
+ int adjust = 0;
+ if ( now.get( Calendar.DAY_OF_YEAR ) - birth.get( Calendar.DAY_OF_YEAR ) < 0 ) {
+ adjust = -1;
+ }
+ age = now.get( Calendar.YEAR ) - birth.get( Calendar.YEAR ) + adjust;
+ }
+
+ @PostPersist
+ public synchronized void addIdsToList() {
+ ids.add( getId() );
+ }
+
+ public static synchronized List getIdList() {
+ return Collections.unmodifiableList( ids );
+ }
+
+ @Min(0)
+ public long getLength() {
+ return length;
+ }
+
+ public void setLength(long length) {
+ this.length = length;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Distributor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Distributor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Distributor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Distributor implements Serializable {
- private Integer id;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Distributor ) ) return false;
-
- final Distributor distributor = (Distributor) o;
-
- if ( !name.equals( distributor.name ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return name.hashCode();
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Distributor.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Distributor.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Distributor.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Distributor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Distributor implements Serializable {
+ private Integer id;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Distributor ) ) return false;
+
+ final Distributor distributor = (Distributor) o;
+
+ if ( !name.equals( distributor.name ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EJB3TestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EJB3TestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EJB3TestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,219 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import java.sql.Blob;
-import java.sql.Clob;
-import java.util.Iterator;
-import java.util.Properties;
-
-import org.hibernate.HibernateException;
-import org.hibernate.Interceptor;
-import org.hibernate.SessionFactory;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.dialect.Dialect;
-import org.hibernate.ejb.event.EJB3AutoFlushEventListener;
-import org.hibernate.ejb.event.EJB3FlushEventListener;
-import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.event.AutoFlushEventListener;
-import org.hibernate.mapping.Collection;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.SimpleValue;
-
-/**
- * @author Gavin King
- */
-public abstract class EJB3TestCase extends junit.framework.TestCase {
- private static SessionFactory sessions;
- private static Configuration cfg;
- private static Dialect dialect;
- private static Class lastTestClass;
- private org.hibernate.classic.Session session;
-
- protected boolean recreateSchema() {
- return true;
- }
-
- public EJB3TestCase(String x) {
- super( x );
- }
-
- private void buildSessionFactory(String[] files) throws Exception {
-
- if ( getSessions() != null ) getSessions().close();
-
- try {
-
- setCfg( new Configuration() );
-
- cfg.addProperties( getExtraProperties() );
-
- if ( recreateSchema() ) {
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- }
-
- for ( int i = 0; i < files.length ; i++ ) {
- if ( !files[i].startsWith( "net/" ) ) files[i] = getBaseForMappings() + files[i];
- getCfg().addResource( files[i], TestCase.class.getClassLoader() );
- }
-
- setDialect( Dialect.getDialect() );
-
- configure( cfg );
-
- if ( getCacheConcurrencyStrategy() != null ) {
-
- Iterator iter = cfg.getClassMappings();
- while ( iter.hasNext() ) {
- PersistentClass clazz = (PersistentClass) iter.next();
- Iterator props = clazz.getPropertyClosureIterator();
- boolean hasLob = false;
- while ( props.hasNext() ) {
- Property prop = (Property) props.next();
- if ( prop.getValue().isSimpleValue() ) {
- String type = ( (SimpleValue) prop.getValue() ).getTypeName();
- if ( "blob".equals( type ) || "clob".equals( type ) ) hasLob = true;
- if ( Blob.class.getName().equals( type ) || Clob.class.getName().equals( type ) ) {
- hasLob = true;
- }
- }
- }
- if ( !hasLob && !clazz.isInherited() ) {
- cfg.setCacheConcurrencyStrategy(
- clazz.getEntityName(),
- getCacheConcurrencyStrategy()
- );
- }
- }
-
- iter = cfg.getCollectionMappings();
- while ( iter.hasNext() ) {
- Collection coll = (Collection) iter.next();
- cfg.setCollectionCacheConcurrencyStrategy(
- coll.getRole(),
- getCacheConcurrencyStrategy()
- );
- }
-
- }
-
- setSessions( getCfg().buildSessionFactory( /*new TestInterceptor()*/ ) );
-
- }
- catch (Exception e) {
- e.printStackTrace();
- throw e;
- }
-
- }
-
- public String getCacheConcurrencyStrategy() {
- return "nonstrict-read-write";
- }
-
- protected void setUp() throws Exception {
- if ( getSessions() == null || lastTestClass != getClass() ) {
- buildSessionFactory( getMappings() );
- lastTestClass = getClass();
- }
- }
-
- protected void runTest() throws Throwable {
- final boolean stats = ( (SessionFactoryImplementor) sessions ).getStatistics().isStatisticsEnabled();
- try {
- if ( stats ) sessions.getStatistics().clear();
-
- super.runTest();
-
- if ( stats ) sessions.getStatistics().logSummary();
-
- if ( session != null && session.isOpen() ) {
- if ( session.isConnected() ) session.connection().rollback();
- session.close();
- session = null;
- fail( "unclosed session" );
- }
- else {
- session = null;
- }
- }
- catch (Throwable e) {
- try {
- if ( session != null && session.isOpen() ) {
- if ( session.isConnected() ) session.connection().rollback();
- session.close();
- }
- }
- catch (Exception ignore) {
- }
- try {
- if ( dropAfterFailure() && sessions != null ) {
- sessions.close();
- sessions = null;
- }
- }
- catch (Exception ignore) {
- }
- throw e;
- }
- }
-
- protected boolean dropAfterFailure() {
- return true;
- }
-
- public org.hibernate.classic.Session openSession() throws HibernateException {
- session = getSessions().openSession();
- return session;
- }
-
- public org.hibernate.classic.Session openSession(Interceptor interceptor)
- throws HibernateException {
- session = getSessions().openSession( interceptor );
- return session;
- }
-
- protected abstract String[] getMappings();
-
- private void setSessions(SessionFactory sessions) {
- EJB3TestCase.sessions = sessions;
- }
-
- protected SessionFactory getSessions() {
- return sessions;
- }
-
- private void setDialect(Dialect dialect) {
- EJB3TestCase.dialect = dialect;
- }
-
- protected Dialect getDialect() {
- return dialect;
- }
-
- protected static void setCfg(Configuration cfg) {
- EJB3TestCase.cfg = cfg;
- }
-
- protected static Configuration getCfg() {
- return cfg;
- }
-
- /**
- * @deprecated
- */
- public Properties getExtraProperties() {
- return new Properties();
- }
-
- protected String getBaseForMappings() {
- return "org/hibernate/ejb/test/";
- }
-
- protected void configure(Configuration cfg) {
- cfg.setListener( "flush", EJB3FlushEventListener.INSTANCE );
- cfg.setListeners( "auto-flush", new AutoFlushEventListener[]{EJB3AutoFlushEventListener.INSTANCE} );
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EJB3TestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EJB3TestCase.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EJB3TestCase.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EJB3TestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,219 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import java.sql.Blob;
+import java.sql.Clob;
+import java.util.Iterator;
+import java.util.Properties;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Interceptor;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.ejb.event.EJB3AutoFlushEventListener;
+import org.hibernate.ejb.event.EJB3FlushEventListener;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.event.AutoFlushEventListener;
+import org.hibernate.mapping.Collection;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.SimpleValue;
+
+/**
+ * @author Gavin King
+ */
+public abstract class EJB3TestCase extends junit.framework.TestCase {
+ private static SessionFactory sessions;
+ private static Configuration cfg;
+ private static Dialect dialect;
+ private static Class lastTestClass;
+ private org.hibernate.classic.Session session;
+
+ protected boolean recreateSchema() {
+ return true;
+ }
+
+ public EJB3TestCase(String x) {
+ super( x );
+ }
+
+ private void buildSessionFactory(String[] files) throws Exception {
+
+ if ( getSessions() != null ) getSessions().close();
+
+ try {
+
+ setCfg( new Configuration() );
+
+ cfg.addProperties( getExtraProperties() );
+
+ if ( recreateSchema() ) {
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ }
+
+ for ( int i = 0; i < files.length ; i++ ) {
+ if ( !files[i].startsWith( "net/" ) ) files[i] = getBaseForMappings() + files[i];
+ getCfg().addResource( files[i], TestCase.class.getClassLoader() );
+ }
+
+ setDialect( Dialect.getDialect() );
+
+ configure( cfg );
+
+ if ( getCacheConcurrencyStrategy() != null ) {
+
+ Iterator iter = cfg.getClassMappings();
+ while ( iter.hasNext() ) {
+ PersistentClass clazz = (PersistentClass) iter.next();
+ Iterator props = clazz.getPropertyClosureIterator();
+ boolean hasLob = false;
+ while ( props.hasNext() ) {
+ Property prop = (Property) props.next();
+ if ( prop.getValue().isSimpleValue() ) {
+ String type = ( (SimpleValue) prop.getValue() ).getTypeName();
+ if ( "blob".equals( type ) || "clob".equals( type ) ) hasLob = true;
+ if ( Blob.class.getName().equals( type ) || Clob.class.getName().equals( type ) ) {
+ hasLob = true;
+ }
+ }
+ }
+ if ( !hasLob && !clazz.isInherited() ) {
+ cfg.setCacheConcurrencyStrategy(
+ clazz.getEntityName(),
+ getCacheConcurrencyStrategy()
+ );
+ }
+ }
+
+ iter = cfg.getCollectionMappings();
+ while ( iter.hasNext() ) {
+ Collection coll = (Collection) iter.next();
+ cfg.setCollectionCacheConcurrencyStrategy(
+ coll.getRole(),
+ getCacheConcurrencyStrategy()
+ );
+ }
+
+ }
+
+ setSessions( getCfg().buildSessionFactory( /*new TestInterceptor()*/ ) );
+
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+
+ }
+
+ public String getCacheConcurrencyStrategy() {
+ return "nonstrict-read-write";
+ }
+
+ protected void setUp() throws Exception {
+ if ( getSessions() == null || lastTestClass != getClass() ) {
+ buildSessionFactory( getMappings() );
+ lastTestClass = getClass();
+ }
+ }
+
+ protected void runTest() throws Throwable {
+ final boolean stats = ( (SessionFactoryImplementor) sessions ).getStatistics().isStatisticsEnabled();
+ try {
+ if ( stats ) sessions.getStatistics().clear();
+
+ super.runTest();
+
+ if ( stats ) sessions.getStatistics().logSummary();
+
+ if ( session != null && session.isOpen() ) {
+ if ( session.isConnected() ) session.connection().rollback();
+ session.close();
+ session = null;
+ fail( "unclosed session" );
+ }
+ else {
+ session = null;
+ }
+ }
+ catch (Throwable e) {
+ try {
+ if ( session != null && session.isOpen() ) {
+ if ( session.isConnected() ) session.connection().rollback();
+ session.close();
+ }
+ }
+ catch (Exception ignore) {
+ }
+ try {
+ if ( dropAfterFailure() && sessions != null ) {
+ sessions.close();
+ sessions = null;
+ }
+ }
+ catch (Exception ignore) {
+ }
+ throw e;
+ }
+ }
+
+ protected boolean dropAfterFailure() {
+ return true;
+ }
+
+ public org.hibernate.classic.Session openSession() throws HibernateException {
+ session = getSessions().openSession();
+ return session;
+ }
+
+ public org.hibernate.classic.Session openSession(Interceptor interceptor)
+ throws HibernateException {
+ session = getSessions().openSession( interceptor );
+ return session;
+ }
+
+ protected abstract String[] getMappings();
+
+ private void setSessions(SessionFactory sessions) {
+ EJB3TestCase.sessions = sessions;
+ }
+
+ protected SessionFactory getSessions() {
+ return sessions;
+ }
+
+ private void setDialect(Dialect dialect) {
+ EJB3TestCase.dialect = dialect;
+ }
+
+ protected Dialect getDialect() {
+ return dialect;
+ }
+
+ protected static void setCfg(Configuration cfg) {
+ EJB3TestCase.cfg = cfg;
+ }
+
+ protected static Configuration getCfg() {
+ return cfg;
+ }
+
+ /**
+ * @deprecated
+ */
+ public Properties getExtraProperties() {
+ return new Properties();
+ }
+
+ protected String getBaseForMappings() {
+ return "org/hibernate/ejb/test/";
+ }
+
+ protected void configure(Configuration cfg) {
+ cfg.setListener( "flush", EJB3FlushEventListener.INSTANCE );
+ cfg.setListeners( "auto-flush", new AutoFlushEventListener[]{EJB3AutoFlushEventListener.INSTANCE} );
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EntityManagerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EntityManagerTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EntityManagerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,336 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import javax.persistence.EntityManager;
-import javax.persistence.FlushModeType;
-import javax.persistence.Query;
-
-import org.hibernate.FlushMode;
-import org.hibernate.HibernateException;
-import org.hibernate.ejb.HibernateEntityManager;
-import org.hibernate.ejb.HibernateEntityManagerFactory;
-import org.hibernate.stat.Statistics;
-
-/**
- * @author Gavin King
- */
-public class EntityManagerTest extends TestCase {
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Item.class,
- Distributor.class,
- Wallet.class
- };
- }
-
- public Map<Class, String> getCachedClasses() {
- Map<Class, String> result = new HashMap<Class, String>();
- result.put( Item.class, "read-write" );
- return result;
- }
-
- public Map<String, String> getCachedCollections() {
- Map<String, String> result = new HashMap<String, String>();
- result.put( Item.class.getName() + ".distributors", "read-write, RegionName" );
- return result;
- }
-
- // EM TRANSACTION
-// public void testEntityManager() {
-//
-// Item item = new Item( "Mouse", "Micro$oft mouse" );
-//
-// EntityManager em = factory.createEntityManager();
-// em.getTransaction().begin();
-// em.persist( item );
-// assertTrue( em.contains( item ) );
-// em.getTransaction().commit();
-//
-// assertFalse( em.contains( item ) );
-//
-// em.getTransaction().begin();
-// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult();
-// assertNotNull( item );
-// assertEquals( "Micro$oft mouse", item.getDescr() );
-// item.setDescr( "Micro$oft wireless mouse" );
-// assertTrue( em.contains( item ) );
-// em.getTransaction().commit();
-//
-// assertFalse( em.contains( item ) );
-//
-// em.getTransaction().begin();
-// item = (Item) em.find( Item.class, "Mouse" );
-// assertNotNull( item );
-// em.getTransaction().commit();
-//
-// item = em.find( Item.class, "Mouse" );
-// assertFalse( em.contains( item ) );
-//
-// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult();
-// assertNotNull( item );
-// assertFalse( em.contains( item ) );
-//
-// em.getTransaction().begin();
-// item = em.find( Item.class, "Mouse" );
-// assertNotNull( item );
-// assertTrue( em.contains( item ) );
-// assertEquals( "Micro$oft wireless mouse", item.getDescr() );
-// em.remove( item );
-// em.remove( item );//second should be a no-op
-// em.getTransaction().commit();
-//
-// em.close();
-// }
-
- public void testExtendedEntityManager() {
-
- Item item = new Item( "Mouse", "Micro$oft mouse" );
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( item );
- assertTrue( em.contains( item ) );
- em.getTransaction().commit();
-
- assertTrue( em.contains( item ) );
-
- em.getTransaction().begin();
- Item item1 = (Item) em.createQuery( "select i from Item i where descr like 'M%'" ).getSingleResult();
- assertNotNull( item1 );
- assertSame( item, item1 );
- item.setDescr( "Micro$oft wireless mouse" );
- assertTrue( em.contains( item ) );
- em.getTransaction().commit();
-
- assertTrue( em.contains( item ) );
-
- em.getTransaction().begin();
- item1 = em.find( Item.class, "Mouse" );
- assertSame( item, item1 );
- em.getTransaction().commit();
- assertTrue( em.contains( item ) );
-
- item1 = em.find( Item.class, "Mouse" );
- assertSame( item, item1 );
- assertTrue( em.contains( item ) );
-
- item1 = (Item) em.createQuery( "select i from Item i where descr like 'M%'" ).getSingleResult();
- assertNotNull( item1 );
- assertSame( item, item1 );
- assertTrue( em.contains( item ) );
-
- em.getTransaction().begin();
- assertTrue( em.contains( item ) );
- em.remove( item );
- em.remove( item ); //Second should be no-op
- em.getTransaction().commit();
-
- em.close();
-
- }
-
- public void testConfiguration() throws Exception {
- Item item = new Item( "Mouse", "Micro$oft mouse" );
- Distributor res = new Distributor();
- res.setName( "Bruce" );
- item.setDistributors( new HashSet<Distributor>() );
- item.getDistributors().add( res );
- Statistics stats = ( (HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics();
- stats.clear();
- stats.setStatisticsEnabled( true );
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
-
- em.persist( res );
- em.persist( item );
- assertTrue( em.contains( item ) );
-
- em.getTransaction().commit();
- em.close();
-
- assertEquals( 1, stats.getSecondLevelCachePutCount() );
- assertEquals( 0, stats.getSecondLevelCacheHitCount() );
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
- Item second = em.find( Item.class, item.getName() );
- assertEquals( 1, second.getDistributors().size() );
- assertEquals( 1, stats.getSecondLevelCacheHitCount() );
- em.getTransaction().commit();
- em.close();
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
- second = em.find( Item.class, item.getName() );
- assertEquals( 1, second.getDistributors().size() );
- assertEquals( 3, stats.getSecondLevelCacheHitCount() );
- em.remove( second );
- em.remove( second.getDistributors().iterator().next() );
- em.getTransaction().commit();
- em.close();
-
- stats.clear();
- stats.setStatisticsEnabled( false );
- }
-
- public void testContains() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Integer nonManagedObject = new Integer( 4 );
- try {
- em.contains( nonManagedObject );
- fail( "Should have raised an exception" );
- }
- catch (IllegalArgumentException iae) {
- //success
- if ( em.getTransaction() != null ) em.getTransaction().rollback();
- }
- finally {
- em.close();
- }
- em = factory.createEntityManager();
- em.getTransaction().begin();
- Item item = new Item();
- item.setDescr( "Mine" );
- item.setName( "Juggy" );
- em.persist( item );
- em.getTransaction().commit();
- em.getTransaction().begin();
- item = em.getReference( Item.class, item.getName() );
- assertTrue( em.contains( item ) );
- em.remove( item );
- em.getTransaction().commit();
- em.close();
- }
-
- public void testClear() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Wallet w = new Wallet();
- w.setBrand( "Lacoste" );
- w.setModel( "Minimic" );
- w.setSerial( "0100202002" );
- em.persist( w );
- em.flush();
- em.clear();
- assertFalse( em.contains( w ) );
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testFlushMode() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.setFlushMode( FlushModeType.COMMIT );
- assertEquals( FlushModeType.COMMIT, em.getFlushMode() );
- ( (HibernateEntityManager) em ).getSession().setFlushMode( FlushMode.ALWAYS );
- assertNull( em.getFlushMode() );
- em.close();
- }
-
- public void testPersistNoneGenerator() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Wallet w = new Wallet();
- w.setBrand( "Lacoste" );
- w.setModel( "Minimic" );
- w.setSerial( "0100202002" );
- em.persist( w );
- em.getTransaction().commit();
- em.getTransaction().begin();
- Wallet wallet = em.find( Wallet.class, w.getSerial() );
- assertEquals( w.getBrand(), wallet.getBrand() );
- em.remove( wallet );
- em.getTransaction().commit();
- em.close();
- }
-
- public void testSerializableException() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- try {
- Query query = em.createQuery( "SELECT p FETCH JOIN p.distributors FROM Item p" );
- query.getSingleResult();
- }
- catch (IllegalArgumentException e) {
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- ObjectOutput out = new ObjectOutputStream( stream );
- out.writeObject( e );
- out.close();
- byte[] serialized = stream.toByteArray();
- stream.close();
- ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
- ObjectInputStream in = new ObjectInputStream( byteIn );
- IllegalArgumentException deserializedException = (IllegalArgumentException) in.readObject();
- in.close();
- byteIn.close();
- assertNull( deserializedException.getCause().getCause() );
- assertNull( e.getCause().getCause() );
- }
- em.getTransaction().rollback();
- em.close();
-
-
- Exception e = new HibernateException( "Exception", new NullPointerException( "NPE" ) );
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- ObjectOutput out = new ObjectOutputStream( stream );
- out.writeObject( e );
- out.close();
- byte[] serialized = stream.toByteArray();
- stream.close();
- ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
- ObjectInputStream in = new ObjectInputStream( byteIn );
- HibernateException deserializedException = (HibernateException) in.readObject();
- in.close();
- byteIn.close();
- assertNotNull( "Arbitrary exceptions nullified", deserializedException.getCause() );
- assertNotNull( e.getCause() );
- }
-
- public void testIsOpen() throws Exception {
- EntityManager em = factory.createEntityManager();
- assertTrue( em.isOpen() );
- em.getTransaction().begin();
- assertTrue( em.isOpen() );
- em.getTransaction().rollback();
- em.close();
- assertFalse( em.isOpen() );
- }
-
- //EJB-9
-// public void testGet() throws Exception {
-// EntityManager em = factory.createEntityManager();
-// em.getTransaction().begin();
-// Item item = (Item) em.get(Item.class, "nonexistentone");
-// try {
-// item.getDescr();
-// em.getTransaction().commit();
-// fail("Object with wrong id should have failed");
-// }
-// catch (EntityNotFoundException e) {
-// //success
-// if (em.getTransaction() != null) em.getTransaction().rollback();
-// }
-// finally {
-// em.close();
-// }
-// }
-
- public EntityManagerTest() {
- super();
- }
-
- public EntityManagerTest(String arg0) {
- super( arg0 );
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EntityManagerTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EntityManagerTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EntityManagerTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/EntityManagerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,336 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import javax.persistence.EntityManager;
+import javax.persistence.FlushModeType;
+import javax.persistence.Query;
+
+import org.hibernate.FlushMode;
+import org.hibernate.HibernateException;
+import org.hibernate.ejb.HibernateEntityManager;
+import org.hibernate.ejb.HibernateEntityManagerFactory;
+import org.hibernate.stat.Statistics;
+
+/**
+ * @author Gavin King
+ */
+public class EntityManagerTest extends TestCase {
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Item.class,
+ Distributor.class,
+ Wallet.class
+ };
+ }
+
+ public Map<Class, String> getCachedClasses() {
+ Map<Class, String> result = new HashMap<Class, String>();
+ result.put( Item.class, "read-write" );
+ return result;
+ }
+
+ public Map<String, String> getCachedCollections() {
+ Map<String, String> result = new HashMap<String, String>();
+ result.put( Item.class.getName() + ".distributors", "read-write, RegionName" );
+ return result;
+ }
+
+ // EM TRANSACTION
+// public void testEntityManager() {
+//
+// Item item = new Item( "Mouse", "Micro$oft mouse" );
+//
+// EntityManager em = factory.createEntityManager();
+// em.getTransaction().begin();
+// em.persist( item );
+// assertTrue( em.contains( item ) );
+// em.getTransaction().commit();
+//
+// assertFalse( em.contains( item ) );
+//
+// em.getTransaction().begin();
+// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult();
+// assertNotNull( item );
+// assertEquals( "Micro$oft mouse", item.getDescr() );
+// item.setDescr( "Micro$oft wireless mouse" );
+// assertTrue( em.contains( item ) );
+// em.getTransaction().commit();
+//
+// assertFalse( em.contains( item ) );
+//
+// em.getTransaction().begin();
+// item = (Item) em.find( Item.class, "Mouse" );
+// assertNotNull( item );
+// em.getTransaction().commit();
+//
+// item = em.find( Item.class, "Mouse" );
+// assertFalse( em.contains( item ) );
+//
+// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult();
+// assertNotNull( item );
+// assertFalse( em.contains( item ) );
+//
+// em.getTransaction().begin();
+// item = em.find( Item.class, "Mouse" );
+// assertNotNull( item );
+// assertTrue( em.contains( item ) );
+// assertEquals( "Micro$oft wireless mouse", item.getDescr() );
+// em.remove( item );
+// em.remove( item );//second should be a no-op
+// em.getTransaction().commit();
+//
+// em.close();
+// }
+
+ public void testExtendedEntityManager() {
+
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( item );
+ assertTrue( em.contains( item ) );
+ em.getTransaction().commit();
+
+ assertTrue( em.contains( item ) );
+
+ em.getTransaction().begin();
+ Item item1 = (Item) em.createQuery( "select i from Item i where descr like 'M%'" ).getSingleResult();
+ assertNotNull( item1 );
+ assertSame( item, item1 );
+ item.setDescr( "Micro$oft wireless mouse" );
+ assertTrue( em.contains( item ) );
+ em.getTransaction().commit();
+
+ assertTrue( em.contains( item ) );
+
+ em.getTransaction().begin();
+ item1 = em.find( Item.class, "Mouse" );
+ assertSame( item, item1 );
+ em.getTransaction().commit();
+ assertTrue( em.contains( item ) );
+
+ item1 = em.find( Item.class, "Mouse" );
+ assertSame( item, item1 );
+ assertTrue( em.contains( item ) );
+
+ item1 = (Item) em.createQuery( "select i from Item i where descr like 'M%'" ).getSingleResult();
+ assertNotNull( item1 );
+ assertSame( item, item1 );
+ assertTrue( em.contains( item ) );
+
+ em.getTransaction().begin();
+ assertTrue( em.contains( item ) );
+ em.remove( item );
+ em.remove( item ); //Second should be no-op
+ em.getTransaction().commit();
+
+ em.close();
+
+ }
+
+ public void testConfiguration() throws Exception {
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+ Distributor res = new Distributor();
+ res.setName( "Bruce" );
+ item.setDistributors( new HashSet<Distributor>() );
+ item.getDistributors().add( res );
+ Statistics stats = ( (HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics();
+ stats.clear();
+ stats.setStatisticsEnabled( true );
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+
+ em.persist( res );
+ em.persist( item );
+ assertTrue( em.contains( item ) );
+
+ em.getTransaction().commit();
+ em.close();
+
+ assertEquals( 1, stats.getSecondLevelCachePutCount() );
+ assertEquals( 0, stats.getSecondLevelCacheHitCount() );
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Item second = em.find( Item.class, item.getName() );
+ assertEquals( 1, second.getDistributors().size() );
+ assertEquals( 1, stats.getSecondLevelCacheHitCount() );
+ em.getTransaction().commit();
+ em.close();
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ second = em.find( Item.class, item.getName() );
+ assertEquals( 1, second.getDistributors().size() );
+ assertEquals( 3, stats.getSecondLevelCacheHitCount() );
+ em.remove( second );
+ em.remove( second.getDistributors().iterator().next() );
+ em.getTransaction().commit();
+ em.close();
+
+ stats.clear();
+ stats.setStatisticsEnabled( false );
+ }
+
+ public void testContains() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Integer nonManagedObject = new Integer( 4 );
+ try {
+ em.contains( nonManagedObject );
+ fail( "Should have raised an exception" );
+ }
+ catch (IllegalArgumentException iae) {
+ //success
+ if ( em.getTransaction() != null ) em.getTransaction().rollback();
+ }
+ finally {
+ em.close();
+ }
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Item item = new Item();
+ item.setDescr( "Mine" );
+ item.setName( "Juggy" );
+ em.persist( item );
+ em.getTransaction().commit();
+ em.getTransaction().begin();
+ item = em.getReference( Item.class, item.getName() );
+ assertTrue( em.contains( item ) );
+ em.remove( item );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testClear() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Wallet w = new Wallet();
+ w.setBrand( "Lacoste" );
+ w.setModel( "Minimic" );
+ w.setSerial( "0100202002" );
+ em.persist( w );
+ em.flush();
+ em.clear();
+ assertFalse( em.contains( w ) );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testFlushMode() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.setFlushMode( FlushModeType.COMMIT );
+ assertEquals( FlushModeType.COMMIT, em.getFlushMode() );
+ ( (HibernateEntityManager) em ).getSession().setFlushMode( FlushMode.ALWAYS );
+ assertNull( em.getFlushMode() );
+ em.close();
+ }
+
+ public void testPersistNoneGenerator() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Wallet w = new Wallet();
+ w.setBrand( "Lacoste" );
+ w.setModel( "Minimic" );
+ w.setSerial( "0100202002" );
+ em.persist( w );
+ em.getTransaction().commit();
+ em.getTransaction().begin();
+ Wallet wallet = em.find( Wallet.class, w.getSerial() );
+ assertEquals( w.getBrand(), wallet.getBrand() );
+ em.remove( wallet );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testSerializableException() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ Query query = em.createQuery( "SELECT p FETCH JOIN p.distributors FROM Item p" );
+ query.getSingleResult();
+ }
+ catch (IllegalArgumentException e) {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ ObjectOutput out = new ObjectOutputStream( stream );
+ out.writeObject( e );
+ out.close();
+ byte[] serialized = stream.toByteArray();
+ stream.close();
+ ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
+ ObjectInputStream in = new ObjectInputStream( byteIn );
+ IllegalArgumentException deserializedException = (IllegalArgumentException) in.readObject();
+ in.close();
+ byteIn.close();
+ assertNull( deserializedException.getCause().getCause() );
+ assertNull( e.getCause().getCause() );
+ }
+ em.getTransaction().rollback();
+ em.close();
+
+
+ Exception e = new HibernateException( "Exception", new NullPointerException( "NPE" ) );
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ ObjectOutput out = new ObjectOutputStream( stream );
+ out.writeObject( e );
+ out.close();
+ byte[] serialized = stream.toByteArray();
+ stream.close();
+ ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
+ ObjectInputStream in = new ObjectInputStream( byteIn );
+ HibernateException deserializedException = (HibernateException) in.readObject();
+ in.close();
+ byteIn.close();
+ assertNotNull( "Arbitrary exceptions nullified", deserializedException.getCause() );
+ assertNotNull( e.getCause() );
+ }
+
+ public void testIsOpen() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ assertTrue( em.isOpen() );
+ em.getTransaction().begin();
+ assertTrue( em.isOpen() );
+ em.getTransaction().rollback();
+ em.close();
+ assertFalse( em.isOpen() );
+ }
+
+ //EJB-9
+// public void testGet() throws Exception {
+// EntityManager em = factory.createEntityManager();
+// em.getTransaction().begin();
+// Item item = (Item) em.get(Item.class, "nonexistentone");
+// try {
+// item.getDescr();
+// em.getTransaction().commit();
+// fail("Object with wrong id should have failed");
+// }
+// catch (EntityNotFoundException e) {
+// //success
+// if (em.getTransaction() != null) em.getTransaction().rollback();
+// }
+// finally {
+// em.close();
+// }
+// }
+
+ public EntityManagerTest() {
+ super();
+ }
+
+ public EntityManagerTest(String arg0) {
+ super( arg0 );
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Item.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Item.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Item.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,72 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.EntityResult;
-import javax.persistence.FieldResult;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-import javax.persistence.SqlResultSetMapping;
-
-/**
- * @author Gavin King
- */
- at Entity(name = "Item")
- at SqlResultSetMapping(name = "getItem", entities =
- at EntityResult(entityClass = org.hibernate.ejb.test.Item.class, fields = {
- at FieldResult(name = "name", column = "itemname"),
- at FieldResult(name = "descr", column = "itemdescription")
- })
-)
-//@Cache(region="Item", usage=NONSTRICT_READ_WRITE)
-public class Item implements Serializable {
-
- private String name;
- private String descr;
- private Set<Distributor> distributors = new HashSet<Distributor>();
-
- public Item() {
- }
-
- public Item(String name, String desc) {
- this.name = name;
- this.descr = desc;
- }
-
- @Column(length = 200)
- public String getDescr() {
- return descr;
- }
-
- public void setDescr(String desc) {
- this.descr = desc;
- }
-
- @Id
- @Column(length = 30)
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @OneToMany
- public Set<Distributor> getDistributors() {
- return distributors;
- }
-
- public void setDistributors(Set<Distributor> distributors) {
- this.distributors = distributors;
- }
-
- public void addDistributor(Distributor d) {
- if ( distributors == null ) distributors = new HashSet();
- distributors.add( d );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Item.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Item.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Item.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Item.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,72 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EntityResult;
+import javax.persistence.FieldResult;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.SqlResultSetMapping;
+
+/**
+ * @author Gavin King
+ */
+ at Entity(name = "Item")
+ at SqlResultSetMapping(name = "getItem", entities =
+ at EntityResult(entityClass = org.hibernate.ejb.test.Item.class, fields = {
+ at FieldResult(name = "name", column = "itemname"),
+ at FieldResult(name = "descr", column = "itemdescription")
+ })
+)
+//@Cache(region="Item", usage=NONSTRICT_READ_WRITE)
+public class Item implements Serializable {
+
+ private String name;
+ private String descr;
+ private Set<Distributor> distributors = new HashSet<Distributor>();
+
+ public Item() {
+ }
+
+ public Item(String name, String desc) {
+ this.name = name;
+ this.descr = desc;
+ }
+
+ @Column(length = 200)
+ public String getDescr() {
+ return descr;
+ }
+
+ public void setDescr(String desc) {
+ this.descr = desc;
+ }
+
+ @Id
+ @Column(length = 30)
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @OneToMany
+ public Set<Distributor> getDistributors() {
+ return distributors;
+ }
+
+ public void setDistributors(Set<Distributor> distributors) {
+ this.distributors = distributors;
+ }
+
+ public void addDistributor(Distributor d) {
+ if ( distributors == null ) distributors = new HashSet();
+ distributors.add( d );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/LastUpdateListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/LastUpdateListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/LastUpdateListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import java.util.Date;
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
-
-/**
- * @author Emmanuel Bernard
- */
-public class LastUpdateListener {
- @PreUpdate
- @PrePersist
- public void setLastUpdate(Cat o) {
- o.setLastUpdate( new Date() );
- o.setManualVersion( o.getManualVersion() + 1 );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/LastUpdateListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/LastUpdateListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/LastUpdateListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/LastUpdateListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import java.util.Date;
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LastUpdateListener {
+ @PreUpdate
+ @PrePersist
+ public void setLastUpdate(Cat o) {
+ o.setLastUpdate( new Date() );
+ o.setManualVersion( o.getManualVersion() + 1 );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/MyNamingStrategy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/MyNamingStrategy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/MyNamingStrategy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import org.hibernate.cfg.EJB3NamingStrategy;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MyNamingStrategy extends EJB3NamingStrategy {
- @Override
- public String tableName(String tableName) {
- return "tbl_" + super.tableName( tableName );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/MyNamingStrategy.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/MyNamingStrategy.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/MyNamingStrategy.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/MyNamingStrategy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import org.hibernate.cfg.EJB3NamingStrategy;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MyNamingStrategy extends EJB3NamingStrategy {
+ @Override
+ public String tableName(String tableName) {
+ return "tbl_" + super.tableName( tableName );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,427 +0,0 @@
-package org.hibernate.ejb.test;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-import javax.persistence.PersistenceException;
-
-import org.hibernate.ejb.HibernateEntityManagerFactory;
-import org.hibernate.ejb.HibernatePersistence;
-import org.hibernate.ejb.test.pack.cfgxmlpar.Morito;
-import org.hibernate.ejb.test.pack.defaultpar.ApplicationServer;
-import org.hibernate.ejb.test.pack.defaultpar.IncrementListener;
-import org.hibernate.ejb.test.pack.defaultpar.Lighter;
-import org.hibernate.ejb.test.pack.defaultpar.Money;
-import org.hibernate.ejb.test.pack.defaultpar.Mouse;
-import org.hibernate.ejb.test.pack.defaultpar.OtherIncrementListener;
-import org.hibernate.ejb.test.pack.defaultpar.Version;
-import org.hibernate.ejb.test.pack.excludehbmpar.Caipirinha;
-import org.hibernate.ejb.test.pack.explodedpar.Carpet;
-import org.hibernate.ejb.test.pack.explodedpar.Elephant;
-import org.hibernate.ejb.test.pack.externaljar.Scooter;
-import org.hibernate.ejb.test.pack.spacepar.Bug;
-import org.hibernate.ejb.test.pack.various.Seat;
-import org.hibernate.ejb.test.pack.various.Airplane;
-import org.hibernate.stat.Statistics;
-import org.hibernate.validator.InvalidStateException;
-import org.hibernate.JDBCException;
-
-//$Id$
-
-/**
- * @author Gavin King
- */
-public class PackagedEntityManagerTest extends TestCase {
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- };
- }
-
- public void setUp() {
- factory = Persistence.createEntityManagerFactory( "manager1" );
- }
-
- public void testDefaultPar() throws Exception {
- EntityManagerFactory emf = Persistence.createEntityManagerFactory( "defaultpar", new HashMap() );
- EntityManager em = emf.createEntityManager();
- ApplicationServer as = new ApplicationServer();
- as.setName( "JBoss AS" );
- Version v = new Version();
- v.setMajor( 4 );
- v.setMinor( 0 );
- v.setMicro( 3 );
- as.setVersion( v );
- Mouse mouse = new Mouse();
- mouse.setName( "mickey" );
- em.getTransaction().begin();
- em.persist( as );
- em.persist( mouse );
- assertEquals( 1, em.createNamedQuery( "allMouse" ).getResultList().size() );
- Lighter lighter = new Lighter();
- lighter.name = "main";
- lighter.power = " 250 W";
- em.persist( lighter );
- em.flush();
- em.remove( lighter );
- em.remove( mouse );
- assertNotNull( as.getId() );
- em.remove( as );
- em.getTransaction().commit();
- em.close();
- emf.close();
- }
-
- public void testListenersDefaultPar() throws Exception {
- IncrementListener.reset();
- OtherIncrementListener.reset();
- EntityManagerFactory emf = Persistence.createEntityManagerFactory( "defaultpar", new HashMap() );
- EntityManager em = emf.createEntityManager();
- em.getTransaction().begin();
- ApplicationServer as = new ApplicationServer();
- as.setName( "JBoss AS" );
- Version v = new Version();
- v.setMajor( 4 );
- v.setMinor( 0 );
- v.setMicro( 3 );
- as.setVersion( v );
- em.persist( as );
- em.flush();
- assertEquals( "Failure in default listeners", 1, IncrementListener.getIncrement() );
- assertEquals( "Failuer in XML overriden listeners", 1, OtherIncrementListener.getIncrement() );
-
- Mouse mouse = new Mouse();
- mouse.setName( "mickey" );
- em.persist( mouse );
- em.flush();
- assertEquals( "Failure in @ExcludeDefaultListeners", 1, IncrementListener.getIncrement() );
- assertEquals( 1, OtherIncrementListener.getIncrement() );
-
- Money money = new Money();
- em.persist( money );
- em.flush();
- assertEquals( "Failure in @ExcludeDefaultListeners", 2, IncrementListener.getIncrement() );
- assertEquals( 1, OtherIncrementListener.getIncrement() );
-
- em.getTransaction().rollback();
- em.close();
- emf.close();
- }
-
- public void testExplodedPar() throws Exception {
- EntityManagerFactory emf = Persistence.createEntityManagerFactory( "explodedpar", new HashMap() );
- EntityManager em = emf.createEntityManager();
- org.hibernate.ejb.test.pack.explodedpar.Carpet carpet = new Carpet();
- Elephant el = new Elephant();
- el.setName( "Dumbo" );
- carpet.setCountry( "Turkey" );
- em.getTransaction().begin();
- em.persist( carpet );
- em.persist( el );
- assertEquals( 1, em.createNamedQuery( "allCarpet" ).getResultList().size() );
- assertNotNull( carpet.getId() );
- em.remove( carpet );
- em.getTransaction().commit();
- em.close();
- emf.close();
- }
-
-
- public void testExcludeHbmPar() throws Exception {
- EntityManagerFactory emf = null;
- try {
- emf = Persistence.createEntityManagerFactory( "excludehbmpar", new HashMap() );
- }
- catch (PersistenceException e) {
- Throwable nested = e.getCause();
- if ( nested == null ) throw e;
- nested = nested.getCause();
- if ( nested == null ) throw e;
- if ( ! ( nested instanceof ClassNotFoundException ) ) throw e;
- fail( "Try to process hbm file: " + e.getMessage() );
- }
- EntityManager em = emf.createEntityManager();
- Caipirinha s = new Caipirinha( "Strong" );
- em.getTransaction().begin();
- em.persist( s );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- s = em.find( Caipirinha.class, s.getId() );
- em.remove( s );
- em.getTransaction().commit();
- em.close();
- emf.close();
- }
-
- public void testCfgXmlPar() throws Exception {
- EntityManagerFactory emf = Persistence.createEntityManagerFactory( "cfgxmlpar", new HashMap() );
- EntityManager em = emf.createEntityManager();
- Item i = new Item();
- i.setDescr( "Blah" );
- i.setName( "factory" );
- Morito m = new Morito();
- m.setPower( "SuperStrong" );
- em.getTransaction().begin();
- em.persist( i );
- em.persist( m );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- i = em.find( Item.class, i.getName() );
- em.remove( i );
- em.remove( em.find( Morito.class, m.getId() ) );
- em.getTransaction().commit();
- em.close();
- emf.close();
- }
-
- public void testSpacePar() throws Exception {
- EntityManagerFactory emf = Persistence.createEntityManagerFactory( "space par", new HashMap() );
- EntityManager em = emf.createEntityManager();
- Bug bug = new Bug();
- bug.setSubject( "Spaces in directory name don't play well on Windows");
- em.getTransaction().begin();
- em.persist( bug );
- em.flush();
- em.remove( bug );
- assertNotNull( bug.getId() );
- em.getTransaction().rollback();
- em.close();
- emf.close();
- }
-
- public void testOverridenPar() throws Exception {
- HashMap properties = new HashMap();
- properties.put( HibernatePersistence.JTA_DATASOURCE, null );
- properties.put( "hibernate.connection.driver_class", "org.hsqldb.jdbcDriver" );
- properties.put( "hibernate.connection.username", "sa" );
- properties.put( "hibernate.connection.password", "" );
- properties.put( "hibernate.connection.url", "jdbc:hsqldb:." );
- EntityManagerFactory emf = Persistence.createEntityManagerFactory( "overridenpar", properties );
- EntityManager em = emf.createEntityManager();
- org.hibernate.ejb.test.pack.overridenpar.Bug bug = new org.hibernate.ejb.test.pack.overridenpar.Bug();
- bug.setSubject( "Allow DS overriding");
- em.getTransaction().begin();
- em.persist( bug );
- em.flush();
- em.remove( bug );
- assertNotNull( bug.getId() );
- em.getTransaction().rollback();
- em.close();
- emf.close();
- }
-
-
-// This test does not make sense anymore, validator being autoregistered at the HAN level
-// public void testListenersOverridingCfgXmlPar() throws Exception {
-// EntityManagerFactory emf = Persistence.createEntityManagerFactory( "cfgxmlpar", new HashMap() );
-// EntityManager em = emf.createEntityManager();
-// Cat cat = new Cat();
-// cat.setName( "123"); //validator catch that
-// em.getTransaction().begin();
-// try {
-// em.persist( cat );
-// em.flush();
-// }
-// catch (InvalidStateException e) {
-// fail("Shouldn't call the ValidatorEvent listener");
-// }
-// catch (PersistenceException e) {
-// if ( ! (e.getCause() instanceof JDBCException ) ) {
-// fail("Unexpected exception: " + e);
-// }
-// }
-// em.getTransaction().rollback();
-//
-// em.close();
-// emf.close();
-// }
-
- //EM TRANSACTION
-// public void testEntityManager() {
-//
-// Item item = new Item( "Mouse", "Micro$oft mouse" );
-//
-// EntityManager em = factory.createEntityManager();
-// em.getTransaction().begin();
-// em.persist( item );
-// assertTrue( em.contains( item ) );
-// em.getTransaction().commit();
-//
-// assertFalse( em.contains( item ) );
-//
-// em.getTransaction().begin();
-// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult();
-// assertNotNull( item );
-// assertEquals( "Micro$oft mouse", item.getDescr() );
-// item.setDescr( "Micro$oft wireless mouse" );
-// assertTrue( em.contains( item ) );
-// em.getTransaction().commit();
-//
-// assertFalse( em.contains( item ) );
-//
-// em.getTransaction().begin();
-// item = (Item) em.find( Item.class, "Mouse" );
-// assertNotNull( item );
-// em.getTransaction().commit();
-//
-// item = em.find( Item.class, "Mouse" );
-// assertFalse( em.contains( item ) );
-//
-// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult();
-// assertNotNull( item );
-// assertFalse( em.contains( item ) );
-//
-// em.getTransaction().begin();
-// assertEquals("Explicit package in <class> should work", 1, em.createNamedQuery( "countItems" ).getSingleResult() );
-// em.getTransaction().commit();
-//
-// em.getTransaction().begin();
-// item = em.find( Item.class, "Mouse" );
-// assertNotNull( item );
-// assertTrue( em.contains( item ) );
-// assertEquals( "Micro$oft wireless mouse", item.getDescr() );
-// em.remove( item );
-// em.getTransaction().commit();
-//
-// em.close();
-// }
-
- public void testExtendedEntityManager() {
-
- Item item = new Item( "Mouse", "Micro$oft mouse" );
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( item );
- assertTrue( em.contains( item ) );
- em.getTransaction().commit();
-
- assertTrue( em.contains( item ) );
-
- em.getTransaction().begin();
- Item item1 = (Item) em.createQuery( "select i from Item i where descr like 'M%'" ).getSingleResult();
- assertNotNull( item1 );
- assertSame( item, item1 );
- item.setDescr( "Micro$oft wireless mouse" );
- assertTrue( em.contains( item ) );
- em.getTransaction().commit();
-
- assertTrue( em.contains( item ) );
-
- em.getTransaction().begin();
- item1 = em.find( Item.class, "Mouse" );
- assertSame( item, item1 );
- em.getTransaction().commit();
- assertTrue( em.contains( item ) );
-
- item1 = em.find( Item.class, "Mouse" );
- assertSame( item, item1 );
- assertTrue( em.contains( item ) );
-
- item1 = (Item) em.createQuery( "select i from Item i where descr like 'M%'" ).getSingleResult();
- assertNotNull( item1 );
- assertSame( item, item1 );
- assertTrue( em.contains( item ) );
-
- em.getTransaction().begin();
- assertTrue( em.contains( item ) );
- em.remove( item );
- em.remove( item ); //second remove should be a no-op
- em.getTransaction().commit();
-
- em.close();
-
- }
-
- public void testConfiguration() throws Exception {
- Item item = new Item( "Mouse", "Micro$oft mouse" );
- Distributor res = new Distributor();
- res.setName( "Bruce" );
- item.setDistributors( new HashSet<Distributor>() );
- item.getDistributors().add( res );
- Statistics stats = ( (HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics();
- stats.clear();
- stats.setStatisticsEnabled( true );
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
-
- em.persist( res );
- em.persist( item );
- assertTrue( em.contains( item ) );
-
- em.getTransaction().commit();
- em.close();
-
- assertEquals( 1, stats.getSecondLevelCachePutCount() );
- assertEquals( 0, stats.getSecondLevelCacheHitCount() );
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
- Item second = em.find( Item.class, item.getName() );
- assertEquals( 1, second.getDistributors().size() );
- assertEquals( 1, stats.getSecondLevelCacheHitCount() );
- em.getTransaction().commit();
- em.close();
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
- second = em.find( Item.class, item.getName() );
- assertEquals( 1, second.getDistributors().size() );
- assertEquals( 3, stats.getSecondLevelCacheHitCount() );
- for ( Distributor distro : second.getDistributors() ) {
- em.remove( distro );
- }
- em.remove( second );
- em.getTransaction().commit();
- em.close();
-
- stats.clear();
- stats.setStatisticsEnabled( false );
- }
-
- public void testExternalJar() throws Exception {
- EntityManager em = factory.createEntityManager();
- Scooter s = new Scooter();
- s.setModel( "Abadah" );
- s.setSpeed( 85l );
- em.getTransaction().begin();
- em.persist( s );
- em.getTransaction().commit();
- em.close();
- em = factory.createEntityManager();
- em.getTransaction().begin();
- s = em.find( Scooter.class, s.getModel() );
- assertEquals( new Long( 85 ), s.getSpeed() );
- em.remove( s );
- em.getTransaction().commit();
- em.close();
- }
-
- public void testORMFileOnMainAndExplicitJars() throws Exception {
- EntityManager em = factory.createEntityManager();
- Seat seat = new Seat();
- seat.setNumber( "3B" );
- Airplane plane = new Airplane();
- plane.setSerialNumber( "75924418409052355");
- em.getTransaction().begin();
- em.persist( seat );
- em.persist( plane );
- em.flush();
- em.getTransaction().rollback();
- em.close();
- }
-
- public PackagedEntityManagerTest() {
- super();
- }
-
- public PackagedEntityManagerTest(String arg0) {
- super( arg0 );
- }
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/PackagedEntityManagerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,427 @@
+package org.hibernate.ejb.test;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+import javax.persistence.PersistenceException;
+
+import org.hibernate.ejb.HibernateEntityManagerFactory;
+import org.hibernate.ejb.HibernatePersistence;
+import org.hibernate.ejb.test.pack.cfgxmlpar.Morito;
+import org.hibernate.ejb.test.pack.defaultpar.ApplicationServer;
+import org.hibernate.ejb.test.pack.defaultpar.IncrementListener;
+import org.hibernate.ejb.test.pack.defaultpar.Lighter;
+import org.hibernate.ejb.test.pack.defaultpar.Money;
+import org.hibernate.ejb.test.pack.defaultpar.Mouse;
+import org.hibernate.ejb.test.pack.defaultpar.OtherIncrementListener;
+import org.hibernate.ejb.test.pack.defaultpar.Version;
+import org.hibernate.ejb.test.pack.excludehbmpar.Caipirinha;
+import org.hibernate.ejb.test.pack.explodedpar.Carpet;
+import org.hibernate.ejb.test.pack.explodedpar.Elephant;
+import org.hibernate.ejb.test.pack.externaljar.Scooter;
+import org.hibernate.ejb.test.pack.spacepar.Bug;
+import org.hibernate.ejb.test.pack.various.Seat;
+import org.hibernate.ejb.test.pack.various.Airplane;
+import org.hibernate.stat.Statistics;
+import org.hibernate.validator.InvalidStateException;
+import org.hibernate.JDBCException;
+
+//$Id$
+
+/**
+ * @author Gavin King
+ */
+public class PackagedEntityManagerTest extends TestCase {
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ };
+ }
+
+ public void setUp() {
+ factory = Persistence.createEntityManagerFactory( "manager1" );
+ }
+
+ public void testDefaultPar() throws Exception {
+ EntityManagerFactory emf = Persistence.createEntityManagerFactory( "defaultpar", new HashMap() );
+ EntityManager em = emf.createEntityManager();
+ ApplicationServer as = new ApplicationServer();
+ as.setName( "JBoss AS" );
+ Version v = new Version();
+ v.setMajor( 4 );
+ v.setMinor( 0 );
+ v.setMicro( 3 );
+ as.setVersion( v );
+ Mouse mouse = new Mouse();
+ mouse.setName( "mickey" );
+ em.getTransaction().begin();
+ em.persist( as );
+ em.persist( mouse );
+ assertEquals( 1, em.createNamedQuery( "allMouse" ).getResultList().size() );
+ Lighter lighter = new Lighter();
+ lighter.name = "main";
+ lighter.power = " 250 W";
+ em.persist( lighter );
+ em.flush();
+ em.remove( lighter );
+ em.remove( mouse );
+ assertNotNull( as.getId() );
+ em.remove( as );
+ em.getTransaction().commit();
+ em.close();
+ emf.close();
+ }
+
+ public void testListenersDefaultPar() throws Exception {
+ IncrementListener.reset();
+ OtherIncrementListener.reset();
+ EntityManagerFactory emf = Persistence.createEntityManagerFactory( "defaultpar", new HashMap() );
+ EntityManager em = emf.createEntityManager();
+ em.getTransaction().begin();
+ ApplicationServer as = new ApplicationServer();
+ as.setName( "JBoss AS" );
+ Version v = new Version();
+ v.setMajor( 4 );
+ v.setMinor( 0 );
+ v.setMicro( 3 );
+ as.setVersion( v );
+ em.persist( as );
+ em.flush();
+ assertEquals( "Failure in default listeners", 1, IncrementListener.getIncrement() );
+ assertEquals( "Failuer in XML overriden listeners", 1, OtherIncrementListener.getIncrement() );
+
+ Mouse mouse = new Mouse();
+ mouse.setName( "mickey" );
+ em.persist( mouse );
+ em.flush();
+ assertEquals( "Failure in @ExcludeDefaultListeners", 1, IncrementListener.getIncrement() );
+ assertEquals( 1, OtherIncrementListener.getIncrement() );
+
+ Money money = new Money();
+ em.persist( money );
+ em.flush();
+ assertEquals( "Failure in @ExcludeDefaultListeners", 2, IncrementListener.getIncrement() );
+ assertEquals( 1, OtherIncrementListener.getIncrement() );
+
+ em.getTransaction().rollback();
+ em.close();
+ emf.close();
+ }
+
+ public void testExplodedPar() throws Exception {
+ EntityManagerFactory emf = Persistence.createEntityManagerFactory( "explodedpar", new HashMap() );
+ EntityManager em = emf.createEntityManager();
+ org.hibernate.ejb.test.pack.explodedpar.Carpet carpet = new Carpet();
+ Elephant el = new Elephant();
+ el.setName( "Dumbo" );
+ carpet.setCountry( "Turkey" );
+ em.getTransaction().begin();
+ em.persist( carpet );
+ em.persist( el );
+ assertEquals( 1, em.createNamedQuery( "allCarpet" ).getResultList().size() );
+ assertNotNull( carpet.getId() );
+ em.remove( carpet );
+ em.getTransaction().commit();
+ em.close();
+ emf.close();
+ }
+
+
+ public void testExcludeHbmPar() throws Exception {
+ EntityManagerFactory emf = null;
+ try {
+ emf = Persistence.createEntityManagerFactory( "excludehbmpar", new HashMap() );
+ }
+ catch (PersistenceException e) {
+ Throwable nested = e.getCause();
+ if ( nested == null ) throw e;
+ nested = nested.getCause();
+ if ( nested == null ) throw e;
+ if ( ! ( nested instanceof ClassNotFoundException ) ) throw e;
+ fail( "Try to process hbm file: " + e.getMessage() );
+ }
+ EntityManager em = emf.createEntityManager();
+ Caipirinha s = new Caipirinha( "Strong" );
+ em.getTransaction().begin();
+ em.persist( s );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ s = em.find( Caipirinha.class, s.getId() );
+ em.remove( s );
+ em.getTransaction().commit();
+ em.close();
+ emf.close();
+ }
+
+ public void testCfgXmlPar() throws Exception {
+ EntityManagerFactory emf = Persistence.createEntityManagerFactory( "cfgxmlpar", new HashMap() );
+ EntityManager em = emf.createEntityManager();
+ Item i = new Item();
+ i.setDescr( "Blah" );
+ i.setName( "factory" );
+ Morito m = new Morito();
+ m.setPower( "SuperStrong" );
+ em.getTransaction().begin();
+ em.persist( i );
+ em.persist( m );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ i = em.find( Item.class, i.getName() );
+ em.remove( i );
+ em.remove( em.find( Morito.class, m.getId() ) );
+ em.getTransaction().commit();
+ em.close();
+ emf.close();
+ }
+
+ public void testSpacePar() throws Exception {
+ EntityManagerFactory emf = Persistence.createEntityManagerFactory( "space par", new HashMap() );
+ EntityManager em = emf.createEntityManager();
+ Bug bug = new Bug();
+ bug.setSubject( "Spaces in directory name don't play well on Windows");
+ em.getTransaction().begin();
+ em.persist( bug );
+ em.flush();
+ em.remove( bug );
+ assertNotNull( bug.getId() );
+ em.getTransaction().rollback();
+ em.close();
+ emf.close();
+ }
+
+ public void testOverridenPar() throws Exception {
+ HashMap properties = new HashMap();
+ properties.put( HibernatePersistence.JTA_DATASOURCE, null );
+ properties.put( "hibernate.connection.driver_class", "org.hsqldb.jdbcDriver" );
+ properties.put( "hibernate.connection.username", "sa" );
+ properties.put( "hibernate.connection.password", "" );
+ properties.put( "hibernate.connection.url", "jdbc:hsqldb:." );
+ EntityManagerFactory emf = Persistence.createEntityManagerFactory( "overridenpar", properties );
+ EntityManager em = emf.createEntityManager();
+ org.hibernate.ejb.test.pack.overridenpar.Bug bug = new org.hibernate.ejb.test.pack.overridenpar.Bug();
+ bug.setSubject( "Allow DS overriding");
+ em.getTransaction().begin();
+ em.persist( bug );
+ em.flush();
+ em.remove( bug );
+ assertNotNull( bug.getId() );
+ em.getTransaction().rollback();
+ em.close();
+ emf.close();
+ }
+
+
+// This test does not make sense anymore, validator being autoregistered at the HAN level
+// public void testListenersOverridingCfgXmlPar() throws Exception {
+// EntityManagerFactory emf = Persistence.createEntityManagerFactory( "cfgxmlpar", new HashMap() );
+// EntityManager em = emf.createEntityManager();
+// Cat cat = new Cat();
+// cat.setName( "123"); //validator catch that
+// em.getTransaction().begin();
+// try {
+// em.persist( cat );
+// em.flush();
+// }
+// catch (InvalidStateException e) {
+// fail("Shouldn't call the ValidatorEvent listener");
+// }
+// catch (PersistenceException e) {
+// if ( ! (e.getCause() instanceof JDBCException ) ) {
+// fail("Unexpected exception: " + e);
+// }
+// }
+// em.getTransaction().rollback();
+//
+// em.close();
+// emf.close();
+// }
+
+ //EM TRANSACTION
+// public void testEntityManager() {
+//
+// Item item = new Item( "Mouse", "Micro$oft mouse" );
+//
+// EntityManager em = factory.createEntityManager();
+// em.getTransaction().begin();
+// em.persist( item );
+// assertTrue( em.contains( item ) );
+// em.getTransaction().commit();
+//
+// assertFalse( em.contains( item ) );
+//
+// em.getTransaction().begin();
+// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult();
+// assertNotNull( item );
+// assertEquals( "Micro$oft mouse", item.getDescr() );
+// item.setDescr( "Micro$oft wireless mouse" );
+// assertTrue( em.contains( item ) );
+// em.getTransaction().commit();
+//
+// assertFalse( em.contains( item ) );
+//
+// em.getTransaction().begin();
+// item = (Item) em.find( Item.class, "Mouse" );
+// assertNotNull( item );
+// em.getTransaction().commit();
+//
+// item = em.find( Item.class, "Mouse" );
+// assertFalse( em.contains( item ) );
+//
+// item = (Item) em.createQuery( "from Item where descr like 'M%'" ).getSingleResult();
+// assertNotNull( item );
+// assertFalse( em.contains( item ) );
+//
+// em.getTransaction().begin();
+// assertEquals("Explicit package in <class> should work", 1, em.createNamedQuery( "countItems" ).getSingleResult() );
+// em.getTransaction().commit();
+//
+// em.getTransaction().begin();
+// item = em.find( Item.class, "Mouse" );
+// assertNotNull( item );
+// assertTrue( em.contains( item ) );
+// assertEquals( "Micro$oft wireless mouse", item.getDescr() );
+// em.remove( item );
+// em.getTransaction().commit();
+//
+// em.close();
+// }
+
+ public void testExtendedEntityManager() {
+
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( item );
+ assertTrue( em.contains( item ) );
+ em.getTransaction().commit();
+
+ assertTrue( em.contains( item ) );
+
+ em.getTransaction().begin();
+ Item item1 = (Item) em.createQuery( "select i from Item i where descr like 'M%'" ).getSingleResult();
+ assertNotNull( item1 );
+ assertSame( item, item1 );
+ item.setDescr( "Micro$oft wireless mouse" );
+ assertTrue( em.contains( item ) );
+ em.getTransaction().commit();
+
+ assertTrue( em.contains( item ) );
+
+ em.getTransaction().begin();
+ item1 = em.find( Item.class, "Mouse" );
+ assertSame( item, item1 );
+ em.getTransaction().commit();
+ assertTrue( em.contains( item ) );
+
+ item1 = em.find( Item.class, "Mouse" );
+ assertSame( item, item1 );
+ assertTrue( em.contains( item ) );
+
+ item1 = (Item) em.createQuery( "select i from Item i where descr like 'M%'" ).getSingleResult();
+ assertNotNull( item1 );
+ assertSame( item, item1 );
+ assertTrue( em.contains( item ) );
+
+ em.getTransaction().begin();
+ assertTrue( em.contains( item ) );
+ em.remove( item );
+ em.remove( item ); //second remove should be a no-op
+ em.getTransaction().commit();
+
+ em.close();
+
+ }
+
+ public void testConfiguration() throws Exception {
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+ Distributor res = new Distributor();
+ res.setName( "Bruce" );
+ item.setDistributors( new HashSet<Distributor>() );
+ item.getDistributors().add( res );
+ Statistics stats = ( (HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics();
+ stats.clear();
+ stats.setStatisticsEnabled( true );
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+
+ em.persist( res );
+ em.persist( item );
+ assertTrue( em.contains( item ) );
+
+ em.getTransaction().commit();
+ em.close();
+
+ assertEquals( 1, stats.getSecondLevelCachePutCount() );
+ assertEquals( 0, stats.getSecondLevelCacheHitCount() );
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Item second = em.find( Item.class, item.getName() );
+ assertEquals( 1, second.getDistributors().size() );
+ assertEquals( 1, stats.getSecondLevelCacheHitCount() );
+ em.getTransaction().commit();
+ em.close();
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ second = em.find( Item.class, item.getName() );
+ assertEquals( 1, second.getDistributors().size() );
+ assertEquals( 3, stats.getSecondLevelCacheHitCount() );
+ for ( Distributor distro : second.getDistributors() ) {
+ em.remove( distro );
+ }
+ em.remove( second );
+ em.getTransaction().commit();
+ em.close();
+
+ stats.clear();
+ stats.setStatisticsEnabled( false );
+ }
+
+ public void testExternalJar() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ Scooter s = new Scooter();
+ s.setModel( "Abadah" );
+ s.setSpeed( 85l );
+ em.getTransaction().begin();
+ em.persist( s );
+ em.getTransaction().commit();
+ em.close();
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ s = em.find( Scooter.class, s.getModel() );
+ assertEquals( new Long( 85 ), s.getSpeed() );
+ em.remove( s );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testORMFileOnMainAndExplicitJars() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ Seat seat = new Seat();
+ seat.setNumber( "3B" );
+ Airplane plane = new Airplane();
+ plane.setSerialNumber( "75924418409052355");
+ em.getTransaction().begin();
+ em.persist( seat );
+ em.persist( plane );
+ em.flush();
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public PackagedEntityManagerTest() {
+ super();
+ }
+
+ public PackagedEntityManagerTest(String arg0) {
+ super( arg0 );
+ }
+
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/QueryTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/QueryTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/QueryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,353 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
-import javax.persistence.EntityManager;
-import javax.persistence.Query;
-import javax.persistence.TemporalType;
-
-import org.hibernate.Hibernate;
-
-
-/**
- * @author Emmanuel Bernard
- */
-public class QueryTest extends TestCase {
-
- public void testPagedQuery() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Item item = new Item( "Mouse", "Micro$oft mouse" );
- em.persist( item );
- item = new Item( "Computer", "Apple II" );
- em.persist( item );
- Query q = em.createQuery( "select i from " + Item.class.getName() + " i where i.name like :itemName" );
- q.setParameter( "itemName", "%" );
- q.setMaxResults( 1 );
- q.getSingleResult();
- q = em.createQuery( "select i from Item i where i.name like :itemName" );
- q.setParameter( "itemName", "%" );
- q.setFirstResult( 1 );
- q.setMaxResults( 1 );
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testAggregationReturnType() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Item item = new Item( "Mouse", "Micro$oft mouse" );
- em.persist( item );
- item = new Item( "Computer", "Apple II" );
- em.persist( item );
- Query q = em.createQuery( "select count(i) from Item i where i.name like :itemName" );
- q.setParameter( "itemName", "%" );
- assertTrue( q.getSingleResult() instanceof Long );
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testParameterList() throws Exception {
- final Item item = new Item( "Mouse", "Micro$oft mouse" );
- final Item item2 = new Item( "Computer", "Dll computer" );
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( item );
- em.persist( item2 );
- assertTrue( em.contains( item ) );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- Query q = em.createQuery( "select item from Item item where item.name in (:names)" );
- List params = new ArrayList();
- params.add( item.getName() );
- params.add( item2.getName() );
- q.setParameter( "names", params );
- List result = q.getResultList();
- assertNotNull( result );
- assertEquals( 2, result.size() );
-
- q = em.createQuery( "select item from Item item where item.name in ( ?1 )" );
- params = new ArrayList();
- params.add( item.getName() );
- params.add( item2.getName() );
- q.setParameter( "1", params );
- result = q.getResultList();
- assertNotNull( result );
- assertEquals( 2, result.size() );
- em.remove( result.get( 0 ) );
- em.remove( result.get( 1 ) );
- em.getTransaction().commit();
-
- em.close();
- }
-
-// public void testDistinct() throws Exception {
-// Item item = new Item("Mouse", "Micro_oft mouse");
-// Distributor fnac = new Distributor();
-// fnac.setName("Fnac");
-// item.addDistributor(fnac);
-// Distributor auchan = new Distributor();
-// auchan.setName("Auchan");
-// item.addDistributor(auchan);
-//
-// EntityManager em = factory.createEntityManager();
-// em.getTransaction().begin();
-// em.persist(fnac);
-// em.persist(auchan);
-// em.persist(item);
-// em.getTransaction().commit();
-//
-// em.getTransaction().begin();
-// Query q = em.createQuery("select distinct item from Item item join fetch item.distributors");
-// List result = q.getResultList();
-// assertNotNull(result);
-// assertEquals( 1, result.size() );
-// item = (Item) result.get(0);
-// item.getDistributors().clear();
-// em.flush();
-// int deleted = em.createQuery("delete from Item").executeUpdate();
-// assertEquals( 1, deleted );
-// deleted = em.createQuery("delete from Distributor").executeUpdate();
-// assertEquals( 2, deleted );
-// em.getTransaction().commit();
-//
-// em.close();
-// }
-
- public void testEscapeCharacter() throws Exception {
- final Item item = new Item( "Mouse", "Micro_oft mouse" );
- final Item item2 = new Item( "Computer", "Dll computer" );
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( item );
- em.persist( item2 );
- assertTrue( em.contains( item ) );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- Query q = em.createQuery( "select item from Item item where item.descr like 'Microk_oft mouse' escape 'k' " );
- List result = q.getResultList();
- assertNotNull( result );
- assertEquals( 1, result.size() );
- int deleted = em.createQuery( "delete from Item" ).executeUpdate();
- assertEquals( 2, deleted );
- em.getTransaction().commit();
-
- em.close();
- }
-
- public void testNativeQueryByEntity() {
-
- Item item = new Item( "Mouse", "Micro$oft mouse" );
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( item );
- assertTrue( em.contains( item ) );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- item = (Item) em.createNativeQuery( "select * from Item", Item.class ).getSingleResult();
- assertNotNull( item );
- assertEquals( "Micro$oft mouse", item.getDescr() );
- em.remove( item );
- em.getTransaction().commit();
-
- em.close();
-
- }
-
- public void testNativeQueryByResultSet() {
-
- Item item = new Item( "Mouse", "Micro$oft mouse" );
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( item );
- assertTrue( em.contains( item ) );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- item = (Item) em.createNativeQuery( "select name as itemname, descr as itemdescription from Item", "getItem" )
- .getSingleResult();
- assertNotNull( item );
- assertEquals( "Micro$oft mouse", item.getDescr() );
- em.remove( item );
- em.getTransaction().commit();
-
- em.close();
-
- }
-
- public void testExplicitPositionalParameter() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Wallet w = new Wallet();
- w.setBrand( "Lacoste" );
- w.setModel( "Minimic" );
- w.setSerial( "0100202002" );
- em.persist( w );
- em.getTransaction().commit();
- em.getTransaction().begin();
- Query query = em.createQuery( "select w from " + Wallet.class.getName() + " w where w.brand in (?1)" );
- List brands = new ArrayList();
- brands.add( "Lacoste" );
- query.setParameter( 1, brands );
- w = (Wallet) query.getSingleResult();
- assertNotNull( w );
- query = em.createQuery( "select w from " + Wallet.class.getName() + " w where w.marketEntrance = ?1" );
- query.setParameter( 1, new Date(), TemporalType.DATE );
- //assertNull( query.getSingleResult() );
- assertEquals( 0, query.getResultList().size() );
- em.remove( w );
- em.getTransaction().commit();
- em.close();
- }
-
- public void testNativeQuestionMarkParameter() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Wallet w = new Wallet();
- w.setBrand( "Lacoste" );
- w.setModel( "Minimic" );
- w.setSerial( "0100202002" );
- em.persist( w );
- em.getTransaction().commit();
- em.getTransaction().begin();
- Query query = em.createNativeQuery( "select * from Wallet w where w.brand = ?", Wallet.class );
- query.setParameter( 1, "Lacoste" );
- w = (Wallet) query.getSingleResult();
- assertNotNull( w );
- em.remove( w );
- em.getTransaction().commit();
- em.close();
- }
-
- public void testNativeQueryWithPositionalParameter() {
-
- Item item = new Item( "Mouse", "Micro$oft mouse" );
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( item );
- assertTrue( em.contains( item ) );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- Query query = em.createNativeQuery( "select * from Item where name = ?1", Item.class );
- query.setParameter( 1, "Mouse" );
- item = (Item) query.getSingleResult();
- assertNotNull( item );
- assertEquals( "Micro$oft mouse", item.getDescr() );
- query = em.createNativeQuery( "select * from Item where name = ?", Item.class );
- query.setParameter( 1, "Mouse" );
- item = (Item) query.getSingleResult();
- assertNotNull( item );
- assertEquals( "Micro$oft mouse", item.getDescr() );
- em.remove( item );
- em.getTransaction().commit();
-
- em.close();
-
- }
-
- public void testDistinct() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.createQuery( "delete Item" ).executeUpdate();
- em.createQuery( "delete Distributor" ).executeUpdate();
- Distributor d1 = new Distributor();
- d1.setName( "Fnac" );
- Distributor d2 = new Distributor();
- d2.setName( "Darty" );
- Item item = new Item( "Mouse", "Micro$oft mouse" );
- item.getDistributors().add( d1 );
- item.getDistributors().add( d2 );
- em.persist( d1 );
- em.persist( d2 );
- em.persist( item );
- em.flush();
- em.clear();
- Query q = em.createQuery( "select distinct i from Item i left join fetch i.distributors" );
- item = (Item) q.getSingleResult()
- ;
- //assertEquals( 1, distinctResult.size() );
- //item = (Item) distinctResult.get( 0 );
- assertTrue( Hibernate.isInitialized( item.getDistributors() ) );
- assertEquals( 2, item.getDistributors().size() );
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testIsNull() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Distributor d1 = new Distributor();
- d1.setName( "Fnac" );
- Distributor d2 = new Distributor();
- d2.setName( "Darty" );
- Item item = new Item( "Mouse", null );
- Item item2 = new Item( "Mouse2", "dd" );
- item.getDistributors().add( d1 );
- item.getDistributors().add( d2 );
- em.persist( d1 );
- em.persist( d2 );
- em.persist( item );
- em.persist( item2 );
- em.flush();
- em.clear();
- Query q = em.createQuery(
- "select i from Item i where (i.descr is null and :descr is null) or i.descr = :descr"
- );
- //Query q = em.createQuery( "select i from Item i where (i.descr is null and :descr is null) or (i.descr = :descr");
- q.setParameter( "descr", "dd" );
- List result = q.getResultList();
- assertEquals( 1, result.size() );
- q.setParameter( "descr", null );
- result = q.getResultList();
- assertEquals( 1, result.size() );
- //item = (Item) distinctResult.get( 0 );
-
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testUpdateQuery() {
-
- Item item = new Item( "Mouse", "Micro$oft mouse" );
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( item );
- assertTrue( em.contains( item ) );
-
- em.flush();
- em.clear();
-
- assertEquals(
- 1, em.createNativeQuery(
- "update Item i set i.descr = 'Logitech Mouse' where i.name = 'Mouse'"
- ).executeUpdate()
- );
- item = em.find( Item.class, item.getName() );
- assertEquals( "Logitech Mouse", item.getDescr() );
- em.remove( item );
- em.getTransaction().rollback();
-
- em.close();
-
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Item.class,
- Distributor.class,
- Wallet.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/QueryTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/QueryTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/QueryTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/QueryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,353 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.Query;
+import javax.persistence.TemporalType;
+
+import org.hibernate.Hibernate;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class QueryTest extends TestCase {
+
+ public void testPagedQuery() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+ em.persist( item );
+ item = new Item( "Computer", "Apple II" );
+ em.persist( item );
+ Query q = em.createQuery( "select i from " + Item.class.getName() + " i where i.name like :itemName" );
+ q.setParameter( "itemName", "%" );
+ q.setMaxResults( 1 );
+ q.getSingleResult();
+ q = em.createQuery( "select i from Item i where i.name like :itemName" );
+ q.setParameter( "itemName", "%" );
+ q.setFirstResult( 1 );
+ q.setMaxResults( 1 );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testAggregationReturnType() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+ em.persist( item );
+ item = new Item( "Computer", "Apple II" );
+ em.persist( item );
+ Query q = em.createQuery( "select count(i) from Item i where i.name like :itemName" );
+ q.setParameter( "itemName", "%" );
+ assertTrue( q.getSingleResult() instanceof Long );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testParameterList() throws Exception {
+ final Item item = new Item( "Mouse", "Micro$oft mouse" );
+ final Item item2 = new Item( "Computer", "Dll computer" );
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( item );
+ em.persist( item2 );
+ assertTrue( em.contains( item ) );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ Query q = em.createQuery( "select item from Item item where item.name in (:names)" );
+ List params = new ArrayList();
+ params.add( item.getName() );
+ params.add( item2.getName() );
+ q.setParameter( "names", params );
+ List result = q.getResultList();
+ assertNotNull( result );
+ assertEquals( 2, result.size() );
+
+ q = em.createQuery( "select item from Item item where item.name in ( ?1 )" );
+ params = new ArrayList();
+ params.add( item.getName() );
+ params.add( item2.getName() );
+ q.setParameter( "1", params );
+ result = q.getResultList();
+ assertNotNull( result );
+ assertEquals( 2, result.size() );
+ em.remove( result.get( 0 ) );
+ em.remove( result.get( 1 ) );
+ em.getTransaction().commit();
+
+ em.close();
+ }
+
+// public void testDistinct() throws Exception {
+// Item item = new Item("Mouse", "Micro_oft mouse");
+// Distributor fnac = new Distributor();
+// fnac.setName("Fnac");
+// item.addDistributor(fnac);
+// Distributor auchan = new Distributor();
+// auchan.setName("Auchan");
+// item.addDistributor(auchan);
+//
+// EntityManager em = factory.createEntityManager();
+// em.getTransaction().begin();
+// em.persist(fnac);
+// em.persist(auchan);
+// em.persist(item);
+// em.getTransaction().commit();
+//
+// em.getTransaction().begin();
+// Query q = em.createQuery("select distinct item from Item item join fetch item.distributors");
+// List result = q.getResultList();
+// assertNotNull(result);
+// assertEquals( 1, result.size() );
+// item = (Item) result.get(0);
+// item.getDistributors().clear();
+// em.flush();
+// int deleted = em.createQuery("delete from Item").executeUpdate();
+// assertEquals( 1, deleted );
+// deleted = em.createQuery("delete from Distributor").executeUpdate();
+// assertEquals( 2, deleted );
+// em.getTransaction().commit();
+//
+// em.close();
+// }
+
+ public void testEscapeCharacter() throws Exception {
+ final Item item = new Item( "Mouse", "Micro_oft mouse" );
+ final Item item2 = new Item( "Computer", "Dll computer" );
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( item );
+ em.persist( item2 );
+ assertTrue( em.contains( item ) );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ Query q = em.createQuery( "select item from Item item where item.descr like 'Microk_oft mouse' escape 'k' " );
+ List result = q.getResultList();
+ assertNotNull( result );
+ assertEquals( 1, result.size() );
+ int deleted = em.createQuery( "delete from Item" ).executeUpdate();
+ assertEquals( 2, deleted );
+ em.getTransaction().commit();
+
+ em.close();
+ }
+
+ public void testNativeQueryByEntity() {
+
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( item );
+ assertTrue( em.contains( item ) );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ item = (Item) em.createNativeQuery( "select * from Item", Item.class ).getSingleResult();
+ assertNotNull( item );
+ assertEquals( "Micro$oft mouse", item.getDescr() );
+ em.remove( item );
+ em.getTransaction().commit();
+
+ em.close();
+
+ }
+
+ public void testNativeQueryByResultSet() {
+
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( item );
+ assertTrue( em.contains( item ) );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ item = (Item) em.createNativeQuery( "select name as itemname, descr as itemdescription from Item", "getItem" )
+ .getSingleResult();
+ assertNotNull( item );
+ assertEquals( "Micro$oft mouse", item.getDescr() );
+ em.remove( item );
+ em.getTransaction().commit();
+
+ em.close();
+
+ }
+
+ public void testExplicitPositionalParameter() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Wallet w = new Wallet();
+ w.setBrand( "Lacoste" );
+ w.setModel( "Minimic" );
+ w.setSerial( "0100202002" );
+ em.persist( w );
+ em.getTransaction().commit();
+ em.getTransaction().begin();
+ Query query = em.createQuery( "select w from " + Wallet.class.getName() + " w where w.brand in (?1)" );
+ List brands = new ArrayList();
+ brands.add( "Lacoste" );
+ query.setParameter( 1, brands );
+ w = (Wallet) query.getSingleResult();
+ assertNotNull( w );
+ query = em.createQuery( "select w from " + Wallet.class.getName() + " w where w.marketEntrance = ?1" );
+ query.setParameter( 1, new Date(), TemporalType.DATE );
+ //assertNull( query.getSingleResult() );
+ assertEquals( 0, query.getResultList().size() );
+ em.remove( w );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testNativeQuestionMarkParameter() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Wallet w = new Wallet();
+ w.setBrand( "Lacoste" );
+ w.setModel( "Minimic" );
+ w.setSerial( "0100202002" );
+ em.persist( w );
+ em.getTransaction().commit();
+ em.getTransaction().begin();
+ Query query = em.createNativeQuery( "select * from Wallet w where w.brand = ?", Wallet.class );
+ query.setParameter( 1, "Lacoste" );
+ w = (Wallet) query.getSingleResult();
+ assertNotNull( w );
+ em.remove( w );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testNativeQueryWithPositionalParameter() {
+
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( item );
+ assertTrue( em.contains( item ) );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ Query query = em.createNativeQuery( "select * from Item where name = ?1", Item.class );
+ query.setParameter( 1, "Mouse" );
+ item = (Item) query.getSingleResult();
+ assertNotNull( item );
+ assertEquals( "Micro$oft mouse", item.getDescr() );
+ query = em.createNativeQuery( "select * from Item where name = ?", Item.class );
+ query.setParameter( 1, "Mouse" );
+ item = (Item) query.getSingleResult();
+ assertNotNull( item );
+ assertEquals( "Micro$oft mouse", item.getDescr() );
+ em.remove( item );
+ em.getTransaction().commit();
+
+ em.close();
+
+ }
+
+ public void testDistinct() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.createQuery( "delete Item" ).executeUpdate();
+ em.createQuery( "delete Distributor" ).executeUpdate();
+ Distributor d1 = new Distributor();
+ d1.setName( "Fnac" );
+ Distributor d2 = new Distributor();
+ d2.setName( "Darty" );
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+ item.getDistributors().add( d1 );
+ item.getDistributors().add( d2 );
+ em.persist( d1 );
+ em.persist( d2 );
+ em.persist( item );
+ em.flush();
+ em.clear();
+ Query q = em.createQuery( "select distinct i from Item i left join fetch i.distributors" );
+ item = (Item) q.getSingleResult()
+ ;
+ //assertEquals( 1, distinctResult.size() );
+ //item = (Item) distinctResult.get( 0 );
+ assertTrue( Hibernate.isInitialized( item.getDistributors() ) );
+ assertEquals( 2, item.getDistributors().size() );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testIsNull() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Distributor d1 = new Distributor();
+ d1.setName( "Fnac" );
+ Distributor d2 = new Distributor();
+ d2.setName( "Darty" );
+ Item item = new Item( "Mouse", null );
+ Item item2 = new Item( "Mouse2", "dd" );
+ item.getDistributors().add( d1 );
+ item.getDistributors().add( d2 );
+ em.persist( d1 );
+ em.persist( d2 );
+ em.persist( item );
+ em.persist( item2 );
+ em.flush();
+ em.clear();
+ Query q = em.createQuery(
+ "select i from Item i where (i.descr is null and :descr is null) or i.descr = :descr"
+ );
+ //Query q = em.createQuery( "select i from Item i where (i.descr is null and :descr is null) or (i.descr = :descr");
+ q.setParameter( "descr", "dd" );
+ List result = q.getResultList();
+ assertEquals( 1, result.size() );
+ q.setParameter( "descr", null );
+ result = q.getResultList();
+ assertEquals( 1, result.size() );
+ //item = (Item) distinctResult.get( 0 );
+
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testUpdateQuery() {
+
+ Item item = new Item( "Mouse", "Micro$oft mouse" );
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( item );
+ assertTrue( em.contains( item ) );
+
+ em.flush();
+ em.clear();
+
+ assertEquals(
+ 1, em.createNativeQuery(
+ "update Item i set i.descr = 'Logitech Mouse' where i.name = 'Mouse'"
+ ).executeUpdate()
+ );
+ item = em.find( Item.class, item.getName() );
+ assertEquals( "Logitech Mouse", item.getDescr() );
+ em.remove( item );
+ em.getTransaction().rollback();
+
+ em.close();
+
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Item.class,
+ Distributor.class,
+ Wallet.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/TestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/TestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/TestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,104 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-
-import org.hibernate.cfg.Environment;
-import org.hibernate.ejb.HibernatePersistence;
-
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class TestCase extends junit.framework.TestCase {
- protected EntityManagerFactory factory;
-
- public TestCase() {
- super();
- }
-
- public TestCase(String name) {
- super( name );
- }
-
- public void setUp() {
- factory = new HibernatePersistence().createEntityManagerFactory( getConfig() );
- }
-
- public void tearDown() {
- factory.close();
- }
-
- public abstract Class[] getAnnotatedClasses();
-
- public String[] getEjb3DD() {
- return new String[] {};
- }
-
- public Map<Class, String> getCachedClasses() {
- return new HashMap<Class, String>();
- }
-
- public Map<String, String> getCachedCollections() {
- return new HashMap<String, String>();
- }
-
- public static Properties loadProperties() {
- Properties props = new Properties();
- InputStream stream = Persistence.class.getResourceAsStream( "/hibernate.properties" );
- if ( stream != null ) {
- try {
- props.load( stream );
- }
- catch (Exception e) {
- throw new RuntimeException( "could not load hibernate.properties" );
- }
- finally {
- try {
- stream.close();
- }
- catch (IOException ioe) {
- }
- }
- }
- props.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- return props;
- }
-
- public Map getConfig() {
- Map config = loadProperties();
- ArrayList<Class> classes = new ArrayList<Class>();
-
- for ( Class clazz : getAnnotatedClasses() ) {
- classes.add( clazz );
- }
- config.put( HibernatePersistence.LOADED_CLASSES, classes );
- for ( Map.Entry<Class, String> entry : getCachedClasses().entrySet() ) {
- config.put(
- HibernatePersistence.CLASS_CACHE_PREFIX + "." + entry.getKey().getName(),
- entry.getValue()
- );
- }
- for ( Map.Entry<String, String> entry : getCachedCollections().entrySet() ) {
- config.put(
- HibernatePersistence.COLLECTION_CACHE_PREFIX + "." + entry.getKey(),
- entry.getValue()
- );
- }
- if ( getEjb3DD().length > 0 ) {
- ArrayList<String> dds = new ArrayList<String>();
- for ( String dd : getEjb3DD() ) {
- dds.add( dd );
- }
- config.put( HibernatePersistence.XML_FILE_NAMES, dds );
- }
- return config;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/TestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/TestCase.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/TestCase.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/TestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,104 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.HibernatePersistence;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class TestCase extends junit.framework.TestCase {
+ protected EntityManagerFactory factory;
+
+ public TestCase() {
+ super();
+ }
+
+ public TestCase(String name) {
+ super( name );
+ }
+
+ public void setUp() {
+ factory = new HibernatePersistence().createEntityManagerFactory( getConfig() );
+ }
+
+ public void tearDown() {
+ factory.close();
+ }
+
+ public abstract Class[] getAnnotatedClasses();
+
+ public String[] getEjb3DD() {
+ return new String[] {};
+ }
+
+ public Map<Class, String> getCachedClasses() {
+ return new HashMap<Class, String>();
+ }
+
+ public Map<String, String> getCachedCollections() {
+ return new HashMap<String, String>();
+ }
+
+ public static Properties loadProperties() {
+ Properties props = new Properties();
+ InputStream stream = Persistence.class.getResourceAsStream( "/hibernate.properties" );
+ if ( stream != null ) {
+ try {
+ props.load( stream );
+ }
+ catch (Exception e) {
+ throw new RuntimeException( "could not load hibernate.properties" );
+ }
+ finally {
+ try {
+ stream.close();
+ }
+ catch (IOException ioe) {
+ }
+ }
+ }
+ props.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ return props;
+ }
+
+ public Map getConfig() {
+ Map config = loadProperties();
+ ArrayList<Class> classes = new ArrayList<Class>();
+
+ for ( Class clazz : getAnnotatedClasses() ) {
+ classes.add( clazz );
+ }
+ config.put( HibernatePersistence.LOADED_CLASSES, classes );
+ for ( Map.Entry<Class, String> entry : getCachedClasses().entrySet() ) {
+ config.put(
+ HibernatePersistence.CLASS_CACHE_PREFIX + "." + entry.getKey().getName(),
+ entry.getValue()
+ );
+ }
+ for ( Map.Entry<String, String> entry : getCachedCollections().entrySet() ) {
+ config.put(
+ HibernatePersistence.COLLECTION_CACHE_PREFIX + "." + entry.getKey(),
+ entry.getValue()
+ );
+ }
+ if ( getEjb3DD().length > 0 ) {
+ ArrayList<String> dds = new ArrayList<String>();
+ for ( String dd : getEjb3DD() ) {
+ dds.add( dd );
+ }
+ config.put( HibernatePersistence.XML_FILE_NAMES, dds );
+ }
+ return config;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ValidatorIntegrationTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ValidatorIntegrationTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ValidatorIntegrationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import java.util.Date;
-import javax.persistence.EntityManager;
-
-import org.hibernate.validator.InvalidStateException;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ValidatorIntegrationTest extends TestCase {
-
- public void testPropertyValidation() throws Exception {
- EntityManager em = factory.createEntityManager();
- Cat cat = new Cat();
- cat.setAge( 33 );
- cat.setDateOfBirth( new Date() );
- cat.setName( "iti" );
- em.getTransaction().begin();
- try {
- em.persist( cat );
- em.flush();
- fail( "No validation" );
- }
- catch (InvalidStateException e) {
- //success
- }
- finally {
- em.getTransaction().rollback();
- em.close();
- }
-
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Cat.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ValidatorIntegrationTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ValidatorIntegrationTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ValidatorIntegrationTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ValidatorIntegrationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import java.util.Date;
+import javax.persistence.EntityManager;
+
+import org.hibernate.validator.InvalidStateException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ValidatorIntegrationTest extends TestCase {
+
+ public void testPropertyValidation() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ Cat cat = new Cat();
+ cat.setAge( 33 );
+ cat.setDateOfBirth( new Date() );
+ cat.setName( "iti" );
+ em.getTransaction().begin();
+ try {
+ em.persist( cat );
+ em.flush();
+ fail( "No validation" );
+ }
+ catch (InvalidStateException e) {
+ //success
+ }
+ finally {
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Cat.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Wallet.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Wallet.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Wallet.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test;
-
-import java.io.Serializable;
-import java.util.Date;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Wallet implements Serializable {
- private String serial;
- private String model;
- private Date marketEntrance;
- private String brand;
-
- @Id
- public String getSerial() {
- return serial;
- }
-
- public void setSerial(String serial) {
- this.serial = serial;
- }
-
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- public String getBrand() {
- return brand;
- }
-
- public void setBrand(String brand) {
- this.brand = brand;
- }
-
- public Date getMarketEntrance() {
- return marketEntrance;
- }
-
- public void setMarketEntrance(Date marketEntrance) {
- this.marketEntrance = marketEntrance;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Wallet.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Wallet.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Wallet.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/Wallet.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+//$Id$
+package org.hibernate.ejb.test;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Wallet implements Serializable {
+ private String serial;
+ private String model;
+ private Date marketEntrance;
+ private String brand;
+
+ @Id
+ public String getSerial() {
+ return serial;
+ }
+
+ public void setSerial(String serial) {
+ this.serial = serial;
+ }
+
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ public Date getMarketEntrance() {
+ return marketEntrance;
+ }
+
+ public void setMarketEntrance(Date marketEntrance) {
+ this.marketEntrance = marketEntrance;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/AssociationTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/AssociationTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/AssociationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,59 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.association;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class AssociationTest extends TestCase {
- public void testBidirOneToOne() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- String id = "10";
- Incident i = em.find( Incident.class, id );
- if ( i == null ) {
- i = new Incident( id );
- IncidentStatus ist = new IncidentStatus( id );
- i.setIncidentStatus( ist );
- ist.setIncident( i );
- em.persist( i );
- }
- em.getTransaction().commit();
- em.clear();
- em.getTransaction().begin();
- em.remove( em.find(Incident.class, id) );
- em.getTransaction().commit();
- em.close();
- }
-
- public void testMergeAndBidirOneToOne() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Oven oven = new Oven();
- Kitchen kitchen = new Kitchen();
- em.persist( oven );
- em.persist( kitchen );
- kitchen.setOven( oven );
- oven.setKitchen( kitchen );
- em.flush();
- em.clear();
- //oven = em.find(Oven.class, oven.getId() );
- oven = em.merge( oven );
- em.flush();
-
- em.getTransaction().rollback();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Incident.class,
- IncidentStatus.class,
- Kitchen.class,
- Oven.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/AssociationTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/AssociationTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/AssociationTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/AssociationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,59 @@
+//$Id: $
+package org.hibernate.ejb.test.association;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AssociationTest extends TestCase {
+ public void testBidirOneToOne() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ String id = "10";
+ Incident i = em.find( Incident.class, id );
+ if ( i == null ) {
+ i = new Incident( id );
+ IncidentStatus ist = new IncidentStatus( id );
+ i.setIncidentStatus( ist );
+ ist.setIncident( i );
+ em.persist( i );
+ }
+ em.getTransaction().commit();
+ em.clear();
+ em.getTransaction().begin();
+ em.remove( em.find(Incident.class, id) );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testMergeAndBidirOneToOne() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Oven oven = new Oven();
+ Kitchen kitchen = new Kitchen();
+ em.persist( oven );
+ em.persist( kitchen );
+ kitchen.setOven( oven );
+ oven.setKitchen( kitchen );
+ em.flush();
+ em.clear();
+ //oven = em.find(Oven.class, oven.getId() );
+ oven = em.merge( oven );
+ em.flush();
+
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Incident.class,
+ IncidentStatus.class,
+ Kitchen.class,
+ Oven.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Incident.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Incident.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Incident.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.association;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Incident {
- @Id
- String id;
-
- @OneToOne(cascade = CascadeType.ALL)
- IncidentStatus incidentStatus;
-
- public Incident() {
- }
-
- public Incident(String id) {
- this.id = id;
- }
-
- public IncidentStatus getIncidentStatus() {
- return incidentStatus;
- }
-
- public void setIncidentStatus(IncidentStatus incidentStatus) {
- this.incidentStatus = incidentStatus;
- }
-
- @Override
- public String toString() {
- return "Incident: " + id + " " + incidentStatus;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Incident.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Incident.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Incident.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Incident.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.ejb.test.association;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Incident {
+ @Id
+ String id;
+
+ @OneToOne(cascade = CascadeType.ALL)
+ IncidentStatus incidentStatus;
+
+ public Incident() {
+ }
+
+ public Incident(String id) {
+ this.id = id;
+ }
+
+ public IncidentStatus getIncidentStatus() {
+ return incidentStatus;
+ }
+
+ public void setIncidentStatus(IncidentStatus incidentStatus) {
+ this.incidentStatus = incidentStatus;
+ }
+
+ @Override
+ public String toString() {
+ return "Incident: " + id + " " + incidentStatus;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/IncidentStatus.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/IncidentStatus.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/IncidentStatus.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.association;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class IncidentStatus {
- @Id
- String id;
-
- @OneToOne(mappedBy = "incidentStatus")
- Incident incident;
-
- public IncidentStatus() {
- }
-
- public IncidentStatus(String id) {
- this.id = id;
- }
-
- public Incident getIncident() {
- return incident;
- }
-
- public void setIncident(Incident incident) {
- this.incident = incident;
- }
-
- @Override
- public String toString() {
- return "IncidentStatus " + id;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/IncidentStatus.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/IncidentStatus.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/IncidentStatus.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/IncidentStatus.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id: $
+package org.hibernate.ejb.test.association;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class IncidentStatus {
+ @Id
+ String id;
+
+ @OneToOne(mappedBy = "incidentStatus")
+ Incident incident;
+
+ public IncidentStatus() {
+ }
+
+ public IncidentStatus(String id) {
+ this.id = id;
+ }
+
+ public Incident getIncident() {
+ return incident;
+ }
+
+ public void setIncident(Incident incident) {
+ this.incident = incident;
+ }
+
+ @Override
+ public String toString() {
+ return "IncidentStatus " + id;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Kitchen.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Kitchen.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Kitchen.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.association;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Kitchen {
- @Id @GeneratedValue
- private Long id;
-
- @OneToOne(mappedBy = "kitchen")
- private Oven oven;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Oven getOven() {
- return oven;
- }
-
- public void setOven(Oven oven) {
- this.oven = oven;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Kitchen.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Kitchen.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Kitchen.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Kitchen.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id: $
+package org.hibernate.ejb.test.association;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Kitchen {
+ @Id @GeneratedValue
+ private Long id;
+
+ @OneToOne(mappedBy = "kitchen")
+ private Oven oven;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Oven getOven() {
+ return oven;
+ }
+
+ public void setOven(Oven oven) {
+ this.oven = oven;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Oven.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Oven.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Oven.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.association;
-
-import javax.persistence.Entity;
-import javax.persistence.OneToOne;
-import javax.persistence.JoinColumn;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.FetchType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Oven {
- @Id @GeneratedValue
- private Long id;
-
- @OneToOne(fetch= FetchType.LAZY)
- @JoinColumn
- private Kitchen kitchen;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Kitchen getKitchen() {
- return kitchen;
- }
-
- public void setKitchen(Kitchen kitchen) {
- this.kitchen = kitchen;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Oven.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Oven.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Oven.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/association/Oven.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id: $
+package org.hibernate.ejb.test.association;
+
+import javax.persistence.Entity;
+import javax.persistence.OneToOne;
+import javax.persistence.JoinColumn;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.FetchType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Oven {
+ @Id @GeneratedValue
+ private Long id;
+
+ @OneToOne(fetch= FetchType.LAZY)
+ @JoinColumn
+ private Kitchen kitchen;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Kitchen getKitchen() {
+ return kitchen;
+ }
+
+ public void setKitchen(Kitchen kitchen) {
+ this.kitchen = kitchen;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,92 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import java.util.Iterator;
-import java.util.List;
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CallbackAndDirtyTest extends TestCase {
-
- public void testDirtyButNotDirty() throws Exception {
- EntityManager manager = factory.createEntityManager();
- manager.getTransaction().begin();
- Employee mark = new Employee();
- mark.setName( "Mark" );
- mark.setTitle( "internal sales" );
- mark.setSex( 'M' );
- mark.setAddress( "buckhead" );
- mark.setZip( "30305" );
- mark.setCountry( "USA" );
-
- Customer joe = new Customer();
- joe.setName( "Joe" );
- joe.setAddress( "San Francisco" );
- joe.setZip( "XXXXX" );
- joe.setCountry( "USA" );
- joe.setComments( "Very demanding" );
- joe.setSalesperson( mark );
-
- Person yomomma = new Person();
- yomomma.setName( "mum" );
- yomomma.setSex( 'F' );
-
- manager.persist( mark );
- manager.persist( joe );
- manager.persist( yomomma );
- long[] ids = {mark.getId(), joe.getId(), yomomma.getId()};
- manager.getTransaction().commit();
-
- manager.getTransaction().begin();
- assertEquals(
- manager.createQuery( "select p.address, p.name from Person p order by p.name" ).getResultList().size(),
- 3
- );
- assertEquals( manager.createQuery( "select p from Person p where p.class = Customer" ).getResultList().size(), 1 );
- manager.getTransaction().commit();
-
- manager.getTransaction().begin();
- List customers = manager.createQuery( "select c from Customer c left join fetch c.salesperson" ).getResultList();
- for ( Iterator iter = customers.iterator(); iter.hasNext() ; ) {
- Customer c = (Customer) iter.next();
- assertEquals( c.getSalesperson().getName(), "Mark" );
- }
- assertEquals( customers.size(), 1 );
- manager.getTransaction().commit();
-
- manager.getTransaction().begin();
- customers = manager.createQuery( "select c from Customer c" ).getResultList();
- for ( Iterator iter = customers.iterator(); iter.hasNext() ; ) {
- Customer c = (Customer) iter.next();
- assertEquals( c.getSalesperson().getName(), "Mark" );
- }
- assertEquals( customers.size(), 1 );
- manager.getTransaction().commit();
-
- manager.getTransaction().begin();
- mark = manager.find( Employee.class, new Long( ids[0] ) );
- joe = (Customer) manager.find( Customer.class, new Long( ids[1] ) );
- yomomma = manager.find( Person.class, new Long( ids[2] ) );
-
- mark.setZip( "30306" );
- assertEquals( 1, manager.createQuery( "select p from Person p where p.zip = '30306'" ).getResultList().size() );
- manager.remove( mark );
- manager.remove( joe );
- manager.remove( yomomma );
- assertTrue( manager.createQuery( "select p from Person p" ).getResultList().isEmpty() );
- manager.getTransaction().commit();
- manager.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Customer.class,
- Employee.class,
- Person.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbackAndDirtyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,92 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import java.util.Iterator;
+import java.util.List;
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CallbackAndDirtyTest extends TestCase {
+
+ public void testDirtyButNotDirty() throws Exception {
+ EntityManager manager = factory.createEntityManager();
+ manager.getTransaction().begin();
+ Employee mark = new Employee();
+ mark.setName( "Mark" );
+ mark.setTitle( "internal sales" );
+ mark.setSex( 'M' );
+ mark.setAddress( "buckhead" );
+ mark.setZip( "30305" );
+ mark.setCountry( "USA" );
+
+ Customer joe = new Customer();
+ joe.setName( "Joe" );
+ joe.setAddress( "San Francisco" );
+ joe.setZip( "XXXXX" );
+ joe.setCountry( "USA" );
+ joe.setComments( "Very demanding" );
+ joe.setSalesperson( mark );
+
+ Person yomomma = new Person();
+ yomomma.setName( "mum" );
+ yomomma.setSex( 'F' );
+
+ manager.persist( mark );
+ manager.persist( joe );
+ manager.persist( yomomma );
+ long[] ids = {mark.getId(), joe.getId(), yomomma.getId()};
+ manager.getTransaction().commit();
+
+ manager.getTransaction().begin();
+ assertEquals(
+ manager.createQuery( "select p.address, p.name from Person p order by p.name" ).getResultList().size(),
+ 3
+ );
+ assertEquals( manager.createQuery( "select p from Person p where p.class = Customer" ).getResultList().size(), 1 );
+ manager.getTransaction().commit();
+
+ manager.getTransaction().begin();
+ List customers = manager.createQuery( "select c from Customer c left join fetch c.salesperson" ).getResultList();
+ for ( Iterator iter = customers.iterator(); iter.hasNext() ; ) {
+ Customer c = (Customer) iter.next();
+ assertEquals( c.getSalesperson().getName(), "Mark" );
+ }
+ assertEquals( customers.size(), 1 );
+ manager.getTransaction().commit();
+
+ manager.getTransaction().begin();
+ customers = manager.createQuery( "select c from Customer c" ).getResultList();
+ for ( Iterator iter = customers.iterator(); iter.hasNext() ; ) {
+ Customer c = (Customer) iter.next();
+ assertEquals( c.getSalesperson().getName(), "Mark" );
+ }
+ assertEquals( customers.size(), 1 );
+ manager.getTransaction().commit();
+
+ manager.getTransaction().begin();
+ mark = manager.find( Employee.class, new Long( ids[0] ) );
+ joe = (Customer) manager.find( Customer.class, new Long( ids[1] ) );
+ yomomma = manager.find( Person.class, new Long( ids[2] ) );
+
+ mark.setZip( "30306" );
+ assertEquals( 1, manager.createQuery( "select p from Person p where p.zip = '30306'" ).getResultList().size() );
+ manager.remove( mark );
+ manager.remove( joe );
+ manager.remove( yomomma );
+ assertTrue( manager.createQuery( "select p from Person p" ).getResultList().isEmpty() );
+ manager.getTransaction().commit();
+ manager.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Customer.class,
+ Employee.class,
+ Person.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,175 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import java.util.Date;
-import java.util.List;
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.Cat;
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CallbacksTest extends TestCase {
-
- public void testCallbackMethod() throws Exception {
- EntityManager em = factory.createEntityManager();
- Cat c = new Cat();
- c.setName( "Kitty" );
- c.setDateOfBirth( new Date( 90, 11, 15 ) );
- em.getTransaction().begin();
- em.persist( c );
- em.getTransaction().commit();
- em.clear();
- em.getTransaction().begin();
- c = em.find( Cat.class, c.getId() );
- assertFalse( c.getAge() == 0 );
- c.setName( "Tomcat" ); //update this entity
- em.getTransaction().commit();
- em.clear();
- em.getTransaction().begin();
- c = em.find( Cat.class, c.getId() );
- assertEquals( "Tomcat", c.getName() );
- em.getTransaction().commit();
- em.close();
- }
-
- public void testEntityListener() throws Exception {
- EntityManager em = factory.createEntityManager();
- Cat c = new Cat();
- c.setName( "Kitty" );
- c.setLength( 12 );
- c.setDateOfBirth( new Date( 90, 11, 15 ) );
- em.getTransaction().begin();
- int previousVersion = c.getManualVersion();
- em.persist( c );
- em.getTransaction().commit();
- em.getTransaction().begin();
- c = em.find( Cat.class, c.getId() );
- assertNotNull( c.getLastUpdate() );
- assertTrue( previousVersion < c.getManualVersion() );
- assertEquals( 12, c.getLength() );
- previousVersion = c.getManualVersion();
- c.setName( "new name" );
- em.getTransaction().commit();
- em.getTransaction().begin();
- c = em.find( Cat.class, c.getId() );
- assertTrue( previousVersion < c.getManualVersion() );
- em.getTransaction().commit();
-
- em.close();
- }
-
-
- public void testPostPersist() throws Exception {
- EntityManager em = factory.createEntityManager();
- Cat c = new Cat();
- em.getTransaction().begin();
- c.setLength( 23 );
- c.setAge( 2 );
- c.setName( "Beetle" );
- c.setDateOfBirth( new Date() );
- em.persist( c );
- em.getTransaction().commit();
- em.close();
- List ids = c.getIdList();
- Object id = c.getIdList().get( ids.size() - 1 );
- assertNotNull( id );
- }
-
- //Not a test since the spec did not make the proper change on listeners
- public void listenerAnnotation() throws Exception {
- EntityManager em = factory.createEntityManager();
- Translation tl = new Translation();
- em.getTransaction().begin();
- tl.setInto( "France" );
- em.persist( tl );
- tl = new Translation();
- tl.setInto( "Bimboland" );
- try {
- em.persist( tl );
- em.flush();
- fail( "Annotations annotated by a listener not used" );
- }
- catch (IllegalArgumentException e) {
- //success
- }
- finally {
- em.getTransaction().rollback();
- em.close();
- }
- }
-
- public void testPrePersistOnCascade() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Television tv = new Television();
- RemoteControl rc = new RemoteControl();
- em.persist( tv );
- em.flush();
- tv.setControl( rc );
- tv.init();
- em.flush();
- assertNotNull( rc.getCreationDate() );
- em.getTransaction().rollback();
- }
-
- public void testCallBackListenersHierarchy() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Television tv = new Television();
- em.persist( tv );
- tv.setName( "Myaio" );
- tv.init();
- em.flush();
- assertEquals( 1, tv.counter );
- em.getTransaction().rollback();
- em.close();
- assertEquals( 5, tv.communication );
- assertTrue( tv.isLast );
- }
-
- public void testException() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Rythm r = new Rythm();
- try {
- em.persist( r );
- em.flush();
- fail("should have raised an ArythmeticException:");
- }
- catch (ArithmeticException e) {
- //success
- }
- catch( Exception e ) {
- fail("should have raised an ArythmeticException:" + e.getClass() );
- }
-
- em.getTransaction().rollback();
- em.close();
-
- }
-
- public void testIdNullSetByPrePersist() throws Exception {
- Plant plant = new Plant();
- plant.setName( "Origuna plantula gigantic" );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( plant );
- em.flush();
- em.getTransaction().rollback();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Cat.class,
- Translation.class,
- Television.class,
- RemoteControl.class,
- Rythm.class,
- Plant.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CallbacksTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,175 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import java.util.Date;
+import java.util.List;
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.Cat;
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CallbacksTest extends TestCase {
+
+ public void testCallbackMethod() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ Cat c = new Cat();
+ c.setName( "Kitty" );
+ c.setDateOfBirth( new Date( 90, 11, 15 ) );
+ em.getTransaction().begin();
+ em.persist( c );
+ em.getTransaction().commit();
+ em.clear();
+ em.getTransaction().begin();
+ c = em.find( Cat.class, c.getId() );
+ assertFalse( c.getAge() == 0 );
+ c.setName( "Tomcat" ); //update this entity
+ em.getTransaction().commit();
+ em.clear();
+ em.getTransaction().begin();
+ c = em.find( Cat.class, c.getId() );
+ assertEquals( "Tomcat", c.getName() );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testEntityListener() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ Cat c = new Cat();
+ c.setName( "Kitty" );
+ c.setLength( 12 );
+ c.setDateOfBirth( new Date( 90, 11, 15 ) );
+ em.getTransaction().begin();
+ int previousVersion = c.getManualVersion();
+ em.persist( c );
+ em.getTransaction().commit();
+ em.getTransaction().begin();
+ c = em.find( Cat.class, c.getId() );
+ assertNotNull( c.getLastUpdate() );
+ assertTrue( previousVersion < c.getManualVersion() );
+ assertEquals( 12, c.getLength() );
+ previousVersion = c.getManualVersion();
+ c.setName( "new name" );
+ em.getTransaction().commit();
+ em.getTransaction().begin();
+ c = em.find( Cat.class, c.getId() );
+ assertTrue( previousVersion < c.getManualVersion() );
+ em.getTransaction().commit();
+
+ em.close();
+ }
+
+
+ public void testPostPersist() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ Cat c = new Cat();
+ em.getTransaction().begin();
+ c.setLength( 23 );
+ c.setAge( 2 );
+ c.setName( "Beetle" );
+ c.setDateOfBirth( new Date() );
+ em.persist( c );
+ em.getTransaction().commit();
+ em.close();
+ List ids = c.getIdList();
+ Object id = c.getIdList().get( ids.size() - 1 );
+ assertNotNull( id );
+ }
+
+ //Not a test since the spec did not make the proper change on listeners
+ public void listenerAnnotation() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ Translation tl = new Translation();
+ em.getTransaction().begin();
+ tl.setInto( "France" );
+ em.persist( tl );
+ tl = new Translation();
+ tl.setInto( "Bimboland" );
+ try {
+ em.persist( tl );
+ em.flush();
+ fail( "Annotations annotated by a listener not used" );
+ }
+ catch (IllegalArgumentException e) {
+ //success
+ }
+ finally {
+ em.getTransaction().rollback();
+ em.close();
+ }
+ }
+
+ public void testPrePersistOnCascade() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Television tv = new Television();
+ RemoteControl rc = new RemoteControl();
+ em.persist( tv );
+ em.flush();
+ tv.setControl( rc );
+ tv.init();
+ em.flush();
+ assertNotNull( rc.getCreationDate() );
+ em.getTransaction().rollback();
+ }
+
+ public void testCallBackListenersHierarchy() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Television tv = new Television();
+ em.persist( tv );
+ tv.setName( "Myaio" );
+ tv.init();
+ em.flush();
+ assertEquals( 1, tv.counter );
+ em.getTransaction().rollback();
+ em.close();
+ assertEquals( 5, tv.communication );
+ assertTrue( tv.isLast );
+ }
+
+ public void testException() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Rythm r = new Rythm();
+ try {
+ em.persist( r );
+ em.flush();
+ fail("should have raised an ArythmeticException:");
+ }
+ catch (ArithmeticException e) {
+ //success
+ }
+ catch( Exception e ) {
+ fail("should have raised an ArythmeticException:" + e.getClass() );
+ }
+
+ em.getTransaction().rollback();
+ em.close();
+
+ }
+
+ public void testIdNullSetByPrePersist() throws Exception {
+ Plant plant = new Plant();
+ plant.setName( "Origuna plantula gigantic" );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( plant );
+ em.flush();
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Cat.class,
+ Translation.class,
+ Television.class,
+ RemoteControl.class,
+ Rythm.class,
+ Plant.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CommunicationSystem.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CommunicationSystem.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CommunicationSystem.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.EntityListeners;
-import javax.persistence.MappedSuperclass;
-
-/**
- * @author Emmanuel Bernard
- */
- at MappedSuperclass
- at EntityListeners(IncreaseListener.class)
-public class CommunicationSystem {
- public int communication = 0;
- public boolean isFirst = true;
- public boolean isLast;
-
- public void init() {
- communication = 0;
- isFirst = true;
- isLast = false;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CommunicationSystem.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CommunicationSystem.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CommunicationSystem.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CommunicationSystem.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.EntityListeners;
+import javax.persistence.MappedSuperclass;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MappedSuperclass
+ at EntityListeners(IncreaseListener.class)
+public class CommunicationSystem {
+ public int communication = 0;
+ public boolean isFirst = true;
+ public boolean isLast;
+
+ public void init() {
+ communication = 0;
+ isFirst = true;
+ isLast = false;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryChecker.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryChecker.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryChecker.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import javax.persistence.EntityListeners;
-
-/**
- * @author Emmanuel Bernard
- */
- at EntityListeners(CountryNameCheckerListener.class)
- at Target(ElementType.TYPE)
- at Retention(RetentionPolicy.RUNTIME)
-public @interface CountryChecker {
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryChecker.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryChecker.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryChecker.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryChecker.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import javax.persistence.EntityListeners;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at EntityListeners(CountryNameCheckerListener.class)
+ at Target(ElementType.TYPE)
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface CountryChecker {
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryNameCheckerListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryNameCheckerListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryNameCheckerListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import java.util.ArrayList;
-import java.util.List;
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CountryNameCheckerListener {
- private List<String> countries = new ArrayList<String>();
-
- {
- countries.add( "France" );
- countries.add( "Netherland" );
- }
-
- @PrePersist
- @PreUpdate
- public void testCountryName(Object object) {
- if ( object instanceof Translation ) {
- Translation tr = (Translation) object;
- if ( ! countries.contains( tr.getInto() ) ) {
- throw new IllegalArgumentException( "Not a country name: " + tr.getInto() );
- }
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryNameCheckerListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryNameCheckerListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryNameCheckerListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/CountryNameCheckerListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CountryNameCheckerListener {
+ private List<String> countries = new ArrayList<String>();
+
+ {
+ countries.add( "France" );
+ countries.add( "Netherland" );
+ }
+
+ @PrePersist
+ @PreUpdate
+ public void testCountryName(Object object) {
+ if ( object instanceof Translation ) {
+ Translation tr = (Translation) object;
+ if ( ! countries.contains( tr.getInto() ) ) {
+ throw new IllegalArgumentException( "Not a country name: " + tr.getInto() );
+ }
+ }
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Customer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Customer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Customer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.Entity;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "CUSTOMER_TABLE")
- at Inheritance(strategy = InheritanceType.JOINED)
-public class Customer extends Person {
- private Employee salesperson;
- private String comments;
-
- @OneToOne
- @JoinColumn(name = "salesperson")
- public Employee getSalesperson() {
- return salesperson;
- }
-
- public void setSalesperson(Employee salesperson) {
- this.salesperson = salesperson;
- }
-
- public String getComments() {
- return comments;
- }
-
- public void setComments(String comments) {
- this.comments = comments;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Customer.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Customer.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Customer.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Customer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "CUSTOMER_TABLE")
+ at Inheritance(strategy = InheritanceType.JOINED)
+public class Customer extends Person {
+ private Employee salesperson;
+ private String comments;
+
+ @OneToOne
+ @JoinColumn(name = "salesperson")
+ public Employee getSalesperson() {
+ return salesperson;
+ }
+
+ public void setSalesperson(Employee salesperson) {
+ this.salesperson = salesperson;
+ }
+
+ public String getComments() {
+ return comments;
+ }
+
+ public void setComments(String comments) {
+ this.comments = comments;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Employee.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Employee.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Employee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,64 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import java.math.BigDecimal;
-import javax.persistence.Entity;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "EMPLOYEE_TABLE")
- at Inheritance(strategy = InheritanceType.JOINED)
-public class Employee extends Person {
- private String title;
- private BigDecimal salary;
- private Employee manager;
-
- /**
- * @return Returns the title.
- */
- public String getTitle() {
- return title;
- }
-
- /**
- * @param title The title to set.
- */
- public void setTitle(String title) {
- this.title = title;
- }
-
- @OneToOne
- @JoinColumn(name = "manager")
- public Employee getManager() {
- return manager;
- }
-
- /**
- * @param manager The manager to set.
- */
- public void setManager(Employee manager) {
- this.manager = manager;
- }
-
- /**
- * @return Returns the salary.
- */
- public BigDecimal getSalary() {
- return salary;
- }
-
- /**
- * @param salary The salary to set.
- */
- public void setSalary(BigDecimal salary) {
- this.salary = salary;
- }
-}
-
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Employee.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Employee.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Employee.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Employee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,64 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import java.math.BigDecimal;
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "EMPLOYEE_TABLE")
+ at Inheritance(strategy = InheritanceType.JOINED)
+public class Employee extends Person {
+ private String title;
+ private BigDecimal salary;
+ private Employee manager;
+
+ /**
+ * @return Returns the title.
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ /**
+ * @param title The title to set.
+ */
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ @OneToOne
+ @JoinColumn(name = "manager")
+ public Employee getManager() {
+ return manager;
+ }
+
+ /**
+ * @param manager The manager to set.
+ */
+ public void setManager(Employee manager) {
+ this.manager = manager;
+ }
+
+ /**
+ * @return Returns the salary.
+ */
+ public BigDecimal getSalary() {
+ return salary;
+ }
+
+ /**
+ * @param salary The salary to set.
+ */
+ public void setSalary(BigDecimal salary) {
+ this.salary = salary;
+ }
+}
+
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/ExceptionListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/ExceptionListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/ExceptionListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.PrePersist;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ExceptionListener {
- @PrePersist
- public void raiseException(Object e) {
- throw new ArithmeticException( "1/0 impossible" );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/ExceptionListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/ExceptionListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/ExceptionListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/ExceptionListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id: $
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.PrePersist;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ExceptionListener {
+ @PrePersist
+ public void raiseException(Object e) {
+ throw new ArithmeticException( "1/0 impossible" );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/FirstOneListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/FirstOneListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/FirstOneListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.PreUpdate;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FirstOneListener {
- @PreUpdate
- public void firstOne(CommunicationSystem object) {
- if ( !object.isFirst ) throw new IllegalStateException();
- object.isFirst = true;
- object.isLast = false;
- object.communication++;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/FirstOneListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/FirstOneListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/FirstOneListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/FirstOneListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.PreUpdate;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FirstOneListener {
+ @PreUpdate
+ public void firstOne(CommunicationSystem object) {
+ if ( !object.isFirst ) throw new IllegalStateException();
+ object.isFirst = true;
+ object.isLast = false;
+ object.communication++;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/IncreaseListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/IncreaseListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/IncreaseListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.PreUpdate;
-
-/**
- * @author Emmanuel Bernard
- */
-public class IncreaseListener {
- @PreUpdate
- public void increate(CommunicationSystem object) {
- object.communication++;
- object.isFirst = false;
- object.isLast = false;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/IncreaseListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/IncreaseListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/IncreaseListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/IncreaseListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.PreUpdate;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IncreaseListener {
+ @PreUpdate
+ public void increate(CommunicationSystem object) {
+ object.communication++;
+ object.isFirst = false;
+ object.isLast = false;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Person.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Person.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Person.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,74 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "PERSON_TABLE")
- at Inheritance(strategy = InheritanceType.JOINED)
-public class Person {
- private long id;
- private String name;
- private String address;
- private String zip;
- private String country;
- private char sex;
-
- @Id
- @GeneratedValue
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public char getSex() {
- return sex;
- }
-
- public void setSex(char sex) {
- this.sex = sex;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String identity) {
- this.name = identity;
- }
-
- public String getCountry() {
- return country;
- }
-
- public void setCountry(String country) {
- this.country = country;
- }
-
- public String getZip() {
- return zip;
- }
-
- public void setZip(String zip) {
- this.zip = zip;
- }
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Person.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Person.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Person.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Person.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,74 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "PERSON_TABLE")
+ at Inheritance(strategy = InheritanceType.JOINED)
+public class Person {
+ private long id;
+ private String name;
+ private String address;
+ private String zip;
+ private String country;
+ private char sex;
+
+ @Id
+ @GeneratedValue
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public char getSex() {
+ return sex;
+ }
+
+ public void setSex(char sex) {
+ this.sex = sex;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String identity) {
+ this.name = identity;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ public String getZip() {
+ return zip;
+ }
+
+ public void setZip(String zip) {
+ this.zip = zip;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Plant.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Plant.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Plant.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.Id;
-import javax.persistence.Entity;
-import javax.persistence.PrePersist;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Plant {
- @Id
- private String id;
- private String name;
-
- public String getId() {
- return id;
- }
-
- public void setId(String id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @PrePersist
- private void defineId() {
- //some (stupid) id generation
- if ( name.length() > 5 ) {
- setId( name.substring( 0, 5 ) );
- }
- else {
- setId( name );
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Plant.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Plant.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Plant.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Plant.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id: $
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.Id;
+import javax.persistence.Entity;
+import javax.persistence.PrePersist;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Plant {
+ @Id
+ private String id;
+ private String name;
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @PrePersist
+ private void defineId() {
+ //some (stupid) id generation
+ if ( name.length() > 5 ) {
+ setId( name.substring( 0, 5 ) );
+ }
+ else {
+ setId( name );
+ }
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/RemoteControl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/RemoteControl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/RemoteControl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import java.util.Date;
-import javax.persistence.Basic;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.PrePersist;
-import javax.persistence.Temporal;
-import javax.persistence.TemporalType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class RemoteControl {
- private Integer id;
- private Date creationDate;
-
- @Basic
- @Temporal(TemporalType.TIMESTAMP)
- public Date getCreationDate() {
- return creationDate;
- }
-
- public void setCreationDate(Date creationDate) {
- this.creationDate = creationDate;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @PrePersist
- private void init() {
- creationDate = new Date();
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/RemoteControl.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/RemoteControl.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/RemoteControl.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/RemoteControl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import java.util.Date;
+import javax.persistence.Basic;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.PrePersist;
+import javax.persistence.Temporal;
+import javax.persistence.TemporalType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class RemoteControl {
+ private Integer id;
+ private Date creationDate;
+
+ @Basic
+ @Temporal(TemporalType.TIMESTAMP)
+ public Date getCreationDate() {
+ return creationDate;
+ }
+
+ public void setCreationDate(Date creationDate) {
+ this.creationDate = creationDate;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @PrePersist
+ private void init() {
+ creationDate = new Date();
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Rythm.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Rythm.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Rythm.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at EntityListeners(ExceptionListener.class)
-public class Rythm {
- @Id @GeneratedValue private Integer id;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Rythm.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Rythm.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Rythm.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Rythm.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at EntityListeners(ExceptionListener.class)
+public class Rythm {
+ @Id @GeneratedValue private Integer id;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Television.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Television.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Television.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,64 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-import javax.persistence.PreUpdate;
-import javax.persistence.PrePersist;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at EntityListeners({IncreaseListener.class})
-public class Television extends VideoSystem {
- private Integer id;
- private RemoteControl control;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @OneToOne(cascade = CascadeType.ALL)
- public RemoteControl getControl() {
- return control;
- }
-
- public void setControl(RemoteControl control) {
- this.control = control;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @PreUpdate
- public void isLast() {
- if ( isLast ) throw new IllegalStateException();
- isFirst = false;
- isLast = true;
- communication++;
- }
-
- @PrePersist
- public void prepareEntity() {
- //override a super method annotated with the same
- // event for it not to be called
- counter++;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Television.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Television.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Television.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Television.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,64 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+import javax.persistence.PreUpdate;
+import javax.persistence.PrePersist;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at EntityListeners({IncreaseListener.class})
+public class Television extends VideoSystem {
+ private Integer id;
+ private RemoteControl control;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @OneToOne(cascade = CascadeType.ALL)
+ public RemoteControl getControl() {
+ return control;
+ }
+
+ public void setControl(RemoteControl control) {
+ this.control = control;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @PreUpdate
+ public void isLast() {
+ if ( isLast ) throw new IllegalStateException();
+ isFirst = false;
+ isLast = true;
+ communication++;
+ }
+
+ @PrePersist
+ public void prepareEntity() {
+ //override a super method annotated with the same
+ // event for it not to be called
+ counter++;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Translation.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Translation.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Translation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "Translatn")
- at CountryChecker
-public class Translation {
- private Integer id;
- private String into;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Column(name = "country_into")
- public String getInto() {
- return into;
- }
-
- public void setInto(String into) {
- this.into = into;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Translation.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Translation.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Translation.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/Translation.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "Translatn")
+ at CountryChecker
+public class Translation {
+ private Integer id;
+ private String into;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Column(name = "country_into")
+ public String getInto() {
+ return into;
+ }
+
+ public void setInto(String into) {
+ this.into = into;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/VideoSystem.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/VideoSystem.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/VideoSystem.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.callbacks;
-
-import javax.persistence.EntityListeners;
-import javax.persistence.ExcludeSuperclassListeners;
-import javax.persistence.MappedSuperclass;
-import javax.persistence.PreUpdate;
-import javax.persistence.PrePersist;
-
-/**
- * @author Emmanuel Bernard
- */
- at ExcludeSuperclassListeners
- at EntityListeners({FirstOneListener.class, IncreaseListener.class})
- at MappedSuperclass
-public class VideoSystem extends CommunicationSystem {
- public transient int counter = 0;
- @PreUpdate
- public void increase() {
- isFirst = false;
- isLast = false;
- communication++;
- }
-
- @PrePersist
- public void prepareEntity() {
- counter++;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/VideoSystem.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/VideoSystem.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/VideoSystem.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/callbacks/VideoSystem.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id$
+package org.hibernate.ejb.test.callbacks;
+
+import javax.persistence.EntityListeners;
+import javax.persistence.ExcludeSuperclassListeners;
+import javax.persistence.MappedSuperclass;
+import javax.persistence.PreUpdate;
+import javax.persistence.PrePersist;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at ExcludeSuperclassListeners
+ at EntityListeners({FirstOneListener.class, IncreaseListener.class})
+ at MappedSuperclass
+public class VideoSystem extends CommunicationSystem {
+ public transient int counter = 0;
+ @PreUpdate
+ public void increase() {
+ isFirst = false;
+ isLast = false;
+ communication++;
+ }
+
+ @PrePersist
+ public void prepareEntity() {
+ counter++;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Author.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Author.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Author.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.cascade;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.SequenceGenerator;
-import javax.persistence.GenerationType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Author {
- @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ENTITY2_SEQ")
- @SequenceGenerator(name = "ENTITY2_SEQ")
- private Long id;
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Author.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Author.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Author.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Author.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id: $
+package org.hibernate.ejb.test.cascade;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.SequenceGenerator;
+import javax.persistence.GenerationType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Author {
+ @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ENTITY2_SEQ")
+ @SequenceGenerator(name = "ENTITY2_SEQ")
+ private Long id;
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/CascadeTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/CascadeTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/CascadeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,96 +0,0 @@
-//$Id: FetchTest.java 9796 2006-04-26 06:46:52Z epbernard $
-package org.hibernate.ejb.test.cascade;
-
-import javax.persistence.EntityManager;
-import javax.persistence.EntityTransaction;
-
-import org.hibernate.ejb.test.TestCase;
-
-
-/**
- * @author Max Rydahl Andersen
- */
-public class CascadeTest extends TestCase {
-
- public void testCascade() throws Exception {
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
-
- Teacher teacher = null;
-
- teacher = new Teacher();
-
- Student student = new Student();
-
- teacher.setFavoriteStudent(student);
- student.setFavoriteTeacher(teacher);
-
- teacher.getStudents().add(student);
- student.setPrimaryTeacher(teacher);
-
- em.persist( teacher );
- em.getTransaction().commit();
-
- System.out.println("***************************");
- em = factory.createEntityManager();
- em.getTransaction().begin();
-
- Teacher foundTeacher = (Teacher) em.createQuery( "select t from Teacher as t" ).getSingleResult();
-
- System.out.println(foundTeacher);
- System.out.println(foundTeacher.getFavoriteStudent());
-
- for (Student fstudent : foundTeacher.getStudents()) {
- System.out.println(fstudent);
- System.out.println(fstudent.getFavoriteTeacher());
- System.out.println(fstudent.getPrimaryTeacher());
- }
-
- em.getTransaction().commit(); // here *alot* of flushes occur on an object graph that has *Zero* changes.
- em.close();
-
-
- }
-
- public void testNoCascadeAndMerge() throws Exception {
- Song e1 = new Song();
- Author e2 = new Author();
-
- e1.setAuthor(e2);
-
- EntityManager em = factory.createEntityManager();
- EntityTransaction tx = em.getTransaction();
- tx.begin();
- em.persist(e2);
- em.persist(e1);
- tx.commit();
- em.close();
-
- em = factory.createEntityManager();
-
- e1 = em.find(Song.class, e1.getId());
- e2 = null;
-
-
- tx = em.getTransaction();
- tx.begin();
- em.merge(e1);
- //em.refresh(e1);
- tx.commit();
- em.close();
-
- }
-
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Teacher.class,
- Student.class,
- Song.class,
- Author.class
- };
- }
-
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/CascadeTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/CascadeTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/CascadeTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/CascadeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,96 @@
+//$Id: FetchTest.java 9796 2006-04-26 06:46:52Z epbernard $
+package org.hibernate.ejb.test.cascade;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityTransaction;
+
+import org.hibernate.ejb.test.TestCase;
+
+
+/**
+ * @author Max Rydahl Andersen
+ */
+public class CascadeTest extends TestCase {
+
+ public void testCascade() throws Exception {
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+
+ Teacher teacher = null;
+
+ teacher = new Teacher();
+
+ Student student = new Student();
+
+ teacher.setFavoriteStudent(student);
+ student.setFavoriteTeacher(teacher);
+
+ teacher.getStudents().add(student);
+ student.setPrimaryTeacher(teacher);
+
+ em.persist( teacher );
+ em.getTransaction().commit();
+
+ System.out.println("***************************");
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+
+ Teacher foundTeacher = (Teacher) em.createQuery( "select t from Teacher as t" ).getSingleResult();
+
+ System.out.println(foundTeacher);
+ System.out.println(foundTeacher.getFavoriteStudent());
+
+ for (Student fstudent : foundTeacher.getStudents()) {
+ System.out.println(fstudent);
+ System.out.println(fstudent.getFavoriteTeacher());
+ System.out.println(fstudent.getPrimaryTeacher());
+ }
+
+ em.getTransaction().commit(); // here *alot* of flushes occur on an object graph that has *Zero* changes.
+ em.close();
+
+
+ }
+
+ public void testNoCascadeAndMerge() throws Exception {
+ Song e1 = new Song();
+ Author e2 = new Author();
+
+ e1.setAuthor(e2);
+
+ EntityManager em = factory.createEntityManager();
+ EntityTransaction tx = em.getTransaction();
+ tx.begin();
+ em.persist(e2);
+ em.persist(e1);
+ tx.commit();
+ em.close();
+
+ em = factory.createEntityManager();
+
+ e1 = em.find(Song.class, e1.getId());
+ e2 = null;
+
+
+ tx = em.getTransaction();
+ tx.begin();
+ em.merge(e1);
+ //em.refresh(e1);
+ tx.commit();
+ em.close();
+
+ }
+
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Teacher.class,
+ Student.class,
+ Song.class,
+ Author.class
+ };
+ }
+
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Conference.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Conference.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Conference.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,79 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.cascade;
-
-import java.io.Serializable;
-import java.util.Date;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.DiscriminatorColumn;
-import javax.persistence.DiscriminatorType;
-import javax.persistence.DiscriminatorValue;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "portal_pk_conference")
- at Inheritance(strategy = InheritanceType.SINGLE_TABLE)
- at DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.CHAR)
- at DiscriminatorValue("X")
- at org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
-public class Conference implements Serializable {
- private Long id;
- private Date date;
- private ExtractionDocumentInfo extractionDocument;
-
- @OneToOne(mappedBy = "conference", cascade = CascadeType.ALL)
- public ExtractionDocumentInfo getExtractionDocument() {
- return extractionDocument;
- }
-
- public void setExtractionDocument(ExtractionDocumentInfo extractionDocument) {
- this.extractionDocument = extractionDocument;
- }
-
-
- public Conference() {
- date = new Date();
- }
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- @Column(name = "c_date", nullable = false)
- public Date getDate() {
- return date;
- }
-
- public void setDate(Date date) {
- this.date = date;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final Conference that = (Conference) o;
-
- return !( date != null ? !date.equals( that.date ) : that.date != null );
-
- }
-
- public int hashCode() {
- return ( date != null ? date.hashCode() : 0 );
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Conference.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Conference.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Conference.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Conference.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,79 @@
+//$Id$
+package org.hibernate.ejb.test.cascade;
+
+import java.io.Serializable;
+import java.util.Date;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.DiscriminatorColumn;
+import javax.persistence.DiscriminatorType;
+import javax.persistence.DiscriminatorValue;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "portal_pk_conference")
+ at Inheritance(strategy = InheritanceType.SINGLE_TABLE)
+ at DiscriminatorColumn(name = "type", discriminatorType = DiscriminatorType.CHAR)
+ at DiscriminatorValue("X")
+ at org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
+public class Conference implements Serializable {
+ private Long id;
+ private Date date;
+ private ExtractionDocumentInfo extractionDocument;
+
+ @OneToOne(mappedBy = "conference", cascade = CascadeType.ALL)
+ public ExtractionDocumentInfo getExtractionDocument() {
+ return extractionDocument;
+ }
+
+ public void setExtractionDocument(ExtractionDocumentInfo extractionDocument) {
+ this.extractionDocument = extractionDocument;
+ }
+
+
+ public Conference() {
+ date = new Date();
+ }
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @Column(name = "c_date", nullable = false)
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final Conference that = (Conference) o;
+
+ return !( date != null ? !date.equals( that.date ) : that.date != null );
+
+ }
+
+ public int hashCode() {
+ return ( date != null ? date.hashCode() : 0 );
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/DeleteOrphanTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/DeleteOrphanTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/DeleteOrphanTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,91 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.cascade;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityTransaction;
-
-import org.hibernate.Hibernate;
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DeleteOrphanTest extends TestCase {
- public void testDeleteOrphan() throws Exception {
- EntityTransaction tx;
-
- EntityManager em = factory.createEntityManager();
- tx = em.getTransaction();
- tx.begin();
- Troop disney = new Troop();
-
- disney.setName( "Disney" );
- Soldier mickey = new Soldier();
- mickey.setName( "Mickey" );
- disney.addSoldier( mickey );
- em.persist( disney );
- tx.commit();
- em.close();
-
- em = factory.createEntityManager();
- tx = em.getTransaction();
- tx.begin();
- Troop troop = em.find( Troop.class, disney.getId() );
- Hibernate.initialize( troop.getSoldiers() );
- tx.commit();
- em.close();
-
- Soldier soldier = troop.getSoldiers().iterator().next();
- troop.getSoldiers().remove( soldier );
- troop = (Troop) unserialize( serialize( troop ) );
-
- em = factory.createEntityManager();
- tx = em.getTransaction();
- tx.begin();
- em.merge( troop );
- tx.commit();
- em.close();
-
- em = factory.createEntityManager();
- tx = em.getTransaction();
- tx.begin();
- soldier = em.find( Soldier.class, mickey.getId() );
- assertNull( "delete-orphan should work", soldier );
- troop = em.find( Troop.class, disney.getId() );
- em.remove( troop );
- tx.commit();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Troop.class,
- Soldier.class
- };
- }
-
- private byte[] serialize(Object object) throws IOException {
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- ObjectOutput out = new ObjectOutputStream( stream );
- out.writeObject( object );
- out.close();
- byte[] serialized = stream.toByteArray();
- stream.close();
- return serialized;
- }
-
- private Object unserialize(byte[] serialized) throws IOException, ClassNotFoundException {
- ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
- ObjectInputStream in = new ObjectInputStream( byteIn );
- Object result = in.readObject();
- in.close();
- byteIn.close();
- return result;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/DeleteOrphanTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/DeleteOrphanTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/DeleteOrphanTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/DeleteOrphanTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,91 @@
+//$Id$
+package org.hibernate.ejb.test.cascade;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityTransaction;
+
+import org.hibernate.Hibernate;
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DeleteOrphanTest extends TestCase {
+ public void testDeleteOrphan() throws Exception {
+ EntityTransaction tx;
+
+ EntityManager em = factory.createEntityManager();
+ tx = em.getTransaction();
+ tx.begin();
+ Troop disney = new Troop();
+
+ disney.setName( "Disney" );
+ Soldier mickey = new Soldier();
+ mickey.setName( "Mickey" );
+ disney.addSoldier( mickey );
+ em.persist( disney );
+ tx.commit();
+ em.close();
+
+ em = factory.createEntityManager();
+ tx = em.getTransaction();
+ tx.begin();
+ Troop troop = em.find( Troop.class, disney.getId() );
+ Hibernate.initialize( troop.getSoldiers() );
+ tx.commit();
+ em.close();
+
+ Soldier soldier = troop.getSoldiers().iterator().next();
+ troop.getSoldiers().remove( soldier );
+ troop = (Troop) unserialize( serialize( troop ) );
+
+ em = factory.createEntityManager();
+ tx = em.getTransaction();
+ tx.begin();
+ em.merge( troop );
+ tx.commit();
+ em.close();
+
+ em = factory.createEntityManager();
+ tx = em.getTransaction();
+ tx.begin();
+ soldier = em.find( Soldier.class, mickey.getId() );
+ assertNull( "delete-orphan should work", soldier );
+ troop = em.find( Troop.class, disney.getId() );
+ em.remove( troop );
+ tx.commit();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Troop.class,
+ Soldier.class
+ };
+ }
+
+ private byte[] serialize(Object object) throws IOException {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ ObjectOutput out = new ObjectOutputStream( stream );
+ out.writeObject( object );
+ out.close();
+ byte[] serialized = stream.toByteArray();
+ stream.close();
+ return serialized;
+ }
+
+ private Object unserialize(byte[] serialized) throws IOException, ClassNotFoundException {
+ ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
+ ObjectInputStream in = new ObjectInputStream( byteIn );
+ Object result = in.readObject();
+ in.close();
+ byteIn.close();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocument.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocument.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocument.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,64 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.cascade;
-
-import java.io.Serializable;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.OneToOne;
-import javax.persistence.Table;
-
-import org.hibernate.annotations.Proxy;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "portal_pk_docs_extraction")
-//@Cache(usage = READ_WRITE)
- at org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
- at Proxy
-public class ExtractionDocument implements Serializable {
- private Long id;
- private byte[] body;
- private ExtractionDocumentInfo documentInfo;
-
- public ExtractionDocument() {
- }
-
- public ExtractionDocument(ExtractionDocumentInfo documentInfo) {
- this.documentInfo = documentInfo;
- }
-
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- @OneToOne
- @JoinColumn(name = "document_info_id")
- public ExtractionDocumentInfo getDocumentInfo() {
- return documentInfo;
- }
-
- public void setDocumentInfo(ExtractionDocumentInfo documentInfo) {
- this.documentInfo = documentInfo;
- }
-
- @Column(nullable = false)
- public byte[] getBody() {
- return body;
- }
-
- public void setBody(byte[] body) {
- this.body = body;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocument.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocument.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocument.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocument.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,64 @@
+//$Id$
+package org.hibernate.ejb.test.cascade;
+
+import java.io.Serializable;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.OneToOne;
+import javax.persistence.Table;
+
+import org.hibernate.annotations.Proxy;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "portal_pk_docs_extraction")
+//@Cache(usage = READ_WRITE)
+ at org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
+ at Proxy
+public class ExtractionDocument implements Serializable {
+ private Long id;
+ private byte[] body;
+ private ExtractionDocumentInfo documentInfo;
+
+ public ExtractionDocument() {
+ }
+
+ public ExtractionDocument(ExtractionDocumentInfo documentInfo) {
+ this.documentInfo = documentInfo;
+ }
+
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @OneToOne
+ @JoinColumn(name = "document_info_id")
+ public ExtractionDocumentInfo getDocumentInfo() {
+ return documentInfo;
+ }
+
+ public void setDocumentInfo(ExtractionDocumentInfo documentInfo) {
+ this.documentInfo = documentInfo;
+ }
+
+ @Column(nullable = false)
+ public byte[] getBody() {
+ return body;
+ }
+
+ public void setBody(byte[] body) {
+ this.body = body;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocumentInfo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocumentInfo.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocumentInfo.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,121 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.cascade;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Iterator;
-import java.util.List;
-import javax.persistence.CascadeType;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-import javax.persistence.PreRemove;
-import javax.persistence.Table;
-import javax.persistence.Transient;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "portal_pk_docs_extraction_info")
-//@Cache(usage = READ_WRITE)
- at org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
-public class ExtractionDocumentInfo implements Serializable {
- private Long id;
- private Date lastModified;
- private Conference conference;
- private List<ExtractionDocument> documents;
-
-
- public ExtractionDocumentInfo() {
- lastModified = new Date();
- }
-
- public ExtractionDocumentInfo(Conference conference) {
- this.conference = conference;
- lastModified = new Date();
- documents = new ArrayList<ExtractionDocument>();
- documents.add( new ExtractionDocument( this ) );
- }
-
- @Transient
- public ExtractionDocument getDocument() {
- if ( documents.isEmpty() ) {
- documents.add( new ExtractionDocument( this ) );
- }
- Iterator<ExtractionDocument> iterator = documents.iterator();
- return iterator.next();
- }
-
- @Transient
- public byte[] getBody() {
- return getDocument().getBody();
- }
-
- public void setBody(byte[] body) {
- getDocument().setBody( body );
- }
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- @OneToMany(mappedBy = "documentInfo", cascade = CascadeType.ALL)
- public List<ExtractionDocument> getDocuments() {
- return documents;
- }
-
- public void setDocuments(List<ExtractionDocument> documents) {
- this.documents = documents;
- }
-
-
- @ManyToOne
- @JoinColumn(name = "conference_id")
- public Conference getConference() {
- return conference;
- }
-
- public void setConference(Conference conference) {
- this.conference = conference;
- }
-
- @Column(name = "last_modified", nullable = false)
- public Date getLastModified() {
- return lastModified;
- }
-
- public void setLastModified(Date lastModified) {
- this.lastModified = lastModified;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof ExtractionDocumentInfo ) ) return false;
-
- final ExtractionDocumentInfo newsInfo = (ExtractionDocumentInfo) o;
-
- return id.equals( newsInfo.id );
- }
-
- public int hashCode() {
- return id.hashCode();
- }
-
- @PreRemove
- public void preRemove() {
- getConference().setExtractionDocument( null );
- }
-}
-
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocumentInfo.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocumentInfo.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocumentInfo.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/ExtractionDocumentInfo.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,121 @@
+//$Id$
+package org.hibernate.ejb.test.cascade;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.List;
+import javax.persistence.CascadeType;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+import javax.persistence.PreRemove;
+import javax.persistence.Table;
+import javax.persistence.Transient;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "portal_pk_docs_extraction_info")
+//@Cache(usage = READ_WRITE)
+ at org.hibernate.annotations.Entity(dynamicInsert = true, dynamicUpdate = true)
+public class ExtractionDocumentInfo implements Serializable {
+ private Long id;
+ private Date lastModified;
+ private Conference conference;
+ private List<ExtractionDocument> documents;
+
+
+ public ExtractionDocumentInfo() {
+ lastModified = new Date();
+ }
+
+ public ExtractionDocumentInfo(Conference conference) {
+ this.conference = conference;
+ lastModified = new Date();
+ documents = new ArrayList<ExtractionDocument>();
+ documents.add( new ExtractionDocument( this ) );
+ }
+
+ @Transient
+ public ExtractionDocument getDocument() {
+ if ( documents.isEmpty() ) {
+ documents.add( new ExtractionDocument( this ) );
+ }
+ Iterator<ExtractionDocument> iterator = documents.iterator();
+ return iterator.next();
+ }
+
+ @Transient
+ public byte[] getBody() {
+ return getDocument().getBody();
+ }
+
+ public void setBody(byte[] body) {
+ getDocument().setBody( body );
+ }
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @OneToMany(mappedBy = "documentInfo", cascade = CascadeType.ALL)
+ public List<ExtractionDocument> getDocuments() {
+ return documents;
+ }
+
+ public void setDocuments(List<ExtractionDocument> documents) {
+ this.documents = documents;
+ }
+
+
+ @ManyToOne
+ @JoinColumn(name = "conference_id")
+ public Conference getConference() {
+ return conference;
+ }
+
+ public void setConference(Conference conference) {
+ this.conference = conference;
+ }
+
+ @Column(name = "last_modified", nullable = false)
+ public Date getLastModified() {
+ return lastModified;
+ }
+
+ public void setLastModified(Date lastModified) {
+ this.lastModified = lastModified;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof ExtractionDocumentInfo ) ) return false;
+
+ final ExtractionDocumentInfo newsInfo = (ExtractionDocumentInfo) o;
+
+ return id.equals( newsInfo.id );
+ }
+
+ public int hashCode() {
+ return id.hashCode();
+ }
+
+ @PreRemove
+ public void preRemove() {
+ getConference().setExtractionDocument( null );
+ }
+}
+
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,216 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.cascade;
-
-import java.util.ArrayList;
-import java.util.Date;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityTransaction;
-import javax.persistence.Query;
-
-import org.hibernate.Hibernate;
-import org.hibernate.ejb.HibernateEntityManager;
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FetchTest extends TestCase {
-
- public void testCascadeAndFetchCollection() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Troop disney = new Troop();
- disney.setName( "Disney" );
- Soldier mickey = new Soldier();
- mickey.setName( "Mickey" );
- disney.addSoldier( mickey );
- em.persist( disney );
- em.getTransaction().commit();
- em.close();
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
- Troop troop = em.find( Troop.class, disney.getId() );
- assertFalse( Hibernate.isInitialized( troop.getSoldiers() ) );
- em.getTransaction().commit();
- assertFalse( Hibernate.isInitialized( troop.getSoldiers() ) );
- em.close();
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
- troop = em.find( Troop.class, disney.getId() );
- em.remove( troop );
- //Fail because of HHH-1187
- em.getTransaction().commit();
- em.close();
- }
-
- public void testCascadeAndFetchEntity() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Troop disney = new Troop();
- disney.setName( "Disney" );
- Soldier mickey = new Soldier();
- mickey.setName( "Mickey" );
- disney.addSoldier( mickey );
- em.persist( disney );
- em.getTransaction().commit();
- em.close();
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
- Soldier soldier = em.find( Soldier.class, mickey.getId() );
- assertFalse( Hibernate.isInitialized( soldier.getTroop() ) );
- em.getTransaction().commit();
- assertFalse( Hibernate.isInitialized( soldier.getTroop() ) );
- em.close();
- em = factory.createEntityManager();
- em.getTransaction().begin();
- Troop troop = em.find( Troop.class, disney.getId() );
- em.remove( troop );
- //Fail because of HHH-1187
- em.getTransaction().commit();
- em.close();
- }
-
- public void testTwoLevelDeepPersist() throws Exception {
- EntityTransaction tx;
-
- EntityManager em = factory.createEntityManager();
- tx = em.getTransaction();
- tx.begin();
- Conference jbwBarcelona = new Conference();
- jbwBarcelona.setDate( new Date() );
- ExtractionDocumentInfo info = new ExtractionDocumentInfo();
- info.setConference( jbwBarcelona );
- jbwBarcelona.setExtractionDocument( info );
- info.setLastModified( new Date() );
- ExtractionDocument doc = new ExtractionDocument();
- doc.setDocumentInfo( info );
- info.setDocuments( new ArrayList<ExtractionDocument>() );
- info.getDocuments().add( doc );
- doc.setBody( new byte[]{'c', 'f'} );
- em.persist( jbwBarcelona );
- tx.commit();
- em.close();
-
- em = factory.createEntityManager();
- tx = em.getTransaction();
- tx.begin();
- jbwBarcelona = em.find( Conference.class, jbwBarcelona.getId() );
- assertTrue( Hibernate.isInitialized( jbwBarcelona ) );
- assertTrue( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument() ) );
- assertFalse( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument().getDocuments() ) );
- em.flush();
- assertTrue( Hibernate.isInitialized( jbwBarcelona ) );
- assertTrue( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument() ) );
- assertFalse( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument().getDocuments() ) );
- em.remove( jbwBarcelona );
- tx.commit();
- em.close();
- }
-
- public void testTwoLevelDeepPersistOnManyToOne() throws Exception {
- EntityTransaction tx;
- EntityManager em = factory.createEntityManager();
- tx = em.getTransaction();
- tx.begin();
- Grandson gs = new Grandson();
- gs.setParent( new Son() );
- gs.getParent().setParent( new Parent() );
- em.persist( gs );
- tx.commit();
- em.close();
- em = factory.createEntityManager();
- tx = em.getTransaction();
- tx.begin();
- gs = em.find( Grandson.class, gs.getId() );
- em.flush();
- assertTrue( Hibernate.isInitialized( gs.getParent() ) );
- assertFalse( Hibernate.isInitialized( gs.getParent().getParent() ) );
- em.remove( gs );
- tx.commit();
- em.close();
- }
-
- public void testPerfCascadeAndFetchEntity() throws Exception {
- EntityManager em = factory.createEntityManager();
- //init data
- em.getTransaction().begin();
- int loop = 50;
- for ( int i = 0; i < loop ; i++ ) {
- Troop disney = new Troop();
- disney.setName( "Disney" );
- Soldier mickey = new Soldier();
- mickey.setName( "Mickey" );
- disney.addSoldier( mickey );
- em.persist( disney );
- }
- em.getTransaction().commit();
- em.close();
-
- //Warm up loop
- em = factory.createEntityManager();
- em.getTransaction().begin();
- for ( int i = 0; i < loop ; i++ ) {
- //Soldier soldier = em.find( Soldier.class, new Integer(i) );
- Troop troop = em.find( Troop.class, new Integer( i ) );
- //( ( HibernateEntityManager ) em ).getSession().evict(soldier);
- }
- long l11 = System.currentTimeMillis();
- Query query = em.createQuery( "SELECT count(t) FROM Soldier t" );
- query.getSingleResult();
- long l2 = System.currentTimeMillis();
- System.out.println( "Query1 " + ( l2 - l11 ) );
- em.getTransaction().commit();
- em.close();
-
- //do not evict
- for ( int j = 0; j < 10 ; j++ ) {
- em = factory.createEntityManager();
- em.getTransaction().begin();
- for ( int i = 0; i < loop ; i++ ) {
- Troop troop = em.find( Troop.class, new Integer( i ) );
- ( (HibernateEntityManager) em ).getSession().evict( troop );
- }
- l11 = System.currentTimeMillis();
- query = em.createQuery( "SELECT count(t) FROM Soldier t" );
- query.getSingleResult();
- l2 = System.currentTimeMillis();
- System.out.println( "Query " + ( l2 - l11 ) );
- em.getTransaction().commit();
- em.close();
-
- //evict
- em = factory.createEntityManager();
- em.getTransaction().begin();
- for ( int i = 0; i < loop ; i++ ) {
- //Soldier soldier = em.find( Soldier.class, new Integer(i) );
- Troop troop = em.find( Troop.class, new Integer( i ) );
-
- //( ( HibernateEntityManager ) em ).getSession().evict(troop);
- }
- l11 = System.currentTimeMillis();
- query = em.createQuery( "SELECT count(t) FROM Soldier t" );
- query.getSingleResult();
- l2 = System.currentTimeMillis();
- System.out.println( "Query " + ( l2 - l11 ) );
- em.getTransaction().commit();
- }
- em.close();
- }
-
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Troop.class,
- Soldier.class,
- Conference.class,
- ExtractionDocument.class,
- ExtractionDocumentInfo.class,
- Parent.class,
- Son.class,
- Grandson.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,216 @@
+//$Id$
+package org.hibernate.ejb.test.cascade;
+
+import java.util.ArrayList;
+import java.util.Date;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityTransaction;
+import javax.persistence.Query;
+
+import org.hibernate.Hibernate;
+import org.hibernate.ejb.HibernateEntityManager;
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FetchTest extends TestCase {
+
+ public void testCascadeAndFetchCollection() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Troop disney = new Troop();
+ disney.setName( "Disney" );
+ Soldier mickey = new Soldier();
+ mickey.setName( "Mickey" );
+ disney.addSoldier( mickey );
+ em.persist( disney );
+ em.getTransaction().commit();
+ em.close();
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Troop troop = em.find( Troop.class, disney.getId() );
+ assertFalse( Hibernate.isInitialized( troop.getSoldiers() ) );
+ em.getTransaction().commit();
+ assertFalse( Hibernate.isInitialized( troop.getSoldiers() ) );
+ em.close();
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ troop = em.find( Troop.class, disney.getId() );
+ em.remove( troop );
+ //Fail because of HHH-1187
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testCascadeAndFetchEntity() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Troop disney = new Troop();
+ disney.setName( "Disney" );
+ Soldier mickey = new Soldier();
+ mickey.setName( "Mickey" );
+ disney.addSoldier( mickey );
+ em.persist( disney );
+ em.getTransaction().commit();
+ em.close();
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Soldier soldier = em.find( Soldier.class, mickey.getId() );
+ assertFalse( Hibernate.isInitialized( soldier.getTroop() ) );
+ em.getTransaction().commit();
+ assertFalse( Hibernate.isInitialized( soldier.getTroop() ) );
+ em.close();
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Troop troop = em.find( Troop.class, disney.getId() );
+ em.remove( troop );
+ //Fail because of HHH-1187
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testTwoLevelDeepPersist() throws Exception {
+ EntityTransaction tx;
+
+ EntityManager em = factory.createEntityManager();
+ tx = em.getTransaction();
+ tx.begin();
+ Conference jbwBarcelona = new Conference();
+ jbwBarcelona.setDate( new Date() );
+ ExtractionDocumentInfo info = new ExtractionDocumentInfo();
+ info.setConference( jbwBarcelona );
+ jbwBarcelona.setExtractionDocument( info );
+ info.setLastModified( new Date() );
+ ExtractionDocument doc = new ExtractionDocument();
+ doc.setDocumentInfo( info );
+ info.setDocuments( new ArrayList<ExtractionDocument>() );
+ info.getDocuments().add( doc );
+ doc.setBody( new byte[]{'c', 'f'} );
+ em.persist( jbwBarcelona );
+ tx.commit();
+ em.close();
+
+ em = factory.createEntityManager();
+ tx = em.getTransaction();
+ tx.begin();
+ jbwBarcelona = em.find( Conference.class, jbwBarcelona.getId() );
+ assertTrue( Hibernate.isInitialized( jbwBarcelona ) );
+ assertTrue( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument() ) );
+ assertFalse( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument().getDocuments() ) );
+ em.flush();
+ assertTrue( Hibernate.isInitialized( jbwBarcelona ) );
+ assertTrue( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument() ) );
+ assertFalse( Hibernate.isInitialized( jbwBarcelona.getExtractionDocument().getDocuments() ) );
+ em.remove( jbwBarcelona );
+ tx.commit();
+ em.close();
+ }
+
+ public void testTwoLevelDeepPersistOnManyToOne() throws Exception {
+ EntityTransaction tx;
+ EntityManager em = factory.createEntityManager();
+ tx = em.getTransaction();
+ tx.begin();
+ Grandson gs = new Grandson();
+ gs.setParent( new Son() );
+ gs.getParent().setParent( new Parent() );
+ em.persist( gs );
+ tx.commit();
+ em.close();
+ em = factory.createEntityManager();
+ tx = em.getTransaction();
+ tx.begin();
+ gs = em.find( Grandson.class, gs.getId() );
+ em.flush();
+ assertTrue( Hibernate.isInitialized( gs.getParent() ) );
+ assertFalse( Hibernate.isInitialized( gs.getParent().getParent() ) );
+ em.remove( gs );
+ tx.commit();
+ em.close();
+ }
+
+ public void testPerfCascadeAndFetchEntity() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ //init data
+ em.getTransaction().begin();
+ int loop = 50;
+ for ( int i = 0; i < loop ; i++ ) {
+ Troop disney = new Troop();
+ disney.setName( "Disney" );
+ Soldier mickey = new Soldier();
+ mickey.setName( "Mickey" );
+ disney.addSoldier( mickey );
+ em.persist( disney );
+ }
+ em.getTransaction().commit();
+ em.close();
+
+ //Warm up loop
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ for ( int i = 0; i < loop ; i++ ) {
+ //Soldier soldier = em.find( Soldier.class, new Integer(i) );
+ Troop troop = em.find( Troop.class, new Integer( i ) );
+ //( ( HibernateEntityManager ) em ).getSession().evict(soldier);
+ }
+ long l11 = System.currentTimeMillis();
+ Query query = em.createQuery( "SELECT count(t) FROM Soldier t" );
+ query.getSingleResult();
+ long l2 = System.currentTimeMillis();
+ System.out.println( "Query1 " + ( l2 - l11 ) );
+ em.getTransaction().commit();
+ em.close();
+
+ //do not evict
+ for ( int j = 0; j < 10 ; j++ ) {
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ for ( int i = 0; i < loop ; i++ ) {
+ Troop troop = em.find( Troop.class, new Integer( i ) );
+ ( (HibernateEntityManager) em ).getSession().evict( troop );
+ }
+ l11 = System.currentTimeMillis();
+ query = em.createQuery( "SELECT count(t) FROM Soldier t" );
+ query.getSingleResult();
+ l2 = System.currentTimeMillis();
+ System.out.println( "Query " + ( l2 - l11 ) );
+ em.getTransaction().commit();
+ em.close();
+
+ //evict
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ for ( int i = 0; i < loop ; i++ ) {
+ //Soldier soldier = em.find( Soldier.class, new Integer(i) );
+ Troop troop = em.find( Troop.class, new Integer( i ) );
+
+ //( ( HibernateEntityManager ) em ).getSession().evict(troop);
+ }
+ l11 = System.currentTimeMillis();
+ query = em.createQuery( "SELECT count(t) FROM Soldier t" );
+ query.getSingleResult();
+ l2 = System.currentTimeMillis();
+ System.out.println( "Query " + ( l2 - l11 ) );
+ em.getTransaction().commit();
+ }
+ em.close();
+ }
+
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Troop.class,
+ Soldier.class,
+ Conference.class,
+ ExtractionDocument.class,
+ ExtractionDocumentInfo.class,
+ Parent.class,
+ Son.class,
+ Grandson.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,67 +0,0 @@
-package org.hibernate.ejb.test.cascade;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-public class FetchTest2 extends TestCase {
-
- public void testProxyTransientStuff() throws Exception {
-
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
-
- Troop2 disney = new Troop2();
- disney.setName( "Disney" );
-
- Soldier2 mickey = new Soldier2();
- mickey.setName( "Mickey" );
- mickey.setTroop( disney );
-
- em.persist( disney );
- em.persist( mickey );
-
- em.getTransaction().commit();
- em.close();
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
-
- Soldier2 soldier = em.find( Soldier2.class, mickey.getId() );
- soldier.getTroop().getId();
- try {
- em.flush();
- }
- catch (IllegalStateException e) {
- fail( "Should not raise an exception" );
- }
-
- em.getTransaction().commit();
- em.close();
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
-
- //load troop wo a proxy
- disney = em.find( Troop2.class, disney.getId() );
- soldier = em.find( Soldier2.class, mickey.getId() );
-
- try {
- em.flush();
- }
- catch (IllegalStateException e) {
- fail( "Should not raise an exception" );
- }
- em.remove( soldier );
- em.remove( disney );
- em.getTransaction().commit();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Troop2.class,
- Soldier2.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/FetchTest2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,67 @@
+package org.hibernate.ejb.test.cascade;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+public class FetchTest2 extends TestCase {
+
+ public void testProxyTransientStuff() throws Exception {
+
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+
+ Troop2 disney = new Troop2();
+ disney.setName( "Disney" );
+
+ Soldier2 mickey = new Soldier2();
+ mickey.setName( "Mickey" );
+ mickey.setTroop( disney );
+
+ em.persist( disney );
+ em.persist( mickey );
+
+ em.getTransaction().commit();
+ em.close();
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+
+ Soldier2 soldier = em.find( Soldier2.class, mickey.getId() );
+ soldier.getTroop().getId();
+ try {
+ em.flush();
+ }
+ catch (IllegalStateException e) {
+ fail( "Should not raise an exception" );
+ }
+
+ em.getTransaction().commit();
+ em.close();
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+
+ //load troop wo a proxy
+ disney = em.find( Troop2.class, disney.getId() );
+ soldier = em.find( Soldier2.class, mickey.getId() );
+
+ try {
+ em.flush();
+ }
+ catch (IllegalStateException e) {
+ fail( "Should not raise an exception" );
+ }
+ em.remove( soldier );
+ em.remove( disney );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Troop2.class,
+ Soldier2.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Grandson.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Grandson.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Grandson.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,37 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.cascade;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Grandson {
- @Id
- @GeneratedValue
- private Integer id;
- @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
- private Son parent;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public Son getParent() {
- return parent;
- }
-
- public void setParent(Son parent) {
- this.parent = parent;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Grandson.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Grandson.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Grandson.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Grandson.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,37 @@
+//$Id$
+package org.hibernate.ejb.test.cascade;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Grandson {
+ @Id
+ @GeneratedValue
+ private Integer id;
+ @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.ALL})
+ private Son parent;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Son getParent() {
+ return parent;
+ }
+
+ public void setParent(Son parent) {
+ this.parent = parent;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Parent.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Parent.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.cascade;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Table;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "family_parent")
-public class Parent {
- @Id
- @GeneratedValue
- private Integer id;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Parent.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Parent.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Parent.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id$
+package org.hibernate.ejb.test.cascade;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Table;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "family_parent")
+public class Parent {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,64 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.cascade;
-
-import java.io.Serializable;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Soldier implements Serializable {
- private Integer id;
- private String name;
- private Troop troop;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
- @JoinColumn(name = "troop_fk")
- public Troop getTroop() {
- return troop;
- }
-
- public void setTroop(Troop troop) {
- this.troop = troop;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Soldier ) ) return false;
-
- final Soldier soldier = (Soldier) o;
-
- if ( !name.equals( soldier.name ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return name.hashCode();
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,64 @@
+//$Id$
+package org.hibernate.ejb.test.cascade;
+
+import java.io.Serializable;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Soldier implements Serializable {
+ private Integer id;
+ private String name;
+ private Troop troop;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
+ @JoinColumn(name = "troop_fk")
+ public Troop getTroop() {
+ return troop;
+ }
+
+ public void setTroop(Troop troop) {
+ this.troop = troop;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Soldier ) ) return false;
+
+ final Soldier soldier = (Soldier) o;
+
+ if ( !name.equals( soldier.name ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier2.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier2.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,62 +0,0 @@
-package org.hibernate.ejb.test.cascade;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Soldier2 implements Serializable {
- private Integer id;
- private String name;
- private Troop2 troop;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @ManyToOne(fetch = FetchType.LAZY)
- @JoinColumn(name = "troop_fk")
- public Troop2 getTroop() {
- return troop;
- }
-
- public void setTroop(Troop2 troop) {
- this.troop = troop;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( !( o instanceof Soldier2 ) ) return false;
-
- final Soldier2 soldier = (Soldier2) o;
-
- if ( !name.equals( soldier.name ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- return name.hashCode();
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier2.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier2.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier2.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Soldier2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,62 @@
+package org.hibernate.ejb.test.cascade;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Soldier2 implements Serializable {
+ private Integer id;
+ private String name;
+ private Troop2 troop;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ @JoinColumn(name = "troop_fk")
+ public Troop2 getTroop() {
+ return troop;
+ }
+
+ public void setTroop(Troop2 troop) {
+ this.troop = troop;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( !( o instanceof Soldier2 ) ) return false;
+
+ final Soldier2 soldier = (Soldier2) o;
+
+ if ( !name.equals( soldier.name ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ return name.hashCode();
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Son.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Son.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Son.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.cascade;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Son {
- @Id
- @GeneratedValue
- public Integer id;
- @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
- public Parent parent;
-
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public Parent getParent() {
- return parent;
- }
-
- public void setParent(Parent parent) {
- this.parent = parent;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Son.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Son.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Son.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Son.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id$
+package org.hibernate.ejb.test.cascade;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Son {
+ @Id
+ @GeneratedValue
+ public Integer id;
+ @ManyToOne(fetch = FetchType.LAZY, cascade = {CascadeType.ALL})
+ public Parent parent;
+
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public Parent getParent() {
+ return parent;
+ }
+
+ public void setParent(Parent parent) {
+ this.parent = parent;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Song.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Song.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Song.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.cascade;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.FetchType;
-import javax.persistence.ManyToOne;
-import javax.persistence.GenerationType;
-import javax.persistence.SequenceGenerator;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Song {
- @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ENTITY1_SEQ")
- @SequenceGenerator(name = "ENTITY1_SEQ") private Long id;
- @ManyToOne(fetch = FetchType.LAZY, optional = false)
- private Author author;
-
- public Author getAuthor() {
- return author;
- }
-
- public void setAuthor(Author author) {
- this.author = author;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Song.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Song.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Song.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Song.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id: $
+package org.hibernate.ejb.test.cascade;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.FetchType;
+import javax.persistence.ManyToOne;
+import javax.persistence.GenerationType;
+import javax.persistence.SequenceGenerator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Song {
+ @Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "ENTITY1_SEQ")
+ @SequenceGenerator(name = "ENTITY1_SEQ") private Long id;
+ @ManyToOne(fetch = FetchType.LAZY, optional = false)
+ private Author author;
+
+ public Author getAuthor() {
+ return author;
+ }
+
+ public void setAuthor(Author author) {
+ this.author = author;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Student.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Student.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Student.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-package org.hibernate.ejb.test.cascade;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToOne;
-
-import org.hibernate.annotations.AccessType;
-
- at Entity
- at AccessType("field")
-public class Student {
-
- @Id @GeneratedValue
- Long id;
-
- String name;
-
- @ManyToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST})
- private Teacher primaryTeacher;
-
- @OneToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST})
- private Teacher favoriteTeacher;
-
- public Student() {
- }
-
- public Teacher getFavoriteTeacher() {
- return favoriteTeacher;
- }
-
- public void setFavoriteTeacher(Teacher lifeCover) {
- this.favoriteTeacher = lifeCover;
- }
-
- public Teacher getPrimaryTeacher() {
- return primaryTeacher;
- }
-
- public void setPrimaryTeacher(Teacher relativeTo) {
- this.primaryTeacher = relativeTo;
- }
-
- public Long getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Student.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Student.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Student.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Student.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+package org.hibernate.ejb.test.cascade;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToOne;
+
+import org.hibernate.annotations.AccessType;
+
+ at Entity
+ at AccessType("field")
+public class Student {
+
+ @Id @GeneratedValue
+ Long id;
+
+ String name;
+
+ @ManyToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST})
+ private Teacher primaryTeacher;
+
+ @OneToOne(cascade={CascadeType.MERGE, CascadeType.PERSIST})
+ private Teacher favoriteTeacher;
+
+ public Student() {
+ }
+
+ public Teacher getFavoriteTeacher() {
+ return favoriteTeacher;
+ }
+
+ public void setFavoriteTeacher(Teacher lifeCover) {
+ this.favoriteTeacher = lifeCover;
+ }
+
+ public Teacher getPrimaryTeacher() {
+ return primaryTeacher;
+ }
+
+ public void setPrimaryTeacher(Teacher relativeTo) {
+ this.primaryTeacher = relativeTo;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Teacher.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Teacher.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Teacher.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,62 +0,0 @@
-package org.hibernate.ejb.test.cascade;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-import javax.persistence.OneToOne;
-
-import org.hibernate.annotations.AccessType;
-
- at Entity
- at AccessType("field")
-public class Teacher {
-
- @Id @GeneratedValue
- Long id;
-
- String name;
-
- @OneToMany(mappedBy="primaryTeacher", cascade={CascadeType.MERGE, CascadeType.PERSIST})
- private Set<Student> students = new HashSet<Student>();
-
- @OneToOne(mappedBy="favoriteTeacher", cascade={CascadeType.MERGE, CascadeType.PERSIST})
- private Student favoriteStudent;
-
- public Teacher() {
- }
-
- public Student getFavoriteStudent() {
- return favoriteStudent;
- }
-
- public void setFavoriteStudent(
- Student contributionOrBenefitParameters) {
- this.favoriteStudent = contributionOrBenefitParameters;
- }
-
- public Set<Student> getStudents() {
- return students;
- }
-
- public void setStudents(
- Set<Student> todoCollection) {
- this.students = todoCollection;
- }
-
- public Long getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Teacher.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Teacher.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Teacher.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Teacher.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,62 @@
+package org.hibernate.ejb.test.cascade;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.OneToOne;
+
+import org.hibernate.annotations.AccessType;
+
+ at Entity
+ at AccessType("field")
+public class Teacher {
+
+ @Id @GeneratedValue
+ Long id;
+
+ String name;
+
+ @OneToMany(mappedBy="primaryTeacher", cascade={CascadeType.MERGE, CascadeType.PERSIST})
+ private Set<Student> students = new HashSet<Student>();
+
+ @OneToOne(mappedBy="favoriteTeacher", cascade={CascadeType.MERGE, CascadeType.PERSIST})
+ private Student favoriteStudent;
+
+ public Teacher() {
+ }
+
+ public Student getFavoriteStudent() {
+ return favoriteStudent;
+ }
+
+ public void setFavoriteStudent(
+ Student contributionOrBenefitParameters) {
+ this.favoriteStudent = contributionOrBenefitParameters;
+ }
+
+ public Set<Student> getStudents() {
+ return students;
+ }
+
+ public void setStudents(
+ Set<Student> todoCollection) {
+ this.students = todoCollection;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,59 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.cascade;
-
-import java.io.Serializable;
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
-import org.hibernate.annotations.OrderBy;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Troop implements Serializable {
- private Integer id;
- private String name;
- private Set<Soldier> soldiers;
-
- @OneToMany(mappedBy = "troop", cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
- @OrderBy(clause = "name desc")
- @org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
- public Set<Soldier> getSoldiers() {
- return soldiers;
- }
-
- public void setSoldiers(Set<Soldier> soldiers) {
- this.soldiers = soldiers;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void addSoldier(Soldier s) {
- if ( soldiers == null ) soldiers = new HashSet<Soldier>();
- soldiers.add( s );
- s.setTroop( this );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,59 @@
+//$Id$
+package org.hibernate.ejb.test.cascade;
+
+import java.io.Serializable;
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+import org.hibernate.annotations.OrderBy;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Troop implements Serializable {
+ private Integer id;
+ private String name;
+ private Set<Soldier> soldiers;
+
+ @OneToMany(mappedBy = "troop", cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
+ @OrderBy(clause = "name desc")
+ @org.hibernate.annotations.Cascade({org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
+ public Set<Soldier> getSoldiers() {
+ return soldiers;
+ }
+
+ public void setSoldiers(Set<Soldier> soldiers) {
+ this.soldiers = soldiers;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void addSoldier(Soldier s) {
+ if ( soldiers == null ) soldiers = new HashSet<Soldier>();
+ soldiers.add( s );
+ s.setTroop( this );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop2.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop2.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-package org.hibernate.ejb.test.cascade;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Troop2 implements Serializable {
-
- /* FAILS: */
- @Id
- @GeneratedValue
- private Integer id;
- private String name;
-
- /* WORKS:
- @Id
- @GeneratedValue
- */
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop2.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop2.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop2.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/cascade/Troop2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+package org.hibernate.ejb.test.cascade;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Troop2 implements Serializable {
+
+ /* FAILS: */
+ @Id
+ @GeneratedValue
+ private Integer id;
+ private String name;
+
+ /* WORKS:
+ @Id
+ @GeneratedValue
+ */
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.connection;
-
-import javax.persistence.EntityManagerFactory;
-
-import junit.framework.TestCase;
-import org.hibernate.ejb.HibernatePersistence;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DataSourceInjectionTest extends TestCase {
- public void testDatasourceInjection() {
- PersistenceUnitInfoImpl info = new PersistenceUnitInfoImpl( new String[]{} );
- try {
- EntityManagerFactory emf = ( new HibernatePersistence() ).createContainerEntityManagerFactory( info, null );
- fail( "FakeDatasource should have been used" );
- }
- catch (FakeDataSourceException fde) {
- //success
- }
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/DataSourceInjectionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id$
+package org.hibernate.ejb.test.connection;
+
+import javax.persistence.EntityManagerFactory;
+
+import junit.framework.TestCase;
+import org.hibernate.ejb.HibernatePersistence;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DataSourceInjectionTest extends TestCase {
+ public void testDatasourceInjection() {
+ PersistenceUnitInfoImpl info = new PersistenceUnitInfoImpl( new String[]{} );
+ try {
+ EntityManagerFactory emf = ( new HibernatePersistence() ).createContainerEntityManagerFactory( info, null );
+ fail( "FakeDatasource should have been used" );
+ }
+ catch (FakeDataSourceException fde) {
+ //success
+ }
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSource.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSource.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSource.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.connection;
-
-import java.io.PrintWriter;
-import java.sql.Connection;
-import java.sql.SQLException;
-import javax.sql.DataSource;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FakeDataSource implements DataSource {
- public Connection getConnection() throws SQLException {
- throw new FakeDataSourceException( "connection" );
- }
-
- public Connection getConnection(String username, String password) throws SQLException {
- throw new FakeDataSourceException( "connection with password" );
- }
-
- public PrintWriter getLogWriter() throws SQLException {
- throw new FakeDataSourceException( "getLogWriter" );
- }
-
- public void setLogWriter(PrintWriter out) throws SQLException {
- throw new FakeDataSourceException( "setLogWriter" );
- }
-
- public void setLoginTimeout(int seconds) throws SQLException {
- throw new FakeDataSourceException( "setLoginTimeout" );
- }
-
- public int getLoginTimeout() throws SQLException {
- throw new FakeDataSourceException( "getLoginTimeout" );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSource.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSource.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSource.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSource.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+//$Id$
+package org.hibernate.ejb.test.connection;
+
+import java.io.PrintWriter;
+import java.sql.Connection;
+import java.sql.SQLException;
+import javax.sql.DataSource;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FakeDataSource implements DataSource {
+ public Connection getConnection() throws SQLException {
+ throw new FakeDataSourceException( "connection" );
+ }
+
+ public Connection getConnection(String username, String password) throws SQLException {
+ throw new FakeDataSourceException( "connection with password" );
+ }
+
+ public PrintWriter getLogWriter() throws SQLException {
+ throw new FakeDataSourceException( "getLogWriter" );
+ }
+
+ public void setLogWriter(PrintWriter out) throws SQLException {
+ throw new FakeDataSourceException( "setLogWriter" );
+ }
+
+ public void setLoginTimeout(int seconds) throws SQLException {
+ throw new FakeDataSourceException( "setLoginTimeout" );
+ }
+
+ public int getLoginTimeout() throws SQLException {
+ throw new FakeDataSourceException( "getLoginTimeout" );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSourceException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSourceException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSourceException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.connection;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FakeDataSourceException extends RuntimeException {
- public FakeDataSourceException(String message) {
- super( message );
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSourceException.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSourceException.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSourceException.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/FakeDataSourceException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id$
+package org.hibernate.ejb.test.connection;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FakeDataSourceException extends RuntimeException {
+ public FakeDataSourceException(String message) {
+ super( message );
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,94 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.connection;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-import javax.persistence.spi.ClassTransformer;
-import javax.persistence.spi.PersistenceUnitInfo;
-import javax.persistence.spi.PersistenceUnitTransactionType;
-import javax.sql.DataSource;
-
-import org.hibernate.cfg.Environment;
-import org.hibernate.ejb.HibernatePersistence;
-import org.hibernate.ejb.test.Distributor;
-import org.hibernate.ejb.test.Item;
-import org.hibernate.ejb.test.xml.Light;
-import org.hibernate.ejb.test.xml.Lighter;
-
-/**
- * @author Emmanuel Bernard
- */
-public class PersistenceUnitInfoImpl implements PersistenceUnitInfo {
- private Properties properties = new Properties();
- private List<String> mappingFiles;
-
- public PersistenceUnitInfoImpl(String[] mappingFiles) {
- this.mappingFiles = new ArrayList<String>( mappingFiles.length );
- for ( String mappingFile : mappingFiles ) {
- this.mappingFiles.add( mappingFile );
- }
- }
-
- public String getPersistenceUnitName() {
- return "persistenceinfo";
- }
-
- public String getPersistenceProviderClassName() {
- return HibernatePersistence.class.getName();
- }
-
- public DataSource getJtaDataSource() {
- return new FakeDataSource();
- }
-
- public DataSource getNonJtaDataSource() {
- return null;
- }
-
- public List<String> getMappingFileNames() {
- return mappingFiles;
- }
-
- public List<URL> getJarFileUrls() {
- return new ArrayList<URL>();
- }
-
- public List<String> getManagedClassNames() {
- List<String> classes = new ArrayList<String>();
- classes.add( Item.class.getName() );
- classes.add( Distributor.class.getName() );
- classes.add( Light.class.getName() );
- classes.add( Lighter.class.getName() );
- return classes;
- }
-
- public Properties getProperties() {
- properties.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- return properties;
- }
-
- public ClassLoader getClassLoader() {
- return Thread.currentThread().getContextClassLoader();
- }
-
- public PersistenceUnitTransactionType getTransactionType() {
- return null;
- }
-
- public URL getPersistenceUnitRootUrl() {
- return null;
- }
-
- public boolean excludeUnlistedClasses() {
- return true;
- }
-
- public void addTransformer(ClassTransformer transformer) {
- }
-
- public ClassLoader getNewTempClassLoader() {
- return Thread.currentThread().getContextClassLoader();
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/connection/PersistenceUnitInfoImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,94 @@
+//$Id$
+package org.hibernate.ejb.test.connection;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import javax.persistence.spi.ClassTransformer;
+import javax.persistence.spi.PersistenceUnitInfo;
+import javax.persistence.spi.PersistenceUnitTransactionType;
+import javax.sql.DataSource;
+
+import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.HibernatePersistence;
+import org.hibernate.ejb.test.Distributor;
+import org.hibernate.ejb.test.Item;
+import org.hibernate.ejb.test.xml.Light;
+import org.hibernate.ejb.test.xml.Lighter;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PersistenceUnitInfoImpl implements PersistenceUnitInfo {
+ private Properties properties = new Properties();
+ private List<String> mappingFiles;
+
+ public PersistenceUnitInfoImpl(String[] mappingFiles) {
+ this.mappingFiles = new ArrayList<String>( mappingFiles.length );
+ for ( String mappingFile : mappingFiles ) {
+ this.mappingFiles.add( mappingFile );
+ }
+ }
+
+ public String getPersistenceUnitName() {
+ return "persistenceinfo";
+ }
+
+ public String getPersistenceProviderClassName() {
+ return HibernatePersistence.class.getName();
+ }
+
+ public DataSource getJtaDataSource() {
+ return new FakeDataSource();
+ }
+
+ public DataSource getNonJtaDataSource() {
+ return null;
+ }
+
+ public List<String> getMappingFileNames() {
+ return mappingFiles;
+ }
+
+ public List<URL> getJarFileUrls() {
+ return new ArrayList<URL>();
+ }
+
+ public List<String> getManagedClassNames() {
+ List<String> classes = new ArrayList<String>();
+ classes.add( Item.class.getName() );
+ classes.add( Distributor.class.getName() );
+ classes.add( Light.class.getName() );
+ classes.add( Lighter.class.getName() );
+ return classes;
+ }
+
+ public Properties getProperties() {
+ properties.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ return properties;
+ }
+
+ public ClassLoader getClassLoader() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+
+ public PersistenceUnitTransactionType getTransactionType() {
+ return null;
+ }
+
+ public URL getPersistenceUnitRootUrl() {
+ return null;
+ }
+
+ public boolean excludeUnlistedClasses() {
+ return true;
+ }
+
+ public void addTransformer(ClassTransformer transformer) {
+ }
+
+ public ClassLoader getNewTempClassLoader() {
+ return Thread.currentThread().getContextClassLoader();
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,91 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ejb3configuration;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.util.Date;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-
-import org.hibernate.ejb.HibernateEntityManager;
-import org.hibernate.ejb.test.Cat;
-import org.hibernate.ejb.test.Distributor;
-import org.hibernate.ejb.test.Item;
-import org.hibernate.ejb.test.Wallet;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EntityManagerSerializationTest extends org.hibernate.ejb.test.TestCase {
-
- public void testSerialization() throws Exception {
- ByteArrayOutputStream stream = new ByteArrayOutputStream();
- ObjectOutput out = new ObjectOutputStream( stream );
- out.writeObject( factory );
- out.close();
- byte[] serialized = stream.toByteArray();
- stream.close();
- ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
- ObjectInputStream in = new ObjectInputStream( byteIn );
- EntityManagerFactory seriallizedFactory = (EntityManagerFactory) in.readObject();
- in.close();
- byteIn.close();
- EntityManager em = seriallizedFactory.createEntityManager();
- //em.getTransaction().begin();
- //em.setFlushMode( FlushModeType.NEVER );
- Cat cat = new Cat();
- cat.setAge( 3 );
- cat.setDateOfBirth( new Date() );
- cat.setLength( 22 );
- cat.setName( "Kitty" );
- em.persist( cat );
- Item item = new Item();
- item.setName( "Train Ticket" );
- item.setDescr( "Paris-London" );
- em.persist( item );
- //em.getTransaction().commit();
- //em.getTransaction().begin();
- item.setDescr( "Paris-Bruxelles" );
- //em.getTransaction().commit();
-
- //fake the in container work
- ( (HibernateEntityManager) em ).getSession().disconnect();
- stream = new ByteArrayOutputStream();
- out = new ObjectOutputStream( stream );
- out.writeObject( em );
- out.close();
- serialized = stream.toByteArray();
- stream.close();
- byteIn = new ByteArrayInputStream( serialized );
- in = new ObjectInputStream( byteIn );
- em = (EntityManager) in.readObject();
- in.close();
- byteIn.close();
- //fake the in container work
- em.getTransaction().begin();
- item = em.find( Item.class, item.getName() );
- item.setDescr( item.getDescr() + "-Amsterdam" );
- cat = (Cat) em.createQuery( "select c from " + Cat.class.getName() + " c" ).getSingleResult();
- cat.setLength( 34 );
- em.flush();
- em.remove( item );
- em.remove( cat );
- em.flush();
- em.getTransaction().commit();
-
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Item.class,
- Distributor.class,
- Wallet.class,
- Cat.class
-
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EntityManagerSerializationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,91 @@
+//$Id$
+package org.hibernate.ejb.test.ejb3configuration;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutput;
+import java.io.ObjectOutputStream;
+import java.util.Date;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import org.hibernate.ejb.HibernateEntityManager;
+import org.hibernate.ejb.test.Cat;
+import org.hibernate.ejb.test.Distributor;
+import org.hibernate.ejb.test.Item;
+import org.hibernate.ejb.test.Wallet;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EntityManagerSerializationTest extends org.hibernate.ejb.test.TestCase {
+
+ public void testSerialization() throws Exception {
+ ByteArrayOutputStream stream = new ByteArrayOutputStream();
+ ObjectOutput out = new ObjectOutputStream( stream );
+ out.writeObject( factory );
+ out.close();
+ byte[] serialized = stream.toByteArray();
+ stream.close();
+ ByteArrayInputStream byteIn = new ByteArrayInputStream( serialized );
+ ObjectInputStream in = new ObjectInputStream( byteIn );
+ EntityManagerFactory seriallizedFactory = (EntityManagerFactory) in.readObject();
+ in.close();
+ byteIn.close();
+ EntityManager em = seriallizedFactory.createEntityManager();
+ //em.getTransaction().begin();
+ //em.setFlushMode( FlushModeType.NEVER );
+ Cat cat = new Cat();
+ cat.setAge( 3 );
+ cat.setDateOfBirth( new Date() );
+ cat.setLength( 22 );
+ cat.setName( "Kitty" );
+ em.persist( cat );
+ Item item = new Item();
+ item.setName( "Train Ticket" );
+ item.setDescr( "Paris-London" );
+ em.persist( item );
+ //em.getTransaction().commit();
+ //em.getTransaction().begin();
+ item.setDescr( "Paris-Bruxelles" );
+ //em.getTransaction().commit();
+
+ //fake the in container work
+ ( (HibernateEntityManager) em ).getSession().disconnect();
+ stream = new ByteArrayOutputStream();
+ out = new ObjectOutputStream( stream );
+ out.writeObject( em );
+ out.close();
+ serialized = stream.toByteArray();
+ stream.close();
+ byteIn = new ByteArrayInputStream( serialized );
+ in = new ObjectInputStream( byteIn );
+ em = (EntityManager) in.readObject();
+ in.close();
+ byteIn.close();
+ //fake the in container work
+ em.getTransaction().begin();
+ item = em.find( Item.class, item.getName() );
+ item.setDescr( item.getDescr() + "-Amsterdam" );
+ cat = (Cat) em.createQuery( "select c from " + Cat.class.getName() + " c" ).getSingleResult();
+ cat.setLength( 34 );
+ em.flush();
+ em.remove( item );
+ em.remove( cat );
+ em.flush();
+ em.getTransaction().commit();
+
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Item.class,
+ Distributor.class,
+ Wallet.class,
+ Cat.class
+
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ejb3configuration;
-
-import java.util.HashMap;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-
-import org.hibernate.ejb.test.Cat;
-import org.hibernate.ejb.HibernateEntityManagerFactory;
-import org.hibernate.event.EventListeners;
-import org.hibernate.event.PreInsertEventListener;
-import org.hibernate.Session;
-import org.hibernate.engine.SessionImplementor;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EventOverridingTest extends TestCase {
-
- public void testEventOverriding() throws Exception {
- EventListeners eventListeners = configuration.getEventListeners();
- assertEquals( 1, eventListeners.getPreInsertEventListeners().length );
- eventListeners.setPreInsertEventListeners( new PreInsertEventListener[]{} );
- Cat cat = new Cat();
- cat.setLength( 3 );
- cat.setAge( 34 );
- cat.setName( "Did" ); //should raise a validation exception
- EntityManagerFactory entityManagerFactory = configuration.createEntityManagerFactory();
- EntityManager em = entityManagerFactory.createEntityManager();
- assertEquals( "only validator should be present", 1,
- ( (SessionImplementor) em.getDelegate() ).getListeners().getPreInsertEventListeners().length);
- em.close();
- }
-
- public void testEventPerProperties() throws Exception {
- EntityManagerFactory emf = Persistence.createEntityManagerFactory( "manager1", new HashMap() );
- EntityManager em = emf.createEntityManager();
- assertEquals( "Only validator should be present", 1,
- ( (SessionImplementor) em.getDelegate() ).getListeners().getPreInsertEventListeners().length);
- em.close();
- emf.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Cat.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/EventOverridingTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+//$Id$
+package org.hibernate.ejb.test.ejb3configuration;
+
+import java.util.HashMap;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.hibernate.ejb.test.Cat;
+import org.hibernate.ejb.HibernateEntityManagerFactory;
+import org.hibernate.event.EventListeners;
+import org.hibernate.event.PreInsertEventListener;
+import org.hibernate.Session;
+import org.hibernate.engine.SessionImplementor;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EventOverridingTest extends TestCase {
+
+ public void testEventOverriding() throws Exception {
+ EventListeners eventListeners = configuration.getEventListeners();
+ assertEquals( 1, eventListeners.getPreInsertEventListeners().length );
+ eventListeners.setPreInsertEventListeners( new PreInsertEventListener[]{} );
+ Cat cat = new Cat();
+ cat.setLength( 3 );
+ cat.setAge( 34 );
+ cat.setName( "Did" ); //should raise a validation exception
+ EntityManagerFactory entityManagerFactory = configuration.createEntityManagerFactory();
+ EntityManager em = entityManagerFactory.createEntityManager();
+ assertEquals( "only validator should be present", 1,
+ ( (SessionImplementor) em.getDelegate() ).getListeners().getPreInsertEventListeners().length);
+ em.close();
+ }
+
+ public void testEventPerProperties() throws Exception {
+ EntityManagerFactory emf = Persistence.createEntityManagerFactory( "manager1", new HashMap() );
+ EntityManager em = emf.createEntityManager();
+ assertEquals( "Only validator should be present", 1,
+ ( (SessionImplementor) em.getDelegate() ).getListeners().getPreInsertEventListeners().length);
+ em.close();
+ emf.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Cat.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ExceptionInterceptor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ExceptionInterceptor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ExceptionInterceptor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,99 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ejb3configuration;
-
-import java.io.Serializable;
-import java.util.Iterator;
-
-import org.hibernate.CallbackException;
-import org.hibernate.EntityMode;
-import org.hibernate.Interceptor;
-import org.hibernate.Transaction;
-import org.hibernate.type.Type;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ExceptionInterceptor implements Interceptor {
- public static final String EXCEPTION_MESSAGE = "Interceptor enabled";
-
- public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
- throws CallbackException {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public boolean onFlushDirty(
- Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames,
- Type[] types
- ) throws CallbackException {
- return false; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
- throws CallbackException {
- throw new IllegalStateException( EXCEPTION_MESSAGE );
- }
-
- public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
- throws CallbackException {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public void onCollectionRecreate(Object collection, Serializable key) throws CallbackException {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public void onCollectionRemove(Object collection, Serializable key) throws CallbackException {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public void preFlush(Iterator entities) throws CallbackException {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public void postFlush(Iterator entities) throws CallbackException {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public Boolean isTransient(Object entity) {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public int[] findDirty(
- Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames,
- Type[] types
- ) {
- return new int[0]; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public String getEntityName(Object object) throws CallbackException {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public Object getEntity(String entityName, Serializable id) throws CallbackException {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public void afterTransactionBegin(Transaction tx) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public void beforeTransactionCompletion(Transaction tx) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public void afterTransactionCompletion(Transaction tx) {
- //To change body of implemented methods use File | Settings | File Templates.
- }
-
- public String onPrepareStatement(String sql) {
- return null; //To change body of implemented methods use File | Settings | File Templates.
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ExceptionInterceptor.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ExceptionInterceptor.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ExceptionInterceptor.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ExceptionInterceptor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,99 @@
+//$Id$
+package org.hibernate.ejb.test.ejb3configuration;
+
+import java.io.Serializable;
+import java.util.Iterator;
+
+import org.hibernate.CallbackException;
+import org.hibernate.EntityMode;
+import org.hibernate.Interceptor;
+import org.hibernate.Transaction;
+import org.hibernate.type.Type;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ExceptionInterceptor implements Interceptor {
+ public static final String EXCEPTION_MESSAGE = "Interceptor enabled";
+
+ public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
+ throws CallbackException {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public boolean onFlushDirty(
+ Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames,
+ Type[] types
+ ) throws CallbackException {
+ return false; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
+ throws CallbackException {
+ throw new IllegalStateException( EXCEPTION_MESSAGE );
+ }
+
+ public void onDelete(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types)
+ throws CallbackException {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void onCollectionRecreate(Object collection, Serializable key) throws CallbackException {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void onCollectionRemove(Object collection, Serializable key) throws CallbackException {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void onCollectionUpdate(Object collection, Serializable key) throws CallbackException {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void preFlush(Iterator entities) throws CallbackException {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void postFlush(Iterator entities) throws CallbackException {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public Boolean isTransient(Object entity) {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public int[] findDirty(
+ Object entity, Serializable id, Object[] currentState, Object[] previousState, String[] propertyNames,
+ Type[] types
+ ) {
+ return new int[0]; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public Object instantiate(String entityName, EntityMode entityMode, Serializable id) throws CallbackException {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public String getEntityName(Object object) throws CallbackException {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public Object getEntity(String entityName, Serializable id) throws CallbackException {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void afterTransactionBegin(Transaction tx) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void beforeTransactionCompletion(Transaction tx) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public void afterTransactionCompletion(Transaction tx) {
+ //To change body of implemented methods use File | Settings | File Templates.
+ }
+
+ public String onPrepareStatement(String sql) {
+ return null; //To change body of implemented methods use File | Settings | File Templates.
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/InterceptorTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/InterceptorTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/InterceptorTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,87 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ejb3configuration;
-
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-
-import org.hibernate.ejb.HibernatePersistence;
-import org.hibernate.ejb.test.Distributor;
-import org.hibernate.ejb.test.Item;
-
-/**
- * @author Emmanuel Bernard
- */
-public class InterceptorTest extends TestCase {
-
- public void testInjectedInterceptor() {
- configuration.setInterceptor( new ExceptionInterceptor() );
- EntityManagerFactory emf = configuration.createEntityManagerFactory();
- EntityManager em = emf.createEntityManager();
- Item i = new Item();
- i.setName( "Laptop" );
- try {
- em.getTransaction().begin();
- em.persist( i );
- em.getTransaction().commit();
- }
- catch (IllegalStateException e) {
- assertEquals( ExceptionInterceptor.EXCEPTION_MESSAGE, e.getMessage() );
- }
- finally {
- if ( em.getTransaction() != null && em.getTransaction().isActive() ) em.getTransaction().rollback();
- em.close();
- emf.close();
- }
- }
-
- public void testConfiguredInterceptor() {
- configuration.setProperty( HibernatePersistence.INTERCEPTOR, ExceptionInterceptor.class.getName() );
- EntityManagerFactory emf = configuration.createEntityManagerFactory();
- EntityManager em = emf.createEntityManager();
- Item i = new Item();
- i.setName( "Laptop" );
- try {
- em.getTransaction().begin();
- em.persist( i );
- em.getTransaction().commit();
- fail( "No interceptor" );
- }
- catch (IllegalStateException e) {
- assertEquals( ExceptionInterceptor.EXCEPTION_MESSAGE, e.getMessage() );
- }
- finally {
- if ( em.getTransaction() != null && em.getTransaction().isActive() ) em.getTransaction().rollback();
- em.close();
- emf.close();
- }
- }
-
- public void testEmptyCreateEntityManagerFactoryAndPropertyUse() {
- configuration.setProperty( HibernatePersistence.INTERCEPTOR, ExceptionInterceptor.class.getName() );
- EntityManagerFactory emf = configuration.createEntityManagerFactory();
- EntityManager em = emf.createEntityManager();
- Item i = new Item();
- i.setName( "Laptop" );
- try {
- em.getTransaction().begin();
- em.persist( i );
- em.getTransaction().commit();
- fail( "No interceptor" );
- }
- catch (IllegalStateException e) {
- assertEquals( ExceptionInterceptor.EXCEPTION_MESSAGE, e.getMessage() );
- }
- finally {
- if ( em.getTransaction() != null && em.getTransaction().isActive() ) em.getTransaction().rollback();
- em.close();
- emf.close();
- }
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Item.class,
- Distributor.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/InterceptorTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/InterceptorTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/InterceptorTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/InterceptorTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,87 @@
+//$Id$
+package org.hibernate.ejb.test.ejb3configuration;
+
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import org.hibernate.ejb.HibernatePersistence;
+import org.hibernate.ejb.test.Distributor;
+import org.hibernate.ejb.test.Item;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class InterceptorTest extends TestCase {
+
+ public void testInjectedInterceptor() {
+ configuration.setInterceptor( new ExceptionInterceptor() );
+ EntityManagerFactory emf = configuration.createEntityManagerFactory();
+ EntityManager em = emf.createEntityManager();
+ Item i = new Item();
+ i.setName( "Laptop" );
+ try {
+ em.getTransaction().begin();
+ em.persist( i );
+ em.getTransaction().commit();
+ }
+ catch (IllegalStateException e) {
+ assertEquals( ExceptionInterceptor.EXCEPTION_MESSAGE, e.getMessage() );
+ }
+ finally {
+ if ( em.getTransaction() != null && em.getTransaction().isActive() ) em.getTransaction().rollback();
+ em.close();
+ emf.close();
+ }
+ }
+
+ public void testConfiguredInterceptor() {
+ configuration.setProperty( HibernatePersistence.INTERCEPTOR, ExceptionInterceptor.class.getName() );
+ EntityManagerFactory emf = configuration.createEntityManagerFactory();
+ EntityManager em = emf.createEntityManager();
+ Item i = new Item();
+ i.setName( "Laptop" );
+ try {
+ em.getTransaction().begin();
+ em.persist( i );
+ em.getTransaction().commit();
+ fail( "No interceptor" );
+ }
+ catch (IllegalStateException e) {
+ assertEquals( ExceptionInterceptor.EXCEPTION_MESSAGE, e.getMessage() );
+ }
+ finally {
+ if ( em.getTransaction() != null && em.getTransaction().isActive() ) em.getTransaction().rollback();
+ em.close();
+ emf.close();
+ }
+ }
+
+ public void testEmptyCreateEntityManagerFactoryAndPropertyUse() {
+ configuration.setProperty( HibernatePersistence.INTERCEPTOR, ExceptionInterceptor.class.getName() );
+ EntityManagerFactory emf = configuration.createEntityManagerFactory();
+ EntityManager em = emf.createEntityManager();
+ Item i = new Item();
+ i.setName( "Laptop" );
+ try {
+ em.getTransaction().begin();
+ em.persist( i );
+ em.getTransaction().commit();
+ fail( "No interceptor" );
+ }
+ catch (IllegalStateException e) {
+ assertEquals( ExceptionInterceptor.EXCEPTION_MESSAGE, e.getMessage() );
+ }
+ finally {
+ if ( em.getTransaction() != null && em.getTransaction().isActive() ) em.getTransaction().rollback();
+ em.close();
+ emf.close();
+ }
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Item.class,
+ Distributor.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ProgrammaticConfTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ProgrammaticConfTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ProgrammaticConfTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.ejb3configuration;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.Date;
-import java.util.Properties;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityManagerFactory;
-
-import org.hibernate.cfg.Environment;
-import org.hibernate.ejb.Ejb3Configuration;
-import org.hibernate.ejb.test.Cat;
-import org.hibernate.util.ConfigHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ProgrammaticConfTest extends junit.framework.TestCase {
-
- public void testProgrammaticAPI() throws Exception {
- Ejb3Configuration conf = new Ejb3Configuration();
- conf.addAnnotatedClass( Cat.class );
- EntityManagerFactory emf = conf.buildEntityManagerFactory();
- EntityManager em = emf.createEntityManager();
- Cat cat = new Cat();
- cat.setAge( 23 );
- cat.setDateOfBirth( new Date() );
- cat.setLength( 32 );
- cat.setName( "Tomy" );
- em.getTransaction().begin();
- em.persist( cat );
- em.flush();
- assertNotNull( em.find(Cat.class, cat.getId() ) );
- em.getTransaction().rollback();
- emf.close();
- }
-
- protected Properties getProperties() throws IOException {
- Properties properties = new Properties( );
- InputStream stream = ConfigHelper.getResourceAsStream("/hibernate.properties");
- try {
- properties.load(stream);
- }
-
- finally {
- try{
- stream.close();
- }
- catch (IOException ioe){
- }
- }
- properties.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- return properties;
- }
-
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ProgrammaticConfTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ProgrammaticConfTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ProgrammaticConfTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/ProgrammaticConfTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id: $
+package org.hibernate.ejb.test.ejb3configuration;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Date;
+import java.util.Properties;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityManagerFactory;
+
+import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.ejb.test.Cat;
+import org.hibernate.util.ConfigHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ProgrammaticConfTest extends junit.framework.TestCase {
+
+ public void testProgrammaticAPI() throws Exception {
+ Ejb3Configuration conf = new Ejb3Configuration();
+ conf.addAnnotatedClass( Cat.class );
+ EntityManagerFactory emf = conf.buildEntityManagerFactory();
+ EntityManager em = emf.createEntityManager();
+ Cat cat = new Cat();
+ cat.setAge( 23 );
+ cat.setDateOfBirth( new Date() );
+ cat.setLength( 32 );
+ cat.setName( "Tomy" );
+ em.getTransaction().begin();
+ em.persist( cat );
+ em.flush();
+ assertNotNull( em.find(Cat.class, cat.getId() ) );
+ em.getTransaction().rollback();
+ emf.close();
+ }
+
+ protected Properties getProperties() throws IOException {
+ Properties properties = new Properties( );
+ InputStream stream = ConfigHelper.getResourceAsStream("/hibernate.properties");
+ try {
+ properties.load(stream);
+ }
+
+ finally {
+ try{
+ stream.close();
+ }
+ catch (IOException ioe){
+ }
+ }
+ properties.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ return properties;
+ }
+
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/TestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/TestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/TestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,105 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ejb3configuration;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Properties;
-import javax.persistence.Persistence;
-
-import org.hibernate.cfg.Environment;
-import org.hibernate.ejb.Ejb3Configuration;
-import org.hibernate.ejb.HibernatePersistence;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class TestCase extends junit.framework.TestCase {
- protected Ejb3Configuration configuration;
- private Class lastTestClass;
-
- public TestCase() {
- super();
- }
-
- public TestCase(String name) {
- super( name );
- }
-
- public void setUp() {
- if ( configuration == null || lastTestClass != getClass() ) {
- buildConfiguration();
- lastTestClass = getClass();
- }
- //factory = new HibernatePersistence().createEntityManagerFactory( getConfig() );
- }
-
- protected boolean recreateSchema() {
- return true;
- }
-
- ;
-
- private void buildConfiguration() {
- configuration = new Ejb3Configuration();
- configuration.addProperties( loadProperties() );
- if ( recreateSchema() ) {
- configuration.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- }
-
- for ( Class clazz : getAnnotatedClasses() ) {
- configuration.addAnnotatedClass( clazz );
- }
-
- for ( Map.Entry<Class, String> entry : getCachedClasses().entrySet() ) {
- configuration.setProperty(
- HibernatePersistence.CLASS_CACHE_PREFIX + "." + entry.getKey().getName(),
- entry.getValue()
- );
- }
- for ( Map.Entry<String, String> entry : getCachedCollections().entrySet() ) {
- configuration.setProperty(
- HibernatePersistence.COLLECTION_CACHE_PREFIX + "." + entry.getKey(),
- entry.getValue()
- );
- }
- }
-
- public abstract Class[] getAnnotatedClasses();
-
- public Map<Class, String> getCachedClasses() {
- return new HashMap<Class, String>();
- }
-
- public Map<String, String> getCachedCollections() {
- return new HashMap<String, String>();
- }
-
- public static Properties loadProperties() {
- Properties props = new Properties();
- InputStream stream = Persistence.class.getResourceAsStream( "/hibernate.properties" );
- if ( stream != null ) {
- try {
- props.load( stream );
- }
- catch (Exception e) {
- throw new RuntimeException( "could not load hibernate.properties" );
- }
- finally {
- try {
- stream.close();
- }
- catch (IOException ioe) {
- }
- }
- }
- return props;
- }
-
- @Override
- protected void tearDown() throws Exception {
- super.tearDown();
- configuration = null; //avoid side effects
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/TestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/TestCase.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/TestCase.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ejb3configuration/TestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,105 @@
+//$Id$
+package org.hibernate.ejb.test.ejb3configuration;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Properties;
+import javax.persistence.Persistence;
+
+import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.Ejb3Configuration;
+import org.hibernate.ejb.HibernatePersistence;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class TestCase extends junit.framework.TestCase {
+ protected Ejb3Configuration configuration;
+ private Class lastTestClass;
+
+ public TestCase() {
+ super();
+ }
+
+ public TestCase(String name) {
+ super( name );
+ }
+
+ public void setUp() {
+ if ( configuration == null || lastTestClass != getClass() ) {
+ buildConfiguration();
+ lastTestClass = getClass();
+ }
+ //factory = new HibernatePersistence().createEntityManagerFactory( getConfig() );
+ }
+
+ protected boolean recreateSchema() {
+ return true;
+ }
+
+ ;
+
+ private void buildConfiguration() {
+ configuration = new Ejb3Configuration();
+ configuration.addProperties( loadProperties() );
+ if ( recreateSchema() ) {
+ configuration.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ }
+
+ for ( Class clazz : getAnnotatedClasses() ) {
+ configuration.addAnnotatedClass( clazz );
+ }
+
+ for ( Map.Entry<Class, String> entry : getCachedClasses().entrySet() ) {
+ configuration.setProperty(
+ HibernatePersistence.CLASS_CACHE_PREFIX + "." + entry.getKey().getName(),
+ entry.getValue()
+ );
+ }
+ for ( Map.Entry<String, String> entry : getCachedCollections().entrySet() ) {
+ configuration.setProperty(
+ HibernatePersistence.COLLECTION_CACHE_PREFIX + "." + entry.getKey(),
+ entry.getValue()
+ );
+ }
+ }
+
+ public abstract Class[] getAnnotatedClasses();
+
+ public Map<Class, String> getCachedClasses() {
+ return new HashMap<Class, String>();
+ }
+
+ public Map<String, String> getCachedCollections() {
+ return new HashMap<String, String>();
+ }
+
+ public static Properties loadProperties() {
+ Properties props = new Properties();
+ InputStream stream = Persistence.class.getResourceAsStream( "/hibernate.properties" );
+ if ( stream != null ) {
+ try {
+ props.load( stream );
+ }
+ catch (Exception e) {
+ throw new RuntimeException( "could not load hibernate.properties" );
+ }
+ finally {
+ try {
+ stream.close();
+ }
+ catch (IOException ioe) {
+ }
+ }
+ }
+ return props;
+ }
+
+ @Override
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ configuration = null; //avoid side effects
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Cat.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Cat.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Cat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.Entity;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
- at Entity
- at Inheritance( strategy = InheritanceType.JOINED )
-public class Cat extends Pet {
- int lives;
-
- public int getLives() {
- return lives;
- }
-
- public void setLives(int lives) {
- this.lives = lives;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Cat.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Cat.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Cat.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Cat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+ at Entity
+ at Inheritance( strategy = InheritanceType.JOINED )
+public class Cat extends Pet {
+ int lives;
+
+ public int getLives() {
+ return lives;
+ }
+
+ public void setLives(int lives) {
+ this.lives = lives;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Colony.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Colony.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Colony.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Colony {
- @Id
- @GeneratedValue
- private Long id;
-
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Colony.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Colony.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Colony.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Colony.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Colony {
+ @Id
+ @GeneratedValue
+ private Long id;
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competition.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competition.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competition.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import java.util.Collection;
-import java.util.ArrayList;
-import java.util.List;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.ManyToMany;
-import javax.persistence.CascadeType;
-import javax.persistence.FetchType;
-import javax.persistence.JoinTable;
-import javax.persistence.JoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Competition {
- @Id
- @GeneratedValue
- private Integer id;
-
- @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE },
- fetch = FetchType.LAZY)
- @JoinTable(name="competition_competitor")
- @JoinColumn
- private List<Competitor> competitors = new ArrayList<Competitor>();
-
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public List<Competitor> getCompetitors() {
- return competitors;
- }
-
- public void setCompetitors(List<Competitor> competitors) {
- this.competitors = competitors;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competition.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competition.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competition.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competition.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import java.util.Collection;
+import java.util.ArrayList;
+import java.util.List;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.ManyToMany;
+import javax.persistence.CascadeType;
+import javax.persistence.FetchType;
+import javax.persistence.JoinTable;
+import javax.persistence.JoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Competition {
+ @Id
+ @GeneratedValue
+ private Integer id;
+
+ @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE },
+ fetch = FetchType.LAZY)
+ @JoinTable(name="competition_competitor")
+ @JoinColumn
+ private List<Competitor> competitors = new ArrayList<Competitor>();
+
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public List<Competitor> getCompetitors() {
+ return competitors;
+ }
+
+ public void setCompetitors(List<Competitor> competitors) {
+ this.competitors = competitors;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competitor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competitor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Competitor {
- @Id @GeneratedValue public Integer id;
- private String name;
-
-
- public Competitor() {
- }
-
- public Competitor(String name) {
- this.name = name;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competitor.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competitor.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competitor.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Competitor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Competitor {
+ @Id @GeneratedValue public Integer id;
+ private String name;
+
+
+ public Competitor() {
+ }
+
+ public Competitor(String name) {
+ this.name = name;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Decorate.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Decorate.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Decorate.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-
- at Entity
-public class Decorate implements java.io.Serializable {
-
- private int id;
-
- private String name;
-
- private Pet pet;
-
- public Decorate() {
- super();
-
- }
-
- @Id
- @GeneratedValue( strategy = GenerationType.AUTO )
- public int getId() {
- return id;
- }
-
- public String getName() {
- return name;
- }
-
- @OneToOne( fetch = FetchType.LAZY )
- public Pet getPet() {
- return pet;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public void setPet(Pet pet) {
- this.pet = pet;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Decorate.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Decorate.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Decorate.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Decorate.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+ at Entity
+public class Decorate implements java.io.Serializable {
+
+ private int id;
+
+ private String name;
+
+ private Pet pet;
+
+ public Decorate() {
+ super();
+
+ }
+
+ @Id
+ @GeneratedValue( strategy = GenerationType.AUTO )
+ public int getId() {
+ return id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ @OneToOne( fetch = FetchType.LAZY )
+ public Pet getPet() {
+ return pet;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void setPet(Pet pet) {
+ this.pet = pet;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dog.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dog.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dog.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.Entity;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
- at Entity
- at Inheritance( strategy = InheritanceType.JOINED )
-public class Dog extends Pet {
- private int numBones;
-
- public int getNumBones() {
- return numBones;
- }
-
- public void setNumBones(int numBones) {
- this.numBones = numBones;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dog.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dog.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dog.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dog.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+ at Entity
+ at Inheritance( strategy = InheritanceType.JOINED )
+public class Dog extends Pet {
+ private int numBones;
+
+ public int getNumBones() {
+ return numBones;
+ }
+
+ public void setNumBones(int numBones) {
+ this.numBones = numBones;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dress.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dress.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dress.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.Id;
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Dress {
- @Id public String name;
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dress.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dress.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dress.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Dress.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.Id;
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Dress {
+ @Id public String name;
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Empire.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Empire.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Empire.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.OneToMany;
-import javax.persistence.CascadeType;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Empire {
- @Id
- @GeneratedValue
- private Long id;
-
- @OneToMany(cascade= CascadeType.ALL )
- private Set<Colony> colonies = new HashSet<Colony>();
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Set<Colony> getColonies() {
- return colonies;
- }
-
- public void setColonies(Set<Colony> colonies) {
- this.colonies = colonies;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Empire.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Empire.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Empire.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Empire.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.OneToMany;
+import javax.persistence.CascadeType;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Empire {
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @OneToMany(cascade= CascadeType.ALL )
+ private Set<Colony> colonies = new HashSet<Colony>();
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Set<Colony> getColonies() {
+ return colonies;
+ }
+
+ public void setColonies(Set<Colony> colonies) {
+ this.colonies = colonies;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushModeTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushModeTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushModeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import java.util.Map;
-import java.util.HashMap;
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FlushModeTest extends TestCase {
-
- public void testCreateEMFlushMode() throws Exception {
- Map properties = new HashMap();
- properties.put( "org.hibernate.flushMode", "manual" );
- EntityManager em = factory.createEntityManager( properties );
- em.getTransaction().begin();
- Dress dress = new Dress();
- dress.name = "long dress";
- em.persist( dress );
- em.getTransaction().commit();
-
- em.clear();
-
- assertNull( em.find( Dress.class, dress.name ) );
-
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[] {
- Race.class,
- Competitor.class,
- Dress.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushModeTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushModeTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushModeTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushModeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import java.util.Map;
+import java.util.HashMap;
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FlushModeTest extends TestCase {
+
+ public void testCreateEMFlushMode() throws Exception {
+ Map properties = new HashMap();
+ properties.put( "org.hibernate.flushMode", "manual" );
+ EntityManager em = factory.createEntityManager( properties );
+ em.getTransaction().begin();
+ Dress dress = new Dress();
+ dress.name = "long dress";
+ em.persist( dress );
+ em.getTransaction().commit();
+
+ em.clear();
+
+ assertNull( em.find( Dress.class, dress.name ) );
+
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[] {
+ Race.class,
+ Competitor.class,
+ Dress.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,124 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Set;
-import java.util.HashSet;
-
-import javax.persistence.Query;
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FlushTest extends TestCase {
- private static Set<String> names= new HashSet<String>();
- static {
- names.add("Toonses");
- names.add("Sox");
- names.add("Winnie");
- names.add("Junior");
- }
-
- //Test for EJBTHREE-722
- public void testFlushOnDetached() throws Exception {
- EntityManager manager = factory.createEntityManager( );
-
- manager.getTransaction().begin();
- Pet p1 = createCat("Toonses", 15.0, 9, manager);
- manager.flush();
- manager.clear();
-
- Pet p2 = createCat("Sox", 10.0, 5, manager);
- manager.flush();
- manager.clear();
-
- Pet p3 = createDog("Winnie", 70.0, 5, manager);
- manager.flush();
- manager.clear();
-
- Pet p4 = createDog("Junior", 11.0, 1, manager);
- manager.flush();
- manager.clear();
-
- Decorate d1 = createDecorate("Test", p1, manager);
- manager.flush();
- manager.clear();
-
- Decorate d2 = createDecorate("Test2", p2, manager);
- manager.flush();
- manager.clear();
-
- List l = findByWeight(14.0, manager);
- manager.flush();
- manager.clear();
- for (Object o : l) {
- assertTrue( names.contains( ( (Pet) o).getName() ) );
- }
-
- Collection<Decorate> founds = getDecorate(manager);
- manager.flush();
- manager.clear();
- for (Decorate value : founds) {
- assertTrue( names.contains( value.getPet().getName() ) );
- }
-
- }
-
- public Dog createDog(String name, double weight, int bones, EntityManager manager) {
- Dog dog = new Dog();
- dog.setName(name);
- dog.setWeight(weight);
- dog.setNumBones(bones);
- manager.persist(dog);
- return dog;
- }
-
- public Cat createCat(String name, double weight, int lives, EntityManager manager) {
- Cat cat = new Cat();
- cat.setName(name);
- cat.setWeight(weight);
- cat.setLives(lives);
- manager.persist(cat);
- return cat;
- }
-
- public List findByWeight(double weight, EntityManager manager) {
- return manager.createQuery(
- "select p from Pet p where p.weight < :weight").setParameter(
- "weight", weight).getResultList();
- }
-
- public Decorate createDecorate(String name, Pet pet, EntityManager manager) {
- Decorate dec = new Decorate();
- dec.setName(name);
- dec.setPet(pet);
- manager.persist(dec);
- return dec;
- }
-
- public Collection<Decorate> getDecorate(EntityManager manager) {
- Collection<Decorate> founds = new ArrayList<Decorate>();
- Query query = manager.createQuery("SELECT o FROM Decorate o");
- List list = query.getResultList();
- for (Object obj : list) {
- if (obj instanceof Decorate) {
- founds.add((Decorate) obj);
- }
- }
- return founds;
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[] {
- Pet.class,
- Dog.class,
- Cat.class,
- Decorate.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/FlushTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,124 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Set;
+import java.util.HashSet;
+
+import javax.persistence.Query;
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FlushTest extends TestCase {
+ private static Set<String> names= new HashSet<String>();
+ static {
+ names.add("Toonses");
+ names.add("Sox");
+ names.add("Winnie");
+ names.add("Junior");
+ }
+
+ //Test for EJBTHREE-722
+ public void testFlushOnDetached() throws Exception {
+ EntityManager manager = factory.createEntityManager( );
+
+ manager.getTransaction().begin();
+ Pet p1 = createCat("Toonses", 15.0, 9, manager);
+ manager.flush();
+ manager.clear();
+
+ Pet p2 = createCat("Sox", 10.0, 5, manager);
+ manager.flush();
+ manager.clear();
+
+ Pet p3 = createDog("Winnie", 70.0, 5, manager);
+ manager.flush();
+ manager.clear();
+
+ Pet p4 = createDog("Junior", 11.0, 1, manager);
+ manager.flush();
+ manager.clear();
+
+ Decorate d1 = createDecorate("Test", p1, manager);
+ manager.flush();
+ manager.clear();
+
+ Decorate d2 = createDecorate("Test2", p2, manager);
+ manager.flush();
+ manager.clear();
+
+ List l = findByWeight(14.0, manager);
+ manager.flush();
+ manager.clear();
+ for (Object o : l) {
+ assertTrue( names.contains( ( (Pet) o).getName() ) );
+ }
+
+ Collection<Decorate> founds = getDecorate(manager);
+ manager.flush();
+ manager.clear();
+ for (Decorate value : founds) {
+ assertTrue( names.contains( value.getPet().getName() ) );
+ }
+
+ }
+
+ public Dog createDog(String name, double weight, int bones, EntityManager manager) {
+ Dog dog = new Dog();
+ dog.setName(name);
+ dog.setWeight(weight);
+ dog.setNumBones(bones);
+ manager.persist(dog);
+ return dog;
+ }
+
+ public Cat createCat(String name, double weight, int lives, EntityManager manager) {
+ Cat cat = new Cat();
+ cat.setName(name);
+ cat.setWeight(weight);
+ cat.setLives(lives);
+ manager.persist(cat);
+ return cat;
+ }
+
+ public List findByWeight(double weight, EntityManager manager) {
+ return manager.createQuery(
+ "select p from Pet p where p.weight < :weight").setParameter(
+ "weight", weight).getResultList();
+ }
+
+ public Decorate createDecorate(String name, Pet pet, EntityManager manager) {
+ Decorate dec = new Decorate();
+ dec.setName(name);
+ dec.setPet(pet);
+ manager.persist(dec);
+ return dec;
+ }
+
+ public Collection<Decorate> getDecorate(EntityManager manager) {
+ Collection<Decorate> founds = new ArrayList<Decorate>();
+ Query query = manager.createQuery("SELECT o FROM Decorate o");
+ List list = query.getResultList();
+ for (Object obj : list) {
+ if (obj instanceof Decorate) {
+ founds.add((Decorate) obj);
+ }
+ }
+ return founds;
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[] {
+ Pet.class,
+ Dog.class,
+ Cat.class,
+ Decorate.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-
-/**
- * @author Emmanuel Bernard
- */
-public class GetReferenceTest extends TestCase {
-
- public void testWrongIdType() throws Exception {
- EntityManager em = factory.createEntityManager();
- try {
- Competitor c = em.getReference( Competitor.class, new String("30") );
- fail("Expected IllegalArgumentException");
- }
- catch (IllegalArgumentException e) {
- //success
- }
- catch ( Exception e ) {
- fail("Wrong exception: " + e );
- }
-
- try {
- Mail c = em.getReference( Mail.class, 1 );
- fail("Expected IllegalArgumentException");
- }
- catch (IllegalArgumentException e) {
- //success
- }
- catch ( Exception e ) {
- fail("Wrong exception: " + e );
- }
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[] {
- Competitor.class,
- Race.class,
- Mail.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/GetReferenceTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class GetReferenceTest extends TestCase {
+
+ public void testWrongIdType() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ try {
+ Competitor c = em.getReference( Competitor.class, new String("30") );
+ fail("Expected IllegalArgumentException");
+ }
+ catch (IllegalArgumentException e) {
+ //success
+ }
+ catch ( Exception e ) {
+ fail("Wrong exception: " + e );
+ }
+
+ try {
+ Mail c = em.getReference( Mail.class, 1 );
+ fail("Expected IllegalArgumentException");
+ }
+ catch (IllegalArgumentException e) {
+ //success
+ }
+ catch ( Exception e ) {
+ fail("Wrong exception: " + e );
+ }
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[] {
+ Competitor.class,
+ Race.class,
+ Mail.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Mail.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Mail.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Mail.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Mail {
- @Id private Long id;
- private String from;
-
- public String getFrom() {
- return from;
- }
-
- public void setFrom(String from) {
- this.from = from;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Mail.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Mail.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Mail.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Mail.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Mail {
+ @Id private Long id;
+ private String from;
+
+ public String getFrom() {
+ return from;
+ }
+
+ public void setFrom(String from) {
+ this.from = from;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/MergeTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/MergeTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/MergeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,171 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import java.util.List;
-import java.util.ArrayList;
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MergeTest extends TestCase {
- public void testMergeWithIndexColumn() {
- Race race = new Race();
- race.competitors.add( new Competitor("Name") );
- race.competitors.add( new Competitor() );
- race.competitors.add( new Competitor() );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( race );
- em.flush();
- em.clear();
- race.competitors.add( new Competitor() );
- race.competitors.remove( 2 );
- race.competitors.remove( 1 );
- race.competitors.get( 0 ).setName( "Name2" );
- race = em.merge( race );
- em.flush();
- em.clear();
- race = em.find( Race.class, race.id );
- assertEquals( 2, race.competitors.size() );
- assertEquals( "Name2", race.competitors.get(0).getName() );
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testMergeManyToMany() {
- Competition competition = new Competition();
- competition.getCompetitors().add( new Competitor("Name") );
- competition.getCompetitors().add( new Competitor() );
- competition.getCompetitors().add( new Competitor() );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( competition );
- em.flush();
- em.clear();
- competition.getCompetitors().add( new Competitor() );
- competition.getCompetitors().remove( 2 );
- competition.getCompetitors().remove( 1 );
- competition.getCompetitors().get(0).setName( "Name2" );
- competition = em.merge( competition );
- em.flush();
- em.clear();
- competition = em.find( Competition.class, competition.getId() );
- assertEquals( 2, competition.getCompetitors().size() );
- assertEquals( "Name2", competition.getCompetitors().get(0).getName() );
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testMergeManyToManyWithDeference() {
- Competition competition = new Competition();
- competition.getCompetitors().add( new Competitor("Name") );
- competition.getCompetitors().add( new Competitor() );
- competition.getCompetitors().add( new Competitor() );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( competition );
- em.flush();
- em.clear();
- List<Competitor> newComp = new ArrayList<Competitor>();
- newComp.add( competition.getCompetitors().get(0) );
- newComp.add( new Competitor() );
- newComp.get(0).setName( "Name2" );
- competition.setCompetitors( newComp );
- competition = em.merge( competition );
- em.flush();
- em.clear();
- competition = em.find( Competition.class, competition.getId() );
- assertEquals( 2, competition.getCompetitors().size() );
- assertEquals( "Name2", competition.getCompetitors().get(0).getName() );
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testRemoveAndMerge() {
- Race race = new Race();
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( race );
- em.flush();
- em.clear();
- race = em.find(Race.class, race.id );
- em.remove(race);
- try {
- race = em.merge( race );
- em.flush();
- fail("Should raise an IllegalArgumentException");
- }
- catch (IllegalArgumentException e) {
- //all good
- }
- catch (Exception e) {
- fail("Should raise an IllegalArgumentException");
- }
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testConcurrentMerge() {
- Race race = new Race();
- race.name = "Derby";
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( race );
- em.flush();
- em.getTransaction().commit();
- em.close();
-
- race.name = "Magnicourt";
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
- Race race2 = em.find(Race.class, race.id );
- race2.name = "Mans";
-
- race = em.merge( race );
- em.flush();
- em.getTransaction().commit();
- em.close();
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
- race2 = em.find(Race.class, race.id );
- assertEquals( "Last commit win in merge", "Magnicourt", race2.name );
-
- em.remove( race2 );
- em.getTransaction().commit();
- em.close();
- }
-
- public void testMergeUnidirectionalOneToMany() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Empire roman = new Empire();
- em.persist( roman );
- em.flush();
- em.clear();
- roman = em.find( Empire.class, roman.getId() );
- Colony gaule = new Colony();
- roman.getColonies().add(gaule);
- em.merge( roman );
- em.flush();
- em.clear();
- roman = em.find(Empire.class, roman.getId() );
- assertEquals( 1, roman.getColonies().size() );
- em.getTransaction().rollback();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[] {
- Race.class,
- Competitor.class,
- Competition.class,
- Empire.class,
- Colony.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/MergeTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/MergeTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/MergeTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/MergeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,171 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import java.util.List;
+import java.util.ArrayList;
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MergeTest extends TestCase {
+ public void testMergeWithIndexColumn() {
+ Race race = new Race();
+ race.competitors.add( new Competitor("Name") );
+ race.competitors.add( new Competitor() );
+ race.competitors.add( new Competitor() );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( race );
+ em.flush();
+ em.clear();
+ race.competitors.add( new Competitor() );
+ race.competitors.remove( 2 );
+ race.competitors.remove( 1 );
+ race.competitors.get( 0 ).setName( "Name2" );
+ race = em.merge( race );
+ em.flush();
+ em.clear();
+ race = em.find( Race.class, race.id );
+ assertEquals( 2, race.competitors.size() );
+ assertEquals( "Name2", race.competitors.get(0).getName() );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testMergeManyToMany() {
+ Competition competition = new Competition();
+ competition.getCompetitors().add( new Competitor("Name") );
+ competition.getCompetitors().add( new Competitor() );
+ competition.getCompetitors().add( new Competitor() );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( competition );
+ em.flush();
+ em.clear();
+ competition.getCompetitors().add( new Competitor() );
+ competition.getCompetitors().remove( 2 );
+ competition.getCompetitors().remove( 1 );
+ competition.getCompetitors().get(0).setName( "Name2" );
+ competition = em.merge( competition );
+ em.flush();
+ em.clear();
+ competition = em.find( Competition.class, competition.getId() );
+ assertEquals( 2, competition.getCompetitors().size() );
+ assertEquals( "Name2", competition.getCompetitors().get(0).getName() );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testMergeManyToManyWithDeference() {
+ Competition competition = new Competition();
+ competition.getCompetitors().add( new Competitor("Name") );
+ competition.getCompetitors().add( new Competitor() );
+ competition.getCompetitors().add( new Competitor() );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( competition );
+ em.flush();
+ em.clear();
+ List<Competitor> newComp = new ArrayList<Competitor>();
+ newComp.add( competition.getCompetitors().get(0) );
+ newComp.add( new Competitor() );
+ newComp.get(0).setName( "Name2" );
+ competition.setCompetitors( newComp );
+ competition = em.merge( competition );
+ em.flush();
+ em.clear();
+ competition = em.find( Competition.class, competition.getId() );
+ assertEquals( 2, competition.getCompetitors().size() );
+ assertEquals( "Name2", competition.getCompetitors().get(0).getName() );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testRemoveAndMerge() {
+ Race race = new Race();
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( race );
+ em.flush();
+ em.clear();
+ race = em.find(Race.class, race.id );
+ em.remove(race);
+ try {
+ race = em.merge( race );
+ em.flush();
+ fail("Should raise an IllegalArgumentException");
+ }
+ catch (IllegalArgumentException e) {
+ //all good
+ }
+ catch (Exception e) {
+ fail("Should raise an IllegalArgumentException");
+ }
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testConcurrentMerge() {
+ Race race = new Race();
+ race.name = "Derby";
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( race );
+ em.flush();
+ em.getTransaction().commit();
+ em.close();
+
+ race.name = "Magnicourt";
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Race race2 = em.find(Race.class, race.id );
+ race2.name = "Mans";
+
+ race = em.merge( race );
+ em.flush();
+ em.getTransaction().commit();
+ em.close();
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ race2 = em.find(Race.class, race.id );
+ assertEquals( "Last commit win in merge", "Magnicourt", race2.name );
+
+ em.remove( race2 );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testMergeUnidirectionalOneToMany() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Empire roman = new Empire();
+ em.persist( roman );
+ em.flush();
+ em.clear();
+ roman = em.find( Empire.class, roman.getId() );
+ Colony gaule = new Colony();
+ roman.getColonies().add(gaule);
+ em.merge( roman );
+ em.flush();
+ em.clear();
+ roman = em.find(Empire.class, roman.getId() );
+ assertEquals( 1, roman.getColonies().size() );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[] {
+ Race.class,
+ Competitor.class,
+ Competition.class,
+ Empire.class,
+ Colony.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Music.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Music.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Music.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.Version;
-import javax.persistence.Id;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Music {
- @Id @GeneratedValue
- private Integer id;
- private String name;
- @Version
- private Integer version;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getVersion() {
- return version;
- }
-
- public void setVersion(Integer version) {
- this.version = version;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Music.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Music.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Music.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Music.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.Version;
+import javax.persistence.Id;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Music {
+ @Id @GeneratedValue
+ private Integer id;
+ private String name;
+ @Version
+ private Integer version;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getVersion() {
+ return version;
+ }
+
+ public void setVersion(Integer version) {
+ this.version = version;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Pet.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Pet.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Pet.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-
- at Entity
- at Inheritance( strategy = InheritanceType.JOINED )
-public class Pet implements java.io.Serializable {
- private int id;
- private String name;
- private double weight;
-
- @Id
- @GeneratedValue( strategy = GenerationType.AUTO )
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public double getWeight() {
- return weight;
- }
-
- public void setWeight(double weight) {
- this.weight = weight;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Pet.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Pet.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Pet.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Pet.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+
+ at Entity
+ at Inheritance( strategy = InheritanceType.JOINED )
+public class Pet implements java.io.Serializable {
+ private int id;
+ private String name;
+ private double weight;
+
+ @Id
+ @GeneratedValue( strategy = GenerationType.AUTO )
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public double getWeight() {
+ return weight;
+ }
+
+ public void setWeight(double weight) {
+ this.weight = weight;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Race.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Race.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Race.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import java.util.List;
-import java.util.ArrayList;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Entity;
-import javax.persistence.OneToMany;
-import javax.persistence.CascadeType;
-import javax.persistence.FetchType;
-
-import org.hibernate.annotations.IndexColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Race {
- @Id @GeneratedValue public Integer id;
- @IndexColumn( name="index" ) @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
- @org.hibernate.annotations.Cascade( { org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
- public List<Competitor> competitors = new ArrayList<Competitor>();
- public String name;
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Race.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Race.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Race.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/Race.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import java.util.List;
+import java.util.ArrayList;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+import javax.persistence.OneToMany;
+import javax.persistence.CascadeType;
+import javax.persistence.FetchType;
+
+import org.hibernate.annotations.IndexColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Race {
+ @Id @GeneratedValue public Integer id;
+ @IndexColumn( name="index" ) @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
+ @org.hibernate.annotations.Cascade( { org.hibernate.annotations.CascadeType.ALL, org.hibernate.annotations.CascadeType.DELETE_ORPHAN })
+ public List<Competitor> competitors = new ArrayList<Competitor>();
+ public String name;
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RefreshTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RefreshTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RefreshTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class RefreshTest extends TestCase {
-
- public void testRefreshNonManaged() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Race race = new Race();
- em.persist( race );
- em.flush();
- em.clear();
-
- try {
- em.refresh( race );
- fail("Refresh should fail on a non managed entity");
- }
- catch( IllegalArgumentException e) {
- //success
- }
-
- em.getTransaction().rollback();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[] {
- Race.class,
- Competitor.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RefreshTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RefreshTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RefreshTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RefreshTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class RefreshTest extends TestCase {
+
+ public void testRefreshNonManaged() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Race race = new Race();
+ em.persist( race );
+ em.flush();
+ em.clear();
+
+ try {
+ em.refresh( race );
+ fail("Refresh should fail on a non managed entity");
+ }
+ catch( IllegalArgumentException e) {
+ //success
+ }
+
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[] {
+ Race.class,
+ Competitor.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RemoveTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RemoveTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RemoveTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,95 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops;
-
-import java.util.Map;
-import javax.persistence.EntityManager;
-import javax.persistence.OptimisticLockException;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class RemoveTest extends TestCase {
- public void testRemove() {
- Race race = new Race();
- race.competitors.add( new Competitor() );
- race.competitors.add( new Competitor() );
- race.competitors.add( new Competitor() );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( race );
- em.flush();
- em.remove( race );
- em.flush();
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testRemoveAndFind() {
- Race race = new Race();
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( race );
- em.remove( race );
- assertNull( em.find( Race.class, race.id ) );
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testUpdatedAndRemove() {
- Music music = new Music();
- music.setName( "Classical" );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( music );
- em.getTransaction().commit();
-
- em.clear();
-
- em = factory.createEntityManager();
- em.getTransaction().begin();
- EntityManager em2 = factory.createEntityManager();
- em2.getTransaction().begin();
-
- //read music from 2nd EM
- music = em2.find( Music.class, music.getId() );
-
- //change music
- em.find( Music.class, music.getId() ).setName( "Rap" );
- em.getTransaction().commit();
-
- try {
- em2.remove( music ); //remove changed music
- em2.flush();
- fail("should have an optimistic lock exception");
- }
- catch( OptimisticLockException e ) {
- //success
- }
- finally {
- em2.getTransaction().rollback();
- }
-
- //clean
- em.remove( em.find( Music.class, music.getId() ) );
-
- em.close();
- em2.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[] {
- Race.class,
- Competitor.class,
- Music.class
- };
- }
-
-
- public Map getConfig() {
- Map cfg = super.getConfig();
- cfg.put( "hibernate.jdbc.batch_size", "0");
- return cfg;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RemoveTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RemoveTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RemoveTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/RemoveTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,95 @@
+//$Id: $
+package org.hibernate.ejb.test.emops;
+
+import java.util.Map;
+import javax.persistence.EntityManager;
+import javax.persistence.OptimisticLockException;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class RemoveTest extends TestCase {
+ public void testRemove() {
+ Race race = new Race();
+ race.competitors.add( new Competitor() );
+ race.competitors.add( new Competitor() );
+ race.competitors.add( new Competitor() );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( race );
+ em.flush();
+ em.remove( race );
+ em.flush();
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testRemoveAndFind() {
+ Race race = new Race();
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( race );
+ em.remove( race );
+ assertNull( em.find( Race.class, race.id ) );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testUpdatedAndRemove() {
+ Music music = new Music();
+ music.setName( "Classical" );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( music );
+ em.getTransaction().commit();
+
+ em.clear();
+
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ EntityManager em2 = factory.createEntityManager();
+ em2.getTransaction().begin();
+
+ //read music from 2nd EM
+ music = em2.find( Music.class, music.getId() );
+
+ //change music
+ em.find( Music.class, music.getId() ).setName( "Rap" );
+ em.getTransaction().commit();
+
+ try {
+ em2.remove( music ); //remove changed music
+ em2.flush();
+ fail("should have an optimistic lock exception");
+ }
+ catch( OptimisticLockException e ) {
+ //success
+ }
+ finally {
+ em2.getTransaction().rollback();
+ }
+
+ //clean
+ em.remove( em.find( Music.class, music.getId() ) );
+
+ em.close();
+ em2.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[] {
+ Race.class,
+ Competitor.class,
+ Music.class
+ };
+ }
+
+
+ public Map getConfig() {
+ Map cfg = super.getConfig();
+ cfg.put( "hibernate.jdbc.batch_size", "0");
+ return cfg;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/A.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/A.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/A.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,92 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops.cascade;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.OneToMany;
-
- at Entity
-public class A {
-
- @Id
- @GeneratedValue( strategy = GenerationType.AUTO )
- private int id;
-
- private String name;
-
- @OneToMany( fetch = FetchType.LAZY, mappedBy = "a", cascade = {CascadeType.PERSIST} )
- private Set<B1> b1List;
-
- @OneToMany( fetch = FetchType.LAZY, mappedBy = "a", cascade = {CascadeType.PERSIST} )
- private Set<B2> b2List;
-
- @OneToMany( fetch = FetchType.LAZY, mappedBy = "a", cascade = {CascadeType.PERSIST} )
- private Set<B3> b3List;
-
- @OneToMany( fetch = FetchType.LAZY, mappedBy = "a", cascade = {CascadeType.PERSIST} )
- private Set<B4> b4List;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public Set<B1> getB1List() {
- if ( b1List == null )
- b1List = new HashSet<B1>();
- return b1List;
- }
-
- public void setB1List(Set<B1> list) {
- b1List = list;
- }
-
- public Set<B2> getB2List() {
- if ( b2List == null )
- b2List = new HashSet<B2>();
- return b2List;
- }
-
- public void setB2List(Set<B2> list) {
- b2List = list;
- }
-
- public Set<B3> getB3List() {
- return b3List;
- }
-
- public void setB3List(Set<B3> list) {
- if ( b3List == null )
- b3List = new HashSet<B3>();
- b3List = list;
- }
-
- public Set<B4> getB4List() {
- return b4List;
- }
-
- public void setB4List(Set<B4> list) {
- if ( b4List == null )
- b4List = new HashSet<B4>();
- b4List = list;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/A.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/A.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/A.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/A.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,92 @@
+//$Id: $
+package org.hibernate.ejb.test.emops.cascade;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+
+ at Entity
+public class A {
+
+ @Id
+ @GeneratedValue( strategy = GenerationType.AUTO )
+ private int id;
+
+ private String name;
+
+ @OneToMany( fetch = FetchType.LAZY, mappedBy = "a", cascade = {CascadeType.PERSIST} )
+ private Set<B1> b1List;
+
+ @OneToMany( fetch = FetchType.LAZY, mappedBy = "a", cascade = {CascadeType.PERSIST} )
+ private Set<B2> b2List;
+
+ @OneToMany( fetch = FetchType.LAZY, mappedBy = "a", cascade = {CascadeType.PERSIST} )
+ private Set<B3> b3List;
+
+ @OneToMany( fetch = FetchType.LAZY, mappedBy = "a", cascade = {CascadeType.PERSIST} )
+ private Set<B4> b4List;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public Set<B1> getB1List() {
+ if ( b1List == null )
+ b1List = new HashSet<B1>();
+ return b1List;
+ }
+
+ public void setB1List(Set<B1> list) {
+ b1List = list;
+ }
+
+ public Set<B2> getB2List() {
+ if ( b2List == null )
+ b2List = new HashSet<B2>();
+ return b2List;
+ }
+
+ public void setB2List(Set<B2> list) {
+ b2List = list;
+ }
+
+ public Set<B3> getB3List() {
+ return b3List;
+ }
+
+ public void setB3List(Set<B3> list) {
+ if ( b3List == null )
+ b3List = new HashSet<B3>();
+ b3List = list;
+ }
+
+ public Set<B4> getB4List() {
+ return b4List;
+ }
+
+ public void setB4List(Set<B4> list) {
+ if ( b4List == null )
+ b4List = new HashSet<B4>();
+ b4List = list;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B1.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B1.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops.cascade;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-
-
- at Entity
-public class B1 {
-
- @Id
- @GeneratedValue( strategy = GenerationType.AUTO )
- private int id;
-
- @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
- @JoinColumn( name = "aId" )
- private A a;
-
- @OneToMany( fetch = FetchType.LAZY, mappedBy = "b1", cascade = {CascadeType.PERSIST} )
- private Set<C1> c1List;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public A getA() {
- return a;
- }
-
- public void setA(A a) {
- this.a = a;
- }
-
- public Set<C1> getC1List() {
- if ( c1List == null )
- c1List = new HashSet<C1>();
- return c1List;
- }
-
- public void setC1List(Set<C1> list) {
- c1List = list;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B1.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B1.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B1.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+//$Id: $
+package org.hibernate.ejb.test.emops.cascade;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+
+ at Entity
+public class B1 {
+
+ @Id
+ @GeneratedValue( strategy = GenerationType.AUTO )
+ private int id;
+
+ @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
+ @JoinColumn( name = "aId" )
+ private A a;
+
+ @OneToMany( fetch = FetchType.LAZY, mappedBy = "b1", cascade = {CascadeType.PERSIST} )
+ private Set<C1> c1List;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public A getA() {
+ return a;
+ }
+
+ public void setA(A a) {
+ this.a = a;
+ }
+
+ public Set<C1> getC1List() {
+ if ( c1List == null )
+ c1List = new HashSet<C1>();
+ return c1List;
+ }
+
+ public void setC1List(Set<C1> list) {
+ c1List = list;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B2.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B2.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,55 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops.cascade;
-
-import java.util.HashSet;
-import java.util.Set;
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.OneToMany;
-
- at Entity
-public class B2 {
-
- @Id
- @GeneratedValue( strategy = GenerationType.AUTO )
- private int id;
-
- @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
- @JoinColumn( name = "aId" )
- private A a;
-
- @OneToMany( fetch = FetchType.LAZY, mappedBy = "b2", cascade = {CascadeType.PERSIST} )
- private Set<C2> c2List;
-
- public A getA() {
- return a;
- }
-
- public void setA(A a) {
- this.a = a;
- }
-
- public Set<C2> getC2List() {
- if ( c2List == null )
- c2List = new HashSet<C2>();
- return c2List;
- }
-
- public void setC2List(Set<C2> list) {
- c2List = list;
- }
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B2.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B2.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B2.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,55 @@
+//$Id: $
+package org.hibernate.ejb.test.emops.cascade;
+
+import java.util.HashSet;
+import java.util.Set;
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+import javax.persistence.OneToMany;
+
+ at Entity
+public class B2 {
+
+ @Id
+ @GeneratedValue( strategy = GenerationType.AUTO )
+ private int id;
+
+ @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
+ @JoinColumn( name = "aId" )
+ private A a;
+
+ @OneToMany( fetch = FetchType.LAZY, mappedBy = "b2", cascade = {CascadeType.PERSIST} )
+ private Set<C2> c2List;
+
+ public A getA() {
+ return a;
+ }
+
+ public void setA(A a) {
+ this.a = a;
+ }
+
+ public Set<C2> getC2List() {
+ if ( c2List == null )
+ c2List = new HashSet<C2>();
+ return c2List;
+ }
+
+ public void setC2List(Set<C2> list) {
+ c2List = list;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B3.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B3.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B3.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops.cascade;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
- at Entity
-public class B3 {
-
- @Id
- @GeneratedValue( strategy = GenerationType.AUTO )
- private int id;
-
- @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
- @JoinColumn( name = "aId" )
- private A a;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public A getA() {
- return a;
- }
-
- public void setA(A a) {
- this.a = a;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B3.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B3.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B3.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B3.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.ejb.test.emops.cascade;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class B3 {
+
+ @Id
+ @GeneratedValue( strategy = GenerationType.AUTO )
+ private int id;
+
+ @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
+ @JoinColumn( name = "aId" )
+ private A a;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public A getA() {
+ return a;
+ }
+
+ public void setA(A a) {
+ this.a = a;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B4.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B4.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B4.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops.cascade;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
- at Entity
-public class B4 {
-
- @Id
- @GeneratedValue( strategy = GenerationType.AUTO )
- private int id;
-
- @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
- @JoinColumn( name = "aId" )
- private A a;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public A getA() {
- return a;
- }
-
- public void setA(A a) {
- this.a = a;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B4.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B4.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B4.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/B4.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.ejb.test.emops.cascade;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class B4 {
+
+ @Id
+ @GeneratedValue( strategy = GenerationType.AUTO )
+ private int id;
+
+ @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
+ @JoinColumn( name = "aId" )
+ private A a;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public A getA() {
+ return a;
+ }
+
+ public void setA(A a) {
+ this.a = a;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C1.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C1.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops.cascade;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
- at Entity
-public class C1 {
-
- @Id
- @GeneratedValue( strategy = GenerationType.AUTO )
- private int id;
-
- @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
- @JoinColumn( name = "b1Id" )
- private B1 b1;
-
- public B1 getB1() {
- return b1;
- }
-
- public void setB1(B1 b1) {
- this.b1 = b1;
- }
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C1.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C1.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C1.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C1.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.ejb.test.emops.cascade;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class C1 {
+
+ @Id
+ @GeneratedValue( strategy = GenerationType.AUTO )
+ private int id;
+
+ @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
+ @JoinColumn( name = "b1Id" )
+ private B1 b1;
+
+ public B1 getB1() {
+ return b1;
+ }
+
+ public void setB1(B1 b1) {
+ this.b1 = b1;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C2.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C2.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops.cascade;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.FetchType;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-
- at Entity
-public class C2 {
-
- @Id
- @GeneratedValue( strategy = GenerationType.AUTO )
- private int id;
-
- @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
- @JoinColumn( name = "b2Id" )
- private B2 b2;
-
- public B2 getB2() {
- return b2;
- }
-
- public void setB2(B2 b2) {
- this.b2 = b2;
- }
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C2.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C2.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C2.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/C2.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.ejb.test.emops.cascade;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.JoinColumn;
+import javax.persistence.ManyToOne;
+
+ at Entity
+public class C2 {
+
+ @Id
+ @GeneratedValue( strategy = GenerationType.AUTO )
+ private int id;
+
+ @ManyToOne( fetch = FetchType.LAZY, cascade = {CascadeType.PERSIST} )
+ @JoinColumn( name = "b2Id" )
+ private B2 b2;
+
+ public B2 getB2() {
+ return b2;
+ }
+
+ public void setB2(B2 b2) {
+ this.b2 = b2;
+ }
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/CascadePersistTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/CascadePersistTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/CascadePersistTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,97 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.emops.cascade;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-import org.hibernate.Session;
-import org.hibernate.stat.Statistics;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CascadePersistTest extends TestCase {
-
- public void testLazyCollectionsStayLazyOnPersist() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- //initialize
- A a = new A();
- a.setName( "name1" );
- em.persist( a );
- a = new A();
- a.setName( "name2" );
- em.persist( a );
- a = new A();
- a.setName( "name3" );
- em.persist( a );
- em.flush();
- a = em.find( A.class, 1 );
- for ( int i = 0; i < 3; i++ ) {
- B1 b1 = new B1();
- b1.setA( a );
- em.persist( b1 );
- }
- for ( int i = 0; i < 3; i++ ) {
- B2 b2 = new B2();
- b2.setA( a );
- em.persist( b2 );
- }
- for ( int i = 0; i < 3; i++ ) {
- B3 b3 = new B3();
- b3.setA( a );
- em.persist( b3 );
- }
- for ( int i = 0; i < 3; i++ ) {
- B4 b4 = new B4();
- b4.setA( a );
- em.persist( b4 );
- }
- em.flush();
- B1 b1 = em.find( B1.class, 1 );
- for ( int i = 0; i < 2; i++ ) {
- C1 c1 = new C1();
- c1.setB1( b1 );
- em.persist( c1 );
- }
- B2 b2 = em.find( B2.class, 1 );
- for ( int i = 0; i < 4; i++ ) {
- C2 c2 = new C2();
- c2.setB2( b2 );
- em.persist( c2 );
- }
- em.flush();
- em.clear();
-
- //test
- a = em.find( A.class, 1 );
- C2 c2 = new C2();
- for ( B2 anotherB2 : a.getB2List() ) {
- if ( anotherB2.getId() == 1 ) {
- anotherB2.getC2List().add( c2 );
- c2.setB2( anotherB2 );
- }
- }
- Statistics statistics = ( (Session) em.getDelegate() ).getSessionFactory().getStatistics();
- statistics.setStatisticsEnabled( true );
- statistics.clear();
- em.persist( c2 );
- long loaded = statistics.getEntityLoadCount();
- assertEquals( 0, loaded );
- em.flush();
- em.getTransaction().rollback();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- A.class,
- B1.class,
- B2.class,
- B3.class,
- B4.class,
- C1.class,
- C2.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/CascadePersistTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/CascadePersistTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/CascadePersistTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/emops/cascade/CascadePersistTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,97 @@
+//$Id: $
+package org.hibernate.ejb.test.emops.cascade;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+import org.hibernate.Session;
+import org.hibernate.stat.Statistics;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CascadePersistTest extends TestCase {
+
+ public void testLazyCollectionsStayLazyOnPersist() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ //initialize
+ A a = new A();
+ a.setName( "name1" );
+ em.persist( a );
+ a = new A();
+ a.setName( "name2" );
+ em.persist( a );
+ a = new A();
+ a.setName( "name3" );
+ em.persist( a );
+ em.flush();
+ a = em.find( A.class, 1 );
+ for ( int i = 0; i < 3; i++ ) {
+ B1 b1 = new B1();
+ b1.setA( a );
+ em.persist( b1 );
+ }
+ for ( int i = 0; i < 3; i++ ) {
+ B2 b2 = new B2();
+ b2.setA( a );
+ em.persist( b2 );
+ }
+ for ( int i = 0; i < 3; i++ ) {
+ B3 b3 = new B3();
+ b3.setA( a );
+ em.persist( b3 );
+ }
+ for ( int i = 0; i < 3; i++ ) {
+ B4 b4 = new B4();
+ b4.setA( a );
+ em.persist( b4 );
+ }
+ em.flush();
+ B1 b1 = em.find( B1.class, 1 );
+ for ( int i = 0; i < 2; i++ ) {
+ C1 c1 = new C1();
+ c1.setB1( b1 );
+ em.persist( c1 );
+ }
+ B2 b2 = em.find( B2.class, 1 );
+ for ( int i = 0; i < 4; i++ ) {
+ C2 c2 = new C2();
+ c2.setB2( b2 );
+ em.persist( c2 );
+ }
+ em.flush();
+ em.clear();
+
+ //test
+ a = em.find( A.class, 1 );
+ C2 c2 = new C2();
+ for ( B2 anotherB2 : a.getB2List() ) {
+ if ( anotherB2.getId() == 1 ) {
+ anotherB2.getC2List().add( c2 );
+ c2.setB2( anotherB2 );
+ }
+ }
+ Statistics statistics = ( (Session) em.getDelegate() ).getSessionFactory().getStatistics();
+ statistics.setStatisticsEnabled( true );
+ statistics.clear();
+ em.persist( c2 );
+ long loaded = statistics.getEntityLoadCount();
+ assertEquals( 0, loaded );
+ em.flush();
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ A.class,
+ B1.class,
+ B2.class,
+ B3.class,
+ B4.class,
+ C1.class,
+ C2.class
+ };
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/ExceptionTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/ExceptionTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/ExceptionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,79 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.exception;
-
-import java.util.Map;
-import javax.persistence.EntityManager;
-import javax.persistence.EntityNotFoundException;
-import javax.persistence.OptimisticLockException;
-
-import org.hibernate.cfg.Environment;
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ExceptionTest extends TestCase {
-
- public void testOptimisticLockingException() throws Exception {
- EntityManager em = factory.createEntityManager();
- EntityManager em2 = factory.createEntityManager();
- em.getTransaction().begin();
- Music music = new Music();
- music.setName( "Old Country" );
- em.persist( music );
- em.getTransaction().commit();
-
- em2.getTransaction().begin();
- Music music2 = em2.find( Music.class, music.getId() );
- music2.setName( "HouseMusic" );
- em2.getTransaction().commit();
- em2.close();
-
- em.getTransaction().begin();
- music.setName( "Rock" );
- try {
-
- em.flush();
- fail("Should raise an optimistic lock exception");
- }
- catch( OptimisticLockException e) {
- //success
- assertEquals( music, e.getEntity() );
- }
- catch( Exception e ) {
- fail("Should raise an optimistic lock exception");
- }
- finally {
- em.getTransaction().rollback();
- em.close();
- }
- }
-
- public void testEntityNotFoundException() throws Exception {
- EntityManager em = factory.createEntityManager( );
- Music music = em.getReference( Music.class, new Integer(-1) );
- try {
- music.getName();
- fail("Non existent entity should raise an exception when state is accessed");
- }
- catch( EntityNotFoundException e ) {
- //success
- }
- finally {
- em.close();
- }
- }
-
- @Override
- public Map getConfig() {
- Map config = super.getConfig();
- config.put( Environment.BATCH_VERSIONED_DATA, "false");
- return config;
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[] {
- Music.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/ExceptionTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/ExceptionTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/ExceptionTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/ExceptionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,79 @@
+//$Id: $
+package org.hibernate.ejb.test.exception;
+
+import java.util.Map;
+import javax.persistence.EntityManager;
+import javax.persistence.EntityNotFoundException;
+import javax.persistence.OptimisticLockException;
+
+import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ExceptionTest extends TestCase {
+
+ public void testOptimisticLockingException() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ EntityManager em2 = factory.createEntityManager();
+ em.getTransaction().begin();
+ Music music = new Music();
+ music.setName( "Old Country" );
+ em.persist( music );
+ em.getTransaction().commit();
+
+ em2.getTransaction().begin();
+ Music music2 = em2.find( Music.class, music.getId() );
+ music2.setName( "HouseMusic" );
+ em2.getTransaction().commit();
+ em2.close();
+
+ em.getTransaction().begin();
+ music.setName( "Rock" );
+ try {
+
+ em.flush();
+ fail("Should raise an optimistic lock exception");
+ }
+ catch( OptimisticLockException e) {
+ //success
+ assertEquals( music, e.getEntity() );
+ }
+ catch( Exception e ) {
+ fail("Should raise an optimistic lock exception");
+ }
+ finally {
+ em.getTransaction().rollback();
+ em.close();
+ }
+ }
+
+ public void testEntityNotFoundException() throws Exception {
+ EntityManager em = factory.createEntityManager( );
+ Music music = em.getReference( Music.class, new Integer(-1) );
+ try {
+ music.getName();
+ fail("Non existent entity should raise an exception when state is accessed");
+ }
+ catch( EntityNotFoundException e ) {
+ //success
+ }
+ finally {
+ em.close();
+ }
+ }
+
+ @Override
+ public Map getConfig() {
+ Map config = super.getConfig();
+ config.put( Environment.BATCH_VERSIONED_DATA, "false");
+ return config;
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[] {
+ Music.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/Music.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/Music.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/Music.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.exception;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Version;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Music implements Serializable {
- private Integer id;
- private Integer version;
- private String name;
-
- @Id @GeneratedValue public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Version public Integer getVersion() {
- return version;
- }
-
- public void setVersion(Integer version) {
- this.version = version;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/Music.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/Music.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/Music.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/exception/Music.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id: $
+package org.hibernate.ejb.test.exception;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Version;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Music implements Serializable {
+ private Integer id;
+ private Integer version;
+ private String name;
+
+ @Id @GeneratedValue public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Version public Integer getVersion() {
+ return version;
+ }
+
+ public void setVersion(Integer version) {
+ this.version = version;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/hibernate.cfg.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/hibernate.cfg.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/hibernate.cfg.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-<!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
-
-<hibernate-configuration>
- <session-factory>
- <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
- <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
- <property name="hibernate.connection.username">sa</property>
- <property name="hibernate.connection.password"></property>
- <property name="hibernate.connection.url">jdbc:hsqldb:.</property>
- <property name="hibernate.cache.use_query_cache">true</property>
- <property name="hibernate.cache.region_prefix">hibernate.test</property>
- <property name="hibernate.jdbc.use_streams_for_binary">true</property>
- <property name="hibernate.jdbc.batch_size">0</property>
- <property name="hibernate.max_fetch_depth">3</property>
- <property name="hibernate.hbm2ddl.auto">create-drop</property>
- <property name="hibernate.generate_statistics">true</property>
- <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
- <mapping class="org.hibernate.ejb.test.Item"/>
- <mapping class="org.hibernate.ejb.test.Cat"/>
- <mapping class="org.hibernate.ejb.test.Distributor"/>
- <class-cache class="org.hibernate.ejb.test.Item" usage="read-write"/>
- <collection-cache collection="org.hibernate.ejb.test.Item.distributors" usage="read-write" region="RegionName"/>
- </session-factory>
-</hibernate-configuration>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/hibernate.cfg.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/hibernate.cfg.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/hibernate.cfg.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/hibernate.cfg.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+<!DOCTYPE hibernate-configuration PUBLIC
+ "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+ <session-factory>
+ <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
+ <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
+ <property name="hibernate.connection.username">sa</property>
+ <property name="hibernate.connection.password"></property>
+ <property name="hibernate.connection.url">jdbc:hsqldb:.</property>
+ <property name="hibernate.cache.use_query_cache">true</property>
+ <property name="hibernate.cache.region_prefix">hibernate.test</property>
+ <property name="hibernate.jdbc.use_streams_for_binary">true</property>
+ <property name="hibernate.jdbc.batch_size">0</property>
+ <property name="hibernate.max_fetch_depth">3</property>
+ <property name="hibernate.hbm2ddl.auto">create-drop</property>
+ <property name="hibernate.generate_statistics">true</property>
+ <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
+ <mapping class="org.hibernate.ejb.test.Item"/>
+ <mapping class="org.hibernate.ejb.test.Cat"/>
+ <mapping class="org.hibernate.ejb.test.Distributor"/>
+ <class-cache class="org.hibernate.ejb.test.Item" usage="read-write"/>
+ <collection-cache collection="org.hibernate.ejb.test.Item.distributors" usage="read-write" region="RegionName"/>
+ </session-factory>
+</hibernate-configuration>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Fruit.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Fruit.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Fruit.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.inheritance;
-
-import javax.persistence.Entity;
-import javax.persistence.Inheritance;
-import javax.persistence.InheritanceType;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Inheritance(strategy = InheritanceType.JOINED)
-public abstract class Fruit {
- Long id;
-
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Fruit.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Fruit.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Fruit.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Fruit.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id: $
+package org.hibernate.ejb.test.inheritance;
+
+import javax.persistence.Entity;
+import javax.persistence.Inheritance;
+import javax.persistence.InheritanceType;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Inheritance(strategy = InheritanceType.JOINED)
+public abstract class Fruit {
+ Long id;
+
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/InheritanceTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/InheritanceTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/InheritanceTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.inheritance;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class InheritanceTest extends TestCase {
-
- public void testFind() throws Exception {
- EntityManager firstSession = factory.createEntityManager( );
- Strawberry u = new Strawberry();
- u.setSize( 12l );
- firstSession.getTransaction().begin();
- firstSession.persist(u);
- firstSession.getTransaction().commit();
- Long newId = u.getId();
- firstSession.clear();
-
- firstSession.getTransaction().begin();
- // 1.
- Strawberry result1 = firstSession.find(Strawberry.class, newId);
- assertNotNull( result1 );
-
- // 2.
- Strawberry result2 = (Strawberry) firstSession.find(Fruit.class, newId);
- System.out.println("2. result is:" + result2);
-
- firstSession.getTransaction().commit();
- firstSession.close();
- }
- public Class[] getAnnotatedClasses() {
- return new Class[] {
- Fruit.class,
- Strawberry.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/InheritanceTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/InheritanceTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/InheritanceTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/InheritanceTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id: $
+package org.hibernate.ejb.test.inheritance;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class InheritanceTest extends TestCase {
+
+ public void testFind() throws Exception {
+ EntityManager firstSession = factory.createEntityManager( );
+ Strawberry u = new Strawberry();
+ u.setSize( 12l );
+ firstSession.getTransaction().begin();
+ firstSession.persist(u);
+ firstSession.getTransaction().commit();
+ Long newId = u.getId();
+ firstSession.clear();
+
+ firstSession.getTransaction().begin();
+ // 1.
+ Strawberry result1 = firstSession.find(Strawberry.class, newId);
+ assertNotNull( result1 );
+
+ // 2.
+ Strawberry result2 = (Strawberry) firstSession.find(Fruit.class, newId);
+ System.out.println("2. result is:" + result2);
+
+ firstSession.getTransaction().commit();
+ firstSession.close();
+ }
+ public Class[] getAnnotatedClasses() {
+ return new Class[] {
+ Fruit.class,
+ Strawberry.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Strawberry.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Strawberry.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Strawberry.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.inheritance;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Strawberry extends Fruit {
- private Long size;
-
- public Long getSize() {
- return size;
- }
-
- public void setSize(Long size) {
- this.size = size;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Strawberry.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Strawberry.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Strawberry.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/inheritance/Strawberry.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.ejb.test.inheritance;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Strawberry extends Fruit {
+ private Long size;
+
+ public Long getSize() {
+ return size;
+ }
+
+ public void setSize(Long size) {
+ this.size = size;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InstrumentedClassLoader.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InstrumentedClassLoader.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InstrumentedClassLoader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,76 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.instrument;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.instrument.IllegalClassFormatException;
-import java.util.List;
-
-import org.hibernate.ejb.instrument.InterceptFieldClassFileTransformer;
-
-/**
- * @author Emmanuel Bernard
- */
-public class InstrumentedClassLoader extends ClassLoader {
- private List<String> entities;
-
- public InstrumentedClassLoader(ClassLoader parent) {
- super( parent );
- }
-
- @Override
- public Class<?> loadClass(String name) throws ClassNotFoundException {
- if ( "java.lang.Object".equals( name ) ) return getParent().loadClass( name );
- Class c = findLoadedClass( name );
- if ( c != null ) return c;
- InputStream is = this.getResourceAsStream( name.replace( ".", "/" ) + ".class" );
- if ( is == null ) throw new ClassNotFoundException( name );
- byte[] buffer = new byte[409600];
- byte[] originalClass = new byte[0];
- int r = 0;
- try {
- r = is.read( buffer );
- }
- catch (IOException e) {
- throw new ClassNotFoundException( name + " not found", e );
- }
- while ( r >= buffer.length ) {
- byte[] temp = new byte[ originalClass.length + buffer.length ];
- System.arraycopy( originalClass, 0, temp, 0, originalClass.length );
- System.arraycopy( buffer, 0, temp, originalClass.length, buffer.length );
- originalClass = temp;
- }
- if ( r != -1 ) {
- byte[] temp = new byte[ originalClass.length + r ];
- System.arraycopy( originalClass, 0, temp, 0, originalClass.length );
- System.arraycopy( buffer, 0, temp, originalClass.length, r );
- originalClass = temp;
- }
- try {
- is.close();
- }
- catch (IOException e) {
- throw new ClassNotFoundException( name + " not found", e );
- }
- InterceptFieldClassFileTransformer t = new InterceptFieldClassFileTransformer( entities );
- byte[] transformed = new byte[0];
- try {
- transformed = t.transform(
- getParent(),
- name,
- null,
- null,
- originalClass
- );
- }
- catch (IllegalClassFormatException e) {
- throw new ClassNotFoundException( name + " not found", e );
- }
-
- return defineClass( name, transformed, 0, transformed.length );
- }
-
- public void setEntities(List<String> entities) {
- this.entities = entities;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InstrumentedClassLoader.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InstrumentedClassLoader.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InstrumentedClassLoader.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InstrumentedClassLoader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,76 @@
+//$Id$
+package org.hibernate.ejb.test.instrument;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.instrument.IllegalClassFormatException;
+import java.util.List;
+
+import org.hibernate.ejb.instrument.InterceptFieldClassFileTransformer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class InstrumentedClassLoader extends ClassLoader {
+ private List<String> entities;
+
+ public InstrumentedClassLoader(ClassLoader parent) {
+ super( parent );
+ }
+
+ @Override
+ public Class<?> loadClass(String name) throws ClassNotFoundException {
+ if ( "java.lang.Object".equals( name ) ) return getParent().loadClass( name );
+ Class c = findLoadedClass( name );
+ if ( c != null ) return c;
+ InputStream is = this.getResourceAsStream( name.replace( ".", "/" ) + ".class" );
+ if ( is == null ) throw new ClassNotFoundException( name );
+ byte[] buffer = new byte[409600];
+ byte[] originalClass = new byte[0];
+ int r = 0;
+ try {
+ r = is.read( buffer );
+ }
+ catch (IOException e) {
+ throw new ClassNotFoundException( name + " not found", e );
+ }
+ while ( r >= buffer.length ) {
+ byte[] temp = new byte[ originalClass.length + buffer.length ];
+ System.arraycopy( originalClass, 0, temp, 0, originalClass.length );
+ System.arraycopy( buffer, 0, temp, originalClass.length, buffer.length );
+ originalClass = temp;
+ }
+ if ( r != -1 ) {
+ byte[] temp = new byte[ originalClass.length + r ];
+ System.arraycopy( originalClass, 0, temp, 0, originalClass.length );
+ System.arraycopy( buffer, 0, temp, originalClass.length, r );
+ originalClass = temp;
+ }
+ try {
+ is.close();
+ }
+ catch (IOException e) {
+ throw new ClassNotFoundException( name + " not found", e );
+ }
+ InterceptFieldClassFileTransformer t = new InterceptFieldClassFileTransformer( entities );
+ byte[] transformed = new byte[0];
+ try {
+ transformed = t.transform(
+ getParent(),
+ name,
+ null,
+ null,
+ originalClass
+ );
+ }
+ catch (IllegalClassFormatException e) {
+ throw new ClassNotFoundException( name + " not found", e );
+ }
+
+ return defineClass( name, transformed, 0, transformed.length );
+ }
+
+ public void setEntities(List<String> entities) {
+ this.entities = entities;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InterceptFieldClassFileTransformerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InterceptFieldClassFileTransformerTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InterceptFieldClassFileTransformerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.instrument;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class InterceptFieldClassFileTransformerTest extends TestCase {
- public void testEnhancement() throws Exception {
- List<String> entities = new ArrayList<String>();
- entities.add( "org.hibernate.ejb.test.instrument.Simple" );
- InstrumentedClassLoader cl = new InstrumentedClassLoader( Thread.currentThread().getContextClassLoader() );
- cl.setEntities( entities );
- Class interceptedFieldEnabled = cl.loadClass( "net.sf.cglib.transform.impl.InterceptFieldEnabled" );
- Class clazz = cl.loadClass( entities.get( 0 ) );
- //clazz = cl.loadClass( "org.hibernate.ejb.test.instrument.Simple" );
- assertTrue( interceptedFieldEnabled.isAssignableFrom( clazz ) );
- clazz.getName();
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InterceptFieldClassFileTransformerTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InterceptFieldClassFileTransformerTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InterceptFieldClassFileTransformerTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/InterceptFieldClassFileTransformerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id$
+package org.hibernate.ejb.test.instrument;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class InterceptFieldClassFileTransformerTest extends TestCase {
+ public void testEnhancement() throws Exception {
+ List<String> entities = new ArrayList<String>();
+ entities.add( "org.hibernate.ejb.test.instrument.Simple" );
+ InstrumentedClassLoader cl = new InstrumentedClassLoader( Thread.currentThread().getContextClassLoader() );
+ cl.setEntities( entities );
+ Class interceptedFieldEnabled = cl.loadClass( "net.sf.cglib.transform.impl.InterceptFieldEnabled" );
+ Class clazz = cl.loadClass( entities.get( 0 ) );
+ //clazz = cl.loadClass( "org.hibernate.ejb.test.instrument.Simple" );
+ assertTrue( interceptedFieldEnabled.isAssignableFrom( clazz ) );
+ clazz.getName();
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/Simple.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/Simple.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/Simple.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.instrument;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Simple {
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/Simple.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/Simple.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/Simple.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/instrument/Simple.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id$
+package org.hibernate.ejb.test.instrument;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Simple {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/BlobTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/BlobTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/BlobTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.lob;
-
-import java.io.ByteArrayOutputStream;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.sql.Blob;
-import java.util.HashMap;
-import java.util.Map;
-import javax.persistence.EntityManager;
-
-import org.hibernate.Hibernate;
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class BlobTest extends TestCase {
-
- public void testBlobSerialization() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Map image = new HashMap();
- image.put( "meta", "metadata" );
- image.put( "data", "imagedata" );
- ImageReader reader = new ImageReader();
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- ObjectOutputStream oos = new ObjectOutputStream( baos );
- oos.writeObject( image );
- reader.setImage( (Blob) Hibernate.createBlob( baos.toByteArray() ) );
- em.persist( reader );
- em.getTransaction().commit();
- em.close(); //useless but y'a know
- em = factory.createEntityManager();
- em.getTransaction().begin();
- reader = em.find( ImageReader.class, reader.getId() );
- ObjectInputStream ois = new ObjectInputStream( reader.getImage().getBinaryStream() );
- image = (HashMap) ois.readObject();
- assertTrue( image.containsKey( "meta" ) );
- em.getTransaction().commit();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- ImageReader.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/BlobTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/BlobTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/BlobTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/BlobTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.ejb.test.lob;
+
+import java.io.ByteArrayOutputStream;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.sql.Blob;
+import java.util.HashMap;
+import java.util.Map;
+import javax.persistence.EntityManager;
+
+import org.hibernate.Hibernate;
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BlobTest extends TestCase {
+
+ public void testBlobSerialization() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Map image = new HashMap();
+ image.put( "meta", "metadata" );
+ image.put( "data", "imagedata" );
+ ImageReader reader = new ImageReader();
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ ObjectOutputStream oos = new ObjectOutputStream( baos );
+ oos.writeObject( image );
+ reader.setImage( (Blob) Hibernate.createBlob( baos.toByteArray() ) );
+ em.persist( reader );
+ em.getTransaction().commit();
+ em.close(); //useless but y'a know
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ reader = em.find( ImageReader.class, reader.getId() );
+ ObjectInputStream ois = new ObjectInputStream( reader.getImage().getBinaryStream() );
+ image = (HashMap) ois.readObject();
+ assertTrue( image.containsKey( "meta" ) );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ ImageReader.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/ImageReader.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/ImageReader.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/ImageReader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.lob;
-
-import java.io.Serializable;
-import java.sql.Blob;
-import java.sql.Clob;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class ImageReader implements Serializable {
-
- private long id;
- private Blob image;
- private Clob text;
-
- @Id
- @GeneratedValue
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- @Lob
- @Column(name = "bin_img")
- public Blob getImage() {
- return image;
- }
-
- public void setImage(Blob image) {
- this.image = image;
- }
-
- @Lob
- @Column(name = "img_text")
- public Clob getText() {
- return text;
- }
-
- public void setText(Clob text) {
- this.text = text;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/ImageReader.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/ImageReader.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/ImageReader.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lob/ImageReader.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+//$Id$
+package org.hibernate.ejb.test.lob;
+
+import java.io.Serializable;
+import java.sql.Blob;
+import java.sql.Clob;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ImageReader implements Serializable {
+
+ private long id;
+ private Blob image;
+ private Clob text;
+
+ @Id
+ @GeneratedValue
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ @Lob
+ @Column(name = "bin_img")
+ public Blob getImage() {
+ return image;
+ }
+
+ public void setImage(Blob image) {
+ this.image = image;
+ }
+
+ @Lob
+ @Column(name = "img_text")
+ public Clob getText() {
+ return text;
+ }
+
+ public void setText(Clob text) {
+ this.text = text;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/Lock.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/Lock.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/Lock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.lock;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Version;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Lock {
- private Integer id;
- private Integer version;
- private String name;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Version
- public Integer getVersion() {
- return version;
- }
-
- public void setVersion(Integer version) {
- this.version = version;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/Lock.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/Lock.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/Lock.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/Lock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id$
+package org.hibernate.ejb.test.lock;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Version;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Lock {
+ private Integer id;
+ private Integer version;
+ private String name;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Version
+ public Integer getVersion() {
+ return version;
+ }
+
+ public void setVersion(Integer version) {
+ this.version = version;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/LockTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/LockTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/LockTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,65 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.lock;
-
-import javax.persistence.EntityManager;
-import javax.persistence.LockModeType;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class LockTest extends TestCase {
-
- public void testLockRead() throws Exception {
- Lock lock = new Lock();
- lock.setName( "name" );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( lock );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- lock = em.getReference( Lock.class, lock.getId() );
- em.lock( lock, LockModeType.READ );
- lock.setName( "surname" );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- lock = em.find( Lock.class, lock.getId() );
- assertEquals( "surname", lock.getName() );
- em.remove( lock );
- em.getTransaction().commit();
- }
-
- public void testLockWrite() throws Exception {
- Lock lock = new Lock();
- lock.setName( "second" );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( lock );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- lock = em.getReference( Lock.class, lock.getId() );
- Integer version = lock.getVersion();
- em.lock( lock, LockModeType.WRITE );
- em.getTransaction().commit();
-
- em.getTransaction().begin();
- lock = em.getReference( Lock.class, lock.getId() );
- try {
- assertEquals( "should increase the version number EJB-106", 1, lock.getVersion() - version );
- }
- finally {
- em.remove( lock );
- em.getTransaction().commit();
- }
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Lock.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/LockTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/LockTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/LockTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/lock/LockTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,65 @@
+//$Id$
+package org.hibernate.ejb.test.lock;
+
+import javax.persistence.EntityManager;
+import javax.persistence.LockModeType;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LockTest extends TestCase {
+
+ public void testLockRead() throws Exception {
+ Lock lock = new Lock();
+ lock.setName( "name" );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( lock );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ lock = em.getReference( Lock.class, lock.getId() );
+ em.lock( lock, LockModeType.READ );
+ lock.setName( "surname" );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ lock = em.find( Lock.class, lock.getId() );
+ assertEquals( "surname", lock.getName() );
+ em.remove( lock );
+ em.getTransaction().commit();
+ }
+
+ public void testLockWrite() throws Exception {
+ Lock lock = new Lock();
+ lock.setName( "second" );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( lock );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ lock = em.getReference( Lock.class, lock.getId() );
+ Integer version = lock.getVersion();
+ em.lock( lock, LockModeType.WRITE );
+ em.getTransaction().commit();
+
+ em.getTransaction().begin();
+ lock = em.getReference( Lock.class, lock.getId() );
+ try {
+ assertEquals( "should increase the version number EJB-106", 1, lock.getVersion() - version );
+ }
+ finally {
+ em.remove( lock );
+ em.getTransaction().commit();
+ }
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Lock.class
+ };
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Animal.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Animal.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Animal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.ops;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public abstract class Animal {
- private String name;
- private Long id;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
- @Id
- @GeneratedValue
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Animal.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Animal.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Animal.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Animal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id: $
+package org.hibernate.ejb.test.ops;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public abstract class Animal {
+ private String name;
+ private Long id;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+ @Id
+ @GeneratedValue
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Child.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Child.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Child.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Child {
- private String name;
- private int age;
-
- Child() {
- }
-
- public Child(String name) {
- this.name = name;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public int getAge() {
- return age;
- }
-
- public void setAge(int age) {
- this.age = age;
- }
-
- private Parent parent;
-
- public Parent getParent() {
- return parent;
- }
-
- public void setParent(Parent parent) {
- this.parent = parent;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Child.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Child.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Child.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Child.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Child {
+ private String name;
+ private int age;
+
+ Child() {
+ }
+
+ public Child(String name) {
+ this.name = name;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ private Parent parent;
+
+ public Parent getParent() {
+ return parent;
+ }
+
+ public void setParent(Parent parent) {
+ this.parent = parent;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employee.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employee.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-import java.io.Serializable;
-import java.util.Collection;
-
-
-/**
- * Employee in an Employer-Employee relationship
- *
- * @author Emmanuel Bernard
- */
-
-public class Employee implements Serializable {
- private Integer id;
- private Collection employers;
-
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer integer) {
- id = integer;
- }
-
-
- public Collection getEmployers() {
- return employers;
- }
-
- public void setEmployers(Collection employers) {
- this.employers = employers;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employee.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employee.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employee.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+
+/**
+ * Employee in an Employer-Employee relationship
+ *
+ * @author Emmanuel Bernard
+ */
+
+public class Employee implements Serializable {
+ private Integer id;
+ private Collection employers;
+
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer integer) {
+ id = integer;
+ }
+
+
+ public Collection getEmployers() {
+ return employers;
+ }
+
+ public void setEmployers(Collection employers) {
+ this.employers = employers;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<!--
-
--->
-
-<hibernate-mapping package="org.hibernate.ejb.test.ops">
-
- <class name="Employer" polymorphism="explicit">
- <id name="id">
- <generator class="native"/>
- </id>
- <bag name="employees"
- cascade="persist,merge"
- table="EMPLOYER_EMPLOYEE">
- <key column="EMPER_ID"/>
- <many-to-many class="Employee" column="EMPEE_ID"/>
- </bag>
- </class>
-
- <class name="Employee" polymorphism="explicit">
- <id name="id">
- <generator class="native"/>
- </id>
- <bag name="employers"
- inverse="true"
- cascade="persist,merge"
- table="EMPLOYER_EMPLOYEE">
- <key column="EMPEE_ID"/>
- <many-to-many class="Employer" column="EMPER_ID"/>
- </bag>
- </class>
-
-</hibernate-mapping>
-
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.hbm.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.hbm.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.ejb.test.ops">
+
+ <class name="Employer" polymorphism="explicit">
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <bag name="employees"
+ cascade="persist,merge"
+ table="EMPLOYER_EMPLOYEE">
+ <key column="EMPER_ID"/>
+ <many-to-many class="Employee" column="EMPEE_ID"/>
+ </bag>
+ </class>
+
+ <class name="Employee" polymorphism="explicit">
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <bag name="employers"
+ inverse="true"
+ cascade="persist,merge"
+ table="EMPLOYER_EMPLOYEE">
+ <key column="EMPEE_ID"/>
+ <many-to-many class="Employer" column="EMPER_ID"/>
+ </bag>
+ </class>
+
+</hibernate-mapping>
+
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-import java.io.Serializable;
-import java.util.Collection;
-
-
-/**
- * Employer in a employer-Employee relationship
- *
- * @author Emmanuel Bernard
- */
-
-public class Employer implements Serializable {
- private Integer id;
- private Collection employees;
-
-
- public Collection getEmployees() {
- return employees;
- }
-
-
- public Integer getId() {
- return id;
- }
-
- public void setEmployees(Collection set) {
- employees = set;
- }
-
- public void setId(Integer integer) {
- id = integer;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Employer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+import java.io.Serializable;
+import java.util.Collection;
+
+
+/**
+ * Employer in a employer-Employee relationship
+ *
+ * @author Emmanuel Bernard
+ */
+
+public class Employer implements Serializable {
+ private Integer id;
+ private Collection employees;
+
+
+ public Collection getEmployees() {
+ return employees;
+ }
+
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setEmployees(Collection set) {
+ employees = set;
+ }
+
+ public void setId(Integer integer) {
+ id = integer;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FindTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FindTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FindTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.ops;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FindTest extends TestCase {
-
- public void testSubclassWrongId() throws Exception {
- Mammal mammal = new Mammal();
- mammal.setMamalNbr( 2 );
- mammal.setName( "Human" );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( mammal );
- em.flush();
- assertNull( em.find(Reptile.class, 1l) );
- em.getTransaction().rollback();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[] {
- Mammal.class,
- Reptile.class,
- Animal.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FindTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FindTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FindTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FindTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id: $
+package org.hibernate.ejb.test.ops;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FindTest extends TestCase {
+
+ public void testSubclassWrongId() throws Exception {
+ Mammal mammal = new Mammal();
+ mammal.setMamalNbr( 2 );
+ mammal.setName( "Human" );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( mammal );
+ em.flush();
+ assertNull( em.find(Reptile.class, 1l) );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[] {
+ Mammal.class,
+ Reptile.class,
+ Animal.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FlushTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FlushTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FlushTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.ejb.test.EJB3TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FlushTest extends EJB3TestCase {
-
- public void testPersistCascasde() {
- Session s = openSession();
- Transaction t = s.beginTransaction();
-
- Parent p = new Parent( "Marc" );
- Parent p2 = new Parent( "Nathalie" );
-
- // FAILS
- s.persist( p );
- s.persist( p2 );
-
- Child c = new Child( "Elvira" );
- Child c2 = new Child( "Blase" );
- p.getChildren().add( c );
- c.setParent( p );
- p.getChildren().add( c2 );
- c2.setParent( p );
-
- // WORKS
- //s.persist(p);
- //s.persist(p2);
-
- t.commit();
- s.close();
-
- }
-
- public FlushTest(String x) {
- super( x );
- }
-
- protected String[] getMappings() {
- return new String[]{
- "ops/ParentChild.hbm.xml"
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FlushTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FlushTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FlushTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/FlushTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.ejb.test.EJB3TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FlushTest extends EJB3TestCase {
+
+ public void testPersistCascasde() {
+ Session s = openSession();
+ Transaction t = s.beginTransaction();
+
+ Parent p = new Parent( "Marc" );
+ Parent p2 = new Parent( "Nathalie" );
+
+ // FAILS
+ s.persist( p );
+ s.persist( p2 );
+
+ Child c = new Child( "Elvira" );
+ Child c2 = new Child( "Blase" );
+ p.getChildren().add( c );
+ c.setParent( p );
+ p.getChildren().add( c2 );
+ c2.setParent( p );
+
+ // WORKS
+ //s.persist(p);
+ //s.persist(p2);
+
+ t.commit();
+ s.close();
+
+ }
+
+ public FlushTest(String x) {
+ super( x );
+ }
+
+ protected String[] getMappings() {
+ return new String[]{
+ "ops/ParentChild.hbm.xml"
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/GetLoadTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/GetLoadTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/GetLoadTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,114 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.hibernate.Hibernate;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.ejb.test.EJB3TestCase;
-
-/**
- * @author Gavin King
- */
-public class GetLoadTest extends EJB3TestCase {
-
- public GetLoadTest(String str) {
- super( str );
- }
-
- public void testGetLoad() {
- clearCounts();
-
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Employer emp = new Employer();
- s.persist( emp );
- Node node = new Node( "foo" );
- Node parent = new Node( "bar" );
- parent.addChild( node );
- s.persist( parent );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- emp = (Employer) s.get( Employer.class, emp.getId() );
- assertTrue( Hibernate.isInitialized( emp ) );
- assertFalse( Hibernate.isInitialized( emp.getEmployees() ) );
- node = (Node) s.get( Node.class, node.getName() );
- assertTrue( Hibernate.isInitialized( node ) );
- assertFalse( Hibernate.isInitialized( node.getChildren() ) );
- assertFalse( Hibernate.isInitialized( node.getParent() ) );
- assertNull( s.get( Node.class, "xyz" ) );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- emp = (Employer) s.load( Employer.class, emp.getId() );
- emp.getId();
- assertFalse( Hibernate.isInitialized( emp ) );
- node = (Node) s.load( Node.class, node.getName() );
- assertEquals( node.getName(), "foo" );
- assertFalse( Hibernate.isInitialized( node ) );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- emp = (Employer) s.get( "org.hibernate.ejb.test.ops.Employer", emp.getId() );
- assertTrue( Hibernate.isInitialized( emp ) );
- node = (Node) s.get( "org.hibernate.ejb.test.ops.Node", node.getName() );
- assertTrue( Hibernate.isInitialized( node ) );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- emp = (Employer) s.load( "org.hibernate.ejb.test.ops.Employer", emp.getId() );
- emp.getId();
- assertFalse( Hibernate.isInitialized( emp ) );
- node = (Node) s.load( "org.hibernate.ejb.test.ops.Node", node.getName() );
- assertEquals( node.getName(), "foo" );
- assertFalse( Hibernate.isInitialized( node ) );
- tx.commit();
- s.close();
-
- assertFetchCount( 0 );
- }
-
- private void clearCounts() {
- getSessions().getStatistics().clear();
- }
-
- private void assertFetchCount(int count) {
- int fetches = (int) getSessions().getStatistics().getEntityFetchCount();
- assertEquals( count, fetches );
- }
-
- protected void configure(Configuration cfg) {
- super.configure( cfg );
- cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
- cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
- }
-
- protected String[] getMappings() {
- return new String[]{
- "ops/Node.hbm.xml",
- "ops/Employer.hbm.xml"
- };
- }
-
- public static Test suite() {
- return new TestSuite( GetLoadTest.class );
- }
-
- public String getCacheConcurrencyStrategy() {
- return null;
- }
-
-}
-
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/GetLoadTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/GetLoadTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/GetLoadTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/GetLoadTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,114 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.hibernate.Hibernate;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.test.EJB3TestCase;
+
+/**
+ * @author Gavin King
+ */
+public class GetLoadTest extends EJB3TestCase {
+
+ public GetLoadTest(String str) {
+ super( str );
+ }
+
+ public void testGetLoad() {
+ clearCounts();
+
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Employer emp = new Employer();
+ s.persist( emp );
+ Node node = new Node( "foo" );
+ Node parent = new Node( "bar" );
+ parent.addChild( node );
+ s.persist( parent );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ emp = (Employer) s.get( Employer.class, emp.getId() );
+ assertTrue( Hibernate.isInitialized( emp ) );
+ assertFalse( Hibernate.isInitialized( emp.getEmployees() ) );
+ node = (Node) s.get( Node.class, node.getName() );
+ assertTrue( Hibernate.isInitialized( node ) );
+ assertFalse( Hibernate.isInitialized( node.getChildren() ) );
+ assertFalse( Hibernate.isInitialized( node.getParent() ) );
+ assertNull( s.get( Node.class, "xyz" ) );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ emp = (Employer) s.load( Employer.class, emp.getId() );
+ emp.getId();
+ assertFalse( Hibernate.isInitialized( emp ) );
+ node = (Node) s.load( Node.class, node.getName() );
+ assertEquals( node.getName(), "foo" );
+ assertFalse( Hibernate.isInitialized( node ) );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ emp = (Employer) s.get( "org.hibernate.ejb.test.ops.Employer", emp.getId() );
+ assertTrue( Hibernate.isInitialized( emp ) );
+ node = (Node) s.get( "org.hibernate.ejb.test.ops.Node", node.getName() );
+ assertTrue( Hibernate.isInitialized( node ) );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ emp = (Employer) s.load( "org.hibernate.ejb.test.ops.Employer", emp.getId() );
+ emp.getId();
+ assertFalse( Hibernate.isInitialized( emp ) );
+ node = (Node) s.load( "org.hibernate.ejb.test.ops.Node", node.getName() );
+ assertEquals( node.getName(), "foo" );
+ assertFalse( Hibernate.isInitialized( node ) );
+ tx.commit();
+ s.close();
+
+ assertFetchCount( 0 );
+ }
+
+ private void clearCounts() {
+ getSessions().getStatistics().clear();
+ }
+
+ private void assertFetchCount(int count) {
+ int fetches = (int) getSessions().getStatistics().getEntityFetchCount();
+ assertEquals( count, fetches );
+ }
+
+ protected void configure(Configuration cfg) {
+ super.configure( cfg );
+ cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+ cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+ }
+
+ protected String[] getMappings() {
+ return new String[]{
+ "ops/Node.hbm.xml",
+ "ops/Employer.hbm.xml"
+ };
+ }
+
+ public static Test suite() {
+ return new TestSuite( GetLoadTest.class );
+ }
+
+ public String getCacheConcurrencyStrategy() {
+ return null;
+ }
+
+}
+
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Mammal.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Mammal.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Mammal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.ops;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Mammal extends Animal {
- private int mamalNbr;
-
- public int getMamalNbr() {
- return mamalNbr;
- }
-
- public void setMamalNbr(int mamalNbr) {
- this.mamalNbr = mamalNbr;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Mammal.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Mammal.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Mammal.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Mammal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.ejb.test.ops;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Mammal extends Animal {
+ private int mamalNbr;
+
+ public int getMamalNbr() {
+ return mamalNbr;
+ }
+
+ public void setMamalNbr(int mamalNbr) {
+ this.mamalNbr = mamalNbr;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeNewTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeNewTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeNewTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MergeNewTest extends TestCase {
-
- public void testMergeNew() throws Exception {
- Workload load = new Workload();
- load.name = "Cleaning";
- load.load = 10;
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- load = em.merge( load );
- assertNotNull( load.id );
- em.flush();
- assertNotNull( load.id );
- em.getTransaction().rollback();
- em.close();
- }
-
- public void testMergeAfterRemove() throws Exception {
- Workload load = new Workload();
- load.name = "Cleaning";
- load.load = 10;
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- load = em.merge( load );
- em.flush();
- em.getTransaction().commit();
- em.close();
- em = factory.createEntityManager();
- em.getTransaction().begin();
- load = em.find( Workload.class, load.id );
- em.remove( load );
- em.flush();
- em.getTransaction().commit();
- em.close();
- em = factory.createEntityManager();
- em.getTransaction().begin();
- em.merge( load );
- em.flush();
- em.getTransaction().commit();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Workload.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeNewTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeNewTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeNewTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeNewTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MergeNewTest extends TestCase {
+
+ public void testMergeNew() throws Exception {
+ Workload load = new Workload();
+ load.name = "Cleaning";
+ load.load = 10;
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ load = em.merge( load );
+ assertNotNull( load.id );
+ em.flush();
+ assertNotNull( load.id );
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public void testMergeAfterRemove() throws Exception {
+ Workload load = new Workload();
+ load.name = "Cleaning";
+ load.load = 10;
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ load = em.merge( load );
+ em.flush();
+ em.getTransaction().commit();
+ em.close();
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ load = em.find( Workload.class, load.id );
+ em.remove( load );
+ em.flush();
+ em.getTransaction().commit();
+ em.close();
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.merge( load );
+ em.flush();
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Workload.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,118 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.ejb.test.EJB3TestCase;
-
-/**
- * @author Gavin King
- */
-public class MergeTest extends EJB3TestCase {
-
- public MergeTest(String str) {
- super( str );
- }
-
- public void testMergeTree() {
-
- clearCounts();
-
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Node root = new Node( "root" );
- Node child = new Node( "child" );
- root.addChild( child );
- s.persist( root );
- tx.commit();
- s.close();
-
- assertInsertCount( 2 );
- clearCounts();
-
- root.setDescription( "The root node" );
- child.setDescription( "The child node" );
-
- Node secondChild = new Node( "second child" );
-
- root.addChild( secondChild );
-
- s = openSession();
- tx = s.beginTransaction();
- s.merge( root );
- tx.commit();
- s.close();
-
- assertInsertCount( 1 );
- assertUpdateCount( 2 );
-
- }
-
- public void testMergeTreeWithGeneratedId() {
-
- clearCounts();
-
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- NumberedNode root = new NumberedNode( "root" );
- NumberedNode child = new NumberedNode( "child" );
- root.addChild( child );
- s.persist( root );
- tx.commit();
- s.close();
-
- assertInsertCount( 2 );
- clearCounts();
-
- root.setDescription( "The root node" );
- child.setDescription( "The child node" );
-
- NumberedNode secondChild = new NumberedNode( "second child" );
-
- root.addChild( secondChild );
-
- s = openSession();
- tx = s.beginTransaction();
- s.merge( root );
- tx.commit();
- s.close();
-
- assertInsertCount( 1 );
- assertUpdateCount( 2 );
-
- }
-
- private void clearCounts() {
- getSessions().getStatistics().clear();
- }
-
- private void assertInsertCount(int count) {
- int inserts = (int) getSessions().getStatistics().getEntityInsertCount();
- assertEquals( count, inserts );
- }
-
- private void assertUpdateCount(int count) {
- int updates = (int) getSessions().getStatistics().getEntityUpdateCount();
- assertEquals( count, updates );
- }
-
- protected void configure(Configuration cfg) {
- super.configure( cfg );
- cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
- cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
- }
-
- protected String[] getMappings() {
- return new String[]{"ops/Node.hbm.xml"};
- }
-
- public static Test suite() {
- return new TestSuite( MergeTest.class );
- }
-
-}
-
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/MergeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,118 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.test.EJB3TestCase;
+
+/**
+ * @author Gavin King
+ */
+public class MergeTest extends EJB3TestCase {
+
+ public MergeTest(String str) {
+ super( str );
+ }
+
+ public void testMergeTree() {
+
+ clearCounts();
+
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Node root = new Node( "root" );
+ Node child = new Node( "child" );
+ root.addChild( child );
+ s.persist( root );
+ tx.commit();
+ s.close();
+
+ assertInsertCount( 2 );
+ clearCounts();
+
+ root.setDescription( "The root node" );
+ child.setDescription( "The child node" );
+
+ Node secondChild = new Node( "second child" );
+
+ root.addChild( secondChild );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.merge( root );
+ tx.commit();
+ s.close();
+
+ assertInsertCount( 1 );
+ assertUpdateCount( 2 );
+
+ }
+
+ public void testMergeTreeWithGeneratedId() {
+
+ clearCounts();
+
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ NumberedNode root = new NumberedNode( "root" );
+ NumberedNode child = new NumberedNode( "child" );
+ root.addChild( child );
+ s.persist( root );
+ tx.commit();
+ s.close();
+
+ assertInsertCount( 2 );
+ clearCounts();
+
+ root.setDescription( "The root node" );
+ child.setDescription( "The child node" );
+
+ NumberedNode secondChild = new NumberedNode( "second child" );
+
+ root.addChild( secondChild );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.merge( root );
+ tx.commit();
+ s.close();
+
+ assertInsertCount( 1 );
+ assertUpdateCount( 2 );
+
+ }
+
+ private void clearCounts() {
+ getSessions().getStatistics().clear();
+ }
+
+ private void assertInsertCount(int count) {
+ int inserts = (int) getSessions().getStatistics().getEntityInsertCount();
+ assertEquals( count, inserts );
+ }
+
+ private void assertUpdateCount(int count) {
+ int updates = (int) getSessions().getStatistics().getEntityUpdateCount();
+ assertEquals( count, updates );
+ }
+
+ protected void configure(Configuration cfg) {
+ super.configure( cfg );
+ cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+ cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+ }
+
+ protected String[] getMappings() {
+ return new String[]{"ops/Node.hbm.xml"};
+ }
+
+ public static Test suite() {
+ return new TestSuite( MergeTest.class );
+ }
+
+}
+
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<!--
-
--->
-
-<hibernate-mapping package="org.hibernate.ejb.test.ops">
-
- <class name="Node" polymorphism="explicit">
- <id name="name">
- <generator class="assigned"/>
- </id>
- <property name="description"/>
- <many-to-one name="parent"/>
- <set name="children"
- inverse="true"
- cascade="persist,merge">
- <key column="parent"/>
- <one-to-many class="Node"/>
- </set>
- </class>
-
- <class name="NumberedNode" polymorphism="explicit">
- <id name="id" unsaved-value="0">
- <generator class="native"/>
- </id>
- <property name="name">
- <column name="name" index="iname" not-null="true"/>
- </property>
- <property name="description"/>
- <many-to-one name="parent" class="NumberedNode"/>
- <set name="children"
- inverse="true"
- cascade="persist,merge">
- <key column="parent"/>
- <one-to-many class="NumberedNode"/>
- </set>
- </class>
-
-</hibernate-mapping>
-
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.hbm.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.hbm.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<!--
+
+-->
+
+<hibernate-mapping package="org.hibernate.ejb.test.ops">
+
+ <class name="Node" polymorphism="explicit">
+ <id name="name">
+ <generator class="assigned"/>
+ </id>
+ <property name="description"/>
+ <many-to-one name="parent"/>
+ <set name="children"
+ inverse="true"
+ cascade="persist,merge">
+ <key column="parent"/>
+ <one-to-many class="Node"/>
+ </set>
+ </class>
+
+ <class name="NumberedNode" polymorphism="explicit">
+ <id name="id" unsaved-value="0">
+ <generator class="native"/>
+ </id>
+ <property name="name">
+ <column name="name" index="iname" not-null="true"/>
+ </property>
+ <property name="description"/>
+ <many-to-one name="parent" class="NumberedNode"/>
+ <set name="children"
+ inverse="true"
+ cascade="persist,merge">
+ <key column="parent"/>
+ <one-to-many class="NumberedNode"/>
+ </set>
+ </class>
+
+</hibernate-mapping>
+
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,60 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * @author Gavin King
- */
-public class Node {
- private String name;
- private Node parent;
- private Set children = new HashSet();
- private String description;
-
- public Node() {
- }
-
- public Node(String name) {
- this.name = name;
- }
-
- public Set getChildren() {
- return children;
- }
-
- public void setChildren(Set children) {
- this.children = children;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Node getParent() {
- return parent;
- }
-
- public void setParent(Node parent) {
- this.parent = parent;
- }
-
- public Node addChild(Node child) {
- children.add( child );
- child.setParent( this );
- return this;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Node.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,60 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author Gavin King
+ */
+public class Node {
+ private String name;
+ private Node parent;
+ private Set children = new HashSet();
+ private String description;
+
+ public Node() {
+ }
+
+ public Node(String name) {
+ this.name = name;
+ }
+
+ public Set getChildren() {
+ return children;
+ }
+
+ public void setChildren(Set children) {
+ this.children = children;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Node getParent() {
+ return parent;
+ }
+
+ public void setParent(Node parent) {
+ this.parent = parent;
+ }
+
+ public Node addChild(Node child) {
+ children.add( child );
+ child.setParent( this );
+ return this;
+ }
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/NumberedNode.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/NumberedNode.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/NumberedNode.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-/**
- * @author Gavin King
- */
-public class NumberedNode extends Node {
-
- private long id;
-
- public NumberedNode() {
- super();
- }
-
-
- public NumberedNode(String name) {
- super( name );
- }
-
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/NumberedNode.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/NumberedNode.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/NumberedNode.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/NumberedNode.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+/**
+ * @author Gavin King
+ */
+public class NumberedNode extends Node {
+
+ private long id;
+
+ public NumberedNode() {
+ super();
+ }
+
+
+ public NumberedNode(String name) {
+ super( name );
+ }
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Parent.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Parent.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Parent {
- private String name;
- private List children = new ArrayList();
-
- Parent() {
- }
-
- public Parent(String name) {
- this.name = name;
- }
-
- public List getChildren() {
- return children;
- }
-
- public void setChildren(List children) {
- this.children = children;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Parent.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Parent.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Parent.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Parent.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Parent {
+ private String name;
+ private List children = new ArrayList();
+
+ Parent() {
+ }
+
+ public Parent(String name) {
+ this.name = name;
+ }
+
+ public List getChildren() {
+ return children;
+ }
+
+ public void setChildren(List children) {
+ this.children = children;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/ParentChild.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/ParentChild.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/ParentChild.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping
- package="org.hibernate.ejb.test.ops">
-
- <class name="Parent">
- <id name="name"/>
- <list name="children" cascade="persist,merge">
- <key column="parentName" not-null="true"/>
- <list-index column="sibling"/>
- <one-to-many class="Child"/>
- </list>
- </class>
-
- <class name="Child">
- <id name="name"/>
- <property name="age" not-null="true"/>
- <many-to-one name="parent" column="parentName"
- not-null="true" insert="false" update="false"/>
- </class>
-
-</hibernate-mapping>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/ParentChild.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/ParentChild.hbm.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/ParentChild.hbm.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/ParentChild.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping
+ package="org.hibernate.ejb.test.ops">
+
+ <class name="Parent">
+ <id name="name"/>
+ <list name="children" cascade="persist,merge">
+ <key column="parentName" not-null="true"/>
+ <list-index column="sibling"/>
+ <one-to-many class="Child"/>
+ </list>
+ </class>
+
+ <class name="Child">
+ <id name="name"/>
+ <property name="age" not-null="true"/>
+ <many-to-one name="parent" column="parentName"
+ not-null="true" insert="false" update="false"/>
+ </class>
+
+</hibernate-mapping>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/PersistTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/PersistTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/PersistTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,223 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import junit.framework.Test;
-import junit.framework.TestSuite;
-import org.hibernate.PersistentObjectException;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.ejb.test.EJB3TestCase;
-import org.hibernate.exception.ConstraintViolationException;
-
-/**
- * @author Gavin King
- */
-public class PersistTest extends EJB3TestCase {
-
- public PersistTest(String str) {
- super( str );
- }
-
- public void testCreateTree() {
-
- clearCounts();
-
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Node root = new Node( "root" );
- Node child = new Node( "child" );
- root.addChild( child );
- s.persist( root );
- tx.commit();
- s.close();
-
- assertInsertCount( 2 );
- assertUpdateCount( 0 );
-
- s = openSession();
- tx = s.beginTransaction();
- root = (Node) s.get( Node.class, "root" );
- Node child2 = new Node( "child2" );
- root.addChild( child2 );
- tx.commit();
- s.close();
-
- assertInsertCount( 3 );
- assertUpdateCount( 0 );
- }
-
- public void testCreateTreeWithGeneratedId() {
-
- clearCounts();
-
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- NumberedNode root = new NumberedNode( "root" );
- NumberedNode child = new NumberedNode( "child" );
- root.addChild( child );
- s.persist( root );
- tx.commit();
- s.close();
-
- assertInsertCount( 2 );
- assertUpdateCount( 0 );
-
- s = openSession();
- tx = s.beginTransaction();
- root = (NumberedNode) s.get( NumberedNode.class, new Long( root.getId() ) );
- NumberedNode child2 = new NumberedNode( "child2" );
- root.addChild( child2 );
- tx.commit();
- s.close();
-
- assertInsertCount( 3 );
- assertUpdateCount( 0 );
- }
-
- public void testCreateException() {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- Node dupe = new Node( "dupe" );
- s.persist( dupe );
- s.persist( dupe );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- s.persist( dupe );
- try {
- tx.commit();
- fail( "Cannot persist() twice the same entity" );
- }
- catch (ConstraintViolationException cve) {
- //verify that an exception is thrown!
- }
- tx.rollback();
- s.close();
-
- Node nondupe = new Node( "nondupe" );
- nondupe.addChild( dupe );
-
- s = openSession();
- tx = s.beginTransaction();
- s.persist( nondupe );
- try {
- tx.commit();
- assertFalse( true );
- }
- catch (ConstraintViolationException cve) {
- //verify that an exception is thrown!
- }
- tx.rollback();
- s.close();
- }
-
- public void testCreateExceptionWithGeneratedId() {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- NumberedNode dupe = new NumberedNode( "dupe" );
- s.persist( dupe );
- s.persist( dupe );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- try {
- s.persist( dupe );
- assertFalse( true );
- }
- catch (PersistentObjectException poe) {
- //verify that an exception is thrown!
- }
- tx.rollback();
- s.close();
-
- NumberedNode nondupe = new NumberedNode( "nondupe" );
- nondupe.addChild( dupe );
-
- s = openSession();
- tx = s.beginTransaction();
- try {
- s.persist( nondupe );
- assertFalse( true );
- }
- catch (PersistentObjectException poe) {
- //verify that an exception is thrown!
- }
- tx.rollback();
- s.close();
- }
-
- public void testBasic() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Employer er = new Employer();
- Employee ee = new Employee();
- s.persist( ee );
- Collection erColl = new ArrayList();
- Collection eeColl = new ArrayList();
- erColl.add( ee );
- eeColl.add( er );
- er.setEmployees( erColl );
- ee.setEmployers( eeColl );
- tx.commit();
- s.close();
-
- s = openSession();
- tx = s.beginTransaction();
- er = (Employer) s.load( Employer.class, er.getId() );
- assertNotNull( er );
- assertNotNull( er.getEmployees() );
- assertEquals( 1, er.getEmployees().size() );
- Employee eeFromDb = (Employee) er.getEmployees().iterator().next();
- assertEquals( ee.getId(), eeFromDb.getId() );
- tx.commit();
- s.close();
- }
-
- private void clearCounts() {
- getSessions().getStatistics().clear();
- }
-
- private void assertInsertCount(int count) {
- int inserts = (int) getSessions().getStatistics().getEntityInsertCount();
- assertEquals( count, inserts );
- }
-
- private void assertUpdateCount(int count) {
- int updates = (int) getSessions().getStatistics().getEntityUpdateCount();
- assertEquals( count, updates );
- }
-
- protected void configure(Configuration cfg) {
- super.configure( cfg );
- cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
- cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
- }
-
- protected String[] getMappings() {
- return new String[]{
- "ops/Node.hbm.xml",
- "ops/Employer.hbm.xml"
- };
- }
-
- public static Test suite() {
- return new TestSuite( PersistTest.class );
- }
-
- public String getCacheConcurrencyStrategy() {
- return null;
- }
-
-}
-
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/PersistTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/PersistTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/PersistTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/PersistTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,223 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+import java.util.ArrayList;
+import java.util.Collection;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+import org.hibernate.PersistentObjectException;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.test.EJB3TestCase;
+import org.hibernate.exception.ConstraintViolationException;
+
+/**
+ * @author Gavin King
+ */
+public class PersistTest extends EJB3TestCase {
+
+ public PersistTest(String str) {
+ super( str );
+ }
+
+ public void testCreateTree() {
+
+ clearCounts();
+
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Node root = new Node( "root" );
+ Node child = new Node( "child" );
+ root.addChild( child );
+ s.persist( root );
+ tx.commit();
+ s.close();
+
+ assertInsertCount( 2 );
+ assertUpdateCount( 0 );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ root = (Node) s.get( Node.class, "root" );
+ Node child2 = new Node( "child2" );
+ root.addChild( child2 );
+ tx.commit();
+ s.close();
+
+ assertInsertCount( 3 );
+ assertUpdateCount( 0 );
+ }
+
+ public void testCreateTreeWithGeneratedId() {
+
+ clearCounts();
+
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ NumberedNode root = new NumberedNode( "root" );
+ NumberedNode child = new NumberedNode( "child" );
+ root.addChild( child );
+ s.persist( root );
+ tx.commit();
+ s.close();
+
+ assertInsertCount( 2 );
+ assertUpdateCount( 0 );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ root = (NumberedNode) s.get( NumberedNode.class, new Long( root.getId() ) );
+ NumberedNode child2 = new NumberedNode( "child2" );
+ root.addChild( child2 );
+ tx.commit();
+ s.close();
+
+ assertInsertCount( 3 );
+ assertUpdateCount( 0 );
+ }
+
+ public void testCreateException() {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ Node dupe = new Node( "dupe" );
+ s.persist( dupe );
+ s.persist( dupe );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( dupe );
+ try {
+ tx.commit();
+ fail( "Cannot persist() twice the same entity" );
+ }
+ catch (ConstraintViolationException cve) {
+ //verify that an exception is thrown!
+ }
+ tx.rollback();
+ s.close();
+
+ Node nondupe = new Node( "nondupe" );
+ nondupe.addChild( dupe );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ s.persist( nondupe );
+ try {
+ tx.commit();
+ assertFalse( true );
+ }
+ catch (ConstraintViolationException cve) {
+ //verify that an exception is thrown!
+ }
+ tx.rollback();
+ s.close();
+ }
+
+ public void testCreateExceptionWithGeneratedId() {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ NumberedNode dupe = new NumberedNode( "dupe" );
+ s.persist( dupe );
+ s.persist( dupe );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ try {
+ s.persist( dupe );
+ assertFalse( true );
+ }
+ catch (PersistentObjectException poe) {
+ //verify that an exception is thrown!
+ }
+ tx.rollback();
+ s.close();
+
+ NumberedNode nondupe = new NumberedNode( "nondupe" );
+ nondupe.addChild( dupe );
+
+ s = openSession();
+ tx = s.beginTransaction();
+ try {
+ s.persist( nondupe );
+ assertFalse( true );
+ }
+ catch (PersistentObjectException poe) {
+ //verify that an exception is thrown!
+ }
+ tx.rollback();
+ s.close();
+ }
+
+ public void testBasic() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Employer er = new Employer();
+ Employee ee = new Employee();
+ s.persist( ee );
+ Collection erColl = new ArrayList();
+ Collection eeColl = new ArrayList();
+ erColl.add( ee );
+ eeColl.add( er );
+ er.setEmployees( erColl );
+ ee.setEmployers( eeColl );
+ tx.commit();
+ s.close();
+
+ s = openSession();
+ tx = s.beginTransaction();
+ er = (Employer) s.load( Employer.class, er.getId() );
+ assertNotNull( er );
+ assertNotNull( er.getEmployees() );
+ assertEquals( 1, er.getEmployees().size() );
+ Employee eeFromDb = (Employee) er.getEmployees().iterator().next();
+ assertEquals( ee.getId(), eeFromDb.getId() );
+ tx.commit();
+ s.close();
+ }
+
+ private void clearCounts() {
+ getSessions().getStatistics().clear();
+ }
+
+ private void assertInsertCount(int count) {
+ int inserts = (int) getSessions().getStatistics().getEntityInsertCount();
+ assertEquals( count, inserts );
+ }
+
+ private void assertUpdateCount(int count) {
+ int updates = (int) getSessions().getStatistics().getEntityUpdateCount();
+ assertEquals( count, updates );
+ }
+
+ protected void configure(Configuration cfg) {
+ super.configure( cfg );
+ cfg.setProperty( Environment.GENERATE_STATISTICS, "true" );
+ cfg.setProperty( Environment.STATEMENT_BATCH_SIZE, "0" );
+ }
+
+ protected String[] getMappings() {
+ return new String[]{
+ "ops/Node.hbm.xml",
+ "ops/Employer.hbm.xml"
+ };
+ }
+
+ public static Test suite() {
+ return new TestSuite( PersistTest.class );
+ }
+
+ public String getCacheConcurrencyStrategy() {
+ return null;
+ }
+
+}
+
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Reptile.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Reptile.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Reptile.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.ops;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Reptile extends Animal {
- private float temperature;
-
- public float getTemperature() {
- return temperature;
- }
-
- public void setTemperature(float temperature) {
- this.temperature = temperature;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Reptile.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Reptile.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Reptile.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Reptile.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.ejb.test.ops;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Reptile extends Animal {
+ private float temperature;
+
+ public float getTemperature() {
+ return temperature;
+ }
+
+ public void setTemperature(float temperature) {
+ this.temperature = temperature;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Workload.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Workload.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Workload.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.ops;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Workload {
- @Id
- @GeneratedValue
- public Integer id;
- public String name;
- public Integer load;
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Workload.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Workload.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Workload.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/ops/Workload.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id$
+package org.hibernate.ejb.test.ops;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Workload {
+ @Id
+ @GeneratedValue
+ public Integer id;
+ public String name;
+ public Integer load;
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack)
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/Morito.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/Morito.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/Morito.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.pack.cfgxmlpar;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Morito {
- private Integer id;
- private String power;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getPower() {
- return power;
- }
-
- public void setPower(String power) {
- this.power = power;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/Morito.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/Morito.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/Morito.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/cfgxmlpar/Morito.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.ejb.test.pack.cfgxmlpar;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Morito {
+ private Integer id;
+ private String power;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getPower() {
+ return power;
+ }
+
+ public void setPower(String power) {
+ this.power = power;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/ApplicationServer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/ApplicationServer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/ApplicationServer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.pack.defaultpar;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class ApplicationServer {
- private Integer id;
- private String name;
- private org.hibernate.ejb.test.pack.defaultpar.Version version;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Version getVersion() {
- return version;
- }
-
- public void setVersion(org.hibernate.ejb.test.pack.defaultpar.Version version) {
- this.version = version;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/ApplicationServer.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/ApplicationServer.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/ApplicationServer.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/ApplicationServer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id$
+package org.hibernate.ejb.test.pack.defaultpar;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class ApplicationServer {
+ private Integer id;
+ private String name;
+ private org.hibernate.ejb.test.pack.defaultpar.Version version;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Version getVersion() {
+ return version;
+ }
+
+ public void setVersion(org.hibernate.ejb.test.pack.defaultpar.Version version) {
+ this.version = version;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/IncrementListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/IncrementListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/IncrementListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.pack.defaultpar;
-
-import javax.persistence.PrePersist;
-
-/**
- * @author Emmanuel Bernard
- */
-public class IncrementListener {
- private static int increment;
-
- public static int getIncrement() {
- return increment;
- }
-
- public static void reset() {
- increment = 0;
- }
-
- @PrePersist
- public void increment(Object entity) {
- increment++;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/IncrementListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/IncrementListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/IncrementListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/IncrementListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.ejb.test.pack.defaultpar;
+
+import javax.persistence.PrePersist;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class IncrementListener {
+ private static int increment;
+
+ public static int getIncrement() {
+ return increment;
+ }
+
+ public static void reset() {
+ increment = 0;
+ }
+
+ @PrePersist
+ public void increment(Object entity) {
+ increment++;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Lighter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Lighter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Lighter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.pack.defaultpar;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Lighter {
- public String name;
- public String power;
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Lighter.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Lighter.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Lighter.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Lighter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.ejb.test.pack.defaultpar;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Lighter {
+ public String name;
+ public String power;
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Money.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Money.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Money.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.pack.defaultpar;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Money {
- private Integer id;
-
- @Id @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Money.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Money.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Money.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Money.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.ejb.test.pack.defaultpar;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Money {
+ private Integer id;
+
+ @Id @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Mouse.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Mouse.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Mouse.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.pack.defaultpar;
-
-import javax.persistence.ExcludeDefaultListeners;
-
-/**
- * @author Emmanuel Bernard
- */
- at ExcludeDefaultListeners
-public class Mouse {
- private Integer id;
- private String name;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Mouse.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Mouse.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Mouse.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Mouse.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id$
+package org.hibernate.ejb.test.pack.defaultpar;
+
+import javax.persistence.ExcludeDefaultListeners;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at ExcludeDefaultListeners
+public class Mouse {
+ private Integer id;
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/OtherIncrementListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/OtherIncrementListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/OtherIncrementListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.pack.defaultpar;
-
-/**
- * @author Emmanuel Bernard
- */
-public class OtherIncrementListener {
- private static int increment;
-
- public static int getIncrement() {
- return OtherIncrementListener.increment;
- }
-
- public static void reset() {
- increment = 0;
- }
-
- public void increment(Object entity) {
- OtherIncrementListener.increment++;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/OtherIncrementListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/OtherIncrementListener.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/OtherIncrementListener.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/OtherIncrementListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.ejb.test.pack.defaultpar;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class OtherIncrementListener {
+ private static int increment;
+
+ public static int getIncrement() {
+ return OtherIncrementListener.increment;
+ }
+
+ public static void reset() {
+ increment = 0;
+ }
+
+ public void increment(Object entity) {
+ OtherIncrementListener.increment++;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Version.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Version.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.pack.defaultpar;
-
-import javax.persistence.Embeddable;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class Version {
- private static final String DOT = ".";
- private int major;
- private int minor;
- private int micro;
-
- public int getMajor() {
- return major;
- }
-
- public void setMajor(int major) {
- this.major = major;
- }
-
- public int getMinor() {
- return minor;
- }
-
- public void setMinor(int minor) {
- this.minor = minor;
- }
-
- public int getMicro() {
- return micro;
- }
-
- public void setMicro(int micro) {
- this.micro = micro;
- }
-
- public String toString() {
- return new StringBuffer( major ).append( DOT ).append( minor ).append( DOT ).append( micro ).toString();
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Version.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Version.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Version.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id$
+package org.hibernate.ejb.test.pack.defaultpar;
+
+import javax.persistence.Embeddable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Version {
+ private static final String DOT = ".";
+ private int major;
+ private int minor;
+ private int micro;
+
+ public int getMajor() {
+ return major;
+ }
+
+ public void setMajor(int major) {
+ this.major = major;
+ }
+
+ public int getMinor() {
+ return minor;
+ }
+
+ public void setMinor(int minor) {
+ this.minor = minor;
+ }
+
+ public int getMicro() {
+ return micro;
+ }
+
+ public void setMicro(int micro) {
+ this.micro = micro;
+ }
+
+ public String toString() {
+ return new StringBuffer( major ).append( DOT ).append( minor ).append( DOT ).append( micro ).toString();
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/package-info.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/package-info.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,5 +0,0 @@
- at NamedQuery(name = "allMouse",
- query = "select m from ApplicationServer m") package org.hibernate.ejb.test.pack.defaultpar;
-
-import org.hibernate.annotations.NamedQuery;
-
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/package-info.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/package-info.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/package-info.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/defaultpar/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,5 @@
+ at NamedQuery(name = "allMouse",
+ query = "select m from ApplicationServer m") package org.hibernate.ejb.test.pack.defaultpar;
+
+import org.hibernate.annotations.NamedQuery;
+
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/Caipirinha.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/Caipirinha.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/Caipirinha.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.pack.excludehbmpar;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Caipirinha {
- private Integer id;
- private String name;
-
- public Caipirinha() {
- }
-
- public Caipirinha(String name) {
- this.name = name;
- }
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/Caipirinha.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/Caipirinha.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/Caipirinha.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/excludehbmpar/Caipirinha.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id$
+package org.hibernate.ejb.test.pack.excludehbmpar;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Caipirinha {
+ private Integer id;
+ private String name;
+
+ public Caipirinha() {
+ }
+
+ public Caipirinha(String name) {
+ this.name = name;
+ }
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/Washer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/Washer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/Washer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.pack.explicitpar;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Washer {
- //No @id so picking it up should fail
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/Washer.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/Washer.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/Washer.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explicitpar/Washer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id: $
+package org.hibernate.ejb.test.pack.explicitpar;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Washer {
+ //No @id so picking it up should fail
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Carpet.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Carpet.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Carpet.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.pack.explodedpar;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Carpet {
- private Integer id;
- private String country;
-
- @Id
- @GeneratedValue
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getCountry() {
- return country;
- }
-
- public void setCountry(String country) {
- this.country = country;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Carpet.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Carpet.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Carpet.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Carpet.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package org.hibernate.ejb.test.pack.explodedpar;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Carpet {
+ private Integer id;
+ private String country;
+
+ @Id
+ @GeneratedValue
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Elephant.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Elephant.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Elephant.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.pack.explodedpar;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Elephant {
- private Integer id;
- private String name;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Elephant.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Elephant.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Elephant.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/Elephant.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+package org.hibernate.ejb.test.pack.explodedpar;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Elephant {
+ private Integer id;
+ private String name;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/package-info.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/package-info.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,4 +0,0 @@
- at NamedQuery(name = "allCarpet", query = "select c from Carpet c") package org.hibernate.ejb.test.pack.explodedpar;
-
-import org.hibernate.annotations.NamedQuery;
-
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/package-info.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/package-info.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/package-info.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/explodedpar/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,4 @@
+ at NamedQuery(name = "allCarpet", query = "select c from Carpet c") package org.hibernate.ejb.test.pack.explodedpar;
+
+import org.hibernate.annotations.NamedQuery;
+
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/Scooter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/Scooter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/Scooter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.pack.externaljar;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Scooter {
- private String model;
- private Long speed;
-
- @Id
- public String getModel() {
- return model;
- }
-
- public void setModel(String model) {
- this.model = model;
- }
-
- public Long getSpeed() {
- return speed;
- }
-
- public void setSpeed(Long speed) {
- this.speed = speed;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/Scooter.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/Scooter.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/Scooter.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/externaljar/Scooter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.ejb.test.pack.externaljar;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Scooter {
+ private String model;
+ private Long speed;
+
+ @Id
+ public String getModel() {
+ return model;
+ }
+
+ public void setModel(String model) {
+ this.model = model;
+ }
+
+ public Long getSpeed() {
+ return speed;
+ }
+
+ public void setSpeed(Long speed) {
+ this.speed = speed;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/Bug.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/Bug.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/Bug.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.pack.overridenpar;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Bug {
- @Id
- @GeneratedValue
- private Long id;
- private String subject;
- private String comment;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getSubject() {
- return subject;
- }
-
- public void setSubject(String subject) {
- this.subject = subject;
- }
-
- public String getComment() {
- return comment;
- }
-
- public void setComment(String comment) {
- this.comment = comment;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/Bug.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/Bug.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/Bug.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/overridenpar/Bug.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id: $
+package org.hibernate.ejb.test.pack.overridenpar;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Bug {
+ @Id
+ @GeneratedValue
+ private Long id;
+ private String subject;
+ private String comment;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/Bug.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/Bug.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/Bug.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.pack.spacepar;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Bug {
- @Id
- @GeneratedValue
- private Long id;
- private String subject;
- private String comment;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getSubject() {
- return subject;
- }
-
- public void setSubject(String subject) {
- this.subject = subject;
- }
-
- public String getComment() {
- return comment;
- }
-
- public void setComment(String comment) {
- this.comment = comment;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/Bug.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/Bug.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/Bug.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/spacepar/Bug.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id: $
+package org.hibernate.ejb.test.pack.spacepar;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Bug {
+ @Id
+ @GeneratedValue
+ private Long id;
+ private String subject;
+ private String comment;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getSubject() {
+ return subject;
+ }
+
+ public void setSubject(String subject) {
+ this.subject = subject;
+ }
+
+ public String getComment() {
+ return comment;
+ }
+
+ public void setComment(String comment) {
+ this.comment = comment;
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Airplane.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Airplane.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Airplane.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.pack.various;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Airplane {
- private String serialNumber;
-
- public String getSerialNumber() {
- return serialNumber;
- }
-
- public void setSerialNumber(String serialNumber) {
- this.serialNumber = serialNumber;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Airplane.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Airplane.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Airplane.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Airplane.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.ejb.test.pack.various;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Airplane {
+ private String serialNumber;
+
+ public String getSerialNumber() {
+ return serialNumber;
+ }
+
+ public void setSerialNumber(String serialNumber) {
+ this.serialNumber = serialNumber;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Seat.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Seat.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Seat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.pack.various;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Seat {
- private String number;
-
- public String getNumber() {
- return number;
- }
-
- public void setNumber(String number) {
- this.number = number;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Seat.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Seat.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Seat.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/pack/various/Seat.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.ejb.test.pack.various;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Seat {
+ private String number;
+
+ public String getNumber() {
+ return number;
+ }
+
+ public void setNumber(String number) {
+ this.number = number;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/package-info.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/package-info.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,4 +0,0 @@
- at NamedQuery(name = "countItems", query = "select count(i) from Item i") package org.hibernate.ejb.test;
-
-import org.hibernate.annotations.NamedQuery;
-
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/package-info.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/package-info.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/package-info.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,4 @@
+ at NamedQuery(name = "countItems", query = "select count(i) from Item i") package org.hibernate.ejb.test;
+
+import org.hibernate.annotations.NamedQuery;
+
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/JarVisitorTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/JarVisitorTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/JarVisitorTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,184 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.packaging;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Set;
-import javax.persistence.Embeddable;
-import javax.persistence.Entity;
-import javax.persistence.MappedSuperclass;
-
-import junit.framework.TestCase;
-import org.hibernate.ejb.packaging.ExplodedJarVisitor;
-import org.hibernate.ejb.packaging.InputStreamZippedJarVisitor;
-import org.hibernate.ejb.packaging.JarVisitor;
-import org.hibernate.ejb.packaging.FileZippedJarVisitor;
-import org.hibernate.ejb.test.pack.defaultpar.ApplicationServer;
-import org.hibernate.ejb.test.pack.explodedpar.Carpet;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JarVisitorTest extends TestCase {
-
- public void testHttp() throws Exception {
- URL url = JarVisitor.getJarURLFromURLEntry(
- new URL(
- "jar:http://www.ibiblio.org/maven/hibernate/jars/hibernate-annotations-3.0beta1.jar!/META-INF/persistence.xml"
- ),
- "/META-INF/persistence.xml"
- );
- try {
- URLConnection urlConnection = url.openConnection();
- urlConnection.connect();
- }
- catch (IOException ie) {
- //fail silently
- return;
- }
- JarVisitor visitor = JarVisitor.getVisitor( url, getFilters() );
- assertEquals( 0, visitor.getMatchingEntries()[0].size() );
- assertEquals( 0, visitor.getMatchingEntries()[1].size() );
- assertEquals( 0, visitor.getMatchingEntries()[2].size() );
- }
-
- public void testInputStreamZippedJar() throws Exception {
- String jarFileName = "file:./build/testresources/defaultpar.par";
- //JarVisitor jarVisitor = new ZippedJarVisitor( jarFileName, true, true );
- JarVisitor.Filter[] filters = getFilters();
- JarVisitor jarVisitor = new InputStreamZippedJarVisitor( new URL( jarFileName ), filters );
- assertEquals( "defaultpar", jarVisitor.getUnqualifiedJarName() );
- Set entries = jarVisitor.getMatchingEntries()[1];
- assertEquals( 3, entries.size() );
- JarVisitor.Entry entry = new JarVisitor.Entry( ApplicationServer.class.getName(), null );
- assertTrue( entries.contains( entry ) );
- entry = new JarVisitor.Entry( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName(), null );
- assertTrue( entries.contains( entry ) );
- assertNull( ( (JarVisitor.Entry) entries.iterator().next() ).getInputStream() );
- assertEquals( 2, jarVisitor.getMatchingEntries()[2].size() );
- for (JarVisitor.Entry localEntry : (Set<JarVisitor.Entry>) jarVisitor.getMatchingEntries()[2] ) {
- assertNotNull( localEntry.getInputStream() );
- localEntry.getInputStream().close();
- }
-
-// Set<String> classes = jarVisitor.getClassNames();
-// assertEquals( 3, classes.size() );
-// assertTrue( classes.contains( ApplicationServer.class.getName() ) );
-// assertTrue( classes.contains( Mouse.class.getName() ) );
-// assertTrue( classes.contains( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName() ) );
- }
-
- public void testZippedJar() throws Exception {
- String jarFileName = "file:./build/testresources/defaultpar.par";
- //JarVisitor jarVisitor = new ZippedJarVisitor( jarFileName, true, true );
- JarVisitor.Filter[] filters = getFilters();
- JarVisitor jarVisitor = new FileZippedJarVisitor( new URL( jarFileName ), filters );
- assertEquals( "defaultpar", jarVisitor.getUnqualifiedJarName() );
- Set entries = jarVisitor.getMatchingEntries()[1];
- assertEquals( 3, entries.size() );
- JarVisitor.Entry entry = new JarVisitor.Entry( ApplicationServer.class.getName(), null );
- assertTrue( entries.contains( entry ) );
- entry = new JarVisitor.Entry( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName(), null );
- assertTrue( entries.contains( entry ) );
- assertNull( ( (JarVisitor.Entry) entries.iterator().next() ).getInputStream() );
- assertEquals( 2, jarVisitor.getMatchingEntries()[2].size() );
- for (JarVisitor.Entry localEntry : (Set<JarVisitor.Entry>) jarVisitor.getMatchingEntries()[2] ) {
- assertNotNull( localEntry.getInputStream() );
- localEntry.getInputStream().close();
- }
-// Set<String> classes = jarVisitor.getClassNames();
-// assertEquals( 3, classes.size() );
-// assertTrue( classes.contains( ApplicationServer.class.getName() ) );
-// assertTrue( classes.contains( Mouse.class.getName() ) );
-// assertTrue( classes.contains( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName() ) );
- }
-
- public void testExplodedJar() throws Exception {
- String jarFileName = "./build/testresources/explodedpar.par";
- //JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, true, true );
- JarVisitor.Filter[] filters = getFilters();
- JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, filters );
- assertEquals( "explodedpar", jarVisitor.getUnqualifiedJarName() );
- Set[] entries = jarVisitor.getMatchingEntries();
- assertEquals( 1, entries[1].size() );
- assertEquals( 1, entries[0].size() );
- assertEquals( 1, entries[2].size() );
-
- JarVisitor.Entry entry = new JarVisitor.Entry( Carpet.class.getName(), null );
- assertTrue( entries[1].contains( entry ) );
- for (JarVisitor.Entry localEntry : (Set<JarVisitor.Entry>) jarVisitor.getMatchingEntries()[2] ) {
- assertNotNull( localEntry.getInputStream() );
- localEntry.getInputStream().close();
- }
-// Set<String> classes = jarVisitor.getClassNames();
-// assertEquals( 2, classes.size() );
-// assertEquals( 1, jarVisitor.getPackageNames().size() );
-// assertEquals( 1, jarVisitor.getHbmFiles().size() );
-// assertTrue( classes.contains( Carpet.class.getName() ) );
- }
-
- public void testDuplicateFilterExplodedJarExpectedfail() throws Exception {
- String jarFileName = "./build/testresources/explodedpar.par";
- //JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, true, true );
- JarVisitor.Filter[] filters = getFilters();
- JarVisitor.Filter[] dupeFilters = new JarVisitor.Filter[filters.length * 2];
- int index = 0;
- for ( JarVisitor.Filter filter : filters ) {
- dupeFilters[index++] = filter;
- }
- filters = getFilters();
- for ( JarVisitor.Filter filter : filters ) {
- dupeFilters[index++] = filter;
- }
- JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, dupeFilters );
- assertEquals( "explodedpar", jarVisitor.getUnqualifiedJarName() );
- Set[] entries = jarVisitor.getMatchingEntries();
- assertEquals( 1, entries[1].size() );
- assertEquals( 1, entries[0].size() );
- assertEquals( 1, entries[2].size() );
- for ( JarVisitor.Entry entry : (Set<JarVisitor.Entry>) entries[2] ) {
- InputStream is = entry.getInputStream();
- if ( is != null ) {
- assertTrue( 0 < is.available() );
- is.close();
- }
- }
- for ( JarVisitor.Entry entry : (Set<JarVisitor.Entry>) entries[5] ) {
- InputStream is = entry.getInputStream();
- if ( is != null ) {
- assertTrue( 0 < is.available() );
- is.close();
- }
- }
-
- JarVisitor.Entry entry = new JarVisitor.Entry( Carpet.class.getName(), null );
- assertTrue( entries[1].contains( entry ) );
- }
-
- private JarVisitor.Filter[] getFilters() {
- return new JarVisitor.Filter[]{
- new JarVisitor.PackageFilter( false, null ) {
- public boolean accept(String javaElementName) {
- return true;
- }
- },
- new JarVisitor.ClassFilter(
- false, new Class[]{
- Entity.class,
- MappedSuperclass.class,
- Embeddable.class}
- ) {
- public boolean accept(String javaElementName) {
- return true;
- }
- },
- new JarVisitor.FileFilter( true ) {
- public boolean accept(String javaElementName) {
- return javaElementName.endsWith( "hbm.xml" ) || javaElementName.endsWith( "META-INF/orm.xml" );
- }
- }
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/JarVisitorTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/JarVisitorTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/JarVisitorTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/packaging/JarVisitorTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,184 @@
+//$Id$
+package org.hibernate.ejb.test.packaging;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Set;
+import javax.persistence.Embeddable;
+import javax.persistence.Entity;
+import javax.persistence.MappedSuperclass;
+
+import junit.framework.TestCase;
+import org.hibernate.ejb.packaging.ExplodedJarVisitor;
+import org.hibernate.ejb.packaging.InputStreamZippedJarVisitor;
+import org.hibernate.ejb.packaging.JarVisitor;
+import org.hibernate.ejb.packaging.FileZippedJarVisitor;
+import org.hibernate.ejb.test.pack.defaultpar.ApplicationServer;
+import org.hibernate.ejb.test.pack.explodedpar.Carpet;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JarVisitorTest extends TestCase {
+
+ public void testHttp() throws Exception {
+ URL url = JarVisitor.getJarURLFromURLEntry(
+ new URL(
+ "jar:http://www.ibiblio.org/maven/hibernate/jars/hibernate-annotations-3.0beta1.jar!/META-INF/persistence.xml"
+ ),
+ "/META-INF/persistence.xml"
+ );
+ try {
+ URLConnection urlConnection = url.openConnection();
+ urlConnection.connect();
+ }
+ catch (IOException ie) {
+ //fail silently
+ return;
+ }
+ JarVisitor visitor = JarVisitor.getVisitor( url, getFilters() );
+ assertEquals( 0, visitor.getMatchingEntries()[0].size() );
+ assertEquals( 0, visitor.getMatchingEntries()[1].size() );
+ assertEquals( 0, visitor.getMatchingEntries()[2].size() );
+ }
+
+ public void testInputStreamZippedJar() throws Exception {
+ String jarFileName = "file:./build/testresources/defaultpar.par";
+ //JarVisitor jarVisitor = new ZippedJarVisitor( jarFileName, true, true );
+ JarVisitor.Filter[] filters = getFilters();
+ JarVisitor jarVisitor = new InputStreamZippedJarVisitor( new URL( jarFileName ), filters );
+ assertEquals( "defaultpar", jarVisitor.getUnqualifiedJarName() );
+ Set entries = jarVisitor.getMatchingEntries()[1];
+ assertEquals( 3, entries.size() );
+ JarVisitor.Entry entry = new JarVisitor.Entry( ApplicationServer.class.getName(), null );
+ assertTrue( entries.contains( entry ) );
+ entry = new JarVisitor.Entry( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName(), null );
+ assertTrue( entries.contains( entry ) );
+ assertNull( ( (JarVisitor.Entry) entries.iterator().next() ).getInputStream() );
+ assertEquals( 2, jarVisitor.getMatchingEntries()[2].size() );
+ for (JarVisitor.Entry localEntry : (Set<JarVisitor.Entry>) jarVisitor.getMatchingEntries()[2] ) {
+ assertNotNull( localEntry.getInputStream() );
+ localEntry.getInputStream().close();
+ }
+
+// Set<String> classes = jarVisitor.getClassNames();
+// assertEquals( 3, classes.size() );
+// assertTrue( classes.contains( ApplicationServer.class.getName() ) );
+// assertTrue( classes.contains( Mouse.class.getName() ) );
+// assertTrue( classes.contains( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName() ) );
+ }
+
+ public void testZippedJar() throws Exception {
+ String jarFileName = "file:./build/testresources/defaultpar.par";
+ //JarVisitor jarVisitor = new ZippedJarVisitor( jarFileName, true, true );
+ JarVisitor.Filter[] filters = getFilters();
+ JarVisitor jarVisitor = new FileZippedJarVisitor( new URL( jarFileName ), filters );
+ assertEquals( "defaultpar", jarVisitor.getUnqualifiedJarName() );
+ Set entries = jarVisitor.getMatchingEntries()[1];
+ assertEquals( 3, entries.size() );
+ JarVisitor.Entry entry = new JarVisitor.Entry( ApplicationServer.class.getName(), null );
+ assertTrue( entries.contains( entry ) );
+ entry = new JarVisitor.Entry( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName(), null );
+ assertTrue( entries.contains( entry ) );
+ assertNull( ( (JarVisitor.Entry) entries.iterator().next() ).getInputStream() );
+ assertEquals( 2, jarVisitor.getMatchingEntries()[2].size() );
+ for (JarVisitor.Entry localEntry : (Set<JarVisitor.Entry>) jarVisitor.getMatchingEntries()[2] ) {
+ assertNotNull( localEntry.getInputStream() );
+ localEntry.getInputStream().close();
+ }
+// Set<String> classes = jarVisitor.getClassNames();
+// assertEquals( 3, classes.size() );
+// assertTrue( classes.contains( ApplicationServer.class.getName() ) );
+// assertTrue( classes.contains( Mouse.class.getName() ) );
+// assertTrue( classes.contains( org.hibernate.ejb.test.pack.defaultpar.Version.class.getName() ) );
+ }
+
+ public void testExplodedJar() throws Exception {
+ String jarFileName = "./build/testresources/explodedpar.par";
+ //JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, true, true );
+ JarVisitor.Filter[] filters = getFilters();
+ JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, filters );
+ assertEquals( "explodedpar", jarVisitor.getUnqualifiedJarName() );
+ Set[] entries = jarVisitor.getMatchingEntries();
+ assertEquals( 1, entries[1].size() );
+ assertEquals( 1, entries[0].size() );
+ assertEquals( 1, entries[2].size() );
+
+ JarVisitor.Entry entry = new JarVisitor.Entry( Carpet.class.getName(), null );
+ assertTrue( entries[1].contains( entry ) );
+ for (JarVisitor.Entry localEntry : (Set<JarVisitor.Entry>) jarVisitor.getMatchingEntries()[2] ) {
+ assertNotNull( localEntry.getInputStream() );
+ localEntry.getInputStream().close();
+ }
+// Set<String> classes = jarVisitor.getClassNames();
+// assertEquals( 2, classes.size() );
+// assertEquals( 1, jarVisitor.getPackageNames().size() );
+// assertEquals( 1, jarVisitor.getHbmFiles().size() );
+// assertTrue( classes.contains( Carpet.class.getName() ) );
+ }
+
+ public void testDuplicateFilterExplodedJarExpectedfail() throws Exception {
+ String jarFileName = "./build/testresources/explodedpar.par";
+ //JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, true, true );
+ JarVisitor.Filter[] filters = getFilters();
+ JarVisitor.Filter[] dupeFilters = new JarVisitor.Filter[filters.length * 2];
+ int index = 0;
+ for ( JarVisitor.Filter filter : filters ) {
+ dupeFilters[index++] = filter;
+ }
+ filters = getFilters();
+ for ( JarVisitor.Filter filter : filters ) {
+ dupeFilters[index++] = filter;
+ }
+ JarVisitor jarVisitor = new ExplodedJarVisitor( jarFileName, dupeFilters );
+ assertEquals( "explodedpar", jarVisitor.getUnqualifiedJarName() );
+ Set[] entries = jarVisitor.getMatchingEntries();
+ assertEquals( 1, entries[1].size() );
+ assertEquals( 1, entries[0].size() );
+ assertEquals( 1, entries[2].size() );
+ for ( JarVisitor.Entry entry : (Set<JarVisitor.Entry>) entries[2] ) {
+ InputStream is = entry.getInputStream();
+ if ( is != null ) {
+ assertTrue( 0 < is.available() );
+ is.close();
+ }
+ }
+ for ( JarVisitor.Entry entry : (Set<JarVisitor.Entry>) entries[5] ) {
+ InputStream is = entry.getInputStream();
+ if ( is != null ) {
+ assertTrue( 0 < is.available() );
+ is.close();
+ }
+ }
+
+ JarVisitor.Entry entry = new JarVisitor.Entry( Carpet.class.getName(), null );
+ assertTrue( entries[1].contains( entry ) );
+ }
+
+ private JarVisitor.Filter[] getFilters() {
+ return new JarVisitor.Filter[]{
+ new JarVisitor.PackageFilter( false, null ) {
+ public boolean accept(String javaElementName) {
+ return true;
+ }
+ },
+ new JarVisitor.ClassFilter(
+ false, new Class[]{
+ Entity.class,
+ MappedSuperclass.class,
+ Embeddable.class}
+ ) {
+ public boolean accept(String javaElementName) {
+ return true;
+ }
+ },
+ new JarVisitor.FileFilter( true ) {
+ public boolean accept(String javaElementName) {
+ return javaElementName.endsWith( "hbm.xml" ) || javaElementName.endsWith( "META-INF/orm.xml" );
+ }
+ }
+ };
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/Book.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/Book.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/Book.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,46 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.transaction;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.Version;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Book {
- @Id
- @GeneratedValue(strategy = GenerationType.TABLE)
- public Integer id;
- public String name;
-
- @Version
- public Integer version;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Integer getVersion() {
- return version;
- }
-
- public void setVersion(Integer version) {
- this.version = version;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/Book.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/Book.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/Book.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/Book.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,46 @@
+//$Id$
+package org.hibernate.ejb.test.transaction;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.Version;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Book {
+ @Id
+ @GeneratedValue(strategy = GenerationType.TABLE)
+ public Integer id;
+ public String name;
+
+ @Version
+ public Integer version;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Integer getVersion() {
+ return version;
+ }
+
+ public void setVersion(Integer version) {
+ this.version = version;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,288 +0,0 @@
-//$Id$
-package org.hibernate.ejb.test.transaction;
-
-import java.util.List;
-import javax.persistence.EntityManager;
-import javax.persistence.LockModeType;
-import javax.persistence.RollbackException;
-import javax.persistence.TransactionRequiredException;
-import javax.persistence.PersistenceException;
-import javax.persistence.OptimisticLockException;
-
-import org.hibernate.ejb.HibernateEntityManagerFactory;
-import org.hibernate.ejb.test.TestCase;
-import org.hibernate.stat.Statistics;
-import org.hibernate.Session;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FlushAndTransactionTest extends TestCase {
- public void testAlwaysTransactionalOperations() throws Exception {
- Book book = new Book();
- book.name = "Le petit prince";
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( book );
- em.getTransaction().commit();
- try {
- em.flush();
- fail( "flush has to be inside a Tx" );
- }
- catch (TransactionRequiredException e) {
- //success
- }
- try {
- em.lock( book, LockModeType.READ );
- fail( "lock has to be inside a Tx" );
- }
- catch (TransactionRequiredException e) {
- //success
- }
- em.getTransaction().begin();
- em.remove( em.find( Book.class, book.id ) );
- em.getTransaction().commit();
- }
-
-// public void testTransactionalOperationsWhenTransactional() throws Exception {
-// Book book = new Book();
-// book.name = "Le petit prince";
-// EntityManager em = factory.createEntityManager( PersistenceContextType.TRANSACTION );
-// try {
-// em.persist( book );
-// fail("flush has to be inside a Tx");
-// }
-// catch (TransactionRequiredException e) {
-// //success
-// }
-// try {
-// em.refresh( book );
-// fail("refresh has to be inside a Tx");
-// }
-// catch (TransactionRequiredException e) {
-// //success
-// }
-// try {
-// em.remove( book );
-// fail("refresh has to be inside a Tx");
-// }
-// catch (TransactionRequiredException e) {
-// //success
-// }
-// em.close();
-// }
-
- public void testTransactionalOperationsWhenExtended() throws Exception {
- Book book = new Book();
- book.name = "Le petit prince";
- EntityManager em = factory.createEntityManager();
- Statistics stats = ( (HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics();
- stats.clear();
- stats.setStatisticsEnabled( true );
-
- em.persist( book );
- assertEquals( 0, stats.getEntityInsertCount() );
- em.getTransaction().begin();
- em.flush();
- em.getTransaction().commit();
- assertEquals( 1, stats.getEntityInsertCount() );
-
- em.clear();
- book.name = "Le prince";
- book = em.merge( book );
-
- em.refresh( book );
- assertEquals( 0, stats.getEntityUpdateCount() );
- em.getTransaction().begin();
- em.flush();
- em.getTransaction().commit();
- assertEquals( 0, stats.getEntityUpdateCount() );
-
- book.name = "Le prince";
- em.getTransaction().begin();
- em.find( Book.class, book.id );
- em.getTransaction().commit();
- assertEquals( 1, stats.getEntityUpdateCount() );
-
- em.remove( book );
- assertEquals( 0, stats.getEntityDeleteCount() );
- em.getTransaction().begin();
- em.flush();
- em.getTransaction().commit();
- assertEquals( 1, stats.getEntityDeleteCount() );
-
- em.close();
- stats.setStatisticsEnabled( false );
- }
-
- public void testMergeWhenExtended() throws Exception {
- Book book = new Book();
- book.name = "Le petit prince";
- EntityManager em = factory.createEntityManager();
- Statistics stats = ( (HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics();
-
- em.getTransaction().begin();
- em.persist( book );
- assertEquals( 0, stats.getEntityInsertCount() );
- em.getTransaction().commit();
-
- em.clear(); //persist and clear
- stats.clear();
- stats.setStatisticsEnabled( true );
-
- Book bookReloaded = em.find( Book.class, book.id );
-
- book.name = "Le prince";
- assertEquals( "Merge should use the available entiies in the PC", em.merge( book ), bookReloaded );
- assertEquals( book.name, bookReloaded.name );
-
- assertEquals( 0, stats.getEntityDeleteCount() );
- assertEquals( 0, stats.getEntityInsertCount() );
- assertEquals( "Updates should have been queued", 0, stats.getEntityUpdateCount() );
-
- em.getTransaction().begin();
- Book bookReReloaded = em.find( Book.class, bookReloaded.id );
- assertEquals( "reload should return the object in PC", bookReReloaded, bookReloaded );
- assertEquals( bookReReloaded.name, bookReloaded.name );
- em.getTransaction().commit();
-
- assertEquals( 0, stats.getEntityDeleteCount() );
- assertEquals( 0, stats.getEntityInsertCount() );
- assertEquals( "Work on Tx should flush", 1, stats.getEntityUpdateCount() );
-
- em.getTransaction().begin();
- em.remove( bookReReloaded );
- em.getTransaction().commit();
-
- em.close();
- stats.setStatisticsEnabled( false );
- }
-
- public void testCloseAndTransaction() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Book book = new Book();
- book.name = "Java for Dummies";
- em.persist( book );
- em.close();
- book.name = "C# for Dummies";
- assertFalse( em.isOpen() );
- try {
- em.flush();
- fail( "direct action on a closed em should fail" );
- }
- catch (IllegalStateException e) {
- //success
- }
- em.getTransaction().commit();
- assertFalse( em.isOpen() );
- em = factory.createEntityManager();
- em.getTransaction().begin();
- book = em.find( Book.class, book.id );
- assertEquals( "C# for Dummies", book.name );
- em.remove( book );
- em.getTransaction().commit();
- em.close();
- }
-
- public void testTransactionCommitDoesNotFlush() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Book book = new Book();
- book.name = "Java for Dummies";
- em.persist( book );
- em.getTransaction().commit();
- em.close();
- em = factory.createEntityManager();
- em.getTransaction().begin();
- List result = em.createQuery("select book from Book book where book.name = :title").
- setParameter( "title", book.name ).getResultList();
- assertEquals( "EntityManager.commit() should trigger a flush()", 1, result.size() );
- em.getTransaction().commit();
- em.close();
- }
-
- public void testRollbackOnlyOnPersistenceException() throws Exception {
- Book book = new Book();
- book.name = "Stolen keys";
- book.id = null; //new Integer( 50 );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- try {
- em.persist( book );
- em.flush();
- em.clear();
- book.setName( "kitty kid");
- em.merge( book );
- em.flush();
- em.clear();
- book.setName( "kitty kid2"); //non updated version
- em.merge( book );
- em.flush();
- fail( "optimistic locking exception" );
- }
- catch (PersistenceException e) {
- //success
- }
- try {
- em.getTransaction().commit();
- fail( "Commit should be rollbacked" );
- }
- catch (RollbackException e) {
- //success
- }
- finally {
- em.close();
- }
-
- }
-
- public void testRollbackExceptionOnOptimisticLockException() throws Exception {
- Book book = new Book();
- book.name = "Stolen keys";
- book.id = null; //new Integer( 50 );
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( book );
- em.flush();
- em.clear();
- book.setName( "kitty kid");
- em.merge( book );
- em.flush();
- em.clear();
- book.setName( "kitty kid2"); //non updated version
- ( (Session) em.getDelegate() ).update( book );
- try {
- em.getTransaction().commit();
- fail( "Commit should be rollbacked" );
- }
- catch (RollbackException e) {
- assertTrue( "During flush a StateStateException is wrapped into a OptimisticLockException", e.getCause() instanceof OptimisticLockException );
- }
- finally {
- em.close();
- }
-
- }
-
- public void testRollbackClearPC() throws Exception {
- Book book = new Book();
- book.name = "Stolen keys";
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- em.persist( book );
- em.getTransaction().commit();
- em.getTransaction().begin();
- book.name = "Recovered keys";
- em.merge( book );
- em.getTransaction().rollback();
- assertEquals( "Stolen keys", em.find( Book.class, book.id ).name );
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Book.class
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/transaction/FlushAndTransactionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,288 @@
+//$Id$
+package org.hibernate.ejb.test.transaction;
+
+import java.util.List;
+import javax.persistence.EntityManager;
+import javax.persistence.LockModeType;
+import javax.persistence.RollbackException;
+import javax.persistence.TransactionRequiredException;
+import javax.persistence.PersistenceException;
+import javax.persistence.OptimisticLockException;
+
+import org.hibernate.ejb.HibernateEntityManagerFactory;
+import org.hibernate.ejb.test.TestCase;
+import org.hibernate.stat.Statistics;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FlushAndTransactionTest extends TestCase {
+ public void testAlwaysTransactionalOperations() throws Exception {
+ Book book = new Book();
+ book.name = "Le petit prince";
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( book );
+ em.getTransaction().commit();
+ try {
+ em.flush();
+ fail( "flush has to be inside a Tx" );
+ }
+ catch (TransactionRequiredException e) {
+ //success
+ }
+ try {
+ em.lock( book, LockModeType.READ );
+ fail( "lock has to be inside a Tx" );
+ }
+ catch (TransactionRequiredException e) {
+ //success
+ }
+ em.getTransaction().begin();
+ em.remove( em.find( Book.class, book.id ) );
+ em.getTransaction().commit();
+ }
+
+// public void testTransactionalOperationsWhenTransactional() throws Exception {
+// Book book = new Book();
+// book.name = "Le petit prince";
+// EntityManager em = factory.createEntityManager( PersistenceContextType.TRANSACTION );
+// try {
+// em.persist( book );
+// fail("flush has to be inside a Tx");
+// }
+// catch (TransactionRequiredException e) {
+// //success
+// }
+// try {
+// em.refresh( book );
+// fail("refresh has to be inside a Tx");
+// }
+// catch (TransactionRequiredException e) {
+// //success
+// }
+// try {
+// em.remove( book );
+// fail("refresh has to be inside a Tx");
+// }
+// catch (TransactionRequiredException e) {
+// //success
+// }
+// em.close();
+// }
+
+ public void testTransactionalOperationsWhenExtended() throws Exception {
+ Book book = new Book();
+ book.name = "Le petit prince";
+ EntityManager em = factory.createEntityManager();
+ Statistics stats = ( (HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics();
+ stats.clear();
+ stats.setStatisticsEnabled( true );
+
+ em.persist( book );
+ assertEquals( 0, stats.getEntityInsertCount() );
+ em.getTransaction().begin();
+ em.flush();
+ em.getTransaction().commit();
+ assertEquals( 1, stats.getEntityInsertCount() );
+
+ em.clear();
+ book.name = "Le prince";
+ book = em.merge( book );
+
+ em.refresh( book );
+ assertEquals( 0, stats.getEntityUpdateCount() );
+ em.getTransaction().begin();
+ em.flush();
+ em.getTransaction().commit();
+ assertEquals( 0, stats.getEntityUpdateCount() );
+
+ book.name = "Le prince";
+ em.getTransaction().begin();
+ em.find( Book.class, book.id );
+ em.getTransaction().commit();
+ assertEquals( 1, stats.getEntityUpdateCount() );
+
+ em.remove( book );
+ assertEquals( 0, stats.getEntityDeleteCount() );
+ em.getTransaction().begin();
+ em.flush();
+ em.getTransaction().commit();
+ assertEquals( 1, stats.getEntityDeleteCount() );
+
+ em.close();
+ stats.setStatisticsEnabled( false );
+ }
+
+ public void testMergeWhenExtended() throws Exception {
+ Book book = new Book();
+ book.name = "Le petit prince";
+ EntityManager em = factory.createEntityManager();
+ Statistics stats = ( (HibernateEntityManagerFactory) factory ).getSessionFactory().getStatistics();
+
+ em.getTransaction().begin();
+ em.persist( book );
+ assertEquals( 0, stats.getEntityInsertCount() );
+ em.getTransaction().commit();
+
+ em.clear(); //persist and clear
+ stats.clear();
+ stats.setStatisticsEnabled( true );
+
+ Book bookReloaded = em.find( Book.class, book.id );
+
+ book.name = "Le prince";
+ assertEquals( "Merge should use the available entiies in the PC", em.merge( book ), bookReloaded );
+ assertEquals( book.name, bookReloaded.name );
+
+ assertEquals( 0, stats.getEntityDeleteCount() );
+ assertEquals( 0, stats.getEntityInsertCount() );
+ assertEquals( "Updates should have been queued", 0, stats.getEntityUpdateCount() );
+
+ em.getTransaction().begin();
+ Book bookReReloaded = em.find( Book.class, bookReloaded.id );
+ assertEquals( "reload should return the object in PC", bookReReloaded, bookReloaded );
+ assertEquals( bookReReloaded.name, bookReloaded.name );
+ em.getTransaction().commit();
+
+ assertEquals( 0, stats.getEntityDeleteCount() );
+ assertEquals( 0, stats.getEntityInsertCount() );
+ assertEquals( "Work on Tx should flush", 1, stats.getEntityUpdateCount() );
+
+ em.getTransaction().begin();
+ em.remove( bookReReloaded );
+ em.getTransaction().commit();
+
+ em.close();
+ stats.setStatisticsEnabled( false );
+ }
+
+ public void testCloseAndTransaction() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Book book = new Book();
+ book.name = "Java for Dummies";
+ em.persist( book );
+ em.close();
+ book.name = "C# for Dummies";
+ assertFalse( em.isOpen() );
+ try {
+ em.flush();
+ fail( "direct action on a closed em should fail" );
+ }
+ catch (IllegalStateException e) {
+ //success
+ }
+ em.getTransaction().commit();
+ assertFalse( em.isOpen() );
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ book = em.find( Book.class, book.id );
+ assertEquals( "C# for Dummies", book.name );
+ em.remove( book );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testTransactionCommitDoesNotFlush() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Book book = new Book();
+ book.name = "Java for Dummies";
+ em.persist( book );
+ em.getTransaction().commit();
+ em.close();
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ List result = em.createQuery("select book from Book book where book.name = :title").
+ setParameter( "title", book.name ).getResultList();
+ assertEquals( "EntityManager.commit() should trigger a flush()", 1, result.size() );
+ em.getTransaction().commit();
+ em.close();
+ }
+
+ public void testRollbackOnlyOnPersistenceException() throws Exception {
+ Book book = new Book();
+ book.name = "Stolen keys";
+ book.id = null; //new Integer( 50 );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ try {
+ em.persist( book );
+ em.flush();
+ em.clear();
+ book.setName( "kitty kid");
+ em.merge( book );
+ em.flush();
+ em.clear();
+ book.setName( "kitty kid2"); //non updated version
+ em.merge( book );
+ em.flush();
+ fail( "optimistic locking exception" );
+ }
+ catch (PersistenceException e) {
+ //success
+ }
+ try {
+ em.getTransaction().commit();
+ fail( "Commit should be rollbacked" );
+ }
+ catch (RollbackException e) {
+ //success
+ }
+ finally {
+ em.close();
+ }
+
+ }
+
+ public void testRollbackExceptionOnOptimisticLockException() throws Exception {
+ Book book = new Book();
+ book.name = "Stolen keys";
+ book.id = null; //new Integer( 50 );
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( book );
+ em.flush();
+ em.clear();
+ book.setName( "kitty kid");
+ em.merge( book );
+ em.flush();
+ em.clear();
+ book.setName( "kitty kid2"); //non updated version
+ ( (Session) em.getDelegate() ).update( book );
+ try {
+ em.getTransaction().commit();
+ fail( "Commit should be rollbacked" );
+ }
+ catch (RollbackException e) {
+ assertTrue( "During flush a StateStateException is wrapped into a OptimisticLockException", e.getCause() instanceof OptimisticLockException );
+ }
+ finally {
+ em.close();
+ }
+
+ }
+
+ public void testRollbackClearPC() throws Exception {
+ Book book = new Book();
+ book.name = "Stolen keys";
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ em.persist( book );
+ em.getTransaction().commit();
+ em.getTransaction().begin();
+ book.name = "Recovered keys";
+ em.merge( book );
+ em.getTransaction().rollback();
+ assertEquals( "Stolen keys", em.find( Book.class, book.id ).name );
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Book.class
+ };
+ }
+}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml)
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Address.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Address.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,54 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.xml;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Address {
- private String street;
- private String city;
- private String state;
- private String zip;
-
- public Address() {
- }
-
- public Address(String street, String city, String state, String zip) {
- this.street = street;
- this.city = city;
- this.state = state;
- this.zip = zip;
- }
-
- public String getStreet() {
- return street;
- }
-
- public void setStreet(String street) {
- this.street = street;
- }
-
- public String getCity() {
- return city;
- }
-
- public void setCity(String city) {
- this.city = city;
- }
-
- public String getState() {
- return state;
- }
-
- public void setState(String state) {
- this.state = state;
- }
-
- public String getZip() {
- return zip;
- }
-
- public void setZip(String zip) {
- this.zip = zip;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Address.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Address.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Address.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,54 @@
+//$Id: $
+package org.hibernate.ejb.test.xml;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Address {
+ private String street;
+ private String city;
+ private String state;
+ private String zip;
+
+ public Address() {
+ }
+
+ public Address(String street, String city, String state, String zip) {
+ this.street = street;
+ this.city = city;
+ this.state = state;
+ this.zip = zip;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ public String getZip() {
+ return zip;
+ }
+
+ public void setZip(String zip) {
+ this.zip = zip;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Article.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Article.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Article.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.xml;
-
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Table;
-import javax.persistence.GeneratedValue;
-import javax.persistence.CascadeType;
-import javax.persistence.ManyToOne;
-import javax.persistence.JoinColumn;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Table(name = "ITEM")
- at org.hibernate.annotations.BatchSize(size = 10)
-public class Article {
- private Integer id;
- private String name;
-
- private Article nextArticle;
-
- @Id @GeneratedValue public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- @Column(name="poopoo")
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
-
-
- @ManyToOne(cascade = CascadeType.ALL)
- @JoinColumn(name = "NEXT_MESSAGE_ID")
- public Article getNextArticle() {
- return nextArticle;
- }
-
- public void setNextArticle(Article nextArticle) {
- this.nextArticle = nextArticle;
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Article.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Article.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Article.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Article.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id: $
+package org.hibernate.ejb.test.xml;
+
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Table;
+import javax.persistence.GeneratedValue;
+import javax.persistence.CascadeType;
+import javax.persistence.ManyToOne;
+import javax.persistence.JoinColumn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Table(name = "ITEM")
+ at org.hibernate.annotations.BatchSize(size = 10)
+public class Article {
+ private Integer id;
+ private String name;
+
+ private Article nextArticle;
+
+ @Id @GeneratedValue public Integer getId() {
+ return id;
+ }
+ public void setId(Integer id) {
+ this.id = id;
+ }
+ @Column(name="poopoo")
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ @ManyToOne(cascade = CascadeType.ALL)
+ @JoinColumn(name = "NEXT_MESSAGE_ID")
+ public Article getNextArticle() {
+ return nextArticle;
+ }
+
+ public void setNextArticle(Article nextArticle) {
+ this.nextArticle = nextArticle;
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Employee.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Employee.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Employee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,66 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.xml;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Employee {
- @Id
- Long id;
- String name;
-/*
- @Embedded
- @AttributeOverrides({
- @AttributeOverride(name = "street", column = @Column(name = "HA_street")),
- @AttributeOverride(name = "city", column = @Column(name = "HA_city")),
- @AttributeOverride(name = "state", column = @Column(name = "HA_state")),
- @AttributeOverride(name = "zip", column = @Column(name = "HA_zip")) })
-*/
- Address homeAddress;
-
-/*
- @Embedded
- @AttributeOverrides({
- @AttributeOverride(name = "street", column = @Column(name = "MA_street")),
- @AttributeOverride(name = "city", column = @Column(name = "MA_city")),
- @AttributeOverride(name = "state", column = @Column(name = "MA_state")),
- @AttributeOverride(name = "zip", column = @Column(name = "MA_zip")) })
-*/
- Address mailAddress;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Address getHomeAddress() {
- return homeAddress;
- }
-
- public void setHomeAddress(Address homeAddress) {
- this.homeAddress = homeAddress;
- }
-
- public Address getMailAddress() {
- return mailAddress;
- }
-
- public void setMailAddress(Address mailAddress) {
- this.mailAddress = mailAddress;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Employee.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Employee.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Employee.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Employee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,66 @@
+//$Id: $
+package org.hibernate.ejb.test.xml;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Employee {
+ @Id
+ Long id;
+ String name;
+/*
+ @Embedded
+ @AttributeOverrides({
+ @AttributeOverride(name = "street", column = @Column(name = "HA_street")),
+ @AttributeOverride(name = "city", column = @Column(name = "HA_city")),
+ @AttributeOverride(name = "state", column = @Column(name = "HA_state")),
+ @AttributeOverride(name = "zip", column = @Column(name = "HA_zip")) })
+*/
+ Address homeAddress;
+
+/*
+ @Embedded
+ @AttributeOverrides({
+ @AttributeOverride(name = "street", column = @Column(name = "MA_street")),
+ @AttributeOverride(name = "city", column = @Column(name = "MA_city")),
+ @AttributeOverride(name = "state", column = @Column(name = "MA_state")),
+ @AttributeOverride(name = "zip", column = @Column(name = "MA_zip")) })
+*/
+ Address mailAddress;
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Address getHomeAddress() {
+ return homeAddress;
+ }
+
+ public void setHomeAddress(Address homeAddress) {
+ this.homeAddress = homeAddress;
+ }
+
+ public Address getMailAddress() {
+ return mailAddress;
+ }
+
+ public void setMailAddress(Address mailAddress) {
+ this.mailAddress = mailAddress;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Light.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Light.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Light.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.xml;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Light {
- public String name;
- public String power;
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Light.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Light.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Light.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Light.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.ejb.test.xml;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Light {
+ public String name;
+ public String power;
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Lighter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Lighter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Lighter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.xml;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Lighter {
- public String name;
- public String power;
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Lighter.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Lighter.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Lighter.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/Lighter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+//$Id: $
+package org.hibernate.ejb.test.xml;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Lighter {
+ public String name;
+ public String power;
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlAttributeOverrideTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlAttributeOverrideTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlAttributeOverrideTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.xml;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class XmlAttributeOverrideTest extends TestCase {
-
- public void testAttributeOverriding() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
-
- Employee e = new Employee();
- e.setId(Long.valueOf(100));
- e.setName("Bubba");
- e.setHomeAddress(new Address("123 Main St", "New York", "NY", "11111"));
- e.setMailAddress(new Address("P.O. Box 123", "New York", "NY", "11111"));
-
- em.persist(e);
-
- em.flush();
-
- em.getTransaction().rollback();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[0];
- }
-
- @Override
- public String[] getEjb3DD() {
- return new String[] {
- "org/hibernate/ejb/test/xml/orm3.xml"
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlAttributeOverrideTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlAttributeOverrideTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlAttributeOverrideTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlAttributeOverrideTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id: $
+package org.hibernate.ejb.test.xml;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class XmlAttributeOverrideTest extends TestCase {
+
+ public void testAttributeOverriding() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+
+ Employee e = new Employee();
+ e.setId(Long.valueOf(100));
+ e.setName("Bubba");
+ e.setHomeAddress(new Address("123 Main St", "New York", "NY", "11111"));
+ e.setMailAddress(new Address("P.O. Box 123", "New York", "NY", "11111"));
+
+ em.persist(e);
+
+ em.flush();
+
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[0];
+ }
+
+ @Override
+ public String[] getEjb3DD() {
+ return new String[] {
+ "org/hibernate/ejb/test/xml/orm3.xml"
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id: $
-package org.hibernate.ejb.test.xml;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.test.TestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class XmlTest extends TestCase {
- public void testXmlMappingCorrectness() throws Exception {
- EntityManager em = factory.createEntityManager();
- em.close();
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[0];
- }
-
- @Override
- public String[] getEjb3DD() {
- return new String[] {
- "org/hibernate/ejb/test/xml/orm.xml",
- "org/hibernate/ejb/test/xml/orm2.xml",
- };
- }
-}
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlTest.java)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlTest.java (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/XmlTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id: $
+package org.hibernate.ejb.test.xml;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.test.TestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class XmlTest extends TestCase {
+ public void testXmlMappingCorrectness() throws Exception {
+ EntityManager em = factory.createEntityManager();
+ em.close();
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[0];
+ }
+
+ @Override
+ public String[] getEjb3DD() {
+ return new String[] {
+ "org/hibernate/ejb/test/xml/orm.xml",
+ "org/hibernate/ejb/test/xml/orm2.xml",
+ };
+ }
+}
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-<?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"
- >
- <persistence-unit-metadata>
- <persistence-unit-defaults>
- <schema>MY_SCHEMA</schema>
- <catalog>MY_CATALOG</catalog>
- <access>PROPERTY</access>
- <cascade-persist/>
- </persistence-unit-defaults>
- </persistence-unit-metadata>
- <package>org.hibernate.ejb.test.xml</package>
- <entity class="Light" metadata-complete="true" access="FIELD">
- <attributes>
- <id name="name">
- <column name="fld_id"/>
- </id>
- <basic name="power"></basic>
- </attributes>
- </entity>
- <entity class="Article"
- metadata-complete="false">
- <attributes>
- <id name="id">
- <generated-value strategy="SEQUENCE"/>
- </id>
- </attributes>
- </entity>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+<?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"
+ >
+ <persistence-unit-metadata>
+ <persistence-unit-defaults>
+ <schema>MY_SCHEMA</schema>
+ <catalog>MY_CATALOG</catalog>
+ <access>PROPERTY</access>
+ <cascade-persist/>
+ </persistence-unit-defaults>
+ </persistence-unit-metadata>
+ <package>org.hibernate.ejb.test.xml</package>
+ <entity class="Light" metadata-complete="true" access="FIELD">
+ <attributes>
+ <id name="name">
+ <column name="fld_id"/>
+ </id>
+ <basic name="power"></basic>
+ </attributes>
+ </entity>
+ <entity class="Article"
+ metadata-complete="false">
+ <attributes>
+ <id name="id">
+ <generated-value strategy="SEQUENCE"/>
+ </id>
+ </attributes>
+ </entity>
+</entity-mappings>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm2.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm2.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm2.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-<?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"
- >
- <entity class="org.hibernate.ejb.test.xml.Lighter" name="ALighter" access="FIELD" metadata-complete="true">
- <attributes>
- <id name="name">
- <column name="fld_id"/>
- </id>
- <basic name="power"></basic>
- </attributes>
- </entity>
- <!-- entity class="NoPackageEntity" name="ALighter" access="FIELD" metadata-complete="true">
- <attributes>
- <id name="id"/>
- <basic name="name"/>
- </attributes>
- </entity -->
- <embeddable class="NoPackageEntity" access="FIELD">
- <attributes>
- <basic name="name"/>
- </attributes>
- </embeddable>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm2.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm2.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm2.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm2.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+<?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"
+ >
+ <entity class="org.hibernate.ejb.test.xml.Lighter" name="ALighter" access="FIELD" metadata-complete="true">
+ <attributes>
+ <id name="name">
+ <column name="fld_id"/>
+ </id>
+ <basic name="power"></basic>
+ </attributes>
+ </entity>
+ <!-- entity class="NoPackageEntity" name="ALighter" access="FIELD" metadata-complete="true">
+ <attributes>
+ <id name="id"/>
+ <basic name="name"/>
+ </attributes>
+ </entity -->
+ <embeddable class="NoPackageEntity" access="FIELD">
+ <attributes>
+ <basic name="name"/>
+ </attributes>
+ </embeddable>
+</entity-mappings>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm3.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm3.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm3.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,55 +0,0 @@
-<?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 http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
- version="1.0">
-
- <entity class="org.hibernate.ejb.test.xml.Employee" metadata-complete="false" access="FIELD">
- <attributes>
- <id name="id"/>
- <basic name="name"/>
-
- <embedded name="homeAddress">
- <attribute-override name="street">
- <column name="home_street"/>
- </attribute-override>
- <attribute-override name="city">
- <column name="home_city"/>
- </attribute-override>
- <attribute-override name="state">
- <column name="home_state"/>
- </attribute-override>
- <attribute-override name="zip">
- <column name="home_zip"/>
- </attribute-override>
- </embedded>
-
- <embedded name="mailAddress">
- <attribute-override name="street">
- <column name="mail_street"/>
- </attribute-override>
- <attribute-override name="city">
- <column name="mail_city"/>
- </attribute-override>
- <attribute-override name="state">
- <column name="mail_state"/>
- </attribute-override>
- <attribute-override name="zip">
- <column name="mail_zip"/>
- </attribute-override>
- </embedded>
-
- </attributes>
- </entity>
-
- <embeddable class="org.hibernate.ejb.test.xml.Address">
- <attributes>
- <basic name="street"/>
- <basic name="city"/>
- <basic name="state"/>
- <basic name="zip"/>
- </attributes>
- </embeddable>
-
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm3.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm3.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm3.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test/org/hibernate/ejb/test/xml/orm3.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,55 @@
+<?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 http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
+ version="1.0">
+
+ <entity class="org.hibernate.ejb.test.xml.Employee" metadata-complete="false" access="FIELD">
+ <attributes>
+ <id name="id"/>
+ <basic name="name"/>
+
+ <embedded name="homeAddress">
+ <attribute-override name="street">
+ <column name="home_street"/>
+ </attribute-override>
+ <attribute-override name="city">
+ <column name="home_city"/>
+ </attribute-override>
+ <attribute-override name="state">
+ <column name="home_state"/>
+ </attribute-override>
+ <attribute-override name="zip">
+ <column name="home_zip"/>
+ </attribute-override>
+ </embedded>
+
+ <embedded name="mailAddress">
+ <attribute-override name="street">
+ <column name="mail_street"/>
+ </attribute-override>
+ <attribute-override name="city">
+ <column name="mail_city"/>
+ </attribute-override>
+ <attribute-override name="state">
+ <column name="mail_state"/>
+ </attribute-override>
+ <attribute-override name="zip">
+ <column name="mail_zip"/>
+ </attribute-override>
+ </embedded>
+
+ </attributes>
+ </entity>
+
+ <embeddable class="org.hibernate.ejb.test.xml.Address">
+ <attributes>
+ <basic name="street"/>
+ <basic name="city"/>
+ <basic name="state"/>
+ <basic name="zip"/>
+ </attributes>
+ </embeddable>
+
+</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test-resources (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/persistence.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/persistence.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- example of reference to a cfg.xml file -->
-<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_1_0.xsd"
- version="1.0">
- <persistence-unit name="cfgxmlpar" transaction-type="RESOURCE_LOCAL">
- <provider>org.hibernate.ejb.HibernatePersistence</provider>
- <properties>
- <property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml"/>
- </properties>
- </persistence-unit>
-</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/persistence.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/persistence.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/persistence.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- example of reference to a cfg.xml file -->
+<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_1_0.xsd"
+ version="1.0">
+ <persistence-unit name="cfgxmlpar" transaction-type="RESOURCE_LOCAL">
+ <provider>org.hibernate.ejb.HibernatePersistence</provider>
+ <properties>
+ <property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml"/>
+ </properties>
+ </persistence-unit>
+</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-<!DOCTYPE hibernate-configuration PUBLIC
- "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
-
-<hibernate-configuration>
- <session-factory>
- <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
- <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
- <property name="hibernate.connection.username">sa</property>
- <property name="hibernate.connection.password"></property>
- <property name="hibernate.connection.url">jdbc:hsqldb:.</property>
- <property name="hibernate.cache.use_query_cache">true</property>
- <property name="hibernate.cache.region_prefix">hibernate.test</property>
- <property name="hibernate.jdbc.use_streams_for_binary">true</property>
- <property name="hibernate.jdbc.batch_size">0</property>
- <property name="hibernate.max_fetch_depth">3</property>
- <property name="hibernate.hbm2ddl.auto">create-drop</property>
- <property name="hibernate.generate_statistics">true</property>
- <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
- <mapping class="org.hibernate.ejb.test.Item"/>
- <mapping class="org.hibernate.ejb.test.Cat"/>
- <mapping class="org.hibernate.ejb.test.Distributor"/>
- <class-cache class="org.hibernate.ejb.test.Item" usage="read-write"/>
- <collection-cache collection="org.hibernate.ejb.test.Item.distributors" usage="read-write" region="RegionName"/>
- <event type="pre-insert"/>
- </session-factory>
-</hibernate-configuration>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/cfgxmlpar/org/hibernate/ejb/test/pack/cfgxmlpar/hibernate.cfg.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+<!DOCTYPE hibernate-configuration PUBLIC
+ "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
+
+<hibernate-configuration>
+ <session-factory>
+ <property name="hibernate.dialect">org.hibernate.dialect.HSQLDialect</property>
+ <property name="hibernate.connection.driver_class">org.hsqldb.jdbcDriver</property>
+ <property name="hibernate.connection.username">sa</property>
+ <property name="hibernate.connection.password"></property>
+ <property name="hibernate.connection.url">jdbc:hsqldb:.</property>
+ <property name="hibernate.cache.use_query_cache">true</property>
+ <property name="hibernate.cache.region_prefix">hibernate.test</property>
+ <property name="hibernate.jdbc.use_streams_for_binary">true</property>
+ <property name="hibernate.jdbc.batch_size">0</property>
+ <property name="hibernate.max_fetch_depth">3</property>
+ <property name="hibernate.hbm2ddl.auto">create-drop</property>
+ <property name="hibernate.generate_statistics">true</property>
+ <property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
+ <mapping class="org.hibernate.ejb.test.Item"/>
+ <mapping class="org.hibernate.ejb.test.Cat"/>
+ <mapping class="org.hibernate.ejb.test.Distributor"/>
+ <class-cache class="org.hibernate.ejb.test.Item" usage="read-write"/>
+ <collection-cache collection="org.hibernate.ejb.test.Item.distributors" usage="read-write" region="RegionName"/>
+ <event type="pre-insert"/>
+ </session-factory>
+</hibernate-configuration>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/orm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/orm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-<?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"
- >
- <persistence-unit-metadata>
- <persistence-unit-defaults>
- <entity-listeners>
- <entity-listener class="org.hibernate.ejb.test.pack.defaultpar.IncrementListener">
- <pre-persist method-name="increment"/>
- </entity-listener>
- </entity-listeners>
- </persistence-unit-defaults>
- </persistence-unit-metadata>
- <package>org.hibernate.ejb.test.pack.defaultpar</package>
- <entity class="Lighter" access="FIELD" metadata-complete="true">
- <attributes>
- <id name="name">
- <column name="fld_id"/>
- </id>
- <basic name="power"></basic>
- </attributes>
- </entity>
- <entity class="ApplicationServer">
- <entity-listeners>
- <entity-listener class="OtherIncrementListener">
- <pre-persist method-name="increment"/>
- </entity-listener>
- </entity-listeners>
- </entity>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/orm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/orm.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/orm.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+<?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"
+ >
+ <persistence-unit-metadata>
+ <persistence-unit-defaults>
+ <entity-listeners>
+ <entity-listener class="org.hibernate.ejb.test.pack.defaultpar.IncrementListener">
+ <pre-persist method-name="increment"/>
+ </entity-listener>
+ </entity-listeners>
+ </persistence-unit-defaults>
+ </persistence-unit-metadata>
+ <package>org.hibernate.ejb.test.pack.defaultpar</package>
+ <entity class="Lighter" access="FIELD" metadata-complete="true">
+ <attributes>
+ <id name="name">
+ <column name="fld_id"/>
+ </id>
+ <basic name="power"></basic>
+ </attributes>
+ </entity>
+ <entity class="ApplicationServer">
+ <entity-listeners>
+ <entity-listener class="OtherIncrementListener">
+ <pre-persist method-name="increment"/>
+ </entity-listener>
+ </entity-listeners>
+ </entity>
+</entity-mappings>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/persistence.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/persistence.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- example of a default persistence.xml -->
-<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_1_0.xsd"
- version="1.0">
- <persistence-unit name="defaultpar">
- <class>org.hibernate.ejb.test.pack.defaultpar.Lighter</class>
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
- <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
- <property name="hibernate.connection.username" value="sa"/>
- <property name="hibernate.connection.password" value=""/>
- <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
- <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
- </properties>
- </persistence-unit>
-</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/persistence.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/persistence.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/persistence.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- example of a default persistence.xml -->
+<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_1_0.xsd"
+ version="1.0">
+ <persistence-unit name="defaultpar">
+ <class>org.hibernate.ejb.test.pack.defaultpar.Lighter</class>
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+ <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
+ <property name="hibernate.connection.username" value="sa"/>
+ <property name="hibernate.connection.password" value=""/>
+ <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
+ </properties>
+ </persistence-unit>
+</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/org)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/Mouse.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/Mouse.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/Mouse.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping
- package="org.hibernate.ejb.test.pack.defaultpar"
- >
-
- <class name="Mouse">
-
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
-
- </class>
-
-</hibernate-mapping>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/Mouse.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/Mouse.hbm.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/Mouse.hbm.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/defaultpar/org/hibernate/ejb/test/pack/defaultpar/Mouse.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping
+ package="org.hibernate.ejb.test.pack.defaultpar"
+ >
+
+ <class name="Mouse">
+
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <property name="name"/>
+
+ </class>
+
+</hibernate-mapping>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/persistence.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/persistence.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- example of a default persistence.xml -->
-<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_1_0.xsd"
- version="1.0">
- <persistence-unit name="excludehbmpar" transaction-type="RESOURCE_LOCAL">
- <mapping-file>orm2.xml</mapping-file>
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
- <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
- <property name="hibernate.connection.username" value="sa"/>
- <property name="hibernate.connection.password" value=""/>
- <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
- <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
- <property name="hibernate.archive.autodetection" value="class"/>
- </properties>
- </persistence-unit>
-</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/persistence.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/persistence.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/persistence.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- example of a default persistence.xml -->
+<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_1_0.xsd"
+ version="1.0">
+ <persistence-unit name="excludehbmpar" transaction-type="RESOURCE_LOCAL">
+ <mapping-file>orm2.xml</mapping-file>
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+ <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
+ <property name="hibernate.connection.username" value="sa"/>
+ <property name="hibernate.connection.password" value=""/>
+ <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
+ <property name="hibernate.archive.autodetection" value="class"/>
+ </properties>
+ </persistence-unit>
+</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/Mouse.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/Mouse.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/Mouse.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping
- package="org.hibernate.ejb.test.pack.excludehbmpar"
- >
-
- <class name="Mouse">
-
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
-
- </class>
-
-</hibernate-mapping>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/Mouse.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/Mouse.hbm.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/Mouse.hbm.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/org/hibernate/ejb/test/pack/excludehbmpar/Mouse.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping
+ package="org.hibernate.ejb.test.pack.excludehbmpar"
+ >
+
+ <class name="Mouse">
+
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <property name="name"/>
+
+ </class>
+
+</hibernate-mapping>
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/orm2.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/orm2.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/orm2.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-<?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>org.hibernate.ejb.test.xml</package>
- <entity class="Light" access="FIELD" metadata-complete="true">
- <attributes>
- <id name="name">
- <column name="fld_id"/>
- </id>
- <basic name="power"></basic>
- </attributes>
- </entity>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/orm2.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/excludehbmpar/orm2.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/orm2.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/excludehbmpar/orm2.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -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_1_0.xsd"
+ version="1.0"
+ >
+ <package>org.hibernate.ejb.test.xml</package>
+ <entity class="Light" access="FIELD" metadata-complete="true">
+ <attributes>
+ <id name="name">
+ <column name="fld_id"/>
+ </id>
+ <basic name="power"></basic>
+ </attributes>
+ </entity>
+</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explicitpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explicitpar)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/orm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/orm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-<?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>org.hibernate.ejb.test.pack.various</package>
- <entity class="Seat" access="PROPERTY" metadata-complete="true">
- <attributes>
- <id name="number"/>
- </attributes>
- </entity>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/orm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/orm.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/orm.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -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>org.hibernate.ejb.test.pack.various</package>
+ <entity class="Seat" access="PROPERTY" metadata-complete="true">
+ <attributes>
+ <id name="number"/>
+ </attributes>
+ </entity>
+</entity-mappings>
\ No newline at end of file
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/persistence.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/persistence.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-<?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 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
- version="1.0">
- <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL">
- <jar-file>./build/testresources/externaljar.jar</jar-file>
- <class>org.hibernate.ejb.test.Cat</class>
- <class>org.hibernate.ejb.test.Distributor</class>
- <class>org.hibernate.ejb.test.Item</class>
- <class>org.hibernate.ejb.test</class>
- <exclude-unlisted-classes>true</exclude-unlisted-classes>
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
- <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
- <property name="hibernate.connection.username" value="sa"/>
- <property name="hibernate.connection.password" value=""/>
- <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
- <property name="hibernate.cache.use_query_cache" value="true"/>
- <property name="hibernate.cache.region_prefix" value="hibernate.test"/>
- <property name="hibernate.jdbc.use_streams_for_binary" value="true"/>
- <property name="hibernate.jdbc.batch_size" value="0"/>
- <property name="hibernate.max_fetch_depth" value="3"/>
- <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
- <property name="hibernate.generate_statistics" value="true"/>
- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
- <property name="hibernate.ejb.naming_strategy" value="org.hibernate.ejb.test.MyNamingStrategy"/>
- <!-- test naming strategy and fall back to element content -->
- <!-- property name="hibernate.ejb.naming_strategy">org.hibernate.ejb.test.MyNamingStrategy</property -->
-
- <!-- cache configuration -->
- <property name="hibernate.ejb.classcache.org.hibernate.ejb.test.Item" value="read-write"/>
- <property name="hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributors"
- value="read-write, RegionName"/>
-
- <!-- event overriding -->
- <property name="hibernate.ejb.event.pre-insert" value=""/>
- <!-- remove JACC and validator -->
-
- <!-- alternatively to <class> and <property> declarations, you can use a regular hibernate.cfg.xml file -->
- <!-- property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/hibernate.cfg.xml"/ -->
- </properties>
- </persistence-unit>
-</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/persistence.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/persistence.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/persistence.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/explicitpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+<?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 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
+ version="1.0">
+ <persistence-unit name="manager1" transaction-type="RESOURCE_LOCAL">
+ <jar-file>./build/testresources/externaljar.jar</jar-file>
+ <class>org.hibernate.ejb.test.Cat</class>
+ <class>org.hibernate.ejb.test.Distributor</class>
+ <class>org.hibernate.ejb.test.Item</class>
+ <class>org.hibernate.ejb.test</class>
+ <exclude-unlisted-classes>true</exclude-unlisted-classes>
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+ <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
+ <property name="hibernate.connection.username" value="sa"/>
+ <property name="hibernate.connection.password" value=""/>
+ <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
+ <property name="hibernate.cache.use_query_cache" value="true"/>
+ <property name="hibernate.cache.region_prefix" value="hibernate.test"/>
+ <property name="hibernate.jdbc.use_streams_for_binary" value="true"/>
+ <property name="hibernate.jdbc.batch_size" value="0"/>
+ <property name="hibernate.max_fetch_depth" value="3"/>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ <property name="hibernate.generate_statistics" value="true"/>
+ <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
+ <property name="hibernate.ejb.naming_strategy" value="org.hibernate.ejb.test.MyNamingStrategy"/>
+ <!-- test naming strategy and fall back to element content -->
+ <!-- property name="hibernate.ejb.naming_strategy">org.hibernate.ejb.test.MyNamingStrategy</property -->
+
+ <!-- cache configuration -->
+ <property name="hibernate.ejb.classcache.org.hibernate.ejb.test.Item" value="read-write"/>
+ <property name="hibernate.ejb.collectioncache.org.hibernate.ejb.test.Item.distributors"
+ value="read-write, RegionName"/>
+
+ <!-- event overriding -->
+ <property name="hibernate.ejb.event.pre-insert" value=""/>
+ <!-- remove JACC and validator -->
+
+ <!-- alternatively to <class> and <property> declarations, you can use a regular hibernate.cfg.xml file -->
+ <!-- property name="hibernate.ejb.cfgfile" value="/org/hibernate/ejb/test/hibernate.cfg.xml"/ -->
+ </properties>
+ </persistence-unit>
+</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/persistence.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/persistence.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- example of a default persistence.xml -->
-<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_1_0.xsd"
- version="1.0">
- <persistence-unit name="explodedpar" transaction-type="RESOURCE_LOCAL">
-
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
- <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
- <property name="hibernate.connection.username" value="sa"/>
- <property name="hibernate.connection.password" value=""/>
- <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
- <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
- </properties>
- </persistence-unit>
-</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/persistence.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/persistence.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/persistence.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- example of a default persistence.xml -->
+<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_1_0.xsd"
+ version="1.0">
+ <persistence-unit name="explodedpar" transaction-type="RESOURCE_LOCAL">
+
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+ <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
+ <property name="hibernate.connection.username" value="sa"/>
+ <property name="hibernate.connection.password" value=""/>
+ <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
+ </properties>
+ </persistence-unit>
+</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/org)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/Elephant.hbm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/Elephant.hbm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/Elephant.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC
- "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-
-<hibernate-mapping
- package="org.hibernate.ejb.test.pack.explodedpar"
- >
-
-
- <class name="Elephant">
-
- <id name="id">
- <generator class="native"/>
- </id>
- <property name="name"/>
-
- </class>
-
-</hibernate-mapping>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/Elephant.hbm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/Elephant.hbm.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/Elephant.hbm.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/explodedpar/org/hibernate/ejb/test/pack/explodedpar/Elephant.hbm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping
+ package="org.hibernate.ejb.test.pack.explodedpar"
+ >
+
+
+ <class name="Elephant">
+
+ <id name="id">
+ <generator class="native"/>
+ </id>
+ <property name="name"/>
+
+ </class>
+
+</hibernate-mapping>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/externaljar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/externaljar)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/MANIFEST.MF
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/MANIFEST.MF 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/MANIFEST.MF 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,4 +0,0 @@
-Manifest-Version: 1.0
-Ant-Version: Apache Ant 1.6.3
-Created-By: 1.5.0_03-b07 (Sun Microsystems Inc.)
-
Copied: trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/MANIFEST.MF (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/MANIFEST.MF)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/MANIFEST.MF (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/MANIFEST.MF 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,4 @@
+Manifest-Version: 1.0
+Ant-Version: Apache Ant 1.6.3
+Created-By: 1.5.0_03-b07 (Sun Microsystems Inc.)
+
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/orm.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/orm.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-<?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>org.hibernate.ejb.test.pack.various</package>
- <entity class="Airplane" metadata-complete="true" access="PROPERTY">
- <attributes>
- <id name="serialNumber"/>
- </attributes>
- </entity>
-</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/orm.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/orm.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/orm.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/externaljar/META-INF/orm.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -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>org.hibernate.ejb.test.pack.various</package>
+ <entity class="Airplane" metadata-complete="true" access="PROPERTY">
+ <attributes>
+ <id name="serialNumber"/>
+ </attributes>
+ </entity>
+</entity-mappings>
\ No newline at end of file
Copied: trunk/HibernateExt/entitymanager/src/test-resources/overridenpar (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/overridenpar)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/persistence.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/persistence.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-<?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 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
- version="1.0">
- <persistence-unit name="overridenpar">
- <jta-data-source>java:/unreachableDS</jta-data-source>
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
- <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
- </properties>
- </persistence-unit>
-</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/persistence.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/persistence.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/persistence.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/overridenpar/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -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 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
+ version="1.0">
+ <persistence-unit name="overridenpar">
+ <jta-data-source>java:/unreachableDS</jta-data-source>
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
+ </properties>
+ </persistence-unit>
+</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/space par (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/space par)
Copied: trunk/HibernateExt/entitymanager/src/test-resources/space par/META-INF (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/space par/META-INF)
Deleted: trunk/HibernateExt/entitymanager/src/test-resources/space par/META-INF/persistence.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/space par/META-INF/persistence.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/entitymanager/src/test-resources/space par/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- example of a default persistence.xml -->
-<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_1_0.xsd"
- version="1.0">
- <persistence-unit name="space par">
- <properties>
- <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
- <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
- <property name="hibernate.connection.username" value="sa"/>
- <property name="hibernate.connection.password" value=""/>
- <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
- <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
- <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
- </properties>
- </persistence-unit>
-</persistence>
Copied: trunk/HibernateExt/entitymanager/src/test-resources/space par/META-INF/persistence.xml (from rev 11279, branches/Branch_3_2/HibernateExt/entitymanager/src/test-resources/space par/META-INF/persistence.xml)
===================================================================
--- trunk/HibernateExt/entitymanager/src/test-resources/space par/META-INF/persistence.xml (rev 0)
+++ trunk/HibernateExt/entitymanager/src/test-resources/space par/META-INF/persistence.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- example of a default persistence.xml -->
+<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_1_0.xsd"
+ version="1.0">
+ <persistence-unit name="space par">
+ <properties>
+ <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
+ <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
+ <property name="hibernate.connection.username" value="sa"/>
+ <property name="hibernate.connection.password" value=""/>
+ <property name="hibernate.connection.url" value="jdbc:hsqldb:."/>
+ <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
+ <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider"/>
+ </properties>
+ </persistence-unit>
+</persistence>
Copied: trunk/HibernateExt/jpa-api (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api)
Property changes on: trunk/HibernateExt/jpa-api
___________________________________________________________________
Name: svn:ignore
+ build
.settings
build.properties
classes
Deleted: trunk/HibernateExt/jpa-api/.cvsignore
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/.cvsignore 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/.cvsignore 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,3 +0,0 @@
-build
-.settings
-build.properties
Copied: trunk/HibernateExt/jpa-api/.cvsignore (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/.cvsignore)
===================================================================
--- trunk/HibernateExt/jpa-api/.cvsignore (rev 0)
+++ trunk/HibernateExt/jpa-api/.cvsignore 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,3 @@
+build
+.settings
+build.properties
Deleted: trunk/HibernateExt/jpa-api/build.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/build.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,109 +0,0 @@
-<!--
-
- EJB API build script.
-
- Emmanuel Bernard
-
--->
-
-<project name="EJB-API" default="jar" basedir=".">
-
- <!-- Give user a chance to override without editing this file or typing -D -->
- <property file="build.properties"/>
- <property file="${user.home}/.ant.properties"/>
-
- <!-- Name of project and version, used to create filenames -->
- <property name="name" value="ejb3-persistence"/>
- <property name="version" value="3.0 Final Release"/>
-
- <!-- set global properties for this build -->
- <property name="src.dir" value="src"/>
- <property name="build.dir" value="build"/>
- <property name="metainf.dir" value="etc"/>
- <property name="classes.dir" value="${build.dir}/classes"/>
- <property name="jar.name" value="${name}"/>
-
- <property name="javac.debug" value="on"/>
- <property name="javac.optimize" value="off"/>
-
- <patternset id="src.files">
- <!-- include everything we want in the src directory
- that we didn't want in the jar itself -->
- <include name="**/*.java"/>
- <include name="META-INF/ra.xml"/>
- </patternset>
-
-
- <!-- ############################ Targets #############################-->
-
- <target name="clean" description="Cleans up build and dist directories">
- <delete dir="${build.dir}"/>
- </target>
-
- <target name="init" description="Initialize the build">
- <tstamp>
- <format property="subversion" pattern="yyyy-MM-dd hh:mm:ss"/>
- </tstamp>
- <echo message="Build ${name}-${version} (${subversion})"/>
-
- <mkdir dir="${classes.dir}"/>
-
- </target>
-
- <target name="compile" depends="init" description="Compile the Java source code">
- <available
- classname="org.eclipse.core.launcher.Main"
- property="build.compiler"
- value="org.eclipse.jdt.core.JDTCompilerAdapter"
- classpath="${java.class.path}"/>
- <javac
- destdir="${classes.dir}"
- debug="${javac.debug}"
- optimize="${javac.optimize}"
- nowarn="on"
- source="1.5">
- <src path="${src.dir}"/>
- </javac>
- </target>
-
-
- <target name="jar" depends="compile" description="Build the distribution .jar file">
- <jar jarfile="${build.dir}/${jar.name}.jar" basedir="${classes.dir}">
- <include name="javax/**/*.class"/>
- <manifest>
- <attribute name="Built-By" value="hibernate.org"/>
- <attribute name="Specification-Title" value="EJB 3.0"/>
- <attribute name="Specification-Version" value="${version}"/>
- <attribute name="Specification-Vendor" value="Sun Microsystems, Inc."/>
- <attribute name="Implementation-Title" value="EJB"/>
- <attribute name="Implementation-Version" value="${version} ${TODAY}"/>
- <attribute name="Implementation-Vendor" value="hibernate.org"/>
- </manifest>
- <metainf dir="${basedir}/${metainf.dir}">
- <include name="**/license.txt"/>
- </metainf>
- </jar>
- </target>
-
- <target name="javadoc" description="Compile the Javadoc API documentation">
- <mkdir dir="${build.dir}/api"/>
- <javadoc
- packagenames="javax.persistence.*"
- destdir="${build.dir}/api"
- use="true"
- protected="true"
- version="true"
- overview="${basedir}/doc/api/package.html"
- windowtitle="EJB 3.0 Persistence API Documentation"
- doctitle="EJB 3.0 Persistence API Documentation"
- stylesheetfile="./etc/jdstyle.css"
- link="http://java.sun.com/j2se/1.5/docs/api">
- <packageset dir="${src.dir}" defaultexcludes="yes" >
- <include name="**/*" />
- </packageset>
- </javadoc>
-
- </target>
-
-
-</project>
Copied: trunk/HibernateExt/jpa-api/build.xml (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/build.xml)
===================================================================
--- trunk/HibernateExt/jpa-api/build.xml (rev 0)
+++ trunk/HibernateExt/jpa-api/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,109 @@
+<!--
+
+ EJB API build script.
+
+ Emmanuel Bernard
+
+-->
+
+<project name="EJB-API" default="jar" basedir=".">
+
+ <!-- Give user a chance to override without editing this file or typing -D -->
+ <property file="build.properties"/>
+ <property file="${user.home}/.ant.properties"/>
+
+ <!-- Name of project and version, used to create filenames -->
+ <property name="name" value="ejb3-persistence"/>
+ <property name="version" value="3.0 Final Release"/>
+
+ <!-- set global properties for this build -->
+ <property name="src.dir" value="src"/>
+ <property name="build.dir" value="build"/>
+ <property name="metainf.dir" value="etc"/>
+ <property name="classes.dir" value="${build.dir}/classes"/>
+ <property name="jar.name" value="${name}"/>
+
+ <property name="javac.debug" value="on"/>
+ <property name="javac.optimize" value="off"/>
+
+ <patternset id="src.files">
+ <!-- include everything we want in the src directory
+ that we didn't want in the jar itself -->
+ <include name="**/*.java"/>
+ <include name="META-INF/ra.xml"/>
+ </patternset>
+
+
+ <!-- ############################ Targets #############################-->
+
+ <target name="clean" description="Cleans up build and dist directories">
+ <delete dir="${build.dir}"/>
+ </target>
+
+ <target name="init" description="Initialize the build">
+ <tstamp>
+ <format property="subversion" pattern="yyyy-MM-dd hh:mm:ss"/>
+ </tstamp>
+ <echo message="Build ${name}-${version} (${subversion})"/>
+
+ <mkdir dir="${classes.dir}"/>
+
+ </target>
+
+ <target name="compile" depends="init" description="Compile the Java source code">
+ <available
+ classname="org.eclipse.core.launcher.Main"
+ property="build.compiler"
+ value="org.eclipse.jdt.core.JDTCompilerAdapter"
+ classpath="${java.class.path}"/>
+ <javac
+ destdir="${classes.dir}"
+ debug="${javac.debug}"
+ optimize="${javac.optimize}"
+ nowarn="on"
+ source="1.5">
+ <src path="${src.dir}"/>
+ </javac>
+ </target>
+
+
+ <target name="jar" depends="compile" description="Build the distribution .jar file">
+ <jar jarfile="${build.dir}/${jar.name}.jar" basedir="${classes.dir}">
+ <include name="javax/**/*.class"/>
+ <manifest>
+ <attribute name="Built-By" value="hibernate.org"/>
+ <attribute name="Specification-Title" value="EJB 3.0"/>
+ <attribute name="Specification-Version" value="${version}"/>
+ <attribute name="Specification-Vendor" value="Sun Microsystems, Inc."/>
+ <attribute name="Implementation-Title" value="EJB"/>
+ <attribute name="Implementation-Version" value="${version} ${TODAY}"/>
+ <attribute name="Implementation-Vendor" value="hibernate.org"/>
+ </manifest>
+ <metainf dir="${basedir}/${metainf.dir}">
+ <include name="**/license.txt"/>
+ </metainf>
+ </jar>
+ </target>
+
+ <target name="javadoc" description="Compile the Javadoc API documentation">
+ <mkdir dir="${build.dir}/api"/>
+ <javadoc
+ packagenames="javax.persistence.*"
+ destdir="${build.dir}/api"
+ use="true"
+ protected="true"
+ version="true"
+ overview="${basedir}/doc/api/package.html"
+ windowtitle="EJB 3.0 Persistence API Documentation"
+ doctitle="EJB 3.0 Persistence API Documentation"
+ stylesheetfile="./etc/jdstyle.css"
+ link="http://java.sun.com/j2se/1.5/docs/api">
+ <packageset dir="${src.dir}" defaultexcludes="yes" >
+ <include name="**/*" />
+ </packageset>
+ </javadoc>
+
+ </target>
+
+
+</project>
Copied: trunk/HibernateExt/jpa-api/doc (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/doc)
Copied: trunk/HibernateExt/jpa-api/doc/api (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/doc/api)
Deleted: trunk/HibernateExt/jpa-api/doc/api/package.html
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/doc/api/package.html 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/doc/api/package.html 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1 +0,0 @@
-<body></body>
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/doc/api/package.html (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/doc/api/package.html)
===================================================================
--- trunk/HibernateExt/jpa-api/doc/api/package.html (rev 0)
+++ trunk/HibernateExt/jpa-api/doc/api/package.html 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1 @@
+<body></body>
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/etc (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/etc)
Deleted: trunk/HibernateExt/jpa-api/etc/jdstyle.css
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/etc/jdstyle.css 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/etc/jdstyle.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,117 +0,0 @@
-/* Javadoc style sheet */
-
-/* Define colors, fonts and other style attributes here to override the defaults */
-
-/* Page background color */
-body { font-family: Arial;
- background-color: white;
- font-size: 10pt;
- }
-td { font-family: Arial;
- font-size: 10pt;
- }
-/* Table colors */
-.TableHeadingColor { background: #F4F4F4 }
-.TableSubHeadingColor { background: #F4F4F4 }
-.TableRowColor { background: #FFFFFF }
-
-/* Font used in left-hand frame lists */
-.FrameTitleFont { font-size: normal; font-family: Arial }
-.FrameHeadingFont { font-size: normal; font-family: Arial }
-.FrameItemFont { font-size: normal; font-family: Arial }
-
-/* Example of smaller, sans-serif font in frames */
-/* .FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */
-
-/* Navigation bar fonts and colors */
-.NavBarCell1 { background-color:#F4F4F4;}
-.NavBarCell1Rev { background-color:silver;}
-
-.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;}
-.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;}
-
-.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
-.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
-
-A {
- color: #003399;
-}
-
-A:active {
- color: #003399;
-}
-
-A:visited {
- color: #888888;
-}
-
-P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
- color: #000000;
-}
-
-TD, TH, SPAN {
- color: #000000;
-}
-
-BLOCKQUOTE {
- margin-right: 0px;
-}
-
-
-/*H1, H2, H3, H4, H5, H6 {
- color: #000000;
- font-weight:500;
- margin-top:10px;
- padding-top:15px;
-}
-
-H1 { font-size: 150%; }
-H2 { font-size: 140%; }
-H3 { font-size: 110%; font-weight: bold; }
-H4 { font-size: 110%; font-weight: bold;}
-H5 { font-size: 100%; font-style: italic; }
-H6 { font-size: 100%; font-style: italic; }*/
-
-TT {
-font-size: 90%;
- font-family: "Courier New", Courier, monospace;
- color: #000000;
-}
-
-PRE {
-font-size: 90%;
- padding: 5px;
- border-style: solid;
- border-width: 1px;
- border-color: #CCCCCC;
- background-color: #F4F4F4;
-}
-
-UL, OL, LI {
- list-style: disc;
-}
-
-HR {
- width: 100%;
- height: 1px;
- background-color: #CCCCCC;
- border-width: 0px;
- padding: 0px;
- color: #CCCCCC;
-}
-
-.variablelist {
- padding-top: 10;
- padding-bottom:10;
- margin:0;
-}
-
-.itemizedlist, UL {
- padding-top: 0;
- padding-bottom:0;
- margin:0;
-}
-
-.term {
- font-weight:bold;
-}
Copied: trunk/HibernateExt/jpa-api/etc/jdstyle.css (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/etc/jdstyle.css)
===================================================================
--- trunk/HibernateExt/jpa-api/etc/jdstyle.css (rev 0)
+++ trunk/HibernateExt/jpa-api/etc/jdstyle.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,117 @@
+/* Javadoc style sheet */
+
+/* Define colors, fonts and other style attributes here to override the defaults */
+
+/* Page background color */
+body { font-family: Arial;
+ background-color: white;
+ font-size: 10pt;
+ }
+td { font-family: Arial;
+ font-size: 10pt;
+ }
+/* Table colors */
+.TableHeadingColor { background: #F4F4F4 }
+.TableSubHeadingColor { background: #F4F4F4 }
+.TableRowColor { background: #FFFFFF }
+
+/* Font used in left-hand frame lists */
+.FrameTitleFont { font-size: normal; font-family: Arial }
+.FrameHeadingFont { font-size: normal; font-family: Arial }
+.FrameItemFont { font-size: normal; font-family: Arial }
+
+/* Example of smaller, sans-serif font in frames */
+/* .FrameItemFont { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */
+
+/* Navigation bar fonts and colors */
+.NavBarCell1 { background-color:#F4F4F4;}
+.NavBarCell1Rev { background-color:silver;}
+
+.NavBarFont1 { font-family: Arial, Helvetica, sans-serif; color:#000000;}
+.NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;}
+
+.NavBarCell2 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+.NavBarCell3 { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}
+
+A {
+ color: #003399;
+}
+
+A:active {
+ color: #003399;
+}
+
+A:visited {
+ color: #888888;
+}
+
+P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
+ color: #000000;
+}
+
+TD, TH, SPAN {
+ color: #000000;
+}
+
+BLOCKQUOTE {
+ margin-right: 0px;
+}
+
+
+/*H1, H2, H3, H4, H5, H6 {
+ color: #000000;
+ font-weight:500;
+ margin-top:10px;
+ padding-top:15px;
+}
+
+H1 { font-size: 150%; }
+H2 { font-size: 140%; }
+H3 { font-size: 110%; font-weight: bold; }
+H4 { font-size: 110%; font-weight: bold;}
+H5 { font-size: 100%; font-style: italic; }
+H6 { font-size: 100%; font-style: italic; }*/
+
+TT {
+font-size: 90%;
+ font-family: "Courier New", Courier, monospace;
+ color: #000000;
+}
+
+PRE {
+font-size: 90%;
+ padding: 5px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #CCCCCC;
+ background-color: #F4F4F4;
+}
+
+UL, OL, LI {
+ list-style: disc;
+}
+
+HR {
+ width: 100%;
+ height: 1px;
+ background-color: #CCCCCC;
+ border-width: 0px;
+ padding: 0px;
+ color: #CCCCCC;
+}
+
+.variablelist {
+ padding-top: 10;
+ padding-bottom:10;
+ margin:0;
+}
+
+.itemizedlist, UL {
+ padding-top: 0;
+ padding-bottom:0;
+ margin:0;
+}
+
+.term {
+ font-weight:bold;
+}
Deleted: trunk/HibernateExt/jpa-api/etc/license.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/etc/license.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/etc/license.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,119 +0,0 @@
-Specification: JSR-000220 Enterprise JavaBeans v.3.0 ("Specification")
-Version: 3.0
-Status: Final Release
-Release: 8 May 2006
-Copyright 2006 SUN MICROSYSTEMS, INC.
-4150 Network Circle, Santa Clara, California 95054, U.S.A
-All rights reserved.
-LIMITED LICENSE GRANTS
-1. _License for Evaluation Purposes_. Sun hereby grants you a fully-paid, non-exclusive, non-transferable,
-worldwide, limited license (without the right to sublicense), under Suns applicable intellectual
-property rights to view, download, use and reproduce the Specification only for the purpose of internal
-evaluation. This includes (i) developing applications intended to run on an implementation of the Specification,
-provided that such applications do not themselves implement any portion(s) of the Specification,
-and (ii) discussing the Specification with any third party; and (iii) excerpting brief portions of the
-Specification in oral or written communications which discuss the Specification provided that such excerpts
-do not in the aggregate constitute a significant portion of the Specification.
-2. _License for the Distribution of Compliant Implementations_. Sun also grants you a perpetual, nonexclusive,
-non-transferable, worldwide, fully paid-up, royalty free, limited license (without the right to
-sublicense) under any applicable copyrights or, subject to the provisions of subsection 4 below, patent
-rights it may have covering the Specification to create and/or distribute an Independent Implementation
-of the Specification that: (a) fully implements the Specification including all its required interfaces and
-functionality; (b) does not modify, subset, superset or otherwise extend the Licensor Name Space, or include
-any public or protected packages, classes, Java interfaces, fields or methods within the Licensor
-Name Space other than those required/authorized by the Specification or Specifications being implemented;
-and (c) passes the Technology Compatibility Kit (including satisfying the requirements of the
-applicable TCK Users Guide) for such Specification ("Compliant Implementation"). In addition, the
-foregoing license is expressly conditioned on your not acting outside its scope. No license is granted
-hereunder for any other purpose (including, for example, modifying the Specification, other than to the
-extent of your fair use rights, or distributing the Specification to third parties). Also, no right, title, or
-interest in or to any trademarks, service marks, or trade names of Sun or Suns licensors is granted hereunder.
-Java, and Java-related logos, marks and names are trademarks or registered trademarks of Sun Microsystems,
-Inc. in the U.S. and other countries.
-3. _Pass-through Conditions_. You need not include limitations (a)-(c) from the previous paragraph or
-any other particular "pass through" requirements in any license You grant concerning the use of your Independent
-Implementation or products derived from it. However, except with respect to Independent Implementations
-(and products derived from them) that satisfy limitations (a)-(c) from the previous
-paragraph, You may neither: (a) grant or otherwise pass through to your licensees any licenses under
-Suns applicable intellectual property rights; nor (b) authorize your licensees to make any claims concerning
-their implementations compliance with the Specification in question.
-4. _Reciprocity Concerning Patent Licenses_.
-a. With respect to any patent claims covered by the license granted under subparagraph 2 above that
-would be infringed by all technically feasible implementations of the Specification, such license is conditioned
-upon your offering on fair, reasonable and non-discriminatory terms, to any party seeking it
-from You, a perpetual, non-exclusive, non-transferable, worldwide license under Your patent rights
-which are or would be infringed by all technically feasible implementations of the Specification to develop,
-distribute and use a Compliant Implementation.
-b With respect to any patent claims owned by Sun and covered by the license granted under subparagraph
-2, whether or not their infringement can be avoided in a technically feasible manner when implementing
-the Specification, such license shall terminate with respect to such claims if You initiate a claim against
-Sun that it has, in the course of performing its responsibilities as the Specification Lead, induced any other
-entity to infringe Your patent rights.
-c Also with respect to any patent claims owned by Sun and covered by the license granted under subparagraph
-2 above, where the infringement of such claims can be avoided in a technically feasible manner
-when implementing the Specification such license, with respect to such claims, shall terminate if You
-initiate a claim against Sun that its making, having made, using, offering to sell, selling or importing a
-Compliant Implementation infringes Your patent rights.
-5. _Definitions_. For the purposes of this Agreement: "Independent Implementation" shall mean an implementation
-of the Specification that neither derives from any of Suns source code or binary code materials
-nor, except with an appropriate and separate license from Sun, includes any of Suns source code
-or binary code materials; "Licensor Name Space" shall mean the public class or interface declarations
-whose names begin with "java", "javax", "com.sun" or their equivalents in any subsequent naming convention
-adopted by Sun through the Java Community Process, or any recognized successors or replacements
-thereof; and "Technology Compatibility Kit" or "TCK" shall mean the test suite and
-accompanying TCK Users Guide provided by Sun which corresponds to the Specification and that was
-available either (i) from Sun 120 days before the first release of Your Independent Implementation that
-allows its use for commercial purposes, or (ii) more recently than 120 days from such release but against
-which You elect to test Your implementation of the Specification.
-This Agreement will terminate immediately without notice from Sun if you breach the Agreement or act
-outside the scope of the licenses granted above.
-DISCLAIMER OF WARRANTIES
-THE SPECIFICATION IS PROVIDED "AS IS". SUN MAKES NO REPRESENTATIONS OR WARRANTIES,
-EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES
-OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT
-(INCLUDING AS A CONSEQUENCE OF ANY PRACTICE OR IMPLEMENTATION
-OF THE SPECIFICATION), OR THAT THE CONTENTS OF THE SPECIFICATION ARE
-SUITABLE FOR ANY PURPOSE. This document does not represent any commitment to release or implement
-any portion of the Specification in any product. In addition, the Specification could include technical
-inaccuracies or typographical errors.
-LIMITATION OF LIABILITY
-TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL SUN OR ITS LICENSORS
-BE LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT LIMITATION, LOST REVENUE,
-PROFITS OR DATA, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
-DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
-ARISING OUT OF OR RELATED IN ANY WAY TO YOUR HAVING, IMPLEMENTING OR
-OTHERWISE USING THE SPECIFICATION, EVEN IF SUN AND/OR ITS LICENSORS HAVE
-BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-You will indemnify, hold harmless, and defend Sun and its licensors from any claims arising or resulting
-from: (i) your use of the Specification; (ii) the use or distribution of your Java application, applet and/or
-implementation; and/or (iii) any claims that later versions or releases of any Specification furnished to
-you are incompatible with the Specification provided to you under this license.
-
-RESTRICTED RIGHTS LEGEND
-U.S. Government: If this Specification is being acquired by or on behalf of the U.S. Government or by a
-U.S. Government prime contractor or subcontractor (at any tier), then the Governments rights in the
-Software and accompanying documentation shall be only as set forth in this license; this is in accordance
-with 48 C.F.R. 227.7201 through 227.7202-4 (for Department of Defense (DoD) acquisitions) and with
-48 C.F.R. 2.101 and 12.212 (for non-DoD acquisitions).
-REPORT
-If you provide Sun with any comments or suggestions concerning the Specification ("Feedback"), you
-hereby: (i) agree that such Feedback is provided on a non-proprietary and non-confidential basis, and (ii)
-grant Sun a perpetual, non-exclusive, worldwide, fully paid-up, irrevocable license, with the right to sublicense
-through multiple levels of sublicensees, to incorporate, disclose, and use without limitation the
-Feedback for any purpose.
-GENERAL TERMS
-Any action related to this Agreement will be governed by California law and controlling U.S. federal law.
-The U.N. Convention for the International Sale of Goods and the choice of law rules of any jurisdiction
-will not apply.
-The Specification is subject to U.S. export control laws and may be subject to export or import regulations
-in other countries. Licensee agrees to comply strictly with all such laws and regulations and acknowledges
-that it has the responsibility to obtain such licenses to export, re-export or import as may be
-required after delivery to Licensee.
-This Agreement is the parties entire agreement relating to its subject matter. It supersedes all prior or
-contemporaneous oral or written communications, proposals, conditions, representations and warranties
-and prevails over any conflicting or additional terms of any quote, order, acknowledgment, or other communication
-between the parties relating to its subject matter during the term of this Agreement. No modification
-to this Agreement will be binding, unless in writing and signed by an authorized representative
-of each party.
-Rev. April, 2006
-Sun/Final/Full
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/etc/license.txt (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/etc/license.txt)
===================================================================
--- trunk/HibernateExt/jpa-api/etc/license.txt (rev 0)
+++ trunk/HibernateExt/jpa-api/etc/license.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,119 @@
+Specification: JSR-000220 Enterprise JavaBeans v.3.0 ("Specification")
+Version: 3.0
+Status: Final Release
+Release: 8 May 2006
+Copyright 2006 SUN MICROSYSTEMS, INC.
+4150 Network Circle, Santa Clara, California 95054, U.S.A
+All rights reserved.
+LIMITED LICENSE GRANTS
+1. _License for Evaluation Purposes_. Sun hereby grants you a fully-paid, non-exclusive, non-transferable,
+worldwide, limited license (without the right to sublicense), under Suns applicable intellectual
+property rights to view, download, use and reproduce the Specification only for the purpose of internal
+evaluation. This includes (i) developing applications intended to run on an implementation of the Specification,
+provided that such applications do not themselves implement any portion(s) of the Specification,
+and (ii) discussing the Specification with any third party; and (iii) excerpting brief portions of the
+Specification in oral or written communications which discuss the Specification provided that such excerpts
+do not in the aggregate constitute a significant portion of the Specification.
+2. _License for the Distribution of Compliant Implementations_. Sun also grants you a perpetual, nonexclusive,
+non-transferable, worldwide, fully paid-up, royalty free, limited license (without the right to
+sublicense) under any applicable copyrights or, subject to the provisions of subsection 4 below, patent
+rights it may have covering the Specification to create and/or distribute an Independent Implementation
+of the Specification that: (a) fully implements the Specification including all its required interfaces and
+functionality; (b) does not modify, subset, superset or otherwise extend the Licensor Name Space, or include
+any public or protected packages, classes, Java interfaces, fields or methods within the Licensor
+Name Space other than those required/authorized by the Specification or Specifications being implemented;
+and (c) passes the Technology Compatibility Kit (including satisfying the requirements of the
+applicable TCK Users Guide) for such Specification ("Compliant Implementation"). In addition, the
+foregoing license is expressly conditioned on your not acting outside its scope. No license is granted
+hereunder for any other purpose (including, for example, modifying the Specification, other than to the
+extent of your fair use rights, or distributing the Specification to third parties). Also, no right, title, or
+interest in or to any trademarks, service marks, or trade names of Sun or Suns licensors is granted hereunder.
+Java, and Java-related logos, marks and names are trademarks or registered trademarks of Sun Microsystems,
+Inc. in the U.S. and other countries.
+3. _Pass-through Conditions_. You need not include limitations (a)-(c) from the previous paragraph or
+any other particular "pass through" requirements in any license You grant concerning the use of your Independent
+Implementation or products derived from it. However, except with respect to Independent Implementations
+(and products derived from them) that satisfy limitations (a)-(c) from the previous
+paragraph, You may neither: (a) grant or otherwise pass through to your licensees any licenses under
+Suns applicable intellectual property rights; nor (b) authorize your licensees to make any claims concerning
+their implementations compliance with the Specification in question.
+4. _Reciprocity Concerning Patent Licenses_.
+a. With respect to any patent claims covered by the license granted under subparagraph 2 above that
+would be infringed by all technically feasible implementations of the Specification, such license is conditioned
+upon your offering on fair, reasonable and non-discriminatory terms, to any party seeking it
+from You, a perpetual, non-exclusive, non-transferable, worldwide license under Your patent rights
+which are or would be infringed by all technically feasible implementations of the Specification to develop,
+distribute and use a Compliant Implementation.
+b With respect to any patent claims owned by Sun and covered by the license granted under subparagraph
+2, whether or not their infringement can be avoided in a technically feasible manner when implementing
+the Specification, such license shall terminate with respect to such claims if You initiate a claim against
+Sun that it has, in the course of performing its responsibilities as the Specification Lead, induced any other
+entity to infringe Your patent rights.
+c Also with respect to any patent claims owned by Sun and covered by the license granted under subparagraph
+2 above, where the infringement of such claims can be avoided in a technically feasible manner
+when implementing the Specification such license, with respect to such claims, shall terminate if You
+initiate a claim against Sun that its making, having made, using, offering to sell, selling or importing a
+Compliant Implementation infringes Your patent rights.
+5. _Definitions_. For the purposes of this Agreement: "Independent Implementation" shall mean an implementation
+of the Specification that neither derives from any of Suns source code or binary code materials
+nor, except with an appropriate and separate license from Sun, includes any of Suns source code
+or binary code materials; "Licensor Name Space" shall mean the public class or interface declarations
+whose names begin with "java", "javax", "com.sun" or their equivalents in any subsequent naming convention
+adopted by Sun through the Java Community Process, or any recognized successors or replacements
+thereof; and "Technology Compatibility Kit" or "TCK" shall mean the test suite and
+accompanying TCK Users Guide provided by Sun which corresponds to the Specification and that was
+available either (i) from Sun 120 days before the first release of Your Independent Implementation that
+allows its use for commercial purposes, or (ii) more recently than 120 days from such release but against
+which You elect to test Your implementation of the Specification.
+This Agreement will terminate immediately without notice from Sun if you breach the Agreement or act
+outside the scope of the licenses granted above.
+DISCLAIMER OF WARRANTIES
+THE SPECIFICATION IS PROVIDED "AS IS". SUN MAKES NO REPRESENTATIONS OR WARRANTIES,
+EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO, WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT
+(INCLUDING AS A CONSEQUENCE OF ANY PRACTICE OR IMPLEMENTATION
+OF THE SPECIFICATION), OR THAT THE CONTENTS OF THE SPECIFICATION ARE
+SUITABLE FOR ANY PURPOSE. This document does not represent any commitment to release or implement
+any portion of the Specification in any product. In addition, the Specification could include technical
+inaccuracies or typographical errors.
+LIMITATION OF LIABILITY
+TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT WILL SUN OR ITS LICENSORS
+BE LIABLE FOR ANY DAMAGES, INCLUDING WITHOUT LIMITATION, LOST REVENUE,
+PROFITS OR DATA, OR FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE
+DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF LIABILITY,
+ARISING OUT OF OR RELATED IN ANY WAY TO YOUR HAVING, IMPLEMENTING OR
+OTHERWISE USING THE SPECIFICATION, EVEN IF SUN AND/OR ITS LICENSORS HAVE
+BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+You will indemnify, hold harmless, and defend Sun and its licensors from any claims arising or resulting
+from: (i) your use of the Specification; (ii) the use or distribution of your Java application, applet and/or
+implementation; and/or (iii) any claims that later versions or releases of any Specification furnished to
+you are incompatible with the Specification provided to you under this license.
+
+RESTRICTED RIGHTS LEGEND
+U.S. Government: If this Specification is being acquired by or on behalf of the U.S. Government or by a
+U.S. Government prime contractor or subcontractor (at any tier), then the Governments rights in the
+Software and accompanying documentation shall be only as set forth in this license; this is in accordance
+with 48 C.F.R. 227.7201 through 227.7202-4 (for Department of Defense (DoD) acquisitions) and with
+48 C.F.R. 2.101 and 12.212 (for non-DoD acquisitions).
+REPORT
+If you provide Sun with any comments or suggestions concerning the Specification ("Feedback"), you
+hereby: (i) agree that such Feedback is provided on a non-proprietary and non-confidential basis, and (ii)
+grant Sun a perpetual, non-exclusive, worldwide, fully paid-up, irrevocable license, with the right to sublicense
+through multiple levels of sublicensees, to incorporate, disclose, and use without limitation the
+Feedback for any purpose.
+GENERAL TERMS
+Any action related to this Agreement will be governed by California law and controlling U.S. federal law.
+The U.N. Convention for the International Sale of Goods and the choice of law rules of any jurisdiction
+will not apply.
+The Specification is subject to U.S. export control laws and may be subject to export or import regulations
+in other countries. Licensee agrees to comply strictly with all such laws and regulations and acknowledges
+that it has the responsibility to obtain such licenses to export, re-export or import as may be
+required after delivery to Licensee.
+This Agreement is the parties entire agreement relating to its subject matter. It supersedes all prior or
+contemporaneous oral or written communications, proposals, conditions, representations and warranties
+and prevails over any conflicting or additional terms of any quote, order, acknowledgment, or other communication
+between the parties relating to its subject matter during the term of this Agreement. No modification
+to this Agreement will be binding, unless in writing and signed by an authorized representative
+of each party.
+Rev. April, 2006
+Sun/Final/Full
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src)
Copied: trunk/HibernateExt/jpa-api/src/javax (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax)
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence)
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverride.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/AssociationOverride.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverride.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id:$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.FIELD;
-
-/**
- * This annotation is used to override a many-to-one or one-to-one mapping of property or field for
- * an entity relationship.
- * The AssociationOverride annotation may be applied to an entity that extends a mapped superclass
- * to override a many-to-one or one-to-one mapping defined by the mapped superclass. If the
- * AssociationOverride annotation is not specified, the join column is mapped the same as in
- * the original mapping.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
-public @interface AssociationOverride {
- /**
- * The name of the relationship property whose mapping is being overridden if property-based
- * access is being used, or the name of the relationship field if field-based access is used.
- */
- String name();
-
- /**
- * The join column that is being mapped to the persistent attribute.
- */
- JoinColumn[] joinColumns();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverride.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/AssociationOverride.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverride.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverride.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id:$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+
+/**
+ * This annotation is used to override a many-to-one or one-to-one mapping of property or field for
+ * an entity relationship.
+ * The AssociationOverride annotation may be applied to an entity that extends a mapped superclass
+ * to override a many-to-one or one-to-one mapping defined by the mapped superclass. If the
+ * AssociationOverride annotation is not specified, the join column is mapped the same as in
+ * the original mapping.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+public @interface AssociationOverride {
+ /**
+ * The name of the relationship property whose mapping is being overridden if property-based
+ * access is being used, or the name of the relationship field if field-based access is used.
+ */
+ String name();
+
+ /**
+ * The join column that is being mapped to the persistent attribute.
+ */
+ JoinColumn[] joinColumns();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverrides.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/AssociationOverrides.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverrides.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id:$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.FIELD;
-
-/**
- * This annotation is used to override mappings of multiple many-to-one
- * or one-to-one relationship properties or fields.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
-public @interface AssociationOverrides {
- /**
- * Mapping overrides of relationship properties or fields
- */
- AssociationOverride[] value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverrides.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/AssociationOverrides.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverrides.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/AssociationOverrides.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id:$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+
+/**
+ * This annotation is used to override mappings of multiple many-to-one
+ * or one-to-one relationship properties or fields.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+public @interface AssociationOverrides {
+ /**
+ * Mapping overrides of relationship properties or fields
+ */
+ AssociationOverride[] value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverride.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/AttributeOverride.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverride.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.RetentionPolicy.*;
-import static java.lang.annotation.ElementType.*;
-
-
-/**
- * The AttributeOverride annotation is used to override the mapping of a Basic (whether explicit
- * or default) property or field or Id property or field.
- *
- * The AttributeOverride annotation may be applied to an entity that extends a mapped superclass
- * or to an embedded field or property to override a basic mapping defined by the mapped superclass
- * or embeddable class. If the AttributeOverride annotation is not specified, the column is mapped
- * the same as in the original mapping.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
-public @interface AttributeOverride {
- /**
- * The name of the property whose mapping is being overridden if property-based access is being
- * used, or the name of the field if field-based access is used.
- */
- String name();
- /**
- * The column that is being mapped to the persistent attribute
- */
- Column column();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverride.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/AttributeOverride.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverride.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverride.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.RetentionPolicy.*;
+import static java.lang.annotation.ElementType.*;
+
+
+/**
+ * The AttributeOverride annotation is used to override the mapping of a Basic (whether explicit
+ * or default) property or field or Id property or field.
+ *
+ * The AttributeOverride annotation may be applied to an entity that extends a mapped superclass
+ * or to an embedded field or property to override a basic mapping defined by the mapped superclass
+ * or embeddable class. If the AttributeOverride annotation is not specified, the column is mapped
+ * the same as in the original mapping.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+public @interface AttributeOverride {
+ /**
+ * The name of the property whose mapping is being overridden if property-based access is being
+ * used, or the name of the field if field-based access is used.
+ */
+ String name();
+ /**
+ * The column that is being mapped to the persistent attribute
+ */
+ Column column();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverrides.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/AttributeOverrides.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverrides.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.RetentionPolicy.*;
-import static java.lang.annotation.ElementType.*;
-
-
-/**
- * Is used to override mappings of multiple properties or fields
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
-public @interface AttributeOverrides {
- /**
- * One or more mapping override
- */
- AttributeOverride[] value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverrides.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/AttributeOverrides.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverrides.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/AttributeOverrides.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.RetentionPolicy.*;
+import static java.lang.annotation.ElementType.*;
+
+
+/**
+ * Is used to override mappings of multiple properties or fields
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+public @interface AttributeOverrides {
+ /**
+ * One or more mapping override
+ */
+ AttributeOverride[] value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Basic.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Basic.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Basic.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-import static javax.persistence.FetchType.EAGER;
-
-/**
- * The Basic annotation is the simplest type of mapping to a database column. The Basic
- * annotation can be applied to a persistent property or instance variable of any of the
- * following types: Java primitive types, wrappers of the primitive types, String,
- * java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar,
- * java.sql.Date, java.sql.Time, java.sql.Timestamp, byte[], Byte[], char[], Character[],
- * enums, and any other type that implements Serializable.
- *
- * The use of the Basic annotation is optional for persistent fields and properties of these types.
-
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface Basic {
- /**
- * Defines whether the value of the field or property should be lazily loaded or must be
- * eagerly fetched. The EAGER strategy is a requirement on the persistence provider runtime
- * that the value must be eagerly fetched. The LAZY strategy is a hint to the persistence
- * provider runtime. If not specified, defaults to EAGER.
- */
- FetchType fetch() default EAGER;
- /**
- * Defines whether the value of the field or property may be null. This is a hint and is
- * disregarded for primitive types; it may be used in schema generation. If not specified,
- * defaults to true.
- */
- boolean optional() default true;
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Basic.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Basic.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Basic.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Basic.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import static javax.persistence.FetchType.EAGER;
+
+/**
+ * The Basic annotation is the simplest type of mapping to a database column. The Basic
+ * annotation can be applied to a persistent property or instance variable of any of the
+ * following types: Java primitive types, wrappers of the primitive types, String,
+ * java.math.BigInteger, java.math.BigDecimal, java.util.Date, java.util.Calendar,
+ * java.sql.Date, java.sql.Time, java.sql.Timestamp, byte[], Byte[], char[], Character[],
+ * enums, and any other type that implements Serializable.
+ *
+ * The use of the Basic annotation is optional for persistent fields and properties of these types.
+
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface Basic {
+ /**
+ * Defines whether the value of the field or property should be lazily loaded or must be
+ * eagerly fetched. The EAGER strategy is a requirement on the persistence provider runtime
+ * that the value must be eagerly fetched. The LAZY strategy is a hint to the persistence
+ * provider runtime. If not specified, defaults to EAGER.
+ */
+ FetchType fetch() default EAGER;
+ /**
+ * Defines whether the value of the field or property may be null. This is a hint and is
+ * disregarded for primitive types; it may be used in schema generation. If not specified,
+ * defaults to true.
+ */
+ boolean optional() default true;
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/CascadeType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/CascadeType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/CascadeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-/**
- * Defines the set of cascadable operations that are propagated to the associated entity.
- * The value cascade=ALL is equivalent to cascade={PERSIST, MERGE, REMOVE, REFRESH}.
- *
- * @author Emmanuel Bernard
- */
-public enum CascadeType {
- /**
- * Cascade all operations
- */
- ALL,
- /**
- * Cascade persist operations
- */
- PERSIST,
- /**
- * Cascade merge operations
- */
- MERGE,
- /**
- * Cascade remove operations
- */
- REMOVE,
- /**
- * Cascade refresh operations
- */
- REFRESH
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/CascadeType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/CascadeType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/CascadeType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/CascadeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+/**
+ * Defines the set of cascadable operations that are propagated to the associated entity.
+ * The value cascade=ALL is equivalent to cascade={PERSIST, MERGE, REMOVE, REFRESH}.
+ *
+ * @author Emmanuel Bernard
+ */
+public enum CascadeType {
+ /**
+ * Cascade all operations
+ */
+ ALL,
+ /**
+ * Cascade persist operations
+ */
+ PERSIST,
+ /**
+ * Cascade merge operations
+ */
+ MERGE,
+ /**
+ * Cascade remove operations
+ */
+ REMOVE,
+ /**
+ * Cascade refresh operations
+ */
+ REFRESH
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Column.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Column.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Column.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,65 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * Is used to specify a mapped column for a persistent property or field. If no Column annotation is
- * specified, the default values are applied.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface Column {
- /**
- * The name of the column. Defaults to the property or field name
- */
- String name() default "";
- /**
- * Whether the property is a unique key. This is a shortcut for the UniqueConstraint
- * annotation at the table level and is useful for when the unique key constraint is
- * only a single field. This constraint applies in addition to any constraint entailed
- * by primary key mapping and to constraints specified at the table level.
- */
- boolean unique() default false;
- /**
- * Whether the database column is nullable
- */
- boolean nullable() default true;
- /**
- * Whether the column is included in SQL INSERT statements generated by the persistence provider.
- */
- boolean insertable() default true;
- /**
- * Whether the column is included in SQL UPDATE statements generated by the persistence provider.
- */
- boolean updatable() default true;
- /**
- * The SQL fragment that is used when generating the DDL for the column.
- * Defaults to the generated SQL to create a column of the inferred type.
- */
- String columnDefinition() default "";
- /**
- * The name of the table that contains the column. If absent the column is assumed to
- * be in the primary table.
- */
- String table() default "";
- /**
- * The column length. (Applies only if a string-valued column is used.)
- */
- int length() default 255;
- /**
- * The precision for a decimal (exact numeric) column. (Applies only if a decimal column is used.)
- * Value must be set by developer if used when generating the DDL for the column.
- */
- int precision() default 0;
- /**
- * The scale for a decimal (exact numeric) column. (Applies only if a decimal column is used.)
- */
- int scale() default 0;
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Column.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Column.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Column.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Column.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,65 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * Is used to specify a mapped column for a persistent property or field. If no Column annotation is
+ * specified, the default values are applied.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface Column {
+ /**
+ * The name of the column. Defaults to the property or field name
+ */
+ String name() default "";
+ /**
+ * Whether the property is a unique key. This is a shortcut for the UniqueConstraint
+ * annotation at the table level and is useful for when the unique key constraint is
+ * only a single field. This constraint applies in addition to any constraint entailed
+ * by primary key mapping and to constraints specified at the table level.
+ */
+ boolean unique() default false;
+ /**
+ * Whether the database column is nullable
+ */
+ boolean nullable() default true;
+ /**
+ * Whether the column is included in SQL INSERT statements generated by the persistence provider.
+ */
+ boolean insertable() default true;
+ /**
+ * Whether the column is included in SQL UPDATE statements generated by the persistence provider.
+ */
+ boolean updatable() default true;
+ /**
+ * The SQL fragment that is used when generating the DDL for the column.
+ * Defaults to the generated SQL to create a column of the inferred type.
+ */
+ String columnDefinition() default "";
+ /**
+ * The name of the table that contains the column. If absent the column is assumed to
+ * be in the primary table.
+ */
+ String table() default "";
+ /**
+ * The column length. (Applies only if a string-valued column is used.)
+ */
+ int length() default 255;
+ /**
+ * The precision for a decimal (exact numeric) column. (Applies only if a decimal column is used.)
+ * Value must be set by developer if used when generating the DDL for the column.
+ */
+ int precision() default 0;
+ /**
+ * The scale for a decimal (exact numeric) column. (Applies only if a decimal column is used.)
+ */
+ int scale() default 0;
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/ColumnResult.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/ColumnResult.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/ColumnResult.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * References name of a column in the SELECT clause of a SQL query - i.e.,
- * column alias, if applicable. Scalar result types can be included in the query
- * result by specifying this annotation in the metadata.
- *
- * @author Emmanuel Bernard
- */
- at Target({}) @Retention(RetentionPolicy.RUNTIME)
-public @interface ColumnResult {
- /**
- * The name of a column in the SELECT clause of a SQL query
- */
- String name();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/ColumnResult.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/ColumnResult.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/ColumnResult.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/ColumnResult.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * References name of a column in the SELECT clause of a SQL query - i.e.,
+ * column alias, if applicable. Scalar result types can be included in the query
+ * result by specifying this annotation in the metadata.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({}) @Retention(RetentionPolicy.RUNTIME)
+public @interface ColumnResult {
+ /**
+ * The name of a column in the SELECT clause of a SQL query
+ */
+ String name();
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorColumn.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorColumn.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-import static javax.persistence.DiscriminatorType.STRING;
-
-/**
- * Is used to define the discriminator column for the SINGLE_TABLE and JOINED inheritance
- * mapping strategies.
- *
- * The strategy and the discriminator column are only specified in the root of an entity
- * class hierarchy or subhierarchy in which a different inheritance strategy is applied
- *
- * If the DiscriminatorColumn annotation is missing, and a discriminator column is required,
- * the name of the discriminator column defaults to "DTYPE" and the discriminator type to
- * DiscriminatorType.STRING.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface DiscriminatorColumn {
- /**
- * The name of column to be used for the discriminator.
- */
- String name() default "DTYPE";
- /**
- * The type of object/column to use as a class discriminator.
- * Defaults to DiscriminatorType.STRING
- */
- DiscriminatorType discriminatorType() default STRING;
- /**
- * The SQL fragment that is used when generating the DDL for the discriminator column.
- * Defaults to the provider-generated SQL to create a column of the specified
- * discriminator type.
- */
- String columnDefinition() default "";
- /**
- * The column length for String-based discriminator types. Ignored for other
- * discriminator types.
- */
- int length() default 31;
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorColumn.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorColumn.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorColumn.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+import static javax.persistence.DiscriminatorType.STRING;
+
+/**
+ * Is used to define the discriminator column for the SINGLE_TABLE and JOINED inheritance
+ * mapping strategies.
+ *
+ * The strategy and the discriminator column are only specified in the root of an entity
+ * class hierarchy or subhierarchy in which a different inheritance strategy is applied
+ *
+ * If the DiscriminatorColumn annotation is missing, and a discriminator column is required,
+ * the name of the discriminator column defaults to "DTYPE" and the discriminator type to
+ * DiscriminatorType.STRING.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface DiscriminatorColumn {
+ /**
+ * The name of column to be used for the discriminator.
+ */
+ String name() default "DTYPE";
+ /**
+ * The type of object/column to use as a class discriminator.
+ * Defaults to DiscriminatorType.STRING
+ */
+ DiscriminatorType discriminatorType() default STRING;
+ /**
+ * The SQL fragment that is used when generating the DDL for the discriminator column.
+ * Defaults to the provider-generated SQL to create a column of the specified
+ * discriminator type.
+ */
+ String columnDefinition() default "";
+ /**
+ * The column length for String-based discriminator types. Ignored for other
+ * discriminator types.
+ */
+ int length() default 31;
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-/**
- * Defines supported types of the discriminator column
- *
- * @author Emmanuel Bernard
- */
-public enum DiscriminatorType {
- /**
- * String as the discriminator type
- */
- STRING,
- /**
- * Single character as the discriminator type
- */
- CHAR,
- /**
- * Integer as the discriminator type
- */
- INTEGER
-};
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+/**
+ * Defines supported types of the discriminator column
+ *
+ * @author Emmanuel Bernard
+ */
+public enum DiscriminatorType {
+ /**
+ * String as the discriminator type
+ */
+ STRING,
+ /**
+ * Single character as the discriminator type
+ */
+ CHAR,
+ /**
+ * Integer as the discriminator type
+ */
+ INTEGER
+};
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorValue.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorValue.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorValue.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-package javax.persistence;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.lang.annotation.ElementType.TYPE;
-
-/**
- * Is used to specify the value of the discriminator column for entities of the given type.
- * The DiscriminatorValue annotation can only be specified on a concrete entity class.
- * If the DiscriminatorValue annotation is not specified and a discriminator column is used,
- * a provider-specific function will be used to generate a value representing the entity type.
- * If the DiscriminatorType is STRING, the discriminator value default is the entity name.
- *
- * The inheritance strategy and the discriminator column are only specified in the root
- * of an entity class hierarchy or subhierarchy in which a different inheritance strategy
- * is applied. The discriminator value, if not defaulted, should be specified for each entity
- * class in the hierarchy.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface DiscriminatorValue {
- /**
- * The value that indicates that the row is an entity of the annotated entity type.
- *
- * If the DiscriminatorValue annotation is not specified and a discriminator column is used,
- * a provider-specific function will be used to generate a value representing the entity type.
- * If the DiscriminatorType is STRING, the discriminator value default is the entity name.
- */
- String value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorValue.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorValue.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorValue.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/DiscriminatorValue.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+package javax.persistence;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.TYPE;
+
+/**
+ * Is used to specify the value of the discriminator column for entities of the given type.
+ * The DiscriminatorValue annotation can only be specified on a concrete entity class.
+ * If the DiscriminatorValue annotation is not specified and a discriminator column is used,
+ * a provider-specific function will be used to generate a value representing the entity type.
+ * If the DiscriminatorType is STRING, the discriminator value default is the entity name.
+ *
+ * The inheritance strategy and the discriminator column are only specified in the root
+ * of an entity class hierarchy or subhierarchy in which a different inheritance strategy
+ * is applied. The discriminator value, if not defaulted, should be specified for each entity
+ * class in the hierarchy.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface DiscriminatorValue {
+ /**
+ * The value that indicates that the row is an entity of the annotated entity type.
+ *
+ * If the DiscriminatorValue annotation is not specified and a discriminator column is used,
+ * a provider-specific function will be used to generate a value representing the entity type.
+ * If the DiscriminatorType is STRING, the discriminator value default is the entity name.
+ */
+ String value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Embeddable.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Embeddable.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Embeddable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-//EJB Specification Copyright 2004 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-
-/**
- * Defines a class whose instances are stored as an intrinsic part of an owning entity and share
- * the identity of the entity. Each of the persistent properties or fields of the embedded object
- * is mapped to the database table for the entity. Only Basic, Column, Lob, Temporal, and
- * Enumerated mapping annotations may portably be used to map the persistent fields or properties
- * of classes annotated as Embeddable.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface Embeddable {}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Embeddable.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Embeddable.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Embeddable.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Embeddable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+//EJB Specification Copyright 2004 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+
+/**
+ * Defines a class whose instances are stored as an intrinsic part of an owning entity and share
+ * the identity of the entity. Each of the persistent properties or fields of the embedded object
+ * is mapped to the database table for the entity. Only Basic, Column, Lob, Temporal, and
+ * Enumerated mapping annotations may portably be used to map the persistent fields or properties
+ * of classes annotated as Embeddable.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface Embeddable {}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Embedded.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Embedded.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Embedded.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id$
-//EJB Specification Copyright 2004 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * Defines a persistent field or property of an entity whose value is an instance of
- * an embeddable class. The embeddable class must be annotated as Embeddable.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface Embedded {}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Embedded.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Embedded.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Embedded.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Embedded.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id$
+//EJB Specification Copyright 2004 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * Defines a persistent field or property of an entity whose value is an instance of
+ * an embeddable class. The embeddable class must be annotated as Embeddable.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface Embedded {}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/EmbeddedId.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EmbeddedId.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EmbeddedId.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Is applied to a persistent field or property of an entity class or mapped superclass to denote
- * a composite primary key that is an embeddable class. The embeddable class must be annotated
- * as Embeddable.
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.METHOD, ElementType.FIELD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface EmbeddedId {}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/EmbeddedId.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EmbeddedId.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/EmbeddedId.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EmbeddedId.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Is applied to a persistent field or property of an entity class or mapped superclass to denote
+ * a composite primary key that is an embeddable class. The embeddable class must be annotated
+ * as Embeddable.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.METHOD, ElementType.FIELD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface EmbeddedId {}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Entity.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Entity.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Entity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Specifies that the class is an entity. This annotation is applied to the entity class.
- *
- * @author Emmanuel Bernard
- */
- at Target(TYPE) @Retention(RUNTIME)
-public @interface Entity {
- /**
- * The name of an entity. Defaults to the unqualified name of the entity class.
- * This name is used to refer to the entity in queries. The name must not be a
- * reserved literal in the Java Persistence query language.
- */
- String name() default "";
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Entity.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Entity.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Entity.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Entity.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Specifies that the class is an entity. This annotation is applied to the entity class.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target(TYPE) @Retention(RUNTIME)
+public @interface Entity {
+ /**
+ * The name of an entity. Defaults to the unqualified name of the entity class.
+ * This name is used to refer to the entity in queries. The name must not be a
+ * reserved literal in the Java Persistence query language.
+ */
+ String name() default "";
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityExistsException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityExistsException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityExistsException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-//$Id: $
-package javax.persistence;
-
-/**
- * Thrown by the persistence provider when EntityManager.persist(Object) is called and the
- * entity already exists. The current transaction, if one is active, will be marked for rollback.
- *
- * @author Emmanuel Bernard
- */
-public class EntityExistsException extends PersistenceException {
- /**
- * Constructs a new EntityExistsException exception with null as its detail message.
- */
- public EntityExistsException() {
- super();
- }
-
- /**
- * Constructs a new EntityExistsException exception with the specified cause.
- *
- * @param cause the cause
- */
- public EntityExistsException(Throwable cause) {
- super( cause );
- }
-
- /**
- * Constructs a new EntityExistsException exception with the specified detail message.
- *
- * @param message the detail message.
- */
- public EntityExistsException(String message) {
- super( message );
- }
-
- /**
- * Constructs a new EntityExistsException exception with the specified detail message and cause.
- *
- * @param message the detail message.
- * @param cause the cause.
- */
- public EntityExistsException(String message, Throwable cause) {
- super( message, cause );
- }
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityExistsException.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityExistsException.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/EntityExistsException.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityExistsException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+//$Id: $
+package javax.persistence;
+
+/**
+ * Thrown by the persistence provider when EntityManager.persist(Object) is called and the
+ * entity already exists. The current transaction, if one is active, will be marked for rollback.
+ *
+ * @author Emmanuel Bernard
+ */
+public class EntityExistsException extends PersistenceException {
+ /**
+ * Constructs a new EntityExistsException exception with null as its detail message.
+ */
+ public EntityExistsException() {
+ super();
+ }
+
+ /**
+ * Constructs a new EntityExistsException exception with the specified cause.
+ *
+ * @param cause the cause
+ */
+ public EntityExistsException(Throwable cause) {
+ super( cause );
+ }
+
+ /**
+ * Constructs a new EntityExistsException exception with the specified detail message.
+ *
+ * @param message the detail message.
+ */
+ public EntityExistsException(String message) {
+ super( message );
+ }
+
+ /**
+ * Constructs a new EntityExistsException exception with the specified detail message and cause.
+ *
+ * @param message the detail message.
+ * @param cause the cause.
+ */
+ public EntityExistsException(String message, Throwable cause) {
+ super( message, cause );
+ }
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityListeners.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityListeners.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityListeners.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-/*
- * JBoss, the OpenSource J2EE webOS
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-/**
- * Specifies the callback listener classes to be used for an entity or mapped superclass.
- * This annotation may be applied to an entity class or mapped superclass.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.TYPE})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface EntityListeners {
- /**
- * The callback listener classes
- */
- Class[] value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityListeners.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityListeners.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/EntityListeners.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityListeners.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+/*
+ * JBoss, the OpenSource J2EE webOS
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * Specifies the callback listener classes to be used for an entity or mapped superclass.
+ * This annotation may be applied to an entity class or mapped superclass.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.TYPE})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface EntityListeners {
+ /**
+ * The callback listener classes
+ */
+ Class[] value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManager.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityManager.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,298 +0,0 @@
-// $Id$
-package javax.persistence;
-
-/**
- * Interface used to interact with the persistence context.
- *
- * An EntityManager instance is associated with a persistence context. A persistence context is a set of
- * entity instances in which for any persistent entity identity there is a unique entity instance.
- * Within the persistence context, the entity instances and their lifecycle are managed. This interface
- * defines the methods that are used to interact with the persistence context. The EntityManager API is
- * used to create and remove persistent entity instances, to find entities by their primary key, and to
- * query over entities.
- *
- * The set of entities that can be managed by a given EntityManager instance is defined by a persistence unit.
- * A persistence unit defines the set of all classes that are related or grouped by the application, and
- * which must be colocated in their mapping to a single database.
- *
- * @author Emmanuel Bernard
- */
-public interface EntityManager {
- /**
- * Make an entity instance managed and persistent.
- *
- * @param entity
- * @throws EntityExistsException if the entity already exists.
- * (The EntityExistsException may be thrown when the persist
- * operation is invoked, or the EntityExistsException or
- * another PersistenceException may be thrown at commit
- * time.)
- * @throws IllegalStateException if this EntityManager has been closed.
- * @throws IllegalArgumentException if not an entity
- * @throws TransactionRequiredException if invoked on a
- * container-managed entity manager of type
- * PersistenceContextType.TRANSACTION and there is
- * no transaction.
- */
- public void persist(Object entity);
-
- /**
- * Merge the state of the given entity into the
- * current persistence context.
- *
- * @param entity
- * @return the instance that the state was merged to
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws IllegalArgumentException if instance is not an
- * entity or is a removed entity
- * @throws TransactionRequiredException if invoked on a
- * container-managed entity manager of type
- * PersistenceContextType.TRANSACTION and there is
- * no transaction.
- */
- public <T> T merge(T entity);
-
- /**
- * Remove the entity instance.
- *
- * @param entity
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws IllegalArgumentException if not an entity
- * or if a detached entity
- * @throws TransactionRequiredException if invoked on a
- * container-managed entity manager of type
- * PersistenceContextType.TRANSACTION and there is
- * no transaction.
- */
- public void remove(Object entity);
-
- /**
- * Find by primary key.
- *
- * @param entityClass
- * @param primaryKey
- * @return the found entity instance or null
- * if the entity does not exist
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws IllegalArgumentException if the first argument does
- * not denote an entity type or the second
- * argument is not a valid type for that
- * entityâs primary key
- */
- public <T> T find(Class<T> entityClass, Object primaryKey);
-
- /**
- * Get an instance, whose state may be lazily fetched.
- * If the requested instance does not exist in the database,
- * the EntityNotFoundException is thrown when the instance
- * state is first accessed. (The persistence provider runtime is
- * permitted to throw the EntityNotFoundException when
- * getReference is called.)
- * The application should not expect that the instance state will
- * be available upon detachment, unless it was accessed by the
- * application while the entity manager was open.
- *
- * @param entityClass
- * @param primaryKey
- * @return the found entity instance
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws IllegalArgumentException if the first argument does
- * not denote an entity type or the second
- * argument is not a valid type for that
- * entityâs primary key
- * @throws EntityNotFoundException if the entity state
- * cannot be accessed
- */
- public <T> T getReference(Class<T> entityClass, Object primaryKey);
-
- /**
- * Synchronize the persistence context to the
- * underlying database.
- *
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws TransactionRequiredException if there is
- * no transaction
- * @throws PersistenceException if the flush fails
- */
- public void flush();
-
- /**
- * Set the flush mode that applies to all objects contained
- * in the persistence context.
- *
- * @param flushMode
- * @throws IllegalStateException if this EntityManager has been closed
- */
- public void setFlushMode(FlushModeType flushMode);
-
- /**
- * Get the flush mode that applies to all objects contained
- * in the persistence context.
- *
- * @return flushMode
- * @throws IllegalStateException if this EntityManager has been closed
- */
- public FlushModeType getFlushMode();
-
- /**
- * Set the lock mode for an entity object contained
- * in the persistence context.
- *
- * @param entity
- * @param lockMode
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws PersistenceException if an unsupported lock call
- * is made
- * @throws IllegalArgumentException if the instance is not
- * an entity or is a detached entity
- * @throws TransactionRequiredException if there is no
- * transaction
- */
- public void lock(Object entity, LockModeType lockMode);
-
- /**
- * Refresh the state of the instance from the database,
- * overwriting changes made to the entity, if any.
- *
- * @param entity
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws IllegalArgumentException if not an entity
- * or entity is not managed
- * @throws TransactionRequiredException if invoked on a
- * container-managed entity manager of type
- * PersistenceContextType.TRANSACTION and there is
- * no transaction.
- * @throws EntityNotFoundException if the entity no longer
- * exists in the database
- */
- public void refresh(Object entity);
-
- /**
- * Clear the persistence context, causing all managed
- * entities to become detached. Changes made to entities that
- * have not been flushed to the database will not be
- * persisted.
- *
- * @throws IllegalStateException if this EntityManager has been closed
- */
- public void clear();
-
- /**
- * Check if the instance belongs to the current persistence
- * context.
- *
- * @param entity
- * @return <code>true</code> if the instance belongs to the current persistence context.
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws IllegalArgumentException if not an entity
- */
- public boolean contains(Object entity);
-
- /**
- * Create an instance of Query for executing an
- * EJB QL statement.
- *
- * @param ejbqlString an EJB QL query string
- * @return the new query instance
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws IllegalArgumentException if query string is not valid
- */
- public Query createQuery(String ejbqlString);
-
- /**
- * Create an instance of Query for executing a
- * named query (in EJB QL or native SQL).
- *
- * @param name the name of a query defined in metadata
- * @return the new query instance
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws IllegalArgumentException if a query has not been
- * defined with the given name
- */
- public Query createNamedQuery(String name);
-
- /**
- * Create an instance of Query for executing
- * a native SQL statement, e.g., for update or delete.
- *
- * @param sqlString a native SQL query string
- * @return the new query instance
- * @throws IllegalStateException if this EntityManager has been closed
- */
- public Query createNativeQuery(String sqlString);
-
- /**
- * Create an instance of Query for executing
- * a native SQL query.
- *
- * @param sqlString a native SQL query string
- * @param resultClass the class of the resulting instance(s)
- * @return the new query instance
- * @throws IllegalStateException if this EntityManager has been closed
- */
- public Query createNativeQuery(String sqlString, Class resultClass);
-
- /**
- * Create an instance of Query for executing
- * a native SQL query.
- *
- * @param sqlString a native SQL query string
- * @param resultSetMapping the name of the result set mapping
- * @return the new query instance
- * @throws IllegalStateException if this EntityManager has been closed
- */
- public Query createNativeQuery(String sqlString, String resultSetMapping);
-
- /**
- * Indicate to the EntityManager that a JTA transaction is
- * active. This method should be called on a JTA application
- * managed EntityManager that was created outside the scope
- * of the active transaction to associate it with the current
- * JTA transaction.
- *
- * @throws IllegalStateException if this EntityManager has been closed
- * @throws TransactionRequiredException if there is
- * no transaction.
- */
- public void joinTransaction();
-
- /**
- * Return the underlying provider object for the EntityManager, if available.
- * The result of this method is implementation specific
- *
- * @throws IllegalStateException if this EntityManager has been closed
- */
- public Object getDelegate();
-
- /**
- * Close an application-managed EntityManager.
- * After the close method has been invoked, all methods
- * on the EntityManager instance and any Query objects obtained
- * from it will throw the IllegalStateException except
- * for getTransaction and isOpen (which will return false).
- * If this method is called when the EntityManager is
- * associated with an active transaction, the persistence
- * context remains managed until the transaction completes.
- *
- * @throws IllegalStateException if the EntityManager is container-managed or has been already closed
- */
- public void close();
-
- /**
- * Determine whether the EntityManager is open.
- *
- * @return true until the EntityManager has been closed.
- */
- public boolean isOpen();
-
- /**
- * Return the resource-level transaction object.
- * The EntityTransaction instance may be used serially to
- * begin and commit multiple transactions.
- *
- * @return EntityTransaction instance
- * @throws IllegalStateException if invoked on a JTA
- * EntityManager.
- */
- public EntityTransaction getTransaction();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManager.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityManager.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManager.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManager.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,298 @@
+// $Id$
+package javax.persistence;
+
+/**
+ * Interface used to interact with the persistence context.
+ *
+ * An EntityManager instance is associated with a persistence context. A persistence context is a set of
+ * entity instances in which for any persistent entity identity there is a unique entity instance.
+ * Within the persistence context, the entity instances and their lifecycle are managed. This interface
+ * defines the methods that are used to interact with the persistence context. The EntityManager API is
+ * used to create and remove persistent entity instances, to find entities by their primary key, and to
+ * query over entities.
+ *
+ * The set of entities that can be managed by a given EntityManager instance is defined by a persistence unit.
+ * A persistence unit defines the set of all classes that are related or grouped by the application, and
+ * which must be colocated in their mapping to a single database.
+ *
+ * @author Emmanuel Bernard
+ */
+public interface EntityManager {
+ /**
+ * Make an entity instance managed and persistent.
+ *
+ * @param entity
+ * @throws EntityExistsException if the entity already exists.
+ * (The EntityExistsException may be thrown when the persist
+ * operation is invoked, or the EntityExistsException or
+ * another PersistenceException may be thrown at commit
+ * time.)
+ * @throws IllegalStateException if this EntityManager has been closed.
+ * @throws IllegalArgumentException if not an entity
+ * @throws TransactionRequiredException if invoked on a
+ * container-managed entity manager of type
+ * PersistenceContextType.TRANSACTION and there is
+ * no transaction.
+ */
+ public void persist(Object entity);
+
+ /**
+ * Merge the state of the given entity into the
+ * current persistence context.
+ *
+ * @param entity
+ * @return the instance that the state was merged to
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws IllegalArgumentException if instance is not an
+ * entity or is a removed entity
+ * @throws TransactionRequiredException if invoked on a
+ * container-managed entity manager of type
+ * PersistenceContextType.TRANSACTION and there is
+ * no transaction.
+ */
+ public <T> T merge(T entity);
+
+ /**
+ * Remove the entity instance.
+ *
+ * @param entity
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws IllegalArgumentException if not an entity
+ * or if a detached entity
+ * @throws TransactionRequiredException if invoked on a
+ * container-managed entity manager of type
+ * PersistenceContextType.TRANSACTION and there is
+ * no transaction.
+ */
+ public void remove(Object entity);
+
+ /**
+ * Find by primary key.
+ *
+ * @param entityClass
+ * @param primaryKey
+ * @return the found entity instance or null
+ * if the entity does not exist
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws IllegalArgumentException if the first argument does
+ * not denote an entity type or the second
+ * argument is not a valid type for that
+ * entityâs primary key
+ */
+ public <T> T find(Class<T> entityClass, Object primaryKey);
+
+ /**
+ * Get an instance, whose state may be lazily fetched.
+ * If the requested instance does not exist in the database,
+ * the EntityNotFoundException is thrown when the instance
+ * state is first accessed. (The persistence provider runtime is
+ * permitted to throw the EntityNotFoundException when
+ * getReference is called.)
+ * The application should not expect that the instance state will
+ * be available upon detachment, unless it was accessed by the
+ * application while the entity manager was open.
+ *
+ * @param entityClass
+ * @param primaryKey
+ * @return the found entity instance
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws IllegalArgumentException if the first argument does
+ * not denote an entity type or the second
+ * argument is not a valid type for that
+ * entityâs primary key
+ * @throws EntityNotFoundException if the entity state
+ * cannot be accessed
+ */
+ public <T> T getReference(Class<T> entityClass, Object primaryKey);
+
+ /**
+ * Synchronize the persistence context to the
+ * underlying database.
+ *
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws TransactionRequiredException if there is
+ * no transaction
+ * @throws PersistenceException if the flush fails
+ */
+ public void flush();
+
+ /**
+ * Set the flush mode that applies to all objects contained
+ * in the persistence context.
+ *
+ * @param flushMode
+ * @throws IllegalStateException if this EntityManager has been closed
+ */
+ public void setFlushMode(FlushModeType flushMode);
+
+ /**
+ * Get the flush mode that applies to all objects contained
+ * in the persistence context.
+ *
+ * @return flushMode
+ * @throws IllegalStateException if this EntityManager has been closed
+ */
+ public FlushModeType getFlushMode();
+
+ /**
+ * Set the lock mode for an entity object contained
+ * in the persistence context.
+ *
+ * @param entity
+ * @param lockMode
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws PersistenceException if an unsupported lock call
+ * is made
+ * @throws IllegalArgumentException if the instance is not
+ * an entity or is a detached entity
+ * @throws TransactionRequiredException if there is no
+ * transaction
+ */
+ public void lock(Object entity, LockModeType lockMode);
+
+ /**
+ * Refresh the state of the instance from the database,
+ * overwriting changes made to the entity, if any.
+ *
+ * @param entity
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws IllegalArgumentException if not an entity
+ * or entity is not managed
+ * @throws TransactionRequiredException if invoked on a
+ * container-managed entity manager of type
+ * PersistenceContextType.TRANSACTION and there is
+ * no transaction.
+ * @throws EntityNotFoundException if the entity no longer
+ * exists in the database
+ */
+ public void refresh(Object entity);
+
+ /**
+ * Clear the persistence context, causing all managed
+ * entities to become detached. Changes made to entities that
+ * have not been flushed to the database will not be
+ * persisted.
+ *
+ * @throws IllegalStateException if this EntityManager has been closed
+ */
+ public void clear();
+
+ /**
+ * Check if the instance belongs to the current persistence
+ * context.
+ *
+ * @param entity
+ * @return <code>true</code> if the instance belongs to the current persistence context.
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws IllegalArgumentException if not an entity
+ */
+ public boolean contains(Object entity);
+
+ /**
+ * Create an instance of Query for executing an
+ * EJB QL statement.
+ *
+ * @param ejbqlString an EJB QL query string
+ * @return the new query instance
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws IllegalArgumentException if query string is not valid
+ */
+ public Query createQuery(String ejbqlString);
+
+ /**
+ * Create an instance of Query for executing a
+ * named query (in EJB QL or native SQL).
+ *
+ * @param name the name of a query defined in metadata
+ * @return the new query instance
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws IllegalArgumentException if a query has not been
+ * defined with the given name
+ */
+ public Query createNamedQuery(String name);
+
+ /**
+ * Create an instance of Query for executing
+ * a native SQL statement, e.g., for update or delete.
+ *
+ * @param sqlString a native SQL query string
+ * @return the new query instance
+ * @throws IllegalStateException if this EntityManager has been closed
+ */
+ public Query createNativeQuery(String sqlString);
+
+ /**
+ * Create an instance of Query for executing
+ * a native SQL query.
+ *
+ * @param sqlString a native SQL query string
+ * @param resultClass the class of the resulting instance(s)
+ * @return the new query instance
+ * @throws IllegalStateException if this EntityManager has been closed
+ */
+ public Query createNativeQuery(String sqlString, Class resultClass);
+
+ /**
+ * Create an instance of Query for executing
+ * a native SQL query.
+ *
+ * @param sqlString a native SQL query string
+ * @param resultSetMapping the name of the result set mapping
+ * @return the new query instance
+ * @throws IllegalStateException if this EntityManager has been closed
+ */
+ public Query createNativeQuery(String sqlString, String resultSetMapping);
+
+ /**
+ * Indicate to the EntityManager that a JTA transaction is
+ * active. This method should be called on a JTA application
+ * managed EntityManager that was created outside the scope
+ * of the active transaction to associate it with the current
+ * JTA transaction.
+ *
+ * @throws IllegalStateException if this EntityManager has been closed
+ * @throws TransactionRequiredException if there is
+ * no transaction.
+ */
+ public void joinTransaction();
+
+ /**
+ * Return the underlying provider object for the EntityManager, if available.
+ * The result of this method is implementation specific
+ *
+ * @throws IllegalStateException if this EntityManager has been closed
+ */
+ public Object getDelegate();
+
+ /**
+ * Close an application-managed EntityManager.
+ * After the close method has been invoked, all methods
+ * on the EntityManager instance and any Query objects obtained
+ * from it will throw the IllegalStateException except
+ * for getTransaction and isOpen (which will return false).
+ * If this method is called when the EntityManager is
+ * associated with an active transaction, the persistence
+ * context remains managed until the transaction completes.
+ *
+ * @throws IllegalStateException if the EntityManager is container-managed or has been already closed
+ */
+ public void close();
+
+ /**
+ * Determine whether the EntityManager is open.
+ *
+ * @return true until the EntityManager has been closed.
+ */
+ public boolean isOpen();
+
+ /**
+ * Return the resource-level transaction object.
+ * The EntityTransaction instance may be used serially to
+ * begin and commit multiple transactions.
+ *
+ * @return EntityTransaction instance
+ * @throws IllegalStateException if invoked on a JTA
+ * EntityManager.
+ */
+ public EntityTransaction getTransaction();
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManagerFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityManagerFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManagerFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id$
-package javax.persistence;
-
-import java.util.Map;
-
-/**
- * The EntityManagerFactory interface is used by the application to obtain an
- * application-managed entity manager. When the application has finished using
- * the entity manager factory, and/or at application shutdown, the application
- * should close the entity manager factory. Once an EntityManagerFactory has been
- * closed, all its entity managers are considered to be in the closed state.
- *
- * @author Emmanuel Bernard
- */
-public interface EntityManagerFactory {
-
- /**
- * Create a new EntityManager.
- * This method returns a new EntityManager instance each time
- * it is invoked.
- * The isOpen method will return true on the returned instance.
- */
- EntityManager createEntityManager();
-
- /**
- * Create a new EntityManager with the specified Map of
- * properties.
- * This method returns a new EntityManager instance each time
- * it is invoked.
- * The isOpen method will return true on the returned instance.
- */
- EntityManager createEntityManager(Map map);
-
- /**
- * Close the factory, releasing any resources that it holds.
- * After a factory instance is closed, all methods invoked on
- * it will throw an IllegalStateException, except for isOpen,
- * which will return false. Once an EntityManagerFactory has
- * been closed, all its entity managers are considered to be
- * in the closed state.
- */
- void close();
-
- /**
- * Indicates whether or not this factory is open. Returns
- * true until a call to close has been made.
- */
- public boolean isOpen();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManagerFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityManagerFactory.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManagerFactory.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityManagerFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id$
+package javax.persistence;
+
+import java.util.Map;
+
+/**
+ * The EntityManagerFactory interface is used by the application to obtain an
+ * application-managed entity manager. When the application has finished using
+ * the entity manager factory, and/or at application shutdown, the application
+ * should close the entity manager factory. Once an EntityManagerFactory has been
+ * closed, all its entity managers are considered to be in the closed state.
+ *
+ * @author Emmanuel Bernard
+ */
+public interface EntityManagerFactory {
+
+ /**
+ * Create a new EntityManager.
+ * This method returns a new EntityManager instance each time
+ * it is invoked.
+ * The isOpen method will return true on the returned instance.
+ */
+ EntityManager createEntityManager();
+
+ /**
+ * Create a new EntityManager with the specified Map of
+ * properties.
+ * This method returns a new EntityManager instance each time
+ * it is invoked.
+ * The isOpen method will return true on the returned instance.
+ */
+ EntityManager createEntityManager(Map map);
+
+ /**
+ * Close the factory, releasing any resources that it holds.
+ * After a factory instance is closed, all methods invoked on
+ * it will throw an IllegalStateException, except for isOpen,
+ * which will return false. Once an EntityManagerFactory has
+ * been closed, all its entity managers are considered to be
+ * in the closed state.
+ */
+ void close();
+
+ /**
+ * Indicates whether or not this factory is open. Returns
+ * true until a call to close has been made.
+ */
+ public boolean isOpen();
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityNotFoundException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityNotFoundException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityNotFoundException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id$
-package javax.persistence;
-
-/**
- * Thrown by the persistence provider when an entity reference obtained by
- * EntityManager.getReference(Class,Object) is accessed but the entity does not exist.
- * Also thrown when EntityManager.refresh(Object) is called and the object no longer exists
- * in the database. The current transaction, if one is active, will be marked for rollback.
- *
- * @author Gavin King
- */
-public class EntityNotFoundException extends PersistenceException {
- /**
- * Constructs a new EntityNotFoundException exception with null as its detail message.
- */
- public EntityNotFoundException() {
- super();
- }
-
- /**
- * Constructs a new EntityNotFoundException exception with the specified detail message.
- *
- * @param message the detail message
- */
- public EntityNotFoundException(String message) {
- super( message );
- }
-
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityNotFoundException.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityNotFoundException.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/EntityNotFoundException.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityNotFoundException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id$
+package javax.persistence;
+
+/**
+ * Thrown by the persistence provider when an entity reference obtained by
+ * EntityManager.getReference(Class,Object) is accessed but the entity does not exist.
+ * Also thrown when EntityManager.refresh(Object) is called and the object no longer exists
+ * in the database. The current transaction, if one is active, will be marked for rollback.
+ *
+ * @author Gavin King
+ */
+public class EntityNotFoundException extends PersistenceException {
+ /**
+ * Constructs a new EntityNotFoundException exception with null as its detail message.
+ */
+ public EntityNotFoundException() {
+ super();
+ }
+
+ /**
+ * Constructs a new EntityNotFoundException exception with the specified detail message.
+ *
+ * @param message the detail message
+ */
+ public EntityNotFoundException(String message) {
+ super( message );
+ }
+
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityResult.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityResult.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityResult.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * References an entity in the SELECT clause of a SQL query. If this annotation is used,
- * the SQL statement should select all of the columns that are mapped to the entity object.
- * This should include foreign key columns to related entities. The results obtained when
- * insufficient data is available are undefined.
- *
- * @author Emmanuel Bernard
- */
- at Target({}) @Retention(RetentionPolicy.RUNTIME)
-public @interface EntityResult {
- /**
- * The class of the result
- */
- Class entityClass();
- /**
- * Maps the columns specified in the SELECT list of the query to the properties or
- * fields of the entity class.
- */
- FieldResult[] fields() default {};
- /**
- * Specifies the column name (or alias) of the column in the SELECT list that is used to
- * determine the type of the entity instance.
- */
- String discriminatorColumn() default "";
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityResult.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityResult.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/EntityResult.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityResult.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * References an entity in the SELECT clause of a SQL query. If this annotation is used,
+ * the SQL statement should select all of the columns that are mapped to the entity object.
+ * This should include foreign key columns to related entities. The results obtained when
+ * insufficient data is available are undefined.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({}) @Retention(RetentionPolicy.RUNTIME)
+public @interface EntityResult {
+ /**
+ * The class of the result
+ */
+ Class entityClass();
+ /**
+ * Maps the columns specified in the SELECT list of the query to the properties or
+ * fields of the entity class.
+ */
+ FieldResult[] fields() default {};
+ /**
+ * Specifies the column name (or alias) of the column in the SELECT list that is used to
+ * determine the type of the entity instance.
+ */
+ String discriminatorColumn() default "";
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityTransaction.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityTransaction.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityTransaction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,60 +0,0 @@
-//$Id$
-package javax.persistence;
-
-/**
- * The EntityTransaction interface is used to control resource transactions
- * on resource-local entity managers. The EntityManager.getTransaction()
- * method returns the EntityTransaction interface.
- *
- * @author Emmanuel Bernard
- */
-public interface EntityTransaction {
- /**
- * Start a resource transaction.
- *
- * @throws IllegalStateException if isActive() is true.
- */
- public void begin();
-
- /**
- * Commit the current transaction, writing any unflushed
- * changes to the database.
- *
- * @throws IllegalStateException if isActive() is false.
- * @throws RollbackException if the commit fails.
- */
- public void commit();
-
- /**
- * Roll back the current transaction.
- *
- * @throws IllegalStateException if isActive() is false.
- * @throws PersistenceException if an unexpected error
- * condition is encountered.
- */
- public void rollback();
-
- /**
- * Mark the current transaction so that the only possible
- * outcome of the transaction is for the transaction to be
- * rolled back.
- *
- * @throws IllegalStateException if isActive() is false.
- */
- public void setRollbackOnly();
-
- /**
- * Determine whether the current transaction has been marked
- * for rollback.
- *
- * @throws IllegalStateException if isActive() is false.
- */
- public boolean getRollbackOnly();
-
- /**
- * Indicate whether a transaction is in progress.
- * @throws PersistenceException if an unexpected error
- * condition is encountered.
- */
- public boolean isActive();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/EntityTransaction.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EntityTransaction.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/EntityTransaction.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EntityTransaction.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,60 @@
+//$Id$
+package javax.persistence;
+
+/**
+ * The EntityTransaction interface is used to control resource transactions
+ * on resource-local entity managers. The EntityManager.getTransaction()
+ * method returns the EntityTransaction interface.
+ *
+ * @author Emmanuel Bernard
+ */
+public interface EntityTransaction {
+ /**
+ * Start a resource transaction.
+ *
+ * @throws IllegalStateException if isActive() is true.
+ */
+ public void begin();
+
+ /**
+ * Commit the current transaction, writing any unflushed
+ * changes to the database.
+ *
+ * @throws IllegalStateException if isActive() is false.
+ * @throws RollbackException if the commit fails.
+ */
+ public void commit();
+
+ /**
+ * Roll back the current transaction.
+ *
+ * @throws IllegalStateException if isActive() is false.
+ * @throws PersistenceException if an unexpected error
+ * condition is encountered.
+ */
+ public void rollback();
+
+ /**
+ * Mark the current transaction so that the only possible
+ * outcome of the transaction is for the transaction to be
+ * rolled back.
+ *
+ * @throws IllegalStateException if isActive() is false.
+ */
+ public void setRollbackOnly();
+
+ /**
+ * Determine whether the current transaction has been marked
+ * for rollback.
+ *
+ * @throws IllegalStateException if isActive() is false.
+ */
+ public boolean getRollbackOnly();
+
+ /**
+ * Indicate whether a transaction is in progress.
+ * @throws PersistenceException if an unexpected error
+ * condition is encountered.
+ */
+ public boolean isActive();
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/EnumType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EnumType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EnumType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package javax.persistence;
-
-/**
- * Defines mapping for the enumerated types. The constants of this enumerated type specify how persistent
- * property or field should be persisted as a enumerated type.
- *
- * @author Emmanuel Bernard
- */
-public enum EnumType {
- /**
- * Persist enumerated type property or field as an integer
- */
- ORDINAL,
- /**
- * Persist enumerated type property or field as a string
- */
- STRING
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/EnumType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/EnumType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/EnumType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/EnumType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package javax.persistence;
+
+/**
+ * Defines mapping for the enumerated types. The constants of this enumerated type specify how persistent
+ * property or field should be persisted as a enumerated type.
+ *
+ * @author Emmanuel Bernard
+ */
+public enum EnumType {
+ /**
+ * Persist enumerated type property or field as an integer
+ */
+ ORDINAL,
+ /**
+ * Persist enumerated type property or field as a string
+ */
+ STRING
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Enumerated.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Enumerated.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Enumerated.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id$
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.RetentionPolicy.*;
-import static java.lang.annotation.ElementType.*;
-import static javax.persistence.EnumType.*;
-
-/**
- * Specifies that a persistent property or field should be persisted as a enumerated type.
- * It may be used in conjunction with the Basic annotation.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Enumerated {
- /**
- * The type used in mapping an enum type
- */
- EnumType value() default ORDINAL;
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Enumerated.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Enumerated.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Enumerated.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Enumerated.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id$
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.RetentionPolicy.*;
+import static java.lang.annotation.ElementType.*;
+import static javax.persistence.EnumType.*;
+
+/**
+ * Specifies that a persistent property or field should be persisted as a enumerated type.
+ * It may be used in conjunction with the Basic annotation.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Enumerated {
+ /**
+ * The type used in mapping an enum type
+ */
+ EnumType value() default ORDINAL;
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeDefaultListeners.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/ExcludeDefaultListeners.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeDefaultListeners.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id$
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Specifies that the invocation of default listeners is to be excluded for the entity class
- * (or mapped superclass) and its subclasses.
- *
- * @author Emmanuel Bernard
- */
- at Target(TYPE) @Retention(RUNTIME)
-public @interface ExcludeDefaultListeners {
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeDefaultListeners.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/ExcludeDefaultListeners.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeDefaultListeners.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeDefaultListeners.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id$
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Specifies that the invocation of default listeners is to be excluded for the entity class
+ * (or mapped superclass) and its subclasses.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target(TYPE) @Retention(RUNTIME)
+public @interface ExcludeDefaultListeners {
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeSuperclassListeners.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/ExcludeSuperclassListeners.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeSuperclassListeners.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id$
-package javax.persistence;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.lang.annotation.ElementType.TYPE;
-
-/**
- * Specifies that the invocation of superclass listeners is to be excluded for the
- * entity class (or mapped superclass) and its subclasses.
- *
- * @author Emmanuel Bernard
- */
- at Target(TYPE) @Retention(RUNTIME)
-public @interface ExcludeSuperclassListeners {
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeSuperclassListeners.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/ExcludeSuperclassListeners.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeSuperclassListeners.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/ExcludeSuperclassListeners.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id$
+package javax.persistence;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.TYPE;
+
+/**
+ * Specifies that the invocation of superclass listeners is to be excluded for the
+ * entity class (or mapped superclass) and its subclasses.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target(TYPE) @Retention(RUNTIME)
+public @interface ExcludeSuperclassListeners {
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/FetchType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/FetchType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/FetchType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-/**
- * Defines strategies for fetching data from the database.
- * The EAGER strategy is a requirement on the persistence provider runtime that data must
- * be eagerly fetched. The LAZY strategy is a hint to the persistence provider runtime that
- * data should be fetched lazily when it is first accessed. The implementation is permitted to
- * eagerly fetch data for which the LAZY strategy hint has been specified. In particular, lazy
- * fetching might only be available for Basic mappings for which property-based access is used.
- *
- * @author Emmanuel Bernard
- */
-public enum FetchType {
- /**
- * Defines that data must be lazily fetched
- */
- LAZY,
- /**
- * Defines that data must be eagerly fetched
- */
- EAGER
-};
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/FetchType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/FetchType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/FetchType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/FetchType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+/**
+ * Defines strategies for fetching data from the database.
+ * The EAGER strategy is a requirement on the persistence provider runtime that data must
+ * be eagerly fetched. The LAZY strategy is a hint to the persistence provider runtime that
+ * data should be fetched lazily when it is first accessed. The implementation is permitted to
+ * eagerly fetch data for which the LAZY strategy hint has been specified. In particular, lazy
+ * fetching might only be available for Basic mappings for which property-based access is used.
+ *
+ * @author Emmanuel Bernard
+ */
+public enum FetchType {
+ /**
+ * Defines that data must be lazily fetched
+ */
+ LAZY,
+ /**
+ * Defines that data must be eagerly fetched
+ */
+ EAGER
+};
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/FieldResult.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/FieldResult.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/FieldResult.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Is used to map the columns specified in the SELECT list of the query to the properties
- * or fields of the entity class.
- *
- * @author Emmanuel Bernard
- */
- at Target({}) @Retention(RetentionPolicy.RUNTIME)
-public @interface FieldResult {
- /**
- * Name of the persistent field or property of the class.
- */
- String name();
- /**
- * Name of the column in the SELECT clause - i.e., column aliases, if applicable.
- */
- String column();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/FieldResult.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/FieldResult.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/FieldResult.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/FieldResult.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Is used to map the columns specified in the SELECT list of the query to the properties
+ * or fields of the entity class.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({}) @Retention(RetentionPolicy.RUNTIME)
+public @interface FieldResult {
+ /**
+ * Name of the persistent field or property of the class.
+ */
+ String name();
+ /**
+ * Name of the column in the SELECT clause - i.e., column aliases, if applicable.
+ */
+ String column();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/FlushModeType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/FlushModeType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/FlushModeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id$
-package javax.persistence;
-
-/**
- * Flush mode setting.
- *
- * When queries are executed within a transaction, if FlushModeType.AUTO is set on the Query object,
- * or if the flush mode setting for the persistence context is AUTO (the default) and a flush mode
- * setting has not been specified for the Query object, the persistence provider is responsible for
- * ensuring that all updates to the state of all entities in the persistence context which could
- * potentially affect the result of the query are visible to the processing of the query.
- * The persistence provider implementation may achieve this by flushing those entities to the database
- * or by some other means. If FlushModeType.COMMIT is set, the effect of updates made to entities in the
- * persistence context upon queries is unspecified.
- *
- * If there is no transaction active, the persistence provider must not flush to the database.
- *
- * @author Gavin King
- */
-public enum FlushModeType {
- /**
- * Flushing must occur only at transaction commit
- */
- COMMIT,
- /**
- * (Default) Flushing to occur at query execution
- */
- AUTO
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/FlushModeType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/FlushModeType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/FlushModeType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/FlushModeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id$
+package javax.persistence;
+
+/**
+ * Flush mode setting.
+ *
+ * When queries are executed within a transaction, if FlushModeType.AUTO is set on the Query object,
+ * or if the flush mode setting for the persistence context is AUTO (the default) and a flush mode
+ * setting has not been specified for the Query object, the persistence provider is responsible for
+ * ensuring that all updates to the state of all entities in the persistence context which could
+ * potentially affect the result of the query are visible to the processing of the query.
+ * The persistence provider implementation may achieve this by flushing those entities to the database
+ * or by some other means. If FlushModeType.COMMIT is set, the effect of updates made to entities in the
+ * persistence context upon queries is unspecified.
+ *
+ * If there is no transaction active, the persistence provider must not flush to the database.
+ *
+ * @author Gavin King
+ */
+public enum FlushModeType {
+ /**
+ * Flushing must occur only at transaction commit
+ */
+ COMMIT,
+ /**
+ * (Default) Flushing to occur at query execution
+ */
+ AUTO
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/GeneratedValue.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/GeneratedValue.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/GeneratedValue.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id$
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Provides for the specification of generation strategies for the values of primary keys.
- * The GeneratedValue annotation may be applied to a primary key property or field of an entity
- * or mapped superclass in conjunction with the Id annotation.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface GeneratedValue {
- /**
- * The primary key generation strategy that the persistence provider must use
- * to generate the annotated entity primary key.
- */
- GenerationType strategy() default GenerationType.AUTO;
- /**
- * The name of the primary key generator to use as specified in the SequenceGenerator or
- * TableGenerator annotation.
- *
- * Defaults to the id generator supplied by persistence provider.
- */
- String generator() default "";
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/GeneratedValue.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/GeneratedValue.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/GeneratedValue.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/GeneratedValue.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id$
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Provides for the specification of generation strategies for the values of primary keys.
+ * The GeneratedValue annotation may be applied to a primary key property or field of an entity
+ * or mapped superclass in conjunction with the Id annotation.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface GeneratedValue {
+ /**
+ * The primary key generation strategy that the persistence provider must use
+ * to generate the annotated entity primary key.
+ */
+ GenerationType strategy() default GenerationType.AUTO;
+ /**
+ * The name of the primary key generator to use as specified in the SequenceGenerator or
+ * TableGenerator annotation.
+ *
+ * Defaults to the id generator supplied by persistence provider.
+ */
+ String generator() default "";
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/GenerationType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/GenerationType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/GenerationType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-/**
- * Defines the types of primary key generation.
- *
- * @author Emmanuel Bernard
- */
-public enum GenerationType {
- /**
- * Indicates that the persistence provider must assign primary keys for the entity using an underlying
- * database table to ensure uniqueness.
- */
- TABLE,
- /**
- * Indicates that the persistence provider must assign primary keys for the entity using database
- * sequence column.
- */
- SEQUENCE,
- /**
- * Indicates that the persistence provider must assign primary keys for the entity using
- * database identity column.
- */
- IDENTITY,
- /**
- * Indicates that the persistence provider should pick an appropriate strategy for the
- * particular database. The AUTO generation strategy may expect a database resource
- * to exist, or it may attempt to create one. A vendor may provide documentation on how
- * to create such resources in the event that it does not support schema generation or cannot
- * create the schema resource at runtime.
- */
- AUTO
-};
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/GenerationType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/GenerationType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/GenerationType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/GenerationType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+/**
+ * Defines the types of primary key generation.
+ *
+ * @author Emmanuel Bernard
+ */
+public enum GenerationType {
+ /**
+ * Indicates that the persistence provider must assign primary keys for the entity using an underlying
+ * database table to ensure uniqueness.
+ */
+ TABLE,
+ /**
+ * Indicates that the persistence provider must assign primary keys for the entity using database
+ * sequence column.
+ */
+ SEQUENCE,
+ /**
+ * Indicates that the persistence provider must assign primary keys for the entity using
+ * database identity column.
+ */
+ IDENTITY,
+ /**
+ * Indicates that the persistence provider should pick an appropriate strategy for the
+ * particular database. The AUTO generation strategy may expect a database resource
+ * to exist, or it may attempt to create one. A vendor may provide documentation on how
+ * to create such resources in the event that it does not support schema generation or cannot
+ * create the schema resource at runtime.
+ */
+ AUTO
+};
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Id.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Id.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Id.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-
-/**
- * Specifies the primary key property or field of an entity.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface Id {}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Id.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Id.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Id.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Id.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+
+/**
+ * Specifies the primary key property or field of an entity.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface Id {}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/IdClass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/IdClass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/IdClass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.TYPE;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-/**
- * Specifies a composite primary key class that is mapped to multiple fields or properties
- * of the entity.
- *
- * The names of the fields or properties in the primary key class and the primary key fields
- * or properties of the entity must correspond and their types must be the same.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface IdClass {
- /**
- * Primary key class
- */
- Class value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/IdClass.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/IdClass.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/IdClass.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/IdClass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.TYPE;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * Specifies a composite primary key class that is mapped to multiple fields or properties
+ * of the entity.
+ *
+ * The names of the fields or properties in the primary key class and the primary key fields
+ * or properties of the entity must correspond and their types must be the same.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface IdClass {
+ /**
+ * Primary key class
+ */
+ Class value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Inheritance.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Inheritance.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Inheritance.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-import static javax.persistence.InheritanceType.SINGLE_TABLE;
-
-/**
- * Defines the inheritance strategy to be used for an entity class hierarchy. It is specified
- * on the entity class that is the root of the entity class hierarchy.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface Inheritance {
- /**
- * The strategy to be used
- */
- InheritanceType strategy() default SINGLE_TABLE;
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Inheritance.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Inheritance.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Inheritance.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Inheritance.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import static javax.persistence.InheritanceType.SINGLE_TABLE;
+
+/**
+ * Defines the inheritance strategy to be used for an entity class hierarchy. It is specified
+ * on the entity class that is the root of the entity class hierarchy.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface Inheritance {
+ /**
+ * The strategy to be used
+ */
+ InheritanceType strategy() default SINGLE_TABLE;
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/InheritanceType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/InheritanceType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/InheritanceType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-/**
- * Defines inheritance strategy options.
- *
- * @author Emmanuel Bernard
- */
-public enum InheritanceType
-{
- /**
- * A single table per class hierarchy
- */
- SINGLE_TABLE,
- /**
- * A table per concrete entity class
- */
- TABLE_PER_CLASS,
- /**
- * A strategy in which fields that are specific to a subclass are mapped to a separate
- * table than the fields that are common to the parent class, and a join is performed
- * to instantiate the subclass.
- */
- JOINED };
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/InheritanceType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/InheritanceType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/InheritanceType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/InheritanceType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+/**
+ * Defines inheritance strategy options.
+ *
+ * @author Emmanuel Bernard
+ */
+public enum InheritanceType
+{
+ /**
+ * A single table per class hierarchy
+ */
+ SINGLE_TABLE,
+ /**
+ * A table per concrete entity class
+ */
+ TABLE_PER_CLASS,
+ /**
+ * A strategy in which fields that are specific to a subclass are mapped to a separate
+ * table than the fields that are common to the parent class, and a join is performed
+ * to instantiate the subclass.
+ */
+ JOINED };
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumn.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/JoinColumn.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,67 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * Is used to specify a mapped column for joining an entity association.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface JoinColumn {
- /**
- * The name of the foreign key column.
- * The table in which it is found depends upon the context. If the join is for a OneToOne
- * or Many- ToOne mapping, the foreign key column is in the table of the source entity.
- * If the join is for a ManyToMany, the foreign key is in a join table. Default (only applies
- * if a single join column is used): The concatenation of the following: the name of the referencing
- * relationship property or field of the referencing entity; "_"; the name of the referenced primary
- * key column. If there is no such referencing relationship property or field in the entity, the join
- * column name is formed as the concatenation of the following: the name of the entity; "_"; the name
- * of the referenced primary key column.
- */
- String name() default "";
- /**
- * The name of the column referenced by this foreign key column. When used with relationship mappings,
- * the referenced column is in the table of the target entity. When used inside a JoinTable annotation,
- * the referenced key column is in the entity table of the owning entity, or inverse entity if the join
- * is part of the inverse join definition. Default (only applies if single join column is being used):
- * The same name as the primary key column of the referenced table.
- */
- String referencedColumnName() default "";
- /**
- * Whether the property is a unique key. This is a shortcut for the UniqueConstraint annotation at the
- * table level and is useful for when the unique key constraint is only a single field. It is not
- * necessary to explicitly specify this for a join column that corresponds to a primary key that is part
- * of a foreign key.
- */
- boolean unique() default false;
- /**
- * Whether the foreign key column is nullable
- */
- boolean nullable() default true;
- /**
- * Whether the column is included in SQL INSERT statements generated by the persistence provider
- */
- boolean insertable() default true;
- /**
- * Whether the column is included in SQL UPDATE statements generated by the persistence provider
- */
- boolean updatable() default true;
- /**
- * The SQL fragment that is used when generating the DDL for the column.
- * Defaults to the generated SQL for the column.
- */
- String columnDefinition() default "";
- /**
- * The name of the table that contains the column. If a table is not specified, the column is
- * assumed to be in the primary table of the applicable entity
- */
- String table() default "";
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumn.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/JoinColumn.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumn.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,67 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * Is used to specify a mapped column for joining an entity association.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface JoinColumn {
+ /**
+ * The name of the foreign key column.
+ * The table in which it is found depends upon the context. If the join is for a OneToOne
+ * or Many- ToOne mapping, the foreign key column is in the table of the source entity.
+ * If the join is for a ManyToMany, the foreign key is in a join table. Default (only applies
+ * if a single join column is used): The concatenation of the following: the name of the referencing
+ * relationship property or field of the referencing entity; "_"; the name of the referenced primary
+ * key column. If there is no such referencing relationship property or field in the entity, the join
+ * column name is formed as the concatenation of the following: the name of the entity; "_"; the name
+ * of the referenced primary key column.
+ */
+ String name() default "";
+ /**
+ * The name of the column referenced by this foreign key column. When used with relationship mappings,
+ * the referenced column is in the table of the target entity. When used inside a JoinTable annotation,
+ * the referenced key column is in the entity table of the owning entity, or inverse entity if the join
+ * is part of the inverse join definition. Default (only applies if single join column is being used):
+ * The same name as the primary key column of the referenced table.
+ */
+ String referencedColumnName() default "";
+ /**
+ * Whether the property is a unique key. This is a shortcut for the UniqueConstraint annotation at the
+ * table level and is useful for when the unique key constraint is only a single field. It is not
+ * necessary to explicitly specify this for a join column that corresponds to a primary key that is part
+ * of a foreign key.
+ */
+ boolean unique() default false;
+ /**
+ * Whether the foreign key column is nullable
+ */
+ boolean nullable() default true;
+ /**
+ * Whether the column is included in SQL INSERT statements generated by the persistence provider
+ */
+ boolean insertable() default true;
+ /**
+ * Whether the column is included in SQL UPDATE statements generated by the persistence provider
+ */
+ boolean updatable() default true;
+ /**
+ * The SQL fragment that is used when generating the DDL for the column.
+ * Defaults to the generated SQL for the column.
+ */
+ String columnDefinition() default "";
+ /**
+ * The name of the table that contains the column. If a table is not specified, the column is
+ * assumed to be in the primary table of the applicable entity
+ */
+ String table() default "";
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumns.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/JoinColumns.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumns.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * Defines mapping for the composite foreign keys.
- * This annotation groups JoinColumn annotations for the same relationship.
- *
- * When the JoinColumns annotation is used, both the name and the referencedColumnName
- * elements must be specified in each such JoinColumn annotation.
-
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface JoinColumns {
- JoinColumn[] value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumns.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/JoinColumns.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumns.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/JoinColumns.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * Defines mapping for the composite foreign keys.
+ * This annotation groups JoinColumn annotations for the same relationship.
+ *
+ * When the JoinColumns annotation is used, both the name and the referencedColumnName
+ * elements must be specified in each such JoinColumn annotation.
+
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface JoinColumns {
+ JoinColumn[] value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/JoinTable.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/JoinTable.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/JoinTable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,63 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * This annotation is used in the mapping of associations. It is specified on the owning
- * side of a many-to-many association, or in a unidirectional one-to-many association.
- *
- * If the JoinTable annotation is missing, the default values of the annotation elements apply.
- * The name of the join table is assumed to be the table names of the associated primary tables
- * concatenated together (owning side first) using an underscore.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface JoinTable {
- /**
- * The name of the join table.
- *
- * Defaults to the concatenated names of the two associated primary entity tables,
- * separated by an underscore
- */
- String name() default "";
- /**
- * The catalog of the table.
- *
- * Defaults to the default catalog.
- */
- String catalog() default "";
- /**
- * The schema of the table.
- *
- * Defaults to the default schema for user.
- */
- String schema() default "";
- /**
- * The foreign key columns of the join table which reference the primary table of the
- * entity owning the association (i.e. the owning side of the association).
- *
- * Uses the same defaults as for JoinColumn.
- */
- JoinColumn[] joinColumns() default {};
- /**
- * The foreign key columns of the join table which reference the primary table of the entity
- * that does not own the association (i.e. the inverse side of the association).
- *
- * Uses the same defaults as for JoinColumn
- */
- JoinColumn[] inverseJoinColumns() default {};
- /**
- * Unique constraints that are to be placed on the table. These are only used if table
- * generation is in effect.
- *
- * Defaults to no additional constraints
- */
- UniqueConstraint[] uniqueConstraints() default {};
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/JoinTable.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/JoinTable.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/JoinTable.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/JoinTable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,63 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * This annotation is used in the mapping of associations. It is specified on the owning
+ * side of a many-to-many association, or in a unidirectional one-to-many association.
+ *
+ * If the JoinTable annotation is missing, the default values of the annotation elements apply.
+ * The name of the join table is assumed to be the table names of the associated primary tables
+ * concatenated together (owning side first) using an underscore.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface JoinTable {
+ /**
+ * The name of the join table.
+ *
+ * Defaults to the concatenated names of the two associated primary entity tables,
+ * separated by an underscore
+ */
+ String name() default "";
+ /**
+ * The catalog of the table.
+ *
+ * Defaults to the default catalog.
+ */
+ String catalog() default "";
+ /**
+ * The schema of the table.
+ *
+ * Defaults to the default schema for user.
+ */
+ String schema() default "";
+ /**
+ * The foreign key columns of the join table which reference the primary table of the
+ * entity owning the association (i.e. the owning side of the association).
+ *
+ * Uses the same defaults as for JoinColumn.
+ */
+ JoinColumn[] joinColumns() default {};
+ /**
+ * The foreign key columns of the join table which reference the primary table of the entity
+ * that does not own the association (i.e. the inverse side of the association).
+ *
+ * Uses the same defaults as for JoinColumn
+ */
+ JoinColumn[] inverseJoinColumns() default {};
+ /**
+ * Unique constraints that are to be placed on the table. These are only used if table
+ * generation is in effect.
+ *
+ * Defaults to no additional constraints
+ */
+ UniqueConstraint[] uniqueConstraints() default {};
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Lob.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Lob.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Lob.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.METHOD;
-
-import static java.lang.annotation.ElementType.FIELD;
-
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-
-/**
- * Specifies that a persistent property or field should be persisted as a large object to a
- * database-supported large object type. The Lob annotation may be used in conjunction with
- * the Basic annotation. A Lob may be either a binary or character type.
- *
- * The Lob type is inferred from the type of the persistent field or property, and except
- * for string and character-based types defaults to Blob.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface Lob {}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Lob.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Lob.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Lob.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Lob.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.METHOD;
+
+import static java.lang.annotation.ElementType.FIELD;
+
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+
+/**
+ * Specifies that a persistent property or field should be persisted as a large object to a
+ * database-supported large object type. The Lob annotation may be used in conjunction with
+ * the Basic annotation. A Lob may be either a binary or character type.
+ *
+ * The Lob type is inferred from the type of the persistent field or property, and except
+ * for string and character-based types defaults to Blob.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface Lob {}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/LockModeType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/LockModeType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/LockModeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id$
-package javax.persistence;
-
-/**
- * Lock modes that can be specified by means of the EntityManager.lock() method.
- *
- * The semantics of requesting locks of type LockModeType.READ and LockModeType.WRITE are t
- * he following.
- *
- * If transaction T1 calls lock(entity, LockModeType.READ) on a versioned object, the entity
- * manager must ensure that neither of the following phenomena can occur:
- *
- * * P1 (Dirty read): Transaction T1 modifies a row. Another transaction T2 then reads
- * that row and obtains the modified value, before T1 has committed or rolled back.
- * Transaction T2 eventually commits successfully; it does not matter whether T1 commits or rolls
- * back and whether it does so before or after T2 commits.
- *
- * * P2 (Non-repeatable read): Transaction T1 reads a row. Another transaction T2 then modifies
- * or deletes that row, before T1 has committed. Both transactions eventually commit successfully.
- *
- * Lock modes must always prevent the phenomena P1 and P2.
- * In addition, calling lock(entity, LockModeType.WRITE) on a versioned object,
- * will also force an update (increment) to the entity's version column.
- *
- * The persistence implementation is not required to support calling EntityManager.lock()
- * on a non-versioned object. When it cannot support a such lock call, it must
- * throw the PersistenceException.
- *
- * @author Emmanuel Bernard
- */
-public enum LockModeType {
- /**
- * Read lock
- */
- READ,
- /**
- * Write lock
- */
- WRITE
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/LockModeType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/LockModeType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/LockModeType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/LockModeType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id$
+package javax.persistence;
+
+/**
+ * Lock modes that can be specified by means of the EntityManager.lock() method.
+ *
+ * The semantics of requesting locks of type LockModeType.READ and LockModeType.WRITE are t
+ * he following.
+ *
+ * If transaction T1 calls lock(entity, LockModeType.READ) on a versioned object, the entity
+ * manager must ensure that neither of the following phenomena can occur:
+ *
+ * * P1 (Dirty read): Transaction T1 modifies a row. Another transaction T2 then reads
+ * that row and obtains the modified value, before T1 has committed or rolled back.
+ * Transaction T2 eventually commits successfully; it does not matter whether T1 commits or rolls
+ * back and whether it does so before or after T2 commits.
+ *
+ * * P2 (Non-repeatable read): Transaction T1 reads a row. Another transaction T2 then modifies
+ * or deletes that row, before T1 has committed. Both transactions eventually commit successfully.
+ *
+ * Lock modes must always prevent the phenomena P1 and P2.
+ * In addition, calling lock(entity, LockModeType.WRITE) on a versioned object,
+ * will also force an update (increment) to the entity's version column.
+ *
+ * The persistence implementation is not required to support calling EntityManager.lock()
+ * on a non-versioned object. When it cannot support a such lock call, it must
+ * throw the PersistenceException.
+ *
+ * @author Emmanuel Bernard
+ */
+public enum LockModeType {
+ /**
+ * Read lock
+ */
+ READ,
+ /**
+ * Write lock
+ */
+ WRITE
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToMany.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/ManyToMany.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToMany.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-import static javax.persistence.FetchType.*;
-
-/**
- * Defines a many-valued association with many-to-many multiplicity. If the Collection is
- * defined using generics to specify the element type, the associated target entity class
- * does not need to be specified; otherwise it must be specified.
- *
- * Every many-to-many association has two sides, the owning side and the non-owning, or inverse,
- * side. The join table is specified on the owning side. If the association is bidirectional,
- * either side may be designated as the owning side.
- *
- * The same annotation elements for the OneToMany annotation apply to the ManyToMany annotation.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface ManyToMany {
- /**
- * The entity class that is the target of the association. Optional only if the
- * collection property is defined using Java generics. Must be specified otherwise.
- *
- * Defaults to the parameterized type of the collection when defined using generics.
- */
- Class targetEntity() default void.class;
- /**
- * The operations that must be cascaded to the target of the association.
- *
- * Defaults to no operations being cascaded.
- */
- CascadeType[] cascade() default {};
- /**
- * Whether the association should be lazily loaded or must be eagerly fetched.
- * The EAGER strategy is a requirement on the persistenceprovider runtime that
- * the associatedentities must be eagerly fetched. The LAZY strategy is a hint
- * to the persistence provider runtime.
- */
- FetchType fetch() default LAZY;
- /**
- * The field that owns the relationship. Required unless the relationship is unidirectional.
- */
- String mappedBy() default "";
-}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToMany.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/ManyToMany.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToMany.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToMany.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+import static javax.persistence.FetchType.*;
+
+/**
+ * Defines a many-valued association with many-to-many multiplicity. If the Collection is
+ * defined using generics to specify the element type, the associated target entity class
+ * does not need to be specified; otherwise it must be specified.
+ *
+ * Every many-to-many association has two sides, the owning side and the non-owning, or inverse,
+ * side. The join table is specified on the owning side. If the association is bidirectional,
+ * either side may be designated as the owning side.
+ *
+ * The same annotation elements for the OneToMany annotation apply to the ManyToMany annotation.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface ManyToMany {
+ /**
+ * The entity class that is the target of the association. Optional only if the
+ * collection property is defined using Java generics. Must be specified otherwise.
+ *
+ * Defaults to the parameterized type of the collection when defined using generics.
+ */
+ Class targetEntity() default void.class;
+ /**
+ * The operations that must be cascaded to the target of the association.
+ *
+ * Defaults to no operations being cascaded.
+ */
+ CascadeType[] cascade() default {};
+ /**
+ * Whether the association should be lazily loaded or must be eagerly fetched.
+ * The EAGER strategy is a requirement on the persistenceprovider runtime that
+ * the associatedentities must be eagerly fetched. The LAZY strategy is a hint
+ * to the persistence provider runtime.
+ */
+ FetchType fetch() default LAZY;
+ /**
+ * The field that owns the relationship. Required unless the relationship is unidirectional.
+ */
+ String mappedBy() default "";
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToOne.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/ManyToOne.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToOne.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-import static javax.persistence.FetchType.*;
-
-/**
- * This annotation defines a single-valued association to another entity class that has
- * many-to-one multiplicity. It is not normally necessary to specify the target entity
- * explicitly since it can usually be inferred from the type of the object being referenced.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface ManyToOne {
- /**
- * The entity class that is the target of the association.
- *
- * Defaults to the type of the field or property that stores the association
- */
- Class targetEntity() default void.class;
- /**
- * The operations that must be cascaded to the target of the association.
- *
- * By default no operations are cascaded.
- */
- CascadeType[] cascade() default {};
- /**
- * Whether the association should be lazily loaded or must be eagerly fetched.
- * The EAGER strategy is a requirement on the persistence provider runtime that
- * the associated entity must be eagerly fetched. The LAZY strategy is a hint to
- * the persistence provider runtime.
- */
- FetchType fetch() default EAGER;
- /**
- * Whether the association is optional. If set to false then a non-null relationship must always exist.
- */
- boolean optional() default true;
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToOne.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/ManyToOne.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToOne.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/ManyToOne.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+import static javax.persistence.FetchType.*;
+
+/**
+ * This annotation defines a single-valued association to another entity class that has
+ * many-to-one multiplicity. It is not normally necessary to specify the target entity
+ * explicitly since it can usually be inferred from the type of the object being referenced.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface ManyToOne {
+ /**
+ * The entity class that is the target of the association.
+ *
+ * Defaults to the type of the field or property that stores the association
+ */
+ Class targetEntity() default void.class;
+ /**
+ * The operations that must be cascaded to the target of the association.
+ *
+ * By default no operations are cascaded.
+ */
+ CascadeType[] cascade() default {};
+ /**
+ * Whether the association should be lazily loaded or must be eagerly fetched.
+ * The EAGER strategy is a requirement on the persistence provider runtime that
+ * the associated entity must be eagerly fetched. The LAZY strategy is a hint to
+ * the persistence provider runtime.
+ */
+ FetchType fetch() default EAGER;
+ /**
+ * Whether the association is optional. If set to false then a non-null relationship must always exist.
+ */
+ boolean optional() default true;
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/MapKey.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/MapKey.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/MapKey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-
-/**
- * Is used to specify the map key for associations of type Map.
- * If a persistent field or property other than the primary key is used as a map key then it
- * is expected to have a uniqueness constraint associated with it.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface MapKey {
- /**
- * The name of the persistent field or property of the associated entity that is used as the map key.
- * If the name element is not specified, the primary key of the associated entity is used as the map key.
- * If the primary key is a composite primary key and is mapped as IdClass, an instance of the primary key
- * class is used as the key.
- */
- String name() default "";
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/MapKey.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/MapKey.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/MapKey.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/MapKey.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+
+/**
+ * Is used to specify the map key for associations of type Map.
+ * If a persistent field or property other than the primary key is used as a map key then it
+ * is expected to have a uniqueness constraint associated with it.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface MapKey {
+ /**
+ * The name of the persistent field or property of the associated entity that is used as the map key.
+ * If the name element is not specified, the primary key of the associated entity is used as the map key.
+ * If the primary key is a composite primary key and is mapped as IdClass, an instance of the primary key
+ * class is used as the key.
+ */
+ String name() default "";
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/MappedSuperclass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/MappedSuperclass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/MappedSuperclass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * Designates a class whose mapping information is applied to the entities that inherit
- * from it. A mapped superclass has no separate table defined for it.
- *
- * A class designated with the MappedSuperclass annotation can be mapped in the same way as
- * an entity except that the mappings will apply only to its subclasses since no table exists
- * for the mapped superclass itself. When applied to the subclasses the inherited mappings will
- * apply in the context of the subclass tables. Mapping information may be overridden in such
- * subclasses by using the AttributeOverride and AssociationOverride annotations or corresponding *
- * XML elements.
- *
- * @author Emmanuel Bernard
- */
- at Target(TYPE) @Retention(RUNTIME)
-public @interface MappedSuperclass {}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/MappedSuperclass.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/MappedSuperclass.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/MappedSuperclass.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/MappedSuperclass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * Designates a class whose mapping information is applied to the entities that inherit
+ * from it. A mapped superclass has no separate table defined for it.
+ *
+ * A class designated with the MappedSuperclass annotation can be mapped in the same way as
+ * an entity except that the mappings will apply only to its subclasses since no table exists
+ * for the mapped superclass itself. When applied to the subclasses the inherited mappings will
+ * apply in the context of the subclass tables. Mapping information may be overridden in such
+ * subclasses by using the AttributeOverride and AssociationOverride annotations or corresponding *
+ * XML elements.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target(TYPE) @Retention(RUNTIME)
+public @interface MappedSuperclass {}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQueries.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQueries.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQueries.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Is used to specify an array of native SQL named queries. Query names are scoped to the persistence unit
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface NamedNativeQueries {
- /**
- * Array of native SQL named queries
- */
- NamedNativeQuery [] value ();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQueries.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQueries.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQueries.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQueries.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Is used to specify an array of native SQL named queries. Query names are scoped to the persistence unit
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface NamedNativeQueries {
+ /**
+ * Array of native SQL named queries
+ */
+ NamedNativeQuery [] value ();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQuery.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQuery.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQuery.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Is used to specify a native SQL named query. Query names are scoped to the persistence unit.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE})
- at Retention(RUNTIME)
-public @interface NamedNativeQuery {
- /**
- * Is used to refer to the query when using the EntityManager methods that create query objects
- */
- String name();
- /**
- * The SQL query string
- */
- String query();
-
- /**
- * Vendor-specific query hints
- */
- QueryHint[] hints() default {};
- /**
- * The class of the result
- */
- Class resultClass() default void.class;
- /**
- * The name of a SqlResultSetMapping, as defined in metadata
- */
- String resultSetMapping() default ""; // name of SQLResultSetMapping
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQuery.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQuery.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQuery.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NamedNativeQuery.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Is used to specify a native SQL named query. Query names are scoped to the persistence unit.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE})
+ at Retention(RUNTIME)
+public @interface NamedNativeQuery {
+ /**
+ * Is used to refer to the query when using the EntityManager methods that create query objects
+ */
+ String name();
+ /**
+ * The SQL query string
+ */
+ String query();
+
+ /**
+ * Vendor-specific query hints
+ */
+ QueryHint[] hints() default {};
+ /**
+ * The class of the result
+ */
+ Class resultClass() default void.class;
+ /**
+ * The name of a SqlResultSetMapping, as defined in metadata
+ */
+ String resultSetMapping() default ""; // name of SQLResultSetMapping
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQueries.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NamedQueries.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQueries.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Specifies an array of named Java Persistence query language queries. Query names are scoped to the persistence unit.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface NamedQueries {
- /**
- * An array of named Java Persistence query language queries.
- */
- NamedQuery [] value ();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQueries.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NamedQueries.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQueries.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQueries.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Specifies an array of named Java Persistence query language queries. Query names are scoped to the persistence unit.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface NamedQueries {
+ /**
+ * An array of named Java Persistence query language queries.
+ */
+ NamedQuery [] value ();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQuery.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NamedQuery.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQuery.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import static java.lang.annotation.RetentionPolicy.*;
-import static java.lang.annotation.ElementType.*;
-
-/**
- * Is used to specify a named query in the Java Persistence query language, which is a static
- * query expressed in metadata. Query names are scoped to the persistence unit.
- *
- * @author Emmanuel Bernard
- */
-//TODO remove the mackage target
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface NamedQuery {
- /**
- * Refers to the query when using the EntityManager methods that create query objects.
- */
- String name();
- /**
- * The query string in the Java Persistence query language
- */
- String query();
- /**
- * Vendor-specific query hints
- */
- QueryHint[] hints() default {};
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQuery.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NamedQuery.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQuery.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NamedQuery.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import static java.lang.annotation.RetentionPolicy.*;
+import static java.lang.annotation.ElementType.*;
+
+/**
+ * Is used to specify a named query in the Java Persistence query language, which is a static
+ * query expressed in metadata. Query names are scoped to the persistence unit.
+ *
+ * @author Emmanuel Bernard
+ */
+//TODO remove the mackage target
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface NamedQuery {
+ /**
+ * Refers to the query when using the EntityManager methods that create query objects.
+ */
+ String name();
+ /**
+ * The query string in the Java Persistence query language
+ */
+ String query();
+ /**
+ * Vendor-specific query hints
+ */
+ QueryHint[] hints() default {};
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/NoResultException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NoResultException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NoResultException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id$
-package javax.persistence;
-
-/**
- * Thrown by the persistence provider when getSingleResult() is executed on a query and there is no result to return.
- * This exception will not cause the current transaction, if one is active, to be marked for roll back.
- *
- * @author Emmanuel Bernard
- */
-public class NoResultException extends PersistenceException {
-
- /**
- * Constructs a new NoResultException exception with null as its detail message
- */
- public NoResultException() {
- super();
- }
-
- /**
- * Constructs a new NoResultException exception with the specified detail message.
- *
- * @param message
- */
- public NoResultException(String message) {
- super( message );
- }
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/NoResultException.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NoResultException.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/NoResultException.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NoResultException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id$
+package javax.persistence;
+
+/**
+ * Thrown by the persistence provider when getSingleResult() is executed on a query and there is no result to return.
+ * This exception will not cause the current transaction, if one is active, to be marked for roll back.
+ *
+ * @author Emmanuel Bernard
+ */
+public class NoResultException extends PersistenceException {
+
+ /**
+ * Constructs a new NoResultException exception with null as its detail message
+ */
+ public NoResultException() {
+ super();
+ }
+
+ /**
+ * Constructs a new NoResultException exception with the specified detail message.
+ *
+ * @param message
+ */
+ public NoResultException(String message) {
+ super( message );
+ }
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/NonUniqueResultException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NonUniqueResultException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NonUniqueResultException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id$
-package javax.persistence;
-
-/**
- * Thrown by the persistence provider when getSingleResult() is executed on a query and there is more than
- * one result from the query. This exception will not cause the current transaction, if one is active, to be
- * marked for roll back.
- *
- * @author Gavin King
- */
-public class NonUniqueResultException extends PersistenceException {
-
- /**
- * Constructs a new NonUniqueResultException exception with null as its detail message
- */
- public NonUniqueResultException() {
- super();
- }
-
- /**
- * Constructs a new NonUniqueResultException exception with the specified detail message
- *
- * @param message
- */
- public NonUniqueResultException(String message) {
- super( message );
- }
-
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/NonUniqueResultException.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/NonUniqueResultException.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/NonUniqueResultException.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/NonUniqueResultException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id$
+package javax.persistence;
+
+/**
+ * Thrown by the persistence provider when getSingleResult() is executed on a query and there is more than
+ * one result from the query. This exception will not cause the current transaction, if one is active, to be
+ * marked for roll back.
+ *
+ * @author Gavin King
+ */
+public class NonUniqueResultException extends PersistenceException {
+
+ /**
+ * Constructs a new NonUniqueResultException exception with null as its detail message
+ */
+ public NonUniqueResultException() {
+ super();
+ }
+
+ /**
+ * Constructs a new NonUniqueResultException exception with the specified detail message
+ *
+ * @param message
+ */
+ public NonUniqueResultException(String message) {
+ super( message );
+ }
+
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/OneToMany.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/OneToMany.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/OneToMany.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-import static javax.persistence.FetchType.*;
-
-/**
- * Defines a many-valued association with one-to-many multiplicity.
- *
- * If the collection is defined using generics to specify the element type,
- * the associated target entity type need not be specified; otherwise the target
- * entity class must be specified.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface OneToMany {
- /**
- * The entity class that is the target of the association. Optional only if the collection
- * property is defined using Java generics. Must be specified otherwise.
- *
- * Defaults to the parameterized type of the collection when defined using generics.
- */
- Class targetEntity() default void.class;
- /**
- * The operations that must be cascaded to the target of the association.
- *
- * Defaults to no operations being cascaded.
- */
- CascadeType[] cascade() default {};
- /**
- * Whether the association should be lazily loaded or must be eagerly fetched.
- * The EAGER strategy is a requirement on the persistenceprovider runtime that the
- * associatedentities must be eagerly fetched. The LAZY strategy is a hint to the
- * persistence provider runtime.
- */
- FetchType fetch() default LAZY;
- /**
- * The field that owns the relationship. Required unless the relationship is unidirectional.
- */
- String mappedBy() default "";
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/OneToMany.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/OneToMany.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/OneToMany.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/OneToMany.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+import static javax.persistence.FetchType.*;
+
+/**
+ * Defines a many-valued association with one-to-many multiplicity.
+ *
+ * If the collection is defined using generics to specify the element type,
+ * the associated target entity type need not be specified; otherwise the target
+ * entity class must be specified.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface OneToMany {
+ /**
+ * The entity class that is the target of the association. Optional only if the collection
+ * property is defined using Java generics. Must be specified otherwise.
+ *
+ * Defaults to the parameterized type of the collection when defined using generics.
+ */
+ Class targetEntity() default void.class;
+ /**
+ * The operations that must be cascaded to the target of the association.
+ *
+ * Defaults to no operations being cascaded.
+ */
+ CascadeType[] cascade() default {};
+ /**
+ * Whether the association should be lazily loaded or must be eagerly fetched.
+ * The EAGER strategy is a requirement on the persistenceprovider runtime that the
+ * associatedentities must be eagerly fetched. The LAZY strategy is a hint to the
+ * persistence provider runtime.
+ */
+ FetchType fetch() default LAZY;
+ /**
+ * The field that owns the relationship. Required unless the relationship is unidirectional.
+ */
+ String mappedBy() default "";
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/OneToOne.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/OneToOne.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/OneToOne.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-import static javax.persistence.FetchType.*;
-
-/**
- * This annotation defines a single-valued association to another entity that has
- * one-to-one multiplicity. It is not normally necessary to specify the associated
- * target entity explicitly since it can usually be inferred from the type of the object
- * being referenced.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface OneToOne {
- /**
- * The entity class that is the target of the association.
- *
- * Defaults to the type of the field or property that stores the association.
- */
- Class targetEntity() default void.class;
- /**
- * The operations that must be cascaded to the target of the association.
- *
- * By default no operations are cascaded.
- */
- CascadeType[] cascade() default {};
- /**
- * Whether the association should be lazily loaded or must be eagerly fetched.
- * The EAGER strategy is a requirement on the persistence provider runtime that
- * the associated entity must be eagerly fetched. The LAZY strategy is a hint to
- * the persistence provider runtime.
- */
- FetchType fetch() default EAGER;
- /**
- * Whether the association is optional. If set to false then a non-null relationship must
- * always exist.
- */
- boolean optional() default true;
- /**
- * The field that owns the relationship. This element is only specified on the
- * inverse (non-owning) side of the association.
- */
- String mappedBy() default "";
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/OneToOne.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/OneToOne.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/OneToOne.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/OneToOne.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+import static javax.persistence.FetchType.*;
+
+/**
+ * This annotation defines a single-valued association to another entity that has
+ * one-to-one multiplicity. It is not normally necessary to specify the associated
+ * target entity explicitly since it can usually be inferred from the type of the object
+ * being referenced.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface OneToOne {
+ /**
+ * The entity class that is the target of the association.
+ *
+ * Defaults to the type of the field or property that stores the association.
+ */
+ Class targetEntity() default void.class;
+ /**
+ * The operations that must be cascaded to the target of the association.
+ *
+ * By default no operations are cascaded.
+ */
+ CascadeType[] cascade() default {};
+ /**
+ * Whether the association should be lazily loaded or must be eagerly fetched.
+ * The EAGER strategy is a requirement on the persistence provider runtime that
+ * the associated entity must be eagerly fetched. The LAZY strategy is a hint to
+ * the persistence provider runtime.
+ */
+ FetchType fetch() default EAGER;
+ /**
+ * Whether the association is optional. If set to false then a non-null relationship must
+ * always exist.
+ */
+ boolean optional() default true;
+ /**
+ * The field that owns the relationship. This element is only specified on the
+ * inverse (non-owning) side of the association.
+ */
+ String mappedBy() default "";
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/OptimisticLockException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/OptimisticLockException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/OptimisticLockException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id: $
-package javax.persistence;
-
-/**
- * Thrown by the persistence provider when an optimistic locking conflict occurs.
- * This exception may be thrown as part of an API call, a flush or at commit time.
- * The current transaction, if one is active, will be marked for rollback.
- *
- * @author Emmanuel Bernard
- */
-public class OptimisticLockException extends PersistenceException {
- private Object entity;
-
- public OptimisticLockException() {
- super();
- }
-
- public OptimisticLockException(Object entity) {
- this.entity = entity;
- }
-
- public OptimisticLockException(Throwable cause) {
- super( cause );
- }
-
- public OptimisticLockException(String message) {
- super( message );
- }
-
- public OptimisticLockException(String message, Throwable cause) {
- super( message, cause );
- }
-
- public OptimisticLockException(String message, Throwable cause, Object entity) {
- super( message, cause );
- this.entity = entity;
- }
-
- public Object getEntity() {
- return entity;
- }
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/OptimisticLockException.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/OptimisticLockException.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/OptimisticLockException.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/OptimisticLockException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id: $
+package javax.persistence;
+
+/**
+ * Thrown by the persistence provider when an optimistic locking conflict occurs.
+ * This exception may be thrown as part of an API call, a flush or at commit time.
+ * The current transaction, if one is active, will be marked for rollback.
+ *
+ * @author Emmanuel Bernard
+ */
+public class OptimisticLockException extends PersistenceException {
+ private Object entity;
+
+ public OptimisticLockException() {
+ super();
+ }
+
+ public OptimisticLockException(Object entity) {
+ this.entity = entity;
+ }
+
+ public OptimisticLockException(Throwable cause) {
+ super( cause );
+ }
+
+ public OptimisticLockException(String message) {
+ super( message );
+ }
+
+ public OptimisticLockException(String message, Throwable cause) {
+ super( message, cause );
+ }
+
+ public OptimisticLockException(String message, Throwable cause, Object entity) {
+ super( message, cause );
+ this.entity = entity;
+ }
+
+ public Object getEntity() {
+ return entity;
+ }
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/OrderBy.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/OrderBy.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/OrderBy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * This annotation specifies the ordering of the elements of a collection valued association at the
- * point when the association is retrieved.
- *
- * The syntax of the value ordering element is an orderby_list, as follows:
- * <code>orderby_list::= orderby_item [,orderby_item]*
- * orderby_item::= property_or_field_name [ASC | DESC]</code>
- *
- * If ASC or DESC is not specified, ASC (ascending order) is assumed.
- *
- * If the ordering element is not specified, ordering by the primary key of the associated
- * entity is assumed.
- *
- * The property or field name must correspond to that of a persistent property or field of the
- * associated class. The properties or fields used in the ordering must correspond to columns
- * for which comparison operators are supported.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface OrderBy {
- /**
- * An orderby_list, specified as follows:
- * orderby_list::= orderby_item [,orderby_item]* orderby_item::= property_or_field_name [ASC | DESC]
- *
- * If ASC or DESC is not specified, ASC (ascending order) is assumed.
- *
- */
- String value() default "";
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/OrderBy.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/OrderBy.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/OrderBy.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/OrderBy.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * This annotation specifies the ordering of the elements of a collection valued association at the
+ * point when the association is retrieved.
+ *
+ * The syntax of the value ordering element is an orderby_list, as follows:
+ * <code>orderby_list::= orderby_item [,orderby_item]*
+ * orderby_item::= property_or_field_name [ASC | DESC]</code>
+ *
+ * If ASC or DESC is not specified, ASC (ascending order) is assumed.
+ *
+ * If the ordering element is not specified, ordering by the primary key of the associated
+ * entity is assumed.
+ *
+ * The property or field name must correspond to that of a persistent property or field of the
+ * associated class. The properties or fields used in the ordering must correspond to columns
+ * for which comparison operators are supported.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface OrderBy {
+ /**
+ * An orderby_list, specified as follows:
+ * orderby_list::= orderby_item [,orderby_item]* orderby_item::= property_or_field_name [ASC | DESC]
+ *
+ * If ASC or DESC is not specified, ASC (ascending order) is assumed.
+ *
+ */
+ String value() default "";
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Persistence.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Persistence.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Persistence.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,110 +0,0 @@
-// $Id$
-package javax.persistence;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.net.URL;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import javax.persistence.spi.PersistenceProvider;
-
-/**
- * Bootstrap class that provides access to an EntityManagerFactory.
- */
-public class Persistence {
-
- public static String PERSISTENCE_PROVIDER = PersistenceProvider.class.getName();
-
- protected static final Set<PersistenceProvider> providers = new HashSet<PersistenceProvider>();
-
- /**
- * Create and return an EntityManagerFactory for the named persistence unit.
- *
- * @param persistenceUnitName The name of the persistence unit
- * @return The factory that creates EntityManagers configured according to the specified persistence unit
- */
- public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName) {
- return createEntityManagerFactory( persistenceUnitName, null );
- }
-
- /**
- * Create and return an EntityManagerFactory for the named persistence unit using the given properties.
- *
- * @param persistenceUnitName The name of the persistence unit
- * @param properties Additional properties to use when creating the factory. The values of these properties override
- * any values that may have been configured elsewhere
- * @return The factory that creates EntityManagers configured according to the specified persistence unit
- */
- public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
- EntityManagerFactory emf = null;
-
- if ( providers.size() == 0 ) {
- findAllProviders();
- }
- for ( PersistenceProvider provider : providers ) {
- emf = provider.createEntityManagerFactory( persistenceUnitName, properties );
- if ( emf != null ) break;
- }
- if ( emf == null ) {
- throw new PersistenceException( "No Persistence provider for EntityManager named " + persistenceUnitName );
- }
- return emf;
- }
-
- // Helper methods
-
- private static void findAllProviders() {
- try {
- ClassLoader loader = Thread.currentThread().getContextClassLoader();
- Enumeration<URL> resources = loader.getResources( "META-INF/services/" + PersistenceProvider.class.getName() );
- Set<String> names = new HashSet<String>();
- while ( resources.hasMoreElements() ) {
- URL url = resources.nextElement();
- InputStream is = url.openStream();
- try {
- names.addAll( providerNamesFromReader( new BufferedReader( new InputStreamReader( is ) ) ) );
- }
- finally {
- is.close();
- }
- }
- for ( String s : names ) {
- Class providerClass = loader.loadClass( s );
- providers.add( (PersistenceProvider) providerClass.newInstance() );
- }
- }
- catch (IOException e) {
- throw new PersistenceException( e );
- }
- catch (InstantiationException e) {
- throw new PersistenceException( e );
- }
- catch (IllegalAccessException e) {
- throw new PersistenceException( e );
- }
- catch (ClassNotFoundException e) {
- throw new PersistenceException( e );
- }
- }
-
- private static final Pattern nonCommentPattern = Pattern.compile( "^([^#]+)" );
-
- private static Set<String> providerNamesFromReader(BufferedReader reader) throws IOException {
- Set<String> names = new HashSet<String>();
- String line;
- while ( ( line = reader.readLine() ) != null ) {
- line = line.trim();
- Matcher m = nonCommentPattern.matcher( line );
- if ( m.find() ) {
- names.add( m.group().trim() );
- }
- }
- return names;
- }
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Persistence.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Persistence.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Persistence.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Persistence.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,110 @@
+// $Id$
+package javax.persistence;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.URL;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.persistence.spi.PersistenceProvider;
+
+/**
+ * Bootstrap class that provides access to an EntityManagerFactory.
+ */
+public class Persistence {
+
+ public static String PERSISTENCE_PROVIDER = PersistenceProvider.class.getName();
+
+ protected static final Set<PersistenceProvider> providers = new HashSet<PersistenceProvider>();
+
+ /**
+ * Create and return an EntityManagerFactory for the named persistence unit.
+ *
+ * @param persistenceUnitName The name of the persistence unit
+ * @return The factory that creates EntityManagers configured according to the specified persistence unit
+ */
+ public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName) {
+ return createEntityManagerFactory( persistenceUnitName, null );
+ }
+
+ /**
+ * Create and return an EntityManagerFactory for the named persistence unit using the given properties.
+ *
+ * @param persistenceUnitName The name of the persistence unit
+ * @param properties Additional properties to use when creating the factory. The values of these properties override
+ * any values that may have been configured elsewhere
+ * @return The factory that creates EntityManagers configured according to the specified persistence unit
+ */
+ public static EntityManagerFactory createEntityManagerFactory(String persistenceUnitName, Map properties) {
+ EntityManagerFactory emf = null;
+
+ if ( providers.size() == 0 ) {
+ findAllProviders();
+ }
+ for ( PersistenceProvider provider : providers ) {
+ emf = provider.createEntityManagerFactory( persistenceUnitName, properties );
+ if ( emf != null ) break;
+ }
+ if ( emf == null ) {
+ throw new PersistenceException( "No Persistence provider for EntityManager named " + persistenceUnitName );
+ }
+ return emf;
+ }
+
+ // Helper methods
+
+ private static void findAllProviders() {
+ try {
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ Enumeration<URL> resources = loader.getResources( "META-INF/services/" + PersistenceProvider.class.getName() );
+ Set<String> names = new HashSet<String>();
+ while ( resources.hasMoreElements() ) {
+ URL url = resources.nextElement();
+ InputStream is = url.openStream();
+ try {
+ names.addAll( providerNamesFromReader( new BufferedReader( new InputStreamReader( is ) ) ) );
+ }
+ finally {
+ is.close();
+ }
+ }
+ for ( String s : names ) {
+ Class providerClass = loader.loadClass( s );
+ providers.add( (PersistenceProvider) providerClass.newInstance() );
+ }
+ }
+ catch (IOException e) {
+ throw new PersistenceException( e );
+ }
+ catch (InstantiationException e) {
+ throw new PersistenceException( e );
+ }
+ catch (IllegalAccessException e) {
+ throw new PersistenceException( e );
+ }
+ catch (ClassNotFoundException e) {
+ throw new PersistenceException( e );
+ }
+ }
+
+ private static final Pattern nonCommentPattern = Pattern.compile( "^([^#]+)" );
+
+ private static Set<String> providerNamesFromReader(BufferedReader reader) throws IOException {
+ Set<String> names = new HashSet<String>();
+ String line;
+ while ( ( line = reader.readLine() ) != null ) {
+ line = line.trim();
+ Matcher m = nonCommentPattern.matcher( line );
+ if ( m.find() ) {
+ names.add( m.group().trim() );
+ }
+ }
+ return names;
+ }
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContext.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceContext.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContext.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Expresses a dependency on an EntityManager persistence context.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PersistenceContext {
- /**
- * The name by which the entity manager is to be accessed in the environment referencing context,
- * and is not needed when dependency injection is used.
- */
- String name() default "";
- /**
- * The name of the persistence unit. If the unitName element is specified, the persistence unit
- * for the entity manager that is accessible in JNDI must have the same name.
- */
- String unitName() default "";
- /**
- * Used to specify properties for the container or persistence provider. Vendor specific
- * properties may be included in this set of properties. Properties that are not
- * recognized by a vendor are ignored.
- */
- PersistenceProperty[] properties() default {};
- /**
- * Specifies whether this is a transaction-scoped persistence context or
- * an extended persistence context.
- */
- PersistenceContextType type() default PersistenceContextType.TRANSACTION;
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContext.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceContext.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContext.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContext.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Expresses a dependency on an EntityManager persistence context.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PersistenceContext {
+ /**
+ * The name by which the entity manager is to be accessed in the environment referencing context,
+ * and is not needed when dependency injection is used.
+ */
+ String name() default "";
+ /**
+ * The name of the persistence unit. If the unitName element is specified, the persistence unit
+ * for the entity manager that is accessible in JNDI must have the same name.
+ */
+ String unitName() default "";
+ /**
+ * Used to specify properties for the container or persistence provider. Vendor specific
+ * properties may be included in this set of properties. Properties that are not
+ * recognized by a vendor are ignored.
+ */
+ PersistenceProperty[] properties() default {};
+ /**
+ * Specifies whether this is a transaction-scoped persistence context or
+ * an extended persistence context.
+ */
+ PersistenceContextType type() default PersistenceContextType.TRANSACTION;
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContextType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceContextType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContextType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id$
-package javax.persistence;
-
-/**
- * Specifies whether a transaction-scoped or extended persistence context is to be used in
- * PersistenceContext. If the type element is not specified, a transaction-scoped persistence
- * context is used.
- */
-public enum PersistenceContextType {
- /**
- * Transaction-scoped persistence context
- */
- TRANSACTION,
- /**
- * Extended persistence context
- */
- EXTENDED
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContextType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceContextType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContextType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContextType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id$
+package javax.persistence;
+
+/**
+ * Specifies whether a transaction-scoped or extended persistence context is to be used in
+ * PersistenceContext. If the type element is not specified, a transaction-scoped persistence
+ * context is used.
+ */
+public enum PersistenceContextType {
+ /**
+ * Transaction-scoped persistence context
+ */
+ TRANSACTION,
+ /**
+ * Extended persistence context
+ */
+ EXTENDED
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContexts.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceContexts.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContexts.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Declares one or more PersistenceContext annotations. It is used to express a dependency on
- * container-managed entity manager persistence contexts.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.TYPE})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PersistenceContexts {
- /**
- * One or more persistence context
- */
- PersistenceContext[] value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContexts.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceContexts.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContexts.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceContexts.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Declares one or more PersistenceContext annotations. It is used to express a dependency on
+ * container-managed entity manager persistence contexts.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.TYPE})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PersistenceContexts {
+ /**
+ * One or more persistence context
+ */
+ PersistenceContext[] value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-/* $Id$
- * JBoss, Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package javax.persistence;
-
-/**
- * Thrown by the persistence provider when a problem occurs. All instances of PersistenceException
- * except for instances of NoResultException and NonUniqueResultException will cause the current
- * transaction, if one is active, to be marked for rollback.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
-public class PersistenceException extends RuntimeException {
- /**
- * Constructs a new PersistenceException exception with null as its detail message.
- */
- public PersistenceException() {
- }
-
- /**
- * Constructs a new PersistenceException exception with the specified detail message.
- *
- * @param message the detail message
- */
- public PersistenceException(String message) {
- super( message );
- }
-
- /**
- * Constructs a new PersistenceException exception with the specified detail message and cause
- *
- * @param message the detail message
- * @param cause the cause
- */
- public PersistenceException(String message, Throwable cause) {
- super( message, cause );
- }
-
- /**
- * Constructs a new PersistenceException exception with the specified cause
- *
- * @param cause the cause
- */
- public PersistenceException(Throwable cause) {
- super( cause );
- }
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceException.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceException.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceException.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+/* $Id$
+ * JBoss, Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package javax.persistence;
+
+/**
+ * Thrown by the persistence provider when a problem occurs. All instances of PersistenceException
+ * except for instances of NoResultException and NonUniqueResultException will cause the current
+ * transaction, if one is active, to be marked for rollback.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+public class PersistenceException extends RuntimeException {
+ /**
+ * Constructs a new PersistenceException exception with null as its detail message.
+ */
+ public PersistenceException() {
+ }
+
+ /**
+ * Constructs a new PersistenceException exception with the specified detail message.
+ *
+ * @param message the detail message
+ */
+ public PersistenceException(String message) {
+ super( message );
+ }
+
+ /**
+ * Constructs a new PersistenceException exception with the specified detail message and cause
+ *
+ * @param message the detail message
+ * @param cause the cause
+ */
+ public PersistenceException(String message, Throwable cause) {
+ super( message, cause );
+ }
+
+ /**
+ * Constructs a new PersistenceException exception with the specified cause
+ *
+ * @param cause the cause
+ */
+ public PersistenceException(Throwable cause) {
+ super( cause );
+ }
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceProperty.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceProperty.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceProperty.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id: $
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Describes a single container or persistence provider property.
- * Vendor specific properties may be included in the set of properties, and are passed to the persistence
- * provider by the container when the entity manager is created.
- * Properties that are not recognized by a vendor will be ignored.
- *
- * @author Emmanuel Bernard
- */
- at Target({})
- at Retention(RUNTIME)
-public @interface PersistenceProperty {
- /**
- * The name of the property
- */
- String name();
- /**
- * The value of the property
- */
- String value();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceProperty.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceProperty.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceProperty.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceProperty.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id: $
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Describes a single container or persistence provider property.
+ * Vendor specific properties may be included in the set of properties, and are passed to the persistence
+ * provider by the container when the entity manager is created.
+ * Properties that are not recognized by a vendor will be ignored.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({})
+ at Retention(RUNTIME)
+public @interface PersistenceProperty {
+ /**
+ * The name of the property
+ */
+ String name();
+ /**
+ * The value of the property
+ */
+ String value();
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnit.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnit.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnit.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,33 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Expresses a dependency on an EntityManagerFactory.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PersistenceUnit {
- /**
- * The name by which the entity manager factory is to be accessed in the environment
- * referencing context, and is not needed when dependency injection is used.
- */
- String name() default "";
- /**
- * The name of the persistence unit as defined in the persistence.xml file. If specified, the
- * persistence unit for the entity manager factory that is accessible in JNDI must have the
- * same name.
- */
- String unitName() default "";
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnit.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnit.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnit.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnit.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,33 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Expresses a dependency on an EntityManagerFactory.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PersistenceUnit {
+ /**
+ * The name by which the entity manager factory is to be accessed in the environment
+ * referencing context, and is not needed when dependency injection is used.
+ */
+ String name() default "";
+ /**
+ * The name of the persistence unit as defined in the persistence.xml file. If specified, the
+ * persistence unit for the entity manager factory that is accessible in JNDI must have the
+ * same name.
+ */
+ String unitName() default "";
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnits.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnits.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnits.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Declares one or more PersistenceUnit annotations
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.TYPE})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PersistenceUnits {
- /**
- * One or more PersistenceUnit annotations
- */
- PersistenceUnit[] value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnits.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnits.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnits.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PersistenceUnits.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Declares one or more PersistenceUnit annotations
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.TYPE})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PersistenceUnits {
+ /**
+ * One or more PersistenceUnit annotations
+ */
+ PersistenceUnit[] value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PostLoad.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PostLoad.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PostLoad.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-/**
- * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be applied to
- * methods of an entity class, a mapped superclass, or a callback listener class.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PostLoad {
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PostLoad.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PostLoad.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PostLoad.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PostLoad.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be applied to
+ * methods of an entity class, a mapped superclass, or a callback listener class.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PostLoad {
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PostPersist.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PostPersist.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PostPersist.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-/**
- * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be
- * applied to methods of an entity class, a mapped superclass, or a callback listener class.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PostPersist {
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PostPersist.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PostPersist.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PostPersist.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PostPersist.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be
+ * applied to methods of an entity class, a mapped superclass, or a callback listener class.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PostPersist {
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PostRemove.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PostRemove.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PostRemove.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-/**
- * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be applied
- * to methods of an entity class, a mapped superclass, or a callback listener class.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PostRemove {
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PostRemove.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PostRemove.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PostRemove.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PostRemove.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be applied
+ * to methods of an entity class, a mapped superclass, or a callback listener class.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PostRemove {
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PostUpdate.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PostUpdate.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PostUpdate.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-/**
- * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be applied to
- * methods of an entity class, a mapped superclass, or a callback listener class.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PostUpdate {
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PostUpdate.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PostUpdate.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PostUpdate.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PostUpdate.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be applied to
+ * methods of an entity class, a mapped superclass, or a callback listener class.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PostUpdate {
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PrePersist.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PrePersist.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PrePersist.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-/**
- * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be applied
- * to methods of an entity class, a mapped superclass, or a callback listener class.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PrePersist {
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PrePersist.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PrePersist.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PrePersist.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PrePersist.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be applied
+ * to methods of an entity class, a mapped superclass, or a callback listener class.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PrePersist {
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PreRemove.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PreRemove.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PreRemove.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-/**
- * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be applied
- * to methods of an entity class, a mapped superclass, or a callback listener class.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PreRemove {
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PreRemove.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PreRemove.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PreRemove.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PreRemove.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be applied
+ * to methods of an entity class, a mapped superclass, or a callback listener class.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PreRemove {
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PreUpdate.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PreUpdate.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PreUpdate.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-/* $Id$
- * JBoss Inc
- *
- * Distributable under LGPL license.
- * See terms of license at gnu.org.
- */
-
-package javax.persistence;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-
-/**
- * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be
- * applied to methods of an entity class, a mapped superclass, or a callback listener class.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
- at Target({ElementType.METHOD})
- at Retention(RetentionPolicy.RUNTIME)
-public @interface PreUpdate {
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PreUpdate.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PreUpdate.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PreUpdate.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PreUpdate.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+/* $Id$
+ * JBoss Inc
+ *
+ * Distributable under LGPL license.
+ * See terms of license at gnu.org.
+ */
+
+package javax.persistence;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+
+/**
+ * Is used to specify callback methods for the corresponding lifecycle event. This annotation may be
+ * applied to methods of an entity class, a mapped superclass, or a callback listener class.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+ at Target({ElementType.METHOD})
+ at Retention(RetentionPolicy.RUNTIME)
+public @interface PreUpdate {
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumn.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumn.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,53 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * This annotation specifies a primary key column that is used as a foreign key to join to another
- * table.
- *
- * It is used to join the primary table of an entity subclass in the JOINED mapping strategy to
- * the primary table of its superclass; it is used within a SecondaryTable annotation to join a
- * secondary table to a primary table; and it may be used in a OneToOne mapping in which the
- * primary key of the referencing entity is used as a foreign key to the referenced entity.
- *
- * If no PrimaryKeyJoinColumn annotation is specified for a subclass in the JOINED mapping
- * strategy, the foreign key columns are assumed to have the same names as the primary key
- * columns of the primary table of the superclass
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
-public @interface PrimaryKeyJoinColumn {
- /**
- * The name of the primary key column of the current table.
- *
- * Defaults to the same name as the primary key column of the primary table of the
- * superclass (JOINED mapping strategy); the same name as the primary key column of
- * the primary table (SecondaryTable mapping); or the same name as the primary key
- * column for the table for the referencing entity (OneToOne mapping)
- */
- String name() default "";
- /**
- * The name of the primary key column of the table being joined to.
- *
- * Defaults to the same name as the primary key column of the primary table of the
- * superclass (JOINED mapping strategy); the same name as the primary key column of the
- * primary table (SecondaryTable mapping); or the same name as the primary key column for
- * the table for the referencing entity (OneToOne mapping)
- */
- String referencedColumnName() default "";
- /**
- * The SQL fragment that is used when generating the DDL for the column. This should not be
- * specified for a OneToOne primary key association.
- *
- * Defaults to the generated SQL to create a column of the inferred type.
- */
- String columnDefinition() default "";
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumn.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumn.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumn.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,53 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * This annotation specifies a primary key column that is used as a foreign key to join to another
+ * table.
+ *
+ * It is used to join the primary table of an entity subclass in the JOINED mapping strategy to
+ * the primary table of its superclass; it is used within a SecondaryTable annotation to join a
+ * secondary table to a primary table; and it may be used in a OneToOne mapping in which the
+ * primary key of the referencing entity is used as a foreign key to the referenced entity.
+ *
+ * If no PrimaryKeyJoinColumn annotation is specified for a subclass in the JOINED mapping
+ * strategy, the foreign key columns are assumed to have the same names as the primary key
+ * columns of the primary table of the superclass
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+public @interface PrimaryKeyJoinColumn {
+ /**
+ * The name of the primary key column of the current table.
+ *
+ * Defaults to the same name as the primary key column of the primary table of the
+ * superclass (JOINED mapping strategy); the same name as the primary key column of
+ * the primary table (SecondaryTable mapping); or the same name as the primary key
+ * column for the table for the referencing entity (OneToOne mapping)
+ */
+ String name() default "";
+ /**
+ * The name of the primary key column of the table being joined to.
+ *
+ * Defaults to the same name as the primary key column of the primary table of the
+ * superclass (JOINED mapping strategy); the same name as the primary key column of the
+ * primary table (SecondaryTable mapping); or the same name as the primary key column for
+ * the table for the referencing entity (OneToOne mapping)
+ */
+ String referencedColumnName() default "";
+ /**
+ * The SQL fragment that is used when generating the DDL for the column. This should not be
+ * specified for a OneToOne primary key association.
+ *
+ * Defaults to the generated SQL to create a column of the inferred type.
+ */
+ String columnDefinition() default "";
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumns.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumns.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumns.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * This annotation groups PrimaryKeyJoinColumn annotations. It is used to map composite foreign keys.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
-public @interface PrimaryKeyJoinColumns {
- /**
- * One or more PrimaryKeyJoinColumn annotations
- */
- PrimaryKeyJoinColumn[] value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumns.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumns.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumns.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/PrimaryKeyJoinColumns.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * This annotation groups PrimaryKeyJoinColumn annotations. It is used to map composite foreign keys.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+public @interface PrimaryKeyJoinColumns {
+ /**
+ * One or more PrimaryKeyJoinColumn annotations
+ */
+ PrimaryKeyJoinColumn[] value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Query.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Query.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Query.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,148 +0,0 @@
-// $Id$
-package javax.persistence;
-
-import java.util.Calendar;
-import java.util.Date;
-import java.util.List;
-
-
-/**
- * Interface used to control query execution.
- */
-public interface Query
-{
- /**
- * Execute the query and return the query results as a List.
- *
- * @return a list of the results
- * @throws IllegalStateException f called for a Java Persistence query language UPDATE or DELETE statement
- */
- public List getResultList();
-
- /**
- * Execute a SELECT query that returns a single result.
- *
- * @return the result
- * @throws NoResultException if there is no result
- * @throws NonUniqueResultException if more than one result
- * @throws IllegalStateException if called for a Java
- * Persistence query language UPDATE or DELETE statement
- */
- public Object getSingleResult();
-
- /**
- * Execute an update or delete statement.
- *
- * @return the number of entities updated or deleted
- * @throws IllegalStateException if called for a Java Persistence query language SELECT statement
- * @throws TransactionRequiredException if there is no transaction
- */
- public int executeUpdate();
-
- /**
- * Set the maximum number of results to retrieve.
- *
- * @param maxResult
- * @return the same query instance
- * @throws IllegalArgumentException if argument is negative
- */
- public Query setMaxResults(int maxResult);
-
- /**
- * Set the position of the first result to retrieve.
- *
- * @param startPosition position of the first result, numbered from 0
- * @return the same query instance
- * @throws IllegalArgumentException if argument is negative
- */
- public Query setFirstResult(int startPosition);
-
- /**
- * Set an implementation-specific hint. If the hint name is not recognized, it is silently
- * ignored.
- *
- * @param hintName
- * @param value
- * @return the same query instance
- * @throws IllegalArgumentException if the second argument is not valid for the implementation
- */
- public Query setHint(String hintName, Object value);
-
- /**
- * Bind an argument to a named parameter.
- *
- * @param name the parameter name
- * @param value
- * @return the same query instance
- * @throws IllegalArgumentException if parameter name does not correspond to parameter in query
- * string or argument is of incorrect type
- */
- public Query setParameter(String name, Object value);
-
- /**
- * Bind an instance of java.util.Date to a named parameter.
- *
- * @param name
- * @param value
- * @param temporalType
- * @return the same query instance
- * @throws IllegalArgumentException if parameter name does not correspond to parameter in query
- * string
- */
- public Query setParameter(String name, Date value, TemporalType temporalType);
-
- /**
- * Bind an instance of java.util.Calendar to a named parameter.
- *
- * @param name
- * @param value
- * @param temporalType
- * @return the same query instance
- * @throws IllegalArgumentException if parameter name does not correspond to parameter in query
- * string
- */
- public Query setParameter(String name, Calendar value, TemporalType temporalType);
-
- /**
- * Bind an argument to a positional parameter.
- *
- * @param position
- * @param value
- * @return the same query instance
- * @throws IllegalArgumentException if position does not correspond to positional parameter of
- * query or argument is of incorrect type
- */
- public Query setParameter(int position, Object value);
-
- /**
- * Bind an instance of java.util.Date to a positional parameter.
- *
- * @param position
- * @param value
- * @param temporalType
- * @return the same query instance
- * @throws IllegalArgumentException if position does not correspond to positional parameter of
- * query
- */
- public Query setParameter(int position, Date value, TemporalType temporalType);
-
- /**
- * Bind an instance of java.util.Calendar to a positional parameter.
- *
- * @param position
- * @param value
- * @param temporalType
- * @return the same query instance } correspond to positional parameter of query
- */
- public Query setParameter(int position, Calendar value, TemporalType temporalType);
-
- /**
- * Set the flush mode type to be used for the query execution.
- * The flush mode type applies to the query regardless of the
- * flush mode type in use for the entity manager.
- *
- * @param flushMode
- */
- public Query setFlushMode(FlushModeType flushMode);
-
-}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Query.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Query.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Query.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Query.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,148 @@
+// $Id$
+package javax.persistence;
+
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+
+/**
+ * Interface used to control query execution.
+ */
+public interface Query
+{
+ /**
+ * Execute the query and return the query results as a List.
+ *
+ * @return a list of the results
+ * @throws IllegalStateException f called for a Java Persistence query language UPDATE or DELETE statement
+ */
+ public List getResultList();
+
+ /**
+ * Execute a SELECT query that returns a single result.
+ *
+ * @return the result
+ * @throws NoResultException if there is no result
+ * @throws NonUniqueResultException if more than one result
+ * @throws IllegalStateException if called for a Java
+ * Persistence query language UPDATE or DELETE statement
+ */
+ public Object getSingleResult();
+
+ /**
+ * Execute an update or delete statement.
+ *
+ * @return the number of entities updated or deleted
+ * @throws IllegalStateException if called for a Java Persistence query language SELECT statement
+ * @throws TransactionRequiredException if there is no transaction
+ */
+ public int executeUpdate();
+
+ /**
+ * Set the maximum number of results to retrieve.
+ *
+ * @param maxResult
+ * @return the same query instance
+ * @throws IllegalArgumentException if argument is negative
+ */
+ public Query setMaxResults(int maxResult);
+
+ /**
+ * Set the position of the first result to retrieve.
+ *
+ * @param startPosition position of the first result, numbered from 0
+ * @return the same query instance
+ * @throws IllegalArgumentException if argument is negative
+ */
+ public Query setFirstResult(int startPosition);
+
+ /**
+ * Set an implementation-specific hint. If the hint name is not recognized, it is silently
+ * ignored.
+ *
+ * @param hintName
+ * @param value
+ * @return the same query instance
+ * @throws IllegalArgumentException if the second argument is not valid for the implementation
+ */
+ public Query setHint(String hintName, Object value);
+
+ /**
+ * Bind an argument to a named parameter.
+ *
+ * @param name the parameter name
+ * @param value
+ * @return the same query instance
+ * @throws IllegalArgumentException if parameter name does not correspond to parameter in query
+ * string or argument is of incorrect type
+ */
+ public Query setParameter(String name, Object value);
+
+ /**
+ * Bind an instance of java.util.Date to a named parameter.
+ *
+ * @param name
+ * @param value
+ * @param temporalType
+ * @return the same query instance
+ * @throws IllegalArgumentException if parameter name does not correspond to parameter in query
+ * string
+ */
+ public Query setParameter(String name, Date value, TemporalType temporalType);
+
+ /**
+ * Bind an instance of java.util.Calendar to a named parameter.
+ *
+ * @param name
+ * @param value
+ * @param temporalType
+ * @return the same query instance
+ * @throws IllegalArgumentException if parameter name does not correspond to parameter in query
+ * string
+ */
+ public Query setParameter(String name, Calendar value, TemporalType temporalType);
+
+ /**
+ * Bind an argument to a positional parameter.
+ *
+ * @param position
+ * @param value
+ * @return the same query instance
+ * @throws IllegalArgumentException if position does not correspond to positional parameter of
+ * query or argument is of incorrect type
+ */
+ public Query setParameter(int position, Object value);
+
+ /**
+ * Bind an instance of java.util.Date to a positional parameter.
+ *
+ * @param position
+ * @param value
+ * @param temporalType
+ * @return the same query instance
+ * @throws IllegalArgumentException if position does not correspond to positional parameter of
+ * query
+ */
+ public Query setParameter(int position, Date value, TemporalType temporalType);
+
+ /**
+ * Bind an instance of java.util.Calendar to a positional parameter.
+ *
+ * @param position
+ * @param value
+ * @param temporalType
+ * @return the same query instance } correspond to positional parameter of query
+ */
+ public Query setParameter(int position, Calendar value, TemporalType temporalType);
+
+ /**
+ * Set the flush mode type to be used for the query execution.
+ * The flush mode type applies to the query regardless of the
+ * flush mode type in use for the entity manager.
+ *
+ * @param flushMode
+ */
+ public Query setFlushMode(FlushModeType flushMode);
+
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/QueryHint.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/QueryHint.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/QueryHint.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id$
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * An implementation-specific Query hint
- *
- * @author Emmanuel Bernard
- */
- at Target({})
- at Retention(RUNTIME)
-public @interface QueryHint {
- /**
- * Name of the hint
- */
- String name();
-
- /**
- * Value of the hint
- */
- String value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/QueryHint.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/QueryHint.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/QueryHint.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/QueryHint.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id$
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * An implementation-specific Query hint
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({})
+ at Retention(RUNTIME)
+public @interface QueryHint {
+ /**
+ * Name of the hint
+ */
+ String name();
+
+ /**
+ * Value of the hint
+ */
+ String value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/RollbackException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/RollbackException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/RollbackException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id: $
-package javax.persistence;
-
-/**
- * Thrown by the persistence provider when the EntityTransaction.commit() fails
- *
- * @author Emmanuel Bernard
- */
-public class RollbackException extends PersistenceException {
- /**
- * Constructs a new RollbackException exception with null as its detail message
- */
- public RollbackException() {
- super();
- }
-
- /**
- * Constructs a new RollbackException exception with the specified cause
- *
- * @param cause The detail cause
- */
- public RollbackException(Throwable cause) {
- super( cause );
- }
-
- /**
- * Constructs a new RollbackException exception with the specified detail message
- *
- * @param message The detail message
- */
- public RollbackException(String message) {
- super( message );
- }
-
- /**
- * Constructs a new RollbackException exception with the specified detail message and cause
- *
- * @param message The detail message
- * @param cause The detail cause
- */
- public RollbackException(String message, Throwable cause) {
- super( message, cause );
- }
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/RollbackException.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/RollbackException.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/RollbackException.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/RollbackException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id: $
+package javax.persistence;
+
+/**
+ * Thrown by the persistence provider when the EntityTransaction.commit() fails
+ *
+ * @author Emmanuel Bernard
+ */
+public class RollbackException extends PersistenceException {
+ /**
+ * Constructs a new RollbackException exception with null as its detail message
+ */
+ public RollbackException() {
+ super();
+ }
+
+ /**
+ * Constructs a new RollbackException exception with the specified cause
+ *
+ * @param cause The detail cause
+ */
+ public RollbackException(Throwable cause) {
+ super( cause );
+ }
+
+ /**
+ * Constructs a new RollbackException exception with the specified detail message
+ *
+ * @param message The detail message
+ */
+ public RollbackException(String message) {
+ super( message );
+ }
+
+ /**
+ * Constructs a new RollbackException exception with the specified detail message and cause
+ *
+ * @param message The detail message
+ * @param cause The detail cause
+ */
+ public RollbackException(String message, Throwable cause) {
+ super( message, cause );
+ }
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTable.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/SecondaryTable.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,53 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * This annotation is used to specify a secondary table for the annotated entity class. Specifying
- * one or more secondary tables indicates that the data for the entity class is stored across multiple
- * tables.
- *
- * If no SecondaryTable annotation is specified, it is assumed that all persistent fields or properties
- * of the entity are mapped to the primary table. If no primary key join columns are specified, the
- * join columns are assumed to reference the primary key columns of the primary table, and have the
- * same names and types as the referenced primary key columns of the primary table.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface SecondaryTable {
- /**
- * The name of the table
- */
- String name();
- /**
- * The catalog of the table
- */
- String catalog() default "";
- /**
- * The schema of the table
- */
- String schema() default "";
- /**
- * The columns that are used to join with the primary table.
- *
- * Defaults to the column(s) of the same name(s) as the primary key column(s)
- * in the primary table
- */
- PrimaryKeyJoinColumn[] pkJoinColumns() default {};
- /**
- * Unique constraints that are to be placed on the table. These are typically only used if
- * table generation is in effect. These constraints apply in addition to any constraints
- * specified by the Column and JoinColumn annotations and constraints entailed by primary
- * key mappings.
- *
- * Defaults to no additional constraints.
- */
- UniqueConstraint[] uniqueConstraints() default {};
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTable.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/SecondaryTable.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTable.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTable.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,53 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * This annotation is used to specify a secondary table for the annotated entity class. Specifying
+ * one or more secondary tables indicates that the data for the entity class is stored across multiple
+ * tables.
+ *
+ * If no SecondaryTable annotation is specified, it is assumed that all persistent fields or properties
+ * of the entity are mapped to the primary table. If no primary key join columns are specified, the
+ * join columns are assumed to reference the primary key columns of the primary table, and have the
+ * same names and types as the referenced primary key columns of the primary table.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface SecondaryTable {
+ /**
+ * The name of the table
+ */
+ String name();
+ /**
+ * The catalog of the table
+ */
+ String catalog() default "";
+ /**
+ * The schema of the table
+ */
+ String schema() default "";
+ /**
+ * The columns that are used to join with the primary table.
+ *
+ * Defaults to the column(s) of the same name(s) as the primary key column(s)
+ * in the primary table
+ */
+ PrimaryKeyJoinColumn[] pkJoinColumns() default {};
+ /**
+ * Unique constraints that are to be placed on the table. These are typically only used if
+ * table generation is in effect. These constraints apply in addition to any constraints
+ * specified by the Column and JoinColumn annotations and constraints entailed by primary
+ * key mappings.
+ *
+ * Defaults to no additional constraints.
+ */
+ UniqueConstraint[] uniqueConstraints() default {};
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTables.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/SecondaryTables.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTables.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-/**
- * This annotation is used to specify multiple secondary tables for an entity.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface SecondaryTables {
- /**
- * The secondary tables for an entity.
- */
- SecondaryTable[] value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTables.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/SecondaryTables.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTables.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/SecondaryTables.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+/**
+ * This annotation is used to specify multiple secondary tables for an entity.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface SecondaryTables {
+ /**
+ * The secondary tables for an entity.
+ */
+ SecondaryTable[] value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/SequenceGenerator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/SequenceGenerator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/SequenceGenerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * This annotation defines a primary key generator that may be referenced by name when a generator
- * element is specified for the GeneratedValue annotation. A sequence generator may be specified on
- * the entity class or on the primary key field or property. The scope of the generator name is global
- * to the persistence unit (across all generator types).
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
-public @interface SequenceGenerator {
- /**
- * A unique generator name that can be referenced by one or more classes to be the generator for primary key values
- */
- String name();
- /**
- * The name of the database sequence object from which to obtain primary key values
- * Defaults to a provider-chosen value
- */
- String sequenceName() default "";
- /**
- * The value from which the sequence object is to start generating
- */
- int initialValue() default 1;
- /**
- * The amount to increment by when allocating sequence numbers from the sequence
- */
- int allocationSize() default 50;
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/SequenceGenerator.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/SequenceGenerator.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/SequenceGenerator.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/SequenceGenerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * This annotation defines a primary key generator that may be referenced by name when a generator
+ * element is specified for the GeneratedValue annotation. A sequence generator may be specified on
+ * the entity class or on the primary key field or property. The scope of the generator name is global
+ * to the persistence unit (across all generator types).
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD}) @Retention(RUNTIME)
+public @interface SequenceGenerator {
+ /**
+ * A unique generator name that can be referenced by one or more classes to be the generator for primary key values
+ */
+ String name();
+ /**
+ * The name of the database sequence object from which to obtain primary key values
+ * Defaults to a provider-chosen value
+ */
+ String sequenceName() default "";
+ /**
+ * The value from which the sequence object is to start generating
+ */
+ int initialValue() default 1;
+ /**
+ * The amount to increment by when allocating sequence numbers from the sequence
+ */
+ int allocationSize() default 50;
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMapping.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMapping.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMapping.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * This annotation is used to specify the mapping of the result of a native SQL query
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME)
-public @interface SqlResultSetMapping {
- /**
- * The name given to the result set mapping, and used to refer to it in the methods of the Query API
- */
- String name();
- /**
- * Specifies the result set mapping to entities
- */
- EntityResult[] entities() default {};
- /**
- * Specifies the result set mapping to scalar values
- */
- ColumnResult[] columns() default {};
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMapping.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMapping.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMapping.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMapping.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * This annotation is used to specify the mapping of the result of a native SQL query
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME)
+public @interface SqlResultSetMapping {
+ /**
+ * The name given to the result set mapping, and used to refer to it in the methods of the Query API
+ */
+ String name();
+ /**
+ * Specifies the result set mapping to entities
+ */
+ EntityResult[] entities() default {};
+ /**
+ * Specifies the result set mapping to scalar values
+ */
+ ColumnResult[] columns() default {};
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMappings.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMappings.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMappings.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id: SqlResultSetMapping.java 9044 2006-01-12 20:58:41 -0500 (jeu., 12 janv. 2006) epbernard $
-//EJB3 Specification Copyright 2004 - 2006 Sun Microsystems, Inc.
-
-package javax.persistence;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * This annotation is used to define one or more SqlResultSetMapping
- *
- * @author Emmanuel Bernard
- */
- at Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME)
-public @interface SqlResultSetMappings {
- SqlResultSetMapping[] value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMappings.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMappings.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMappings.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/SqlResultSetMappings.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id: SqlResultSetMapping.java 9044 2006-01-12 20:58:41 -0500 (jeu., 12 janv. 2006) epbernard $
+//EJB3 Specification Copyright 2004 - 2006 Sun Microsystems, Inc.
+
+package javax.persistence;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * This annotation is used to define one or more SqlResultSetMapping
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME)
+public @interface SqlResultSetMappings {
+ SqlResultSetMapping[] value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Table.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Table.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Table.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,48 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * This annotation specifies the primary table for the annotated entity. Additional
- * tables may be specified using SecondaryTable or SecondaryTables annotation.
- *
- * If no Table annotation is specified for an entity class, the default values apply.
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE}) @Retention(RUNTIME)
-public @interface Table {
- /**
- * The name of the table.
- *
- * Defaults to the entity name.
- */
- String name() default "";
- /**
- * The catalog of the table.
- *
- * Defaults to the default catalog.
- */
- String catalog() default "";
- /**
- * The schema of the table.
- *
- * Defaults to the default schema for user.
- */
- String schema() default "";
- /**
- * Unique constraints that are to be placed on the table. These are only used if table
- * generation is in effect. These constraints apply in addition to any constraints
- * specified by the Column and JoinColumn annotations and constraints entailed by
- * primary key mappings.
- *
- * Defaults to no additional constraints.
- */
- UniqueConstraint[] uniqueConstraints() default {};
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Table.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Table.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Table.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Table.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,48 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * This annotation specifies the primary table for the annotated entity. Additional
+ * tables may be specified using SecondaryTable or SecondaryTables annotation.
+ *
+ * If no Table annotation is specified for an entity class, the default values apply.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE}) @Retention(RUNTIME)
+public @interface Table {
+ /**
+ * The name of the table.
+ *
+ * Defaults to the entity name.
+ */
+ String name() default "";
+ /**
+ * The catalog of the table.
+ *
+ * Defaults to the default catalog.
+ */
+ String catalog() default "";
+ /**
+ * The schema of the table.
+ *
+ * Defaults to the default schema for user.
+ */
+ String schema() default "";
+ /**
+ * Unique constraints that are to be placed on the table. These are only used if table
+ * generation is in effect. These constraints apply in addition to any constraints
+ * specified by the Column and JoinColumn annotations and constraints entailed by
+ * primary key mappings.
+ *
+ * Defaults to no additional constraints.
+ */
+ UniqueConstraint[] uniqueConstraints() default {};
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/TableGenerator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/TableGenerator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/TableGenerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,67 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.*;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * This annotation defines a primary key generator that may be referenced by name when a generator
- * element is specified for the GeneratedValue annotation. A table generator may be specified on the
- * entity class or on the primary key field or property. The scope of the generator name is global to
- * the persistence unit (across all generator types).
- *
- * @author Emmanuel Bernard
- */
- at Target({TYPE, METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface TableGenerator {
- /**
- * A unique generator name that can be referenced by one or more classes to be the generator for id values
- */
- String name();
- /**
- * Name of table that stores the generated id values. Defaults to a name chosen by persistence provider.
- */
- String table() default "";
- /**
- * The catalog of the table
- * Defaults to the default catalog
- */
- String catalog() default "";
- /**
- * The schema of the table
- * Defaults to the default schema for user
- */
- String schema() default "";
- /**
- * Name of the primary key column in the table
- * Defaults to a provider-chosen name
- */
- String pkColumnName() default "";
- /**
- * Name of the column that stores the last value generated
- * Defaults to a provider-chosen name
- */
- String valueColumnName() default "";
- /**
- * The primary key value in the generator table that distinguishes this set of generated values from others that may be stored in the table
- * Defaults to a provider-chosen value to store in the primary key column of the generator table
- */
- String pkColumnValue() default "";
- /**
- * The initial value to be used when allocating id numbers from the generator
- */
- int initialValue() default 0;
- /**
- * The amount to increment by when allocating id numbers from the generator
- */
- int allocationSize() default 50;
- /**
- * Unique constraints that are to be placed on the table. These are only used if table generation is in effect. These constraints apply in addition to primary key constraints
- * Defaults to no additional constraints
- */
- UniqueConstraint[] uniqueConstraints() default {};
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/TableGenerator.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/TableGenerator.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/TableGenerator.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/TableGenerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,67 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.*;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation defines a primary key generator that may be referenced by name when a generator
+ * element is specified for the GeneratedValue annotation. A table generator may be specified on the
+ * entity class or on the primary key field or property. The scope of the generator name is global to
+ * the persistence unit (across all generator types).
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({TYPE, METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface TableGenerator {
+ /**
+ * A unique generator name that can be referenced by one or more classes to be the generator for id values
+ */
+ String name();
+ /**
+ * Name of table that stores the generated id values. Defaults to a name chosen by persistence provider.
+ */
+ String table() default "";
+ /**
+ * The catalog of the table
+ * Defaults to the default catalog
+ */
+ String catalog() default "";
+ /**
+ * The schema of the table
+ * Defaults to the default schema for user
+ */
+ String schema() default "";
+ /**
+ * Name of the primary key column in the table
+ * Defaults to a provider-chosen name
+ */
+ String pkColumnName() default "";
+ /**
+ * Name of the column that stores the last value generated
+ * Defaults to a provider-chosen name
+ */
+ String valueColumnName() default "";
+ /**
+ * The primary key value in the generator table that distinguishes this set of generated values from others that may be stored in the table
+ * Defaults to a provider-chosen value to store in the primary key column of the generator table
+ */
+ String pkColumnValue() default "";
+ /**
+ * The initial value to be used when allocating id numbers from the generator
+ */
+ int initialValue() default 0;
+ /**
+ * The amount to increment by when allocating id numbers from the generator
+ */
+ int allocationSize() default 50;
+ /**
+ * Unique constraints that are to be placed on the table. These are only used if table generation is in effect. These constraints apply in addition to primary key constraints
+ * Defaults to no additional constraints
+ */
+ UniqueConstraint[] uniqueConstraints() default {};
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Temporal.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Temporal.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Temporal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * This annotation must be specified for persistent fields or properties of type Date and Calendar.
- * It may only be specified for fields or properties of these types.
- *
- * The Temporal annotation may be used in conjunction with the Basic annotation.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Temporal {
- /**
- * The type used in mapping java.util.Date or java.util.Calendar
- */
- TemporalType value();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Temporal.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Temporal.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Temporal.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Temporal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation must be specified for persistent fields or properties of type Date and Calendar.
+ * It may only be specified for fields or properties of these types.
+ *
+ * The Temporal annotation may be used in conjunction with the Basic annotation.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Temporal {
+ /**
+ * The type used in mapping java.util.Date or java.util.Calendar
+ */
+ TemporalType value();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/TemporalType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/TemporalType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/TemporalType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-/**
- * Type used to indicate a specific mapping of Date or Calendar.
- */
-public enum TemporalType {
- /**
- * Map as java.sql.Date
- */
- DATE,
- /**
- * Map as java.sql.Time
- */
- TIME,
- /**
- * Map as java.sql.Timestamp
- */
- TIMESTAMP
-}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/TemporalType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/TemporalType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/TemporalType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/TemporalType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+/**
+ * Type used to indicate a specific mapping of Date or Calendar.
+ */
+public enum TemporalType {
+ /**
+ * Map as java.sql.Date
+ */
+ DATE,
+ /**
+ * Map as java.sql.Time
+ */
+ TIME,
+ /**
+ * Map as java.sql.Timestamp
+ */
+ TIMESTAMP
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/TransactionRequiredException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/TransactionRequiredException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/TransactionRequiredException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-package javax.persistence;
-
-/**
- * Thrown by the persistence provider when a transaction is required but is not active.
- * @author Gavin King
- */
-public class TransactionRequiredException extends PersistenceException {
-
- /**
- * Constructs a new TransactionRequiredException exception with null as its detail message
- */
- public TransactionRequiredException() {
- super();
- }
-
- /**
- * Constructs a new TransactionRequiredException exception with the specified detail message
- *
- * @param message
- */
- public TransactionRequiredException(String message) {
- super( message );
- }
-
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/TransactionRequiredException.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/TransactionRequiredException.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/TransactionRequiredException.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/TransactionRequiredException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+package javax.persistence;
+
+/**
+ * Thrown by the persistence provider when a transaction is required but is not active.
+ * @author Gavin King
+ */
+public class TransactionRequiredException extends PersistenceException {
+
+ /**
+ * Constructs a new TransactionRequiredException exception with null as its detail message
+ */
+ public TransactionRequiredException() {
+ super();
+ }
+
+ /**
+ * Constructs a new TransactionRequiredException exception with the specified detail message
+ *
+ * @param message
+ */
+ public TransactionRequiredException(String message) {
+ super( message );
+ }
+
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Transient.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Transient.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Transient.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * This annotation specifies that the property or field is not persistent. It is used to annotate
- * a property or field of an entity class, mapped superclass, or embeddable class.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface Transient {}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Transient.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Transient.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Transient.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Transient.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * This annotation specifies that the property or field is not persistent. It is used to annotate
+ * a property or field of an entity class, mapped superclass, or embeddable class.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface Transient {}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/UniqueConstraint.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/UniqueConstraint.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/UniqueConstraint.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * This annotation is used to specify that a unique constraint is to be included in the generated DDL
- * for a primary or secondary table
- *
- * @author Emmanuel Bernard
- */
- at Target({}) @Retention(RUNTIME)
-public @interface UniqueConstraint {
- /**
- * An array of the column names that make up the constraint
- */
- String[] columnNames();
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/UniqueConstraint.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/UniqueConstraint.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/UniqueConstraint.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/UniqueConstraint.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * This annotation is used to specify that a unique constraint is to be included in the generated DDL
+ * for a primary or secondary table
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({}) @Retention(RUNTIME)
+public @interface UniqueConstraint {
+ /**
+ * An array of the column names that make up the constraint
+ */
+ String[] columnNames();
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/Version.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Version.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.Target;
-
-import static java.lang.annotation.ElementType.*;
-import static java.lang.annotation.RetentionPolicy.*;
-
-/**
- * This annotation specifies the version field or property of an entity class that serves as its
- * optimistic lock value. The version is used to ensure integrity when performing the merge
- * operation and for optimistic concurrency control.
- *
- * Only a single Version property or field should be used per class; applications that use more
- * than one Version property or field will not be portable.
- *
- * The Version property should be mapped to the primary table for the entity class; applications
- * that map the Version property to a table other than the primary table will not be portable.
- *
- * The following types are supported for version properties: int, Integer, short, Short, long,
- * Long, Timestamp.
- *
- * @author Emmanuel Bernard
- */
- at Target({METHOD, FIELD}) @Retention(RUNTIME)
-public @interface Version {}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/Version.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/Version.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/Version.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.Target;
+
+import static java.lang.annotation.ElementType.*;
+import static java.lang.annotation.RetentionPolicy.*;
+
+/**
+ * This annotation specifies the version field or property of an entity class that serves as its
+ * optimistic lock value. The version is used to ensure integrity when performing the merge
+ * operation and for optimistic concurrency control.
+ *
+ * Only a single Version property or field should be used per class; applications that use more
+ * than one Version property or field will not be portable.
+ *
+ * The Version property should be mapped to the primary table for the entity class; applications
+ * that map the Version property to a table other than the primary table will not be portable.
+ *
+ * The following types are supported for version properties: int, Integer, short, Short, long,
+ * Long, Timestamp.
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({METHOD, FIELD}) @Retention(RUNTIME)
+public @interface Version {}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/package-info.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/package-info.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,9 +0,0 @@
-//$Id:$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-
-/**
- * The javax.persistence package contains the classes and interfaces that define the contracts
- * between a persistence provider and the managed classes and the clients of the Java Persistence API.
- */
-package javax.persistence;
-
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/package-info.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/package-info.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/package-info.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,9 @@
+//$Id:$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+
+/**
+ * The javax.persistence package contains the classes and interfaces that define the contracts
+ * between a persistence provider and the managed classes and the clients of the Java Persistence API.
+ */
+package javax.persistence;
+
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/spi (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi)
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/spi/ClassTransformer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi/ClassTransformer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/spi/ClassTransformer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence.spi;
-
-import java.security.ProtectionDomain;
-import java.lang.instrument.IllegalClassFormatException;
-
-/**
- * A persistence provider provides an instance of this interface
- * to the PersistenceUnitInfo.addTransformer method.
- * The supplied transformer instance will get called to transform
- * entity class files when they are loaded and redefined. The transformation
- * occurs before the class is defined by the JVM
- *
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- * @version $Revision$
- */
-public interface ClassTransformer
-{
- /**
- * Invoked when a class is being loaded or redefined to add hooks for persistence bytecode manipulation
- *
- * @param loader the defining class loaderof the class being transformed. It may be null if using bootstrap loader
- * @param classname The name of the class being transformed
- * @param classBeingRedefined If an already loaded class is being redefined, then pass this as a parameter
- * @param protectionDomain ProtectionDomain of the class being (re)-defined
- * @param classfileBuffer The input byte buffer in class file format
- * @return A well-formed class file that can be loaded
- *
- * @throws IllegalClassFormatException
- */
- byte[] transform(ClassLoader loader,
- String classname,
- Class<?> classBeingRedefined,
- ProtectionDomain protectionDomain,
- byte[] classfileBuffer)
- throws IllegalClassFormatException;
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/spi/ClassTransformer.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi/ClassTransformer.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/spi/ClassTransformer.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/spi/ClassTransformer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence.spi;
+
+import java.security.ProtectionDomain;
+import java.lang.instrument.IllegalClassFormatException;
+
+/**
+ * A persistence provider provides an instance of this interface
+ * to the PersistenceUnitInfo.addTransformer method.
+ * The supplied transformer instance will get called to transform
+ * entity class files when they are loaded and redefined. The transformation
+ * occurs before the class is defined by the JVM
+ *
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ * @version $Revision$
+ */
+public interface ClassTransformer
+{
+ /**
+ * Invoked when a class is being loaded or redefined to add hooks for persistence bytecode manipulation
+ *
+ * @param loader the defining class loaderof the class being transformed. It may be null if using bootstrap loader
+ * @param classname The name of the class being transformed
+ * @param classBeingRedefined If an already loaded class is being redefined, then pass this as a parameter
+ * @param protectionDomain ProtectionDomain of the class being (re)-defined
+ * @param classfileBuffer The input byte buffer in class file format
+ * @return A well-formed class file that can be loaded
+ *
+ * @throws IllegalClassFormatException
+ */
+ byte[] transform(ClassLoader loader,
+ String classname,
+ Class<?> classBeingRedefined,
+ ProtectionDomain protectionDomain,
+ byte[] classfileBuffer)
+ throws IllegalClassFormatException;
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceProvider.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceProvider.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence.spi;
-
-import java.util.Map;
-import javax.persistence.EntityManagerFactory;
-
-/**
- * Interface implemented by the persistence provider.
- * This interface is used to create an EntityManagerFactory.
- * It is invoked by the container in Java EE environments and
- * by the Persistence class in Java SE environments.
- */
-public interface PersistenceProvider {
- /**
- * Called by Persistence class when an EntityManagerFactory
- * is to be created.
- *
- * @param emName The name of the persistence unit
- * @param map A Map of properties for use by the
- * persistence provider. These properties may be used to
- * override the values of the corresponding elements in
- * the persistence.xml file or specify values for
- * properties not specified in the persistence.xml
- * (and may be null if no properties are specified).
- * @return EntityManagerFactory for the persistence unit,
- * or null if the provider is not the right provider
- */
- public EntityManagerFactory createEntityManagerFactory(String emName, Map map);
-
- /**
- * Called by the container when an EntityManagerFactory
- * is to be created.
- *
- * @param info Metadata for use by the persistence provider
- * @param map A Map of integration-level properties for use
- * by the persistence provider (may be null if no properties
- * are specified).
- * @return EntityManagerFactory for the persistence unit
- * specified by the metadata
- */
- public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map);
-}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceProvider.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceProvider.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceProvider.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence.spi;
+
+import java.util.Map;
+import javax.persistence.EntityManagerFactory;
+
+/**
+ * Interface implemented by the persistence provider.
+ * This interface is used to create an EntityManagerFactory.
+ * It is invoked by the container in Java EE environments and
+ * by the Persistence class in Java SE environments.
+ */
+public interface PersistenceProvider {
+ /**
+ * Called by Persistence class when an EntityManagerFactory
+ * is to be created.
+ *
+ * @param emName The name of the persistence unit
+ * @param map A Map of properties for use by the
+ * persistence provider. These properties may be used to
+ * override the values of the corresponding elements in
+ * the persistence.xml file or specify values for
+ * properties not specified in the persistence.xml
+ * (and may be null if no properties are specified).
+ * @return EntityManagerFactory for the persistence unit,
+ * or null if the provider is not the right provider
+ */
+ public EntityManagerFactory createEntityManagerFactory(String emName, Map map);
+
+ /**
+ * Called by the container when an EntityManagerFactory
+ * is to be created.
+ *
+ * @param info Metadata for use by the persistence provider
+ * @param map A Map of integration-level properties for use
+ * by the persistence provider (may be null if no properties
+ * are specified).
+ * @return EntityManagerFactory for the persistence unit
+ * specified by the metadata
+ */
+ public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map map);
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitInfo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitInfo.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitInfo.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,142 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.package javax.persistence.spi;
-package javax.persistence.spi;
-
-import java.net.URL;
-import java.util.List;
-import java.util.Properties;
-import javax.sql.DataSource;
-
-/**
- * Interface implemented by the container and used by the
- * persistence provider when creating an EntityManagerFactory.
- */
-public interface PersistenceUnitInfo {
- /**
- * @return The name of the persistence unit.
- * Corresponds to the <name> element in the persistence.xml file.
- */
- public String getPersistenceUnitName();
-
- /**
- * @return The fully qualified name of the persistence provider
- * implementation class.
- * Corresponds to the <provider> element in the persistence.xml
- * file.
- */
- public String getPersistenceProviderClassName();
-
- /**
- * @return The transaction type of the entity managers created
- * by the EntityManagerFactory.
- * The transaction type corresponds to the transaction-type
- * attribute in the persistence.xml file.
- */
- public PersistenceUnitTransactionType getTransactionType();
-
- /**
- * @return The JTA-enabled data source to be used by the
- * persistence provider.
- * The data source corresponds to the <jta-data-source>
- * element in the persistence.xml file or is provided at
- * deployment or by the container.
- */
- public DataSource getJtaDataSource();
-
- /**
- * @return The non-JTA-enabled data source to be used by the
- * persistence provider for accessing data outside a JTA
- * transaction.
- * The data source corresponds to the named <non-jta-data-source>
- * element in the persistence.xml file or provided at
- * deployment or by the container.
- */
- public DataSource getNonJtaDataSource();
-
- /**
- * @return The list of mapping file names that the persistence
- * provider must load to determine the mappings for the entity
- * classes. The mapping files must be in the standard XML
- * mapping format, be uniquely named and be resource-loadable
- * from the application classpath.
- * Each mapping file name corresponds to a <mapping-file>
- * element in the persistence.xml file.
- */
- public List<String> getMappingFileNames();
-
- /**
- * @return The list of JAR file URLs that the persistence
- * provider must examine for managed classes of the persistence
- * unit. Each jar file URL corresponds to a named <jar-file>
- * element in the persistence.xml file.
- */
- public List<URL> getJarFileUrls();
-
- /**
- * @return The URL for the jar file or directory that is the
- * root of the persistence unit. (If the persistence unit is
- * rooted in the WEB-INF/classes directory, this will be the
- * URL of that directory.)
- */
- public URL getPersistenceUnitRootUrl();
-
- /**
- * @return The list of the names of the classes that the
- * persistence provider must add it to its set of managed
- * classes. Each name corresponds to a named <class> element
- * in the persistence.xml file.
- */
- public List<String> getManagedClassNames();
-
- /**
- * @return Whether classes in the root of the persistence
- * unit that have not been explicitly listed are to be
- * included in the set of managed classes.
- * This value corresponds to the <exclude-unlisted-classes>
- * element in the persistence.xml file.
- */
- public boolean excludeUnlistedClasses();
-
- /**
- * @return Properties object. Each property corresponds
- * to a <property> element in the persistence.xml file
- */
- public Properties getProperties();
-
- /**
- * @return ClassLoader that the provider may use to load any
- * classes, resources, or open URLs.
- */
- public ClassLoader getClassLoader();
-
- /**
- * Add a transformer supplied by the provider that will be
- * called for every new class definition or class redefinition
- * that gets loaded by the loader returned by the
- * PersistenceInfo.getClassLoader method. The transformer
- * has no effect on the result returned by the
- * PersistenceInfo.getTempClassLoader method.
- * Classes are only transformed once within the same classloading
- * scope, regardless of how many persistence units they may be
- * a part of.
- *
- * @param transformer A provider-supplied transformer that the
- * Container invokes at class-(re)definition time
- */
- public void addTransformer(ClassTransformer transformer);
-
- /**
- * Return a new instance of a ClassLoader that the provider
- * may use to temporarily load any classes, resources, or
- * open URLs. The scope and classpath of this loader is
- * exactly the same as that of the loader returned by
- * PersistenceInfo.getClassLoader. None of the classes loaded
- * by this class loader will be visible to application
- * components. The container does not use or maintain references
- * to this class loader after returning it to the provider.
- *
- * @return Temporary ClassLoader with same visibility as current
- * loader
- */
- public ClassLoader getNewTempClassLoader();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitInfo.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitInfo.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitInfo.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitInfo.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,142 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.package javax.persistence.spi;
+package javax.persistence.spi;
+
+import java.net.URL;
+import java.util.List;
+import java.util.Properties;
+import javax.sql.DataSource;
+
+/**
+ * Interface implemented by the container and used by the
+ * persistence provider when creating an EntityManagerFactory.
+ */
+public interface PersistenceUnitInfo {
+ /**
+ * @return The name of the persistence unit.
+ * Corresponds to the <name> element in the persistence.xml file.
+ */
+ public String getPersistenceUnitName();
+
+ /**
+ * @return The fully qualified name of the persistence provider
+ * implementation class.
+ * Corresponds to the <provider> element in the persistence.xml
+ * file.
+ */
+ public String getPersistenceProviderClassName();
+
+ /**
+ * @return The transaction type of the entity managers created
+ * by the EntityManagerFactory.
+ * The transaction type corresponds to the transaction-type
+ * attribute in the persistence.xml file.
+ */
+ public PersistenceUnitTransactionType getTransactionType();
+
+ /**
+ * @return The JTA-enabled data source to be used by the
+ * persistence provider.
+ * The data source corresponds to the <jta-data-source>
+ * element in the persistence.xml file or is provided at
+ * deployment or by the container.
+ */
+ public DataSource getJtaDataSource();
+
+ /**
+ * @return The non-JTA-enabled data source to be used by the
+ * persistence provider for accessing data outside a JTA
+ * transaction.
+ * The data source corresponds to the named <non-jta-data-source>
+ * element in the persistence.xml file or provided at
+ * deployment or by the container.
+ */
+ public DataSource getNonJtaDataSource();
+
+ /**
+ * @return The list of mapping file names that the persistence
+ * provider must load to determine the mappings for the entity
+ * classes. The mapping files must be in the standard XML
+ * mapping format, be uniquely named and be resource-loadable
+ * from the application classpath.
+ * Each mapping file name corresponds to a <mapping-file>
+ * element in the persistence.xml file.
+ */
+ public List<String> getMappingFileNames();
+
+ /**
+ * @return The list of JAR file URLs that the persistence
+ * provider must examine for managed classes of the persistence
+ * unit. Each jar file URL corresponds to a named <jar-file>
+ * element in the persistence.xml file.
+ */
+ public List<URL> getJarFileUrls();
+
+ /**
+ * @return The URL for the jar file or directory that is the
+ * root of the persistence unit. (If the persistence unit is
+ * rooted in the WEB-INF/classes directory, this will be the
+ * URL of that directory.)
+ */
+ public URL getPersistenceUnitRootUrl();
+
+ /**
+ * @return The list of the names of the classes that the
+ * persistence provider must add it to its set of managed
+ * classes. Each name corresponds to a named <class> element
+ * in the persistence.xml file.
+ */
+ public List<String> getManagedClassNames();
+
+ /**
+ * @return Whether classes in the root of the persistence
+ * unit that have not been explicitly listed are to be
+ * included in the set of managed classes.
+ * This value corresponds to the <exclude-unlisted-classes>
+ * element in the persistence.xml file.
+ */
+ public boolean excludeUnlistedClasses();
+
+ /**
+ * @return Properties object. Each property corresponds
+ * to a <property> element in the persistence.xml file
+ */
+ public Properties getProperties();
+
+ /**
+ * @return ClassLoader that the provider may use to load any
+ * classes, resources, or open URLs.
+ */
+ public ClassLoader getClassLoader();
+
+ /**
+ * Add a transformer supplied by the provider that will be
+ * called for every new class definition or class redefinition
+ * that gets loaded by the loader returned by the
+ * PersistenceInfo.getClassLoader method. The transformer
+ * has no effect on the result returned by the
+ * PersistenceInfo.getTempClassLoader method.
+ * Classes are only transformed once within the same classloading
+ * scope, regardless of how many persistence units they may be
+ * a part of.
+ *
+ * @param transformer A provider-supplied transformer that the
+ * Container invokes at class-(re)definition time
+ */
+ public void addTransformer(ClassTransformer transformer);
+
+ /**
+ * Return a new instance of a ClassLoader that the provider
+ * may use to temporarily load any classes, resources, or
+ * open URLs. The scope and classpath of this loader is
+ * exactly the same as that of the loader returned by
+ * PersistenceInfo.getClassLoader. None of the classes loaded
+ * by this class loader will be visible to application
+ * components. The container does not use or maintain references
+ * to this class loader after returning it to the provider.
+ *
+ * @return Temporary ClassLoader with same visibility as current
+ * loader
+ */
+ public ClassLoader getNewTempClassLoader();
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitTransactionType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitTransactionType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitTransactionType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-package javax.persistence.spi;
-
-/**
- * This enum class defines whether the entity managers created by the EntityManagerFactory will be
- * JTA or resource-local entity managers.
- *
- * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
- */
-public enum PersistenceUnitTransactionType {
- /**
- * JTA entity manager
- */
- JTA,
- /**
- * Resource-local entity manager
- */
- RESOURCE_LOCAL
-}
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitTransactionType.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitTransactionType.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitTransactionType.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/spi/PersistenceUnitTransactionType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+package javax.persistence.spi;
+
+/**
+ * This enum class defines whether the entity managers created by the EntityManagerFactory will be
+ * JTA or resource-local entity managers.
+ *
+ * @author <a href="mailto:bill at jboss.org">Bill Burke</a>
+ */
+public enum PersistenceUnitTransactionType {
+ /**
+ * JTA entity manager
+ */
+ JTA,
+ /**
+ * Resource-local entity manager
+ */
+ RESOURCE_LOCAL
+}
Deleted: trunk/HibernateExt/jpa-api/src/javax/persistence/spi/package-info.java
===================================================================
--- branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi/package-info.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/spi/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-//$Id:$
-//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
-
-/**
- * The javax.persistence.spi package defines the classes and interfaces that are implemented by the
- * persistence provider and the Java EE container for use by the container, provider, and/or Persistence
- * bootstrap class in deployment and bootstrapping.
- */
-package javax.persistence.spi;
-
Copied: trunk/HibernateExt/jpa-api/src/javax/persistence/spi/package-info.java (from rev 11279, branches/Branch_3_2/HibernateExt/jpa-api/src/javax/persistence/spi/package-info.java)
===================================================================
--- trunk/HibernateExt/jpa-api/src/javax/persistence/spi/package-info.java (rev 0)
+++ trunk/HibernateExt/jpa-api/src/javax/persistence/spi/package-info.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+//$Id:$
+//EJB3 Specification Copyright 2004-2006 Sun Microsystems, Inc.
+
+/**
+ * The javax.persistence.spi package defines the classes and interfaces that are implemented by the
+ * persistence provider and the Java EE container for use by the container, provider, and/or Persistence
+ * bootstrap class in deployment and bootstrapping.
+ */
+package javax.persistence.spi;
+
Copied: trunk/HibernateExt/search (from rev 11279, branches/Branch_3_2/HibernateExt/search)
Deleted: trunk/HibernateExt/search/build.properties.dist
===================================================================
--- branches/Branch_3_2/HibernateExt/search/build.properties.dist 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/build.properties.dist 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,10 +0,0 @@
-common.dir=.
-src.dir=src
-test.dir=test
-hibernate-core.home=../hibernate-3.2
-
-#locally present jars
-jpa-api.jar=./lib/ejb3-persistence.jar
-commons-annotations.jar=./lib/hibernate-commons-annotations.jar
-annotations.jar=./lib/test/hibernate-annotations.jar
-validator.jar=./lib/test/hibernate-validator.jar
\ No newline at end of file
Copied: trunk/HibernateExt/search/build.properties.dist (from rev 11279, branches/Branch_3_2/HibernateExt/search/build.properties.dist)
===================================================================
--- trunk/HibernateExt/search/build.properties.dist (rev 0)
+++ trunk/HibernateExt/search/build.properties.dist 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,10 @@
+common.dir=.
+src.dir=src
+test.dir=test
+hibernate-core.home=../hibernate-3.2
+
+#locally present jars
+jpa-api.jar=./lib/ejb3-persistence.jar
+commons-annotations.jar=./lib/hibernate-commons-annotations.jar
+annotations.jar=./lib/test/hibernate-annotations.jar
+validator.jar=./lib/test/hibernate-validator.jar
\ No newline at end of file
Deleted: trunk/HibernateExt/search/build.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/search/build.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,285 +0,0 @@
-<!--
-
- Hibernate Annotations ANT build script.
-
- You need JDK 5.0 installed to build Hibernate Annotations.
-
--->
-
-<project name="Hibernate Search" default="dist" basedir=".">
-
- <!-- Give user a chance to override without editing this file
- (and without typing -D each time it compiles it) -->
- <property file="build.properties"/>
- <property file="${user.home}/.ant.properties"/>
-
- <!-- Name of project and version, used to create filenames -->
- <property name="Name" value="Hibernate Search"/>
- <property name="name" value="hibernate-search"/>
- <property name="version" value="3.2.2.beta1"/>
- <property name="javadoc.packagenames" value="org.hibernate.search.*"/>
- <property name="copy.test" value="true"/>
- <property name="javac.source" value="1.5"/>
- <property name="javac.target" value="1.5"/>
- <property name="jdbc.dir" value="jdbc"/>
- <property name="common.dir" value="${basedir}/../common"/>
-
- <property name="jpa-api.jar" value="${basedir}/../jpa-api/build/ejb3-persistence.jar"/>
- <property name="annotations.jar"
- value="${basedir}/../annotations/target/hibernate-annotations/hibernate-annotations.jar"/>
- <property name="commons-annotations.jar"
- value="${basedir}/../commons-annotations/target/hibernate-commons-annotations/hibernate-commons-annotations.jar"/>
-
- <import file="${common.dir}/common-build.xml"/>
-
-
- <property name="build.testresources.dir" value="${build.dir}/testresources"/>
- <property name="testresources.dir" value="${basedir}/src/test-resources"/>
-
- <!-- override order for JBossXB to bootstrap properly -->
- <path id="junit.classpath">
- <fileset dir="${lib.dir}">
- <include name="*.jar"/>
- </fileset>
- <pathelement path="${classes.dir}"/>
- <pathelement path="${testclasses.dir}"/>
- <path refid="junit.moduleclasspath"/>
- <path refid="lib.class.path"/>
- <path location="${clover.jar}"/>
- </path>
- <!-- override order for JBossXB to bootstrap properly -->
- <path id="lib.class.path">
- <path location="${hibernate-core.jar}"></path>
- <fileset dir="${hibernate-core.lib.dir}">
- <include name="*.jar"/>
- <exclude name="xml-apis.jar"/>
- <exclude name="xerces*.jar"/>
- </fileset>
- <fileset dir="${lib.dir}">
- <include name="*.jar"/>
- </fileset>
- <path refid="lib.moduleclass.path"/>
- <pathelement path="${clover.jar}"/>
- </path>
-
-
- <path id="lib.moduleclass.path">
- <pathelement location="${jpa-api.jar}"/>
- <pathelement location="${commons-annotations.jar}"/>
- </path>
- <path id="junit.moduleclasspath">
- <!-- order matters for JBoss XB proper bootstrap -->
- <fileset dir="${lib.dir}/test">
- <include name="*.jar"/>
- <include name="*.zip"/>
- </fileset>
- <pathelement location="${src.dir}"/>
- <pathelement location="${test.dir}"/>
- <pathelement location="${annotations.jar}"/>
- <fileset dir="${jdbc.dir}">
- <include name="*.jar"/>
- <include name="*.zip"/>
- </fileset>
- </path>
-
- <target name="init">
- <antcall target="common-build.init"/>
- <!-- check for dependency artefacts -->
- <available file="${jpa-api.jar}" type="file" property="jpa-api.jar.available"/>
- <available file="${commons-annotations.jar}" type="file" property="commons-annotations.jar.available"/>
- <available file="${annotations.jar}" type="file" property="annotations.jar.available"/>
- <mkdir dir="${lib.dir}/test"/>
- <mkdir dir="${build.testresources.dir}"/>
- </target>
-
- <target name="get.jpa-api" depends="init" unless="jpa-api.jar.available">
- <ant inheritall="false" dir="${basedir}/../jpa-api" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../jpa-api" target="jar"/>
- </target>
-
- <target name="get.commons-annotations" depends="init" unless="commons-annotations.jar.available">
- <ant inheritall="false" dir="${basedir}/../commons-annotations" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../commons-annotations" target="jar"/>
- </target>
-
- <target name="get.annotations" depends="init" unless="annotations.jar.available">
- <ant inheritall="false" dir="${basedir}/../annotations" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../annotations" target="jar"/>
- </target>
-
- <target name="compile" depends="init,get.commons-annotations" description="Compile the Java source code">
- <available
- classname="org.eclipse.core.launcher.Main"
- property="build.compiler"
- value="org.eclipse.jdt.core.JDTCompilerAdapter"
- classpath="${java.class.path}"/>
- <javac
- srcdir="${src.dir}"
- destdir="${classes.dir}"
- classpathref="lib.class.path"
- debug="${javac.debug}"
- optimize="${javac.optimize}"
- nowarn="on"
- source="${javac.source}"
- target="${javac.target}">
- <src path="${src.dir}"/>
- </javac>
- <copy todir="${classes.dir}">
- <fileset dir="${src.dir}">
- <include name="**/resources/*.properties"/>
- <include name="**/*.xsd"/>
- </fileset>
- </copy>
- </target>
-
- <target name="compiletest" depends="init,get.jpa-api,get.annotations,compile" description="Compile the tests">
- <available
- classname="org.eclipse.core.launcher.Main"
- property="build.compiler"
- value="org.eclipse.jdt.core.JDTCompilerAdapter"
- classpath="${java.class.path}"/>
- <javac
- destdir="${testclasses.dir}"
- classpathref="junit.classpath"
- debug="${javac.debug}"
- optimize="${javac.optimize}"
- nowarn="on"
- source="${javac.source}"
- target="${javac.target}">
- <src refid="testsrc.path"/>
- </javac>
- </target>
-
- <target name="prepare-test-resources" depends="compiletest">
- <copy todir="${build.testresources.dir}">
- <fileset dir="${testresources.dir}">
- <include name="**/*.*"/>
- </fileset>
- </copy>
- <mkdir dir="${build.testresources.dir}/jars"/>
- <jar filesetmanifest="merge" jarfile="${build.testresources.dir}/jars/jms-slave.jar" >
- <fileset dir="${testclasses.dir}">
- <include name="org/hibernate/search/test/jms/slave/**.*"/>
- </fileset>
- </jar>
- <jar filesetmanifest="merge" jarfile="${build.testresources.dir}/jars/jms-master.jar" >
- <fileset dir="${testclasses.dir}">
- <include name="org/hibernate/search/test/jms/master/**.*"/>
- </fileset>
- </jar>
- </target>
-
- <target name="junit" depends="compiletest, prepare-test-resources">
- <mkdir dir="test_output"/>
- <junit forkmode="once" printsummary="yes" haltonfailure="yes">
- <classpath>
- <path path="${build.testresources.dir}"/>
- <!-- dirset dir="${build.testresources.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.par"/>
- </dirset -->
- <path refid="junit.classpath"/>
-
- <fileset dir="${jdbc.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.zip"/>
- </fileset>
- </classpath>
- <formatter type="plain"/>
- <formatter type="xml"/>
- <batchtest fork="yes" todir="test_output" haltonfailure="no">
- <fileset refid="junit.batchtestset"/>
- </batchtest>
- </junit>
- </target>
-
- <!-- Run a single unit test. -->
- <target name="junitsingle" depends="compiletest"
- description="Run a single test suite (requires testname and jdbc.driver properties)">
- <mkdir dir="test_output"/>
- <junit printsummary="yes" fork="yes" haltonfailure="yes">
- <classpath>
- <fileset dir="${jdbc.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.zip"/>
- </fileset>
- <path refid="lib.class.path"/>
- <pathelement path="${classes.dir}"/>
- <pathelement path="${src.dir}"/>
- <!-- pick up properties from here -->
- <pathelement path="${test.dir}"/>
- <!-- pick up mappings from here -->
- </classpath>
- <formatter type="plain"/>
- <formatter type="xml"/>
- <test fork="yes" todir="test_output" haltonfailure="no" name="${testname}"/>
- </junit>
- </target>
-
- <!-- target name="report">
- <mkdir dir="test_output"/>
- <junitreport todir="test_output">
- <fileset dir="test_output">
- <include name="TEST-*.xml"/>
- </fileset>
- <report format="frames" todir="test_output/report"/>
- </junitreport>
- </target -->
-
- <target name="jar" depends="compile" description="Build the distribution .jar file">
- <mkdir dir="${classes.dir}/META-INF"/>
- <manifest file="${classes.dir}/META-INF/MANIFEST.MF">
- <attribute name="Product" value="${Name}"/>
- <attribute name="Version" value="${version}"/>
- </manifest>
- <antcall target="common-build.jar"/>
- </target>
-
- <!-- target name="javadoc" description="Compile the Javadoc API documentation to dist dir">
- <echo>Skipping java doc since ant's javadoc task cannot handle an alternative javadoc</echo>
- </target -->
-
-
- <!-- Some of this can probably be moved to common-build... -->
- <target name="dist" depends="jar,javadoc,copysource,copytest,copylib,extras"
- description="Build everything">
-
- <ant inheritall="false" dir="${basedir}/doc/reference"/>
- <copy todir="${dist.dir}/doc/reference" failonerror="false">
- <fileset dir="${basedir}/doc/reference/build">
- <include name="**/*.*"/>
- </fileset>
- </copy>
-
- <copy todir="${dist.dir}" failonerror="false">
- <fileset dir="${common.dir}">
- <include name="common-build.xml"/>
- </fileset>
- </copy>
-
- <!-- copy dependencies -->
- <copy todir="${dist.lib.dir}" failonerror="false">
- <fileset file="${jpa-api.jar}"/>
- <fileset file="${commons-annotations.jar}"/>
- </copy>
- <mkdir dir="${dist.lib.dir}/test"/>
- <copy todir="${dist.lib.dir}/test" failonerror="false">
- <fileset file="${annotations.jar}"/>
- </copy>
-
- <copy file="${basedir}/build.properties.dist" tofile="${dist.dir}/build.properties" failonerror="false">
- </copy>
- <antcall target="common-build.dist"/>
- </target>
-
- <target name="zip-dist" description="zip the dist">
- <zip zipfile="${dist.dir}-${version}.zip">
- <zipfileset prefix="${name}-${version}" dir="${dist.dir}"/>
- </zip>
- <tar compression="gzip" tarfile="${dist.dir}-${version}.tar.gz">
- <tarfileset prefix="${name}-${version}" dir="${dist.dir}"/>
- </tar>
- </target>
-
-
-</project>
Copied: trunk/HibernateExt/search/build.xml (from rev 11279, branches/Branch_3_2/HibernateExt/search/build.xml)
===================================================================
--- trunk/HibernateExt/search/build.xml (rev 0)
+++ trunk/HibernateExt/search/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,285 @@
+<!--
+
+ Hibernate Annotations ANT build script.
+
+ You need JDK 5.0 installed to build Hibernate Annotations.
+
+-->
+
+<project name="Hibernate Search" default="dist" basedir=".">
+
+ <!-- Give user a chance to override without editing this file
+ (and without typing -D each time it compiles it) -->
+ <property file="build.properties"/>
+ <property file="${user.home}/.ant.properties"/>
+
+ <!-- Name of project and version, used to create filenames -->
+ <property name="Name" value="Hibernate Search"/>
+ <property name="name" value="hibernate-search"/>
+ <property name="version" value="3.2.2.beta1"/>
+ <property name="javadoc.packagenames" value="org.hibernate.search.*"/>
+ <property name="copy.test" value="true"/>
+ <property name="javac.source" value="1.5"/>
+ <property name="javac.target" value="1.5"/>
+ <property name="jdbc.dir" value="jdbc"/>
+ <property name="common.dir" value="${basedir}/../common"/>
+
+ <property name="jpa-api.jar" value="${basedir}/../jpa-api/build/ejb3-persistence.jar"/>
+ <property name="annotations.jar"
+ value="${basedir}/../annotations/target/hibernate-annotations/hibernate-annotations.jar"/>
+ <property name="commons-annotations.jar"
+ value="${basedir}/../commons-annotations/target/hibernate-commons-annotations/hibernate-commons-annotations.jar"/>
+
+ <import file="${common.dir}/common-build.xml"/>
+
+
+ <property name="build.testresources.dir" value="${build.dir}/testresources"/>
+ <property name="testresources.dir" value="${basedir}/src/test-resources"/>
+
+ <!-- override order for JBossXB to bootstrap properly -->
+ <path id="junit.classpath">
+ <fileset dir="${lib.dir}">
+ <include name="*.jar"/>
+ </fileset>
+ <pathelement path="${classes.dir}"/>
+ <pathelement path="${testclasses.dir}"/>
+ <path refid="junit.moduleclasspath"/>
+ <path refid="lib.class.path"/>
+ <path location="${clover.jar}"/>
+ </path>
+ <!-- override order for JBossXB to bootstrap properly -->
+ <path id="lib.class.path">
+ <path location="${hibernate-core.jar}"></path>
+ <fileset dir="${hibernate-core.lib.dir}">
+ <include name="*.jar"/>
+ <exclude name="xml-apis.jar"/>
+ <exclude name="xerces*.jar"/>
+ </fileset>
+ <fileset dir="${lib.dir}">
+ <include name="*.jar"/>
+ </fileset>
+ <path refid="lib.moduleclass.path"/>
+ <pathelement path="${clover.jar}"/>
+ </path>
+
+
+ <path id="lib.moduleclass.path">
+ <pathelement location="${jpa-api.jar}"/>
+ <pathelement location="${commons-annotations.jar}"/>
+ </path>
+ <path id="junit.moduleclasspath">
+ <!-- order matters for JBoss XB proper bootstrap -->
+ <fileset dir="${lib.dir}/test">
+ <include name="*.jar"/>
+ <include name="*.zip"/>
+ </fileset>
+ <pathelement location="${src.dir}"/>
+ <pathelement location="${test.dir}"/>
+ <pathelement location="${annotations.jar}"/>
+ <fileset dir="${jdbc.dir}">
+ <include name="*.jar"/>
+ <include name="*.zip"/>
+ </fileset>
+ </path>
+
+ <target name="init">
+ <antcall target="common-build.init"/>
+ <!-- check for dependency artefacts -->
+ <available file="${jpa-api.jar}" type="file" property="jpa-api.jar.available"/>
+ <available file="${commons-annotations.jar}" type="file" property="commons-annotations.jar.available"/>
+ <available file="${annotations.jar}" type="file" property="annotations.jar.available"/>
+ <mkdir dir="${lib.dir}/test"/>
+ <mkdir dir="${build.testresources.dir}"/>
+ </target>
+
+ <target name="get.jpa-api" depends="init" unless="jpa-api.jar.available">
+ <ant inheritall="false" dir="${basedir}/../jpa-api" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../jpa-api" target="jar"/>
+ </target>
+
+ <target name="get.commons-annotations" depends="init" unless="commons-annotations.jar.available">
+ <ant inheritall="false" dir="${basedir}/../commons-annotations" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../commons-annotations" target="jar"/>
+ </target>
+
+ <target name="get.annotations" depends="init" unless="annotations.jar.available">
+ <ant inheritall="false" dir="${basedir}/../annotations" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../annotations" target="jar"/>
+ </target>
+
+ <target name="compile" depends="init,get.commons-annotations" description="Compile the Java source code">
+ <available
+ classname="org.eclipse.core.launcher.Main"
+ property="build.compiler"
+ value="org.eclipse.jdt.core.JDTCompilerAdapter"
+ classpath="${java.class.path}"/>
+ <javac
+ srcdir="${src.dir}"
+ destdir="${classes.dir}"
+ classpathref="lib.class.path"
+ debug="${javac.debug}"
+ optimize="${javac.optimize}"
+ nowarn="on"
+ source="${javac.source}"
+ target="${javac.target}">
+ <src path="${src.dir}"/>
+ </javac>
+ <copy todir="${classes.dir}">
+ <fileset dir="${src.dir}">
+ <include name="**/resources/*.properties"/>
+ <include name="**/*.xsd"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="compiletest" depends="init,get.jpa-api,get.annotations,compile" description="Compile the tests">
+ <available
+ classname="org.eclipse.core.launcher.Main"
+ property="build.compiler"
+ value="org.eclipse.jdt.core.JDTCompilerAdapter"
+ classpath="${java.class.path}"/>
+ <javac
+ destdir="${testclasses.dir}"
+ classpathref="junit.classpath"
+ debug="${javac.debug}"
+ optimize="${javac.optimize}"
+ nowarn="on"
+ source="${javac.source}"
+ target="${javac.target}">
+ <src refid="testsrc.path"/>
+ </javac>
+ </target>
+
+ <target name="prepare-test-resources" depends="compiletest">
+ <copy todir="${build.testresources.dir}">
+ <fileset dir="${testresources.dir}">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+ <mkdir dir="${build.testresources.dir}/jars"/>
+ <jar filesetmanifest="merge" jarfile="${build.testresources.dir}/jars/jms-slave.jar" >
+ <fileset dir="${testclasses.dir}">
+ <include name="org/hibernate/search/test/jms/slave/**.*"/>
+ </fileset>
+ </jar>
+ <jar filesetmanifest="merge" jarfile="${build.testresources.dir}/jars/jms-master.jar" >
+ <fileset dir="${testclasses.dir}">
+ <include name="org/hibernate/search/test/jms/master/**.*"/>
+ </fileset>
+ </jar>
+ </target>
+
+ <target name="junit" depends="compiletest, prepare-test-resources">
+ <mkdir dir="test_output"/>
+ <junit forkmode="once" printsummary="yes" haltonfailure="yes">
+ <classpath>
+ <path path="${build.testresources.dir}"/>
+ <!-- dirset dir="${build.testresources.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.par"/>
+ </dirset -->
+ <path refid="junit.classpath"/>
+
+ <fileset dir="${jdbc.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.zip"/>
+ </fileset>
+ </classpath>
+ <formatter type="plain"/>
+ <formatter type="xml"/>
+ <batchtest fork="yes" todir="test_output" haltonfailure="no">
+ <fileset refid="junit.batchtestset"/>
+ </batchtest>
+ </junit>
+ </target>
+
+ <!-- Run a single unit test. -->
+ <target name="junitsingle" depends="compiletest"
+ description="Run a single test suite (requires testname and jdbc.driver properties)">
+ <mkdir dir="test_output"/>
+ <junit printsummary="yes" fork="yes" haltonfailure="yes">
+ <classpath>
+ <fileset dir="${jdbc.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.zip"/>
+ </fileset>
+ <path refid="lib.class.path"/>
+ <pathelement path="${classes.dir}"/>
+ <pathelement path="${src.dir}"/>
+ <!-- pick up properties from here -->
+ <pathelement path="${test.dir}"/>
+ <!-- pick up mappings from here -->
+ </classpath>
+ <formatter type="plain"/>
+ <formatter type="xml"/>
+ <test fork="yes" todir="test_output" haltonfailure="no" name="${testname}"/>
+ </junit>
+ </target>
+
+ <!-- target name="report">
+ <mkdir dir="test_output"/>
+ <junitreport todir="test_output">
+ <fileset dir="test_output">
+ <include name="TEST-*.xml"/>
+ </fileset>
+ <report format="frames" todir="test_output/report"/>
+ </junitreport>
+ </target -->
+
+ <target name="jar" depends="compile" description="Build the distribution .jar file">
+ <mkdir dir="${classes.dir}/META-INF"/>
+ <manifest file="${classes.dir}/META-INF/MANIFEST.MF">
+ <attribute name="Product" value="${Name}"/>
+ <attribute name="Version" value="${version}"/>
+ </manifest>
+ <antcall target="common-build.jar"/>
+ </target>
+
+ <!-- target name="javadoc" description="Compile the Javadoc API documentation to dist dir">
+ <echo>Skipping java doc since ant's javadoc task cannot handle an alternative javadoc</echo>
+ </target -->
+
+
+ <!-- Some of this can probably be moved to common-build... -->
+ <target name="dist" depends="jar,javadoc,copysource,copytest,copylib,extras"
+ description="Build everything">
+
+ <ant inheritall="false" dir="${basedir}/doc/reference"/>
+ <copy todir="${dist.dir}/doc/reference" failonerror="false">
+ <fileset dir="${basedir}/doc/reference/build">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+
+ <copy todir="${dist.dir}" failonerror="false">
+ <fileset dir="${common.dir}">
+ <include name="common-build.xml"/>
+ </fileset>
+ </copy>
+
+ <!-- copy dependencies -->
+ <copy todir="${dist.lib.dir}" failonerror="false">
+ <fileset file="${jpa-api.jar}"/>
+ <fileset file="${commons-annotations.jar}"/>
+ </copy>
+ <mkdir dir="${dist.lib.dir}/test"/>
+ <copy todir="${dist.lib.dir}/test" failonerror="false">
+ <fileset file="${annotations.jar}"/>
+ </copy>
+
+ <copy file="${basedir}/build.properties.dist" tofile="${dist.dir}/build.properties" failonerror="false">
+ </copy>
+ <antcall target="common-build.dist"/>
+ </target>
+
+ <target name="zip-dist" description="zip the dist">
+ <zip zipfile="${dist.dir}-${version}.zip">
+ <zipfileset prefix="${name}-${version}" dir="${dist.dir}"/>
+ </zip>
+ <tar compression="gzip" tarfile="${dist.dir}-${version}.tar.gz">
+ <tarfileset prefix="${name}-${version}" dir="${dist.dir}"/>
+ </tar>
+ </target>
+
+
+</project>
Deleted: trunk/HibernateExt/search/changelog.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/search/changelog.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/changelog.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,7 +0,0 @@
-Hibernate Search Changelog
-==========================
-
-3.2.2.GA (xx-02-2007)
----------------------
-
-Initial release as a standalone product (see Hibernate Annotations changelog for previous informations)
\ No newline at end of file
Copied: trunk/HibernateExt/search/changelog.txt (from rev 11279, branches/Branch_3_2/HibernateExt/search/changelog.txt)
===================================================================
--- trunk/HibernateExt/search/changelog.txt (rev 0)
+++ trunk/HibernateExt/search/changelog.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,7 @@
+Hibernate Search Changelog
+==========================
+
+3.2.2.GA (xx-02-2007)
+---------------------
+
+Initial release as a standalone product (see Hibernate Annotations changelog for previous informations)
\ No newline at end of file
Copied: trunk/HibernateExt/search/doc (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc)
Copied: trunk/HibernateExt/search/doc/api (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/api)
Deleted: trunk/HibernateExt/search/doc/api/package.html
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/api/package.html 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/api/package.html 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1 +0,0 @@
-<body></body>
Copied: trunk/HibernateExt/search/doc/api/package.html (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/api/package.html)
===================================================================
--- trunk/HibernateExt/search/doc/api/package.html (rev 0)
+++ trunk/HibernateExt/search/doc/api/package.html 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1 @@
+<body></body>
Copied: trunk/HibernateExt/search/doc/reference (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference)
Property changes on: trunk/HibernateExt/search/doc/reference
___________________________________________________________________
Name: svn:ignore
+ build
Deleted: trunk/HibernateExt/search/doc/reference/.cvsignore
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/search/doc/reference/.cvsignore (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/.cvsignore)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/search/doc/reference/build.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/build.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-<project name="Documentation" default="all.doc" basedir=".">
-
- <!-- Use the core Hibernate3 doc build system -->
- <import file="../../../common/common-build.xml"/>
- <import file="${hibernate-cvs.doc.reference}/build.xml"/>
-
-
- <target name="all.doc" depends="clean">
-
- <!-- TRANSLATOR: Duplicate this call for your language -->
- <antcall target="lang.all">
- <param name="docname" value="hibernate_search"/>
- <param name="lang" value="en"/>
- </antcall>
- </target>
-
-</project>
Copied: trunk/HibernateExt/search/doc/reference/build.xml (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/build.xml)
===================================================================
--- trunk/HibernateExt/search/doc/reference/build.xml (rev 0)
+++ trunk/HibernateExt/search/doc/reference/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+<project name="Documentation" default="all.doc" basedir=".">
+
+ <!-- Use the core Hibernate3 doc build system -->
+ <import file="../../../common/common-build.xml"/>
+ <import file="${hibernate-cvs.doc.reference}/build.xml"/>
+
+
+ <target name="all.doc" depends="clean">
+
+ <!-- TRANSLATOR: Duplicate this call for your language -->
+ <antcall target="lang.all">
+ <param name="docname" value="hibernate_search"/>
+ <param name="lang" value="en"/>
+ </antcall>
+ </target>
+
+</project>
Copied: trunk/HibernateExt/search/doc/reference/en (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en)
Copied: trunk/HibernateExt/search/doc/reference/en/images (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/images)
Deleted: trunk/HibernateExt/search/doc/reference/en/images/hibernate_logo_a.png
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/search/doc/reference/en/images/hibernate_logo_a.png (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/images/hibernate_logo_a.png)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/search/doc/reference/en/images/jms-backend.png
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/search/doc/reference/en/images/jms-backend.png (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/images/jms-backend.png)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/search/doc/reference/en/images/lucene-backend.png
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/search/doc/reference/en/images/lucene-backend.png (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/images/lucene-backend.png)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/search/doc/reference/en/master.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/master.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/en/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-<?xml version="1.0" encoding="ISO-8859-1"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
- "../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
- <!ENTITY architecture SYSTEM "modules/architecture.xml">
- <!ENTITY configuration SYSTEM "modules/configuration.xml">
- <!ENTITY mapping SYSTEM "modules/mapping.xml">
- <!ENTITY query SYSTEM "modules/query.xml">
- <!ENTITY batchindex SYSTEM "modules/batchindex.xml">
- ]>
-<book lang="en">
- <bookinfo>
- <title>Hibernate Search</title>
- <subtitle>Apache <trademark>Lucene</trademark>
- Integration</subtitle>
-
- <subtitle>Reference Guide</subtitle>
-
- <releaseinfo>3.2.2.beta1</releaseinfo>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="images/hibernate_logo_a.png" format="png"/>
- </imageobject>
- </mediaobject>
- </bookinfo>
-
- <toc></toc>
-
- <preface id="preface" revision="2">
- <title>Preface</title>
-
- <para>Full text search engines like <productname>Apache Lucene</productname>
- are a very powerful technology to
-bring free text/efficient queries to applications. If suffers several mismatches
-when dealing with a object domain model (keeping the index up to date, mismatch
-between the index structure and the domain model, querying mismatch...)
-Hibernate Search indexes your domain model thanks to a few annotations, takes
-care of the database / index synchronization and brings you back regular managed
-objects from free text queries.
-Hibernate Search is using <ulink url="http://lucene.apache.org">Apache Lucene</ulink>
-under the cover.</para>
-
- <para>Hibernate Search is a work in progress and new features are cooking in
- this area. So expect some compatibility changes in subsequent
- versions.</para>
- </preface>
-
- &architecture;
-
- &configuration;
-
- &mapping;
-
- &query;
-
- &batchindex;
-</book>
\ No newline at end of file
Copied: trunk/HibernateExt/search/doc/reference/en/master.xml (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/master.xml)
===================================================================
--- trunk/HibernateExt/search/doc/reference/en/master.xml (rev 0)
+++ trunk/HibernateExt/search/doc/reference/en/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
+ "../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
+ <!ENTITY architecture SYSTEM "modules/architecture.xml">
+ <!ENTITY configuration SYSTEM "modules/configuration.xml">
+ <!ENTITY mapping SYSTEM "modules/mapping.xml">
+ <!ENTITY query SYSTEM "modules/query.xml">
+ <!ENTITY batchindex SYSTEM "modules/batchindex.xml">
+ ]>
+<book lang="en">
+ <bookinfo>
+ <title>Hibernate Search</title>
+ <subtitle>Apache <trademark>Lucene</trademark>
+ Integration</subtitle>
+
+ <subtitle>Reference Guide</subtitle>
+
+ <releaseinfo>3.2.2.beta1</releaseinfo>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/hibernate_logo_a.png" format="png"/>
+ </imageobject>
+ </mediaobject>
+ </bookinfo>
+
+ <toc></toc>
+
+ <preface id="preface" revision="2">
+ <title>Preface</title>
+
+ <para>Full text search engines like <productname>Apache Lucene</productname>
+ are a very powerful technology to
+bring free text/efficient queries to applications. If suffers several mismatches
+when dealing with a object domain model (keeping the index up to date, mismatch
+between the index structure and the domain model, querying mismatch...)
+Hibernate Search indexes your domain model thanks to a few annotations, takes
+care of the database / index synchronization and brings you back regular managed
+objects from free text queries.
+Hibernate Search is using <ulink url="http://lucene.apache.org">Apache Lucene</ulink>
+under the cover.</para>
+
+ <para>Hibernate Search is a work in progress and new features are cooking in
+ this area. So expect some compatibility changes in subsequent
+ versions.</para>
+ </preface>
+
+ &architecture;
+
+ &configuration;
+
+ &mapping;
+
+ &query;
+
+ &batchindex;
+</book>
\ No newline at end of file
Copied: trunk/HibernateExt/search/doc/reference/en/modules (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules)
Deleted: trunk/HibernateExt/search/doc/reference/en/modules/architecture.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/architecture.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/en/modules/architecture.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,188 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="search-architecture">
- <title>Architecture</title>
-
- <para>Hibernate Search is made of an indexing engine and an index search
- engine. Both are backed by Apache Lucene.</para>
-
- <para>When an entity is inserted, updated or removed to/from the database,
- <productname>Hibernate Search</productname> keeps track of this event
- (through the Hibernate event system) and schedule an index update. All the
- index updates are handled for you without you having to use the Apache
- Lucene APIs.</para>
-
- <para>To interact with Apache Lucene indexes, Hibernate Search has the
- notion of <classname>DirectoryProvider</classname> . A directory provider
- will manage a given Lucene <classname>Directory</classname> type. You can
- configure directory providers to adjust the directory target.</para>
-
- <para><productname>Hibernate Search</productname> can also use a Lucene
- index to search an entity and return a (list of) managed entity saving you
- from the tedious Object / Lucene Document mapping and low level Lucene APIs.
- The same persistence context is shared between Hibernate and Hibernate
- Search ; as a matter of fact, the Seearch Session is built on top of the
- Hibernate Session. The application code use the unified
- <classname>org.hibernate.Query</classname> API exactly the way a HQL or
- native query would be done.</para>
-
- <section>
- <title>Batching Scope</title>
-
- <para>To be more efficient, Hibernate Search batch the interactions with
- the Lucene index. There is currently two types of batching depending on
- the expected scope.</para>
-
- <para>When out of transaction, the index update operation is executed
- right after the actual database operation. This scope is really a no
- scoping, and no batching is performed.</para>
-
- <para>It is however recommended, for both your database and Hibernate
- Search, to execute your operation in a transaction (whether it be JDBC or
- JTA). When in a transaction, the index update operation is schedule for
- the transaction commit (and discarded in case of transaction rollback).
- The batching scope is the transaction. There is 2 immediate
- benefits:</para>
-
- <itemizedlist>
- <listitem>
- <para>performance: Lucene indexing works better when operation are
- executed in batch.</para>
- </listitem>
-
- <listitem>
- <para>ACIDity: The work executed has the same scoping as the one
- executed by the database transaction and is executed if and only if
- the transaction is committed.</para>
-
- <note>
- <para>Disclamer, the work in not ACID in the strict sense of it, but
- ACID behavior is rarely useful for full text search indexes since
- they can be rebuilt from the source at any time.</para>
- </note>
- </listitem>
- </itemizedlist>
-
- <para>You can think of those two scopes (no scope vs transactional) as the
- equivalent of the (infamous) autocommit vs transactional behavior. From a
- performance perspective, the <emphasis>in transaction</emphasis> mode is
- recommended. The scoping choice is made transparently: Hibernate Search
- detects the presence of a transaction and adjust the scoping.</para>
-
- <remark>Note that Hibernate Search works perfectly fine in the Hibernate /
- EntityManager long conversation pattern aka. atomic conversation.</remark>
-
- <para>Depending on user demand, additional scoping will be considered, the
- pluggability mechanism being already in place.</para>
- </section>
-
- <section>
- <title>Back end</title>
-
- <para>Hibernate Search offers the ability to let the scoped work being
- processed by different back ends. Two back ends are provided out of the
- box for 2 different scenarii.</para>
-
- <section>
- <title>Lucene</title>
-
- <para>In this mode, all index update operations applied on a given node
- (JVM) will be executed to the Lucene directories (through the directory
- providers) by the same node. This mode is typically used in non
- clustered mode or in clustered mode where the directory store is
- shared.</para>
-
- <mediaobject>
- <imageobject role="html">
- <imagedata align="center"
- fileref="../shared/images/lucene-backend.png"
- format="PNG" />
- </imageobject>
-
- <imageobject role="fo">
- <imagedata align="center" fileref="images/lucene-backend.png"
- format="PNG" />
- </imageobject>
- </mediaobject>
-
- <para>This mode targets non clustered applications, or clustered
- applications where the Directory is taking care of the locking
- strategy.</para>
-
- <para>The main advantage is simplicity and immediate visibility of the
- changes in Lucene queries (a requirement is some applications).</para>
- </section>
-
- <section>
- <title>JMS</title>
-
- <para>All index update operations applied on a given node are sent to a
- JMS queue. A unique reader will then process the queue and update the
- master Lucene index. The master index is then replicated on a regular
- basis to the slave copies. This is known as the master / slaves pattern.
- The master is the sole responsible for updating the Lucene index, the
- slaves can accept read/write operations, process the read operation on
- their local index copy, and delegate the update operations to the
- master.</para>
-
- <mediaobject>
- <imageobject role="html">
- <imagedata align="center" fileref="../shared/images/jms-backend.png"
- format="PNG" />
- </imageobject>
-
- <imageobject role="fo">
- <imagedata align="center" fileref="images/jms-backend.png"
- format="PNG" />
- </imageobject>
- </mediaobject>
-
- <para>This mode targets clustered environments where throughput is
- critical, and index update delays are affordable. Reliability is ensured
- by the JMS provider and by having the slaves working on a local copy of
- the index.</para>
- </section>
-
- <section>
- <title>Custom</title>
-
- <para>Hibernate Search is an extensible architecture. While not yet part
- of the public API, pluging a third party back end is possible. Feel free
- to drop ideas to
- <literal>hibernate-dev at lists.jboss.org</literal>.</para>
- </section>
- </section>
-
- <section>
- <title>Work execution</title>
-
- <para>The indexing work (done by the back end) can be executed
- synchronously with the transaction commit (or update operation if out of
- transaction), or asynchronously.</para>
-
- <section>
- <title>Synchronous</title>
-
- <para>This is the safe mode where the back end work is executed in
- concert with the transaction commit. Under highly concurrent
- environment, this can lead to throughput limitation (due to the Apache
- Lucene lock mechanism). It can increase the system response time too if
- the backend is significantly slower than the transactional process and
- if a lot of IO operations are involved.</para>
- </section>
-
- <section>
- <title>Asynchronous</title>
-
- <para>This mode delegates the work done by the back end to a different
- thread. That way, throughput and response time are (to a certain extend)
- decorrelated from the back end performance. The drawback is that a small
- delay appears between the transaction commit and the index update and a
- small overhead is introduced to deal with thread management.</para>
-
- <para>It is recommended to use synchronous execution first and evaluate
- asynchronous if performance problems occur and after having set up a
- proper benchmark (ie not a lonely cowboy hitting the system in a
- completely unrealistic way).</para>
- </section>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/search/doc/reference/en/modules/architecture.xml (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/architecture.xml)
===================================================================
--- trunk/HibernateExt/search/doc/reference/en/modules/architecture.xml (rev 0)
+++ trunk/HibernateExt/search/doc/reference/en/modules/architecture.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,188 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="search-architecture">
+ <title>Architecture</title>
+
+ <para>Hibernate Search is made of an indexing engine and an index search
+ engine. Both are backed by Apache Lucene.</para>
+
+ <para>When an entity is inserted, updated or removed to/from the database,
+ <productname>Hibernate Search</productname> keeps track of this event
+ (through the Hibernate event system) and schedule an index update. All the
+ index updates are handled for you without you having to use the Apache
+ Lucene APIs.</para>
+
+ <para>To interact with Apache Lucene indexes, Hibernate Search has the
+ notion of <classname>DirectoryProvider</classname> . A directory provider
+ will manage a given Lucene <classname>Directory</classname> type. You can
+ configure directory providers to adjust the directory target.</para>
+
+ <para><productname>Hibernate Search</productname> can also use a Lucene
+ index to search an entity and return a (list of) managed entity saving you
+ from the tedious Object / Lucene Document mapping and low level Lucene APIs.
+ The same persistence context is shared between Hibernate and Hibernate
+ Search ; as a matter of fact, the Seearch Session is built on top of the
+ Hibernate Session. The application code use the unified
+ <classname>org.hibernate.Query</classname> API exactly the way a HQL or
+ native query would be done.</para>
+
+ <section>
+ <title>Batching Scope</title>
+
+ <para>To be more efficient, Hibernate Search batch the interactions with
+ the Lucene index. There is currently two types of batching depending on
+ the expected scope.</para>
+
+ <para>When out of transaction, the index update operation is executed
+ right after the actual database operation. This scope is really a no
+ scoping, and no batching is performed.</para>
+
+ <para>It is however recommended, for both your database and Hibernate
+ Search, to execute your operation in a transaction (whether it be JDBC or
+ JTA). When in a transaction, the index update operation is schedule for
+ the transaction commit (and discarded in case of transaction rollback).
+ The batching scope is the transaction. There is 2 immediate
+ benefits:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>performance: Lucene indexing works better when operation are
+ executed in batch.</para>
+ </listitem>
+
+ <listitem>
+ <para>ACIDity: The work executed has the same scoping as the one
+ executed by the database transaction and is executed if and only if
+ the transaction is committed.</para>
+
+ <note>
+ <para>Disclamer, the work in not ACID in the strict sense of it, but
+ ACID behavior is rarely useful for full text search indexes since
+ they can be rebuilt from the source at any time.</para>
+ </note>
+ </listitem>
+ </itemizedlist>
+
+ <para>You can think of those two scopes (no scope vs transactional) as the
+ equivalent of the (infamous) autocommit vs transactional behavior. From a
+ performance perspective, the <emphasis>in transaction</emphasis> mode is
+ recommended. The scoping choice is made transparently: Hibernate Search
+ detects the presence of a transaction and adjust the scoping.</para>
+
+ <remark>Note that Hibernate Search works perfectly fine in the Hibernate /
+ EntityManager long conversation pattern aka. atomic conversation.</remark>
+
+ <para>Depending on user demand, additional scoping will be considered, the
+ pluggability mechanism being already in place.</para>
+ </section>
+
+ <section>
+ <title>Back end</title>
+
+ <para>Hibernate Search offers the ability to let the scoped work being
+ processed by different back ends. Two back ends are provided out of the
+ box for 2 different scenarii.</para>
+
+ <section>
+ <title>Lucene</title>
+
+ <para>In this mode, all index update operations applied on a given node
+ (JVM) will be executed to the Lucene directories (through the directory
+ providers) by the same node. This mode is typically used in non
+ clustered mode or in clustered mode where the directory store is
+ shared.</para>
+
+ <mediaobject>
+ <imageobject role="html">
+ <imagedata align="center"
+ fileref="../shared/images/lucene-backend.png"
+ format="PNG" />
+ </imageobject>
+
+ <imageobject role="fo">
+ <imagedata align="center" fileref="images/lucene-backend.png"
+ format="PNG" />
+ </imageobject>
+ </mediaobject>
+
+ <para>This mode targets non clustered applications, or clustered
+ applications where the Directory is taking care of the locking
+ strategy.</para>
+
+ <para>The main advantage is simplicity and immediate visibility of the
+ changes in Lucene queries (a requirement is some applications).</para>
+ </section>
+
+ <section>
+ <title>JMS</title>
+
+ <para>All index update operations applied on a given node are sent to a
+ JMS queue. A unique reader will then process the queue and update the
+ master Lucene index. The master index is then replicated on a regular
+ basis to the slave copies. This is known as the master / slaves pattern.
+ The master is the sole responsible for updating the Lucene index, the
+ slaves can accept read/write operations, process the read operation on
+ their local index copy, and delegate the update operations to the
+ master.</para>
+
+ <mediaobject>
+ <imageobject role="html">
+ <imagedata align="center" fileref="../shared/images/jms-backend.png"
+ format="PNG" />
+ </imageobject>
+
+ <imageobject role="fo">
+ <imagedata align="center" fileref="images/jms-backend.png"
+ format="PNG" />
+ </imageobject>
+ </mediaobject>
+
+ <para>This mode targets clustered environments where throughput is
+ critical, and index update delays are affordable. Reliability is ensured
+ by the JMS provider and by having the slaves working on a local copy of
+ the index.</para>
+ </section>
+
+ <section>
+ <title>Custom</title>
+
+ <para>Hibernate Search is an extensible architecture. While not yet part
+ of the public API, pluging a third party back end is possible. Feel free
+ to drop ideas to
+ <literal>hibernate-dev at lists.jboss.org</literal>.</para>
+ </section>
+ </section>
+
+ <section>
+ <title>Work execution</title>
+
+ <para>The indexing work (done by the back end) can be executed
+ synchronously with the transaction commit (or update operation if out of
+ transaction), or asynchronously.</para>
+
+ <section>
+ <title>Synchronous</title>
+
+ <para>This is the safe mode where the back end work is executed in
+ concert with the transaction commit. Under highly concurrent
+ environment, this can lead to throughput limitation (due to the Apache
+ Lucene lock mechanism). It can increase the system response time too if
+ the backend is significantly slower than the transactional process and
+ if a lot of IO operations are involved.</para>
+ </section>
+
+ <section>
+ <title>Asynchronous</title>
+
+ <para>This mode delegates the work done by the back end to a different
+ thread. That way, throughput and response time are (to a certain extend)
+ decorrelated from the back end performance. The drawback is that a small
+ delay appears between the transaction commit and the index update and a
+ small overhead is introduced to deal with thread management.</para>
+
+ <para>It is recommended to use synchronous execution first and evaluate
+ asynchronous if performance problems occur and after having set up a
+ proper benchmark (ie not a lonely cowboy hitting the system in a
+ completely unrealistic way).</para>
+ </section>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/search/doc/reference/en/modules/batchindex.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/batchindex.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/en/modules/batchindex.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="search-batchindex">
- <title>Indexing</title>
-
- <para>It is sometimes useful to index an object event if this object is not
- inserted nor updated to the database. This is especially true when you want
- to build your index the first time. You can achieve that goal using the
- <classname>FullTextSession</classname> .</para>
-
- <programlisting>FullTextSession fullTextSession = Search.createFullTextSession(session);
-Transaction tx = fullTextSession.beginTransaction();
-for (Customer customer : customers) {
- <emphasis role="bold">fullTextSession.index(customer);</emphasis>
-}
-tx.commit(); //index are written at commit time </programlisting>
-
- <para>For maximum efficiency, Hibernate Search batch index operations which
- and execute them at commit time (Note: you don't need to use
- <classname>org.hibernate.Transaction</classname> in a JTA
- environment).</para>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/search/doc/reference/en/modules/batchindex.xml (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/batchindex.xml)
===================================================================
--- trunk/HibernateExt/search/doc/reference/en/modules/batchindex.xml (rev 0)
+++ trunk/HibernateExt/search/doc/reference/en/modules/batchindex.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="search-batchindex">
+ <title>Indexing</title>
+
+ <para>It is sometimes useful to index an object event if this object is not
+ inserted nor updated to the database. This is especially true when you want
+ to build your index the first time. You can achieve that goal using the
+ <classname>FullTextSession</classname> .</para>
+
+ <programlisting>FullTextSession fullTextSession = Search.createFullTextSession(session);
+Transaction tx = fullTextSession.beginTransaction();
+for (Customer customer : customers) {
+ <emphasis role="bold">fullTextSession.index(customer);</emphasis>
+}
+tx.commit(); //index are written at commit time </programlisting>
+
+ <para>For maximum efficiency, Hibernate Search batch index operations which
+ and execute them at commit time (Note: you don't need to use
+ <classname>org.hibernate.Transaction</classname> in a JTA
+ environment).</para>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/search/doc/reference/en/modules/configuration.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/configuration.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/en/modules/configuration.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,384 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="search-configuration">
- <title>Configuration</title>
-
- <section id="search-configuration-directory" revision="1">
- <title>Directory configuration</title>
-
- <para>Apache Lucene has a notion of Directory where the index is stored.
- The Directory implementation can be customized but Lucene comes bundled
- with a file system and a full memory implementation.
- <productname>Hibernate Search</productname> has the notion of
- <literal>DirectoryProvider</literal> that handle the configuration and the
- initialization of the Lucene Directory.</para>
-
- <table>
- <title>List of built-in Directory Providers</title>
-
- <tgroup cols="3">
- <thead>
- <row>
- <entry align="center">Class</entry>
-
- <entry align="center">description</entry>
-
- <entry align="center">Properties</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>org.hibernate.search.store.FSDirectoryProvider</entry>
-
- <entry>File system based directory. The directory used will be
- <indexBase>/< <literal>@Indexed.name</literal>
- ></entry>
-
- <entry><literal>indexBase</literal> : Base directory</entry>
- </row>
-
- <row>
- <entry>org.hibernate.search.store.RAMDirectoryProvider</entry>
-
- <entry>Memory based directory, the directory will be uniquely
- indentified by the <literal>@Indexed.name</literal>
- element</entry>
-
- <entry>none</entry>
- </row>
-
- <row>
- <entry>org.hibernate.search.store.FSMasterDirectoryProvider</entry>
-
- <entry><para>File system based directory. Like
- FSDirectoryProvider. It also copy the index to a source directory
- (aka copy directory) on a regular basis. </para><para>The
- recommended value for the refresh period is (at least) 50% higher
- that the time to copy the information (default 3600 seconds - 60
- minutes).</para><para>Note that the copy is based on an
- incremental copy mechanism reducing the average copy
- time.</para><para>DirectoryProvider typically used on the master
- node in a JMS back end cluster.</para>DirectoryProvider typically
- used on slave nodes using a JMS back end.</entry>
-
- <entry><para><literal>indexBase</literal>: Base
- directory</para><para><literal>sourceBase</literal>: Source (copy)
- base directory.</para><para><literal>source</literal>: Source
- directory suffix (default to <literal>@Indexed.name</literal>).
- The actual source directory name being
- <filename><sourceBase>/<source></filename>
- </para><para>refresh: refresh period in second (the copy will take
- place every refresh seconds).</para></entry>
- </row>
-
- <row>
- <entry>org.hibernate.search.store.FSSlaveDirectoryProvider</entry>
-
- <entry><para>File system based directory. Like
- FSDirectoryProvider. But retrieve a master version (source) on a
- regular basis. To avoid locking and inconsistent search results, 2
- local copies are kept. </para><para>The recommended value for the
- refresh period is (at least) 50% higher that the time to copy the
- information (default 3600 seconds - 60 minutes).</para><para>Note
- that the copy is based on an incremental copy mechanism reducing
- the average copy time.</para><para>DirectoryProvider typically
- used on slave nodes using a JMS back end.</para></entry>
-
- <entry><para><literal>indexBase</literal>: Base
- directory</para><para><literal>sourceBase</literal>: Source (copy)
- base directory.</para><para><literal>source</literal>: Source
- directory suffix (default to <literal>@Indexed.name</literal>).
- The actual source directory name being
- <filename><sourceBase>/<source></filename>
- </para><para>refresh: refresh period in second (the copy will take
- place every refresh seconds).</para></entry>
- </row>
-
- <row>
- <entry>org.hibernate.search.store.RAMDirectoryProvider</entry>
-
- <entry>Memory based directory, the directory will be uniquely
- identified (in the same deployment unit) by the
- <literal>@Indexed.name</literal> element</entry>
-
- <entry>none</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
-
- <para>If the built-in directory providers does not fit your needs, you can
- write your own directory provider by implementing the
- <classname>org.hibernate.store.DirectoryProvider</classname>
- interface</para>
-
- <para>Each indexed entity is associated to a Lucene index (an index can be
- shared by several entities but this is not usually the case). You can
- configure the index through properties prefixed by
- <constant>hibernate.search.</constant>
- <replaceable>indexname</replaceable> . Default properties inherited to all
- indexes can be defined using the prefix
- <constant>hibernate.search.default.</constant></para>
-
- <para>To define the directory provider of a given index, you use the
- <constant>hibernate.search. <replaceable>indexname</replaceable>
- .directory_provider </constant></para>
-
- <programlisting>hibernate.search.default.directory_provider org.hibernate.search.store.FSDirectoryProvider
-hibernate.search.default.indexBase=/usr/lucene/indexes
-
-hibernate.search.Rules.directory_provider org.hibernate.search.store.RAMDirectoryProvider </programlisting>
-
- <para>applied on</para>
-
- <programlisting>@Indexed(name="Status")
-public class Status { ... }
-
- at Indexed(name="Rules")
-public class Rule { ... }</programlisting>
-
- <para>will create a file system directory in
- <filename>/usr/lucene/indexes/Status</filename> where the Status entities
- will be indexed, and use an in memory directory named
- <literal>Rules</literal> where Rule entities will be indexed.</para>
-
- <para>So you can easily defined common rules like the directory provider
- and base directory, and overide those default later on on a per index
- basis.</para>
-
- <para>Writing your own <classname>DirectoryProvider</classname> , you can
- benefit this configuration mechanism too.</para>
- </section>
-
- <section>
- <title>Worker and Back ends configuration</title>
-
- <para>Hibernate Search works done by a worker you can configure. The
- default (and only) worker today use transactional scoping.</para>
-
- <section>
- <title>Generic configuration</title>
-
- <para>You can define the worker configuration using the following
- properties</para>
-
- <para></para>
-
- <table>
- <title>worker configuration</title>
-
- <tgroup cols="2">
- <colspec align="center" />
-
- <tbody>
- <row>
- <entry>property</entry>
-
- <entry>description</entry>
- </row>
-
- <row>
- <entry><literal>org.hibernate.worker.backend</literal></entry>
-
- <entry>Out of the box support for the Apache Lucene back end and
- the JMS back end. Default to <literal>lucene</literal>. Supports
- also <literal>jms</literal>.</entry>
- </row>
-
- <row>
- <entry><literal>org.hibernate.worker.execution</literal></entry>
-
- <entry>Supports synchronous and asynchrounous execution. Default
- to <literal><literal>sync</literal></literal>. Supports also
- <literal>async</literal>.</entry>
- </row>
-
- <row>
- <entry><literal>org.hibernate.worker.thread_pool.size</literal></entry>
-
- <entry>Defines the number of threads in the pool. useful only
- for asynchrounous execution. Default to 1.</entry>
- </row>
-
- <row>
- <entry><literal>org.hibernate.worker.buffer_queue.max</literal></entry>
-
- <entry>Defines the maximal number of work queue if the thread
- poll is starved. Useful only for asynchrounous execution.
- Default to infinite. If the limit is reached, the work is done
- by the main thread.</entry>
- </row>
-
- <row>
- <entry><literal>org.hibernate.worker.jndi.*</literal></entry>
-
- <entry>Defines the JNDI properties to initiate the
- InitialContext (if needed). JNDI is only used by the JMS back
- end.</entry>
- </row>
-
- <row>
- <entry><literal>
- org.hibernate.worker.jms.connection_factory</literal></entry>
-
- <entry>Mandatory for the JMS back end. Defines the JNDI name to
- lookup the JMS connection factory from
- (<literal>java:/ConnectionFactory</literal> by default in JBoss
- AS)</entry>
- </row>
-
- <row>
- <entry><literal>
- org.hibernate.worker.jms.queue</literal></entry>
-
- <entry>Mandatory for the JMS back end. Defines the JNDI name to
- lookup the JMS queue from. The queue will be used to post work
- messages.</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
-
- <section>
- <title>JMS Back end</title>
-
- <para>This chapter describes in greater detail how to configure the
- Master / Slaves Hibernate Search architecture.</para>
-
- <section>
- <title>Slave nodes</title>
-
- <para>Every index update operation is sent to a JMS queue. Index
- quering operations are executed on a local index copy.</para>
-
- <programlisting>### slave configuration
-
-## DirectoryProvider
-# (remote) master location
-hibernate.search.default.sourceBase = /mnt/mastervolume/lucenedirs/mastercopy
-
-# local copy location
-hibernate.search.default.indexBase = /Users/prod/lucenedirs
-
-# refresh every half hour
-hibernate.search.default.refresh = 1800
-
-# appropriate directory provider
-hibernate.search.default.directory_provider = org.hibernate.search.store.FSSlaveDirectoryProvider
-
-## Backend configuration
-hibernate.search.worker.backend = jms
-hibernate.search.worker.jms.connection_factory = java:/ConnectionFactory
-hibernate.search.worker.jms.queue = queue/hibernatesearch
-#optional jndi configuration (check your JMS provider for more information)
-
-## Optional asynchronous execution strategy
-# org.hibernate.worker.execution = async
-# org.hibernate.worker.thread_pool.size = 2
-# org.hibernate.worker.buffer_queue.max = 50</programlisting>
-
- <para>A file system local copy is recommended for faster search
- results.</para>
-
- <para>The refresh period should be higher that the expected time
- copy.</para>
- </section>
-
- <section>
- <title>Master node</title>
-
- <para>Every index update operation is taken fron a JMS queue and
- executed. The master index(es) is(are) copied on a regular
- basis.</para>
-
- <programlisting>### master configuration
-
-## DirectoryProvider
-# (remote) master location where information is copied to
-hibernate.search.default.sourceBase = /mnt/mastervolume/lucenedirs/mastercopy
-
-# local master location
-hibernate.search.default.indexBase = /Users/prod/lucenedirs
-
-# refresh every half hour
-hibernate.search.default.refresh = 1800
-
-# appropriate directory provider
-hibernate.search.default.directory_provider = org.hibernate.search.store.FSMasterDirectoryProvider
-
-## Backend configuration
-#Backend is the default lucene one</programlisting>
-
- <para>The refresh period should be higher that the expected time
- copy.</para>
-
- <para>In addition to the Hibernate Search framework configuration, a
- Message Driven Bean should be written and set up to process index
- works queue through JMS.</para>
-
- <programlisting>@MessageDriven(activationConfig = {
- @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
- @ActivationConfigProperty(propertyName="destination", propertyValue="queue/hiebrnatesearch"),
- @ActivationConfigProperty(propertyName="DLQMaxResent", propertyValue="1")
- } )
-public class MDBSearchController extends AbstractJMSHibernateSearchController implements MessageListener {
- @PersistenceContext EntityManager em;
-
- //method retrieving the appropriate session
- protected Session getSession() {
- return (Session) em.getDelegate();
- }
-
- //potentially close the session opened in #getSession(), not needed here
- protected void cleanSessionIfNeeded(Session session)
- }
-}</programlisting>
-
- <para>This example inherit the abstract JMS controller class available
- and implements a JavaEE 5 MDB. This implementation is given as an
- example and, while most likely ;ore complex, can be adjusted to make
- use of non Java EE Message Driven Beans. For more information about
- the <methodname>getSession()</methodname> and
- <methodname>cleanSessionIfNeeded()</methodname>, please check
- <classname>AbstractJMSHibernateSearchController</classname>'s
- javadoc.</para>
-
- <remark>Hibernate Search test suite makes use of JBoss Embedded to
- test the JMS integration. It allows the unit test to run both the MDB
- container and JBoss Messaging (JMS provider) in a standalone way
- (marketed by some as "lightweight"). </remark>
- </section>
- </section>
- </section>
-
- <section id="search-configuration-event" revision="1">
- <title>Enabling automatic indexing</title>
-
- <para>Automatic indexing is enable out of the box when using Hibernate
- Annotations or Hibernate EntityManager. If, for some reason you need to
- disable that, set
- <literal>hibernate.search.autoregister_listeners</literal> to false. Note
- that there is no performance runtime when the listeners are enabled while
- no entity is indexable.</para>
-
- <para>To enable automatic indexing in Hibernate Core, add the
- <literal>SearchEventListener</literal> for the three Hibernate events that
- occur after changes are executed to the database. Once again, such a
- configuration is not useful with Hibernate Annotations or Hibernate
- EntityManager.</para>
-
- <programlisting><hibernate-configuration>
- ...
- <event type="post-update"
- <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
- </event>
- <event type="post-insert"
- <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
- </event>
- <event type="post-delete"
- <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
- </event>
-</hibernate-configuration></programlisting>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/search/doc/reference/en/modules/configuration.xml (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/configuration.xml)
===================================================================
--- trunk/HibernateExt/search/doc/reference/en/modules/configuration.xml (rev 0)
+++ trunk/HibernateExt/search/doc/reference/en/modules/configuration.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,384 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="search-configuration">
+ <title>Configuration</title>
+
+ <section id="search-configuration-directory" revision="1">
+ <title>Directory configuration</title>
+
+ <para>Apache Lucene has a notion of Directory where the index is stored.
+ The Directory implementation can be customized but Lucene comes bundled
+ with a file system and a full memory implementation.
+ <productname>Hibernate Search</productname> has the notion of
+ <literal>DirectoryProvider</literal> that handle the configuration and the
+ initialization of the Lucene Directory.</para>
+
+ <table>
+ <title>List of built-in Directory Providers</title>
+
+ <tgroup cols="3">
+ <thead>
+ <row>
+ <entry align="center">Class</entry>
+
+ <entry align="center">description</entry>
+
+ <entry align="center">Properties</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>org.hibernate.search.store.FSDirectoryProvider</entry>
+
+ <entry>File system based directory. The directory used will be
+ <indexBase>/< <literal>@Indexed.name</literal>
+ ></entry>
+
+ <entry><literal>indexBase</literal> : Base directory</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.search.store.RAMDirectoryProvider</entry>
+
+ <entry>Memory based directory, the directory will be uniquely
+ indentified by the <literal>@Indexed.name</literal>
+ element</entry>
+
+ <entry>none</entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.search.store.FSMasterDirectoryProvider</entry>
+
+ <entry><para>File system based directory. Like
+ FSDirectoryProvider. It also copy the index to a source directory
+ (aka copy directory) on a regular basis. </para><para>The
+ recommended value for the refresh period is (at least) 50% higher
+ that the time to copy the information (default 3600 seconds - 60
+ minutes).</para><para>Note that the copy is based on an
+ incremental copy mechanism reducing the average copy
+ time.</para><para>DirectoryProvider typically used on the master
+ node in a JMS back end cluster.</para>DirectoryProvider typically
+ used on slave nodes using a JMS back end.</entry>
+
+ <entry><para><literal>indexBase</literal>: Base
+ directory</para><para><literal>sourceBase</literal>: Source (copy)
+ base directory.</para><para><literal>source</literal>: Source
+ directory suffix (default to <literal>@Indexed.name</literal>).
+ The actual source directory name being
+ <filename><sourceBase>/<source></filename>
+ </para><para>refresh: refresh period in second (the copy will take
+ place every refresh seconds).</para></entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.search.store.FSSlaveDirectoryProvider</entry>
+
+ <entry><para>File system based directory. Like
+ FSDirectoryProvider. But retrieve a master version (source) on a
+ regular basis. To avoid locking and inconsistent search results, 2
+ local copies are kept. </para><para>The recommended value for the
+ refresh period is (at least) 50% higher that the time to copy the
+ information (default 3600 seconds - 60 minutes).</para><para>Note
+ that the copy is based on an incremental copy mechanism reducing
+ the average copy time.</para><para>DirectoryProvider typically
+ used on slave nodes using a JMS back end.</para></entry>
+
+ <entry><para><literal>indexBase</literal>: Base
+ directory</para><para><literal>sourceBase</literal>: Source (copy)
+ base directory.</para><para><literal>source</literal>: Source
+ directory suffix (default to <literal>@Indexed.name</literal>).
+ The actual source directory name being
+ <filename><sourceBase>/<source></filename>
+ </para><para>refresh: refresh period in second (the copy will take
+ place every refresh seconds).</para></entry>
+ </row>
+
+ <row>
+ <entry>org.hibernate.search.store.RAMDirectoryProvider</entry>
+
+ <entry>Memory based directory, the directory will be uniquely
+ identified (in the same deployment unit) by the
+ <literal>@Indexed.name</literal> element</entry>
+
+ <entry>none</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+
+ <para>If the built-in directory providers does not fit your needs, you can
+ write your own directory provider by implementing the
+ <classname>org.hibernate.store.DirectoryProvider</classname>
+ interface</para>
+
+ <para>Each indexed entity is associated to a Lucene index (an index can be
+ shared by several entities but this is not usually the case). You can
+ configure the index through properties prefixed by
+ <constant>hibernate.search.</constant>
+ <replaceable>indexname</replaceable> . Default properties inherited to all
+ indexes can be defined using the prefix
+ <constant>hibernate.search.default.</constant></para>
+
+ <para>To define the directory provider of a given index, you use the
+ <constant>hibernate.search. <replaceable>indexname</replaceable>
+ .directory_provider </constant></para>
+
+ <programlisting>hibernate.search.default.directory_provider org.hibernate.search.store.FSDirectoryProvider
+hibernate.search.default.indexBase=/usr/lucene/indexes
+
+hibernate.search.Rules.directory_provider org.hibernate.search.store.RAMDirectoryProvider </programlisting>
+
+ <para>applied on</para>
+
+ <programlisting>@Indexed(name="Status")
+public class Status { ... }
+
+ at Indexed(name="Rules")
+public class Rule { ... }</programlisting>
+
+ <para>will create a file system directory in
+ <filename>/usr/lucene/indexes/Status</filename> where the Status entities
+ will be indexed, and use an in memory directory named
+ <literal>Rules</literal> where Rule entities will be indexed.</para>
+
+ <para>So you can easily defined common rules like the directory provider
+ and base directory, and overide those default later on on a per index
+ basis.</para>
+
+ <para>Writing your own <classname>DirectoryProvider</classname> , you can
+ benefit this configuration mechanism too.</para>
+ </section>
+
+ <section>
+ <title>Worker and Back ends configuration</title>
+
+ <para>Hibernate Search works done by a worker you can configure. The
+ default (and only) worker today use transactional scoping.</para>
+
+ <section>
+ <title>Generic configuration</title>
+
+ <para>You can define the worker configuration using the following
+ properties</para>
+
+ <para></para>
+
+ <table>
+ <title>worker configuration</title>
+
+ <tgroup cols="2">
+ <colspec align="center" />
+
+ <tbody>
+ <row>
+ <entry>property</entry>
+
+ <entry>description</entry>
+ </row>
+
+ <row>
+ <entry><literal>org.hibernate.worker.backend</literal></entry>
+
+ <entry>Out of the box support for the Apache Lucene back end and
+ the JMS back end. Default to <literal>lucene</literal>. Supports
+ also <literal>jms</literal>.</entry>
+ </row>
+
+ <row>
+ <entry><literal>org.hibernate.worker.execution</literal></entry>
+
+ <entry>Supports synchronous and asynchrounous execution. Default
+ to <literal><literal>sync</literal></literal>. Supports also
+ <literal>async</literal>.</entry>
+ </row>
+
+ <row>
+ <entry><literal>org.hibernate.worker.thread_pool.size</literal></entry>
+
+ <entry>Defines the number of threads in the pool. useful only
+ for asynchrounous execution. Default to 1.</entry>
+ </row>
+
+ <row>
+ <entry><literal>org.hibernate.worker.buffer_queue.max</literal></entry>
+
+ <entry>Defines the maximal number of work queue if the thread
+ poll is starved. Useful only for asynchrounous execution.
+ Default to infinite. If the limit is reached, the work is done
+ by the main thread.</entry>
+ </row>
+
+ <row>
+ <entry><literal>org.hibernate.worker.jndi.*</literal></entry>
+
+ <entry>Defines the JNDI properties to initiate the
+ InitialContext (if needed). JNDI is only used by the JMS back
+ end.</entry>
+ </row>
+
+ <row>
+ <entry><literal>
+ org.hibernate.worker.jms.connection_factory</literal></entry>
+
+ <entry>Mandatory for the JMS back end. Defines the JNDI name to
+ lookup the JMS connection factory from
+ (<literal>java:/ConnectionFactory</literal> by default in JBoss
+ AS)</entry>
+ </row>
+
+ <row>
+ <entry><literal>
+ org.hibernate.worker.jms.queue</literal></entry>
+
+ <entry>Mandatory for the JMS back end. Defines the JNDI name to
+ lookup the JMS queue from. The queue will be used to post work
+ messages.</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+
+ <section>
+ <title>JMS Back end</title>
+
+ <para>This chapter describes in greater detail how to configure the
+ Master / Slaves Hibernate Search architecture.</para>
+
+ <section>
+ <title>Slave nodes</title>
+
+ <para>Every index update operation is sent to a JMS queue. Index
+ quering operations are executed on a local index copy.</para>
+
+ <programlisting>### slave configuration
+
+## DirectoryProvider
+# (remote) master location
+hibernate.search.default.sourceBase = /mnt/mastervolume/lucenedirs/mastercopy
+
+# local copy location
+hibernate.search.default.indexBase = /Users/prod/lucenedirs
+
+# refresh every half hour
+hibernate.search.default.refresh = 1800
+
+# appropriate directory provider
+hibernate.search.default.directory_provider = org.hibernate.search.store.FSSlaveDirectoryProvider
+
+## Backend configuration
+hibernate.search.worker.backend = jms
+hibernate.search.worker.jms.connection_factory = java:/ConnectionFactory
+hibernate.search.worker.jms.queue = queue/hibernatesearch
+#optional jndi configuration (check your JMS provider for more information)
+
+## Optional asynchronous execution strategy
+# org.hibernate.worker.execution = async
+# org.hibernate.worker.thread_pool.size = 2
+# org.hibernate.worker.buffer_queue.max = 50</programlisting>
+
+ <para>A file system local copy is recommended for faster search
+ results.</para>
+
+ <para>The refresh period should be higher that the expected time
+ copy.</para>
+ </section>
+
+ <section>
+ <title>Master node</title>
+
+ <para>Every index update operation is taken fron a JMS queue and
+ executed. The master index(es) is(are) copied on a regular
+ basis.</para>
+
+ <programlisting>### master configuration
+
+## DirectoryProvider
+# (remote) master location where information is copied to
+hibernate.search.default.sourceBase = /mnt/mastervolume/lucenedirs/mastercopy
+
+# local master location
+hibernate.search.default.indexBase = /Users/prod/lucenedirs
+
+# refresh every half hour
+hibernate.search.default.refresh = 1800
+
+# appropriate directory provider
+hibernate.search.default.directory_provider = org.hibernate.search.store.FSMasterDirectoryProvider
+
+## Backend configuration
+#Backend is the default lucene one</programlisting>
+
+ <para>The refresh period should be higher that the expected time
+ copy.</para>
+
+ <para>In addition to the Hibernate Search framework configuration, a
+ Message Driven Bean should be written and set up to process index
+ works queue through JMS.</para>
+
+ <programlisting>@MessageDriven(activationConfig = {
+ @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
+ @ActivationConfigProperty(propertyName="destination", propertyValue="queue/hiebrnatesearch"),
+ @ActivationConfigProperty(propertyName="DLQMaxResent", propertyValue="1")
+ } )
+public class MDBSearchController extends AbstractJMSHibernateSearchController implements MessageListener {
+ @PersistenceContext EntityManager em;
+
+ //method retrieving the appropriate session
+ protected Session getSession() {
+ return (Session) em.getDelegate();
+ }
+
+ //potentially close the session opened in #getSession(), not needed here
+ protected void cleanSessionIfNeeded(Session session)
+ }
+}</programlisting>
+
+ <para>This example inherit the abstract JMS controller class available
+ and implements a JavaEE 5 MDB. This implementation is given as an
+ example and, while most likely ;ore complex, can be adjusted to make
+ use of non Java EE Message Driven Beans. For more information about
+ the <methodname>getSession()</methodname> and
+ <methodname>cleanSessionIfNeeded()</methodname>, please check
+ <classname>AbstractJMSHibernateSearchController</classname>'s
+ javadoc.</para>
+
+ <remark>Hibernate Search test suite makes use of JBoss Embedded to
+ test the JMS integration. It allows the unit test to run both the MDB
+ container and JBoss Messaging (JMS provider) in a standalone way
+ (marketed by some as "lightweight"). </remark>
+ </section>
+ </section>
+ </section>
+
+ <section id="search-configuration-event" revision="1">
+ <title>Enabling automatic indexing</title>
+
+ <para>Automatic indexing is enable out of the box when using Hibernate
+ Annotations or Hibernate EntityManager. If, for some reason you need to
+ disable that, set
+ <literal>hibernate.search.autoregister_listeners</literal> to false. Note
+ that there is no performance runtime when the listeners are enabled while
+ no entity is indexable.</para>
+
+ <para>To enable automatic indexing in Hibernate Core, add the
+ <literal>SearchEventListener</literal> for the three Hibernate events that
+ occur after changes are executed to the database. Once again, such a
+ configuration is not useful with Hibernate Annotations or Hibernate
+ EntityManager.</para>
+
+ <programlisting><hibernate-configuration>
+ ...
+ <event type="post-update"
+ <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
+ </event>
+ <event type="post-insert"
+ <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
+ </event>
+ <event type="post-delete"
+ <listener class="org.hibernate.search.event.FullTextIndexEventListener"/>
+ </event>
+</hibernate-configuration></programlisting>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/search/doc/reference/en/modules/mapping.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/mapping.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/en/modules/mapping.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,574 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="search-mapping" revision="3">
- <title>Mapping entities to the index structure</title>
-
- <para>All the metadata information related to indexed entities is described
- through some Java annotations. There is no need for xml mapping files nor a
- list of indexed entities. The list is discovered at startup time scanning
- the Hibernate mapped entities.</para>
-
- <section id="search-mapping-entity" revision="3">
- <title>Mapping an entity</title>
-
- <section>
- <title>Basic mapping</title>
-
- <para>First, we must declare a persistent class as indexable. This is
- done by annotating the class with <literal>@Indexed</literal> (all
- entities not annotated with <literal>@Indexed</literal> will be ignored
- by the indexing process):</para>
-
- <programlisting>@Entity
-<emphasis role="bold">@Indexed(index="indexes/essays")</emphasis>
-public class Essay {
- ...
-}</programlisting>
-
- <para>The <literal>index</literal> attribute tells Hibernate what the
- Lucene directory name is (usually a directory on your file system). If
- you wish to define a base directory for all Lucene indexes, you can use
- the <literal>hibernate.search.default.indexBase</literal> property in
- your configuration file. Each entity instance will be represented by a
- Lucene <classname>Document</classname> inside the given index (aka
- Directory).</para>
-
- <para>For each property (or attribute) of your entity, you have the
- ability to describe how it will be indexed. The default (ie no
- annotation) means that the property is completly ignored by the indexing
- process. <literal>@Field</literal> does declare a property as indexed.
- When indexing an element to a Lucene document you can specify how it is
- indexed:</para>
-
- <itemizedlist>
- <listitem>
- <para><literal>name</literal> : describe under which name, the
- property should be stored in the Lucene Document. The default value
- is the property name (following the JavaBeans convention)</para>
- </listitem>
-
- <listitem>
- <para><literal>store</literal> : describe whether or not the
- property is stored in the Lucene index. You can store the value
- <literal>Store.YES</literal> (comsuming more space in the index),
- store it in a compressed way <literal>Store.COMPRESS</literal> (this
- does consume more CPU), or avoid any storage
- <literal>Store.NO</literal> (this is the default value). When a
- property is stored, you can retrieve it from the Lucene Document
- (note that this is not related to whether the element is indexed or
- not).</para>
- </listitem>
-
- <listitem>
- <para>index: describe how the element is indexed (ie the process
- used to index the property and the type of information store). The
- different values are <literal>Index.NO</literal> (no indexing, ie
- cannot be found by a query), <literal>Index.TOKENIZED</literal> (use
- an analyzer to process the property),
- <literal>Index.UN_TOKENISED</literal> (no analyzer pre processing),
- <literal>Index.NO_NORM</literal> (do not store the normalization
- data).</para>
- </listitem>
- </itemizedlist>
-
- <para>These attributes are part of the <literal>@Field</literal>
- annotation.</para>
-
- <para>Whether or not you want to store the data depends on how you wish
- to use the index query result. As of today, for a pure
- <productname>Hibernate Search </productname> usage, storing is not
- necessary. Whether or not you want to tokenize a property or not depends
- on whether you wish to search the element as is, or only normalized part
- of it. It make sense to tokenize a text field, but it does not to do it
- for a date field (or an id field).</para>
-
- <para>Finally, the id property of an entity is a special property used
- by <productname>Hibernate Search</productname> to ensure index unicity
- of a given entity. By design, an id has to be stored and must not be
- tokenized. To mark a property as index id, use the
- <literal>@DocumentId</literal> annotation.</para>
-
- <programlisting>@Entity
- at Indexed(index="indexes/essays")
-public class Essay {
- ...
-
- @Id
- <emphasis role="bold">@DocumentId</emphasis>
- public Long getId() { return id; }
-
- <emphasis role="bold">@Field(name="Abstract", index=Index.TOKENIZED, store=Store.YES)</emphasis>
- public String getSummary() { return summary; }
-
- @Lob
- <emphasis role="bold">@Field(index=Index.TOKENIZED)</emphasis>
- public String getText() { return text; }
-}</programlisting>
-
- <para>These annotations define an index with three fields:
- <literal>id</literal> , <literal>Abstract</literal> and
- <literal>text</literal> . Note that by default the field name is
- decapitalized, following the JavaBean specification.</para>
-
- <note>
- <para>You <emphasis>must</emphasis> specify
- <literal>@DocumentId</literal> on the identifier property of your
- entity class.</para>
- </note>
- </section>
-
- <section>
- <title>Embedded and associated objects</title>
-
- <para>Associated objects as well as embedded objects can be indexed as
- well as part of the root entity index.</para>
-
- <programlisting>@Entity
- at Indexed
-public class Place {
- @Id
- @GeneratedValue
- @DocumentId
- private Long id;
-
- @Field( index = Index.TOKENIZED )
- private String name;
-
- @OneToOne( cascade = { CascadeType.PERSIST, CascadeType.REMOVE } )
- <emphasis role="bold">@IndexedEmbedded</emphasis>
- private Address address;
- ....
-}
-
- at Entity
- at Indexed
-public class Address {
- @Id
- @GeneratedValue
- @DocumentId
- private Long id;
-
- @Field(index=Index.TOKENIZED)
- private String street;
-
- @Field(index=Index.TOKENIZED)
- private String city;
-
- <emphasis role="bold">@IndexedEmbedded(depth = 1, prefix = "ownedBy_")</emphasis>
- private Owner ownedBy;
- ...
-}
-
- at Embeddable
-public class Owner {
- @Field(index = Index.TOKENIZED)
- private String name;
- ...
-}</programlisting>
-
- <para>Any <literal>@*ToOne</literal> and <literal>@Embedded</literal>
- attribute can be annotated with <literal>@IndexedEmbedded</literal>. The
- attributes of the associated class will then be added to the main entity
- index. In the previous example, the index will contain the following
- fields</para>
-
- <itemizedlist>
- <listitem>
- <para>id</para>
- </listitem>
-
- <listitem>
- <para>name</para>
- </listitem>
-
- <listitem>
- <para>address.street</para>
- </listitem>
-
- <listitem>
- <para>address.city</para>
- </listitem>
-
- <listitem>
- <para>addess.ownedBy_name</para>
- </listitem>
- </itemizedlist>
-
- <para>The default prefix is <literal>propertyName.</literal>, following
- the traditional object navigation convention. You can override it using
- the <literal>prefix</literal> attribute.</para>
-
- <para><literal>depth</literal> is necessary when the object graph
- contains a cyclic dependency of classes (not instance). For example, if
- <classname>Owner</classname> points to <classname>Place</classname>.
- Hibernate Search will stop including Indexed embedded atttributes after
- reaching the expected depth (or is the object graph boundaries are
- reached). A class having a self reference is an example of cyclic
- dependency. In our example, because <literal>depth</literal> is set to
- 1, any <literal>@IndexedEmbedded</literal> attribute in Owner (if any)
- will be ignored.</para>
-
- <para>Such a mapping is very useful to express queries refering to
- associated objects, such as:</para>
-
- <itemizedlist>
- <listitem>
- <para>Return places where name contains JBoss and where address city
- is Atlanta. In Lucene query this would be</para>
-
- <programlisting>+name:jboss +address.city:atlanta </programlisting>
- </listitem>
-
- <listitem>
- <para>Return places where name contains JBoss and where owner's name
- contain Joe. In Lucene query this would be</para>
-
- <programlisting>+name:jboss +address.orderBy_name:joe </programlisting>
- </listitem>
- </itemizedlist>
-
- <para>In a way it mimics the relational join operation in a more
- efficient way (at the cost of data duplication). Remember that, out of
- the box, Lucene indexes have no notion of association, the join
- operation is simply non-existent. It might help to keep the relational
- model normalzed while benefiting from the full text index speed and
- feature richness.</para>
-
- <para><note>
- <para>An associated object can itself be (but don't have to)
- <literal>@Indexed</literal> </para>
- </note></para>
- </section>
-
- <section>
- <title>Boost factor</title>
-
- <para>Lucene has the notion of <emphasis>boost factor</emphasis> . It's
- a way to give more weigth to a field or to an indexed element over an
- other during the indexation process. You can use
- <literal>@Boost</literal> at the field or the class level.</para>
-
- <programlisting>@Entity
- at Indexed(index="indexes/essays")
-<emphasis role="bold">@Boost(2)</emphasis>
-public class Essay {
- ...
-
- @Id
- @DocumentId
- public Long getId() { return id; }
-
- @Field(name="Abstract", index=Index.TOKENIZED, store=Store.YES)
- <emphasis role="bold">@Boost(2.5f)</emphasis>
- public String getSummary() { return summary; }
-
- @Lob
- @Field(index=Index.TOKENIZED)
- public String getText() { return text; }
-} </programlisting>
-
- <para>In our example, Essay's probability to reach the top of the search
- list will be multiplied by 2 and the summary field will be 2.5 more
- important than the test field. Note that this explaination is actually
- wrong, but it is simple and close enought to the reality. Please check
- the Lucene documentation or the excellent <citetitle>Lucene In Action
- </citetitle> from Otis Gospodnetic and Erik Hatcher.</para>
- </section>
-
- <section>
- <title>Analyser</title>
-
- <para>The analyzer class used to index the elements is configurable
- through the <literal>hibernate.search.analyzer</literal> property. If
- none defined,
- <classname>org.apache.lucene.analysis.standard.StandardAnalyzer</classname>
- is used as the default.</para>
- </section>
- </section>
-
- <section id="search-mapping-bridge">
- <title>Property/Field Bridge</title>
-
- <para>All field of a full text index in Lucene have to be represented as
- Strings. Ones Java properties have to be indexed in a String form. For
- most of your properties, <productname>Hibernate Search</productname> does
- the translation job for you thanks to a built-in set of bridges. In some
- cases, though you need a fine grain control over the translation
- process.</para>
-
- <section>
- <title>Built-in bridges</title>
-
- <para><literal>Hibernate Search</literal> comes bundled with a set of
- built-in bridges between a Java property type and its full text
- representation.</para>
-
- <para><literal>Null</literal> elements are not indexed (Lucene does not
- support null elements and it does not make much sense either)</para>
-
- <variablelist>
- <varlistentry>
- <term>null</term>
-
- <listitem>
- <para>null elements are not indexed. Lucene does not support null
- elements and this does not make much sense either.</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>java.lang.String</term>
-
- <listitem>
- <para>String are indexed as is</para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>short, Short, integer, Integer, long, Long, float, Float,
- double, Double, BigInteger, BigDecimal</term>
-
- <listitem>
- <para>Numbers are converted in their String representation. Note
- that numbers cannot be compared by Lucene (ie used in ranged
- queries) out of the box: they have to be padded <footnote>
- <para>Using a Range query is debattable and has drawbacks, an
- alternative approach is to use a Filter query which will
- filter the result query to the appropriate range.</para>
-
- <para><productname>Hibernate Search</productname> will support
- a padding mechanism</para>
- </footnote></para>
- </listitem>
- </varlistentry>
-
- <varlistentry>
- <term>java.util.Date</term>
-
- <listitem>
- <para>Dates are stored as yyyyMMddHHmmssSSS in GMT time
- (200611072203012 for Nov 7th of 2006 4:03PM and 12ms EST). You
- shouldn't really bother with the internal format. What is
- important is that when using a DateRange Query, you should know
- that the dates have to be expressed in GMT time.</para>
-
- <para>Usually, storing the date up to the milisecond is not
- necessary. <literal>@DateBridge</literal> defines the appropriate
- resolution you are willing to store in the index ( <literal>
- <literal>@DateBridge(resolution=Resolution.DAY)</literal>
- </literal> ). The date pattern will then be truncated
- accordingly.</para>
-
- <programlisting>@Entity
- at Indexed
-public class Meeting {
- @Field(index=Index.UN_TOKENIZED)
- <emphasis role="bold">@DateBridge(resolution=Resolution.MINUTE)</emphasis>
- private Date date;
- ... </programlisting>
-
- <warning>
- <para>A Date whose resolution is lower than
- <literal>MILLISECOND</literal> cannot be a
- <literal>@DocumentId</literal></para>
- </warning>
- </listitem>
- </varlistentry>
- </variablelist>
-
- <para></para>
- </section>
-
- <section>
- <title>Custom Bridge</title>
-
- <para>It can happen that the built-in bridges of Hibernate Search does
- not cover some of your property types, or that the String representation
- used is not what you expect.</para>
-
- <section>
- <title>StringBridge</title>
-
- <para>The simpliest custom solution is to give <productname>Hibernate
- Search </productname> an implementation of your expected
- <emphasis>object to String</emphasis> bridge. To do so you need to
- implements the
- <literal>org.hibernate.search.bridge.StringBridge</literal>
- interface</para>
-
- <programlisting>/**
- * Padding Integer bridge.
- * All numbers will be padded with 0 to match 5 digits
- *
- * @author Emmanuel Bernard
- */
-public class PaddedIntegerBridge implements <emphasis role="bold">StringBridge</emphasis> {
-
- private int PADDING = 5;
-
- <emphasis role="bold">public String objectToString(Object object)</emphasis> {
- String rawInteger = ( (Integer) object ).toString();
- if (rawInteger.length() > PADDING)
- throw new IllegalArgumentException( "Try to pad on a number too big" );
- StringBuilder paddedInteger = new StringBuilder( );
- for ( int padIndex = rawInteger.length() ; padIndex < PADDING ; padIndex++ ) {
- paddedInteger.append('0');
- }
- return paddedInteger.append( rawInteger ).toString();
- }
-} </programlisting>
-
- <para>Then any property or field can use this bridge thanks to the
- <literal>@FieldBridge</literal> annotation</para>
-
- <programlisting><emphasis role="bold">@FieldBridge(impl = PaddedIntegerBridge.class)</emphasis>
-private Integer length; </programlisting>
-
- <para>Parameters can be passed to the Bridge implementation making it
- more flexible. The Bridge implementation implements a
- <classname>ParameterizedBridge</classname> interface, and the
- parameters are passed through the <literal>@FieldBridge</literal>
- annotation.</para>
-
- <programlisting>public class PaddedIntegerBridge implements StringBridge, <emphasis
- role="bold">ParameterizedBridge</emphasis> {
-
- public static String PADDING_PROPERTY = "padding";
- private int padding = 5; //default
-
- <emphasis role="bold">public void setParameterValues(Map parameters)</emphasis> {
- Object padding = parameters.get( PADDING_PROPERTY );
- if (padding != null) this.padding = (Integer) padding;
- }
-
- public String objectToString(Object object) {
- String rawInteger = ( (Integer) object ).toString();
- if (rawInteger.length() > padding)
- throw new IllegalArgumentException( "Try to pad on a number too big" );
- StringBuilder paddedInteger = new StringBuilder( );
- for ( int padIndex = rawInteger.length() ; padIndex < padding ; padIndex++ ) {
- paddedInteger.append('0');
- }
- return paddedInteger.append( rawInteger ).toString();
- }
-}
-
-
-//property
- at FieldBridge(impl = PaddedIntegerBridge.class,
- <emphasis role="bold">params = @Parameter(name="padding", value="10")</emphasis>
- )
-private Integer length; </programlisting>
-
- <para>The <classname>ParameterizedBridge</classname> interface can be
- implemented by <classname>StringBridge</classname> ,
- <classname>TwoWayStringBridge</classname> ,
- <classname>FieldBridge</classname> implementations (see
- bellow).</para>
-
- <para>If you expect to use your bridge implementation on for an id
- property (ie annotated with <literal>@DocumentId</literal> ), you need
- to use a slightly extended version of <literal>StringBridge</literal>
- named <classname>TwoWayStringBridge</classname> . <literal>Hibernate
- Search </literal> needs to read the string representation of the
- identifier and generate the object out of it. There is not difference
- in the way the <literal>@FieldBridge</literal> annotation is
- used.</para>
-
- <programlisting>public class PaddedIntegerBridge implements TwoWayStringBridge, ParameterizedBridge {
-
- public static String PADDING_PROPERTY = "padding";
- private int padding = 5; //default
-
- public void setParameterValues(Map parameters) {
- Object padding = parameters.get( PADDING_PROPERTY );
- if (padding != null) this.padding = (Integer) padding;
- }
-
- public String objectToString(Object object) {
- String rawInteger = ( (Integer) object ).toString();
- if (rawInteger.length() > padding)
- throw new IllegalArgumentException( "Try to pad on a number too big" );
- StringBuilder paddedInteger = new StringBuilder( );
- for ( int padIndex = rawInteger.length() ; padIndex < padding ; padIndex++ ) {
- paddedInteger.append('0');
- }
- return paddedInteger.append( rawInteger ).toString();
- }
-
- <emphasis role="bold">public Object stringToObject(String stringValue)</emphasis> {
- return new Integer(stringValue);
- }
-}
-
-
-//id property
- at DocumentId
- at FieldBridge(impl = PaddedIntegerBridge.class,
- params = @Parameter(name="padding", value="10")
-private Integer id;
- </programlisting>
-
- <para>It is critically important for the two-way process to be
- idempotent (ie object = stringToObject( objectToString( object ) )
- ).</para>
- </section>
-
- <section>
- <title>FieldBridge</title>
-
- <para>Some usecase requires more than a simple object to string
- translation when mapping a property to a Lucene index. To give you
- most of the flexibility you can also implement a bridge as a
- <classname>FieldBridge</classname> . This interface give you a
- property value and let you map it the way you want in your Lucene
- <classname>Document</classname> .This interface is very similar in its
- concept to the <productname>Hibernate</productname>
- <classname>UserType</classname> .</para>
-
- <para>You can for example store a given property in two different
- document fields</para>
-
- <programlisting>/**
- * Store the date in 3 different field year, month, day
- * to ease Range Query per year, month or day
- * (eg get all the elements of december for the last 5 years)
- *
- * @author Emmanuel Bernard
- */
-public class DateSplitBridge implements FieldBridge {
- private final static TimeZone GMT = TimeZone.getTimeZone("GMT");
-
- <emphasis role="bold">public void set(String name, Object value, Document document, Field.Store
- store, Field.Index index, Float boost) {
- </emphasis>
- Date date = (Date) value;
- Calendar cal = GregorianCalendar.getInstance( GMT );
- cal.setTime( date );
- int year = cal.get( Calendar.YEAR );
- int month = cal.get( Calendar.MONTH ) + 1;
- int day = cal.get( Calendar.DAY_OF_MONTH );
- //set year
- Field field = new Field( name + ".year", String.valueOf(year), store, index );
- if ( boost != null ) field.setBoost( boost );
- document.add( field );
- //set month and pad it if needed
- field = new Field( name + ".month", month < 10 ? "0" : "" + String.valueOf(month), store, index);
- if ( boost != null ) field.setBoost( boost );
- document.add( field );
- //set day and pad it if needed
- field = new Field( name + ".day", day < 10 ? "0" : "" + String.valueOf(day), store, index );
- if ( boost != null ) field.setBoost( boost );
- document.add( field );
- }
-}
-
-
-//property
-<emphasis role="bold">@FieldBridge(impl = DateSplitBridge.class)</emphasis>
-private Integer length; </programlisting>
-
- <para></para>
- </section>
- </section>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/search/doc/reference/en/modules/mapping.xml (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/mapping.xml)
===================================================================
--- trunk/HibernateExt/search/doc/reference/en/modules/mapping.xml (rev 0)
+++ trunk/HibernateExt/search/doc/reference/en/modules/mapping.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,574 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="search-mapping" revision="3">
+ <title>Mapping entities to the index structure</title>
+
+ <para>All the metadata information related to indexed entities is described
+ through some Java annotations. There is no need for xml mapping files nor a
+ list of indexed entities. The list is discovered at startup time scanning
+ the Hibernate mapped entities.</para>
+
+ <section id="search-mapping-entity" revision="3">
+ <title>Mapping an entity</title>
+
+ <section>
+ <title>Basic mapping</title>
+
+ <para>First, we must declare a persistent class as indexable. This is
+ done by annotating the class with <literal>@Indexed</literal> (all
+ entities not annotated with <literal>@Indexed</literal> will be ignored
+ by the indexing process):</para>
+
+ <programlisting>@Entity
+<emphasis role="bold">@Indexed(index="indexes/essays")</emphasis>
+public class Essay {
+ ...
+}</programlisting>
+
+ <para>The <literal>index</literal> attribute tells Hibernate what the
+ Lucene directory name is (usually a directory on your file system). If
+ you wish to define a base directory for all Lucene indexes, you can use
+ the <literal>hibernate.search.default.indexBase</literal> property in
+ your configuration file. Each entity instance will be represented by a
+ Lucene <classname>Document</classname> inside the given index (aka
+ Directory).</para>
+
+ <para>For each property (or attribute) of your entity, you have the
+ ability to describe how it will be indexed. The default (ie no
+ annotation) means that the property is completly ignored by the indexing
+ process. <literal>@Field</literal> does declare a property as indexed.
+ When indexing an element to a Lucene document you can specify how it is
+ indexed:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para><literal>name</literal> : describe under which name, the
+ property should be stored in the Lucene Document. The default value
+ is the property name (following the JavaBeans convention)</para>
+ </listitem>
+
+ <listitem>
+ <para><literal>store</literal> : describe whether or not the
+ property is stored in the Lucene index. You can store the value
+ <literal>Store.YES</literal> (comsuming more space in the index),
+ store it in a compressed way <literal>Store.COMPRESS</literal> (this
+ does consume more CPU), or avoid any storage
+ <literal>Store.NO</literal> (this is the default value). When a
+ property is stored, you can retrieve it from the Lucene Document
+ (note that this is not related to whether the element is indexed or
+ not).</para>
+ </listitem>
+
+ <listitem>
+ <para>index: describe how the element is indexed (ie the process
+ used to index the property and the type of information store). The
+ different values are <literal>Index.NO</literal> (no indexing, ie
+ cannot be found by a query), <literal>Index.TOKENIZED</literal> (use
+ an analyzer to process the property),
+ <literal>Index.UN_TOKENISED</literal> (no analyzer pre processing),
+ <literal>Index.NO_NORM</literal> (do not store the normalization
+ data).</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>These attributes are part of the <literal>@Field</literal>
+ annotation.</para>
+
+ <para>Whether or not you want to store the data depends on how you wish
+ to use the index query result. As of today, for a pure
+ <productname>Hibernate Search </productname> usage, storing is not
+ necessary. Whether or not you want to tokenize a property or not depends
+ on whether you wish to search the element as is, or only normalized part
+ of it. It make sense to tokenize a text field, but it does not to do it
+ for a date field (or an id field).</para>
+
+ <para>Finally, the id property of an entity is a special property used
+ by <productname>Hibernate Search</productname> to ensure index unicity
+ of a given entity. By design, an id has to be stored and must not be
+ tokenized. To mark a property as index id, use the
+ <literal>@DocumentId</literal> annotation.</para>
+
+ <programlisting>@Entity
+ at Indexed(index="indexes/essays")
+public class Essay {
+ ...
+
+ @Id
+ <emphasis role="bold">@DocumentId</emphasis>
+ public Long getId() { return id; }
+
+ <emphasis role="bold">@Field(name="Abstract", index=Index.TOKENIZED, store=Store.YES)</emphasis>
+ public String getSummary() { return summary; }
+
+ @Lob
+ <emphasis role="bold">@Field(index=Index.TOKENIZED)</emphasis>
+ public String getText() { return text; }
+}</programlisting>
+
+ <para>These annotations define an index with three fields:
+ <literal>id</literal> , <literal>Abstract</literal> and
+ <literal>text</literal> . Note that by default the field name is
+ decapitalized, following the JavaBean specification.</para>
+
+ <note>
+ <para>You <emphasis>must</emphasis> specify
+ <literal>@DocumentId</literal> on the identifier property of your
+ entity class.</para>
+ </note>
+ </section>
+
+ <section>
+ <title>Embedded and associated objects</title>
+
+ <para>Associated objects as well as embedded objects can be indexed as
+ well as part of the root entity index.</para>
+
+ <programlisting>@Entity
+ at Indexed
+public class Place {
+ @Id
+ @GeneratedValue
+ @DocumentId
+ private Long id;
+
+ @Field( index = Index.TOKENIZED )
+ private String name;
+
+ @OneToOne( cascade = { CascadeType.PERSIST, CascadeType.REMOVE } )
+ <emphasis role="bold">@IndexedEmbedded</emphasis>
+ private Address address;
+ ....
+}
+
+ at Entity
+ at Indexed
+public class Address {
+ @Id
+ @GeneratedValue
+ @DocumentId
+ private Long id;
+
+ @Field(index=Index.TOKENIZED)
+ private String street;
+
+ @Field(index=Index.TOKENIZED)
+ private String city;
+
+ <emphasis role="bold">@IndexedEmbedded(depth = 1, prefix = "ownedBy_")</emphasis>
+ private Owner ownedBy;
+ ...
+}
+
+ at Embeddable
+public class Owner {
+ @Field(index = Index.TOKENIZED)
+ private String name;
+ ...
+}</programlisting>
+
+ <para>Any <literal>@*ToOne</literal> and <literal>@Embedded</literal>
+ attribute can be annotated with <literal>@IndexedEmbedded</literal>. The
+ attributes of the associated class will then be added to the main entity
+ index. In the previous example, the index will contain the following
+ fields</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>id</para>
+ </listitem>
+
+ <listitem>
+ <para>name</para>
+ </listitem>
+
+ <listitem>
+ <para>address.street</para>
+ </listitem>
+
+ <listitem>
+ <para>address.city</para>
+ </listitem>
+
+ <listitem>
+ <para>addess.ownedBy_name</para>
+ </listitem>
+ </itemizedlist>
+
+ <para>The default prefix is <literal>propertyName.</literal>, following
+ the traditional object navigation convention. You can override it using
+ the <literal>prefix</literal> attribute.</para>
+
+ <para><literal>depth</literal> is necessary when the object graph
+ contains a cyclic dependency of classes (not instance). For example, if
+ <classname>Owner</classname> points to <classname>Place</classname>.
+ Hibernate Search will stop including Indexed embedded atttributes after
+ reaching the expected depth (or is the object graph boundaries are
+ reached). A class having a self reference is an example of cyclic
+ dependency. In our example, because <literal>depth</literal> is set to
+ 1, any <literal>@IndexedEmbedded</literal> attribute in Owner (if any)
+ will be ignored.</para>
+
+ <para>Such a mapping is very useful to express queries refering to
+ associated objects, such as:</para>
+
+ <itemizedlist>
+ <listitem>
+ <para>Return places where name contains JBoss and where address city
+ is Atlanta. In Lucene query this would be</para>
+
+ <programlisting>+name:jboss +address.city:atlanta </programlisting>
+ </listitem>
+
+ <listitem>
+ <para>Return places where name contains JBoss and where owner's name
+ contain Joe. In Lucene query this would be</para>
+
+ <programlisting>+name:jboss +address.orderBy_name:joe </programlisting>
+ </listitem>
+ </itemizedlist>
+
+ <para>In a way it mimics the relational join operation in a more
+ efficient way (at the cost of data duplication). Remember that, out of
+ the box, Lucene indexes have no notion of association, the join
+ operation is simply non-existent. It might help to keep the relational
+ model normalzed while benefiting from the full text index speed and
+ feature richness.</para>
+
+ <para><note>
+ <para>An associated object can itself be (but don't have to)
+ <literal>@Indexed</literal> </para>
+ </note></para>
+ </section>
+
+ <section>
+ <title>Boost factor</title>
+
+ <para>Lucene has the notion of <emphasis>boost factor</emphasis> . It's
+ a way to give more weigth to a field or to an indexed element over an
+ other during the indexation process. You can use
+ <literal>@Boost</literal> at the field or the class level.</para>
+
+ <programlisting>@Entity
+ at Indexed(index="indexes/essays")
+<emphasis role="bold">@Boost(2)</emphasis>
+public class Essay {
+ ...
+
+ @Id
+ @DocumentId
+ public Long getId() { return id; }
+
+ @Field(name="Abstract", index=Index.TOKENIZED, store=Store.YES)
+ <emphasis role="bold">@Boost(2.5f)</emphasis>
+ public String getSummary() { return summary; }
+
+ @Lob
+ @Field(index=Index.TOKENIZED)
+ public String getText() { return text; }
+} </programlisting>
+
+ <para>In our example, Essay's probability to reach the top of the search
+ list will be multiplied by 2 and the summary field will be 2.5 more
+ important than the test field. Note that this explaination is actually
+ wrong, but it is simple and close enought to the reality. Please check
+ the Lucene documentation or the excellent <citetitle>Lucene In Action
+ </citetitle> from Otis Gospodnetic and Erik Hatcher.</para>
+ </section>
+
+ <section>
+ <title>Analyser</title>
+
+ <para>The analyzer class used to index the elements is configurable
+ through the <literal>hibernate.search.analyzer</literal> property. If
+ none defined,
+ <classname>org.apache.lucene.analysis.standard.StandardAnalyzer</classname>
+ is used as the default.</para>
+ </section>
+ </section>
+
+ <section id="search-mapping-bridge">
+ <title>Property/Field Bridge</title>
+
+ <para>All field of a full text index in Lucene have to be represented as
+ Strings. Ones Java properties have to be indexed in a String form. For
+ most of your properties, <productname>Hibernate Search</productname> does
+ the translation job for you thanks to a built-in set of bridges. In some
+ cases, though you need a fine grain control over the translation
+ process.</para>
+
+ <section>
+ <title>Built-in bridges</title>
+
+ <para><literal>Hibernate Search</literal> comes bundled with a set of
+ built-in bridges between a Java property type and its full text
+ representation.</para>
+
+ <para><literal>Null</literal> elements are not indexed (Lucene does not
+ support null elements and it does not make much sense either)</para>
+
+ <variablelist>
+ <varlistentry>
+ <term>null</term>
+
+ <listitem>
+ <para>null elements are not indexed. Lucene does not support null
+ elements and this does not make much sense either.</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>java.lang.String</term>
+
+ <listitem>
+ <para>String are indexed as is</para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>short, Short, integer, Integer, long, Long, float, Float,
+ double, Double, BigInteger, BigDecimal</term>
+
+ <listitem>
+ <para>Numbers are converted in their String representation. Note
+ that numbers cannot be compared by Lucene (ie used in ranged
+ queries) out of the box: they have to be padded <footnote>
+ <para>Using a Range query is debattable and has drawbacks, an
+ alternative approach is to use a Filter query which will
+ filter the result query to the appropriate range.</para>
+
+ <para><productname>Hibernate Search</productname> will support
+ a padding mechanism</para>
+ </footnote></para>
+ </listitem>
+ </varlistentry>
+
+ <varlistentry>
+ <term>java.util.Date</term>
+
+ <listitem>
+ <para>Dates are stored as yyyyMMddHHmmssSSS in GMT time
+ (200611072203012 for Nov 7th of 2006 4:03PM and 12ms EST). You
+ shouldn't really bother with the internal format. What is
+ important is that when using a DateRange Query, you should know
+ that the dates have to be expressed in GMT time.</para>
+
+ <para>Usually, storing the date up to the milisecond is not
+ necessary. <literal>@DateBridge</literal> defines the appropriate
+ resolution you are willing to store in the index ( <literal>
+ <literal>@DateBridge(resolution=Resolution.DAY)</literal>
+ </literal> ). The date pattern will then be truncated
+ accordingly.</para>
+
+ <programlisting>@Entity
+ at Indexed
+public class Meeting {
+ @Field(index=Index.UN_TOKENIZED)
+ <emphasis role="bold">@DateBridge(resolution=Resolution.MINUTE)</emphasis>
+ private Date date;
+ ... </programlisting>
+
+ <warning>
+ <para>A Date whose resolution is lower than
+ <literal>MILLISECOND</literal> cannot be a
+ <literal>@DocumentId</literal></para>
+ </warning>
+ </listitem>
+ </varlistentry>
+ </variablelist>
+
+ <para></para>
+ </section>
+
+ <section>
+ <title>Custom Bridge</title>
+
+ <para>It can happen that the built-in bridges of Hibernate Search does
+ not cover some of your property types, or that the String representation
+ used is not what you expect.</para>
+
+ <section>
+ <title>StringBridge</title>
+
+ <para>The simpliest custom solution is to give <productname>Hibernate
+ Search </productname> an implementation of your expected
+ <emphasis>object to String</emphasis> bridge. To do so you need to
+ implements the
+ <literal>org.hibernate.search.bridge.StringBridge</literal>
+ interface</para>
+
+ <programlisting>/**
+ * Padding Integer bridge.
+ * All numbers will be padded with 0 to match 5 digits
+ *
+ * @author Emmanuel Bernard
+ */
+public class PaddedIntegerBridge implements <emphasis role="bold">StringBridge</emphasis> {
+
+ private int PADDING = 5;
+
+ <emphasis role="bold">public String objectToString(Object object)</emphasis> {
+ String rawInteger = ( (Integer) object ).toString();
+ if (rawInteger.length() > PADDING)
+ throw new IllegalArgumentException( "Try to pad on a number too big" );
+ StringBuilder paddedInteger = new StringBuilder( );
+ for ( int padIndex = rawInteger.length() ; padIndex < PADDING ; padIndex++ ) {
+ paddedInteger.append('0');
+ }
+ return paddedInteger.append( rawInteger ).toString();
+ }
+} </programlisting>
+
+ <para>Then any property or field can use this bridge thanks to the
+ <literal>@FieldBridge</literal> annotation</para>
+
+ <programlisting><emphasis role="bold">@FieldBridge(impl = PaddedIntegerBridge.class)</emphasis>
+private Integer length; </programlisting>
+
+ <para>Parameters can be passed to the Bridge implementation making it
+ more flexible. The Bridge implementation implements a
+ <classname>ParameterizedBridge</classname> interface, and the
+ parameters are passed through the <literal>@FieldBridge</literal>
+ annotation.</para>
+
+ <programlisting>public class PaddedIntegerBridge implements StringBridge, <emphasis
+ role="bold">ParameterizedBridge</emphasis> {
+
+ public static String PADDING_PROPERTY = "padding";
+ private int padding = 5; //default
+
+ <emphasis role="bold">public void setParameterValues(Map parameters)</emphasis> {
+ Object padding = parameters.get( PADDING_PROPERTY );
+ if (padding != null) this.padding = (Integer) padding;
+ }
+
+ public String objectToString(Object object) {
+ String rawInteger = ( (Integer) object ).toString();
+ if (rawInteger.length() > padding)
+ throw new IllegalArgumentException( "Try to pad on a number too big" );
+ StringBuilder paddedInteger = new StringBuilder( );
+ for ( int padIndex = rawInteger.length() ; padIndex < padding ; padIndex++ ) {
+ paddedInteger.append('0');
+ }
+ return paddedInteger.append( rawInteger ).toString();
+ }
+}
+
+
+//property
+ at FieldBridge(impl = PaddedIntegerBridge.class,
+ <emphasis role="bold">params = @Parameter(name="padding", value="10")</emphasis>
+ )
+private Integer length; </programlisting>
+
+ <para>The <classname>ParameterizedBridge</classname> interface can be
+ implemented by <classname>StringBridge</classname> ,
+ <classname>TwoWayStringBridge</classname> ,
+ <classname>FieldBridge</classname> implementations (see
+ bellow).</para>
+
+ <para>If you expect to use your bridge implementation on for an id
+ property (ie annotated with <literal>@DocumentId</literal> ), you need
+ to use a slightly extended version of <literal>StringBridge</literal>
+ named <classname>TwoWayStringBridge</classname> . <literal>Hibernate
+ Search </literal> needs to read the string representation of the
+ identifier and generate the object out of it. There is not difference
+ in the way the <literal>@FieldBridge</literal> annotation is
+ used.</para>
+
+ <programlisting>public class PaddedIntegerBridge implements TwoWayStringBridge, ParameterizedBridge {
+
+ public static String PADDING_PROPERTY = "padding";
+ private int padding = 5; //default
+
+ public void setParameterValues(Map parameters) {
+ Object padding = parameters.get( PADDING_PROPERTY );
+ if (padding != null) this.padding = (Integer) padding;
+ }
+
+ public String objectToString(Object object) {
+ String rawInteger = ( (Integer) object ).toString();
+ if (rawInteger.length() > padding)
+ throw new IllegalArgumentException( "Try to pad on a number too big" );
+ StringBuilder paddedInteger = new StringBuilder( );
+ for ( int padIndex = rawInteger.length() ; padIndex < padding ; padIndex++ ) {
+ paddedInteger.append('0');
+ }
+ return paddedInteger.append( rawInteger ).toString();
+ }
+
+ <emphasis role="bold">public Object stringToObject(String stringValue)</emphasis> {
+ return new Integer(stringValue);
+ }
+}
+
+
+//id property
+ at DocumentId
+ at FieldBridge(impl = PaddedIntegerBridge.class,
+ params = @Parameter(name="padding", value="10")
+private Integer id;
+ </programlisting>
+
+ <para>It is critically important for the two-way process to be
+ idempotent (ie object = stringToObject( objectToString( object ) )
+ ).</para>
+ </section>
+
+ <section>
+ <title>FieldBridge</title>
+
+ <para>Some usecase requires more than a simple object to string
+ translation when mapping a property to a Lucene index. To give you
+ most of the flexibility you can also implement a bridge as a
+ <classname>FieldBridge</classname> . This interface give you a
+ property value and let you map it the way you want in your Lucene
+ <classname>Document</classname> .This interface is very similar in its
+ concept to the <productname>Hibernate</productname>
+ <classname>UserType</classname> .</para>
+
+ <para>You can for example store a given property in two different
+ document fields</para>
+
+ <programlisting>/**
+ * Store the date in 3 different field year, month, day
+ * to ease Range Query per year, month or day
+ * (eg get all the elements of december for the last 5 years)
+ *
+ * @author Emmanuel Bernard
+ */
+public class DateSplitBridge implements FieldBridge {
+ private final static TimeZone GMT = TimeZone.getTimeZone("GMT");
+
+ <emphasis role="bold">public void set(String name, Object value, Document document, Field.Store
+ store, Field.Index index, Float boost) {
+ </emphasis>
+ Date date = (Date) value;
+ Calendar cal = GregorianCalendar.getInstance( GMT );
+ cal.setTime( date );
+ int year = cal.get( Calendar.YEAR );
+ int month = cal.get( Calendar.MONTH ) + 1;
+ int day = cal.get( Calendar.DAY_OF_MONTH );
+ //set year
+ Field field = new Field( name + ".year", String.valueOf(year), store, index );
+ if ( boost != null ) field.setBoost( boost );
+ document.add( field );
+ //set month and pad it if needed
+ field = new Field( name + ".month", month < 10 ? "0" : "" + String.valueOf(month), store, index);
+ if ( boost != null ) field.setBoost( boost );
+ document.add( field );
+ //set day and pad it if needed
+ field = new Field( name + ".day", day < 10 ? "0" : "" + String.valueOf(day), store, index );
+ if ( boost != null ) field.setBoost( boost );
+ document.add( field );
+ }
+}
+
+
+//property
+<emphasis role="bold">@FieldBridge(impl = DateSplitBridge.class)</emphasis>
+private Integer length; </programlisting>
+
+ <para></para>
+ </section>
+ </section>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/search/doc/reference/en/modules/query.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/query.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/en/modules/query.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="search-query">
- <title>Querying</title>
-
- <para>The second most important capability of <productname>Hibernate Search
- </productname> is the ability to execute a Lucene query and retrieve
- entities managed by an Hibernate session, providing the power of Lucene
- without living the Hibernate paradygm, and giving another dimension to the
- Hibernate classic search mechanisms (HQL, Criteria query, native SQL
- query).</para>
-
- <para>To access the <productname>Hibernate Search</productname> querying
- facilities, you have to use an Hibernate
- <classname>FullTextSession</classname> . A SearchSession wrap an regular
- <classname>org.hibernate.Session</classname> to provide query and indexing
- capabilities.</para>
-
- <programlisting>Session session = sessionFactory.openSession();
-...
-FullTextSession fullTextSession = Search.createFullTextSession(session); </programlisting>
-
- <para>The search facility is built on native Lucene queries.</para>
-
- <programlisting>org.apache.lucene.queryParser.QueryParser parser = new QueryParser("title", new StopAnalyzer() );
-
-org.apache.lucene.search.Query luceneQuery = parser.parse( "summary:Festina Or brand:Seiko" );
-<emphasis role="bold">org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery );
- </emphasis>
-
-List result = fullTextQuery.list(); //return a list of managed objects </programlisting>
-
- <para>The Hibernate query built on top of the Lucene query is a regular
- <literal>org.hibernate.Query</literal> , you are is the same paradygm as the
- other Hibernate query facilities (HQL, Native or Criteria). The regular
- <literal>list()</literal> , <literal>uniqueResult()</literal> ,
- <literal>iterate()</literal> and <literal>scroll()</literal> can be
- used.</para>
-
- <para>If you expect a reasonnable result number and expect to work on all of
- them, <methodname>list()</methodname> or
- <methodname>uniqueResult()</methodname> are recommanded.
- <methodname>list()</methodname> work best if the entity
- <literal>batch-size</literal> is set up properly. Note that Hibernate Seach
- has to process all Lucene Hits elements when using
- <methodname>list()</methodname> , <methodname>uniqueResult()</methodname>
- and <methodname>iterate()</methodname> . If you wish to minimize Lucene
- document loading, <methodname>scroll()</methodname> is more appropriate,
- Don't forget to close the <classname>ScrollableResults</classname> object
- when you're done, since it keeps Lucene resources.</para>
-
- <para>An efficient way to work with queries is to use pagination. The
- pagination API is exactly the one available in
- <classname>org.hibernate.Query</classname> :</para>
-
- <programlisting><emphasis role="bold">org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery );
- </emphasis>
-fullTextQuery.setFirstResult(30);
-fullTextQuery.setMaxResult(20);
-fullTextQuery.list(); //will return a list of 20 elements starting from the 30th </programlisting>
-
- <para>Only the relevant Lucene Documents are accessed.</para>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/search/doc/reference/en/modules/query.xml (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/modules/query.xml)
===================================================================
--- trunk/HibernateExt/search/doc/reference/en/modules/query.xml (rev 0)
+++ trunk/HibernateExt/search/doc/reference/en/modules/query.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,62 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="search-query">
+ <title>Querying</title>
+
+ <para>The second most important capability of <productname>Hibernate Search
+ </productname> is the ability to execute a Lucene query and retrieve
+ entities managed by an Hibernate session, providing the power of Lucene
+ without living the Hibernate paradygm, and giving another dimension to the
+ Hibernate classic search mechanisms (HQL, Criteria query, native SQL
+ query).</para>
+
+ <para>To access the <productname>Hibernate Search</productname> querying
+ facilities, you have to use an Hibernate
+ <classname>FullTextSession</classname> . A SearchSession wrap an regular
+ <classname>org.hibernate.Session</classname> to provide query and indexing
+ capabilities.</para>
+
+ <programlisting>Session session = sessionFactory.openSession();
+...
+FullTextSession fullTextSession = Search.createFullTextSession(session); </programlisting>
+
+ <para>The search facility is built on native Lucene queries.</para>
+
+ <programlisting>org.apache.lucene.queryParser.QueryParser parser = new QueryParser("title", new StopAnalyzer() );
+
+org.apache.lucene.search.Query luceneQuery = parser.parse( "summary:Festina Or brand:Seiko" );
+<emphasis role="bold">org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery );
+ </emphasis>
+
+List result = fullTextQuery.list(); //return a list of managed objects </programlisting>
+
+ <para>The Hibernate query built on top of the Lucene query is a regular
+ <literal>org.hibernate.Query</literal> , you are is the same paradygm as the
+ other Hibernate query facilities (HQL, Native or Criteria). The regular
+ <literal>list()</literal> , <literal>uniqueResult()</literal> ,
+ <literal>iterate()</literal> and <literal>scroll()</literal> can be
+ used.</para>
+
+ <para>If you expect a reasonnable result number and expect to work on all of
+ them, <methodname>list()</methodname> or
+ <methodname>uniqueResult()</methodname> are recommanded.
+ <methodname>list()</methodname> work best if the entity
+ <literal>batch-size</literal> is set up properly. Note that Hibernate Seach
+ has to process all Lucene Hits elements when using
+ <methodname>list()</methodname> , <methodname>uniqueResult()</methodname>
+ and <methodname>iterate()</methodname> . If you wish to minimize Lucene
+ document loading, <methodname>scroll()</methodname> is more appropriate,
+ Don't forget to close the <classname>ScrollableResults</classname> object
+ when you're done, since it keeps Lucene resources.</para>
+
+ <para>An efficient way to work with queries is to use pagination. The
+ pagination API is exactly the one available in
+ <classname>org.hibernate.Query</classname> :</para>
+
+ <programlisting><emphasis role="bold">org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery( luceneQuery );
+ </emphasis>
+fullTextQuery.setFirstResult(30);
+fullTextQuery.setMaxResult(20);
+fullTextQuery.list(); //will return a list of 20 elements starting from the 30th </programlisting>
+
+ <para>Only the relevant Lucene Documents are accessed.</para>
+</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/search/doc/reference/en/styles (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/styles)
Deleted: trunk/HibernateExt/search/doc/reference/en/styles/fopdf.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/styles/fopdf.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/en/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,519 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL FO configuration file for the Hibernate
- Reference Documentation. It defines a custom titlepage and
- the parameters for the A4 sized PDF printable output.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
-
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- exclude-result-prefixes="#default">
-
- <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
-
- <!--###################################################
- Custom Title Page
- ################################################### -->
-
- <xsl:template name="book.titlepage.recto">
- <fo:block>
- <fo:table table-layout="fixed" width="175mm">
- <fo:table-column column-width="175mm"/>
- <fo:table-body>
- <fo:table-row>
- <fo:table-cell text-align="center">
- <fo:block>
- <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/title"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="18pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/subtitle"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
- Version:
- <xsl:value-of select="bookinfo/releaseinfo"/>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </fo:block>
- </xsl:template>
-
- <!-- Prevent blank pages in output -->
- <xsl:template name="book.titlepage.before.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.separator">
- </xsl:template>
-
- <!--###################################################
- Header
- ################################################### -->
-
- <!-- More space in the center header for long text -->
- <xsl:attribute-set name="header.content.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$body.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="margin-left">-5em</xsl:attribute>
- <xsl:attribute name="margin-right">-5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Custom Footer
- ################################################### -->
-
- <!-- This footer prints the Hibernate version number on the left side -->
- <xsl:template name="footer.content">
- <xsl:param name="pageclass" select="''"/>
- <xsl:param name="sequence" select="''"/>
- <xsl:param name="position" select="''"/>
- <xsl:param name="gentext-key" select="''"/>
-
- <xsl:variable name="Version">
- <xsl:choose>
- <xsl:when test="//releaseinfo">
- <xsl:text>Hibernate </xsl:text>
- <xsl:value-of select="//releaseinfo"/>
- </xsl:when>
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
-
- <xsl:choose>
- <xsl:when test="$sequence='blank'">
- <xsl:choose>
- <xsl:when test="$double.sided != 0 and $position = 'left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position = 'center'">
- <!-- nop -->
- </xsl:when>
-
- <xsl:otherwise>
- <fo:page-number/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
-
- <xsl:when test="$pageclass='titlepage'">
- <!-- nop: other titlepage sequences have no footer -->
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <!--###################################################
- Custom Toc Line
- ################################################### -->
-
- <!-- Improve the TOC. -->
- <xsl:template name="toc.line">
- <xsl:variable name="id">
- <xsl:call-template name="object.id"/>
- </xsl:variable>
-
- <xsl:variable name="label">
- <xsl:apply-templates select="." mode="label.markup"/>
- </xsl:variable>
-
- <fo:block text-align-last="justify"
- end-indent="{$toc.indent.width}pt"
- last-line-end-indent="-{$toc.indent.width}pt">
- <fo:inline keep-with-next.within-line="always">
- <fo:basic-link internal-destination="{$id}">
-
- <!-- Chapter titles should be bold. -->
- <xsl:choose>
- <xsl:when test="local-name(.) = 'chapter'">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="$label != ''">
- <xsl:copy-of select="$label"/>
- <xsl:value-of select="$autotoc.label.separator"/>
- </xsl:if>
- <xsl:apply-templates select="." mode="titleabbrev.markup"/>
- </fo:basic-link>
- </fo:inline>
- <fo:inline keep-together.within-line="always">
- <xsl:text> </xsl:text>
- <fo:leader leader-pattern="dots"
- leader-pattern-width="3pt"
- leader-alignment="reference-area"
- keep-with-next.within-line="always"/>
- <xsl:text> </xsl:text>
- <fo:basic-link internal-destination="{$id}">
- <fo:page-number-citation ref-id="{$id}"/>
- </fo:basic-link>
- </fo:inline>
- </fo:block>
- </xsl:template>
-
- <!--###################################################
- Extensions
- ################################################### -->
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <!-- FOP provide only PDF Bookmarks at the moment -->
- <xsl:param name="fop.extensions">1</xsl:param>
-
- <!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
- <!-- Dot and Whitespace as separator in TOC between Label and Title-->
- <xsl:param name="autotoc.label.separator" select="'. '"/>
-
-
- <!--###################################################
- Paper & Page Size
- ################################################### -->
-
- <!-- Paper type, no headers on blank pages, no double sided printing -->
- <xsl:param name="paper.type" select="'A4'"/>
- <xsl:param name="double.sided">0</xsl:param>
- <xsl:param name="headers.on.blank.pages">0</xsl:param>
- <xsl:param name="footers.on.blank.pages">0</xsl:param>
-
- <!-- Space between paper border and content (chaotic stuff, don't touch) -->
- <xsl:param name="page.margin.top">5mm</xsl:param>
- <xsl:param name="region.before.extent">10mm</xsl:param>
- <xsl:param name="body.margin.top">10mm</xsl:param>
-
- <xsl:param name="body.margin.bottom">15mm</xsl:param>
- <xsl:param name="region.after.extent">10mm</xsl:param>
- <xsl:param name="page.margin.bottom">0mm</xsl:param>
-
- <xsl:param name="page.margin.outer">18mm</xsl:param>
- <xsl:param name="page.margin.inner">18mm</xsl:param>
-
- <!-- No intendation of Titles -->
- <xsl:param name="title.margin.left">0pc</xsl:param>
-
- <!--###################################################
- Fonts & Styles
- ################################################### -->
-
- <!-- Default Font size -->
- <xsl:param name="body.font.master">11</xsl:param>
-
- <!-- Line height in body text -->
- <xsl:param name="line-height">1.4</xsl:param>
-
- <!-- Monospaced fonts are smaller than regular text -->
- <xsl:attribute-set name="monospace.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$monospace.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="font-size">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Tables
- ################################################### -->
-
- <!-- The table width should be adapted to the paper size -->
- <xsl:param name="default.table.width">17.4cm</xsl:param>
-
- <!-- Some padding inside tables -->
- <xsl:attribute-set name="table.cell.padding">
- <xsl:attribute name="padding-left">4pt</xsl:attribute>
- <xsl:attribute name="padding-right">4pt</xsl:attribute>
- <xsl:attribute name="padding-top">4pt</xsl:attribute>
- <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Only hairlines as frame and cell borders in tables -->
- <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
- <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
-
- <!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
- <!-- Label only Sections up to level 2 -->
- <xsl:param name="local.l10n.xml" select="document('')"/>
- <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
- <l:l10n language="en">
- <l:context name="title-numbered">
- <l:template name="sect3" text="%t"/>
- <l:template name="sect4" text="%t"/>
- <l:template name="sect5" text="%t"/>
- </l:context>
- <l:context name="section-xref-numbered">
- <l:template name="sect3" text="the section called %t"/>
- <l:template name="sect4" text="the section called %t"/>
- <l:template name="sect5" text="the section called %t"/>
- </l:context>
- </l:l10n>
- </l:i18n>
-
- <!--###################################################
- Titles
- ################################################### -->
-
- <!-- Chapter title size -->
- <xsl:attribute-set name="chapter.titlepage.recto.style">
- <xsl:attribute name="text-align">left</xsl:attribute>
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.8"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
- Let's remove it, so this sucker can use our attribute-set only... -->
- <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
- <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xsl:use-attribute-sets="chapter.titlepage.recto.style">
- <xsl:call-template name="component.title">
- <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
- </xsl:call-template>
- </fo:block>
- </xsl:template>
-
- <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
- <xsl:attribute-set name="section.title.level1.properties">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.5"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level2.properties">
- <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.25"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level3.properties">
- <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.0"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Titles of formal objects (tables, examples, ...) -->
- <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="hyphenate">false</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Programlistings
- ################################################### -->
-
- <!-- Verbatim text formatting (programlistings) -->
- <xsl:attribute-set name="verbatim.properties">
- <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- <xsl:attribute name="border-color">#444444</xsl:attribute>
- <xsl:attribute name="border-style">solid</xsl:attribute>
- <xsl:attribute name="border-width">0.1pt</xsl:attribute>
- <xsl:attribute name="padding-top">0.5em</xsl:attribute>
- <xsl:attribute name="padding-left">0.5em</xsl:attribute>
- <xsl:attribute name="padding-right">0.5em</xsl:attribute>
- <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
- <xsl:attribute name="margin-left">0.5em</xsl:attribute>
- <xsl:attribute name="margin-right">0.5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Shade (background) programlistings -->
- <xsl:param name="shade.verbatim">1</xsl:param>
- <xsl:attribute-set name="shade.verbatim.style">
- <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Callouts
- ################################################### -->
-
- <!-- We want to use callouts... -->
- <xsl:param name="callout.extensions">1</xsl:param>
-
- <!-- Place callout bullets at this column in programmlisting.-->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
- <!--
- No, don't use crappy graphics for the callout bullets. This setting
- enables some weird Unicode rendering for some fancy bullet points
- in callouts. By default, this can only count to 10 and produces
- strange results if you ever have more than 10 callouts for one
- programlisting. We will fix that next.
- -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!--
- Again, fun with DocBook XSL: The callout bullets are rendered in
- two places: In the programlisting itself and in the list below
- the listing, with the actual callout text. The rendering in the
- programlisting is some XSL transformer extension (e.g. a Saxon
- extension), so we can't change that without messing with the
- extensions. We only can turn it off by setting this limit to
- zero, then, a simple bracket style like "(3)" and "(4)" will
- be used in the programlisting.
- -->
- <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
-
- <!--
- The callout bullets in the actual callout list will be rendered
- with an XSL FO template. The default template is broken: limited to 10
- nice looking Unicode bullet points and then it doesn't print anything,
- the fallback doesn't work. We implement our own template, which is not
- as complicated, more ugly, but works. As always, function is more
- important than form.
- -->
- <xsl:template name="callout-bug">
- <xsl:param name="conum" select='1'/>
- <fo:inline
- color="black"
- padding-top="0.1em"
- padding-bottom="0.1em"
- padding-start="0.2em"
- padding-end="0.2em"
- baseline-shift="0.1em"
- font-family="{$monospace.font.family}"
- font-weight="bold"
- font-size="75%">
- <xsl:text>(</xsl:text>
- <xsl:value-of select="$conum"/>
- <xsl:text>)</xsl:text>
- </fo:inline>
-
- </xsl:template>
-
- <!--###################################################
- Misc
- ################################################### -->
-
- <!-- Correct placement of titles for figures and examples. -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
- <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
- <xsl:param name="variablelist.as.blocks">1</xsl:param>
-
- <!-- The horrible list spacing problems, this is much better. -->
- <xsl:attribute-set name="list.block.spacing">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Newer DocBook XSL apparently thinks that some sections are by
- default "draft" status, and this idiotic thing is by default
- also set to "maybe", so it spits out a lot of errors with the
- latest FOP as the XSL/FO styles have references to some draft
- watermarks, which you actually don't want in the first place.
- Turn this crap off. If you have to work with the "status"
- attribute, don't.
- -->
- <xsl:param name="draft.mode" select="'no'"/>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/search/doc/reference/en/styles/fopdf.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/styles/fopdf.xsl)
===================================================================
--- trunk/HibernateExt/search/doc/reference/en/styles/fopdf.xsl (rev 0)
+++ trunk/HibernateExt/search/doc/reference/en/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,519 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL FO configuration file for the Hibernate
+ Reference Documentation. It defines a custom titlepage and
+ the parameters for the A4 sized PDF printable output.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ exclude-result-prefixes="#default">
+
+ <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
+
+ <!--###################################################
+ Custom Title Page
+ ################################################### -->
+
+ <xsl:template name="book.titlepage.recto">
+ <fo:block>
+ <fo:table table-layout="fixed" width="175mm">
+ <fo:table-column column-width="175mm"/>
+ <fo:table-body>
+ <fo:table-row>
+ <fo:table-cell text-align="center">
+ <fo:block>
+ <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/title"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="18pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/subtitle"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
+ Version:
+ <xsl:value-of select="bookinfo/releaseinfo"/>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Prevent blank pages in output -->
+ <xsl:template name="book.titlepage.before.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.separator">
+ </xsl:template>
+
+ <!--###################################################
+ Header
+ ################################################### -->
+
+ <!-- More space in the center header for long text -->
+ <xsl:attribute-set name="header.content.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-left">-5em</xsl:attribute>
+ <xsl:attribute name="margin-right">-5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Custom Footer
+ ################################################### -->
+
+ <!-- This footer prints the Hibernate version number on the left side -->
+ <xsl:template name="footer.content">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="position" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+ <xsl:variable name="Version">
+ <xsl:choose>
+ <xsl:when test="//releaseinfo">
+ <xsl:text>Hibernate </xsl:text>
+ <xsl:value-of select="//releaseinfo"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$sequence='blank'">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0 and $position = 'left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position = 'center'">
+ <!-- nop -->
+ </xsl:when>
+
+ <xsl:otherwise>
+ <fo:page-number/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$pageclass='titlepage'">
+ <!-- nop: other titlepage sequences have no footer -->
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!--###################################################
+ Custom Toc Line
+ ################################################### -->
+
+ <!-- Improve the TOC. -->
+ <xsl:template name="toc.line">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+
+ <fo:block text-align-last="justify"
+ end-indent="{$toc.indent.width}pt"
+ last-line-end-indent="-{$toc.indent.width}pt">
+ <fo:inline keep-with-next.within-line="always">
+ <fo:basic-link internal-destination="{$id}">
+
+ <!-- Chapter titles should be bold. -->
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'chapter'">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$label != ''">
+ <xsl:copy-of select="$label"/>
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </fo:basic-link>
+ </fo:inline>
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="dots"
+ leader-pattern-width="3pt"
+ leader-alignment="reference-area"
+ keep-with-next.within-line="always"/>
+ <xsl:text> </xsl:text>
+ <fo:basic-link internal-destination="{$id}">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ </fo:inline>
+ </fo:block>
+ </xsl:template>
+
+ <!--###################################################
+ Extensions
+ ################################################### -->
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <!-- FOP provide only PDF Bookmarks at the moment -->
+ <xsl:param name="fop.extensions">1</xsl:param>
+
+ <!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+ <!-- Dot and Whitespace as separator in TOC between Label and Title-->
+ <xsl:param name="autotoc.label.separator" select="'. '"/>
+
+
+ <!--###################################################
+ Paper & Page Size
+ ################################################### -->
+
+ <!-- Paper type, no headers on blank pages, no double sided printing -->
+ <xsl:param name="paper.type" select="'A4'"/>
+ <xsl:param name="double.sided">0</xsl:param>
+ <xsl:param name="headers.on.blank.pages">0</xsl:param>
+ <xsl:param name="footers.on.blank.pages">0</xsl:param>
+
+ <!-- Space between paper border and content (chaotic stuff, don't touch) -->
+ <xsl:param name="page.margin.top">5mm</xsl:param>
+ <xsl:param name="region.before.extent">10mm</xsl:param>
+ <xsl:param name="body.margin.top">10mm</xsl:param>
+
+ <xsl:param name="body.margin.bottom">15mm</xsl:param>
+ <xsl:param name="region.after.extent">10mm</xsl:param>
+ <xsl:param name="page.margin.bottom">0mm</xsl:param>
+
+ <xsl:param name="page.margin.outer">18mm</xsl:param>
+ <xsl:param name="page.margin.inner">18mm</xsl:param>
+
+ <!-- No intendation of Titles -->
+ <xsl:param name="title.margin.left">0pc</xsl:param>
+
+ <!--###################################################
+ Fonts & Styles
+ ################################################### -->
+
+ <!-- Default Font size -->
+ <xsl:param name="body.font.master">11</xsl:param>
+
+ <!-- Line height in body text -->
+ <xsl:param name="line-height">1.4</xsl:param>
+
+ <!-- Monospaced fonts are smaller than regular text -->
+ <xsl:attribute-set name="monospace.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$monospace.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Tables
+ ################################################### -->
+
+ <!-- The table width should be adapted to the paper size -->
+ <xsl:param name="default.table.width">17.4cm</xsl:param>
+
+ <!-- Some padding inside tables -->
+ <xsl:attribute-set name="table.cell.padding">
+ <xsl:attribute name="padding-left">4pt</xsl:attribute>
+ <xsl:attribute name="padding-right">4pt</xsl:attribute>
+ <xsl:attribute name="padding-top">4pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Only hairlines as frame and cell borders in tables -->
+ <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
+ <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
+
+ <!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+ <!-- Label only Sections up to level 2 -->
+ <xsl:param name="local.l10n.xml" select="document('')"/>
+ <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+ <l:l10n language="en">
+ <l:context name="title-numbered">
+ <l:template name="sect3" text="%t"/>
+ <l:template name="sect4" text="%t"/>
+ <l:template name="sect5" text="%t"/>
+ </l:context>
+ <l:context name="section-xref-numbered">
+ <l:template name="sect3" text="the section called %t"/>
+ <l:template name="sect4" text="the section called %t"/>
+ <l:template name="sect5" text="the section called %t"/>
+ </l:context>
+ </l:l10n>
+ </l:i18n>
+
+ <!--###################################################
+ Titles
+ ################################################### -->
+
+ <!-- Chapter title size -->
+ <xsl:attribute-set name="chapter.titlepage.recto.style">
+ <xsl:attribute name="text-align">left</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.8"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
+ Let's remove it, so this sucker can use our attribute-set only... -->
+ <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xsl:use-attribute-sets="chapter.titlepage.recto.style">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
+ <xsl:attribute-set name="section.title.level1.properties">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.5"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level2.properties">
+ <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.25"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level3.properties">
+ <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.0"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Titles of formal objects (tables, examples, ...) -->
+ <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Programlistings
+ ################################################### -->
+
+ <!-- Verbatim text formatting (programlistings) -->
+ <xsl:attribute-set name="verbatim.properties">
+ <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ <xsl:attribute name="border-color">#444444</xsl:attribute>
+ <xsl:attribute name="border-style">solid</xsl:attribute>
+ <xsl:attribute name="border-width">0.1pt</xsl:attribute>
+ <xsl:attribute name="padding-top">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-left">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-right">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-left">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-right">0.5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Shade (background) programlistings -->
+ <xsl:param name="shade.verbatim">1</xsl:param>
+ <xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- We want to use callouts... -->
+ <xsl:param name="callout.extensions">1</xsl:param>
+
+ <!-- Place callout bullets at this column in programmlisting.-->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+ <!--
+ No, don't use crappy graphics for the callout bullets. This setting
+ enables some weird Unicode rendering for some fancy bullet points
+ in callouts. By default, this can only count to 10 and produces
+ strange results if you ever have more than 10 callouts for one
+ programlisting. We will fix that next.
+ -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!--
+ Again, fun with DocBook XSL: The callout bullets are rendered in
+ two places: In the programlisting itself and in the list below
+ the listing, with the actual callout text. The rendering in the
+ programlisting is some XSL transformer extension (e.g. a Saxon
+ extension), so we can't change that without messing with the
+ extensions. We only can turn it off by setting this limit to
+ zero, then, a simple bracket style like "(3)" and "(4)" will
+ be used in the programlisting.
+ -->
+ <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
+
+ <!--
+ The callout bullets in the actual callout list will be rendered
+ with an XSL FO template. The default template is broken: limited to 10
+ nice looking Unicode bullet points and then it doesn't print anything,
+ the fallback doesn't work. We implement our own template, which is not
+ as complicated, more ugly, but works. As always, function is more
+ important than form.
+ -->
+ <xsl:template name="callout-bug">
+ <xsl:param name="conum" select='1'/>
+ <fo:inline
+ color="black"
+ padding-top="0.1em"
+ padding-bottom="0.1em"
+ padding-start="0.2em"
+ padding-end="0.2em"
+ baseline-shift="0.1em"
+ font-family="{$monospace.font.family}"
+ font-weight="bold"
+ font-size="75%">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </fo:inline>
+
+ </xsl:template>
+
+ <!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Correct placement of titles for figures and examples. -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+ <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
+ <xsl:param name="variablelist.as.blocks">1</xsl:param>
+
+ <!-- The horrible list spacing problems, this is much better. -->
+ <xsl:attribute-set name="list.block.spacing">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Newer DocBook XSL apparently thinks that some sections are by
+ default "draft" status, and this idiotic thing is by default
+ also set to "maybe", so it spits out a lot of errors with the
+ latest FOP as the XSL/FO styles have references to some draft
+ watermarks, which you actually don't want in the first place.
+ Turn this crap off. If you have to work with the "status"
+ attribute, don't.
+ -->
+ <xsl:param name="draft.mode" select="'no'"/>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/search/doc/reference/en/styles/html.css
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/styles/html.css 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/en/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,97 +0,0 @@
-A {
- color: #003399;
-}
-
-A:active {
- color: #003399;
-}
-
-A:visited {
- color: #888888;
-}
-
-P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
- color: #000000;
-}
-
-TD, TH, SPAN {
- color: #000000;
-}
-
-BLOCKQUOTE {
- margin-right: 0px;
-}
-
-
-H1, H2, H3, H4, H5, H6 {
- color: #000000;
- font-weight:500;
- margin-top:10px;
- padding-top:15px;
-}
-
-TABLE {
- border-collapse: collapse;
- border-spacing:0;
- border: 1px thin black;
- empty-cells: hide;
-}
-
-TD {
- padding: 4pt;
-}
-
-H1 { font-size: 150%; }
-H2 { font-size: 140%; }
-H3 { font-size: 110%; font-weight: bold; }
-H4 { font-size: 110%; font-weight: bold;}
-H5 { font-size: 100%; font-style: italic; }
-H6 { font-size: 100%; font-style: italic; }
-
-TT {
-font-size: 90%;
- font-family: "Courier New", Courier, monospace;
- color: #000000;
-}
-
-PRE {
-font-size: 100%;
- padding: 5px;
- border-style: solid;
- border-width: 1px;
- border-color: #CCCCCC;
- background-color: #F4F4F4;
-}
-
-UL, OL, LI {
- list-style: disc;
-}
-
-HR {
- width: 100%;
- height: 1px;
- background-color: #CCCCCC;
- border-width: 0px;
- padding: 0px;
- color: #CCCCCC;
-}
-
-.variablelist {
- padding-top: 10;
- padding-bottom:10;
- margin:0;
-}
-
-.itemizedlist, UL {
- padding-top: 0;
- padding-bottom:0;
- margin:0;
-}
-
-.term {
- font-weight:bold;
-}
-
-
-
-
Copied: trunk/HibernateExt/search/doc/reference/en/styles/html.css (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/styles/html.css)
===================================================================
--- trunk/HibernateExt/search/doc/reference/en/styles/html.css (rev 0)
+++ trunk/HibernateExt/search/doc/reference/en/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,97 @@
+A {
+ color: #003399;
+}
+
+A:active {
+ color: #003399;
+}
+
+A:visited {
+ color: #888888;
+}
+
+P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
+ color: #000000;
+}
+
+TD, TH, SPAN {
+ color: #000000;
+}
+
+BLOCKQUOTE {
+ margin-right: 0px;
+}
+
+
+H1, H2, H3, H4, H5, H6 {
+ color: #000000;
+ font-weight:500;
+ margin-top:10px;
+ padding-top:15px;
+}
+
+TABLE {
+ border-collapse: collapse;
+ border-spacing:0;
+ border: 1px thin black;
+ empty-cells: hide;
+}
+
+TD {
+ padding: 4pt;
+}
+
+H1 { font-size: 150%; }
+H2 { font-size: 140%; }
+H3 { font-size: 110%; font-weight: bold; }
+H4 { font-size: 110%; font-weight: bold;}
+H5 { font-size: 100%; font-style: italic; }
+H6 { font-size: 100%; font-style: italic; }
+
+TT {
+font-size: 90%;
+ font-family: "Courier New", Courier, monospace;
+ color: #000000;
+}
+
+PRE {
+font-size: 100%;
+ padding: 5px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #CCCCCC;
+ background-color: #F4F4F4;
+}
+
+UL, OL, LI {
+ list-style: disc;
+}
+
+HR {
+ width: 100%;
+ height: 1px;
+ background-color: #CCCCCC;
+ border-width: 0px;
+ padding: 0px;
+ color: #CCCCCC;
+}
+
+.variablelist {
+ padding-top: 10;
+ padding-bottom:10;
+ margin:0;
+}
+
+.itemizedlist, UL {
+ padding-top: 0;
+ padding-bottom:0;
+ margin:0;
+}
+
+.term {
+ font-weight:bold;
+}
+
+
+
+
Deleted: trunk/HibernateExt/search/doc/reference/en/styles/html.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/styles/html.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/en/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,84 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/search/doc/reference/en/styles/html.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/styles/html.xsl)
===================================================================
--- trunk/HibernateExt/search/doc/reference/en/styles/html.xsl (rev 0)
+++ trunk/HibernateExt/search/doc/reference/en/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/search/doc/reference/en/styles/html_chunk.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/search/doc/reference/en/styles/html_chunk.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/doc/reference/en/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="chunk.section.depth">'5'</xsl:param>
- <xsl:param name="use.id.as.filename">'1'</xsl:param>
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/search/doc/reference/en/styles/html_chunk.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/search/doc/reference/en/styles/html_chunk.xsl)
===================================================================
--- trunk/HibernateExt/search/doc/reference/en/styles/html_chunk.xsl (rev 0)
+++ trunk/HibernateExt/search/doc/reference/en/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="chunk.section.depth">'5'</xsl:param>
+ <xsl:param name="use.id.as.filename">'1'</xsl:param>
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Copied: trunk/HibernateExt/search/jdbc (from rev 11279, branches/Branch_3_2/HibernateExt/search/jdbc)
Deleted: trunk/HibernateExt/search/jdbc/hsqldb.jar
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/search/jdbc/hsqldb.jar (from rev 11279, branches/Branch_3_2/HibernateExt/search/jdbc/hsqldb.jar)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/search/lgpl.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/search/lgpl.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/lgpl.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
Copied: trunk/HibernateExt/search/lgpl.txt (from rev 11279, branches/Branch_3_2/HibernateExt/search/lgpl.txt)
===================================================================
--- trunk/HibernateExt/search/lgpl.txt (rev 0)
+++ trunk/HibernateExt/search/lgpl.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Copied: trunk/HibernateExt/search/lib (from rev 11279, branches/Branch_3_2/HibernateExt/search/lib)
Deleted: trunk/HibernateExt/search/lib/README.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/search/lib/README.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/lib/README.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-Hibernate Search dependencies
-=============================
-
-Core
-====
-hibernate-commons-annotations.jar: required
-hibernate3.jar: required
-hibernate core dependencies: required (see Hibernate Core for more information)
-lucene-core-*.jar: required
-jms.jar: optional (needed for JMS based clustering strategy)
-
-Test
-====
-hibernate-annotations.jar: required
-hibernate-entitymanager.jar: required
\ No newline at end of file
Copied: trunk/HibernateExt/search/lib/README.txt (from rev 11279, branches/Branch_3_2/HibernateExt/search/lib/README.txt)
===================================================================
--- trunk/HibernateExt/search/lib/README.txt (rev 0)
+++ trunk/HibernateExt/search/lib/README.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+Hibernate Search dependencies
+=============================
+
+Core
+====
+hibernate-commons-annotations.jar: required
+hibernate3.jar: required
+hibernate core dependencies: required (see Hibernate Core for more information)
+lucene-core-*.jar: required
+jms.jar: optional (needed for JMS based clustering strategy)
+
+Test
+====
+hibernate-annotations.jar: required
+hibernate-entitymanager.jar: required
\ No newline at end of file
Deleted: trunk/HibernateExt/search/lib/jms.jar
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/search/lib/jms.jar (from rev 11279, branches/Branch_3_2/HibernateExt/search/lib/jms.jar)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/search/lib/lucene-core-2.1.0.jar
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/search/lib/lucene-core-2.1.0.jar (from rev 11279, branches/Branch_3_2/HibernateExt/search/lib/lucene-core-2.1.0.jar)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/search/readme.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/search/readme.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/readme.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-Hibernate Search
-==================================================
-Version: 3.2.2.beta, xx.02.2007
-
-Description
------------
-
-Full text search engines like Apache Lucene(tm) are a very powerful technology to
-bring free text/efficient queries to applications. If suffers several mismatches
-when dealing with a object domain model (keeping the index up to date, mismatch
-between the index structure and the domain model, ...)
-Hibernate Search indexes your domain model thanks to a few annotations, takes
-care of the index synchronization, brings you back managed objects from free text
-queries.
-Hibernate Search is using Apache Lucene(tm) under the cover.
-
-
-Instructions
-------------
-
-Unzip to installation directory, read doc/reference
-
-
-Contact
-------------
-
-Latest Documentation:
-
- http://hibernate.org
-
-Bug Reports:
-
- Hibernate JIRA (preferred)
- hibernate-devel at lists.sourceforge.net
-
-Free Technical Support:
-
- http://forum.hibernate.org (http://forum.hibernate.org/viewforum.php?f=9)
-
-
-Notes
------------
-
-If you want to contribute, go to http://www.hibernate.org/
-
-This software and its documentation are distributed under the terms of the
-FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
Copied: trunk/HibernateExt/search/readme.txt (from rev 11279, branches/Branch_3_2/HibernateExt/search/readme.txt)
===================================================================
--- trunk/HibernateExt/search/readme.txt (rev 0)
+++ trunk/HibernateExt/search/readme.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+Hibernate Search
+==================================================
+Version: 3.2.2.beta, xx.02.2007
+
+Description
+-----------
+
+Full text search engines like Apache Lucene(tm) are a very powerful technology to
+bring free text/efficient queries to applications. If suffers several mismatches
+when dealing with a object domain model (keeping the index up to date, mismatch
+between the index structure and the domain model, ...)
+Hibernate Search indexes your domain model thanks to a few annotations, takes
+care of the index synchronization, brings you back managed objects from free text
+queries.
+Hibernate Search is using Apache Lucene(tm) under the cover.
+
+
+Instructions
+------------
+
+Unzip to installation directory, read doc/reference
+
+
+Contact
+------------
+
+Latest Documentation:
+
+ http://hibernate.org
+
+Bug Reports:
+
+ Hibernate JIRA (preferred)
+ hibernate-devel at lists.sourceforge.net
+
+Free Technical Support:
+
+ http://forum.hibernate.org (http://forum.hibernate.org/viewforum.php?f=9)
+
+
+Notes
+-----------
+
+If you want to contribute, go to http://www.hibernate.org/
+
+This software and its documentation are distributed under the terms of the
+FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
Copied: trunk/HibernateExt/search/src (from rev 11279, branches/Branch_3_2/HibernateExt/search/src)
Copied: trunk/HibernateExt/search/src/java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java)
Copied: trunk/HibernateExt/search/src/java/org (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org)
Copied: trunk/HibernateExt/search/src/java/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate)
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/Environment.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id: Environment.java 10742 2006-11-07 01:03:16Z epbernard $
-package org.hibernate.search;
-
-/**
- * @author Emmanuel Bernard
- */
-public final class Environment {
- /**
- * Enable listeners auto registration in Hibernate Annotations and EntityManager. Default to true.
- */
- public static final String AUTOREGISTER_LISTENERS = "hibernate.search.autoregister_listeners";
- /**
- * Indexes base directory
- */
- public static final String INDEX_BASE_DIR = "hibernate.search.index_dir";
-
- /**
- * Lucene analyser
- */
- public static final String ANALYZER_CLASS = "hibernate.search.analyzer";
-
- public static final String WORKER_PREFIX = "hibernate.search.worker.";
- public static final String WORKER_SCOPE = WORKER_PREFIX + "scope";
- public static final String WORKER_BACKEND = WORKER_PREFIX + "backend";
- public static final String WORKER_EXECUTION = WORKER_PREFIX + "execution";
- /**
- * only used then execution is async
- * Thread pool size
- * default 1
- */
- public static final String WORKER_THREADPOOL_SIZE = Environment.WORKER_PREFIX + "thread_pool.size";
- /**
- * only used then execution is async
- * Size of the buffer queue (besides the thread pool size)
- * default infinite
- */
- public static final String WORKER_WORKQUEUE_SIZE = Environment.WORKER_PREFIX + "buffer_queue.max";
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/Environment.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/Environment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id: Environment.java 10742 2006-11-07 01:03:16Z epbernard $
+package org.hibernate.search;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public final class Environment {
+ /**
+ * Enable listeners auto registration in Hibernate Annotations and EntityManager. Default to true.
+ */
+ public static final String AUTOREGISTER_LISTENERS = "hibernate.search.autoregister_listeners";
+ /**
+ * Indexes base directory
+ */
+ public static final String INDEX_BASE_DIR = "hibernate.search.index_dir";
+
+ /**
+ * Lucene analyser
+ */
+ public static final String ANALYZER_CLASS = "hibernate.search.analyzer";
+
+ public static final String WORKER_PREFIX = "hibernate.search.worker.";
+ public static final String WORKER_SCOPE = WORKER_PREFIX + "scope";
+ public static final String WORKER_BACKEND = WORKER_PREFIX + "backend";
+ public static final String WORKER_EXECUTION = WORKER_PREFIX + "execution";
+ /**
+ * only used then execution is async
+ * Thread pool size
+ * default 1
+ */
+ public static final String WORKER_THREADPOOL_SIZE = Environment.WORKER_PREFIX + "thread_pool.size";
+ /**
+ * only used then execution is async
+ * Size of the buffer queue (besides the thread pool size)
+ * default infinite
+ */
+ public static final String WORKER_WORKQUEUE_SIZE = Environment.WORKER_PREFIX + "buffer_queue.max";
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.search;
-
-import org.hibernate.classic.Session;
-import org.hibernate.Query;
-
-/**
- * Extends the Hibernate {@link Session} with Full text search and indexing capabilities
- *
- * @author Emmanuel Bernard
- */
-public interface FullTextSession extends Session {
- /**
- * Create a Query on top of a native Lucene Query returning the matching objects
- * of type <code>entities</code> and their respective subclasses.
- * If no entity is provided, no type filtering is done.
- */
- Query createFullTextQuery(org.apache.lucene.search.Query luceneQuery, Class... entities);
-
- /**
- * Force the (re)indexing of a given <b>managed</b> object.
- * Indexation is batched per transaction
- */
- void index(Object entity);
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/FullTextSession.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.search;
+
+import org.hibernate.classic.Session;
+import org.hibernate.Query;
+
+/**
+ * Extends the Hibernate {@link Session} with Full text search and indexing capabilities
+ *
+ * @author Emmanuel Bernard
+ */
+public interface FullTextSession extends Session {
+ /**
+ * Create a Query on top of a native Lucene Query returning the matching objects
+ * of type <code>entities</code> and their respective subclasses.
+ * If no entity is provided, no type filtering is done.
+ */
+ Query createFullTextQuery(org.apache.lucene.search.Query luceneQuery, Class... entities);
+
+ /**
+ * Force the (re)indexing of a given <b>managed</b> object.
+ * Indexation is batched per transaction
+ */
+ void index(Object entity);
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/Search.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/Search.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/Search.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id: $
-package org.hibernate.search;
-
-import org.hibernate.Session;
-import org.hibernate.search.impl.FullTextSessionImpl;
-
-/**
- * Helper class to get a FullTextSession out of a regular session
- * @author Emmanuel Bernard
- */
-public final class Search {
-
- private Search() {
- }
-
- public static FullTextSession createFullTextSession(Session session) {
- return new FullTextSessionImpl(session);
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/Search.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/Search.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/Search.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/Search.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id: $
+package org.hibernate.search;
+
+import org.hibernate.Session;
+import org.hibernate.search.impl.FullTextSessionImpl;
+
+/**
+ * Helper class to get a FullTextSession out of a regular session
+ * @author Emmanuel Bernard
+ */
+public final class Search {
+
+ private Search() {
+ }
+
+ public static FullTextSession createFullTextSession(Session session) {
+ return new FullTextSessionImpl(session);
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/SearchException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/SearchException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/SearchException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.search;
-
-/**
- * Root of all search specific exceptions
- *
- * @author Emmanuel Bernard
- */
-public class SearchException extends RuntimeException {
-
- public SearchException() {
- super();
- }
-
- public SearchException(String message) {
- super( message );
- }
-
- public SearchException(String message, Throwable cause) {
- super( message, cause );
- }
-
- public SearchException(Throwable cause) {
- super( cause );
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/SearchException.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/SearchException.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/SearchException.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/SearchException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.search;
+
+/**
+ * Root of all search specific exceptions
+ *
+ * @author Emmanuel Bernard
+ */
+public class SearchException extends RuntimeException {
+
+ public SearchException() {
+ super();
+ }
+
+ public SearchException(String message) {
+ super( message );
+ }
+
+ public SearchException(String message, Throwable cause) {
+ super( message, cause );
+ }
+
+ public SearchException(Throwable cause) {
+ super( cause );
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,167 +0,0 @@
-//$Id: $
-package org.hibernate.search;
-
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.WeakHashMap;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.backend.Worker;
-import org.hibernate.search.backend.WorkerFactory;
-import org.hibernate.search.backend.BackendQueueProcessorFactory;
-import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.store.DirectoryProvider;
-import org.hibernate.search.store.DirectoryProviderFactory;
-import org.hibernate.util.ReflectHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class SearchFactory {
- private static ThreadLocal<WeakHashMap<Configuration, SearchFactory>> contexts =
- new ThreadLocal<WeakHashMap<Configuration, SearchFactory>>();
- static {
- Version.touch();
- }
- private Map<Class, DocumentBuilder<Object>> documentBuilders = new HashMap<Class, DocumentBuilder<Object>>();
- //keep track of the index modifiers per DirectoryProvider since multiple entity can use the same directory provider
- private Map<DirectoryProvider, ReentrantLock> lockableDirectoryProviders =
- new HashMap<DirectoryProvider, ReentrantLock>();
- private Worker worker;
- private BackendQueueProcessorFactory backendQueueProcessorFactory;
-
-
- public BackendQueueProcessorFactory getBackendQueueProcessorFactory() {
- return backendQueueProcessorFactory;
- }
-
- public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
- this.backendQueueProcessorFactory = backendQueueProcessorFactory;
- }
-
- public SearchFactory(Configuration cfg) {
- //yuk
- ReflectionManager reflectionManager = getReflectionManager( cfg );
-
- Class analyzerClass;
- String analyzerClassName = cfg.getProperty( Environment.ANALYZER_CLASS );
- if ( analyzerClassName != null ) {
- try {
- analyzerClass = ReflectHelper.classForName( analyzerClassName );
- }
- catch (Exception e) {
- throw new SearchException(
- "Lucene analyzer class '" + analyzerClassName + "' defined in property '" + Environment.ANALYZER_CLASS + "' could not be found.",
- e
- );
- }
- }
- else {
- analyzerClass = StandardAnalyzer.class;
- }
- // Initialize analyzer
- Analyzer analyzer;
- try {
- analyzer = (Analyzer) analyzerClass.newInstance();
- }
- catch (ClassCastException e) {
- throw new SearchException(
- "Lucene analyzer does not implement " + Analyzer.class.getName() + ": " + analyzerClassName
- );
- }
- catch (Exception e) {
- throw new SearchException( "Failed to instantiate lucene analyzer with type " + analyzerClassName );
- }
-
- Iterator iter = cfg.getClassMappings();
- DirectoryProviderFactory factory = new DirectoryProviderFactory();
- while ( iter.hasNext() ) {
- PersistentClass clazz = (PersistentClass) iter.next();
- Class<?> mappedClass = clazz.getMappedClass();
- if ( mappedClass != null ) {
- XClass mappedXClass = reflectionManager.toXClass( mappedClass );
- if ( mappedXClass != null && mappedXClass.isAnnotationPresent( Indexed.class ) ) {
- DirectoryProvider provider = factory.createDirectoryProvider( mappedXClass, cfg, this );
- if ( !lockableDirectoryProviders.containsKey( provider ) ) {
- lockableDirectoryProviders.put( provider, new ReentrantLock() );
- }
- final DocumentBuilder<Object> documentBuilder = new DocumentBuilder<Object>(
- mappedXClass, analyzer, provider, reflectionManager
- );
-
- documentBuilders.put( mappedClass, documentBuilder );
- }
- }
- }
- Set<Class> indexedClasses = documentBuilders.keySet();
- for ( DocumentBuilder builder : documentBuilders.values() ) {
- builder.postInitialize( indexedClasses );
- }
- WorkerFactory workerFactory = new WorkerFactory();
- workerFactory.configure( cfg, this );
- worker = workerFactory.createWorker();
-
- }
-
- //code doesn't have to be multithreaded because SF creation is not.
- //this is not a public API, should really only be used during the SessionFActory building
- public static SearchFactory getSearchFactory(Configuration cfg) {
- WeakHashMap<Configuration, SearchFactory> contextMap = contexts.get();
- if (contextMap == null) {
- contextMap = new WeakHashMap<Configuration, SearchFactory>( 2 );
- contexts.set( contextMap );
- }
- SearchFactory searchFactory = contextMap.get( cfg );
- if ( searchFactory == null) {
- searchFactory = new SearchFactory(cfg);
-
- contextMap.put( cfg, searchFactory );
- }
- return searchFactory;
- }
-
-
- public Map<Class, DocumentBuilder<Object>> getDocumentBuilders() {
- return documentBuilders;
- }
-
- public Map<DirectoryProvider, ReentrantLock> getLockableDirectoryProviders() {
- return lockableDirectoryProviders;
- }
-
- public Worker getWorker() {
- return worker;
- }
-
- //not happy about having it as a helper class but I don't want cfg to be associated with the SearchFactory
- public static ReflectionManager getReflectionManager(Configuration cfg) {
- ReflectionManager reflectionManager;
- try {
- //TODO introduce a ReflectionManagerHolder interface to avoid reflection
- //I want to avoid hard link between HAN and Validator for usch a simple need
- //reuse the existing reflectionManager one when possible
- reflectionManager =
- (ReflectionManager) cfg.getClass().getMethod( "getReflectionManager" ).invoke( cfg );
-
- }
- catch (Exception e) {
- reflectionManager = new JavaReflectionManager();
- }
- return reflectionManager;
- }
-
- public DirectoryProvider getDirectoryProvider(Class entity) {
- DocumentBuilder<Object> documentBuilder = getDocumentBuilders().get( entity );
- return documentBuilder == null ? null : documentBuilder.getDirectoryProvider();
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/SearchFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,167 @@
+//$Id: $
+package org.hibernate.search;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.WeakHashMap;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.backend.Worker;
+import org.hibernate.search.backend.WorkerFactory;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.store.DirectoryProviderFactory;
+import org.hibernate.util.ReflectHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SearchFactory {
+ private static ThreadLocal<WeakHashMap<Configuration, SearchFactory>> contexts =
+ new ThreadLocal<WeakHashMap<Configuration, SearchFactory>>();
+ static {
+ Version.touch();
+ }
+ private Map<Class, DocumentBuilder<Object>> documentBuilders = new HashMap<Class, DocumentBuilder<Object>>();
+ //keep track of the index modifiers per DirectoryProvider since multiple entity can use the same directory provider
+ private Map<DirectoryProvider, ReentrantLock> lockableDirectoryProviders =
+ new HashMap<DirectoryProvider, ReentrantLock>();
+ private Worker worker;
+ private BackendQueueProcessorFactory backendQueueProcessorFactory;
+
+
+ public BackendQueueProcessorFactory getBackendQueueProcessorFactory() {
+ return backendQueueProcessorFactory;
+ }
+
+ public void setBackendQueueProcessorFactory(BackendQueueProcessorFactory backendQueueProcessorFactory) {
+ this.backendQueueProcessorFactory = backendQueueProcessorFactory;
+ }
+
+ public SearchFactory(Configuration cfg) {
+ //yuk
+ ReflectionManager reflectionManager = getReflectionManager( cfg );
+
+ Class analyzerClass;
+ String analyzerClassName = cfg.getProperty( Environment.ANALYZER_CLASS );
+ if ( analyzerClassName != null ) {
+ try {
+ analyzerClass = ReflectHelper.classForName( analyzerClassName );
+ }
+ catch (Exception e) {
+ throw new SearchException(
+ "Lucene analyzer class '" + analyzerClassName + "' defined in property '" + Environment.ANALYZER_CLASS + "' could not be found.",
+ e
+ );
+ }
+ }
+ else {
+ analyzerClass = StandardAnalyzer.class;
+ }
+ // Initialize analyzer
+ Analyzer analyzer;
+ try {
+ analyzer = (Analyzer) analyzerClass.newInstance();
+ }
+ catch (ClassCastException e) {
+ throw new SearchException(
+ "Lucene analyzer does not implement " + Analyzer.class.getName() + ": " + analyzerClassName
+ );
+ }
+ catch (Exception e) {
+ throw new SearchException( "Failed to instantiate lucene analyzer with type " + analyzerClassName );
+ }
+
+ Iterator iter = cfg.getClassMappings();
+ DirectoryProviderFactory factory = new DirectoryProviderFactory();
+ while ( iter.hasNext() ) {
+ PersistentClass clazz = (PersistentClass) iter.next();
+ Class<?> mappedClass = clazz.getMappedClass();
+ if ( mappedClass != null ) {
+ XClass mappedXClass = reflectionManager.toXClass( mappedClass );
+ if ( mappedXClass != null && mappedXClass.isAnnotationPresent( Indexed.class ) ) {
+ DirectoryProvider provider = factory.createDirectoryProvider( mappedXClass, cfg, this );
+ if ( !lockableDirectoryProviders.containsKey( provider ) ) {
+ lockableDirectoryProviders.put( provider, new ReentrantLock() );
+ }
+ final DocumentBuilder<Object> documentBuilder = new DocumentBuilder<Object>(
+ mappedXClass, analyzer, provider, reflectionManager
+ );
+
+ documentBuilders.put( mappedClass, documentBuilder );
+ }
+ }
+ }
+ Set<Class> indexedClasses = documentBuilders.keySet();
+ for ( DocumentBuilder builder : documentBuilders.values() ) {
+ builder.postInitialize( indexedClasses );
+ }
+ WorkerFactory workerFactory = new WorkerFactory();
+ workerFactory.configure( cfg, this );
+ worker = workerFactory.createWorker();
+
+ }
+
+ //code doesn't have to be multithreaded because SF creation is not.
+ //this is not a public API, should really only be used during the SessionFActory building
+ public static SearchFactory getSearchFactory(Configuration cfg) {
+ WeakHashMap<Configuration, SearchFactory> contextMap = contexts.get();
+ if (contextMap == null) {
+ contextMap = new WeakHashMap<Configuration, SearchFactory>( 2 );
+ contexts.set( contextMap );
+ }
+ SearchFactory searchFactory = contextMap.get( cfg );
+ if ( searchFactory == null) {
+ searchFactory = new SearchFactory(cfg);
+
+ contextMap.put( cfg, searchFactory );
+ }
+ return searchFactory;
+ }
+
+
+ public Map<Class, DocumentBuilder<Object>> getDocumentBuilders() {
+ return documentBuilders;
+ }
+
+ public Map<DirectoryProvider, ReentrantLock> getLockableDirectoryProviders() {
+ return lockableDirectoryProviders;
+ }
+
+ public Worker getWorker() {
+ return worker;
+ }
+
+ //not happy about having it as a helper class but I don't want cfg to be associated with the SearchFactory
+ public static ReflectionManager getReflectionManager(Configuration cfg) {
+ ReflectionManager reflectionManager;
+ try {
+ //TODO introduce a ReflectionManagerHolder interface to avoid reflection
+ //I want to avoid hard link between HAN and Validator for usch a simple need
+ //reuse the existing reflectionManager one when possible
+ reflectionManager =
+ (ReflectionManager) cfg.getClass().getMethod( "getReflectionManager" ).invoke( cfg );
+
+ }
+ catch (Exception e) {
+ reflectionManager = new JavaReflectionManager();
+ }
+ return reflectionManager;
+ }
+
+ public DirectoryProvider getDirectoryProvider(Class entity) {
+ DocumentBuilder<Object> documentBuilder = getDocumentBuilders().get( entity );
+ return documentBuilder == null ? null : documentBuilder.getDirectoryProvider();
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/Version.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.search;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Version {
- public static final String VERSION = "3.2.2.beta1";
- private static Log log = LogFactory.getLog( Version.class );
-
- static {
- log.info( "Hibernate Search " + VERSION );
- }
-
- public static void touch() {
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/Version.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.search;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Version {
+ public static final String VERSION = "3.2.2.beta1";
+ private static Log log = LogFactory.getLog( Version.class );
+
+ static {
+ log.info( "Hibernate Search " + VERSION );
+ }
+
+ public static void touch() {
+ }
+}
\ No newline at end of file
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Boost.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Boost.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Boost.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id: $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Apply a boost factor on a field or a whole entity
- *
- * @author Emmanuel Bernard
- */
- at Retention( RetentionPolicy.RUNTIME )
- at Target( {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD} )
- at Documented
-public @interface Boost {
- float value();
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Boost.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Boost.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Boost.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Boost.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id: $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Apply a boost factor on a field or a whole entity
+ *
+ * @author Emmanuel Bernard
+ */
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( {ElementType.TYPE, ElementType.METHOD, ElementType.FIELD} )
+ at Documented
+public @interface Boost {
+ float value();
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/ContainedIn.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/ContainedIn.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/ContainedIn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id: $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Documented;
-
-/**
- * Describe the owning entity as being part of the target entity's
- * index (to be more accurate, being part of the indexed object graph)
- *
- * Only necessary when an @Indexed class is used as a @IndexedEmbedded
- * target class. @ContainedIn must mark the property pointing back
- * to the @IndexedEmbedded owning Entity
- *
- * Not necessary if the class is an @Embeddable class.
- *
- * <code>
- * @Indexed
- * public class OrderLine {
- * @IndexedEmbedded
- * private Order order;
- * }
- *
- * @Indexed
- * public class Order {
- * @ContainedBy
- * Set<OrderLine> lines;
- * }
- * </code>
- *
- * @author Emmanuel Bernard
- */
- at Retention( RetentionPolicy.RUNTIME )
- at Target( {ElementType.FIELD, ElementType.METHOD} )
- at Documented
-public @interface ContainedIn {
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/ContainedIn.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/ContainedIn.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/ContainedIn.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/ContainedIn.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id: $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Documented;
+
+/**
+ * Describe the owning entity as being part of the target entity's
+ * index (to be more accurate, being part of the indexed object graph)
+ *
+ * Only necessary when an @Indexed class is used as a @IndexedEmbedded
+ * target class. @ContainedIn must mark the property pointing back
+ * to the @IndexedEmbedded owning Entity
+ *
+ * Not necessary if the class is an @Embeddable class.
+ *
+ * <code>
+ * @Indexed
+ * public class OrderLine {
+ * @IndexedEmbedded
+ * private Order order;
+ * }
+ *
+ * @Indexed
+ * public class Order {
+ * @ContainedBy
+ * Set<OrderLine> lines;
+ * }
+ * </code>
+ *
+ * @author Emmanuel Bernard
+ */
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( {ElementType.FIELD, ElementType.METHOD} )
+ at Documented
+public @interface ContainedIn {
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DateBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/DateBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DateBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-import org.hibernate.search.annotations.Resolution;
-
-/**
- * Defines the temporal resolution of a given field
- * Date are stored as String in GMT
- *
- * @author Emmanuel Bernard
- */
- at Retention( RetentionPolicy.RUNTIME )
- at Target( {ElementType.FIELD, ElementType.METHOD} )
- at Documented
-//TODO allow pattern like yyyyMMdd?
-//TODO allow base timezone?
-public @interface DateBridge {
- Resolution resolution();
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DateBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/DateBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DateBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DateBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import org.hibernate.search.annotations.Resolution;
+
+/**
+ * Defines the temporal resolution of a given field
+ * Date are stored as String in GMT
+ *
+ * @author Emmanuel Bernard
+ */
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( {ElementType.FIELD, ElementType.METHOD} )
+ at Documented
+//TODO allow pattern like yyyyMMdd?
+//TODO allow base timezone?
+public @interface DateBridge {
+ Resolution resolution();
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DocumentId.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/DocumentId.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DocumentId.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Declare a field as the document id. If set to a property, the property will be used
- * TODO: If set to a class, the class itself will be passed to the FieldBridge
- * Note that @{link org.hibernate.search.bridge.FieldBridge#get} must return the Entity id
- *
- * @author Emmanuel Bernard
- */
- at Retention( RetentionPolicy.RUNTIME )
- at Target( {ElementType.METHOD, ElementType.FIELD} )
- at Documented
-public @interface DocumentId {
- String name() default "";
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DocumentId.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/DocumentId.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DocumentId.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/DocumentId.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Declare a field as the document id. If set to a property, the property will be used
+ * TODO: If set to a class, the class itself will be passed to the FieldBridge
+ * Note that @{link org.hibernate.search.bridge.FieldBridge#get} must return the Entity id
+ *
+ * @author Emmanuel Bernard
+ */
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( {ElementType.METHOD, ElementType.FIELD} )
+ at Documented
+public @interface DocumentId {
+ String name() default "";
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Field.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Field.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Field.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id: $
-/**
- * JavaDoc copy/pastle from the Apache Lucene project
- * Available under the ASL 2.0 http://www.apache.org/licenses/LICENSE-2.0
- */
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Mark a property as indexable
- *
- * @author Emmanuel Bernard
- */
- at Retention( RetentionPolicy.RUNTIME )
- at Target( {ElementType.METHOD, ElementType.FIELD} )
- at Documented
-public @interface Field {
- /**
- * Field name, default to the JavaBean property name
- */
- String name() default "";
-
- /**
- * Should the value be stored in the document
- */
- Store store() default Store.NO;
-
- /**
- * Defines how the Field should be indexed
- */
- Index index();
-
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Field.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Field.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Field.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Field.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id: $
+/**
+ * JavaDoc copy/pastle from the Apache Lucene project
+ * Available under the ASL 2.0 http://www.apache.org/licenses/LICENSE-2.0
+ */
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Mark a property as indexable
+ *
+ * @author Emmanuel Bernard
+ */
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( {ElementType.METHOD, ElementType.FIELD} )
+ at Documented
+public @interface Field {
+ /**
+ * Field name, default to the JavaBean property name
+ */
+ String name() default "";
+
+ /**
+ * Should the value be stored in the document
+ */
+ Store store() default Store.NO;
+
+ /**
+ * Defines how the Field should be indexed
+ */
+ Index index();
+
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/FieldBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/FieldBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/FieldBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * specifies a given field bridge implementation
- *
- * @author Emmanuel Bernard
- */
- at Retention( RetentionPolicy.RUNTIME )
- at Target( {ElementType.FIELD, ElementType.METHOD} )
- at Documented
-public @interface FieldBridge {
- public Class impl() default void.class;
-
- public Parameter[] params() default {};
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/FieldBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/FieldBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/FieldBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/FieldBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * specifies a given field bridge implementation
+ *
+ * @author Emmanuel Bernard
+ */
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( {ElementType.FIELD, ElementType.METHOD} )
+ at Documented
+public @interface FieldBridge {
+ public Class impl() default void.class;
+
+ public Parameter[] params() default {};
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Index.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Index.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Index.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: $
-package org.hibernate.search.annotations;
-
-/**
- * Defines how an Field should be indexed
- */
-public enum Index {
- /**
- * Do not index the field value. This field can thus not be searched,
- * but one can still access its contents provided it is
- * {@link Store stored}.
- */
- NO,
- /**
- * Index the field's value so it can be searched. An Analyzer will be used
- * to tokenize and possibly further normalize the text before its
- * terms will be stored in the index. This is useful for common text.
- */
- TOKENIZED,
- /**
- * Index the field's value without using an Analyzer, so it can be searched.
- * As no analyzer is used the value will be stored as a single term. This is
- * useful for unique Ids like product numbers.
- */
- UN_TOKENIZED,
- /**
- * Index the field's value without an Analyzer, and disable
- * the storing of norms. No norms means that index-time boosting
- * and field length normalization will be disabled. The benefit is
- * less memory usage as norms take up one byte per indexed field
- * for every document in the index.
- */
- NO_NORMS
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Index.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Index.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Index.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Index.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.search.annotations;
+
+/**
+ * Defines how an Field should be indexed
+ */
+public enum Index {
+ /**
+ * Do not index the field value. This field can thus not be searched,
+ * but one can still access its contents provided it is
+ * {@link Store stored}.
+ */
+ NO,
+ /**
+ * Index the field's value so it can be searched. An Analyzer will be used
+ * to tokenize and possibly further normalize the text before its
+ * terms will be stored in the index. This is useful for common text.
+ */
+ TOKENIZED,
+ /**
+ * Index the field's value without using an Analyzer, so it can be searched.
+ * As no analyzer is used the value will be stored as a single term. This is
+ * useful for unique Ids like product numbers.
+ */
+ UN_TOKENIZED,
+ /**
+ * Index the field's value without an Analyzer, and disable
+ * the storing of norms. No norms means that index-time boosting
+ * and field length normalization will be disabled. The benefit is
+ * less memory usage as norms take up one byte per indexed field
+ * for every document in the index.
+ */
+ NO_NORMS
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Indexed.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Indexed.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Indexed.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id: Indexed.java 10742 2006-11-07 01:03:16Z epbernard $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
- at Retention( RetentionPolicy.RUNTIME )
- at Target( ElementType.TYPE )
- at Documented
-/**
- * Specifies that an entity is to be indexed by Lucene
- */
-public @interface Indexed {
- /**
- * The filename of the index
- */
- String index() default "";
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Indexed.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Indexed.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Indexed.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Indexed.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id: Indexed.java 10742 2006-11-07 01:03:16Z epbernard $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( ElementType.TYPE )
+ at Documented
+/**
+ * Specifies that an entity is to be indexed by Lucene
+ */
+public @interface Indexed {
+ /**
+ * The filename of the index
+ */
+ String index() default "";
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/IndexedEmbedded.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/IndexedEmbedded.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/IndexedEmbedded.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id: $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Documented;
-
- at Retention( RetentionPolicy.RUNTIME )
- at Target( { ElementType.FIELD, ElementType.METHOD } )
- at Documented
-/**
- * Specifies that an association (@*ToOne or @Embedded) is to be indexed
- * in the root entity index
- * It allows queries involving associated objects restrictions
- */
-public @interface IndexedEmbedded {
- /**
- * Field name prefix
- * Default to 'propertyname.'
- */
- String prefix() default ".";
-
- /**
- * Stop indexing embedded elements when depth is reached
- * depth=1 means the associated element is index, but not its embedded elements
- * Default: infinite (an exception will be raised in case of class circular reference when infinite is chosen)
- */
- int depth() default Integer.MAX_VALUE;
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/IndexedEmbedded.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/IndexedEmbedded.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/IndexedEmbedded.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/IndexedEmbedded.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id: $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Documented;
+
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( { ElementType.FIELD, ElementType.METHOD } )
+ at Documented
+/**
+ * Specifies that an association (@*ToOne or @Embedded) is to be indexed
+ * in the root entity index
+ * It allows queries involving associated objects restrictions
+ */
+public @interface IndexedEmbedded {
+ /**
+ * Field name prefix
+ * Default to 'propertyname.'
+ */
+ String prefix() default ".";
+
+ /**
+ * Stop indexing embedded elements when depth is reached
+ * depth=1 means the associated element is index, but not its embedded elements
+ * Default: infinite (an exception will be raised in case of class circular reference when infinite is chosen)
+ */
+ int depth() default Integer.MAX_VALUE;
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Keyword.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Keyword.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Keyword.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,29 +0,0 @@
-//$Id: Keyword.java 10742 2006-11-07 01:03:16Z epbernard $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
- at Retention( RetentionPolicy.RUNTIME )
- at Target( {ElementType.METHOD, ElementType.FIELD} )
- at Documented
-/**
- * Specifies that a property of an entity is a Lucene
- * keyword field
- * @deprecated use @Field(index=Index.UN_TOKENIZED, store=Store.YES) or @DocumentId when id=true was used
- */
- at Deprecated
-public @interface Keyword {
- /**
- * The field name
- */
- String name() default "";
-
- /**
- * Specifies that this is the "identifier" keyword
- */
- boolean id() default false;
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Keyword.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Keyword.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Keyword.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Keyword.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,29 @@
+//$Id: Keyword.java 10742 2006-11-07 01:03:16Z epbernard $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( {ElementType.METHOD, ElementType.FIELD} )
+ at Documented
+/**
+ * Specifies that a property of an entity is a Lucene
+ * keyword field
+ * @deprecated use @Field(index=Index.UN_TOKENIZED, store=Store.YES) or @DocumentId when id=true was used
+ */
+ at Deprecated
+public @interface Keyword {
+ /**
+ * The field name
+ */
+ String name() default "";
+
+ /**
+ * Specifies that this is the "identifier" keyword
+ */
+ boolean id() default false;
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Parameter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Parameter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Parameter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id: $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
-/**
- * Parameter (basically key/value pattern)
- *
- * @author Emmanuel Bernard
- */
- at Target({})
- at Retention(RUNTIME)
-public @interface Parameter {
- String name();
-
- String value();
-}
\ No newline at end of file
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Parameter.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Parameter.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Parameter.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Parameter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id: $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+
+/**
+ * Parameter (basically key/value pattern)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Target({})
+ at Retention(RUNTIME)
+public @interface Parameter {
+ String name();
+
+ String value();
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Resolution.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Resolution.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Resolution.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id: $
-package org.hibernate.search.annotations;
-
-/**
- * Date indexing resolution
- *
- * @author Emmanuel Bernard
- */
-public enum Resolution {
- YEAR,
- MONTH,
- DAY,
- HOUR,
- MINUTE,
- SECOND,
- MILLISECOND
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Resolution.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Resolution.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Resolution.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Resolution.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.search.annotations;
+
+/**
+ * Date indexing resolution
+ *
+ * @author Emmanuel Bernard
+ */
+public enum Resolution {
+ YEAR,
+ MONTH,
+ DAY,
+ HOUR,
+ MINUTE,
+ SECOND,
+ MILLISECOND
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Store.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Store.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Store.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id: $
-package org.hibernate.search.annotations;
-
-/**
- * Whether or not the value is stored in the document
- *
- * @author Emmanuel Bernard
- */
-public enum Store {
- NO,
- YES,
- COMPRESS
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Store.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Store.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Store.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Store.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id: $
+package org.hibernate.search.annotations;
+
+/**
+ * Whether or not the value is stored in the document
+ *
+ * @author Emmanuel Bernard
+ */
+public enum Store {
+ NO,
+ YES,
+ COMPRESS
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Text.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Text.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Text.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: Text.java 10742 2006-11-07 01:03:16Z epbernard $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
- at Retention( RetentionPolicy.RUNTIME )
- at Target( {ElementType.METHOD, ElementType.FIELD} )
- at Documented
-/**
- * Specifies that a property of an entity is a Lucene
- * text field
- * @deprecated use @Field(index=Index.TOKENIZED, store=Store.YES)
- */
- at Deprecated
-public @interface Text {
- /**
- * The field name
- */
- String name() default "";
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Text.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Text.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Text.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Text.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: Text.java 10742 2006-11-07 01:03:16Z epbernard $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( {ElementType.METHOD, ElementType.FIELD} )
+ at Documented
+/**
+ * Specifies that a property of an entity is a Lucene
+ * text field
+ * @deprecated use @Field(index=Index.TOKENIZED, store=Store.YES)
+ */
+ at Deprecated
+public @interface Text {
+ /**
+ * The field name
+ */
+ String name() default "";
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Unstored.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Unstored.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Unstored.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: Unstored.java 10742 2006-11-07 01:03:16Z epbernard $
-package org.hibernate.search.annotations;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
- at Retention( RetentionPolicy.RUNTIME )
- at Target( {ElementType.METHOD, ElementType.FIELD} )
- at Documented
-/**
- * Specifies that a property of an entity is a Lucene
- * unstored field
- * @deprecated use @Field(index=Index.TOKENIZED, store=Store.NO)
- */
- at Deprecated
-public @interface Unstored {
- /**
- * The field name
- */
- String name() default "";
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Unstored.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/annotations/Unstored.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Unstored.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/annotations/Unstored.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: Unstored.java 10742 2006-11-07 01:03:16Z epbernard $
+package org.hibernate.search.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+ at Retention( RetentionPolicy.RUNTIME )
+ at Target( {ElementType.METHOD, ElementType.FIELD} )
+ at Documented
+/**
+ * Specifies that a property of an entity is a Lucene
+ * unstored field
+ * @deprecated use @Field(index=Index.TOKENIZED, store=Store.NO)
+ */
+ at Deprecated
+public @interface Unstored {
+ /**
+ * The field name
+ */
+ String name() default "";
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/AddLuceneWork.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/AddLuceneWork.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/AddLuceneWork.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend;
-
-import java.io.Serializable;
-
-import org.apache.lucene.document.Document;
-
-/**
- * @author Emmanuel Bernard
- */
-public class AddLuceneWork extends LuceneWork {
- public AddLuceneWork(Serializable id, Class entity, Document document) {
- super( id, entity, document );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/AddLuceneWork.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/AddLuceneWork.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/AddLuceneWork.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/AddLuceneWork.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+import java.io.Serializable;
+
+import org.apache.lucene.document.Document;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AddLuceneWork extends LuceneWork {
+ public AddLuceneWork(Serializable id, Class entity, Document document) {
+ super( id, entity, document );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend;
-
-import java.util.Properties;
-import java.util.List;
-
-import org.hibernate.search.SearchFactory;
-
-/**
- * Build stateful backend processor
- * Must have a no arg constructor
- * The factory typically prepare or pool the resources needed by the queue processor
- *
- * @author Emmanuel Bernard
- */
-public interface BackendQueueProcessorFactory {
- void initialize(Properties props, SearchFactory searchFactory);
-
- /**
- * Return a runnable implementation responsible for processing the queue to a given backend
- */
-
- Runnable getProcessor(List<LuceneWork> queue);
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/BackendQueueProcessorFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+import java.util.Properties;
+import java.util.List;
+
+import org.hibernate.search.SearchFactory;
+
+/**
+ * Build stateful backend processor
+ * Must have a no arg constructor
+ * The factory typically prepare or pool the resources needed by the queue processor
+ *
+ * @author Emmanuel Bernard
+ */
+public interface BackendQueueProcessorFactory {
+ void initialize(Properties props, SearchFactory searchFactory);
+
+ /**
+ * Return a runnable implementation responsible for processing the queue to a given backend
+ */
+
+ Runnable getProcessor(List<LuceneWork> queue);
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/DeleteLuceneWork.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/DeleteLuceneWork.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/DeleteLuceneWork.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend;
-
-import java.io.Serializable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DeleteLuceneWork extends LuceneWork {
- public DeleteLuceneWork(Serializable id, Class entity) {
- super( id, entity );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/DeleteLuceneWork.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/DeleteLuceneWork.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/DeleteLuceneWork.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/DeleteLuceneWork.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DeleteLuceneWork extends LuceneWork {
+ public DeleteLuceneWork(Serializable id, Class entity) {
+ super( id, entity );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend;
-
-import java.io.Serializable;
-
-import org.apache.lucene.document.Document;
-
-/**
- * Represent a Serializable Lucene unit work
- *
- * @author Emmanuel Bernard
- */
-public abstract class LuceneWork implements Serializable {
- private Document document;
- private Class entityClass;
- private Serializable id;
-
- public LuceneWork(Serializable id, Class entity) {
- this( id, entity, null );
- }
-
- public LuceneWork(Serializable id, Class entity, Document document) {
- this.id = id;
- this.entityClass = entity;
- this.document = document;
- }
-
-
- public Document getDocument() {
- return document;
- }
-
- public Class getEntityClass() {
- return entityClass;
- }
-
- public Serializable getId() {
- return id;
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/LuceneWork.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+import java.io.Serializable;
+
+import org.apache.lucene.document.Document;
+
+/**
+ * Represent a Serializable Lucene unit work
+ *
+ * @author Emmanuel Bernard
+ */
+public abstract class LuceneWork implements Serializable {
+ private Document document;
+ private Class entityClass;
+ private Serializable id;
+
+ public LuceneWork(Serializable id, Class entity) {
+ this( id, entity, null );
+ }
+
+ public LuceneWork(Serializable id, Class entity, Document document) {
+ this.id = id;
+ this.entityClass = entity;
+ this.document = document;
+ }
+
+
+ public Document getDocument() {
+ return document;
+ }
+
+ public Class getEntityClass() {
+ return entityClass;
+ }
+
+ public Serializable getId() {
+ return id;
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend;
-
-import java.util.List;
-import java.io.Serializable;
-
-import org.hibernate.search.backend.LuceneWork;
-
-/**
- * Pile work operations
- * No thread safety has to be implemented, the queue being scoped already
- * The implementation must be "stateless" wrt the queue through (ie not store the queue state)
- *
- * @author Emmanuel Bernard
- */
-public interface QueueingProcessor {
- /**
- * Add a work
- * TODO move that womewhere else, it does not really fit here
- */
- void add(Object entity, Serializable id, WorkType workType, List<Work> queue);
-
- /**
- * Execute works
- * @param queue
- */
- void performWork(List<Work> queue);
-
- /**
- * Rollback works
- * @param queue
- */
- void cancelWork(List<Work> queue);
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/QueueingProcessor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+import java.util.List;
+import java.io.Serializable;
+
+import org.hibernate.search.backend.LuceneWork;
+
+/**
+ * Pile work operations
+ * No thread safety has to be implemented, the queue being scoped already
+ * The implementation must be "stateless" wrt the queue through (ie not store the queue state)
+ *
+ * @author Emmanuel Bernard
+ */
+public interface QueueingProcessor {
+ /**
+ * Add a work
+ * TODO move that womewhere else, it does not really fit here
+ */
+ void add(Object entity, Serializable id, WorkType workType, List<Work> queue);
+
+ /**
+ * Execute works
+ * @param queue
+ */
+ void performWork(List<Work> queue);
+
+ /**
+ * Rollback works
+ * @param queue
+ */
+ void cancelWork(List<Work> queue);
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Work.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/Work.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Work.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,48 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend;
-
-import java.io.Serializable;
-
-import org.hibernate.annotations.common.reflection.XMember;
-
-/**
- * work unit. Only make sense inside the same session since it uses the scope principle
- *
- * @author Emmanuel Bernard
- */
-public class Work {
- private Object entity;
- private Serializable id;
- private XMember idGetter;
- private WorkType type;
-
-
- public Work(Object entity, Serializable id, WorkType type) {
- this.entity = entity;
- this.id = id;
- this.type = type;
- }
-
-
- public Work(Object entity, XMember idGetter, WorkType type) {
- this.entity = entity;
- this.idGetter = idGetter;
- this.type = type;
- }
-
- public Object getEntity() {
- return entity;
- }
-
- public Serializable getId() {
- return id;
- }
-
- public XMember getIdGetter() {
- return idGetter;
- }
-
- public WorkType getType() {
- return type;
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Work.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/Work.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Work.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Work.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,48 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+import java.io.Serializable;
+
+import org.hibernate.annotations.common.reflection.XMember;
+
+/**
+ * work unit. Only make sense inside the same session since it uses the scope principle
+ *
+ * @author Emmanuel Bernard
+ */
+public class Work {
+ private Object entity;
+ private Serializable id;
+ private XMember idGetter;
+ private WorkType type;
+
+
+ public Work(Object entity, Serializable id, WorkType type) {
+ this.entity = entity;
+ this.id = id;
+ this.type = type;
+ }
+
+
+ public Work(Object entity, XMember idGetter, WorkType type) {
+ this.entity = entity;
+ this.idGetter = idGetter;
+ this.type = type;
+ }
+
+ public Object getEntity() {
+ return entity;
+ }
+
+ public Serializable getId() {
+ return id;
+ }
+
+ public XMember getIdGetter() {
+ return idGetter;
+ }
+
+ public WorkType getType() {
+ return type;
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/WorkType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend;
-
-/**
- * @author Emmanuel Bernard
- */
-public enum WorkType {
- ADD,
- UPDATE,
- DELETE
- //add INDEX at some point to behave differently during the queue process?
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkType.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/WorkType.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkType.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum WorkType {
+ ADD,
+ UPDATE,
+ DELETE
+ //add INDEX at some point to behave differently during the queue process?
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend;
-
-import java.util.Properties;
-import java.io.Serializable;
-
-import org.hibernate.event.EventSource;
-import org.hibernate.search.SearchFactory;
-
-/**
- * Perform work for a given session. This implementation has to be multi threaded
- * @author Emmanuel Bernard
- */
-public interface Worker {
- void performWork(Object entity, Serializable id, WorkType workType, EventSource session);
-
- void initialize(Properties props, SearchFactory searchFactory);
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Worker.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+import java.util.Properties;
+import java.io.Serializable;
+
+import org.hibernate.event.EventSource;
+import org.hibernate.search.SearchFactory;
+
+/**
+ * Perform work for a given session. This implementation has to be multi threaded
+ * @author Emmanuel Bernard
+ */
+public interface Worker {
+ void performWork(Object entity, Serializable id, WorkType workType, EventSource session);
+
+ void initialize(Properties props, SearchFactory searchFactory);
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,74 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend;
-
-import java.util.Map;
-import java.util.Properties;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.hibernate.cfg.Configuration;
-import org.hibernate.search.backend.impl.TransactionalWorker;
-import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.store.DirectoryProvider;
-import org.hibernate.search.Environment;
-import org.hibernate.search.SearchException;
-import org.hibernate.util.StringHelper;
-import org.hibernate.util.ReflectHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class WorkerFactory {
- private Map<Class, DocumentBuilder<Object>> documentBuilders;
- private Map<DirectoryProvider, ReentrantLock> lockableDirectoryProviders;
- private Configuration cfg;
- private SearchFactory searchFactory;
-
- public void configure(Configuration cfg,
- SearchFactory searchFactory) {
- this.searchFactory = searchFactory;
- this.cfg = cfg;
- }
-
- private static Properties getProperties(Configuration cfg) {
- Properties props = cfg.getProperties();
- Properties workerProperties = new Properties();
- for ( Map.Entry entry : props.entrySet() ) {
- String key = (String) entry.getKey();
- if ( key.startsWith( Environment.WORKER_PREFIX ) ) {
- //key.substring( Environment.WORKER_PREFIX.length() )
- workerProperties.setProperty( key, (String) entry.getValue() );
- }
- }
- return workerProperties;
- }
-
- public Worker createWorker() {
- Properties props = getProperties( cfg );
- String impl = props.getProperty( Environment.WORKER_SCOPE );
- Worker worker;
- if ( StringHelper.isEmpty( impl ) ) {
- worker = new TransactionalWorker();
- }
- else if ( "transaction".equalsIgnoreCase( impl ) ) {
- worker = new TransactionalWorker();
- }
- else {
- try {
- Class workerClass = ReflectHelper.classForName( impl, WorkerFactory.class );
- worker = (Worker) workerClass.newInstance();
- }
- catch (ClassNotFoundException e) {
- throw new SearchException("Unable to find worker class: " + impl, e );
- }
- catch (IllegalAccessException e) {
- throw new SearchException("Unable to instanciate worker class: " + impl, e );
- }
- catch (InstantiationException e) {
- throw new SearchException("Unable to instanciate worker class: " + impl, e );
- }
- }
- worker.initialize( props, searchFactory );
- return worker;
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/WorkerFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,74 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+import java.util.Map;
+import java.util.Properties;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.search.backend.impl.TransactionalWorker;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.Environment;
+import org.hibernate.search.SearchException;
+import org.hibernate.util.StringHelper;
+import org.hibernate.util.ReflectHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class WorkerFactory {
+ private Map<Class, DocumentBuilder<Object>> documentBuilders;
+ private Map<DirectoryProvider, ReentrantLock> lockableDirectoryProviders;
+ private Configuration cfg;
+ private SearchFactory searchFactory;
+
+ public void configure(Configuration cfg,
+ SearchFactory searchFactory) {
+ this.searchFactory = searchFactory;
+ this.cfg = cfg;
+ }
+
+ private static Properties getProperties(Configuration cfg) {
+ Properties props = cfg.getProperties();
+ Properties workerProperties = new Properties();
+ for ( Map.Entry entry : props.entrySet() ) {
+ String key = (String) entry.getKey();
+ if ( key.startsWith( Environment.WORKER_PREFIX ) ) {
+ //key.substring( Environment.WORKER_PREFIX.length() )
+ workerProperties.setProperty( key, (String) entry.getValue() );
+ }
+ }
+ return workerProperties;
+ }
+
+ public Worker createWorker() {
+ Properties props = getProperties( cfg );
+ String impl = props.getProperty( Environment.WORKER_SCOPE );
+ Worker worker;
+ if ( StringHelper.isEmpty( impl ) ) {
+ worker = new TransactionalWorker();
+ }
+ else if ( "transaction".equalsIgnoreCase( impl ) ) {
+ worker = new TransactionalWorker();
+ }
+ else {
+ try {
+ Class workerClass = ReflectHelper.classForName( impl, WorkerFactory.class );
+ worker = (Worker) workerClass.newInstance();
+ }
+ catch (ClassNotFoundException e) {
+ throw new SearchException("Unable to find worker class: " + impl, e );
+ }
+ catch (IllegalAccessException e) {
+ throw new SearchException("Unable to instanciate worker class: " + impl, e );
+ }
+ catch (InstantiationException e) {
+ throw new SearchException("Unable to instanciate worker class: " + impl, e );
+ }
+ }
+ worker.initialize( props, searchFactory );
+ return worker;
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,150 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.locks.ReentrantLock;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.IndexWriter;
-import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.SearchException;
-import org.hibernate.search.store.DirectoryProvider;
-import org.hibernate.annotations.common.AssertionFailure;
-
-/**
- * Lucene workspace
- * This is not intended to be used in a multithreaded environment
- * <p/>
- * One cannot execute modification through an IndexReader when an IndexWriter has been acquired on the same underlying directory
- * One cannot get an IndexWriter when an IndexReader have been acquired and modificed on the same underlying directory
- * The recommended approach is to execute all the modifications on the IndexReaders, {@link #clean()} }, and acquire the
- * index writers
- *
- * @author Emmanuel Bernard
- */
-//TODO introduce the notion of read only IndexReader? We cannot enforce it because Lucene use abstract classes, not interfaces
-public class Workspace {
- private static Log log = LogFactory.getLog( Workspace.class );
- private Map<DirectoryProvider, IndexReader> readers = new HashMap<DirectoryProvider, IndexReader>();
- private Map<DirectoryProvider, IndexWriter> writers = new HashMap<DirectoryProvider, IndexWriter>();
- private List<DirectoryProvider> lockedProviders = new ArrayList<DirectoryProvider>();
- private SearchFactory searchFactory;
-
- public Workspace(SearchFactory searchFactory) {
- this.searchFactory = searchFactory;
- }
-
-
- public DocumentBuilder getDocumentBuilder(Class entity) {
- return searchFactory.getDocumentBuilders().get( entity );
- }
-
- public IndexReader getIndexReader(Class entity) {
- //TODO NPEs
- DirectoryProvider provider = searchFactory.getDirectoryProvider( entity );
- //one cannot access a reader for update after a writer has been accessed
- if ( writers.containsKey( provider ) )
- throw new AssertionFailure("Tries to read for update a index while a writer is accessed" + entity);
- IndexReader reader = readers.get( provider );
- if ( reader != null ) return reader;
- lockProvider( provider );
- try {
- reader = IndexReader.open( provider.getDirectory() );
- readers.put( provider, reader );
- }
- catch (IOException e) {
- cleanUp( new SearchException( "Unable to open IndexReader for " + entity, e ) );
- }
- return reader;
- }
-
- public IndexWriter getIndexWriter(Class entity) {
- DirectoryProvider provider = searchFactory.getDirectoryProvider( entity );
- //one has to close a reader for update before a writer is accessed
- IndexReader reader = readers.get( provider );
- if ( reader != null ) {
- try {
- reader.close();
- }
- catch (IOException e) {
- throw new SearchException( "Exception while closing IndexReader", e );
- }
- readers.remove( provider );
- }
- IndexWriter writer = writers.get( provider );
- if ( writer != null ) return writer;
- lockProvider( provider );
- try {
- writer = new IndexWriter(
- provider.getDirectory(), searchFactory.getDocumentBuilders().get( entity ).getAnalyzer(), false
- ); //have been created at init time
- writers.put( provider, writer );
- }
- catch (IOException e) {
- cleanUp( new SearchException( "Unable to open IndexWriter for " + entity, e ) );
- }
- return writer;
- }
-
- private void lockProvider(DirectoryProvider provider) {
- //make sure to use a semaphore
- ReentrantLock lock = searchFactory.getLockableDirectoryProviders().get( provider );
- //of course a given thread cannot have a race cond with itself
- if ( !lock.isHeldByCurrentThread() ) {
- lock.lock();
- lockedProviders.add( provider );
- }
- }
-
- private void cleanUp(SearchException originalException) {
- //release all readers and writers, then release locks
- SearchException raisedException = originalException;
- for ( IndexReader reader : readers.values() ) {
- try {
- reader.close();
- }
- catch (IOException e) {
- if ( raisedException != null ) {
- log.error( "Subsequent Exception while closing IndexReader", e );
- }
- else {
- raisedException = new SearchException( "Exception while closing IndexReader", e );
- }
- }
- }
- for ( IndexWriter writer : writers.values() ) {
- try {
- writer.close();
- }
- catch (IOException e) {
- if ( raisedException != null ) {
- log.error( "Subsequent Exception while closing IndexWriter", e );
- }
- else {
- raisedException = new SearchException( "Exception while closing IndexWriter", e );
- }
- }
- }
- for ( DirectoryProvider provider : lockedProviders ) {
- searchFactory.getLockableDirectoryProviders().get( provider ).unlock();
- }
- readers.clear();
- writers.clear();
- lockedProviders.clear();
- if ( raisedException != null ) throw raisedException;
- }
-
- /**
- * release resources consumed in the workspace if any
- */
- public void clean() {
- cleanUp( null );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/Workspace.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,150 @@
+//$Id: $
+package org.hibernate.search.backend;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.annotations.common.AssertionFailure;
+
+/**
+ * Lucene workspace
+ * This is not intended to be used in a multithreaded environment
+ * <p/>
+ * One cannot execute modification through an IndexReader when an IndexWriter has been acquired on the same underlying directory
+ * One cannot get an IndexWriter when an IndexReader have been acquired and modificed on the same underlying directory
+ * The recommended approach is to execute all the modifications on the IndexReaders, {@link #clean()} }, and acquire the
+ * index writers
+ *
+ * @author Emmanuel Bernard
+ */
+//TODO introduce the notion of read only IndexReader? We cannot enforce it because Lucene use abstract classes, not interfaces
+public class Workspace {
+ private static Log log = LogFactory.getLog( Workspace.class );
+ private Map<DirectoryProvider, IndexReader> readers = new HashMap<DirectoryProvider, IndexReader>();
+ private Map<DirectoryProvider, IndexWriter> writers = new HashMap<DirectoryProvider, IndexWriter>();
+ private List<DirectoryProvider> lockedProviders = new ArrayList<DirectoryProvider>();
+ private SearchFactory searchFactory;
+
+ public Workspace(SearchFactory searchFactory) {
+ this.searchFactory = searchFactory;
+ }
+
+
+ public DocumentBuilder getDocumentBuilder(Class entity) {
+ return searchFactory.getDocumentBuilders().get( entity );
+ }
+
+ public IndexReader getIndexReader(Class entity) {
+ //TODO NPEs
+ DirectoryProvider provider = searchFactory.getDirectoryProvider( entity );
+ //one cannot access a reader for update after a writer has been accessed
+ if ( writers.containsKey( provider ) )
+ throw new AssertionFailure("Tries to read for update a index while a writer is accessed" + entity);
+ IndexReader reader = readers.get( provider );
+ if ( reader != null ) return reader;
+ lockProvider( provider );
+ try {
+ reader = IndexReader.open( provider.getDirectory() );
+ readers.put( provider, reader );
+ }
+ catch (IOException e) {
+ cleanUp( new SearchException( "Unable to open IndexReader for " + entity, e ) );
+ }
+ return reader;
+ }
+
+ public IndexWriter getIndexWriter(Class entity) {
+ DirectoryProvider provider = searchFactory.getDirectoryProvider( entity );
+ //one has to close a reader for update before a writer is accessed
+ IndexReader reader = readers.get( provider );
+ if ( reader != null ) {
+ try {
+ reader.close();
+ }
+ catch (IOException e) {
+ throw new SearchException( "Exception while closing IndexReader", e );
+ }
+ readers.remove( provider );
+ }
+ IndexWriter writer = writers.get( provider );
+ if ( writer != null ) return writer;
+ lockProvider( provider );
+ try {
+ writer = new IndexWriter(
+ provider.getDirectory(), searchFactory.getDocumentBuilders().get( entity ).getAnalyzer(), false
+ ); //have been created at init time
+ writers.put( provider, writer );
+ }
+ catch (IOException e) {
+ cleanUp( new SearchException( "Unable to open IndexWriter for " + entity, e ) );
+ }
+ return writer;
+ }
+
+ private void lockProvider(DirectoryProvider provider) {
+ //make sure to use a semaphore
+ ReentrantLock lock = searchFactory.getLockableDirectoryProviders().get( provider );
+ //of course a given thread cannot have a race cond with itself
+ if ( !lock.isHeldByCurrentThread() ) {
+ lock.lock();
+ lockedProviders.add( provider );
+ }
+ }
+
+ private void cleanUp(SearchException originalException) {
+ //release all readers and writers, then release locks
+ SearchException raisedException = originalException;
+ for ( IndexReader reader : readers.values() ) {
+ try {
+ reader.close();
+ }
+ catch (IOException e) {
+ if ( raisedException != null ) {
+ log.error( "Subsequent Exception while closing IndexReader", e );
+ }
+ else {
+ raisedException = new SearchException( "Exception while closing IndexReader", e );
+ }
+ }
+ }
+ for ( IndexWriter writer : writers.values() ) {
+ try {
+ writer.close();
+ }
+ catch (IOException e) {
+ if ( raisedException != null ) {
+ log.error( "Subsequent Exception while closing IndexWriter", e );
+ }
+ else {
+ raisedException = new SearchException( "Exception while closing IndexWriter", e );
+ }
+ }
+ }
+ for ( DirectoryProvider provider : lockedProviders ) {
+ searchFactory.getLockableDirectoryProviders().get( provider ).unlock();
+ }
+ readers.clear();
+ writers.clear();
+ lockedProviders.clear();
+ if ( raisedException != null ) throw raisedException;
+ }
+
+ /**
+ * release resources consumed in the workspace if any
+ */
+ public void clean() {
+ cleanUp( null );
+ }
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,135 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend.impl;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Properties;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import org.hibernate.Hibernate;
-import org.hibernate.annotations.common.util.StringHelper;
-import org.hibernate.search.Environment;
-import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.backend.BackendQueueProcessorFactory;
-import org.hibernate.search.backend.LuceneWork;
-import org.hibernate.search.backend.QueueingProcessor;
-import org.hibernate.search.backend.Work;
-import org.hibernate.search.backend.WorkType;
-import org.hibernate.search.backend.impl.jms.JMSBackendQueueProcessorFactory;
-import org.hibernate.search.backend.impl.lucene.LuceneBackendQueueProcessorFactory;
-import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.util.ReflectHelper;
-
-/**
- * Batch work until #performWork is called.
- * The work is then executed synchronously or asynchronously
- *
- * @author Emmanuel Bernard
- */
-public class BatchedQueueingProcessor implements QueueingProcessor {
- private boolean sync;
- private ExecutorService executorService;
- private BackendQueueProcessorFactory backendQueueProcessorFactory;
- private SearchFactory searchFactory;
-
- public BatchedQueueingProcessor(SearchFactory searchFactory,
- Properties properties) {
- this.searchFactory = searchFactory;
- //default to sync if none defined
- this.sync = !"async".equalsIgnoreCase( properties.getProperty( Environment.WORKER_EXECUTION ) );
-
- //default to a simple asynchronous operation
- int min = Integer.parseInt(
- properties.getProperty( Environment.WORKER_THREADPOOL_SIZE, "1" ).trim()
- );
- //no queue limit
- int queueSize = Integer.parseInt(
- properties.getProperty( Environment.WORKER_WORKQUEUE_SIZE, Integer.toString( Integer.MAX_VALUE ) ).trim()
- );
- if ( !sync ) {
- /**
- * choose min = max with a sizable queue to be able to
- * actually queue operations
- * The locking mechanism preventing much of the scalability
- * anyway, the idea is really to have a buffer
- * If the queue limit is reached, the operation is executed by the main thread
- */
- executorService = new ThreadPoolExecutor(
- min, min, 60, TimeUnit.SECONDS,
- new LinkedBlockingQueue<Runnable>(queueSize),
- new ThreadPoolExecutor.CallerRunsPolicy()
- );
- }
- String backend = properties.getProperty( Environment.WORKER_BACKEND );
- if ( StringHelper.isEmpty( backend ) || "lucene".equalsIgnoreCase( backend ) ) {
- backendQueueProcessorFactory = new LuceneBackendQueueProcessorFactory();
- }
- else if ( "jms".equalsIgnoreCase( backend ) ) {
- backendQueueProcessorFactory = new JMSBackendQueueProcessorFactory();
- }
- else {
- try {
- Class processorFactoryClass = ReflectHelper.classForName( backend, BatchedQueueingProcessor.class );
- backendQueueProcessorFactory = (BackendQueueProcessorFactory) processorFactoryClass.newInstance();
- }
- catch (ClassNotFoundException e) {
- throw new SearchException( "Unable to find processor class: " + backend, e );
- }
- catch (IllegalAccessException e) {
- throw new SearchException( "Unable to instanciate processor class: " + backend, e );
- }
- catch (InstantiationException e) {
- throw new SearchException( "Unable to instanciate processor class: " + backend, e );
- }
- }
- backendQueueProcessorFactory.initialize( properties, searchFactory );
- searchFactory.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
- }
-
- public void add(Object entity, Serializable id, WorkType workType, List<Work> queue) {
- //don't check for builder it's done in performWork
- Work work = new Work(entity, id, workType);
- queue.add( work );
- }
-
- //TODO implements parallel batchWorkers (one per Directory)
- public void performWork(List<Work> queue) {
- int initialSize = queue.size();
- List<LuceneWork> luceneQueue = new ArrayList<LuceneWork>( initialSize ); //TODO load factor for containedIn
-
- for ( int i = 0 ; i < initialSize ; i++ ) {
- Work work = queue.get( i );
- queue.set( i, null ); // help GC and avoid 2 loaded queues in memory
- Class entityClass = Hibernate.getClass( work.getEntity() );
- DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entityClass );
- if ( builder == null ) return; //or exception?
- builder.addWorkToQueue(work.getEntity(), work.getId(), work.getType(), luceneQueue, searchFactory);
- }
-
- Runnable processor = backendQueueProcessorFactory.getProcessor( luceneQueue );
- if ( sync ) {
- processor.run();
- }
- else {
- executorService.execute( processor );
- }
- }
-
- public void cancelWork(List<Work> queue) {
- queue.clear();
- }
-
- @Override
- public void finalize() throws Throwable {
- super.finalize();
- //gracefully stop
- //TODO move to the SF close lifecycle
- if ( executorService != null && !executorService.isShutdown() ) executorService.shutdown();
- }
-
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/BatchedQueueingProcessor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,135 @@
+//$Id: $
+package org.hibernate.search.backend.impl;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Properties;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.hibernate.Hibernate;
+import org.hibernate.annotations.common.util.StringHelper;
+import org.hibernate.search.Environment;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.backend.QueueingProcessor;
+import org.hibernate.search.backend.Work;
+import org.hibernate.search.backend.WorkType;
+import org.hibernate.search.backend.impl.jms.JMSBackendQueueProcessorFactory;
+import org.hibernate.search.backend.impl.lucene.LuceneBackendQueueProcessorFactory;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.util.ReflectHelper;
+
+/**
+ * Batch work until #performWork is called.
+ * The work is then executed synchronously or asynchronously
+ *
+ * @author Emmanuel Bernard
+ */
+public class BatchedQueueingProcessor implements QueueingProcessor {
+ private boolean sync;
+ private ExecutorService executorService;
+ private BackendQueueProcessorFactory backendQueueProcessorFactory;
+ private SearchFactory searchFactory;
+
+ public BatchedQueueingProcessor(SearchFactory searchFactory,
+ Properties properties) {
+ this.searchFactory = searchFactory;
+ //default to sync if none defined
+ this.sync = !"async".equalsIgnoreCase( properties.getProperty( Environment.WORKER_EXECUTION ) );
+
+ //default to a simple asynchronous operation
+ int min = Integer.parseInt(
+ properties.getProperty( Environment.WORKER_THREADPOOL_SIZE, "1" ).trim()
+ );
+ //no queue limit
+ int queueSize = Integer.parseInt(
+ properties.getProperty( Environment.WORKER_WORKQUEUE_SIZE, Integer.toString( Integer.MAX_VALUE ) ).trim()
+ );
+ if ( !sync ) {
+ /**
+ * choose min = max with a sizable queue to be able to
+ * actually queue operations
+ * The locking mechanism preventing much of the scalability
+ * anyway, the idea is really to have a buffer
+ * If the queue limit is reached, the operation is executed by the main thread
+ */
+ executorService = new ThreadPoolExecutor(
+ min, min, 60, TimeUnit.SECONDS,
+ new LinkedBlockingQueue<Runnable>(queueSize),
+ new ThreadPoolExecutor.CallerRunsPolicy()
+ );
+ }
+ String backend = properties.getProperty( Environment.WORKER_BACKEND );
+ if ( StringHelper.isEmpty( backend ) || "lucene".equalsIgnoreCase( backend ) ) {
+ backendQueueProcessorFactory = new LuceneBackendQueueProcessorFactory();
+ }
+ else if ( "jms".equalsIgnoreCase( backend ) ) {
+ backendQueueProcessorFactory = new JMSBackendQueueProcessorFactory();
+ }
+ else {
+ try {
+ Class processorFactoryClass = ReflectHelper.classForName( backend, BatchedQueueingProcessor.class );
+ backendQueueProcessorFactory = (BackendQueueProcessorFactory) processorFactoryClass.newInstance();
+ }
+ catch (ClassNotFoundException e) {
+ throw new SearchException( "Unable to find processor class: " + backend, e );
+ }
+ catch (IllegalAccessException e) {
+ throw new SearchException( "Unable to instanciate processor class: " + backend, e );
+ }
+ catch (InstantiationException e) {
+ throw new SearchException( "Unable to instanciate processor class: " + backend, e );
+ }
+ }
+ backendQueueProcessorFactory.initialize( properties, searchFactory );
+ searchFactory.setBackendQueueProcessorFactory( backendQueueProcessorFactory );
+ }
+
+ public void add(Object entity, Serializable id, WorkType workType, List<Work> queue) {
+ //don't check for builder it's done in performWork
+ Work work = new Work(entity, id, workType);
+ queue.add( work );
+ }
+
+ //TODO implements parallel batchWorkers (one per Directory)
+ public void performWork(List<Work> queue) {
+ int initialSize = queue.size();
+ List<LuceneWork> luceneQueue = new ArrayList<LuceneWork>( initialSize ); //TODO load factor for containedIn
+
+ for ( int i = 0 ; i < initialSize ; i++ ) {
+ Work work = queue.get( i );
+ queue.set( i, null ); // help GC and avoid 2 loaded queues in memory
+ Class entityClass = Hibernate.getClass( work.getEntity() );
+ DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entityClass );
+ if ( builder == null ) return; //or exception?
+ builder.addWorkToQueue(work.getEntity(), work.getId(), work.getType(), luceneQueue, searchFactory);
+ }
+
+ Runnable processor = backendQueueProcessorFactory.getProcessor( luceneQueue );
+ if ( sync ) {
+ processor.run();
+ }
+ else {
+ executorService.execute( processor );
+ }
+ }
+
+ public void cancelWork(List<Work> queue) {
+ queue.clear();
+ }
+
+ @Override
+ public void finalize() throws Throwable {
+ super.finalize();
+ //gracefully stop
+ //TODO move to the SF close lifecycle
+ if ( executorService != null && !executorService.isShutdown() ) executorService.shutdown();
+ }
+
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,62 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend.impl;
-
-import java.util.List;
-import java.util.ArrayList;
-import java.io.Serializable;
-import javax.transaction.Status;
-import javax.transaction.Synchronization;
-
-import org.hibernate.search.backend.QueueingProcessor;
-import org.hibernate.search.backend.LuceneWork;
-import org.hibernate.search.backend.WorkType;
-import org.hibernate.search.backend.Work;
-import org.hibernate.search.util.WeakIdentityHashMap;
-
-/**
- * Execute some work inside a transaction sychronization
- *
- * @author Emmanuel Bernard
- */
-public class PostTransactionWorkQueueSynchronization implements Synchronization {
- private QueueingProcessor queueingProcessor;
- private boolean consumed;
- private WeakIdentityHashMap queuePerTransaction;
- private List<Work> queue = new ArrayList<Work>();
-
- /**
- * in transaction work
- */
- public PostTransactionWorkQueueSynchronization(QueueingProcessor queueingProcessor, WeakIdentityHashMap queuePerTransaction) {
- this.queueingProcessor = queueingProcessor;
- this.queuePerTransaction = queuePerTransaction;
- }
-
- public void add(Object entity, Serializable id, WorkType workType) {
- queueingProcessor.add( entity, id, workType, queue );
- }
-
- public boolean isConsumed() {
- return consumed;
- }
-
- public void beforeCompletion() {
- }
-
- public void afterCompletion(int i) {
- try {
- if ( Status.STATUS_COMMITTED == i ) {
- queueingProcessor.performWork(queue);
- }
- else {
- queueingProcessor.cancelWork(queue);
- }
- }
- finally {
- consumed = true;
- //clean the Synchronization per Transaction
- //not needed stricto sensus but a cleaner approach and faster than the GC
- if (queuePerTransaction != null) queuePerTransaction.removeValue( this );
- }
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/PostTransactionWorkQueueSynchronization.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,62 @@
+//$Id: $
+package org.hibernate.search.backend.impl;
+
+import java.util.List;
+import java.util.ArrayList;
+import java.io.Serializable;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+
+import org.hibernate.search.backend.QueueingProcessor;
+import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.backend.WorkType;
+import org.hibernate.search.backend.Work;
+import org.hibernate.search.util.WeakIdentityHashMap;
+
+/**
+ * Execute some work inside a transaction sychronization
+ *
+ * @author Emmanuel Bernard
+ */
+public class PostTransactionWorkQueueSynchronization implements Synchronization {
+ private QueueingProcessor queueingProcessor;
+ private boolean consumed;
+ private WeakIdentityHashMap queuePerTransaction;
+ private List<Work> queue = new ArrayList<Work>();
+
+ /**
+ * in transaction work
+ */
+ public PostTransactionWorkQueueSynchronization(QueueingProcessor queueingProcessor, WeakIdentityHashMap queuePerTransaction) {
+ this.queueingProcessor = queueingProcessor;
+ this.queuePerTransaction = queuePerTransaction;
+ }
+
+ public void add(Object entity, Serializable id, WorkType workType) {
+ queueingProcessor.add( entity, id, workType, queue );
+ }
+
+ public boolean isConsumed() {
+ return consumed;
+ }
+
+ public void beforeCompletion() {
+ }
+
+ public void afterCompletion(int i) {
+ try {
+ if ( Status.STATUS_COMMITTED == i ) {
+ queueingProcessor.performWork(queue);
+ }
+ else {
+ queueingProcessor.cancelWork(queue);
+ }
+ }
+ finally {
+ consumed = true;
+ //clean the Synchronization per Transaction
+ //not needed stricto sensus but a cleaner approach and faster than the GC
+ if (queuePerTransaction != null) queuePerTransaction.removeValue( this );
+ }
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,56 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend.impl;
-
-import java.util.Properties;
-import java.util.List;
-import java.util.ArrayList;
-import java.io.Serializable;
-
-import org.hibernate.search.backend.Worker;
-import org.hibernate.search.backend.LuceneWork;
-import org.hibernate.search.backend.QueueingProcessor;
-import org.hibernate.search.backend.WorkType;
-import org.hibernate.search.backend.Work;
-import org.hibernate.search.backend.impl.BatchedQueueingProcessor;
-import org.hibernate.search.util.WeakIdentityHashMap;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.event.EventSource;
-import org.hibernate.Transaction;
-
-/**
- * Queue works per transaction.
- * If out of transaction, the work is executed right away
- *
- * When <code>hibernate.search.worker.type</code> is set to <code>async</code>
- * the work is done in a
- *
- * @author Emmanuel Bernard
- */
-public class TransactionalWorker implements Worker {
- //not a synchronized map since for a given transaction, we have not concurrent access
- protected WeakIdentityHashMap synchronizationPerTransaction = new WeakIdentityHashMap();
- private QueueingProcessor queueingProcessor;
-
- public void performWork(Object entity, Serializable id, WorkType workType, EventSource session) {
- if ( session.isTransactionInProgress() ) {
- Transaction transaction = session.getTransaction();
- PostTransactionWorkQueueSynchronization txSync = (PostTransactionWorkQueueSynchronization)
- synchronizationPerTransaction.get( transaction );
- if ( txSync == null || txSync.isConsumed() ) {
- txSync = new PostTransactionWorkQueueSynchronization( queueingProcessor, synchronizationPerTransaction );
- transaction.registerSynchronization( txSync );
- synchronizationPerTransaction.put(transaction, txSync);
- }
- txSync.add( entity, id, workType );
- }
- else {
- List<Work> queue = new ArrayList<Work>(2); //one work can be split
- queueingProcessor.add( entity, id, workType, queue );
- queueingProcessor.performWork( queue );
- }
- }
-
- public void initialize(Properties props, SearchFactory searchFactory) {
- this.queueingProcessor = new BatchedQueueingProcessor( searchFactory, props );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/TransactionalWorker.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,56 @@
+//$Id: $
+package org.hibernate.search.backend.impl;
+
+import java.util.Properties;
+import java.util.List;
+import java.util.ArrayList;
+import java.io.Serializable;
+
+import org.hibernate.search.backend.Worker;
+import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.backend.QueueingProcessor;
+import org.hibernate.search.backend.WorkType;
+import org.hibernate.search.backend.Work;
+import org.hibernate.search.backend.impl.BatchedQueueingProcessor;
+import org.hibernate.search.util.WeakIdentityHashMap;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.event.EventSource;
+import org.hibernate.Transaction;
+
+/**
+ * Queue works per transaction.
+ * If out of transaction, the work is executed right away
+ *
+ * When <code>hibernate.search.worker.type</code> is set to <code>async</code>
+ * the work is done in a
+ *
+ * @author Emmanuel Bernard
+ */
+public class TransactionalWorker implements Worker {
+ //not a synchronized map since for a given transaction, we have not concurrent access
+ protected WeakIdentityHashMap synchronizationPerTransaction = new WeakIdentityHashMap();
+ private QueueingProcessor queueingProcessor;
+
+ public void performWork(Object entity, Serializable id, WorkType workType, EventSource session) {
+ if ( session.isTransactionInProgress() ) {
+ Transaction transaction = session.getTransaction();
+ PostTransactionWorkQueueSynchronization txSync = (PostTransactionWorkQueueSynchronization)
+ synchronizationPerTransaction.get( transaction );
+ if ( txSync == null || txSync.isConsumed() ) {
+ txSync = new PostTransactionWorkQueueSynchronization( queueingProcessor, synchronizationPerTransaction );
+ transaction.registerSynchronization( txSync );
+ synchronizationPerTransaction.put(transaction, txSync);
+ }
+ txSync.add( entity, id, workType );
+ }
+ else {
+ List<Work> queue = new ArrayList<Work>(2); //one work can be split
+ queueingProcessor.add( entity, id, workType, queue );
+ queueingProcessor.performWork( queue );
+ }
+ }
+
+ public void initialize(Properties props, SearchFactory searchFactory) {
+ this.queueingProcessor = new BatchedQueueingProcessor( searchFactory, props );
+ }
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,111 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend.impl.jms;
-
-import java.util.List;
-import javax.annotation.PostConstruct;
-import javax.annotation.PreDestroy;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageListener;
-import javax.jms.ObjectMessage;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.Session;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.backend.LuceneWork;
-import org.hibernate.search.util.ContextHelper;
-
-/**
- * Implement the Hibernate Search controller responsible for processing the
- * work send through JMS by the slave nodes.
- *
- * Note the subclass implementation has to implements javax.jms.MessageListener
- * //TODO Ask Bill why it is required
- *
- * @author Emmanuel Bernard
- */
-public abstract class AbstractJMSHibernateSearchController implements MessageListener {
- private static Log log = LogFactory.getLog( AbstractJMSHibernateSearchController.class );
-
- /**
- * return the current or give a new session
- * This session is not used per se, but is the link to access the Search configuration
- *
- * A typical EJB 3.0 usecase would be to get the session from the container (injected)
- * eg in JBoss EJB 3.0
- * <code>
- * @PersistenceContext private Session session;
- *
- * protected Session getSession() {
- * return session
- * }
- *
- * eg in any container
- * <code>
- * @PersistenceContext private EntityManager entityManager;
- *
- * protected Session getSession() {
- * return (Session) entityManager.getdelegate();
- * }
- */
- protected abstract Session getSession();
-
- /**
- * Ensure to clean the resources after use.
- * If the session has been directly or indirectly injected, this method is empty
- */
- protected abstract void cleanSessionIfNeeded(Session session);
-
- /**
- * Process the Hibernate Search work queues received
- */
- public void onMessage(Message message) {
- if ( !( message instanceof ObjectMessage ) ) {
- log.error( "Incorrect message type: " + message.getClass() );
- return;
- }
- ObjectMessage objectMessage = (ObjectMessage) message;
- List<LuceneWork> queue;
- try {
- queue = (List<LuceneWork>) objectMessage.getObject();
- }
- catch (JMSException e) {
- log.error( "Unable to retrieve object from message: " + message.getClass(), e );
- return;
- }
- catch (ClassCastException e) {
- log.error( "Illegal object retrieved from message", e );
- return;
- }
- Runnable worker = getWorker( queue );
- worker.run();
- }
-
- private Runnable getWorker(List<LuceneWork> queue) {
- //FIXME casting sucks becasue we do not control what get session from
- Session session = getSession();
- Runnable processor = null;
-
- try {
- SearchFactory factory = ContextHelper.getSearchFactory( session );
- processor = factory.getBackendQueueProcessorFactory().getProcessor( queue );
- }
- finally {
- cleanSessionIfNeeded(session);
- }
- return processor;
- }
-
- @PostConstruct
- public void initialize() {
- //init the source copy process
- //TODO actually this is probably wrong since this is now part of the DP
- }
-
- @PreDestroy
- public void shutdown() {
- //stop the source copy process
- //TODO actually this is probably wrong since this is now part of the DP
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/AbstractJMSHibernateSearchController.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,111 @@
+//$Id: $
+package org.hibernate.search.backend.impl.jms;
+
+import java.util.List;
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageListener;
+import javax.jms.ObjectMessage;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.Session;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.util.ContextHelper;
+
+/**
+ * Implement the Hibernate Search controller responsible for processing the
+ * work send through JMS by the slave nodes.
+ *
+ * Note the subclass implementation has to implements javax.jms.MessageListener
+ * //TODO Ask Bill why it is required
+ *
+ * @author Emmanuel Bernard
+ */
+public abstract class AbstractJMSHibernateSearchController implements MessageListener {
+ private static Log log = LogFactory.getLog( AbstractJMSHibernateSearchController.class );
+
+ /**
+ * return the current or give a new session
+ * This session is not used per se, but is the link to access the Search configuration
+ *
+ * A typical EJB 3.0 usecase would be to get the session from the container (injected)
+ * eg in JBoss EJB 3.0
+ * <code>
+ * @PersistenceContext private Session session;
+ *
+ * protected Session getSession() {
+ * return session
+ * }
+ *
+ * eg in any container
+ * <code>
+ * @PersistenceContext private EntityManager entityManager;
+ *
+ * protected Session getSession() {
+ * return (Session) entityManager.getdelegate();
+ * }
+ */
+ protected abstract Session getSession();
+
+ /**
+ * Ensure to clean the resources after use.
+ * If the session has been directly or indirectly injected, this method is empty
+ */
+ protected abstract void cleanSessionIfNeeded(Session session);
+
+ /**
+ * Process the Hibernate Search work queues received
+ */
+ public void onMessage(Message message) {
+ if ( !( message instanceof ObjectMessage ) ) {
+ log.error( "Incorrect message type: " + message.getClass() );
+ return;
+ }
+ ObjectMessage objectMessage = (ObjectMessage) message;
+ List<LuceneWork> queue;
+ try {
+ queue = (List<LuceneWork>) objectMessage.getObject();
+ }
+ catch (JMSException e) {
+ log.error( "Unable to retrieve object from message: " + message.getClass(), e );
+ return;
+ }
+ catch (ClassCastException e) {
+ log.error( "Illegal object retrieved from message", e );
+ return;
+ }
+ Runnable worker = getWorker( queue );
+ worker.run();
+ }
+
+ private Runnable getWorker(List<LuceneWork> queue) {
+ //FIXME casting sucks becasue we do not control what get session from
+ Session session = getSession();
+ Runnable processor = null;
+
+ try {
+ SearchFactory factory = ContextHelper.getSearchFactory( session );
+ processor = factory.getBackendQueueProcessorFactory().getProcessor( queue );
+ }
+ finally {
+ cleanSessionIfNeeded(session);
+ }
+ return processor;
+ }
+
+ @PostConstruct
+ public void initialize() {
+ //init the source copy process
+ //TODO actually this is probably wrong since this is now part of the DP
+ }
+
+ @PreDestroy
+ public void shutdown() {
+ //stop the source copy process
+ //TODO actually this is probably wrong since this is now part of the DP
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,51 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend.impl.jms;
-
-import java.io.Serializable;
-import java.util.List;
-import javax.jms.JMSException;
-import javax.jms.ObjectMessage;
-import javax.jms.QueueConnection;
-import javax.jms.QueueSender;
-import javax.jms.QueueSession;
-
-import org.hibernate.HibernateException;
-import org.hibernate.search.backend.LuceneWork;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JMSBackendQueueProcessor implements Runnable {
- private List<LuceneWork> queue;
- private JMSBackendQueueProcessorFactory factory;
-
- public JMSBackendQueueProcessor(List<LuceneWork> queue,
- JMSBackendQueueProcessorFactory jmsBackendQueueProcessorFactory) {
- this.queue = queue;
- this.factory = jmsBackendQueueProcessorFactory;
- }
-
- public void run() {
- factory.prepareJMSTools();
- QueueConnection cnn;
- QueueSender sender;
- QueueSession session;
- try {
- cnn = factory.getJMSFactory().createQueueConnection();
- //TODO make transacted parameterized
- session = cnn.createQueueSession( false, QueueSession.AUTO_ACKNOWLEDGE );
-
- ObjectMessage message = session.createObjectMessage();
- message.setObject( (Serializable) this.queue );
-
- sender = session.createSender( factory.getJmsQueue() );
- sender.send( message );
-
- session.close();
- cnn.close();
- }
- catch (JMSException e) {
- throw new HibernateException( "Unable to send Search work to JMS queue: " + factory.getJmsQueueName(), e );
- }
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessor.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessor.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessor.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,51 @@
+//$Id: $
+package org.hibernate.search.backend.impl.jms;
+
+import java.io.Serializable;
+import java.util.List;
+import javax.jms.JMSException;
+import javax.jms.ObjectMessage;
+import javax.jms.QueueConnection;
+import javax.jms.QueueSender;
+import javax.jms.QueueSession;
+
+import org.hibernate.HibernateException;
+import org.hibernate.search.backend.LuceneWork;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JMSBackendQueueProcessor implements Runnable {
+ private List<LuceneWork> queue;
+ private JMSBackendQueueProcessorFactory factory;
+
+ public JMSBackendQueueProcessor(List<LuceneWork> queue,
+ JMSBackendQueueProcessorFactory jmsBackendQueueProcessorFactory) {
+ this.queue = queue;
+ this.factory = jmsBackendQueueProcessorFactory;
+ }
+
+ public void run() {
+ factory.prepareJMSTools();
+ QueueConnection cnn;
+ QueueSender sender;
+ QueueSession session;
+ try {
+ cnn = factory.getJMSFactory().createQueueConnection();
+ //TODO make transacted parameterized
+ session = cnn.createQueueSession( false, QueueSession.AUTO_ACKNOWLEDGE );
+
+ ObjectMessage message = session.createObjectMessage();
+ message.setObject( (Serializable) this.queue );
+
+ sender = session.createSender( factory.getJmsQueue() );
+ sender.send( message );
+
+ session.close();
+ cnn.close();
+ }
+ catch (JMSException e) {
+ throw new HibernateException( "Unable to send Search work to JMS queue: " + factory.getJmsQueueName(), e );
+ }
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,119 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend.impl.jms;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Properties;
-import javax.jms.Queue;
-import javax.jms.QueueConnectionFactory;
-import javax.naming.Context;
-import javax.naming.InitialContext;
-import javax.naming.NamingException;
-
-import org.hibernate.search.Environment;
-import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.backend.BackendQueueProcessorFactory;
-import org.hibernate.search.backend.LuceneWork;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JMSBackendQueueProcessorFactory implements BackendQueueProcessorFactory {
- private String jmsQueueName;
- private String jmsConnectionFactoryName;
- private static final String JNDI_PREFIX = Environment.WORKER_PREFIX + "jndi.";
- private Properties properties;
- private Queue jmsQueue;
- private QueueConnectionFactory factory;
- public static final String JMS_CONNECTION_FACTORY = Environment.WORKER_PREFIX + "jms.connection_factory";
- public static final String JMS_QUEUE = Environment.WORKER_PREFIX + "jms.queue";
-
- public void initialize(Properties props, SearchFactory searchFactory) {
- //TODO proper exception if jms queues and connecitons are not there
- this.properties = props;
- this.jmsConnectionFactoryName = props.getProperty( JMS_CONNECTION_FACTORY );
- this.jmsQueueName = props.getProperty( JMS_QUEUE );
- prepareJMSTools();
- }
-
- public Runnable getProcessor(List<LuceneWork> queue) {
- return new JMSBackendQueueProcessor( queue, this );
- }
-
-
- public QueueConnectionFactory getJMSFactory() {
- return factory;
- }
-
- public Queue getJmsQueue() {
- return jmsQueue;
- }
-
-
- public String getJmsQueueName() {
- return jmsQueueName;
- }
-
- public void prepareJMSTools() {
- if ( jmsQueue != null && factory != null ) return;
- try {
- InitialContext initialContext = getInitialContext( properties );
- factory = (QueueConnectionFactory) initialContext.lookup( jmsConnectionFactoryName );
- jmsQueue = (Queue) initialContext.lookup( jmsQueueName );
-
- }
- catch (NamingException e) {
- throw new SearchException( "Unable to lookup Search queue ("
- + ( jmsQueueName != null ?
- jmsQueueName :
- "null" ) + ") and connection factory ("
- + ( jmsConnectionFactoryName != null ?
- jmsConnectionFactoryName :
- "null" ) + ")",
- e
- );
- }
- }
-
- private InitialContext getInitialContext(Properties properties) throws NamingException {
- Properties jndiProps = getJndiProperties( properties );
- if ( jndiProps.size() == 0 ) {
- return new InitialContext();
- }
- else {
- return new InitialContext( jndiProps );
- }
- }
-
- public static Properties getJndiProperties(Properties properties) {
-
- HashSet specialProps = new HashSet();
- specialProps.add( JNDI_PREFIX + "class" );
- specialProps.add( JNDI_PREFIX + "url" );
-
- Iterator iter = properties.keySet().iterator();
- Properties result = new Properties();
- while ( iter.hasNext() ) {
- String prop = (String) iter.next();
- if ( prop.indexOf( JNDI_PREFIX ) > -1 && !specialProps.contains( prop ) ) {
- result.setProperty(
- prop.substring( JNDI_PREFIX.length() + 1 ),
- properties.getProperty( prop )
- );
- }
- }
-
- String jndiClass = properties.getProperty( JNDI_PREFIX + "class" );
- String jndiURL = properties.getProperty( JNDI_PREFIX + "url" );
- // we want to be able to just use the defaults,
- // if JNDI environment properties are not supplied
- // so don't put null in anywhere
- if ( jndiClass != null ) result.put( Context.INITIAL_CONTEXT_FACTORY, jndiClass );
- if ( jndiURL != null ) result.put( Context.PROVIDER_URL, jndiURL );
-
- return result;
- }
-
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/jms/JMSBackendQueueProcessorFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,119 @@
+//$Id: $
+package org.hibernate.search.backend.impl.jms;
+
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Properties;
+import javax.jms.Queue;
+import javax.jms.QueueConnectionFactory;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+
+import org.hibernate.search.Environment;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneWork;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JMSBackendQueueProcessorFactory implements BackendQueueProcessorFactory {
+ private String jmsQueueName;
+ private String jmsConnectionFactoryName;
+ private static final String JNDI_PREFIX = Environment.WORKER_PREFIX + "jndi.";
+ private Properties properties;
+ private Queue jmsQueue;
+ private QueueConnectionFactory factory;
+ public static final String JMS_CONNECTION_FACTORY = Environment.WORKER_PREFIX + "jms.connection_factory";
+ public static final String JMS_QUEUE = Environment.WORKER_PREFIX + "jms.queue";
+
+ public void initialize(Properties props, SearchFactory searchFactory) {
+ //TODO proper exception if jms queues and connecitons are not there
+ this.properties = props;
+ this.jmsConnectionFactoryName = props.getProperty( JMS_CONNECTION_FACTORY );
+ this.jmsQueueName = props.getProperty( JMS_QUEUE );
+ prepareJMSTools();
+ }
+
+ public Runnable getProcessor(List<LuceneWork> queue) {
+ return new JMSBackendQueueProcessor( queue, this );
+ }
+
+
+ public QueueConnectionFactory getJMSFactory() {
+ return factory;
+ }
+
+ public Queue getJmsQueue() {
+ return jmsQueue;
+ }
+
+
+ public String getJmsQueueName() {
+ return jmsQueueName;
+ }
+
+ public void prepareJMSTools() {
+ if ( jmsQueue != null && factory != null ) return;
+ try {
+ InitialContext initialContext = getInitialContext( properties );
+ factory = (QueueConnectionFactory) initialContext.lookup( jmsConnectionFactoryName );
+ jmsQueue = (Queue) initialContext.lookup( jmsQueueName );
+
+ }
+ catch (NamingException e) {
+ throw new SearchException( "Unable to lookup Search queue ("
+ + ( jmsQueueName != null ?
+ jmsQueueName :
+ "null" ) + ") and connection factory ("
+ + ( jmsConnectionFactoryName != null ?
+ jmsConnectionFactoryName :
+ "null" ) + ")",
+ e
+ );
+ }
+ }
+
+ private InitialContext getInitialContext(Properties properties) throws NamingException {
+ Properties jndiProps = getJndiProperties( properties );
+ if ( jndiProps.size() == 0 ) {
+ return new InitialContext();
+ }
+ else {
+ return new InitialContext( jndiProps );
+ }
+ }
+
+ public static Properties getJndiProperties(Properties properties) {
+
+ HashSet specialProps = new HashSet();
+ specialProps.add( JNDI_PREFIX + "class" );
+ specialProps.add( JNDI_PREFIX + "url" );
+
+ Iterator iter = properties.keySet().iterator();
+ Properties result = new Properties();
+ while ( iter.hasNext() ) {
+ String prop = (String) iter.next();
+ if ( prop.indexOf( JNDI_PREFIX ) > -1 && !specialProps.contains( prop ) ) {
+ result.setProperty(
+ prop.substring( JNDI_PREFIX.length() + 1 ),
+ properties.getProperty( prop )
+ );
+ }
+ }
+
+ String jndiClass = properties.getProperty( JNDI_PREFIX + "class" );
+ String jndiURL = properties.getProperty( JNDI_PREFIX + "url" );
+ // we want to be able to just use the defaults,
+ // if JNDI environment properties are not supplied
+ // so don't put null in anywhere
+ if ( jndiClass != null ) result.put( Context.INITIAL_CONTEXT_FACTORY, jndiClass );
+ if ( jndiURL != null ) result.put( Context.PROVIDER_URL, jndiURL );
+
+ return result;
+ }
+
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,69 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend.impl.lucene;
-
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.backend.AddLuceneWork;
-import org.hibernate.search.backend.LuceneWork;
-import org.hibernate.search.backend.Workspace;
-
-/**
- * Apply the operations to Lucene directories
- * avoiding deadlocks
- *
- * @author Emmanuel Bernard
- */
-public class LuceneBackendQueueProcessor implements Runnable {
- private List<LuceneWork> queue;
- private SearchFactory searchFactory;
-
- public LuceneBackendQueueProcessor(List<LuceneWork> queue, SearchFactory searchFactory) {
- this.queue = queue;
- this.searchFactory = searchFactory;
- }
-
- public void run() {
- Workspace workspace;
- LuceneWorker worker;
- workspace = new Workspace( searchFactory );
- worker = new LuceneWorker( workspace );
- try {
- deadlockFreeQueue(queue, workspace);
- for ( LuceneWork luceneWork : queue ) {
- worker.performWork( luceneWork );
- }
- }
- finally {
- workspace.clean();
- queue.clear();
- }
- }
-
- /**
- * one must lock the directory providers in the exact same order to avoid
- * dead lock between concurrent threads or processes
- * To achieve that, the work will be done per directory provider
- */
- private void deadlockFreeQueue(List<LuceneWork> queue, final Workspace workspace) {
- Collections.sort( queue, new Comparator<LuceneWork>() {
- public int compare(LuceneWork o1, LuceneWork o2) {
- long h1 = getWorkHashCode( o1, workspace );
- long h2 = getWorkHashCode( o2, workspace );
- return h1 < h2 ?
- -1 :
- h1 == h2 ?
- 0 :
- 1;
- }
- } );
- }
-
- private long getWorkHashCode(LuceneWork luceneWork, Workspace workspace) {
- long h = workspace.getDocumentBuilder( luceneWork.getEntityClass() ).hashCode() * 2;
- if ( luceneWork instanceof AddLuceneWork ) h+=1; //addwork after deleteWork
- return h;
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,69 @@
+//$Id: $
+package org.hibernate.search.backend.impl.lucene;
+
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.backend.AddLuceneWork;
+import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.backend.Workspace;
+
+/**
+ * Apply the operations to Lucene directories
+ * avoiding deadlocks
+ *
+ * @author Emmanuel Bernard
+ */
+public class LuceneBackendQueueProcessor implements Runnable {
+ private List<LuceneWork> queue;
+ private SearchFactory searchFactory;
+
+ public LuceneBackendQueueProcessor(List<LuceneWork> queue, SearchFactory searchFactory) {
+ this.queue = queue;
+ this.searchFactory = searchFactory;
+ }
+
+ public void run() {
+ Workspace workspace;
+ LuceneWorker worker;
+ workspace = new Workspace( searchFactory );
+ worker = new LuceneWorker( workspace );
+ try {
+ deadlockFreeQueue(queue, workspace);
+ for ( LuceneWork luceneWork : queue ) {
+ worker.performWork( luceneWork );
+ }
+ }
+ finally {
+ workspace.clean();
+ queue.clear();
+ }
+ }
+
+ /**
+ * one must lock the directory providers in the exact same order to avoid
+ * dead lock between concurrent threads or processes
+ * To achieve that, the work will be done per directory provider
+ */
+ private void deadlockFreeQueue(List<LuceneWork> queue, final Workspace workspace) {
+ Collections.sort( queue, new Comparator<LuceneWork>() {
+ public int compare(LuceneWork o1, LuceneWork o2) {
+ long h1 = getWorkHashCode( o1, workspace );
+ long h2 = getWorkHashCode( o2, workspace );
+ return h1 < h2 ?
+ -1 :
+ h1 == h2 ?
+ 0 :
+ 1;
+ }
+ } );
+ }
+
+ private long getWorkHashCode(LuceneWork luceneWork, Workspace workspace) {
+ long h = workspace.getDocumentBuilder( luceneWork.getEntityClass() ).hashCode() * 2;
+ if ( luceneWork instanceof AddLuceneWork ) h+=1; //addwork after deleteWork
+ return h;
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend.impl.lucene;
-
-import java.util.Properties;
-import java.util.List;
-
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.backend.BackendQueueProcessorFactory;
-import org.hibernate.search.backend.LuceneWork;
-
-/**
- * @author Emmanuel Bernard
- */
-public class LuceneBackendQueueProcessorFactory implements BackendQueueProcessorFactory {
- private SearchFactory searchFactory;
-
- public void initialize(Properties props, SearchFactory searchFactory) {
- this.searchFactory = searchFactory;
- }
-
- public Runnable getProcessor(List<LuceneWork> queue) {
- return new LuceneBackendQueueProcessor( queue, searchFactory );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneBackendQueueProcessorFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.search.backend.impl.lucene;
+
+import java.util.Properties;
+import java.util.List;
+
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.backend.BackendQueueProcessorFactory;
+import org.hibernate.search.backend.LuceneWork;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LuceneBackendQueueProcessorFactory implements BackendQueueProcessorFactory {
+ private SearchFactory searchFactory;
+
+ public void initialize(Properties props, SearchFactory searchFactory) {
+ this.searchFactory = searchFactory;
+ }
+
+ public Runnable getProcessor(List<LuceneWork> queue) {
+ return new LuceneBackendQueueProcessor( queue, searchFactory );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneWorker.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneWorker.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneWorker.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,109 +0,0 @@
-//$Id: $
-package org.hibernate.search.backend.impl.lucene;
-
-import java.io.IOException;
-import java.io.Serializable;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.index.TermDocs;
-import org.hibernate.annotations.common.AssertionFailure;
-import org.hibernate.search.SearchException;
-import org.hibernate.search.backend.AddLuceneWork;
-import org.hibernate.search.backend.DeleteLuceneWork;
-import org.hibernate.search.backend.LuceneWork;
-import org.hibernate.search.backend.Workspace;
-import org.hibernate.search.engine.DocumentBuilder;
-
-/**
- * Stateless implementation that perform a work
- *
- * @author Emmanuel Bernard
- */
-public class LuceneWorker {
- private Workspace workspace;
- private static Log log = LogFactory.getLog( LuceneWorker.class );
-
- public LuceneWorker(Workspace workspace) {
- this.workspace = workspace;
- }
-
- public void performWork(LuceneWork luceneWork) {
- if ( AddLuceneWork.class.isAssignableFrom( luceneWork.getClass() ) ) {
- performWork( (AddLuceneWork) luceneWork );
- }
- else if ( DeleteLuceneWork.class.isAssignableFrom( luceneWork.getClass() ) ) {
- performWork( (DeleteLuceneWork) luceneWork );
- }
- else {
- throw new AssertionFailure( "Unknown work type: " + luceneWork.getClass() );
- }
- }
-
- public void performWork(AddLuceneWork work) {
- Class entity = work.getEntityClass();
- Serializable id = work.getId();
- Document document = work.getDocument();
- add( entity, id, document );
- }
-
- private void add(Class entity, Serializable id, Document document) {
- if ( log.isTraceEnabled() )
- log.trace( "add to Lucene index: " + entity + "#" + id + ": " + document );
- IndexWriter writer = workspace.getIndexWriter( entity );
- try {
- writer.addDocument( document );
- }
- catch (IOException e) {
- throw new SearchException( "Unable to add to Lucene index: " + entity + "#" + id, e );
- }
- }
-
- public void performWork(DeleteLuceneWork work) {
- Class entity = work.getEntityClass();
- Serializable id = work.getId();
- remove( entity, id );
- }
-
- private void remove(Class entity, Serializable id) {
- /**
- * even with Lucene 2.1, use of indexWriter to delte is not an option
- * We can only delete by term, and the index doesn't have a termt that
- * uniquely identify the entry. See logic below
- */
- log.trace( "remove from Lucene index: " + entity + "#" + id );
- DocumentBuilder builder = workspace.getDocumentBuilder( entity );
- Term term = builder.getTerm( id );
- IndexReader reader = workspace.getIndexReader( entity );
- TermDocs termDocs = null;
- try {
- //TODO is there a faster way?
- //TODO include TermDocs into the workspace?
- termDocs = reader.termDocs( term );
- String entityName = entity.getName();
- while ( termDocs.next() ) {
- int docIndex = termDocs.doc();
- if ( entityName.equals( reader.document( docIndex ).get( DocumentBuilder.CLASS_FIELDNAME ) ) ) {
- //remove only the one of the right class
- //loop all to remove all the matches (defensive code)
- reader.deleteDocument( docIndex );
- }
- }
- }
- catch (Exception e) {
- throw new SearchException( "Unable to remove from Lucene index: " + entity + "#" + id, e );
- }
- finally {
- if (termDocs != null) try {
- termDocs.close();
- }
- catch (IOException e) {
- log.warn( "Unable to close termDocs properly", e);
- }
- }
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneWorker.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneWorker.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneWorker.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/backend/impl/lucene/LuceneWorker.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,109 @@
+//$Id: $
+package org.hibernate.search.backend.impl.lucene;
+
+import java.io.IOException;
+import java.io.Serializable;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermDocs;
+import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.backend.AddLuceneWork;
+import org.hibernate.search.backend.DeleteLuceneWork;
+import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.backend.Workspace;
+import org.hibernate.search.engine.DocumentBuilder;
+
+/**
+ * Stateless implementation that perform a work
+ *
+ * @author Emmanuel Bernard
+ */
+public class LuceneWorker {
+ private Workspace workspace;
+ private static Log log = LogFactory.getLog( LuceneWorker.class );
+
+ public LuceneWorker(Workspace workspace) {
+ this.workspace = workspace;
+ }
+
+ public void performWork(LuceneWork luceneWork) {
+ if ( AddLuceneWork.class.isAssignableFrom( luceneWork.getClass() ) ) {
+ performWork( (AddLuceneWork) luceneWork );
+ }
+ else if ( DeleteLuceneWork.class.isAssignableFrom( luceneWork.getClass() ) ) {
+ performWork( (DeleteLuceneWork) luceneWork );
+ }
+ else {
+ throw new AssertionFailure( "Unknown work type: " + luceneWork.getClass() );
+ }
+ }
+
+ public void performWork(AddLuceneWork work) {
+ Class entity = work.getEntityClass();
+ Serializable id = work.getId();
+ Document document = work.getDocument();
+ add( entity, id, document );
+ }
+
+ private void add(Class entity, Serializable id, Document document) {
+ if ( log.isTraceEnabled() )
+ log.trace( "add to Lucene index: " + entity + "#" + id + ": " + document );
+ IndexWriter writer = workspace.getIndexWriter( entity );
+ try {
+ writer.addDocument( document );
+ }
+ catch (IOException e) {
+ throw new SearchException( "Unable to add to Lucene index: " + entity + "#" + id, e );
+ }
+ }
+
+ public void performWork(DeleteLuceneWork work) {
+ Class entity = work.getEntityClass();
+ Serializable id = work.getId();
+ remove( entity, id );
+ }
+
+ private void remove(Class entity, Serializable id) {
+ /**
+ * even with Lucene 2.1, use of indexWriter to delte is not an option
+ * We can only delete by term, and the index doesn't have a termt that
+ * uniquely identify the entry. See logic below
+ */
+ log.trace( "remove from Lucene index: " + entity + "#" + id );
+ DocumentBuilder builder = workspace.getDocumentBuilder( entity );
+ Term term = builder.getTerm( id );
+ IndexReader reader = workspace.getIndexReader( entity );
+ TermDocs termDocs = null;
+ try {
+ //TODO is there a faster way?
+ //TODO include TermDocs into the workspace?
+ termDocs = reader.termDocs( term );
+ String entityName = entity.getName();
+ while ( termDocs.next() ) {
+ int docIndex = termDocs.doc();
+ if ( entityName.equals( reader.document( docIndex ).get( DocumentBuilder.CLASS_FIELDNAME ) ) ) {
+ //remove only the one of the right class
+ //loop all to remove all the matches (defensive code)
+ reader.deleteDocument( docIndex );
+ }
+ }
+ }
+ catch (Exception e) {
+ throw new SearchException( "Unable to remove from Lucene index: " + entity + "#" + id, e );
+ }
+ finally {
+ if (termDocs != null) try {
+ termDocs.close();
+ }
+ catch (IOException e) {
+ log.warn( "Unable to close termDocs properly", e);
+ }
+ }
+ }
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/BridgeFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/BridgeFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/BridgeFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,155 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.hibernate.HibernateException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.search.bridge.builtin.DateBridge;
-import org.hibernate.search.bridge.builtin.FloatBridge;
-import org.hibernate.search.bridge.builtin.LongBridge;
-import org.hibernate.search.bridge.builtin.BigIntegerBridge;
-import org.hibernate.search.bridge.builtin.StringBridge;
-import org.hibernate.search.bridge.builtin.IntegerBridge;
-import org.hibernate.search.bridge.builtin.BigDecimalBridge;
-import org.hibernate.search.bridge.builtin.DoubleBridge;
-import org.hibernate.search.bridge.builtin.ShortBridge;
-import org.hibernate.search.bridge.builtin.EnumBridge;
-import org.hibernate.search.bridge.builtin.BooleanBridge;
-import org.hibernate.search.annotations.Resolution;
-import org.hibernate.search.annotations.Parameter;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XMember;
-
-/**
- * @author Emmanuel Bernard
- */
-public class BridgeFactory {
- private static Map<String, FieldBridge> builtInBridges = new HashMap<String, FieldBridge>();
-
- private BridgeFactory() {
- }
-
- public static final TwoWayFieldBridge DOUBLE = new TwoWayString2FieldBridgeAdaptor( new DoubleBridge() );
-
- public static final TwoWayFieldBridge FLOAT = new TwoWayString2FieldBridgeAdaptor( new FloatBridge() );
-
- public static final TwoWayFieldBridge SHORT = new TwoWayString2FieldBridgeAdaptor( new ShortBridge() );
-
- public static final TwoWayFieldBridge INTEGER = new TwoWayString2FieldBridgeAdaptor( new IntegerBridge() );
-
- public static final TwoWayFieldBridge LONG = new TwoWayString2FieldBridgeAdaptor( new LongBridge() );
-
- public static final TwoWayFieldBridge BIG_INTEGER = new TwoWayString2FieldBridgeAdaptor( new BigIntegerBridge() );
-
- public static final TwoWayFieldBridge BIG_DECIMAL = new TwoWayString2FieldBridgeAdaptor( new BigDecimalBridge() );
-
- public static final TwoWayFieldBridge STRING = new TwoWayString2FieldBridgeAdaptor( new StringBridge() );
-
- public static final TwoWayFieldBridge BOOLEAN = new TwoWayString2FieldBridgeAdaptor( new BooleanBridge() );
-
- public static final FieldBridge DATE_YEAR = new String2FieldBridgeAdaptor( DateBridge.DATE_YEAR );
- public static final FieldBridge DATE_MONTH = new String2FieldBridgeAdaptor( DateBridge.DATE_MONTH );
- public static final FieldBridge DATE_DAY = new String2FieldBridgeAdaptor( DateBridge.DATE_DAY );
- public static final FieldBridge DATE_HOUR = new String2FieldBridgeAdaptor( DateBridge.DATE_HOUR );
- public static final FieldBridge DATE_MINUTE = new String2FieldBridgeAdaptor( DateBridge.DATE_MINUTE );
- public static final FieldBridge DATE_SECOND = new String2FieldBridgeAdaptor( DateBridge.DATE_SECOND );
- public static final TwoWayFieldBridge DATE_MILLISECOND =
- new TwoWayString2FieldBridgeAdaptor( DateBridge.DATE_MILLISECOND );
-
- static {
- builtInBridges.put( Double.class.getName(), DOUBLE );
- builtInBridges.put( double.class.getName(), DOUBLE );
- builtInBridges.put( Float.class.getName(), FLOAT );
- builtInBridges.put( float.class.getName(), FLOAT );
- builtInBridges.put( Short.class.getName(), SHORT );
- builtInBridges.put( short.class.getName(), SHORT );
- builtInBridges.put( Integer.class.getName(), INTEGER );
- builtInBridges.put( int.class.getName(), INTEGER );
- builtInBridges.put( Long.class.getName(), LONG );
- builtInBridges.put( long.class.getName(), LONG );
- builtInBridges.put( BigInteger.class.getName(), BIG_INTEGER );
- builtInBridges.put( BigDecimal.class.getName(), BIG_DECIMAL );
- builtInBridges.put( String.class.getName(), STRING );
- builtInBridges.put( Boolean.class.getName(), BOOLEAN );
- builtInBridges.put( boolean.class.getName(), BOOLEAN );
-
- builtInBridges.put( Date.class.getName(), DATE_MILLISECOND );
- }
-
- public static FieldBridge guessType(XMember member) {
- FieldBridge bridge = null;
- org.hibernate.search.annotations.FieldBridge bridgeAnn =
- member.getAnnotation( org.hibernate.search.annotations.FieldBridge.class );
- if ( bridgeAnn != null ) {
- Class impl = bridgeAnn.impl();
- try {
- Object instance = impl.newInstance();
- if ( FieldBridge.class.isAssignableFrom( impl ) ) {
- bridge = (FieldBridge) instance;
- }
- else if ( org.hibernate.search.bridge.TwoWayStringBridge.class.isAssignableFrom( impl ) ) {
- bridge = new TwoWayString2FieldBridgeAdaptor(
- (org.hibernate.search.bridge.TwoWayStringBridge) instance );
- }
- else if ( org.hibernate.search.bridge.StringBridge.class.isAssignableFrom( impl ) ) {
- bridge = new String2FieldBridgeAdaptor( (org.hibernate.search.bridge.StringBridge) instance );
- }
- if ( bridgeAnn.params().length > 0 && ParameterizedBridge.class.isAssignableFrom( impl ) ) {
- Map params = new HashMap( bridgeAnn.params().length );
- for ( Parameter param : bridgeAnn.params() ) {
- params.put( param.name(), param.value() );
- }
- ( (ParameterizedBridge) instance ).setParameterValues( params );
- }
- }
- catch (Exception e) {
- //TODO add classname
- throw new HibernateException( "Unable to instanciate FieldBridge for " + member.getName(), e );
- }
- }
- else if ( member.isAnnotationPresent( org.hibernate.search.annotations.DateBridge.class ) ) {
- Resolution resolution =
- member.getAnnotation( org.hibernate.search.annotations.DateBridge.class ).resolution();
- bridge = getDateField( resolution );
- }
- else {
- //find in built-ins
- XClass returnType = member.getType();
- bridge = builtInBridges.get( returnType.getName() );
- if ( bridge == null && returnType.isEnum() ) {
- bridge = new TwoWayString2FieldBridgeAdaptor(
- new EnumBridge( (Class<? extends Enum>) returnType.getClass() )
- );
- }
- }
- //TODO add classname
- if ( bridge == null ) throw new HibernateException( "Unable to guess FieldBridge for " + member.getName() );
- return bridge;
- }
-
- public static FieldBridge getDateField(Resolution resolution) {
- switch (resolution) {
- case YEAR:
- return DATE_YEAR;
- case MONTH:
- return DATE_MONTH;
- case DAY:
- return DATE_DAY;
- case HOUR:
- return DATE_HOUR;
- case MINUTE:
- return DATE_MINUTE;
- case SECOND:
- return DATE_SECOND;
- case MILLISECOND:
- return DATE_MILLISECOND;
- default:
- throw new AssertionFailure( "Unknown Resolution: " + resolution );
- }
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/BridgeFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/BridgeFactory.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/BridgeFactory.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/BridgeFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,155 @@
+//$Id: $
+package org.hibernate.search.bridge;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.hibernate.HibernateException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.search.bridge.builtin.DateBridge;
+import org.hibernate.search.bridge.builtin.FloatBridge;
+import org.hibernate.search.bridge.builtin.LongBridge;
+import org.hibernate.search.bridge.builtin.BigIntegerBridge;
+import org.hibernate.search.bridge.builtin.StringBridge;
+import org.hibernate.search.bridge.builtin.IntegerBridge;
+import org.hibernate.search.bridge.builtin.BigDecimalBridge;
+import org.hibernate.search.bridge.builtin.DoubleBridge;
+import org.hibernate.search.bridge.builtin.ShortBridge;
+import org.hibernate.search.bridge.builtin.EnumBridge;
+import org.hibernate.search.bridge.builtin.BooleanBridge;
+import org.hibernate.search.annotations.Resolution;
+import org.hibernate.search.annotations.Parameter;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XMember;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BridgeFactory {
+ private static Map<String, FieldBridge> builtInBridges = new HashMap<String, FieldBridge>();
+
+ private BridgeFactory() {
+ }
+
+ public static final TwoWayFieldBridge DOUBLE = new TwoWayString2FieldBridgeAdaptor( new DoubleBridge() );
+
+ public static final TwoWayFieldBridge FLOAT = new TwoWayString2FieldBridgeAdaptor( new FloatBridge() );
+
+ public static final TwoWayFieldBridge SHORT = new TwoWayString2FieldBridgeAdaptor( new ShortBridge() );
+
+ public static final TwoWayFieldBridge INTEGER = new TwoWayString2FieldBridgeAdaptor( new IntegerBridge() );
+
+ public static final TwoWayFieldBridge LONG = new TwoWayString2FieldBridgeAdaptor( new LongBridge() );
+
+ public static final TwoWayFieldBridge BIG_INTEGER = new TwoWayString2FieldBridgeAdaptor( new BigIntegerBridge() );
+
+ public static final TwoWayFieldBridge BIG_DECIMAL = new TwoWayString2FieldBridgeAdaptor( new BigDecimalBridge() );
+
+ public static final TwoWayFieldBridge STRING = new TwoWayString2FieldBridgeAdaptor( new StringBridge() );
+
+ public static final TwoWayFieldBridge BOOLEAN = new TwoWayString2FieldBridgeAdaptor( new BooleanBridge() );
+
+ public static final FieldBridge DATE_YEAR = new String2FieldBridgeAdaptor( DateBridge.DATE_YEAR );
+ public static final FieldBridge DATE_MONTH = new String2FieldBridgeAdaptor( DateBridge.DATE_MONTH );
+ public static final FieldBridge DATE_DAY = new String2FieldBridgeAdaptor( DateBridge.DATE_DAY );
+ public static final FieldBridge DATE_HOUR = new String2FieldBridgeAdaptor( DateBridge.DATE_HOUR );
+ public static final FieldBridge DATE_MINUTE = new String2FieldBridgeAdaptor( DateBridge.DATE_MINUTE );
+ public static final FieldBridge DATE_SECOND = new String2FieldBridgeAdaptor( DateBridge.DATE_SECOND );
+ public static final TwoWayFieldBridge DATE_MILLISECOND =
+ new TwoWayString2FieldBridgeAdaptor( DateBridge.DATE_MILLISECOND );
+
+ static {
+ builtInBridges.put( Double.class.getName(), DOUBLE );
+ builtInBridges.put( double.class.getName(), DOUBLE );
+ builtInBridges.put( Float.class.getName(), FLOAT );
+ builtInBridges.put( float.class.getName(), FLOAT );
+ builtInBridges.put( Short.class.getName(), SHORT );
+ builtInBridges.put( short.class.getName(), SHORT );
+ builtInBridges.put( Integer.class.getName(), INTEGER );
+ builtInBridges.put( int.class.getName(), INTEGER );
+ builtInBridges.put( Long.class.getName(), LONG );
+ builtInBridges.put( long.class.getName(), LONG );
+ builtInBridges.put( BigInteger.class.getName(), BIG_INTEGER );
+ builtInBridges.put( BigDecimal.class.getName(), BIG_DECIMAL );
+ builtInBridges.put( String.class.getName(), STRING );
+ builtInBridges.put( Boolean.class.getName(), BOOLEAN );
+ builtInBridges.put( boolean.class.getName(), BOOLEAN );
+
+ builtInBridges.put( Date.class.getName(), DATE_MILLISECOND );
+ }
+
+ public static FieldBridge guessType(XMember member) {
+ FieldBridge bridge = null;
+ org.hibernate.search.annotations.FieldBridge bridgeAnn =
+ member.getAnnotation( org.hibernate.search.annotations.FieldBridge.class );
+ if ( bridgeAnn != null ) {
+ Class impl = bridgeAnn.impl();
+ try {
+ Object instance = impl.newInstance();
+ if ( FieldBridge.class.isAssignableFrom( impl ) ) {
+ bridge = (FieldBridge) instance;
+ }
+ else if ( org.hibernate.search.bridge.TwoWayStringBridge.class.isAssignableFrom( impl ) ) {
+ bridge = new TwoWayString2FieldBridgeAdaptor(
+ (org.hibernate.search.bridge.TwoWayStringBridge) instance );
+ }
+ else if ( org.hibernate.search.bridge.StringBridge.class.isAssignableFrom( impl ) ) {
+ bridge = new String2FieldBridgeAdaptor( (org.hibernate.search.bridge.StringBridge) instance );
+ }
+ if ( bridgeAnn.params().length > 0 && ParameterizedBridge.class.isAssignableFrom( impl ) ) {
+ Map params = new HashMap( bridgeAnn.params().length );
+ for ( Parameter param : bridgeAnn.params() ) {
+ params.put( param.name(), param.value() );
+ }
+ ( (ParameterizedBridge) instance ).setParameterValues( params );
+ }
+ }
+ catch (Exception e) {
+ //TODO add classname
+ throw new HibernateException( "Unable to instanciate FieldBridge for " + member.getName(), e );
+ }
+ }
+ else if ( member.isAnnotationPresent( org.hibernate.search.annotations.DateBridge.class ) ) {
+ Resolution resolution =
+ member.getAnnotation( org.hibernate.search.annotations.DateBridge.class ).resolution();
+ bridge = getDateField( resolution );
+ }
+ else {
+ //find in built-ins
+ XClass returnType = member.getType();
+ bridge = builtInBridges.get( returnType.getName() );
+ if ( bridge == null && returnType.isEnum() ) {
+ bridge = new TwoWayString2FieldBridgeAdaptor(
+ new EnumBridge( (Class<? extends Enum>) returnType.getClass() )
+ );
+ }
+ }
+ //TODO add classname
+ if ( bridge == null ) throw new HibernateException( "Unable to guess FieldBridge for " + member.getName() );
+ return bridge;
+ }
+
+ public static FieldBridge getDateField(Resolution resolution) {
+ switch (resolution) {
+ case YEAR:
+ return DATE_YEAR;
+ case MONTH:
+ return DATE_MONTH;
+ case DAY:
+ return DATE_DAY;
+ case HOUR:
+ return DATE_HOUR;
+ case MINUTE:
+ return DATE_MINUTE;
+ case SECOND:
+ return DATE_SECOND;
+ case MILLISECOND:
+ return DATE_MILLISECOND;
+ default:
+ throw new AssertionFailure( "Unknown Resolution: " + resolution );
+ }
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/FieldBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/FieldBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/FieldBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge;
-
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-
-/**
- * Link between a java property and a Lucene Document
- * Usually a Java property will be linked to a Document Field
- *
- * @author Emmanuel Bernard
- */
-//TODO should show Field or document?
-//document is nice since I can save an object into several fields
-public interface FieldBridge {
- /**
- * Manipulate the document to index the given value.
- * A common implementation is to add a Field <code>name</code> to the given document following
- * the parameters (<code>store</code>, <code>index</code>, <code>boost</code>) if the
- * <code>value</code> is not null
- */
- void set(String name, Object value, Document document, Field.Store store, Field.Index index, Float boost);
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/FieldBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/FieldBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/FieldBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/FieldBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id: $
+package org.hibernate.search.bridge;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+
+/**
+ * Link between a java property and a Lucene Document
+ * Usually a Java property will be linked to a Document Field
+ *
+ * @author Emmanuel Bernard
+ */
+//TODO should show Field or document?
+//document is nice since I can save an object into several fields
+public interface FieldBridge {
+ /**
+ * Manipulate the document to index the given value.
+ * A common implementation is to add a Field <code>name</code> to the given document following
+ * the parameters (<code>store</code>, <code>index</code>, <code>boost</code>) if the
+ * <code>value</code> is not null
+ */
+ void set(String name, Object value, Document document, Field.Store store, Field.Index index, Float boost);
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/ParameterizedBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/ParameterizedBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/ParameterizedBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge;
-
-import java.util.Map;
-
-/**
- * Allow parameter injection to a given bridge
- *
- * @author Emmanuel Bernard
- */
-public interface ParameterizedBridge {
- //TODO inject Properties? since the annotations cannot support Object attribute?
- void setParameterValues(Map parameters);
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/ParameterizedBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/ParameterizedBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/ParameterizedBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/ParameterizedBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id: $
+package org.hibernate.search.bridge;
+
+import java.util.Map;
+
+/**
+ * Allow parameter injection to a given bridge
+ *
+ * @author Emmanuel Bernard
+ */
+public interface ParameterizedBridge {
+ //TODO inject Properties? since the annotations cannot support Object attribute?
+ void setParameterValues(Map parameters);
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/String2FieldBridgeAdaptor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/String2FieldBridgeAdaptor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/String2FieldBridgeAdaptor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge;
-
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.hibernate.util.StringHelper;
-
-/**
- * Bridge to use a StringBridge as a FieldBridge
- *
- * @author Emmanuel Bernard
- */
-public class String2FieldBridgeAdaptor implements FieldBridge {
- private StringBridge stringBridge;
-
- public String2FieldBridgeAdaptor(StringBridge stringBridge) {
- this.stringBridge = stringBridge;
- }
-
- public void set(String name, Object value, Document document, Field.Store store, Field.Index index, Float boost) {
- String indexedString = stringBridge.objectToString( value );
- //Do not add fields on empty strings, seems a sensible default in most situations
- if ( StringHelper.isNotEmpty( indexedString ) ) {
- Field field = new Field( name, indexedString, store, index );
- if ( boost != null ) field.setBoost( boost );
- document.add( field );
- }
- }
-
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/String2FieldBridgeAdaptor.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/String2FieldBridgeAdaptor.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/String2FieldBridgeAdaptor.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/String2FieldBridgeAdaptor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id: $
+package org.hibernate.search.bridge;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.hibernate.util.StringHelper;
+
+/**
+ * Bridge to use a StringBridge as a FieldBridge
+ *
+ * @author Emmanuel Bernard
+ */
+public class String2FieldBridgeAdaptor implements FieldBridge {
+ private StringBridge stringBridge;
+
+ public String2FieldBridgeAdaptor(StringBridge stringBridge) {
+ this.stringBridge = stringBridge;
+ }
+
+ public void set(String name, Object value, Document document, Field.Store store, Field.Index index, Float boost) {
+ String indexedString = stringBridge.objectToString( value );
+ //Do not add fields on empty strings, seems a sensible default in most situations
+ if ( StringHelper.isNotEmpty( indexedString ) ) {
+ Field field = new Field( name, indexedString, store, index );
+ if ( boost != null ) field.setBoost( boost );
+ document.add( field );
+ }
+ }
+
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/StringBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/StringBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/StringBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge;
-
-/**
- * Transform an object into a string representation
- *
- * @author Emmanuel Bernard
- */
-public interface StringBridge {
-
- /**
- * convert the object representation to a String
- * The return String must not be null, it can be empty though
- */
- String objectToString(Object object);
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/StringBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/StringBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/StringBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/StringBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.search.bridge;
+
+/**
+ * Transform an object into a string representation
+ *
+ * @author Emmanuel Bernard
+ */
+public interface StringBridge {
+
+ /**
+ * convert the object representation to a String
+ * The return String must not be null, it can be empty though
+ */
+ String objectToString(Object object);
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayFieldBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayFieldBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayFieldBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge;
-
-import org.apache.lucene.document.Document;
-
-/**
- * A FieldBrige able to convert the index representation back into an object without losing information
- *
- * Any bridge expected to process a document id should implement this interface
- * EXPERIMENTAL Consider this interface as private
- *
- * @author Emmanuel Bernard
- */
-//FIXME rework the interface inheritance there are some common concepts with StringBridge
-public interface TwoWayFieldBridge extends FieldBridge {
- /**
- * build the element object from the Document
- *
- * The return value is the Entity id
- *
- * @param name field name
- * @param document document
- */
- Object get(String name, Document document);
-
- /**
- * convert the object representation to a String
- * The return String must not be null, it can be empty though
- * EXPERIMENTAL API subject to change in the future
- */
- String objectToString(Object object);
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayFieldBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayFieldBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayFieldBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayFieldBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id: $
+package org.hibernate.search.bridge;
+
+import org.apache.lucene.document.Document;
+
+/**
+ * A FieldBrige able to convert the index representation back into an object without losing information
+ *
+ * Any bridge expected to process a document id should implement this interface
+ * EXPERIMENTAL Consider this interface as private
+ *
+ * @author Emmanuel Bernard
+ */
+//FIXME rework the interface inheritance there are some common concepts with StringBridge
+public interface TwoWayFieldBridge extends FieldBridge {
+ /**
+ * build the element object from the Document
+ *
+ * The return value is the Entity id
+ *
+ * @param name field name
+ * @param document document
+ */
+ Object get(String name, Document document);
+
+ /**
+ * convert the object representation to a String
+ * The return String must not be null, it can be empty though
+ * EXPERIMENTAL API subject to change in the future
+ */
+ String objectToString(Object object);
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayString2FieldBridgeAdaptor.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayString2FieldBridgeAdaptor.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayString2FieldBridgeAdaptor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge;
-
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-
-/**
- * Bridge to use a TwoWayStringBridge as a TwoWayFieldBridge
- *
- * @author Emmanuel Bernard
- */
-//TODO use Generics to avoid double declaration of stringBridge
-public class TwoWayString2FieldBridgeAdaptor extends String2FieldBridgeAdaptor implements TwoWayFieldBridge {
-
- private TwoWayStringBridge stringBridge;
-
- public TwoWayString2FieldBridgeAdaptor(TwoWayStringBridge stringBridge) {
- super( stringBridge );
- this.stringBridge = stringBridge;
- }
-
- public String objectToString(Object object) {
- return stringBridge.objectToString( object );
- }
-
- public Object get(String name, Document document) {
- Field field = document.getField( name );
- return stringBridge.stringToObject( field.stringValue() );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayString2FieldBridgeAdaptor.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayString2FieldBridgeAdaptor.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayString2FieldBridgeAdaptor.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayString2FieldBridgeAdaptor.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id: $
+package org.hibernate.search.bridge;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+
+/**
+ * Bridge to use a TwoWayStringBridge as a TwoWayFieldBridge
+ *
+ * @author Emmanuel Bernard
+ */
+//TODO use Generics to avoid double declaration of stringBridge
+public class TwoWayString2FieldBridgeAdaptor extends String2FieldBridgeAdaptor implements TwoWayFieldBridge {
+
+ private TwoWayStringBridge stringBridge;
+
+ public TwoWayString2FieldBridgeAdaptor(TwoWayStringBridge stringBridge) {
+ super( stringBridge );
+ this.stringBridge = stringBridge;
+ }
+
+ public String objectToString(Object object) {
+ return stringBridge.objectToString( object );
+ }
+
+ public Object get(String name, Document document) {
+ Field field = document.getField( name );
+ return stringBridge.stringToObject( field.stringValue() );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayStringBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayStringBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayStringBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge;
-
-/**
- * StringBridge allowing a translation from the String back to the Object
- * objectToString( stringToObject( string ) ) and stringToObject( objectToString( object ) )
- * should be "idempotent". More precisely,
- *
- * objectToString( stringToObject( string ) ).equals(string) for string not null
- * stringToObject( objectToString( object ) ).equals(object) for object not null
- * @author Emmanuel Bernard
- */
-public interface TwoWayStringBridge extends StringBridge {
- /**
- * Convert the string representation to an object
- */
- Object stringToObject(String stringValue);
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayStringBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayStringBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayStringBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/TwoWayStringBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.search.bridge;
+
+/**
+ * StringBridge allowing a translation from the String back to the Object
+ * objectToString( stringToObject( string ) ) and stringToObject( objectToString( object ) )
+ * should be "idempotent". More precisely,
+ *
+ * objectToString( stringToObject( string ) ).equals(string) for string not null
+ * stringToObject( objectToString( object ) ).equals(object) for object not null
+ * @author Emmanuel Bernard
+ */
+public interface TwoWayStringBridge extends StringBridge {
+ /**
+ * Convert the string representation to an object
+ */
+ Object stringToObject(String stringValue);
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigDecimalBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigDecimalBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigDecimalBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import java.math.BigDecimal;
-
-import org.hibernate.util.StringHelper;
-
-/**
- * Map a BigDecimal element
- *
- * @author Emmanuel Bernard
- */
-public class BigDecimalBridge extends NumberBridge {
- public Object stringToObject(String stringValue) {
- if ( StringHelper.isEmpty( stringValue ) ) return null;
- return new BigDecimal( stringValue );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigDecimalBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigDecimalBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigDecimalBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigDecimalBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import java.math.BigDecimal;
+
+import org.hibernate.util.StringHelper;
+
+/**
+ * Map a BigDecimal element
+ *
+ * @author Emmanuel Bernard
+ */
+public class BigDecimalBridge extends NumberBridge {
+ public Object stringToObject(String stringValue) {
+ if ( StringHelper.isEmpty( stringValue ) ) return null;
+ return new BigDecimal( stringValue );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigIntegerBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigIntegerBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigIntegerBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import java.math.BigInteger;
-
-import org.hibernate.util.StringHelper;
-
-/**
- * Map a BigInteger element
- *
- * @author Emmanuel Bernard
- */
-public class BigIntegerBridge extends NumberBridge {
- public Object stringToObject(String stringValue) {
- if ( StringHelper.isEmpty( stringValue ) ) return null;
- return new BigInteger( stringValue );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigIntegerBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigIntegerBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigIntegerBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BigIntegerBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import java.math.BigInteger;
+
+import org.hibernate.util.StringHelper;
+
+/**
+ * Map a BigInteger element
+ *
+ * @author Emmanuel Bernard
+ */
+public class BigIntegerBridge extends NumberBridge {
+ public Object stringToObject(String stringValue) {
+ if ( StringHelper.isEmpty( stringValue ) ) return null;
+ return new BigInteger( stringValue );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BooleanBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BooleanBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BooleanBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import org.hibernate.search.bridge.TwoWayStringBridge;
-
-
-/**
- * Map a boolean field
- *
- * @author Sylvain Vieujot
- */
-public class BooleanBridge implements TwoWayStringBridge {
-
- public Boolean stringToObject(String stringValue) {
- return Boolean.valueOf( stringValue );
- }
-
- public String objectToString(Object object) {
- Boolean b = (Boolean) object;
- return b.toString();
- }
-}
-
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BooleanBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BooleanBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BooleanBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/BooleanBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import org.hibernate.search.bridge.TwoWayStringBridge;
+
+
+/**
+ * Map a boolean field
+ *
+ * @author Sylvain Vieujot
+ */
+public class BooleanBridge implements TwoWayStringBridge {
+
+ public Boolean stringToObject(String stringValue) {
+ return Boolean.valueOf( stringValue );
+ }
+
+ public String objectToString(Object object) {
+ Boolean b = (Boolean) object;
+ return b.toString();
+ }
+}
+
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DateBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DateBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DateBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,111 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import java.text.ParseException;
-import java.util.Date;
-import java.util.Locale;
-import java.util.Map;
-
-import org.apache.lucene.document.DateTools;
-import org.hibernate.AssertionFailure;
-import org.hibernate.HibernateException;
-import org.hibernate.search.bridge.StringBridge;
-import org.hibernate.search.bridge.ParameterizedBridge;
-import org.hibernate.search.bridge.String2FieldBridgeAdaptor;
-import org.hibernate.search.annotations.Resolution;
-import org.hibernate.search.bridge.TwoWayString2FieldBridgeAdaptor;
-import org.hibernate.search.bridge.TwoWayStringBridge;
-import org.hibernate.util.StringHelper;
-
-/**
- * Bridge a java.util.Date to a String, truncated to the resolution
- * Date are stored GMT based
- * <p/>
- * ie
- * Resolution.YEAR: yyyy
- * Resolution.MONTH: yyyyMM
- * Resolution.DAY: yyyyMMdd
- * Resolution.HOUR: yyyyMMddHH
- * Resolution.MINUTE: yyyyMMddHHmm
- * Resolution.SECOND: yyyyMMddHHmmss
- * Resolution.MILLISECOND: yyyyMMddHHmmssSSS
- *
- * @author Emmanuel Bernard
- */
-//TODO split into StringBridge and TwoWayStringBridge?
-public class DateBridge implements TwoWayStringBridge, ParameterizedBridge {
-
- public static final TwoWayStringBridge DATE_YEAR = new DateBridge( Resolution.YEAR );
- public static final TwoWayStringBridge DATE_MONTH = new DateBridge( Resolution.MONTH );
- public static final TwoWayStringBridge DATE_DAY = new DateBridge( Resolution.DAY );
- public static final TwoWayStringBridge DATE_HOUR = new DateBridge( Resolution.HOUR );
- public static final TwoWayStringBridge DATE_MINUTE = new DateBridge( Resolution.MINUTE );
- public static final TwoWayStringBridge DATE_SECOND = new DateBridge( Resolution.SECOND );
- public static final TwoWayStringBridge DATE_MILLISECOND = new DateBridge( Resolution.MILLISECOND );
-
- DateTools.Resolution resolution;
-
- public DateBridge() {
- }
-
- public DateBridge(Resolution resolution) {
- setResolution( resolution );
- }
-
- public Object stringToObject(String stringValue) {
- if ( StringHelper.isEmpty( stringValue ) ) return null;
- try {
- return DateTools.stringToDate( stringValue );
- }
- catch (ParseException e) {
- throw new HibernateException( "Unable to parse into date: " + stringValue, e );
- }
- }
-
- public String objectToString(Object object) {
- return object != null ?
- DateTools.dateToString( (Date) object, resolution ) :
- null;
- }
-
- public void setParameterValues(Map parameters) {
- Object resolution = parameters.get( "resolution" );
- Resolution hibResolution;
- if ( resolution instanceof String ) {
- hibResolution = Resolution.valueOf( ( (String) resolution ).toUpperCase( Locale.ENGLISH ) );
- }
- else {
- hibResolution = (Resolution) resolution;
- }
- setResolution( hibResolution );
- }
-
- private void setResolution(Resolution hibResolution) {
- switch (hibResolution) {
- case YEAR:
- this.resolution = DateTools.Resolution.YEAR;
- break;
- case MONTH:
- this.resolution = DateTools.Resolution.MONTH;
- break;
- case DAY:
- this.resolution = DateTools.Resolution.DAY;
- break;
- case HOUR:
- this.resolution = DateTools.Resolution.HOUR;
- break;
- case MINUTE:
- this.resolution = DateTools.Resolution.MINUTE;
- break;
- case SECOND:
- this.resolution = DateTools.Resolution.SECOND;
- break;
- case MILLISECOND:
- this.resolution = DateTools.Resolution.MILLISECOND;
- break;
- default:
- throw new AssertionFailure( "Unknown Resolution: " + hibResolution );
-
- }
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DateBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DateBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DateBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DateBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,111 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import java.text.ParseException;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Map;
+
+import org.apache.lucene.document.DateTools;
+import org.hibernate.AssertionFailure;
+import org.hibernate.HibernateException;
+import org.hibernate.search.bridge.StringBridge;
+import org.hibernate.search.bridge.ParameterizedBridge;
+import org.hibernate.search.bridge.String2FieldBridgeAdaptor;
+import org.hibernate.search.annotations.Resolution;
+import org.hibernate.search.bridge.TwoWayString2FieldBridgeAdaptor;
+import org.hibernate.search.bridge.TwoWayStringBridge;
+import org.hibernate.util.StringHelper;
+
+/**
+ * Bridge a java.util.Date to a String, truncated to the resolution
+ * Date are stored GMT based
+ * <p/>
+ * ie
+ * Resolution.YEAR: yyyy
+ * Resolution.MONTH: yyyyMM
+ * Resolution.DAY: yyyyMMdd
+ * Resolution.HOUR: yyyyMMddHH
+ * Resolution.MINUTE: yyyyMMddHHmm
+ * Resolution.SECOND: yyyyMMddHHmmss
+ * Resolution.MILLISECOND: yyyyMMddHHmmssSSS
+ *
+ * @author Emmanuel Bernard
+ */
+//TODO split into StringBridge and TwoWayStringBridge?
+public class DateBridge implements TwoWayStringBridge, ParameterizedBridge {
+
+ public static final TwoWayStringBridge DATE_YEAR = new DateBridge( Resolution.YEAR );
+ public static final TwoWayStringBridge DATE_MONTH = new DateBridge( Resolution.MONTH );
+ public static final TwoWayStringBridge DATE_DAY = new DateBridge( Resolution.DAY );
+ public static final TwoWayStringBridge DATE_HOUR = new DateBridge( Resolution.HOUR );
+ public static final TwoWayStringBridge DATE_MINUTE = new DateBridge( Resolution.MINUTE );
+ public static final TwoWayStringBridge DATE_SECOND = new DateBridge( Resolution.SECOND );
+ public static final TwoWayStringBridge DATE_MILLISECOND = new DateBridge( Resolution.MILLISECOND );
+
+ DateTools.Resolution resolution;
+
+ public DateBridge() {
+ }
+
+ public DateBridge(Resolution resolution) {
+ setResolution( resolution );
+ }
+
+ public Object stringToObject(String stringValue) {
+ if ( StringHelper.isEmpty( stringValue ) ) return null;
+ try {
+ return DateTools.stringToDate( stringValue );
+ }
+ catch (ParseException e) {
+ throw new HibernateException( "Unable to parse into date: " + stringValue, e );
+ }
+ }
+
+ public String objectToString(Object object) {
+ return object != null ?
+ DateTools.dateToString( (Date) object, resolution ) :
+ null;
+ }
+
+ public void setParameterValues(Map parameters) {
+ Object resolution = parameters.get( "resolution" );
+ Resolution hibResolution;
+ if ( resolution instanceof String ) {
+ hibResolution = Resolution.valueOf( ( (String) resolution ).toUpperCase( Locale.ENGLISH ) );
+ }
+ else {
+ hibResolution = (Resolution) resolution;
+ }
+ setResolution( hibResolution );
+ }
+
+ private void setResolution(Resolution hibResolution) {
+ switch (hibResolution) {
+ case YEAR:
+ this.resolution = DateTools.Resolution.YEAR;
+ break;
+ case MONTH:
+ this.resolution = DateTools.Resolution.MONTH;
+ break;
+ case DAY:
+ this.resolution = DateTools.Resolution.DAY;
+ break;
+ case HOUR:
+ this.resolution = DateTools.Resolution.HOUR;
+ break;
+ case MINUTE:
+ this.resolution = DateTools.Resolution.MINUTE;
+ break;
+ case SECOND:
+ this.resolution = DateTools.Resolution.SECOND;
+ break;
+ case MILLISECOND:
+ this.resolution = DateTools.Resolution.MILLISECOND;
+ break;
+ default:
+ throw new AssertionFailure( "Unknown Resolution: " + hibResolution );
+
+ }
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DoubleBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DoubleBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DoubleBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import org.hibernate.util.StringHelper;
-
-/**
- * Map a double element
- *
- * @author Emmanuel Bernard
- */
-public class DoubleBridge extends NumberBridge {
- public Object stringToObject(String stringValue) {
- if ( StringHelper.isEmpty( stringValue ) ) return null;
- return new Double( stringValue );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DoubleBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DoubleBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DoubleBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/DoubleBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import org.hibernate.util.StringHelper;
+
+/**
+ * Map a double element
+ *
+ * @author Emmanuel Bernard
+ */
+public class DoubleBridge extends NumberBridge {
+ public Object stringToObject(String stringValue) {
+ if ( StringHelper.isEmpty( stringValue ) ) return null;
+ return new Double( stringValue );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/EnumBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/EnumBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/EnumBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import org.hibernate.search.bridge.TwoWayStringBridge;
-
-
-/**
- * Map an Enum field
- *
- * @author Sylvain Vieujot
- */
-public class EnumBridge implements TwoWayStringBridge {
-
- private Class<? extends Enum> clazz = null;
-
- /**
- * @param clazz the class of the enum.
- */
- public EnumBridge(Class<? extends Enum> clazz) {
- this.clazz = clazz;
- }
-
- public Enum<? extends Enum> stringToObject(String stringValue) {
- return Enum.valueOf( clazz, stringValue );
- }
-
- public String objectToString(Object object) {
- Enum e = (Enum) object;
- return e != null ? e.name() : null;
- }
-}
-
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/EnumBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/EnumBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/EnumBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/EnumBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import org.hibernate.search.bridge.TwoWayStringBridge;
+
+
+/**
+ * Map an Enum field
+ *
+ * @author Sylvain Vieujot
+ */
+public class EnumBridge implements TwoWayStringBridge {
+
+ private Class<? extends Enum> clazz = null;
+
+ /**
+ * @param clazz the class of the enum.
+ */
+ public EnumBridge(Class<? extends Enum> clazz) {
+ this.clazz = clazz;
+ }
+
+ public Enum<? extends Enum> stringToObject(String stringValue) {
+ return Enum.valueOf( clazz, stringValue );
+ }
+
+ public String objectToString(Object object) {
+ Enum e = (Enum) object;
+ return e != null ? e.name() : null;
+ }
+}
+
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/FloatBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/FloatBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/FloatBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import org.hibernate.util.StringHelper;
-
-/**
- * Map a float element
- *
- * @author Emmanuel Bernard
- */
-public class FloatBridge extends NumberBridge {
- public Object stringToObject(String stringValue) {
- if ( StringHelper.isEmpty( stringValue ) ) return null;
- return new Float( stringValue );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/FloatBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/FloatBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/FloatBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/FloatBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import org.hibernate.util.StringHelper;
+
+/**
+ * Map a float element
+ *
+ * @author Emmanuel Bernard
+ */
+public class FloatBridge extends NumberBridge {
+ public Object stringToObject(String stringValue) {
+ if ( StringHelper.isEmpty( stringValue ) ) return null;
+ return new Float( stringValue );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/IntegerBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/IntegerBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/IntegerBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import org.hibernate.util.StringHelper;
-
-/**
- * Map an integer element
- *
- * @author Emmanuel Bernard
- */
-public class IntegerBridge extends NumberBridge {
- public Object stringToObject(String stringValue) {
- if ( StringHelper.isEmpty( stringValue ) ) return null;
- return new Integer( stringValue );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/IntegerBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/IntegerBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/IntegerBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/IntegerBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import org.hibernate.util.StringHelper;
+
+/**
+ * Map an integer element
+ *
+ * @author Emmanuel Bernard
+ */
+public class IntegerBridge extends NumberBridge {
+ public Object stringToObject(String stringValue) {
+ if ( StringHelper.isEmpty( stringValue ) ) return null;
+ return new Integer( stringValue );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/LongBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/LongBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/LongBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import org.hibernate.util.StringHelper;
-
-/**
- * Map a long element
- *
- * @author Emmanuel Bernard
- */
-public class LongBridge extends NumberBridge {
- public Object stringToObject(String stringValue) {
- if ( StringHelper.isEmpty( stringValue ) ) return null;
- return new Long( stringValue );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/LongBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/LongBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/LongBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/LongBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import org.hibernate.util.StringHelper;
+
+/**
+ * Map a long element
+ *
+ * @author Emmanuel Bernard
+ */
+public class LongBridge extends NumberBridge {
+ public Object stringToObject(String stringValue) {
+ if ( StringHelper.isEmpty( stringValue ) ) return null;
+ return new Long( stringValue );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/NumberBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/NumberBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/NumberBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import org.hibernate.search.bridge.StringBridge;
-import org.hibernate.search.bridge.TwoWayStringBridge;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class NumberBridge implements TwoWayStringBridge {
- public String objectToString(Object object) {
- return object != null ?
- object.toString() :
- null;
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/NumberBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/NumberBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/NumberBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/NumberBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import org.hibernate.search.bridge.StringBridge;
+import org.hibernate.search.bridge.TwoWayStringBridge;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class NumberBridge implements TwoWayStringBridge {
+ public String objectToString(Object object) {
+ return object != null ?
+ object.toString() :
+ null;
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/ShortBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/ShortBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/ShortBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-import org.hibernate.util.StringHelper;
-
-/**
- * Map a short element
- *
- * @author Emmanuel Bernard
- */
-public class ShortBridge extends NumberBridge {
- public Object stringToObject(String stringValue) {
- if ( StringHelper.isEmpty( stringValue ) ) return null;
- return new Short( stringValue );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/ShortBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/ShortBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/ShortBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/ShortBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+import org.hibernate.util.StringHelper;
+
+/**
+ * Map a short element
+ *
+ * @author Emmanuel Bernard
+ */
+public class ShortBridge extends NumberBridge {
+ public Object stringToObject(String stringValue) {
+ if ( StringHelper.isEmpty( stringValue ) ) return null;
+ return new Short( stringValue );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/StringBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/StringBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/StringBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,18 +0,0 @@
-//$Id: $
-package org.hibernate.search.bridge.builtin;
-
-
-/**
- * Map a string element
- *
- * @author Emmanuel Bernard
- */
-public class StringBridge implements org.hibernate.search.bridge.TwoWayStringBridge {
- public Object stringToObject(String stringValue) {
- return stringValue;
- }
-
- public String objectToString(Object object) {
- return (String) object;
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/StringBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/StringBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/StringBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/bridge/builtin/StringBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,18 @@
+//$Id: $
+package org.hibernate.search.bridge.builtin;
+
+
+/**
+ * Map a string element
+ *
+ * @author Emmanuel Bernard
+ */
+public class StringBridge implements org.hibernate.search.bridge.TwoWayStringBridge {
+ public Object stringToObject(String stringValue) {
+ return stringValue;
+ }
+
+ public String objectToString(Object object) {
+ return (String) object;
+ }
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/engine (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/engine)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,514 +0,0 @@
-//$Id: DocumentBuilder.java 10865 2006-11-23 23:30:01 +0100 (jeu., 23 nov. 2006) epbernard $
-package org.hibernate.search.engine;
-
-import java.io.Serializable;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.lucene.analysis.Analyzer;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.apache.lucene.index.Term;
-import org.hibernate.Hibernate;
-import org.hibernate.annotations.common.AssertionFailure;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XAnnotatedElement;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XMember;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.search.SearchException;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.annotations.Boost;
-import org.hibernate.search.annotations.ContainedIn;
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.IndexedEmbedded;
-import org.hibernate.search.annotations.Keyword;
-import org.hibernate.search.annotations.Store;
-import org.hibernate.search.annotations.Text;
-import org.hibernate.search.annotations.Unstored;
-import org.hibernate.search.backend.AddLuceneWork;
-import org.hibernate.search.backend.DeleteLuceneWork;
-import org.hibernate.search.backend.LuceneWork;
-import org.hibernate.search.backend.WorkType;
-import org.hibernate.search.bridge.BridgeFactory;
-import org.hibernate.search.bridge.FieldBridge;
-import org.hibernate.search.bridge.TwoWayFieldBridge;
-import org.hibernate.search.store.DirectoryProvider;
-import org.hibernate.search.util.BinderHelper;
-import org.hibernate.util.ReflectHelper;
-
-/**
- * Set up and provide a manager for indexes classes
- *
- * @author Gavin King
- * @author Emmanuel Bernard
- * @author Sylvain Vieujot
- * @author Richard Hallier
- */
-public class DocumentBuilder<T> {
- private static final Log log = LogFactory.getLog( DocumentBuilder.class );
-
- private final PropertiesMetadata rootPropertiesMetadata = new PropertiesMetadata();
- private final XClass beanClass;
- private final DirectoryProvider directoryProvider;
- private String idKeywordName;
- private XMember idGetter;
- private final Analyzer analyzer;
- private Float idBoost;
- public static final String CLASS_FIELDNAME = "_hibernate_class";
- private TwoWayFieldBridge idBridge;
- private Set<Class> mappedSubclasses = new HashSet<Class>();
- private ReflectionManager reflectionManager;
- private int level = 0;
- private int maxLevel = Integer.MAX_VALUE;
-
-
- public DocumentBuilder(XClass clazz, Analyzer analyzer, DirectoryProvider directory,
- ReflectionManager reflectionManager) {
- this.beanClass = clazz;
- this.analyzer = analyzer;
- this.directoryProvider = directory;
- //FIXME get rid of it when boost is stored?
- this.reflectionManager = reflectionManager;
-
- if ( clazz == null ) throw new AssertionFailure( "Unable to build a DocumemntBuilder with a null class" );
-
- rootPropertiesMetadata.boost = getBoost( clazz );
- Set<XClass> processedClasses = new HashSet<XClass>();
- processedClasses.add( clazz );
- initializeMembers(clazz, rootPropertiesMetadata, true, "", processedClasses );
- //processedClasses.remove( clazz ); for the sake of completness
-
- if ( idKeywordName == null ) {
- throw new SearchException( "No document id for: " + clazz.getName() );
- }
- }
-
- private void initializeMembers(XClass clazz, PropertiesMetadata propertiesMetadata, boolean isRoot, String prefix,
- Set<XClass> processedClasses) {
- for ( XClass currClass = clazz; currClass != null; currClass = currClass.getSuperclass() ) {
- //rejecting non properties because the object is loaded from Hibernate, so indexing a non property does not make sense
- List<XProperty> methods = currClass.getDeclaredProperties( XClass.ACCESS_PROPERTY );
- for ( XProperty method : methods ) {
- initializeMember( method, propertiesMetadata, isRoot, prefix, processedClasses );
- }
-
- List<XProperty> fields = currClass.getDeclaredProperties( XClass.ACCESS_FIELD );
- for ( XProperty field : fields ) {
- initializeMember( field, propertiesMetadata, isRoot, prefix, processedClasses );
- }
- }
- }
-
- private void initializeMember(XProperty member, PropertiesMetadata propertiesMetadata, boolean isRoot,
- String prefix, Set<XClass> processedClasses) {
- Keyword keywordAnn = member.getAnnotation( Keyword.class );
- if ( keywordAnn != null ) {
- String name = prefix + BinderHelper.getAttributeName( member, keywordAnn.name() );
- if ( isRoot && keywordAnn.id() ) {
- idKeywordName = name;
- idBoost = getBoost( member );
- FieldBridge fieldBridge = BridgeFactory.guessType( member );
- if ( fieldBridge instanceof TwoWayFieldBridge ) {
- idBridge = (TwoWayFieldBridge) fieldBridge;
- }
- else {
- throw new SearchException(
- "Bridge for document id does not implement IdFieldBridge: " + member.getName() );
- }
- setAccessible( member );
- idGetter = member;
- }
- else {
- setAccessible( member );
- propertiesMetadata.keywordGetters.add( member );
- propertiesMetadata.keywordNames.add( name );
- propertiesMetadata.keywordBridges.add( BridgeFactory.guessType( member ) );
- }
- }
-
- Unstored unstoredAnn = member.getAnnotation( Unstored.class );
- if ( unstoredAnn != null ) {
- setAccessible( member );
- propertiesMetadata.unstoredGetters.add( member );
- propertiesMetadata.unstoredNames.add( prefix + BinderHelper.getAttributeName( member, unstoredAnn.name() ) );
- propertiesMetadata.unstoredBridges.add( BridgeFactory.guessType( member ) );
- }
-
- Text textAnn = member.getAnnotation( Text.class );
- if ( textAnn != null ) {
- setAccessible( member );
- propertiesMetadata.textGetters.add( member );
- propertiesMetadata.textNames.add( prefix + BinderHelper.getAttributeName( member, textAnn.name() ) );
- propertiesMetadata.textBridges.add( BridgeFactory.guessType( member ) );
- }
-
- DocumentId documentIdAnn = member.getAnnotation( DocumentId.class );
- if ( isRoot && documentIdAnn != null ) {
- if ( idKeywordName != null ) {
- throw new AssertionFailure( "Two document id assigned: "
- + idKeywordName + " and " + BinderHelper.getAttributeName( member, documentIdAnn.name() ) );
- }
- idKeywordName = prefix + BinderHelper.getAttributeName( member, documentIdAnn.name() );
- FieldBridge fieldBridge = BridgeFactory.guessType( member );
- if ( fieldBridge instanceof TwoWayFieldBridge ) {
- idBridge = (TwoWayFieldBridge) fieldBridge;
- }
- else {
- throw new SearchException(
- "Bridge for document id does not implement IdFieldBridge: " + member.getName() );
- }
- idBoost = getBoost( member );
- setAccessible( member );
- idGetter = member;
- }
-
- org.hibernate.search.annotations.Field fieldAnn =
- member.getAnnotation( org.hibernate.search.annotations.Field.class );
- if ( fieldAnn != null ) {
- setAccessible( member );
- propertiesMetadata.fieldGetters.add( member );
- propertiesMetadata.fieldNames.add( prefix + BinderHelper.getAttributeName( member, fieldAnn.name() ) );
- propertiesMetadata.fieldStore.add( getStore( fieldAnn.store() ) );
- propertiesMetadata.fieldIndex.add( getIndex( fieldAnn.index() ) );
- propertiesMetadata.fieldBridges.add( BridgeFactory.guessType( member ) );
- }
-
- IndexedEmbedded embeddedAnn = member.getAnnotation( IndexedEmbedded.class );
- if ( embeddedAnn != null ) {
- int oldMaxLevel = maxLevel;
- maxLevel = embeddedAnn.depth() + level > maxLevel ? maxLevel : embeddedAnn.depth() + level;
- level++;
-
- if ( maxLevel == Integer.MAX_VALUE //infinite
- && processedClasses.contains( member.getClassOrElementClass() ) ) {
- throw new SearchException(
- "Circular reference. Duplicate use of "
- + member.getClassOrElementClass().getName()
- + " in root entity " + beanClass.getName()
- + "#" + buildEmbeddedPrefix( prefix, embeddedAnn, member )
- );
- }
- if (level <= maxLevel) {
- processedClasses.add( member.getClassOrElementClass() ); //push
-
- setAccessible( member );
- propertiesMetadata.embeddedGetters.add( member );
- PropertiesMetadata metadata = new PropertiesMetadata();
- propertiesMetadata.embeddedPropertiesMetadata.add(metadata);
- metadata.boost = getBoost( member );
- String localPrefix = buildEmbeddedPrefix( prefix, embeddedAnn, member );
- initializeMembers( member.getClassOrElementClass(), metadata, false, localPrefix, processedClasses);
-
- processedClasses.remove( member.getClassOrElementClass() ); //pop
- }
- else if ( log.isTraceEnabled() ) {
- String localPrefix = buildEmbeddedPrefix( prefix, embeddedAnn, member );
- log.trace( "depth reached, ignoring " + localPrefix );
- }
-
- level--;
- maxLevel = oldMaxLevel; //set back the the old max level
- }
-
- ContainedIn containedAnn = member.getAnnotation( ContainedIn.class );
- if ( containedAnn != null ) {
- setAccessible( member );
- propertiesMetadata.containedInGetters.add( member );
- }
- }
-
- private String buildEmbeddedPrefix(String prefix, IndexedEmbedded embeddedAnn, XProperty member) {
- String localPrefix = prefix;
- if ( ".".equals( embeddedAnn.prefix() ) ) {
- //default to property name
- localPrefix += member.getName() + '.';
- }
- else {
- localPrefix += embeddedAnn.prefix();
- }
- return localPrefix;
- }
-
- private Field.Store getStore(Store store) {
- switch (store) {
- case NO:
- return Field.Store.NO;
- case YES:
- return Field.Store.YES;
- case COMPRESS:
- return Field.Store.COMPRESS;
- default:
- throw new AssertionFailure( "Unexpected Store: " + store );
- }
- }
-
- private Field.Index getIndex(Index index) {
- switch (index) {
- case NO:
- return Field.Index.NO;
- case NO_NORMS:
- return Field.Index.NO_NORMS;
- case TOKENIZED:
- return Field.Index.TOKENIZED;
- case UN_TOKENIZED:
- return Field.Index.UN_TOKENIZED;
- default:
- throw new AssertionFailure( "Unexpected Index: " + index );
- }
- }
-
- private Float getBoost(XAnnotatedElement element) {
- if ( element == null ) return null;
- Boost boost = element.getAnnotation( Boost.class );
- return boost != null ?
- boost.value() :
- null;
- }
-
- private Object getMemberValue(Object bean, XMember getter) {
- Object value;
- try {
- value = getter.invoke( bean );
- }
- catch (Exception e) {
- throw new IllegalStateException( "Could not get property value", e );
- }
- return value;
- }
-
- public void addWorkToQueue(T entity, Serializable id, WorkType workType, List<LuceneWork> queue, SearchFactory searchFactory) {
- Class entityClass = Hibernate.getClass( entity );
- //TODO with the caller loop we are in a n^2: optimize it using a HashMap for work recognition
- for ( LuceneWork luceneWork : queue) {
- //whatever the actual work, we should ignore
- if ( luceneWork.getEntityClass() == entityClass
- && luceneWork.getId().equals( id ) ) {//find a way to use Type.equals(x,y)
- return;
- }
-
- }
- boolean searchForContainers = false;
- if ( workType == WorkType.ADD ) {
- Document doc = getDocument( entity, id );
- queue.add( new AddLuceneWork( id, entityClass, doc ) );
- searchForContainers = true;
- }
- else if ( workType == WorkType.DELETE ) {
- queue.add( new DeleteLuceneWork(id, entityClass) );
- }
- else if ( workType == WorkType.UPDATE ) {
- Document doc = getDocument( entity, id );
- /**
- * even with Lucene 2.1, use of indexWriter to update is not an option
- * We can only delete by term, and the index doesn't have a term that
- * uniquely identify the entry.
- * But essentially the optimization we are doing is the same Lucene is doing, the only extra cost is the
- * double file opening.
- */
- queue.add( new DeleteLuceneWork(id, entityClass) );
- queue.add( new AddLuceneWork( id, entityClass, doc ) );
- searchForContainers = true;
- }
- else {
- throw new AssertionFailure("Unknown WorkType: " + workType);
- }
-
- /**
- * When references are changed, either null or another one, we expect dirty checking to be triggered (both sides
- * have to be updated)
- * When the internal object is changed, we apply the {Add|Update}Work on containedIns
- */
- if (searchForContainers) {
- processContainedIn(entity, queue, rootPropertiesMetadata, searchFactory);
- }
- }
-
- private void processContainedIn(Object instance, List<LuceneWork> queue, PropertiesMetadata metadata, SearchFactory searchFactory) {
- for ( int i = 0; i < metadata.containedInGetters.size(); i++ ) {
- XMember member = metadata.containedInGetters.get( i );
- Object value = getMemberValue( instance, member );
- if (value == null) continue;
- Class valueClass = Hibernate.getClass( value );
- DocumentBuilder builder = searchFactory.getDocumentBuilders().get( valueClass );
- if (builder == null) continue;
- if ( member.isArray() ) {
- for ( Object arrayValue : (Object[]) value ) {
- processContainedInValue( arrayValue, member, queue, valueClass, builder, searchFactory );
- }
- }
- else if ( member.isCollection() ) {
- Collection collection;
- if ( Map.class.equals( member.getCollectionClass() ) ) {
- //hum
- collection = ( (Map) value ).values();
- }
- else {
- collection = (Collection) value;
- }
- for ( Object collectionValue : collection ) {
- processContainedInValue( collectionValue, member, queue, valueClass, builder, searchFactory );
- }
- }
- else {
- processContainedInValue( value, member, queue, valueClass, builder, searchFactory );
- }
- }
- //an embedded cannot have a useful @ContainedIn (no shared reference)
- //do not walk through them
- }
-
- private void processContainedInValue(Object value, XMember member, List<LuceneWork> queue, Class valueClass,
- DocumentBuilder builder, SearchFactory searchFactory) {
- Serializable id = (Serializable) builder.getMemberValue( value, builder.idGetter );
- builder.addWorkToQueue( value, id, WorkType.UPDATE, queue, searchFactory );
- }
-
- public Document getDocument(T instance, Serializable id) {
- Document doc = new Document();
- XClass instanceClass = reflectionManager.toXClass( instance.getClass() );
- if ( rootPropertiesMetadata.boost != null ) {
- doc.setBoost( rootPropertiesMetadata.boost );
- }
- {
- Field classField =
- new Field( CLASS_FIELDNAME, instanceClass.getName(), Field.Store.YES, Field.Index.UN_TOKENIZED );
- doc.add( classField );
- idBridge.set( idKeywordName, id, doc, Field.Store.YES, Field.Index.UN_TOKENIZED, idBoost );
- }
- buildDocumentFields( instance, doc, rootPropertiesMetadata );
- return doc;
- }
-
- private void buildDocumentFields(Object instance, Document doc, PropertiesMetadata propertiesMetadata) {
- if (instance == null) return;
-
- for ( int i = 0; i < propertiesMetadata.keywordNames.size(); i++ ) {
- XMember member = propertiesMetadata.keywordGetters.get( i );
- Object value = getMemberValue( instance, member );
- propertiesMetadata.keywordBridges.get( i ).set(
- propertiesMetadata.keywordNames.get( i ), value, doc, Field.Store.YES,
- Field.Index.UN_TOKENIZED, getBoost( member )
- );
- }
- for ( int i = 0; i < propertiesMetadata.textNames.size(); i++ ) {
- XMember member = propertiesMetadata.textGetters.get( i );
- Object value = getMemberValue( instance, member );
- propertiesMetadata.textBridges.get( i ).set(
- propertiesMetadata.textNames.get( i ), value, doc, Field.Store.YES,
- Field.Index.TOKENIZED, getBoost( member )
- );
- }
- for ( int i = 0; i < propertiesMetadata.unstoredNames.size(); i++ ) {
- XMember member = propertiesMetadata.unstoredGetters.get( i );
- Object value = getMemberValue( instance, member );
- propertiesMetadata.unstoredBridges.get( i ).set(
- propertiesMetadata.unstoredNames.get( i ), value, doc, Field.Store.NO,
- Field.Index.TOKENIZED, getBoost( member )
- );
- }
- for ( int i = 0; i < propertiesMetadata.fieldNames.size(); i++ ) {
- XMember member = propertiesMetadata.fieldGetters.get( i );
- Object value = getMemberValue( instance, member );
- propertiesMetadata.fieldBridges.get( i ).set(
- propertiesMetadata.fieldNames.get( i ), value, doc, propertiesMetadata.fieldStore.get( i ),
- propertiesMetadata.fieldIndex.get( i ), getBoost( member )
- );
- }
- for ( int i = 0; i < propertiesMetadata.embeddedGetters.size(); i++ ) {
- XMember member = propertiesMetadata.embeddedGetters.get( i );
- Object value = getMemberValue( instance, member );
- //if ( ! Hibernate.isInitialized( value ) ) continue; //this sounds like a bad idea
- //TODO handle boost at embedded level: already stored in propertiesMedatada.boost
- buildDocumentFields( value, doc, propertiesMetadata.embeddedPropertiesMetadata.get( i ) );
- }
- }
-
- public Term getTerm(Serializable id) {
- return new Term( idKeywordName, idBridge.objectToString( id ) );
- }
-
- public DirectoryProvider getDirectoryProvider() {
- return directoryProvider;
- }
-
- public Analyzer getAnalyzer() {
- return analyzer;
- }
-
- private static void setAccessible(XMember member) {
- if ( !Modifier.isPublic( member.getModifiers() ) ) {
- member.setAccessible( true );
- }
- }
-
- public TwoWayFieldBridge getIdBridge() {
- return idBridge;
- }
-
- public String getIdKeywordName() {
- return idKeywordName;
- }
-
- public static Class getDocumentClass(Document document) {
- String className = document.get( DocumentBuilder.CLASS_FIELDNAME );
- try {
- return ReflectHelper.classForName( className );
- }
- catch (ClassNotFoundException e) {
- throw new SearchException( "Unable to load indexed class: " + className, e );
- }
- }
-
- public static Serializable getDocumentId(SearchFactory searchFactory, Class clazz, Document document) {
- DocumentBuilder builder = searchFactory.getDocumentBuilders().get( clazz );
- if ( builder == null ) throw new SearchException( "No Lucene configuration set up for: " + clazz.getName() );
- return (Serializable) builder.getIdBridge().get( builder.getIdKeywordName(), document );
- }
-
- public void postInitialize(Set<Class> indexedClasses) {
- //this method does not requires synchronization
- Class plainClass = reflectionManager.toClass( beanClass );
- Set<Class> tempMappedSubclasses = new HashSet<Class>();
- //together with the caller this creates a o(2), but I think it's still faster than create the up hierarchy for each class
- for ( Class currentClass : indexedClasses ) {
- if ( plainClass.isAssignableFrom( currentClass ) ) tempMappedSubclasses.add( currentClass );
- }
- mappedSubclasses = Collections.unmodifiableSet( tempMappedSubclasses );
- }
-
-
- public Set<Class> getMappedSubclasses() {
- return mappedSubclasses;
- }
-
- private static class PropertiesMetadata {
- public Float boost = null;
- public final List<XMember> keywordGetters = new ArrayList<XMember>();
- public final List<String> keywordNames = new ArrayList<String>();
- public final List<FieldBridge> keywordBridges = new ArrayList<FieldBridge>();
- public final List<XMember> unstoredGetters = new ArrayList<XMember>();
- public final List<String> unstoredNames = new ArrayList<String>();
- public final List<FieldBridge> unstoredBridges = new ArrayList<FieldBridge>();
- public final List<XMember> textGetters = new ArrayList<XMember>();
- public final List<String> textNames = new ArrayList<String>();
- public final List<FieldBridge> textBridges = new ArrayList<FieldBridge>();
- public final List<String> fieldNames = new ArrayList<String>();
- public final List<XMember> fieldGetters = new ArrayList<XMember>();
- public final List<FieldBridge> fieldBridges = new ArrayList<FieldBridge>();
- public final List<Field.Store> fieldStore = new ArrayList<Field.Store>();
- public final List<Field.Index> fieldIndex = new ArrayList<Field.Index>();
- public final List<XMember> embeddedGetters = new ArrayList<XMember>();
- public final List<PropertiesMetadata> embeddedPropertiesMetadata = new ArrayList<PropertiesMetadata>();
- public final List<XMember> containedInGetters = new ArrayList<XMember>();
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/engine/DocumentBuilder.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,514 @@
+//$Id: DocumentBuilder.java 10865 2006-11-23 23:30:01 +0100 (jeu., 23 nov. 2006) epbernard $
+package org.hibernate.search.engine;
+
+import java.io.Serializable;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.lucene.analysis.Analyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.index.Term;
+import org.hibernate.Hibernate;
+import org.hibernate.annotations.common.AssertionFailure;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XAnnotatedElement;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XMember;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.search.SearchException;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.annotations.Boost;
+import org.hibernate.search.annotations.ContainedIn;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.IndexedEmbedded;
+import org.hibernate.search.annotations.Keyword;
+import org.hibernate.search.annotations.Store;
+import org.hibernate.search.annotations.Text;
+import org.hibernate.search.annotations.Unstored;
+import org.hibernate.search.backend.AddLuceneWork;
+import org.hibernate.search.backend.DeleteLuceneWork;
+import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.backend.WorkType;
+import org.hibernate.search.bridge.BridgeFactory;
+import org.hibernate.search.bridge.FieldBridge;
+import org.hibernate.search.bridge.TwoWayFieldBridge;
+import org.hibernate.search.store.DirectoryProvider;
+import org.hibernate.search.util.BinderHelper;
+import org.hibernate.util.ReflectHelper;
+
+/**
+ * Set up and provide a manager for indexes classes
+ *
+ * @author Gavin King
+ * @author Emmanuel Bernard
+ * @author Sylvain Vieujot
+ * @author Richard Hallier
+ */
+public class DocumentBuilder<T> {
+ private static final Log log = LogFactory.getLog( DocumentBuilder.class );
+
+ private final PropertiesMetadata rootPropertiesMetadata = new PropertiesMetadata();
+ private final XClass beanClass;
+ private final DirectoryProvider directoryProvider;
+ private String idKeywordName;
+ private XMember idGetter;
+ private final Analyzer analyzer;
+ private Float idBoost;
+ public static final String CLASS_FIELDNAME = "_hibernate_class";
+ private TwoWayFieldBridge idBridge;
+ private Set<Class> mappedSubclasses = new HashSet<Class>();
+ private ReflectionManager reflectionManager;
+ private int level = 0;
+ private int maxLevel = Integer.MAX_VALUE;
+
+
+ public DocumentBuilder(XClass clazz, Analyzer analyzer, DirectoryProvider directory,
+ ReflectionManager reflectionManager) {
+ this.beanClass = clazz;
+ this.analyzer = analyzer;
+ this.directoryProvider = directory;
+ //FIXME get rid of it when boost is stored?
+ this.reflectionManager = reflectionManager;
+
+ if ( clazz == null ) throw new AssertionFailure( "Unable to build a DocumemntBuilder with a null class" );
+
+ rootPropertiesMetadata.boost = getBoost( clazz );
+ Set<XClass> processedClasses = new HashSet<XClass>();
+ processedClasses.add( clazz );
+ initializeMembers(clazz, rootPropertiesMetadata, true, "", processedClasses );
+ //processedClasses.remove( clazz ); for the sake of completness
+
+ if ( idKeywordName == null ) {
+ throw new SearchException( "No document id for: " + clazz.getName() );
+ }
+ }
+
+ private void initializeMembers(XClass clazz, PropertiesMetadata propertiesMetadata, boolean isRoot, String prefix,
+ Set<XClass> processedClasses) {
+ for ( XClass currClass = clazz; currClass != null; currClass = currClass.getSuperclass() ) {
+ //rejecting non properties because the object is loaded from Hibernate, so indexing a non property does not make sense
+ List<XProperty> methods = currClass.getDeclaredProperties( XClass.ACCESS_PROPERTY );
+ for ( XProperty method : methods ) {
+ initializeMember( method, propertiesMetadata, isRoot, prefix, processedClasses );
+ }
+
+ List<XProperty> fields = currClass.getDeclaredProperties( XClass.ACCESS_FIELD );
+ for ( XProperty field : fields ) {
+ initializeMember( field, propertiesMetadata, isRoot, prefix, processedClasses );
+ }
+ }
+ }
+
+ private void initializeMember(XProperty member, PropertiesMetadata propertiesMetadata, boolean isRoot,
+ String prefix, Set<XClass> processedClasses) {
+ Keyword keywordAnn = member.getAnnotation( Keyword.class );
+ if ( keywordAnn != null ) {
+ String name = prefix + BinderHelper.getAttributeName( member, keywordAnn.name() );
+ if ( isRoot && keywordAnn.id() ) {
+ idKeywordName = name;
+ idBoost = getBoost( member );
+ FieldBridge fieldBridge = BridgeFactory.guessType( member );
+ if ( fieldBridge instanceof TwoWayFieldBridge ) {
+ idBridge = (TwoWayFieldBridge) fieldBridge;
+ }
+ else {
+ throw new SearchException(
+ "Bridge for document id does not implement IdFieldBridge: " + member.getName() );
+ }
+ setAccessible( member );
+ idGetter = member;
+ }
+ else {
+ setAccessible( member );
+ propertiesMetadata.keywordGetters.add( member );
+ propertiesMetadata.keywordNames.add( name );
+ propertiesMetadata.keywordBridges.add( BridgeFactory.guessType( member ) );
+ }
+ }
+
+ Unstored unstoredAnn = member.getAnnotation( Unstored.class );
+ if ( unstoredAnn != null ) {
+ setAccessible( member );
+ propertiesMetadata.unstoredGetters.add( member );
+ propertiesMetadata.unstoredNames.add( prefix + BinderHelper.getAttributeName( member, unstoredAnn.name() ) );
+ propertiesMetadata.unstoredBridges.add( BridgeFactory.guessType( member ) );
+ }
+
+ Text textAnn = member.getAnnotation( Text.class );
+ if ( textAnn != null ) {
+ setAccessible( member );
+ propertiesMetadata.textGetters.add( member );
+ propertiesMetadata.textNames.add( prefix + BinderHelper.getAttributeName( member, textAnn.name() ) );
+ propertiesMetadata.textBridges.add( BridgeFactory.guessType( member ) );
+ }
+
+ DocumentId documentIdAnn = member.getAnnotation( DocumentId.class );
+ if ( isRoot && documentIdAnn != null ) {
+ if ( idKeywordName != null ) {
+ throw new AssertionFailure( "Two document id assigned: "
+ + idKeywordName + " and " + BinderHelper.getAttributeName( member, documentIdAnn.name() ) );
+ }
+ idKeywordName = prefix + BinderHelper.getAttributeName( member, documentIdAnn.name() );
+ FieldBridge fieldBridge = BridgeFactory.guessType( member );
+ if ( fieldBridge instanceof TwoWayFieldBridge ) {
+ idBridge = (TwoWayFieldBridge) fieldBridge;
+ }
+ else {
+ throw new SearchException(
+ "Bridge for document id does not implement IdFieldBridge: " + member.getName() );
+ }
+ idBoost = getBoost( member );
+ setAccessible( member );
+ idGetter = member;
+ }
+
+ org.hibernate.search.annotations.Field fieldAnn =
+ member.getAnnotation( org.hibernate.search.annotations.Field.class );
+ if ( fieldAnn != null ) {
+ setAccessible( member );
+ propertiesMetadata.fieldGetters.add( member );
+ propertiesMetadata.fieldNames.add( prefix + BinderHelper.getAttributeName( member, fieldAnn.name() ) );
+ propertiesMetadata.fieldStore.add( getStore( fieldAnn.store() ) );
+ propertiesMetadata.fieldIndex.add( getIndex( fieldAnn.index() ) );
+ propertiesMetadata.fieldBridges.add( BridgeFactory.guessType( member ) );
+ }
+
+ IndexedEmbedded embeddedAnn = member.getAnnotation( IndexedEmbedded.class );
+ if ( embeddedAnn != null ) {
+ int oldMaxLevel = maxLevel;
+ maxLevel = embeddedAnn.depth() + level > maxLevel ? maxLevel : embeddedAnn.depth() + level;
+ level++;
+
+ if ( maxLevel == Integer.MAX_VALUE //infinite
+ && processedClasses.contains( member.getClassOrElementClass() ) ) {
+ throw new SearchException(
+ "Circular reference. Duplicate use of "
+ + member.getClassOrElementClass().getName()
+ + " in root entity " + beanClass.getName()
+ + "#" + buildEmbeddedPrefix( prefix, embeddedAnn, member )
+ );
+ }
+ if (level <= maxLevel) {
+ processedClasses.add( member.getClassOrElementClass() ); //push
+
+ setAccessible( member );
+ propertiesMetadata.embeddedGetters.add( member );
+ PropertiesMetadata metadata = new PropertiesMetadata();
+ propertiesMetadata.embeddedPropertiesMetadata.add(metadata);
+ metadata.boost = getBoost( member );
+ String localPrefix = buildEmbeddedPrefix( prefix, embeddedAnn, member );
+ initializeMembers( member.getClassOrElementClass(), metadata, false, localPrefix, processedClasses);
+
+ processedClasses.remove( member.getClassOrElementClass() ); //pop
+ }
+ else if ( log.isTraceEnabled() ) {
+ String localPrefix = buildEmbeddedPrefix( prefix, embeddedAnn, member );
+ log.trace( "depth reached, ignoring " + localPrefix );
+ }
+
+ level--;
+ maxLevel = oldMaxLevel; //set back the the old max level
+ }
+
+ ContainedIn containedAnn = member.getAnnotation( ContainedIn.class );
+ if ( containedAnn != null ) {
+ setAccessible( member );
+ propertiesMetadata.containedInGetters.add( member );
+ }
+ }
+
+ private String buildEmbeddedPrefix(String prefix, IndexedEmbedded embeddedAnn, XProperty member) {
+ String localPrefix = prefix;
+ if ( ".".equals( embeddedAnn.prefix() ) ) {
+ //default to property name
+ localPrefix += member.getName() + '.';
+ }
+ else {
+ localPrefix += embeddedAnn.prefix();
+ }
+ return localPrefix;
+ }
+
+ private Field.Store getStore(Store store) {
+ switch (store) {
+ case NO:
+ return Field.Store.NO;
+ case YES:
+ return Field.Store.YES;
+ case COMPRESS:
+ return Field.Store.COMPRESS;
+ default:
+ throw new AssertionFailure( "Unexpected Store: " + store );
+ }
+ }
+
+ private Field.Index getIndex(Index index) {
+ switch (index) {
+ case NO:
+ return Field.Index.NO;
+ case NO_NORMS:
+ return Field.Index.NO_NORMS;
+ case TOKENIZED:
+ return Field.Index.TOKENIZED;
+ case UN_TOKENIZED:
+ return Field.Index.UN_TOKENIZED;
+ default:
+ throw new AssertionFailure( "Unexpected Index: " + index );
+ }
+ }
+
+ private Float getBoost(XAnnotatedElement element) {
+ if ( element == null ) return null;
+ Boost boost = element.getAnnotation( Boost.class );
+ return boost != null ?
+ boost.value() :
+ null;
+ }
+
+ private Object getMemberValue(Object bean, XMember getter) {
+ Object value;
+ try {
+ value = getter.invoke( bean );
+ }
+ catch (Exception e) {
+ throw new IllegalStateException( "Could not get property value", e );
+ }
+ return value;
+ }
+
+ public void addWorkToQueue(T entity, Serializable id, WorkType workType, List<LuceneWork> queue, SearchFactory searchFactory) {
+ Class entityClass = Hibernate.getClass( entity );
+ //TODO with the caller loop we are in a n^2: optimize it using a HashMap for work recognition
+ for ( LuceneWork luceneWork : queue) {
+ //whatever the actual work, we should ignore
+ if ( luceneWork.getEntityClass() == entityClass
+ && luceneWork.getId().equals( id ) ) {//find a way to use Type.equals(x,y)
+ return;
+ }
+
+ }
+ boolean searchForContainers = false;
+ if ( workType == WorkType.ADD ) {
+ Document doc = getDocument( entity, id );
+ queue.add( new AddLuceneWork( id, entityClass, doc ) );
+ searchForContainers = true;
+ }
+ else if ( workType == WorkType.DELETE ) {
+ queue.add( new DeleteLuceneWork(id, entityClass) );
+ }
+ else if ( workType == WorkType.UPDATE ) {
+ Document doc = getDocument( entity, id );
+ /**
+ * even with Lucene 2.1, use of indexWriter to update is not an option
+ * We can only delete by term, and the index doesn't have a term that
+ * uniquely identify the entry.
+ * But essentially the optimization we are doing is the same Lucene is doing, the only extra cost is the
+ * double file opening.
+ */
+ queue.add( new DeleteLuceneWork(id, entityClass) );
+ queue.add( new AddLuceneWork( id, entityClass, doc ) );
+ searchForContainers = true;
+ }
+ else {
+ throw new AssertionFailure("Unknown WorkType: " + workType);
+ }
+
+ /**
+ * When references are changed, either null or another one, we expect dirty checking to be triggered (both sides
+ * have to be updated)
+ * When the internal object is changed, we apply the {Add|Update}Work on containedIns
+ */
+ if (searchForContainers) {
+ processContainedIn(entity, queue, rootPropertiesMetadata, searchFactory);
+ }
+ }
+
+ private void processContainedIn(Object instance, List<LuceneWork> queue, PropertiesMetadata metadata, SearchFactory searchFactory) {
+ for ( int i = 0; i < metadata.containedInGetters.size(); i++ ) {
+ XMember member = metadata.containedInGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ if (value == null) continue;
+ Class valueClass = Hibernate.getClass( value );
+ DocumentBuilder builder = searchFactory.getDocumentBuilders().get( valueClass );
+ if (builder == null) continue;
+ if ( member.isArray() ) {
+ for ( Object arrayValue : (Object[]) value ) {
+ processContainedInValue( arrayValue, member, queue, valueClass, builder, searchFactory );
+ }
+ }
+ else if ( member.isCollection() ) {
+ Collection collection;
+ if ( Map.class.equals( member.getCollectionClass() ) ) {
+ //hum
+ collection = ( (Map) value ).values();
+ }
+ else {
+ collection = (Collection) value;
+ }
+ for ( Object collectionValue : collection ) {
+ processContainedInValue( collectionValue, member, queue, valueClass, builder, searchFactory );
+ }
+ }
+ else {
+ processContainedInValue( value, member, queue, valueClass, builder, searchFactory );
+ }
+ }
+ //an embedded cannot have a useful @ContainedIn (no shared reference)
+ //do not walk through them
+ }
+
+ private void processContainedInValue(Object value, XMember member, List<LuceneWork> queue, Class valueClass,
+ DocumentBuilder builder, SearchFactory searchFactory) {
+ Serializable id = (Serializable) builder.getMemberValue( value, builder.idGetter );
+ builder.addWorkToQueue( value, id, WorkType.UPDATE, queue, searchFactory );
+ }
+
+ public Document getDocument(T instance, Serializable id) {
+ Document doc = new Document();
+ XClass instanceClass = reflectionManager.toXClass( instance.getClass() );
+ if ( rootPropertiesMetadata.boost != null ) {
+ doc.setBoost( rootPropertiesMetadata.boost );
+ }
+ {
+ Field classField =
+ new Field( CLASS_FIELDNAME, instanceClass.getName(), Field.Store.YES, Field.Index.UN_TOKENIZED );
+ doc.add( classField );
+ idBridge.set( idKeywordName, id, doc, Field.Store.YES, Field.Index.UN_TOKENIZED, idBoost );
+ }
+ buildDocumentFields( instance, doc, rootPropertiesMetadata );
+ return doc;
+ }
+
+ private void buildDocumentFields(Object instance, Document doc, PropertiesMetadata propertiesMetadata) {
+ if (instance == null) return;
+
+ for ( int i = 0; i < propertiesMetadata.keywordNames.size(); i++ ) {
+ XMember member = propertiesMetadata.keywordGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ propertiesMetadata.keywordBridges.get( i ).set(
+ propertiesMetadata.keywordNames.get( i ), value, doc, Field.Store.YES,
+ Field.Index.UN_TOKENIZED, getBoost( member )
+ );
+ }
+ for ( int i = 0; i < propertiesMetadata.textNames.size(); i++ ) {
+ XMember member = propertiesMetadata.textGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ propertiesMetadata.textBridges.get( i ).set(
+ propertiesMetadata.textNames.get( i ), value, doc, Field.Store.YES,
+ Field.Index.TOKENIZED, getBoost( member )
+ );
+ }
+ for ( int i = 0; i < propertiesMetadata.unstoredNames.size(); i++ ) {
+ XMember member = propertiesMetadata.unstoredGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ propertiesMetadata.unstoredBridges.get( i ).set(
+ propertiesMetadata.unstoredNames.get( i ), value, doc, Field.Store.NO,
+ Field.Index.TOKENIZED, getBoost( member )
+ );
+ }
+ for ( int i = 0; i < propertiesMetadata.fieldNames.size(); i++ ) {
+ XMember member = propertiesMetadata.fieldGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ propertiesMetadata.fieldBridges.get( i ).set(
+ propertiesMetadata.fieldNames.get( i ), value, doc, propertiesMetadata.fieldStore.get( i ),
+ propertiesMetadata.fieldIndex.get( i ), getBoost( member )
+ );
+ }
+ for ( int i = 0; i < propertiesMetadata.embeddedGetters.size(); i++ ) {
+ XMember member = propertiesMetadata.embeddedGetters.get( i );
+ Object value = getMemberValue( instance, member );
+ //if ( ! Hibernate.isInitialized( value ) ) continue; //this sounds like a bad idea
+ //TODO handle boost at embedded level: already stored in propertiesMedatada.boost
+ buildDocumentFields( value, doc, propertiesMetadata.embeddedPropertiesMetadata.get( i ) );
+ }
+ }
+
+ public Term getTerm(Serializable id) {
+ return new Term( idKeywordName, idBridge.objectToString( id ) );
+ }
+
+ public DirectoryProvider getDirectoryProvider() {
+ return directoryProvider;
+ }
+
+ public Analyzer getAnalyzer() {
+ return analyzer;
+ }
+
+ private static void setAccessible(XMember member) {
+ if ( !Modifier.isPublic( member.getModifiers() ) ) {
+ member.setAccessible( true );
+ }
+ }
+
+ public TwoWayFieldBridge getIdBridge() {
+ return idBridge;
+ }
+
+ public String getIdKeywordName() {
+ return idKeywordName;
+ }
+
+ public static Class getDocumentClass(Document document) {
+ String className = document.get( DocumentBuilder.CLASS_FIELDNAME );
+ try {
+ return ReflectHelper.classForName( className );
+ }
+ catch (ClassNotFoundException e) {
+ throw new SearchException( "Unable to load indexed class: " + className, e );
+ }
+ }
+
+ public static Serializable getDocumentId(SearchFactory searchFactory, Class clazz, Document document) {
+ DocumentBuilder builder = searchFactory.getDocumentBuilders().get( clazz );
+ if ( builder == null ) throw new SearchException( "No Lucene configuration set up for: " + clazz.getName() );
+ return (Serializable) builder.getIdBridge().get( builder.getIdKeywordName(), document );
+ }
+
+ public void postInitialize(Set<Class> indexedClasses) {
+ //this method does not requires synchronization
+ Class plainClass = reflectionManager.toClass( beanClass );
+ Set<Class> tempMappedSubclasses = new HashSet<Class>();
+ //together with the caller this creates a o(2), but I think it's still faster than create the up hierarchy for each class
+ for ( Class currentClass : indexedClasses ) {
+ if ( plainClass.isAssignableFrom( currentClass ) ) tempMappedSubclasses.add( currentClass );
+ }
+ mappedSubclasses = Collections.unmodifiableSet( tempMappedSubclasses );
+ }
+
+
+ public Set<Class> getMappedSubclasses() {
+ return mappedSubclasses;
+ }
+
+ private static class PropertiesMetadata {
+ public Float boost = null;
+ public final List<XMember> keywordGetters = new ArrayList<XMember>();
+ public final List<String> keywordNames = new ArrayList<String>();
+ public final List<FieldBridge> keywordBridges = new ArrayList<FieldBridge>();
+ public final List<XMember> unstoredGetters = new ArrayList<XMember>();
+ public final List<String> unstoredNames = new ArrayList<String>();
+ public final List<FieldBridge> unstoredBridges = new ArrayList<FieldBridge>();
+ public final List<XMember> textGetters = new ArrayList<XMember>();
+ public final List<String> textNames = new ArrayList<String>();
+ public final List<FieldBridge> textBridges = new ArrayList<FieldBridge>();
+ public final List<String> fieldNames = new ArrayList<String>();
+ public final List<XMember> fieldGetters = new ArrayList<XMember>();
+ public final List<FieldBridge> fieldBridges = new ArrayList<FieldBridge>();
+ public final List<Field.Store> fieldStore = new ArrayList<Field.Store>();
+ public final List<Field.Index> fieldIndex = new ArrayList<Field.Index>();
+ public final List<XMember> embeddedGetters = new ArrayList<XMember>();
+ public final List<PropertiesMetadata> embeddedPropertiesMetadata = new ArrayList<PropertiesMetadata>();
+ public final List<XMember> containedInGetters = new ArrayList<XMember>();
+ }
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/event (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/event)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,81 +0,0 @@
-//$Id: FullTextIndexEventListener.java 10865 2006-11-23 23:30:01 +0100 (jeu., 23 nov. 2006) epbernard $
-package org.hibernate.search.event;
-
-import java.io.Serializable;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.event.AbstractEvent;
-import org.hibernate.event.Initializable;
-import org.hibernate.event.PostDeleteEvent;
-import org.hibernate.event.PostDeleteEventListener;
-import org.hibernate.event.PostInsertEvent;
-import org.hibernate.event.PostInsertEventListener;
-import org.hibernate.event.PostUpdateEvent;
-import org.hibernate.event.PostUpdateEventListener;
-import org.hibernate.search.backend.WorkType;
-import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.SearchFactory;
-
-/**
- * This listener supports setting a parent directory for all generated index files.
- * It also supports setting the analyzer class to be used.
- *
- * @author Gavin King
- * @author Emmanuel Bernard
- * @author Mattias Arbin
- */
-//TODO work on sharing the same indexWriters and readers across a single post operation...
-//TODO implement and use a LockableDirectoryProvider that wraps a DP to handle the lock inside the LDP
-public class FullTextIndexEventListener implements PostDeleteEventListener, PostInsertEventListener,
- PostUpdateEventListener, Initializable {
-
- private static final Log log = LogFactory.getLog( FullTextIndexEventListener.class );
- private boolean used;
-
- private SearchFactory searchFactory;
-
- public void initialize(Configuration cfg) {
- searchFactory = SearchFactory.getSearchFactory( cfg );
- used = searchFactory.getDocumentBuilders().size() != 0;
- }
-
- public SearchFactory getSearchFactory() {
- return searchFactory;
- }
-
- public void onPostDelete(PostDeleteEvent event) {
- if ( used && searchFactory.getDocumentBuilders().containsKey( event.getEntity().getClass() ) ) {
- processWork( event.getEntity(), event.getId(), WorkType.DELETE, event );
- }
- }
-
- public void onPostInsert(PostInsertEvent event) {
- if (used) {
- final Object entity = event.getEntity();
- DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entity.getClass() );
- //not strictly necessary but a smal optimization
- if ( builder != null ) {
- Serializable id = event.getId();
- processWork( entity, id, WorkType.ADD, event );
- }
- }
- }
-
- public void onPostUpdate(PostUpdateEvent event) {
- if (used) {
- final Object entity = event.getEntity();
- //not strictly necessary but a smal optimization
- DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entity.getClass() );
- if ( builder != null ) {
- Serializable id = event.getId();
- processWork( entity, id, WorkType.UPDATE, event );
- }
- }
- }
-
- private void processWork(Object entity, Serializable id, WorkType workType, AbstractEvent event) {
- searchFactory.getWorker().performWork( entity, id, workType, event.getSession() );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/event/FullTextIndexEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,81 @@
+//$Id: FullTextIndexEventListener.java 10865 2006-11-23 23:30:01 +0100 (jeu., 23 nov. 2006) epbernard $
+package org.hibernate.search.event;
+
+import java.io.Serializable;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.event.AbstractEvent;
+import org.hibernate.event.Initializable;
+import org.hibernate.event.PostDeleteEvent;
+import org.hibernate.event.PostDeleteEventListener;
+import org.hibernate.event.PostInsertEvent;
+import org.hibernate.event.PostInsertEventListener;
+import org.hibernate.event.PostUpdateEvent;
+import org.hibernate.event.PostUpdateEventListener;
+import org.hibernate.search.backend.WorkType;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.SearchFactory;
+
+/**
+ * This listener supports setting a parent directory for all generated index files.
+ * It also supports setting the analyzer class to be used.
+ *
+ * @author Gavin King
+ * @author Emmanuel Bernard
+ * @author Mattias Arbin
+ */
+//TODO work on sharing the same indexWriters and readers across a single post operation...
+//TODO implement and use a LockableDirectoryProvider that wraps a DP to handle the lock inside the LDP
+public class FullTextIndexEventListener implements PostDeleteEventListener, PostInsertEventListener,
+ PostUpdateEventListener, Initializable {
+
+ private static final Log log = LogFactory.getLog( FullTextIndexEventListener.class );
+ private boolean used;
+
+ private SearchFactory searchFactory;
+
+ public void initialize(Configuration cfg) {
+ searchFactory = SearchFactory.getSearchFactory( cfg );
+ used = searchFactory.getDocumentBuilders().size() != 0;
+ }
+
+ public SearchFactory getSearchFactory() {
+ return searchFactory;
+ }
+
+ public void onPostDelete(PostDeleteEvent event) {
+ if ( used && searchFactory.getDocumentBuilders().containsKey( event.getEntity().getClass() ) ) {
+ processWork( event.getEntity(), event.getId(), WorkType.DELETE, event );
+ }
+ }
+
+ public void onPostInsert(PostInsertEvent event) {
+ if (used) {
+ final Object entity = event.getEntity();
+ DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entity.getClass() );
+ //not strictly necessary but a smal optimization
+ if ( builder != null ) {
+ Serializable id = event.getId();
+ processWork( entity, id, WorkType.ADD, event );
+ }
+ }
+ }
+
+ public void onPostUpdate(PostUpdateEvent event) {
+ if (used) {
+ final Object entity = event.getEntity();
+ //not strictly necessary but a smal optimization
+ DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( entity.getClass() );
+ if ( builder != null ) {
+ Serializable id = event.getId();
+ processWork( entity, id, WorkType.UPDATE, event );
+ }
+ }
+ }
+
+ private void processWork(Object entity, Serializable id, WorkType workType, AbstractEvent event) {
+ searchFactory.getWorker().performWork( entity, id, workType, event.getSession() );
+ }
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/impl (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/impl)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,631 +0,0 @@
-//$Id: $
-package org.hibernate.search.impl;
-
-import java.io.Serializable;
-import java.sql.Connection;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.hibernate.CacheMode;
-import org.hibernate.Criteria;
-import org.hibernate.EntityMode;
-import org.hibernate.Filter;
-import org.hibernate.FlushMode;
-import org.hibernate.Hibernate;
-import org.hibernate.HibernateException;
-import org.hibernate.Interceptor;
-import org.hibernate.LockMode;
-import org.hibernate.Query;
-import org.hibernate.ReplicationMode;
-import org.hibernate.SQLQuery;
-import org.hibernate.ScrollMode;
-import org.hibernate.ScrollableResults;
-import org.hibernate.classic.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.Transaction;
-import org.hibernate.collection.PersistentCollection;
-import org.hibernate.engine.EntityKey;
-import org.hibernate.engine.PersistenceContext;
-import org.hibernate.engine.QueryParameters;
-import org.hibernate.engine.SessionFactoryImplementor;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.engine.query.ParameterMetadata;
-import org.hibernate.engine.query.sql.NativeSQLQuerySpecification;
-import org.hibernate.event.EventListeners;
-import org.hibernate.event.EventSource;
-import org.hibernate.impl.CriteriaImpl;
-import org.hibernate.jdbc.Batcher;
-import org.hibernate.jdbc.JDBCContext;
-import org.hibernate.loader.custom.CustomQuery;
-import org.hibernate.persister.entity.EntityPersister;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.backend.WorkType;
-import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.query.FullTextQueryImpl;
-import org.hibernate.search.util.ContextHelper;
-import org.hibernate.stat.SessionStatistics;
-import org.hibernate.type.Type;
-
-/**
- * Lucene Full text search aware session
- *
- * @author Emmanuel Bernard
- */
-public class FullTextSessionImpl implements FullTextSession, SessionImplementor {
- private final Session session;
- private final EventSource eventSource;
- private final SessionImplementor sessionImplementor;
-
- public FullTextSessionImpl(org.hibernate.Session session) {
- this.session = (Session) session;
- this.eventSource = (EventSource) session;
- this.sessionImplementor = (SessionImplementor) session;
- }
-
- /**
- * Execute a Lucene query and retrieve managed objects of type entities (or their indexed subclasses)
- * If entities is empty, include all indexed entities
- *
- * @param entities must be immutable for the lifetime of the query object
- */
- public Query createFullTextQuery(org.apache.lucene.search.Query luceneQuery, Class... entities) {
- return new FullTextQueryImpl( luceneQuery, entities, sessionImplementor, new ParameterMetadata(null, null) );
- }
-
- /**
- * (re)index an entity.
- * Non indexable entities are ignored
- * The entity must be associated with the session
- *
- * @param entity must not be null
- */
- public void index(Object entity) {
- if (entity == null) return;
- Class clazz = Hibernate.getClass( entity );
- //TODO cache that at the FTSession level
- SearchFactory searchFactory = ContextHelper.getSearchFactory( session );
- //not strictly necessary but a small optimization
- DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( clazz );
- if ( builder != null ) {
- Serializable id = session.getIdentifier( entity );
- searchFactory.getWorker().performWork( entity, id, WorkType.UPDATE, eventSource );
- }
- //TODO
- //need to add elements in a queue kept at the Session level
- //the queue will be processed by a Lucene(Auto)FlushEventListener
- //note that we could keep this queue somewhere in the event listener in the mean time but that requires
- // a synchronized hashmap holding this queue on a per session basis plus some session house keeping (yuk)
- //an other solution would be to subclass SessionImpl instead of having this LuceneSession delecation model
- // this is an open discussion
- }
-
- public Query createSQLQuery(String sql, String returnAlias, Class returnClass) {
- return session.createSQLQuery( sql, returnAlias, returnClass );
- }
-
- public Query createSQLQuery(String sql, String[] returnAliases, Class[] returnClasses) {
- return session.createSQLQuery( sql, returnAliases, returnClasses );
- }
-
- public int delete(String query) throws HibernateException {
- return session.delete( query );
- }
-
- public int delete(String query, Object value, Type type) throws HibernateException {
- return session.delete( query, value, type );
- }
-
- public int delete(String query, Object[] values, Type[] types) throws HibernateException {
- return session.delete( query, values, types );
- }
-
- public Collection filter(Object collection, String filter) throws HibernateException {
- return session.filter( collection, filter );
- }
-
- public Collection filter(Object collection, String filter, Object value, Type type) throws HibernateException {
- return session.filter( collection, filter, value, type );
- }
-
- public Collection filter(Object collection, String filter, Object[] values, Type[] types) throws HibernateException {
- return session.filter( collection, filter, values, types );
- }
-
- public List find(String query) throws HibernateException {
- return session.find( query );
- }
-
- public List find(String query, Object value, Type type) throws HibernateException {
- return session.find( query, value, type );
- }
-
- public List find(String query, Object[] values, Type[] types) throws HibernateException {
- return session.find( query, values, types );
- }
-
- public Iterator iterate(String query) throws HibernateException {
- return session.iterate( query );
- }
-
- public Iterator iterate(String query, Object value, Type type) throws HibernateException {
- return session.iterate( query, value, type );
- }
-
- public Iterator iterate(String query, Object[] values, Type[] types) throws HibernateException {
- return session.iterate( query, values, types );
- }
-
- public void save(String entityName, Object object, Serializable id) throws HibernateException {
- session.save( entityName, object, id );
- }
-
- public void save(Object object, Serializable id) throws HibernateException {
- session.save( object, id );
- }
-
- public Object saveOrUpdateCopy(String entityName, Object object) throws HibernateException {
- return session.saveOrUpdateCopy( entityName, object );
- }
-
- public Object saveOrUpdateCopy(String entityName, Object object, Serializable id) throws HibernateException {
- return session.saveOrUpdateCopy( entityName, object, id );
- }
-
- public Object saveOrUpdateCopy(Object object) throws HibernateException {
- return session.saveOrUpdateCopy( object );
- }
-
- public Object saveOrUpdateCopy(Object object, Serializable id) throws HibernateException {
- return session.saveOrUpdateCopy( object, id );
- }
-
- public void update(String entityName, Object object, Serializable id) throws HibernateException {
- session.update( entityName, object, id );
- }
-
- public void update(Object object, Serializable id) throws HibernateException {
- session.update( object, id );
- }
-
- public Transaction beginTransaction() throws HibernateException {
- return session.beginTransaction();
- }
-
- public void cancelQuery() throws HibernateException {
- session.cancelQuery();
- }
-
- public void clear() {
- //FIXME should session clear work with the lucene queue
- session.clear();
- }
-
- public Connection close() throws HibernateException {
- return session.close();
- }
-
- public Connection connection() throws HibernateException {
- return session.connection();
- }
-
- public boolean contains(Object object) {
- return session.contains( object );
- }
-
- public Criteria createCriteria(String entityName) {
- return session.createCriteria( entityName );
- }
-
- public Criteria createCriteria(String entityName, String alias) {
- return session.createCriteria( entityName, alias );
- }
-
- public Criteria createCriteria(Class persistentClass) {
- return session.createCriteria( persistentClass );
- }
-
- public Criteria createCriteria(Class persistentClass, String alias) {
- return session.createCriteria( persistentClass, alias );
- }
-
- public Query createFilter(Object collection, String queryString) throws HibernateException {
- return session.createFilter( collection, queryString );
- }
-
- public Query createQuery(String queryString) throws HibernateException {
- return session.createQuery( queryString );
- }
-
- public SQLQuery createSQLQuery(String queryString) throws HibernateException {
- return session.createSQLQuery( queryString );
- }
-
- public void delete(String entityName, Object object) throws HibernateException {
- session.delete( entityName, object );
- }
-
- public void delete(Object object) throws HibernateException {
- session.delete( object );
- }
-
- public void disableFilter(String filterName) {
- session.disableFilter( filterName );
- }
-
- public Connection disconnect() throws HibernateException {
- return session.disconnect();
- }
-
- public Filter enableFilter(String filterName) {
- return session.enableFilter( filterName );
- }
-
- public void evict(Object object) throws HibernateException {
- session.evict( object );
- }
-
- public void flush() throws HibernateException {
- session.flush();
- }
-
- public Object get(Class clazz, Serializable id) throws HibernateException {
- return session.get( clazz, id );
- }
-
- public Object get(Class clazz, Serializable id, LockMode lockMode) throws HibernateException {
- return session.get( clazz, id, lockMode );
- }
-
- public Object get(String entityName, Serializable id) throws HibernateException {
- return session.get( entityName, id );
- }
-
- public Object get(String entityName, Serializable id, LockMode lockMode) throws HibernateException {
- return session.get( entityName, id, lockMode );
- }
-
- public CacheMode getCacheMode() {
- return session.getCacheMode();
- }
-
- public LockMode getCurrentLockMode(Object object) throws HibernateException {
- return session.getCurrentLockMode( object );
- }
-
- public Filter getEnabledFilter(String filterName) {
- return session.getEnabledFilter( filterName );
- }
-
- public Interceptor getInterceptor() {
- return sessionImplementor.getInterceptor();
- }
-
- public void setAutoClear(boolean enabled) {
- sessionImplementor.setAutoClear( enabled );
- }
-
- public boolean isTransactionInProgress() {
- return sessionImplementor.isTransactionInProgress();
- }
-
- public void initializeCollection(PersistentCollection collection, boolean writing) throws HibernateException {
- sessionImplementor.initializeCollection( collection, writing );
- }
-
- public Object internalLoad(String entityName, Serializable id, boolean eager, boolean nullable)
- throws HibernateException {
- return sessionImplementor.internalLoad( entityName, id, eager, nullable );
- }
-
- public Object immediateLoad(String entityName, Serializable id) throws HibernateException {
- return sessionImplementor.immediateLoad( entityName, id );
- }
-
- public long getTimestamp() {
- return sessionImplementor.getTimestamp();
- }
-
- public SessionFactoryImplementor getFactory() {
- return sessionImplementor.getFactory();
- }
-
- public Batcher getBatcher() {
- return sessionImplementor.getBatcher();
- }
-
- public List list(String query, QueryParameters queryParameters) throws HibernateException {
- return sessionImplementor.list( query, queryParameters );
- }
-
- public Iterator iterate(String query, QueryParameters queryParameters) throws HibernateException {
- return sessionImplementor.iterate( query, queryParameters );
- }
-
- public ScrollableResults scroll(String query, QueryParameters queryParameters) throws HibernateException {
- return sessionImplementor.scroll( query, queryParameters );
- }
-
- public ScrollableResults scroll(CriteriaImpl criteria, ScrollMode scrollMode) {
- return sessionImplementor.scroll( criteria, scrollMode );
- }
-
- public List list(CriteriaImpl criteria) {
- return sessionImplementor.list( criteria );
- }
-
- public List listFilter(Object collection, String filter, QueryParameters queryParameters)
- throws HibernateException {
- return sessionImplementor.listFilter( collection, filter, queryParameters );
- }
-
- public Iterator iterateFilter(Object collection, String filter, QueryParameters queryParameters)
- throws HibernateException {
- return sessionImplementor.iterateFilter( collection, filter, queryParameters );
- }
-
- public EntityPersister getEntityPersister(String entityName, Object object) throws HibernateException {
- return sessionImplementor.getEntityPersister( entityName, object );
- }
-
- public Object getEntityUsingInterceptor(EntityKey key) throws HibernateException {
- return sessionImplementor.getEntityUsingInterceptor( key );
- }
-
- public void afterTransactionCompletion(boolean successful, Transaction tx) {
- sessionImplementor.afterTransactionCompletion( successful, tx );
- }
-
- public void beforeTransactionCompletion(Transaction tx) {
- sessionImplementor.beforeTransactionCompletion( tx );
- }
-
- public Serializable getContextEntityIdentifier(Object object) {
- return sessionImplementor.getContextEntityIdentifier( object );
- }
-
- public String bestGuessEntityName(Object object) {
- return sessionImplementor.bestGuessEntityName( object );
- }
-
- public String guessEntityName(Object entity) throws HibernateException {
- return sessionImplementor.guessEntityName( entity );
- }
-
- public Object instantiate(String entityName, Serializable id) throws HibernateException {
- return sessionImplementor.instantiate( entityName, id );
- }
-
- public List listCustomQuery(CustomQuery customQuery, QueryParameters queryParameters) throws HibernateException {
- return sessionImplementor.listCustomQuery( customQuery, queryParameters );
- }
-
- public ScrollableResults scrollCustomQuery(CustomQuery customQuery, QueryParameters queryParameters)
- throws HibernateException {
- return sessionImplementor.scrollCustomQuery( customQuery, queryParameters );
- }
-
- public List list(NativeSQLQuerySpecification spec, QueryParameters queryParameters) throws HibernateException {
- return sessionImplementor.list( spec, queryParameters );
- }
-
- public ScrollableResults scroll(NativeSQLQuerySpecification spec, QueryParameters queryParameters)
- throws HibernateException {
- return sessionImplementor.scroll( spec, queryParameters );
- }
-
- public Object getFilterParameterValue(String filterParameterName) {
- return sessionImplementor.getFilterParameterValue( filterParameterName );
- }
-
- public Type getFilterParameterType(String filterParameterName) {
- return sessionImplementor.getFilterParameterType( filterParameterName );
- }
-
- public Map getEnabledFilters() {
- return sessionImplementor.getEnabledFilters();
- }
-
- public int getDontFlushFromFind() {
- return sessionImplementor.getDontFlushFromFind();
- }
-
- public EventListeners getListeners() {
- return sessionImplementor.getListeners();
- }
-
- public PersistenceContext getPersistenceContext() {
- return sessionImplementor.getPersistenceContext();
- }
-
- public int executeUpdate(String query, QueryParameters queryParameters) throws HibernateException {
- return sessionImplementor.executeUpdate( query, queryParameters );
- }
-
- public int executeNativeUpdate(NativeSQLQuerySpecification specification, QueryParameters queryParameters)
- throws HibernateException {
- return sessionImplementor.executeNativeUpdate( specification, queryParameters );
- }
-
- public EntityMode getEntityMode() {
- return session.getEntityMode();
- }
-
- public String getEntityName(Object object) throws HibernateException {
- return session.getEntityName( object );
- }
-
- public FlushMode getFlushMode() {
- return session.getFlushMode();
- }
-
- public Serializable getIdentifier(Object object) throws HibernateException {
- return session.getIdentifier( object );
- }
-
- public Query getNamedQuery(String queryName) throws HibernateException {
- return session.getNamedQuery( queryName );
- }
-
- public Query getNamedSQLQuery(String name) {
- return sessionImplementor.getNamedSQLQuery( name );
- }
-
- public boolean isEventSource() {
- return sessionImplementor.isEventSource();
- }
-
- public void afterScrollOperation() {
- sessionImplementor.afterScrollOperation();
- }
-
- public void setFetchProfile(String name) {
- sessionImplementor.setFetchProfile( name );
- }
-
- public String getFetchProfile() {
- return sessionImplementor.getFetchProfile();
- }
-
- public JDBCContext getJDBCContext() {
- return sessionImplementor.getJDBCContext();
- }
-
- public boolean isClosed() {
- return sessionImplementor.isClosed();
- }
-
- public org.hibernate.Session getSession(EntityMode entityMode) {
- return session.getSession( entityMode );
- }
-
- public SessionFactory getSessionFactory() {
- return session.getSessionFactory();
- }
-
- public SessionStatistics getStatistics() {
- return session.getStatistics();
- }
-
- public Transaction getTransaction() {
- return session.getTransaction();
- }
-
- public boolean isConnected() {
- return session.isConnected();
- }
-
- public boolean isDirty() throws HibernateException {
- return session.isDirty();
- }
-
- public boolean isOpen() {
- return session.isOpen();
- }
-
- public Object load(String entityName, Serializable id) throws HibernateException {
- return session.load( entityName, id );
- }
-
- public Object load(String entityName, Serializable id, LockMode lockMode) throws HibernateException {
- return session.load( entityName, id, lockMode );
- }
-
- public void load(Object object, Serializable id) throws HibernateException {
- session.load( object, id );
- }
-
- public Object load(Class theClass, Serializable id) throws HibernateException {
- return session.load( theClass, id );
- }
-
- public Object load(Class theClass, Serializable id, LockMode lockMode) throws HibernateException {
- return session.load( theClass, id, lockMode );
- }
-
- public void lock(String entityName, Object object, LockMode lockMode) throws HibernateException {
- session.lock( entityName, object, lockMode );
- }
-
- public void lock(Object object, LockMode lockMode) throws HibernateException {
- session.lock( object, lockMode );
- }
-
- public Object merge(String entityName, Object object) throws HibernateException {
- return session.merge( entityName, object );
- }
-
- public Object merge(Object object) throws HibernateException {
- return session.merge( object );
- }
-
- public void persist(String entityName, Object object) throws HibernateException {
- session.persist( entityName, object );
- }
-
- public void persist(Object object) throws HibernateException {
- session.persist( object );
- }
-
- public void reconnect() throws HibernateException {
- session.reconnect();
- }
-
- public void reconnect(Connection connection) throws HibernateException {
- session.reconnect( connection );
- }
-
- public void refresh(Object object) throws HibernateException {
- session.refresh( object );
- }
-
- public void refresh(Object object, LockMode lockMode) throws HibernateException {
- session.refresh( object, lockMode );
- }
-
- public void replicate(String entityName, Object object, ReplicationMode replicationMode) throws HibernateException {
- session.replicate( entityName, object, replicationMode );
- }
-
- public void replicate(Object object, ReplicationMode replicationMode) throws HibernateException {
- session.replicate( object, replicationMode );
- }
-
- public Serializable save(String entityName, Object object) throws HibernateException {
- return session.save( entityName, object );
- }
-
- public Serializable save(Object object) throws HibernateException {
- return session.save( object );
- }
-
- public void saveOrUpdate(String entityName, Object object) throws HibernateException {
- session.saveOrUpdate( entityName, object );
- }
-
- public void saveOrUpdate(Object object) throws HibernateException {
- session.saveOrUpdate( object );
- }
-
- public void setCacheMode(CacheMode cacheMode) {
- session.setCacheMode( cacheMode );
- }
-
- public void setFlushMode(FlushMode flushMode) {
- session.setFlushMode( flushMode );
- }
-
- public void setReadOnly(Object entity, boolean readOnly) {
- session.setReadOnly( entity, readOnly );
- }
-
- public void update(String entityName, Object object) throws HibernateException {
- session.update( entityName, object );
- }
-
- public void update(Object object) throws HibernateException {
- session.update( object );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/impl/FullTextSessionImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,631 @@
+//$Id: $
+package org.hibernate.search.impl;
+
+import java.io.Serializable;
+import java.sql.Connection;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.CacheMode;
+import org.hibernate.Criteria;
+import org.hibernate.EntityMode;
+import org.hibernate.Filter;
+import org.hibernate.FlushMode;
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.Interceptor;
+import org.hibernate.LockMode;
+import org.hibernate.Query;
+import org.hibernate.ReplicationMode;
+import org.hibernate.SQLQuery;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.classic.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.collection.PersistentCollection;
+import org.hibernate.engine.EntityKey;
+import org.hibernate.engine.PersistenceContext;
+import org.hibernate.engine.QueryParameters;
+import org.hibernate.engine.SessionFactoryImplementor;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.engine.query.ParameterMetadata;
+import org.hibernate.engine.query.sql.NativeSQLQuerySpecification;
+import org.hibernate.event.EventListeners;
+import org.hibernate.event.EventSource;
+import org.hibernate.impl.CriteriaImpl;
+import org.hibernate.jdbc.Batcher;
+import org.hibernate.jdbc.JDBCContext;
+import org.hibernate.loader.custom.CustomQuery;
+import org.hibernate.persister.entity.EntityPersister;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.backend.WorkType;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.query.FullTextQueryImpl;
+import org.hibernate.search.util.ContextHelper;
+import org.hibernate.stat.SessionStatistics;
+import org.hibernate.type.Type;
+
+/**
+ * Lucene Full text search aware session
+ *
+ * @author Emmanuel Bernard
+ */
+public class FullTextSessionImpl implements FullTextSession, SessionImplementor {
+ private final Session session;
+ private final EventSource eventSource;
+ private final SessionImplementor sessionImplementor;
+
+ public FullTextSessionImpl(org.hibernate.Session session) {
+ this.session = (Session) session;
+ this.eventSource = (EventSource) session;
+ this.sessionImplementor = (SessionImplementor) session;
+ }
+
+ /**
+ * Execute a Lucene query and retrieve managed objects of type entities (or their indexed subclasses)
+ * If entities is empty, include all indexed entities
+ *
+ * @param entities must be immutable for the lifetime of the query object
+ */
+ public Query createFullTextQuery(org.apache.lucene.search.Query luceneQuery, Class... entities) {
+ return new FullTextQueryImpl( luceneQuery, entities, sessionImplementor, new ParameterMetadata(null, null) );
+ }
+
+ /**
+ * (re)index an entity.
+ * Non indexable entities are ignored
+ * The entity must be associated with the session
+ *
+ * @param entity must not be null
+ */
+ public void index(Object entity) {
+ if (entity == null) return;
+ Class clazz = Hibernate.getClass( entity );
+ //TODO cache that at the FTSession level
+ SearchFactory searchFactory = ContextHelper.getSearchFactory( session );
+ //not strictly necessary but a small optimization
+ DocumentBuilder<Object> builder = searchFactory.getDocumentBuilders().get( clazz );
+ if ( builder != null ) {
+ Serializable id = session.getIdentifier( entity );
+ searchFactory.getWorker().performWork( entity, id, WorkType.UPDATE, eventSource );
+ }
+ //TODO
+ //need to add elements in a queue kept at the Session level
+ //the queue will be processed by a Lucene(Auto)FlushEventListener
+ //note that we could keep this queue somewhere in the event listener in the mean time but that requires
+ // a synchronized hashmap holding this queue on a per session basis plus some session house keeping (yuk)
+ //an other solution would be to subclass SessionImpl instead of having this LuceneSession delecation model
+ // this is an open discussion
+ }
+
+ public Query createSQLQuery(String sql, String returnAlias, Class returnClass) {
+ return session.createSQLQuery( sql, returnAlias, returnClass );
+ }
+
+ public Query createSQLQuery(String sql, String[] returnAliases, Class[] returnClasses) {
+ return session.createSQLQuery( sql, returnAliases, returnClasses );
+ }
+
+ public int delete(String query) throws HibernateException {
+ return session.delete( query );
+ }
+
+ public int delete(String query, Object value, Type type) throws HibernateException {
+ return session.delete( query, value, type );
+ }
+
+ public int delete(String query, Object[] values, Type[] types) throws HibernateException {
+ return session.delete( query, values, types );
+ }
+
+ public Collection filter(Object collection, String filter) throws HibernateException {
+ return session.filter( collection, filter );
+ }
+
+ public Collection filter(Object collection, String filter, Object value, Type type) throws HibernateException {
+ return session.filter( collection, filter, value, type );
+ }
+
+ public Collection filter(Object collection, String filter, Object[] values, Type[] types) throws HibernateException {
+ return session.filter( collection, filter, values, types );
+ }
+
+ public List find(String query) throws HibernateException {
+ return session.find( query );
+ }
+
+ public List find(String query, Object value, Type type) throws HibernateException {
+ return session.find( query, value, type );
+ }
+
+ public List find(String query, Object[] values, Type[] types) throws HibernateException {
+ return session.find( query, values, types );
+ }
+
+ public Iterator iterate(String query) throws HibernateException {
+ return session.iterate( query );
+ }
+
+ public Iterator iterate(String query, Object value, Type type) throws HibernateException {
+ return session.iterate( query, value, type );
+ }
+
+ public Iterator iterate(String query, Object[] values, Type[] types) throws HibernateException {
+ return session.iterate( query, values, types );
+ }
+
+ public void save(String entityName, Object object, Serializable id) throws HibernateException {
+ session.save( entityName, object, id );
+ }
+
+ public void save(Object object, Serializable id) throws HibernateException {
+ session.save( object, id );
+ }
+
+ public Object saveOrUpdateCopy(String entityName, Object object) throws HibernateException {
+ return session.saveOrUpdateCopy( entityName, object );
+ }
+
+ public Object saveOrUpdateCopy(String entityName, Object object, Serializable id) throws HibernateException {
+ return session.saveOrUpdateCopy( entityName, object, id );
+ }
+
+ public Object saveOrUpdateCopy(Object object) throws HibernateException {
+ return session.saveOrUpdateCopy( object );
+ }
+
+ public Object saveOrUpdateCopy(Object object, Serializable id) throws HibernateException {
+ return session.saveOrUpdateCopy( object, id );
+ }
+
+ public void update(String entityName, Object object, Serializable id) throws HibernateException {
+ session.update( entityName, object, id );
+ }
+
+ public void update(Object object, Serializable id) throws HibernateException {
+ session.update( object, id );
+ }
+
+ public Transaction beginTransaction() throws HibernateException {
+ return session.beginTransaction();
+ }
+
+ public void cancelQuery() throws HibernateException {
+ session.cancelQuery();
+ }
+
+ public void clear() {
+ //FIXME should session clear work with the lucene queue
+ session.clear();
+ }
+
+ public Connection close() throws HibernateException {
+ return session.close();
+ }
+
+ public Connection connection() throws HibernateException {
+ return session.connection();
+ }
+
+ public boolean contains(Object object) {
+ return session.contains( object );
+ }
+
+ public Criteria createCriteria(String entityName) {
+ return session.createCriteria( entityName );
+ }
+
+ public Criteria createCriteria(String entityName, String alias) {
+ return session.createCriteria( entityName, alias );
+ }
+
+ public Criteria createCriteria(Class persistentClass) {
+ return session.createCriteria( persistentClass );
+ }
+
+ public Criteria createCriteria(Class persistentClass, String alias) {
+ return session.createCriteria( persistentClass, alias );
+ }
+
+ public Query createFilter(Object collection, String queryString) throws HibernateException {
+ return session.createFilter( collection, queryString );
+ }
+
+ public Query createQuery(String queryString) throws HibernateException {
+ return session.createQuery( queryString );
+ }
+
+ public SQLQuery createSQLQuery(String queryString) throws HibernateException {
+ return session.createSQLQuery( queryString );
+ }
+
+ public void delete(String entityName, Object object) throws HibernateException {
+ session.delete( entityName, object );
+ }
+
+ public void delete(Object object) throws HibernateException {
+ session.delete( object );
+ }
+
+ public void disableFilter(String filterName) {
+ session.disableFilter( filterName );
+ }
+
+ public Connection disconnect() throws HibernateException {
+ return session.disconnect();
+ }
+
+ public Filter enableFilter(String filterName) {
+ return session.enableFilter( filterName );
+ }
+
+ public void evict(Object object) throws HibernateException {
+ session.evict( object );
+ }
+
+ public void flush() throws HibernateException {
+ session.flush();
+ }
+
+ public Object get(Class clazz, Serializable id) throws HibernateException {
+ return session.get( clazz, id );
+ }
+
+ public Object get(Class clazz, Serializable id, LockMode lockMode) throws HibernateException {
+ return session.get( clazz, id, lockMode );
+ }
+
+ public Object get(String entityName, Serializable id) throws HibernateException {
+ return session.get( entityName, id );
+ }
+
+ public Object get(String entityName, Serializable id, LockMode lockMode) throws HibernateException {
+ return session.get( entityName, id, lockMode );
+ }
+
+ public CacheMode getCacheMode() {
+ return session.getCacheMode();
+ }
+
+ public LockMode getCurrentLockMode(Object object) throws HibernateException {
+ return session.getCurrentLockMode( object );
+ }
+
+ public Filter getEnabledFilter(String filterName) {
+ return session.getEnabledFilter( filterName );
+ }
+
+ public Interceptor getInterceptor() {
+ return sessionImplementor.getInterceptor();
+ }
+
+ public void setAutoClear(boolean enabled) {
+ sessionImplementor.setAutoClear( enabled );
+ }
+
+ public boolean isTransactionInProgress() {
+ return sessionImplementor.isTransactionInProgress();
+ }
+
+ public void initializeCollection(PersistentCollection collection, boolean writing) throws HibernateException {
+ sessionImplementor.initializeCollection( collection, writing );
+ }
+
+ public Object internalLoad(String entityName, Serializable id, boolean eager, boolean nullable)
+ throws HibernateException {
+ return sessionImplementor.internalLoad( entityName, id, eager, nullable );
+ }
+
+ public Object immediateLoad(String entityName, Serializable id) throws HibernateException {
+ return sessionImplementor.immediateLoad( entityName, id );
+ }
+
+ public long getTimestamp() {
+ return sessionImplementor.getTimestamp();
+ }
+
+ public SessionFactoryImplementor getFactory() {
+ return sessionImplementor.getFactory();
+ }
+
+ public Batcher getBatcher() {
+ return sessionImplementor.getBatcher();
+ }
+
+ public List list(String query, QueryParameters queryParameters) throws HibernateException {
+ return sessionImplementor.list( query, queryParameters );
+ }
+
+ public Iterator iterate(String query, QueryParameters queryParameters) throws HibernateException {
+ return sessionImplementor.iterate( query, queryParameters );
+ }
+
+ public ScrollableResults scroll(String query, QueryParameters queryParameters) throws HibernateException {
+ return sessionImplementor.scroll( query, queryParameters );
+ }
+
+ public ScrollableResults scroll(CriteriaImpl criteria, ScrollMode scrollMode) {
+ return sessionImplementor.scroll( criteria, scrollMode );
+ }
+
+ public List list(CriteriaImpl criteria) {
+ return sessionImplementor.list( criteria );
+ }
+
+ public List listFilter(Object collection, String filter, QueryParameters queryParameters)
+ throws HibernateException {
+ return sessionImplementor.listFilter( collection, filter, queryParameters );
+ }
+
+ public Iterator iterateFilter(Object collection, String filter, QueryParameters queryParameters)
+ throws HibernateException {
+ return sessionImplementor.iterateFilter( collection, filter, queryParameters );
+ }
+
+ public EntityPersister getEntityPersister(String entityName, Object object) throws HibernateException {
+ return sessionImplementor.getEntityPersister( entityName, object );
+ }
+
+ public Object getEntityUsingInterceptor(EntityKey key) throws HibernateException {
+ return sessionImplementor.getEntityUsingInterceptor( key );
+ }
+
+ public void afterTransactionCompletion(boolean successful, Transaction tx) {
+ sessionImplementor.afterTransactionCompletion( successful, tx );
+ }
+
+ public void beforeTransactionCompletion(Transaction tx) {
+ sessionImplementor.beforeTransactionCompletion( tx );
+ }
+
+ public Serializable getContextEntityIdentifier(Object object) {
+ return sessionImplementor.getContextEntityIdentifier( object );
+ }
+
+ public String bestGuessEntityName(Object object) {
+ return sessionImplementor.bestGuessEntityName( object );
+ }
+
+ public String guessEntityName(Object entity) throws HibernateException {
+ return sessionImplementor.guessEntityName( entity );
+ }
+
+ public Object instantiate(String entityName, Serializable id) throws HibernateException {
+ return sessionImplementor.instantiate( entityName, id );
+ }
+
+ public List listCustomQuery(CustomQuery customQuery, QueryParameters queryParameters) throws HibernateException {
+ return sessionImplementor.listCustomQuery( customQuery, queryParameters );
+ }
+
+ public ScrollableResults scrollCustomQuery(CustomQuery customQuery, QueryParameters queryParameters)
+ throws HibernateException {
+ return sessionImplementor.scrollCustomQuery( customQuery, queryParameters );
+ }
+
+ public List list(NativeSQLQuerySpecification spec, QueryParameters queryParameters) throws HibernateException {
+ return sessionImplementor.list( spec, queryParameters );
+ }
+
+ public ScrollableResults scroll(NativeSQLQuerySpecification spec, QueryParameters queryParameters)
+ throws HibernateException {
+ return sessionImplementor.scroll( spec, queryParameters );
+ }
+
+ public Object getFilterParameterValue(String filterParameterName) {
+ return sessionImplementor.getFilterParameterValue( filterParameterName );
+ }
+
+ public Type getFilterParameterType(String filterParameterName) {
+ return sessionImplementor.getFilterParameterType( filterParameterName );
+ }
+
+ public Map getEnabledFilters() {
+ return sessionImplementor.getEnabledFilters();
+ }
+
+ public int getDontFlushFromFind() {
+ return sessionImplementor.getDontFlushFromFind();
+ }
+
+ public EventListeners getListeners() {
+ return sessionImplementor.getListeners();
+ }
+
+ public PersistenceContext getPersistenceContext() {
+ return sessionImplementor.getPersistenceContext();
+ }
+
+ public int executeUpdate(String query, QueryParameters queryParameters) throws HibernateException {
+ return sessionImplementor.executeUpdate( query, queryParameters );
+ }
+
+ public int executeNativeUpdate(NativeSQLQuerySpecification specification, QueryParameters queryParameters)
+ throws HibernateException {
+ return sessionImplementor.executeNativeUpdate( specification, queryParameters );
+ }
+
+ public EntityMode getEntityMode() {
+ return session.getEntityMode();
+ }
+
+ public String getEntityName(Object object) throws HibernateException {
+ return session.getEntityName( object );
+ }
+
+ public FlushMode getFlushMode() {
+ return session.getFlushMode();
+ }
+
+ public Serializable getIdentifier(Object object) throws HibernateException {
+ return session.getIdentifier( object );
+ }
+
+ public Query getNamedQuery(String queryName) throws HibernateException {
+ return session.getNamedQuery( queryName );
+ }
+
+ public Query getNamedSQLQuery(String name) {
+ return sessionImplementor.getNamedSQLQuery( name );
+ }
+
+ public boolean isEventSource() {
+ return sessionImplementor.isEventSource();
+ }
+
+ public void afterScrollOperation() {
+ sessionImplementor.afterScrollOperation();
+ }
+
+ public void setFetchProfile(String name) {
+ sessionImplementor.setFetchProfile( name );
+ }
+
+ public String getFetchProfile() {
+ return sessionImplementor.getFetchProfile();
+ }
+
+ public JDBCContext getJDBCContext() {
+ return sessionImplementor.getJDBCContext();
+ }
+
+ public boolean isClosed() {
+ return sessionImplementor.isClosed();
+ }
+
+ public org.hibernate.Session getSession(EntityMode entityMode) {
+ return session.getSession( entityMode );
+ }
+
+ public SessionFactory getSessionFactory() {
+ return session.getSessionFactory();
+ }
+
+ public SessionStatistics getStatistics() {
+ return session.getStatistics();
+ }
+
+ public Transaction getTransaction() {
+ return session.getTransaction();
+ }
+
+ public boolean isConnected() {
+ return session.isConnected();
+ }
+
+ public boolean isDirty() throws HibernateException {
+ return session.isDirty();
+ }
+
+ public boolean isOpen() {
+ return session.isOpen();
+ }
+
+ public Object load(String entityName, Serializable id) throws HibernateException {
+ return session.load( entityName, id );
+ }
+
+ public Object load(String entityName, Serializable id, LockMode lockMode) throws HibernateException {
+ return session.load( entityName, id, lockMode );
+ }
+
+ public void load(Object object, Serializable id) throws HibernateException {
+ session.load( object, id );
+ }
+
+ public Object load(Class theClass, Serializable id) throws HibernateException {
+ return session.load( theClass, id );
+ }
+
+ public Object load(Class theClass, Serializable id, LockMode lockMode) throws HibernateException {
+ return session.load( theClass, id, lockMode );
+ }
+
+ public void lock(String entityName, Object object, LockMode lockMode) throws HibernateException {
+ session.lock( entityName, object, lockMode );
+ }
+
+ public void lock(Object object, LockMode lockMode) throws HibernateException {
+ session.lock( object, lockMode );
+ }
+
+ public Object merge(String entityName, Object object) throws HibernateException {
+ return session.merge( entityName, object );
+ }
+
+ public Object merge(Object object) throws HibernateException {
+ return session.merge( object );
+ }
+
+ public void persist(String entityName, Object object) throws HibernateException {
+ session.persist( entityName, object );
+ }
+
+ public void persist(Object object) throws HibernateException {
+ session.persist( object );
+ }
+
+ public void reconnect() throws HibernateException {
+ session.reconnect();
+ }
+
+ public void reconnect(Connection connection) throws HibernateException {
+ session.reconnect( connection );
+ }
+
+ public void refresh(Object object) throws HibernateException {
+ session.refresh( object );
+ }
+
+ public void refresh(Object object, LockMode lockMode) throws HibernateException {
+ session.refresh( object, lockMode );
+ }
+
+ public void replicate(String entityName, Object object, ReplicationMode replicationMode) throws HibernateException {
+ session.replicate( entityName, object, replicationMode );
+ }
+
+ public void replicate(Object object, ReplicationMode replicationMode) throws HibernateException {
+ session.replicate( object, replicationMode );
+ }
+
+ public Serializable save(String entityName, Object object) throws HibernateException {
+ return session.save( entityName, object );
+ }
+
+ public Serializable save(Object object) throws HibernateException {
+ return session.save( object );
+ }
+
+ public void saveOrUpdate(String entityName, Object object) throws HibernateException {
+ session.saveOrUpdate( entityName, object );
+ }
+
+ public void saveOrUpdate(Object object) throws HibernateException {
+ session.saveOrUpdate( object );
+ }
+
+ public void setCacheMode(CacheMode cacheMode) {
+ session.setCacheMode( cacheMode );
+ }
+
+ public void setFlushMode(FlushMode flushMode) {
+ session.setFlushMode( flushMode );
+ }
+
+ public void setReadOnly(Object entity, boolean readOnly) {
+ session.setReadOnly( entity, readOnly );
+ }
+
+ public void update(String entityName, Object object) throws HibernateException {
+ session.update( entityName, object );
+ }
+
+ public void update(Object object) throws HibernateException {
+ session.update( object );
+ }
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/query (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/query/EntityInfo.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/EntityInfo.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/query/EntityInfo.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id: $
-package org.hibernate.search.query;
-
-import java.io.Serializable;
-
-/**
- * @author Emmanuel Bernard
- */
-class EntityInfo {
- public Class clazz;
- public Serializable id;
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/query/EntityInfo.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/EntityInfo.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/query/EntityInfo.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/query/EntityInfo.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id: $
+package org.hibernate.search.query;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+class EntityInfo {
+ public Class clazz;
+ public Serializable id;
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,319 +0,0 @@
-//$Id: $
-package org.hibernate.search.query;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.search.BooleanClause;
-import org.apache.lucene.search.BooleanQuery;
-import org.apache.lucene.search.Hits;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.MultiSearcher;
-import org.apache.lucene.search.Searcher;
-import org.apache.lucene.search.TermQuery;
-import org.apache.lucene.store.Directory;
-import org.hibernate.Hibernate;
-import org.hibernate.HibernateException;
-import org.hibernate.LockMode;
-import org.hibernate.Query;
-import org.hibernate.ScrollMode;
-import org.hibernate.ScrollableResults;
-import org.hibernate.Session;
-import org.hibernate.ObjectNotFoundException;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.engine.query.ParameterMetadata;
-import org.hibernate.impl.AbstractQueryImpl;
-import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.search.util.ContextHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-//TODO implements setParameter()
-public class FullTextQueryImpl extends AbstractQueryImpl {
- private static final Log log = LogFactory.getLog( FullTextQueryImpl.class );
- private org.apache.lucene.search.Query luceneQuery;
- private Class[] classes;
- private Set<Class> classesAndSubclasses;
- private Integer firstResult;
- private Integer maxResults;
- private int resultSize;
-
- /**
- * classes must be immutable
- */
- public FullTextQueryImpl(org.apache.lucene.search.Query query, Class[] classes, SessionImplementor session,
- ParameterMetadata parameterMetadata) {
- //TODO handle flushMode
- super( query.toString(), null, session, parameterMetadata );
- this.luceneQuery = query;
- this.classes = classes;
- }
-
- /**
- * Return an interator on the results.
- * Retrieve the object one by one (initialize it during the next() operation)
- */
- public Iterator iterate() throws HibernateException {
- //implement an interator which keep the id/class for each hit and get the object on demand
- //cause I can't keep the searcher and hence the hit opened. I dont have any hook to know when the
- //user stop using it
- //scrollable is better in this area
-
- SearchFactory searchFactory = ContextHelper.getSearchFactoryBySFI( session );
- //find the directories
- Searcher searcher = buildSearcher( searchFactory );
- if ( searcher == null ) {
- return new IteratorImpl( new ArrayList<EntityInfo>(0), (Session) this.session);
- }
- try {
- org.apache.lucene.search.Query query = filterQueryByClasses( luceneQuery );
- Hits hits = searcher.search( query );
- setResultSize( hits );
- int first = first();
- int max = max( first, hits );
- List<EntityInfo> entityInfos = new ArrayList<EntityInfo>( max - first + 1 );
- for ( int index = first; index <= max; index++ ) {
- Document document = hits.doc( index );
- EntityInfo entityInfo = new EntityInfo();
- entityInfo.clazz = DocumentBuilder.getDocumentClass( document );
- entityInfo.id = DocumentBuilder.getDocumentId( searchFactory, entityInfo.clazz, document );
- entityInfos.add( entityInfo );
- }
- return new IteratorImpl( entityInfos, (Session) this.session );
- }
- catch (IOException e) {
- throw new HibernateException( "Unable to query Lucene index", e );
- }
- finally {
- if ( searcher != null ) {
- try {
- searcher.close();
- }
- catch (IOException e) {
- log.warn( "Unable to properly close searcher during lucene query: " + getQueryString(), e );
- }
- }
- }
- }
-
- public ScrollableResults scroll() throws HibernateException {
- //keep the searcher open until the resultset is closed
- SearchFactory searchFactory = ContextHelper.getSearchFactoryBySFI( session );
- ;
- //find the directories
- Searcher searcher = buildSearcher( searchFactory );
- //FIXME: handle null searcher
- Hits hits;
- try {
- org.apache.lucene.search.Query query = filterQueryByClasses( luceneQuery );
- hits = searcher.search( query );
- setResultSize( hits );
- int first = first();
- int max = max( first, hits );
- return new ScrollableResultsImpl( searcher, hits, first, max, (Session) this.session, searchFactory );
- }
- catch (IOException e) {
- try {
- if ( searcher != null ) searcher.close();
- }
- catch (IOException ee) {
- //we have the initial issue already
- }
- throw new HibernateException( "Unable to query Lucene index", e );
- }
- }
-
- public ScrollableResults scroll(ScrollMode scrollMode) throws HibernateException {
- //TODO think about this scrollmode
- return scroll();
- }
-
- public List list() throws HibernateException {
- SearchFactory searchFactory = ContextHelper.getSearchFactoryBySFI( session );
- //find the directories
- Searcher searcher = buildSearcher( searchFactory );
- if (searcher == null) return new ArrayList(0);
- Hits hits;
- try {
- org.apache.lucene.search.Query query = filterQueryByClasses( luceneQuery );
- hits = searcher.search( query );
- setResultSize( hits );
- int first = first();
- int max = max( first, hits );
- List result = new ArrayList( max - first + 1 );
- Session sess = (Session) this.session;
- for ( int index = first; index <= max; index++ ) {
- Document document = hits.doc( index );
- Class clazz = DocumentBuilder.getDocumentClass( document );
- Serializable id = DocumentBuilder.getDocumentId( searchFactory, clazz, document );
- result.add( sess.load( clazz, id ) );
- //use load to benefit from the batch-size
- //we don't face proxy casting issues since the exact class is extracted from the index
- }
- //then initialize the objects
- List excludedObects = new ArrayList();
- for ( Object element : result ) {
- try {
- Hibernate.initialize( element );
- }
- catch (ObjectNotFoundException e) {
- log.debug( "Object found in Search index but not in database: "
- + e.getEntityName() + " wih id " + e.getIdentifier() );
- excludedObects.add( element );
- }
- }
- if ( excludedObects.size() > 0 ) {
- result.removeAll( excludedObects );
- }
- return result;
- }
- catch (IOException e) {
- throw new HibernateException( "Unable to query Lucene index", e );
- }
- finally {
- if ( searcher != null ) try {
- searcher.close();
- }
- catch (IOException e) {
- log.warn( "Unable to properly close searcher during lucene query: " + getQueryString(), e );
- }
- }
- }
-
- private org.apache.lucene.search.Query filterQueryByClasses(org.apache.lucene.search.Query luceneQuery) {
- //A query filter is more practical than a manual class filtering post query (esp on scrollable resultsets)
- //it also probably minimise the memory footprint
- if ( classesAndSubclasses == null ) {
- return luceneQuery;
- }
- else {
- BooleanQuery classFilter = new BooleanQuery();
- //annihilate the scoring impact of DocumentBuilder.CLASS_FIELDNAME
- classFilter.setBoost( 0 );
- for ( Class clazz : classesAndSubclasses ) {
- Term t = new Term( DocumentBuilder.CLASS_FIELDNAME, clazz.getName() );
- TermQuery termQuery = new TermQuery( t );
- classFilter.add( termQuery, BooleanClause.Occur.SHOULD );
- }
- BooleanQuery filteredQuery = new BooleanQuery();
- filteredQuery.add( luceneQuery, BooleanClause.Occur.MUST );
- filteredQuery.add( classFilter, BooleanClause.Occur.MUST );
- return filteredQuery;
- }
- }
-
- private int max(int first, Hits hits) {
- return maxResults == null ?
- hits.length() - 1 :
- maxResults + first < hits.length() ?
- first + maxResults - 1 :
- hits.length() - 1;
- }
-
- private int first() {
- return firstResult != null ?
- firstResult :
- 0;
- }
-
- //TODO change classesAndSubclasses by side effect, which is a mismatch with the Searcher return, fix that.
- private Searcher buildSearcher(SearchFactory searchFactory) {
- Map<Class, DocumentBuilder<Object>> builders = searchFactory.getDocumentBuilders();
- Set<Directory> directories = new HashSet<Directory>();
- if ( classes == null || classes.length == 0 ) {
- //no class means all classes
- for ( DocumentBuilder builder : builders.values() ) {
- directories.add( builder.getDirectoryProvider().getDirectory() );
- }
- classesAndSubclasses = null;
- }
- else {
- Set<Class> involvedClasses = new HashSet<Class>( classes.length );
- Collections.addAll( involvedClasses, classes );
- for ( Class clazz : classes ) {
- DocumentBuilder builder = builders.get( clazz );
- if ( builder != null ) involvedClasses.addAll( builder.getMappedSubclasses() );
- }
- for ( Class clazz : involvedClasses ) {
- DocumentBuilder builder = builders.get( clazz );
- //TODO should we rather choose a polymorphic path and allow non mapped entities
- if ( builder == null ) throw new HibernateException( "Not a mapped entity: " + clazz );
- directories.add( builder.getDirectoryProvider().getDirectory() );
- }
- classesAndSubclasses = involvedClasses;
- }
-
- //set up the searcher
- Searcher searcher;
- int dirNbr = directories.size();
- if ( dirNbr > 1 ) {
- try {
- IndexSearcher[] searchers = new IndexSearcher[dirNbr];
- Iterator<Directory> it = directories.iterator();
- for ( int index = 0; index < dirNbr; index++ ) {
- searchers[index] = new IndexSearcher( it.next() );
- }
- searcher = new MultiSearcher( searchers );
- }
- catch (IOException e) {
- throw new HibernateException( "Unable to read Lucene directory", e );
- }
- }
- else if ( dirNbr == 1 ) {
- try {
- searcher = new IndexSearcher( directories.iterator().next() );
- }
- catch (IOException e) {
- throw new HibernateException( "Unable to read Lucene directory", e );
- }
- }
- else {
- return null; //no indexed entity set up
- }
- return searcher;
- }
-
- private void setResultSize(Hits hits) {
- resultSize = hits.length();
- }
-
- //FIXME does it make sense
- public int resultSize() {
- return this.resultSize;
- }
-
- public Query setFirstResult(int firstResult) {
- this.firstResult = firstResult;
- return this;
- }
-
- public Query setMaxResults(int maxResults) {
- this.maxResults = maxResults;
- return this;
- }
-
- public int executeUpdate() throws HibernateException {
- throw new HibernateException( "Not supported operation" );
- }
-
- public Query setLockMode(String alias, LockMode lockMode) {
- return null;
- }
-
- protected Map getLockModes() {
- return null;
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/query/FullTextQueryImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,319 @@
+//$Id: $
+package org.hibernate.search.query;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.search.BooleanClause;
+import org.apache.lucene.search.BooleanQuery;
+import org.apache.lucene.search.Hits;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.MultiSearcher;
+import org.apache.lucene.search.Searcher;
+import org.apache.lucene.search.TermQuery;
+import org.apache.lucene.store.Directory;
+import org.hibernate.Hibernate;
+import org.hibernate.HibernateException;
+import org.hibernate.LockMode;
+import org.hibernate.Query;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.ObjectNotFoundException;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.engine.query.ParameterMetadata;
+import org.hibernate.impl.AbstractQueryImpl;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.search.util.ContextHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+//TODO implements setParameter()
+public class FullTextQueryImpl extends AbstractQueryImpl {
+ private static final Log log = LogFactory.getLog( FullTextQueryImpl.class );
+ private org.apache.lucene.search.Query luceneQuery;
+ private Class[] classes;
+ private Set<Class> classesAndSubclasses;
+ private Integer firstResult;
+ private Integer maxResults;
+ private int resultSize;
+
+ /**
+ * classes must be immutable
+ */
+ public FullTextQueryImpl(org.apache.lucene.search.Query query, Class[] classes, SessionImplementor session,
+ ParameterMetadata parameterMetadata) {
+ //TODO handle flushMode
+ super( query.toString(), null, session, parameterMetadata );
+ this.luceneQuery = query;
+ this.classes = classes;
+ }
+
+ /**
+ * Return an interator on the results.
+ * Retrieve the object one by one (initialize it during the next() operation)
+ */
+ public Iterator iterate() throws HibernateException {
+ //implement an interator which keep the id/class for each hit and get the object on demand
+ //cause I can't keep the searcher and hence the hit opened. I dont have any hook to know when the
+ //user stop using it
+ //scrollable is better in this area
+
+ SearchFactory searchFactory = ContextHelper.getSearchFactoryBySFI( session );
+ //find the directories
+ Searcher searcher = buildSearcher( searchFactory );
+ if ( searcher == null ) {
+ return new IteratorImpl( new ArrayList<EntityInfo>(0), (Session) this.session);
+ }
+ try {
+ org.apache.lucene.search.Query query = filterQueryByClasses( luceneQuery );
+ Hits hits = searcher.search( query );
+ setResultSize( hits );
+ int first = first();
+ int max = max( first, hits );
+ List<EntityInfo> entityInfos = new ArrayList<EntityInfo>( max - first + 1 );
+ for ( int index = first; index <= max; index++ ) {
+ Document document = hits.doc( index );
+ EntityInfo entityInfo = new EntityInfo();
+ entityInfo.clazz = DocumentBuilder.getDocumentClass( document );
+ entityInfo.id = DocumentBuilder.getDocumentId( searchFactory, entityInfo.clazz, document );
+ entityInfos.add( entityInfo );
+ }
+ return new IteratorImpl( entityInfos, (Session) this.session );
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to query Lucene index", e );
+ }
+ finally {
+ if ( searcher != null ) {
+ try {
+ searcher.close();
+ }
+ catch (IOException e) {
+ log.warn( "Unable to properly close searcher during lucene query: " + getQueryString(), e );
+ }
+ }
+ }
+ }
+
+ public ScrollableResults scroll() throws HibernateException {
+ //keep the searcher open until the resultset is closed
+ SearchFactory searchFactory = ContextHelper.getSearchFactoryBySFI( session );
+ ;
+ //find the directories
+ Searcher searcher = buildSearcher( searchFactory );
+ //FIXME: handle null searcher
+ Hits hits;
+ try {
+ org.apache.lucene.search.Query query = filterQueryByClasses( luceneQuery );
+ hits = searcher.search( query );
+ setResultSize( hits );
+ int first = first();
+ int max = max( first, hits );
+ return new ScrollableResultsImpl( searcher, hits, first, max, (Session) this.session, searchFactory );
+ }
+ catch (IOException e) {
+ try {
+ if ( searcher != null ) searcher.close();
+ }
+ catch (IOException ee) {
+ //we have the initial issue already
+ }
+ throw new HibernateException( "Unable to query Lucene index", e );
+ }
+ }
+
+ public ScrollableResults scroll(ScrollMode scrollMode) throws HibernateException {
+ //TODO think about this scrollmode
+ return scroll();
+ }
+
+ public List list() throws HibernateException {
+ SearchFactory searchFactory = ContextHelper.getSearchFactoryBySFI( session );
+ //find the directories
+ Searcher searcher = buildSearcher( searchFactory );
+ if (searcher == null) return new ArrayList(0);
+ Hits hits;
+ try {
+ org.apache.lucene.search.Query query = filterQueryByClasses( luceneQuery );
+ hits = searcher.search( query );
+ setResultSize( hits );
+ int first = first();
+ int max = max( first, hits );
+ List result = new ArrayList( max - first + 1 );
+ Session sess = (Session) this.session;
+ for ( int index = first; index <= max; index++ ) {
+ Document document = hits.doc( index );
+ Class clazz = DocumentBuilder.getDocumentClass( document );
+ Serializable id = DocumentBuilder.getDocumentId( searchFactory, clazz, document );
+ result.add( sess.load( clazz, id ) );
+ //use load to benefit from the batch-size
+ //we don't face proxy casting issues since the exact class is extracted from the index
+ }
+ //then initialize the objects
+ List excludedObects = new ArrayList();
+ for ( Object element : result ) {
+ try {
+ Hibernate.initialize( element );
+ }
+ catch (ObjectNotFoundException e) {
+ log.debug( "Object found in Search index but not in database: "
+ + e.getEntityName() + " wih id " + e.getIdentifier() );
+ excludedObects.add( element );
+ }
+ }
+ if ( excludedObects.size() > 0 ) {
+ result.removeAll( excludedObects );
+ }
+ return result;
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to query Lucene index", e );
+ }
+ finally {
+ if ( searcher != null ) try {
+ searcher.close();
+ }
+ catch (IOException e) {
+ log.warn( "Unable to properly close searcher during lucene query: " + getQueryString(), e );
+ }
+ }
+ }
+
+ private org.apache.lucene.search.Query filterQueryByClasses(org.apache.lucene.search.Query luceneQuery) {
+ //A query filter is more practical than a manual class filtering post query (esp on scrollable resultsets)
+ //it also probably minimise the memory footprint
+ if ( classesAndSubclasses == null ) {
+ return luceneQuery;
+ }
+ else {
+ BooleanQuery classFilter = new BooleanQuery();
+ //annihilate the scoring impact of DocumentBuilder.CLASS_FIELDNAME
+ classFilter.setBoost( 0 );
+ for ( Class clazz : classesAndSubclasses ) {
+ Term t = new Term( DocumentBuilder.CLASS_FIELDNAME, clazz.getName() );
+ TermQuery termQuery = new TermQuery( t );
+ classFilter.add( termQuery, BooleanClause.Occur.SHOULD );
+ }
+ BooleanQuery filteredQuery = new BooleanQuery();
+ filteredQuery.add( luceneQuery, BooleanClause.Occur.MUST );
+ filteredQuery.add( classFilter, BooleanClause.Occur.MUST );
+ return filteredQuery;
+ }
+ }
+
+ private int max(int first, Hits hits) {
+ return maxResults == null ?
+ hits.length() - 1 :
+ maxResults + first < hits.length() ?
+ first + maxResults - 1 :
+ hits.length() - 1;
+ }
+
+ private int first() {
+ return firstResult != null ?
+ firstResult :
+ 0;
+ }
+
+ //TODO change classesAndSubclasses by side effect, which is a mismatch with the Searcher return, fix that.
+ private Searcher buildSearcher(SearchFactory searchFactory) {
+ Map<Class, DocumentBuilder<Object>> builders = searchFactory.getDocumentBuilders();
+ Set<Directory> directories = new HashSet<Directory>();
+ if ( classes == null || classes.length == 0 ) {
+ //no class means all classes
+ for ( DocumentBuilder builder : builders.values() ) {
+ directories.add( builder.getDirectoryProvider().getDirectory() );
+ }
+ classesAndSubclasses = null;
+ }
+ else {
+ Set<Class> involvedClasses = new HashSet<Class>( classes.length );
+ Collections.addAll( involvedClasses, classes );
+ for ( Class clazz : classes ) {
+ DocumentBuilder builder = builders.get( clazz );
+ if ( builder != null ) involvedClasses.addAll( builder.getMappedSubclasses() );
+ }
+ for ( Class clazz : involvedClasses ) {
+ DocumentBuilder builder = builders.get( clazz );
+ //TODO should we rather choose a polymorphic path and allow non mapped entities
+ if ( builder == null ) throw new HibernateException( "Not a mapped entity: " + clazz );
+ directories.add( builder.getDirectoryProvider().getDirectory() );
+ }
+ classesAndSubclasses = involvedClasses;
+ }
+
+ //set up the searcher
+ Searcher searcher;
+ int dirNbr = directories.size();
+ if ( dirNbr > 1 ) {
+ try {
+ IndexSearcher[] searchers = new IndexSearcher[dirNbr];
+ Iterator<Directory> it = directories.iterator();
+ for ( int index = 0; index < dirNbr; index++ ) {
+ searchers[index] = new IndexSearcher( it.next() );
+ }
+ searcher = new MultiSearcher( searchers );
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to read Lucene directory", e );
+ }
+ }
+ else if ( dirNbr == 1 ) {
+ try {
+ searcher = new IndexSearcher( directories.iterator().next() );
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to read Lucene directory", e );
+ }
+ }
+ else {
+ return null; //no indexed entity set up
+ }
+ return searcher;
+ }
+
+ private void setResultSize(Hits hits) {
+ resultSize = hits.length();
+ }
+
+ //FIXME does it make sense
+ public int resultSize() {
+ return this.resultSize;
+ }
+
+ public Query setFirstResult(int firstResult) {
+ this.firstResult = firstResult;
+ return this;
+ }
+
+ public Query setMaxResults(int maxResults) {
+ this.maxResults = maxResults;
+ return this;
+ }
+
+ public int executeUpdate() throws HibernateException {
+ throw new HibernateException( "Not supported operation" );
+ }
+
+ public Query setLockMode(String alias, LockMode lockMode) {
+ return null;
+ }
+
+ protected Map getLockModes() {
+ return null;
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,63 +0,0 @@
-//$Id: $
-package org.hibernate.search.query;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-import org.hibernate.Session;
-
-/**
- * @author Emmanuel Bernard
- */
-//TODO load the next batch-size elements to benefit from batch-size
-public class IteratorImpl implements Iterator {
-
- private final List<EntityInfo> entityInfos;
- private final Session session;
- private int index = 0;
- private final int size;
- private Object next;
- private int nextObjectIndex = -1;
-
- public IteratorImpl(List<EntityInfo> entityInfos, Session session) {
- this.entityInfos = entityInfos;
- this.session = session;
- this.size = entityInfos.size();
- }
-
- //side effect is to set up next
- public boolean hasNext() {
- if (nextObjectIndex == index) return next != null;
- next = null;
- nextObjectIndex = -1;
- do {
- if ( index >= size ) {
- nextObjectIndex = index;
- next = null;
- return false;
- }
- next = session.get( entityInfos.get( index ).clazz, entityInfos.get( index ).id );
- if (next == null) {
- index++;
- }
- else {
- nextObjectIndex = index;
- }
- }
- while( next == null );
- return true;
- }
-
- public Object next() {
- //hasNext() has side effect
- if ( ! hasNext() ) throw new NoSuchElementException("Out of boundaries");
- index++;
- return next;
- }
-
- public void remove() {
- //TODO this is theorically doable
- throw new UnsupportedOperationException( "Cannot remove from a lucene query iterator" );
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/query/IteratorImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,63 @@
+//$Id: $
+package org.hibernate.search.query;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+//TODO load the next batch-size elements to benefit from batch-size
+public class IteratorImpl implements Iterator {
+
+ private final List<EntityInfo> entityInfos;
+ private final Session session;
+ private int index = 0;
+ private final int size;
+ private Object next;
+ private int nextObjectIndex = -1;
+
+ public IteratorImpl(List<EntityInfo> entityInfos, Session session) {
+ this.entityInfos = entityInfos;
+ this.session = session;
+ this.size = entityInfos.size();
+ }
+
+ //side effect is to set up next
+ public boolean hasNext() {
+ if (nextObjectIndex == index) return next != null;
+ next = null;
+ nextObjectIndex = -1;
+ do {
+ if ( index >= size ) {
+ nextObjectIndex = index;
+ next = null;
+ return false;
+ }
+ next = session.get( entityInfos.get( index ).clazz, entityInfos.get( index ).id );
+ if (next == null) {
+ index++;
+ }
+ else {
+ nextObjectIndex = index;
+ }
+ }
+ while( next == null );
+ return true;
+ }
+
+ public Object next() {
+ //hasNext() has side effect
+ if ( ! hasNext() ) throw new NoSuchElementException("Out of boundaries");
+ index++;
+ return next;
+ }
+
+ public void remove() {
+ //TODO this is theorically doable
+ throw new UnsupportedOperationException( "Cannot remove from a lucene query iterator" );
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,222 +0,0 @@
-//$Id: $
-package org.hibernate.search.query;
-
-import java.io.IOException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.sql.Blob;
-import java.sql.Clob;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-import org.apache.lucene.document.Document;
-import org.apache.lucene.search.Hits;
-import org.apache.lucene.search.Searcher;
-import org.hibernate.HibernateException;
-import org.hibernate.ScrollableResults;
-import org.hibernate.Session;
-import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.type.Type;
-
-/**
- * Implements scollable and paginated resultsets.
- * Contrary to query#iterate() or query#list(), this implementation is
- * exposed to returned null objects (if the index is out of date).
- *
- * @author Emmanuel Bernard
- */
-public class ScrollableResultsImpl implements ScrollableResults {
- private final Searcher searcher;
- private final Hits hits;
- private final int first;
- private final int max;
- private int current;
- private final Session session;
- private EntityInfo[] entityInfos;
- private final SearchFactory searchFactory;
-
- public ScrollableResultsImpl(
- Searcher searcher, Hits hits, int first, int max, Session session, SearchFactory searchFactory
- ) {
- this.searcher = searcher;
- this.hits = hits;
- this.first = first;
- this.max = max;
- this.current = first;
- this.session = session;
- this.searchFactory = searchFactory;
- entityInfos = new EntityInfo[max - first + 1];
- }
-
- public boolean next() throws HibernateException {
- return ++current <= max;
- }
-
- public boolean previous() throws HibernateException {
- return --current >= first;
- }
-
- public boolean scroll(int i) throws HibernateException {
- current = current + i;
- return current >= first && current <= max;
- }
-
- public boolean last() throws HibernateException {
- current = max;
- return max >= first;
- }
-
- public boolean first() throws HibernateException {
- current = first;
- return max >= first;
- }
-
- public void beforeFirst() throws HibernateException {
- current = first - 1;
- }
-
- public void afterLast() throws HibernateException {
- current = max + 1;
- }
-
- public boolean isFirst() throws HibernateException {
- return current == first;
- }
-
- public boolean isLast() throws HibernateException {
- return current == max;
- }
-
- public void close() throws HibernateException {
- try {
- searcher.close();
- }
- catch (IOException e) {
- throw new HibernateException( "Unable to close Lucene searcher", e );
- }
- }
-
- public Object[] get() throws HibernateException {
- if ( current < first || current > max ) return null; //or exception?
- EntityInfo info = entityInfos[current - first];
- if ( info == null ) {
- info = new EntityInfo();
- Document document = null;
- try {
- document = hits.doc( current );
- }
- catch (IOException e) {
- throw new HibernateException( "Unable to read Lucene hits[" + current + "]", e );
- }
- info.clazz = DocumentBuilder.getDocumentClass( document );
- //FIXME should check that clazz match classes but this complexify a lot the firstResult/maxResult
- info.id = DocumentBuilder.getDocumentId( searchFactory, info.clazz, document );
- entityInfos[current - first] = info;
- }
- return new Object[]{
- session.get( info.clazz, info.id )
- };
- }
-
- public Object get(int i) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Type getType(int i) {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Integer getInteger(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Long getLong(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Float getFloat(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Boolean getBoolean(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Double getDouble(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Short getShort(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Byte getByte(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Character getCharacter(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public byte[] getBinary(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public String getText(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Blob getBlob(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Clob getClob(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public String getString(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public BigDecimal getBigDecimal(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public BigInteger getBigInteger(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Date getDate(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Locale getLocale(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public Calendar getCalendar(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public TimeZone getTimeZone(int col) throws HibernateException {
- throw new UnsupportedOperationException( "Lucene does not work on columns" );
- }
-
- public int getRowNumber() throws HibernateException {
- if ( max < first ) return -1;
- return current - first;
- }
-
- public boolean setRowNumber(int rowNumber) throws HibernateException {
- if ( rowNumber >= 0 ) {
- current = first + rowNumber;
- }
- else {
- current = max + rowNumber + 1; //max row start at -1
- }
- return current >= first && current <= max;
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/query/ScrollableResultsImpl.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,222 @@
+//$Id: $
+package org.hibernate.search.query;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.sql.Blob;
+import java.sql.Clob;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Locale;
+import java.util.TimeZone;
+
+import org.apache.lucene.document.Document;
+import org.apache.lucene.search.Hits;
+import org.apache.lucene.search.Searcher;
+import org.hibernate.HibernateException;
+import org.hibernate.ScrollableResults;
+import org.hibernate.Session;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.type.Type;
+
+/**
+ * Implements scollable and paginated resultsets.
+ * Contrary to query#iterate() or query#list(), this implementation is
+ * exposed to returned null objects (if the index is out of date).
+ *
+ * @author Emmanuel Bernard
+ */
+public class ScrollableResultsImpl implements ScrollableResults {
+ private final Searcher searcher;
+ private final Hits hits;
+ private final int first;
+ private final int max;
+ private int current;
+ private final Session session;
+ private EntityInfo[] entityInfos;
+ private final SearchFactory searchFactory;
+
+ public ScrollableResultsImpl(
+ Searcher searcher, Hits hits, int first, int max, Session session, SearchFactory searchFactory
+ ) {
+ this.searcher = searcher;
+ this.hits = hits;
+ this.first = first;
+ this.max = max;
+ this.current = first;
+ this.session = session;
+ this.searchFactory = searchFactory;
+ entityInfos = new EntityInfo[max - first + 1];
+ }
+
+ public boolean next() throws HibernateException {
+ return ++current <= max;
+ }
+
+ public boolean previous() throws HibernateException {
+ return --current >= first;
+ }
+
+ public boolean scroll(int i) throws HibernateException {
+ current = current + i;
+ return current >= first && current <= max;
+ }
+
+ public boolean last() throws HibernateException {
+ current = max;
+ return max >= first;
+ }
+
+ public boolean first() throws HibernateException {
+ current = first;
+ return max >= first;
+ }
+
+ public void beforeFirst() throws HibernateException {
+ current = first - 1;
+ }
+
+ public void afterLast() throws HibernateException {
+ current = max + 1;
+ }
+
+ public boolean isFirst() throws HibernateException {
+ return current == first;
+ }
+
+ public boolean isLast() throws HibernateException {
+ return current == max;
+ }
+
+ public void close() throws HibernateException {
+ try {
+ searcher.close();
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to close Lucene searcher", e );
+ }
+ }
+
+ public Object[] get() throws HibernateException {
+ if ( current < first || current > max ) return null; //or exception?
+ EntityInfo info = entityInfos[current - first];
+ if ( info == null ) {
+ info = new EntityInfo();
+ Document document = null;
+ try {
+ document = hits.doc( current );
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to read Lucene hits[" + current + "]", e );
+ }
+ info.clazz = DocumentBuilder.getDocumentClass( document );
+ //FIXME should check that clazz match classes but this complexify a lot the firstResult/maxResult
+ info.id = DocumentBuilder.getDocumentId( searchFactory, info.clazz, document );
+ entityInfos[current - first] = info;
+ }
+ return new Object[]{
+ session.get( info.clazz, info.id )
+ };
+ }
+
+ public Object get(int i) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Type getType(int i) {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Integer getInteger(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Long getLong(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Float getFloat(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Boolean getBoolean(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Double getDouble(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Short getShort(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Byte getByte(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Character getCharacter(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public byte[] getBinary(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public String getText(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Blob getBlob(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Clob getClob(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public String getString(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public BigDecimal getBigDecimal(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public BigInteger getBigInteger(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Date getDate(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Locale getLocale(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public Calendar getCalendar(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public TimeZone getTimeZone(int col) throws HibernateException {
+ throw new UnsupportedOperationException( "Lucene does not work on columns" );
+ }
+
+ public int getRowNumber() throws HibernateException {
+ if ( max < first ) return -1;
+ return current - first;
+ }
+
+ public boolean setRowNumber(int rowNumber) throws HibernateException {
+ if ( rowNumber >= 0 ) {
+ current = first + rowNumber;
+ }
+ else {
+ current = max + rowNumber + 1; //max row start at -1
+ }
+ return current >= first && current <= max;
+ }
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/store (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id: $
-package org.hibernate.search.store;
-
-import java.util.Properties;
-
-import org.apache.lucene.store.Directory;
-import org.hibernate.search.SearchFactory;
-
-
-/**
- * Set up and provide a Lucene <code>Directory</code>
- * <code>equals()</code> and <code>hashCode()</code> must guaranty equality
- * between two providers pointing to the same underlying Lucene Store.
- * Besides that, hashCode ordering is used to avoid deadlock when locking a directory provider.
- *
- * This class must be thread safe regarding <code>getDirectory()</code> calls
- *
- * @author Emmanuel Bernard
- * @author Sylvain Vieujot
- */
-public interface DirectoryProvider<TDirectory extends Directory> {
- /**
- * get the information to initialize the directory and build its hashCode
- */
- void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory);
-
- /**
- * Returns an initialized Lucene Directory. This method call <b>must</b> be threadsafe
- */
- TDirectory getDirectory();
-}
-
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id: $
+package org.hibernate.search.store;
+
+import java.util.Properties;
+
+import org.apache.lucene.store.Directory;
+import org.hibernate.search.SearchFactory;
+
+
+/**
+ * Set up and provide a Lucene <code>Directory</code>
+ * <code>equals()</code> and <code>hashCode()</code> must guaranty equality
+ * between two providers pointing to the same underlying Lucene Store.
+ * Besides that, hashCode ordering is used to avoid deadlock when locking a directory provider.
+ *
+ * This class must be thread safe regarding <code>getDirectory()</code> calls
+ *
+ * @author Emmanuel Bernard
+ * @author Sylvain Vieujot
+ */
+public interface DirectoryProvider<TDirectory extends Directory> {
+ /**
+ * get the information to initialize the directory and build its hashCode
+ */
+ void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory);
+
+ /**
+ * Returns an initialized Lucene Directory. This method call <b>must</b> be threadsafe
+ */
+ TDirectory getDirectory();
+}
+
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,130 +0,0 @@
-//$Id: $
-package org.hibernate.search.store;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.Properties;
-
-import org.hibernate.HibernateException;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.util.ReflectHelper;
-import org.hibernate.util.StringHelper;
-
-/**
- * Create a Lucene directory provider
- * <p/>
- * Lucene directory providers are configured through properties
- * - hibernate.search.default.* and
- * - hibernate.search.<indexname>.*
- * <p/>
- * <indexname> properties have precedence over default
- * <p/>
- * The implementation is described by
- * hibernate.search.[default|indexname].directory_provider
- * <p/>
- * If none is defined the default value is FSDirectory
- *
- * @author Emmanuel Bernard
- * @author Sylvain Vieujot
- */
-public class DirectoryProviderFactory {
- public List<DirectoryProvider<?>> providers = new ArrayList<DirectoryProvider<?>>();
- private static String LUCENE_PREFIX = "hibernate.search.";
- private static String LUCENE_DEFAULT = LUCENE_PREFIX + "default.";
- private static String DEFAULT_DIRECTORY_PROVIDER = FSDirectoryProvider.class.getName();
-
- //TODO for the public?
- public DirectoryProvider<?> createDirectoryProvider(XClass entity, Configuration cfg, SearchFactory searchFactory) {
- //get properties
- String directoryProviderName = getDirectoryProviderName( entity, cfg );
- Properties indexProps = getDirectoryProperties( cfg, directoryProviderName );
-
- //set up the directory
- String className = indexProps.getProperty( "directory_provider" );
- if ( StringHelper.isEmpty( className ) ) {
- className = DEFAULT_DIRECTORY_PROVIDER;
- }
- DirectoryProvider<?> provider = null;
- try {
- @SuppressWarnings( "unchecked" )
- Class<DirectoryProvider> directoryClass = ReflectHelper.classForName(
- className, DirectoryProviderFactory.class
- );
- provider = directoryClass.newInstance();
- }
- catch (Exception e) {
- throw new HibernateException( "Unable to instanciate directory provider: " + className, e );
- }
- try {
- provider.initialize( directoryProviderName, indexProps, searchFactory );
- }
- catch (Exception e) {
- throw new HibernateException( "Unable to initialize: " + directoryProviderName, e);
- }
- int index = providers.indexOf( provider );
- if ( index != -1 ) {
- //share the same Directory provider for the same underlying store
- return providers.get( index );
- }
- else {
- providers.add( provider );
- return provider;
- }
- }
-
- private static Properties getDirectoryProperties(Configuration cfg, String directoryProviderName) {
- Properties props = cfg.getProperties();
- String indexName = LUCENE_PREFIX + directoryProviderName;
- Properties indexProps = new Properties();
- Properties indexSpecificProps = new Properties();
- for ( Map.Entry entry : props.entrySet() ) {
- String key = (String) entry.getKey();
- if ( key.startsWith( LUCENE_DEFAULT ) ) {
- indexProps.setProperty( key.substring( LUCENE_DEFAULT.length() ), (String) entry.getValue() );
- }
- else if ( key.startsWith( indexName ) ) {
- indexSpecificProps.setProperty( key.substring( indexName.length() ), (String) entry.getValue() );
- }
- }
- indexProps.putAll( indexSpecificProps );
- return indexProps;
- }
-
- private static String getDirectoryProviderName(XClass clazz, Configuration cfg) {
- //yuk
- ReflectionManager reflectionManager = SearchFactory.getReflectionManager(cfg);
- //get the most specialized (ie subclass > superclass) non default index name
- //if none extract the name from the most generic (superclass > subclass) @Indexed class in the hierarchy
- //FIXME I'm inclined to get rid of the default value
- PersistentClass pc = cfg.getClassMapping( clazz.getName() );
- XClass rootIndex = null;
- do {
- XClass currentClazz = reflectionManager.toXClass( pc.getMappedClass() );
- Indexed indexAnn = currentClazz.getAnnotation( Indexed.class );
- if ( indexAnn != null ) {
- if ( indexAnn.index().length() != 0 ) {
- return indexAnn.index();
- }
- else {
- rootIndex = currentClazz;
- }
- }
- pc = pc.getSuperclass();
- }
- while ( pc != null );
- //there is nobody outthere with a non default @Indexed.index
- if ( rootIndex != null ) {
- return rootIndex.getName();
- }
- else {
- throw new HibernateException(
- "Trying to extract the index name from a non @Indexed class: " + clazz.getName() );
- }
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/DirectoryProviderFactory.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,130 @@
+//$Id: $
+package org.hibernate.search.store;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import org.hibernate.HibernateException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.util.StringHelper;
+
+/**
+ * Create a Lucene directory provider
+ * <p/>
+ * Lucene directory providers are configured through properties
+ * - hibernate.search.default.* and
+ * - hibernate.search.<indexname>.*
+ * <p/>
+ * <indexname> properties have precedence over default
+ * <p/>
+ * The implementation is described by
+ * hibernate.search.[default|indexname].directory_provider
+ * <p/>
+ * If none is defined the default value is FSDirectory
+ *
+ * @author Emmanuel Bernard
+ * @author Sylvain Vieujot
+ */
+public class DirectoryProviderFactory {
+ public List<DirectoryProvider<?>> providers = new ArrayList<DirectoryProvider<?>>();
+ private static String LUCENE_PREFIX = "hibernate.search.";
+ private static String LUCENE_DEFAULT = LUCENE_PREFIX + "default.";
+ private static String DEFAULT_DIRECTORY_PROVIDER = FSDirectoryProvider.class.getName();
+
+ //TODO for the public?
+ public DirectoryProvider<?> createDirectoryProvider(XClass entity, Configuration cfg, SearchFactory searchFactory) {
+ //get properties
+ String directoryProviderName = getDirectoryProviderName( entity, cfg );
+ Properties indexProps = getDirectoryProperties( cfg, directoryProviderName );
+
+ //set up the directory
+ String className = indexProps.getProperty( "directory_provider" );
+ if ( StringHelper.isEmpty( className ) ) {
+ className = DEFAULT_DIRECTORY_PROVIDER;
+ }
+ DirectoryProvider<?> provider = null;
+ try {
+ @SuppressWarnings( "unchecked" )
+ Class<DirectoryProvider> directoryClass = ReflectHelper.classForName(
+ className, DirectoryProviderFactory.class
+ );
+ provider = directoryClass.newInstance();
+ }
+ catch (Exception e) {
+ throw new HibernateException( "Unable to instanciate directory provider: " + className, e );
+ }
+ try {
+ provider.initialize( directoryProviderName, indexProps, searchFactory );
+ }
+ catch (Exception e) {
+ throw new HibernateException( "Unable to initialize: " + directoryProviderName, e);
+ }
+ int index = providers.indexOf( provider );
+ if ( index != -1 ) {
+ //share the same Directory provider for the same underlying store
+ return providers.get( index );
+ }
+ else {
+ providers.add( provider );
+ return provider;
+ }
+ }
+
+ private static Properties getDirectoryProperties(Configuration cfg, String directoryProviderName) {
+ Properties props = cfg.getProperties();
+ String indexName = LUCENE_PREFIX + directoryProviderName;
+ Properties indexProps = new Properties();
+ Properties indexSpecificProps = new Properties();
+ for ( Map.Entry entry : props.entrySet() ) {
+ String key = (String) entry.getKey();
+ if ( key.startsWith( LUCENE_DEFAULT ) ) {
+ indexProps.setProperty( key.substring( LUCENE_DEFAULT.length() ), (String) entry.getValue() );
+ }
+ else if ( key.startsWith( indexName ) ) {
+ indexSpecificProps.setProperty( key.substring( indexName.length() ), (String) entry.getValue() );
+ }
+ }
+ indexProps.putAll( indexSpecificProps );
+ return indexProps;
+ }
+
+ private static String getDirectoryProviderName(XClass clazz, Configuration cfg) {
+ //yuk
+ ReflectionManager reflectionManager = SearchFactory.getReflectionManager(cfg);
+ //get the most specialized (ie subclass > superclass) non default index name
+ //if none extract the name from the most generic (superclass > subclass) @Indexed class in the hierarchy
+ //FIXME I'm inclined to get rid of the default value
+ PersistentClass pc = cfg.getClassMapping( clazz.getName() );
+ XClass rootIndex = null;
+ do {
+ XClass currentClazz = reflectionManager.toXClass( pc.getMappedClass() );
+ Indexed indexAnn = currentClazz.getAnnotation( Indexed.class );
+ if ( indexAnn != null ) {
+ if ( indexAnn.index().length() != 0 ) {
+ return indexAnn.index();
+ }
+ else {
+ rootIndex = currentClazz;
+ }
+ }
+ pc = pc.getSuperclass();
+ }
+ while ( pc != null );
+ //there is nobody outthere with a non default @Indexed.index
+ if ( rootIndex != null ) {
+ return rootIndex.getName();
+ }
+ else {
+ throw new HibernateException(
+ "Trying to extract the index name from a non @Indexed class: " + clazz.getName() );
+ }
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,68 +0,0 @@
-//$Id: $
-package org.hibernate.search.store;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.Properties;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.store.FSDirectory;
-import org.hibernate.HibernateException;
-import org.hibernate.search.util.DirectoryProviderHelper;
-import org.hibernate.search.SearchFactory;
-
-/**
- * Use a Lucene FSDirectory
- * The base directory is represented by hibernate.search.<index>.indexBase
- * The index is created in <base directory>/<index name>
- *
- * @author Emmanuel Bernard
- * @author Sylvain Vieujot
- */
-public class FSDirectoryProvider implements DirectoryProvider<FSDirectory> {
- private FSDirectory directory;
- private static Log log = LogFactory.getLog( FSDirectoryProvider.class );
- private String indexName;
-
- public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
- File indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName, properties );
- try {
- boolean create = !indexDir.exists();
- indexName = indexDir.getCanonicalPath();
- directory = FSDirectory.getDirectory( indexName, create );
- if ( create ) {
- IndexWriter iw = new IndexWriter( directory, new StandardAnalyzer(), create );
- iw.close();
- }
- }
- catch (IOException e) {
- throw new HibernateException( "Unable to initialize index: " + directoryProviderName, e );
- }
- }
-
- public FSDirectory getDirectory() {
- return directory;
- }
-
- @Override
- public boolean equals(Object obj) {
- // this code is actually broken since the value change after initialize call
- // but from a practical POV this is fine since we only call this method
- // after initialize call
- if ( obj == this ) return true;
- if ( obj == null || !( obj instanceof FSDirectoryProvider ) ) return false;
- return indexName.equals( ( (FSDirectoryProvider) obj ).indexName );
- }
-
- @Override
- public int hashCode() {
- // this code is actually broken since the value change after initialize call
- // but from a practical POV this is fine since we only call this method
- // after initialize call
- int hash = 11;
- return 37 * hash + indexName.hashCode();
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSDirectoryProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,68 @@
+//$Id: $
+package org.hibernate.search.store;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Properties;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.store.FSDirectory;
+import org.hibernate.HibernateException;
+import org.hibernate.search.util.DirectoryProviderHelper;
+import org.hibernate.search.SearchFactory;
+
+/**
+ * Use a Lucene FSDirectory
+ * The base directory is represented by hibernate.search.<index>.indexBase
+ * The index is created in <base directory>/<index name>
+ *
+ * @author Emmanuel Bernard
+ * @author Sylvain Vieujot
+ */
+public class FSDirectoryProvider implements DirectoryProvider<FSDirectory> {
+ private FSDirectory directory;
+ private static Log log = LogFactory.getLog( FSDirectoryProvider.class );
+ private String indexName;
+
+ public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
+ File indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName, properties );
+ try {
+ boolean create = !indexDir.exists();
+ indexName = indexDir.getCanonicalPath();
+ directory = FSDirectory.getDirectory( indexName, create );
+ if ( create ) {
+ IndexWriter iw = new IndexWriter( directory, new StandardAnalyzer(), create );
+ iw.close();
+ }
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to initialize index: " + directoryProviderName, e );
+ }
+ }
+
+ public FSDirectory getDirectory() {
+ return directory;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ // this code is actually broken since the value change after initialize call
+ // but from a practical POV this is fine since we only call this method
+ // after initialize call
+ if ( obj == this ) return true;
+ if ( obj == null || !( obj instanceof FSDirectoryProvider ) ) return false;
+ return indexName.equals( ( (FSDirectoryProvider) obj ).indexName );
+ }
+
+ @Override
+ public int hashCode() {
+ // this code is actually broken since the value change after initialize call
+ // but from a practical POV this is fine since we only call this method
+ // after initialize call
+ int hash = 11;
+ return 37 * hash + indexName.hashCode();
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,203 +0,0 @@
-//$Id: $
-package org.hibernate.search.store;
-
-import java.util.Timer;
-import java.util.Properties;
-import java.util.TimerTask;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.locks.Lock;
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.lucene.store.FSDirectory;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.search.util.DirectoryProviderHelper;
-import org.hibernate.search.util.FileHelper;
-import org.hibernate.search.SearchFactory;
-import org.hibernate.HibernateException;
-
-/**
- * File based DirectoryProvider that takes care of index copy
- * The base directory is represented by hibernate.search.<index>.indexBase
- * The index is created in <base directory>/<index name>
- * The source (aka copy) directory is built from <sourceBase>/<index name>
- *
- * A copy is triggered every refresh seconds
- *
- * @author Emmanuel Bernard
- */
-//TODO rename copy?
-public class FSMasterDirectoryProvider implements DirectoryProvider<FSDirectory> {
- private static Log log = LogFactory.getLog( FSMasterDirectoryProvider.class );
- private FSDirectory directory;
- private int current;
- private String indexName;
- private Timer timer;
- private SearchFactory searchFactory;
-
- public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
- //source guessing
- String source = DirectoryProviderHelper.getSourceDirectory( "sourceBase", "source", directoryProviderName, properties );
- if ( source == null)
- throw new IllegalStateException("FSMasterDirectoryProvider requires a viable source directory");
- log.debug( "Source directory: " + source );
- File indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName, properties );
- log.debug( "Index directory: " + indexDir );
- String refreshPeriod = properties.getProperty( "refresh", "3600" );
- long period = Long.parseLong( refreshPeriod );
- log.debug("Refresh period " + period + " seconds");
- period *= 1000; //per second
- try {
- boolean create = !indexDir.exists();
- indexName = indexDir.getCanonicalPath();
- if (create) {
- log.debug( "Index directory '" + indexName + "' will be initialized");
- indexDir.mkdir();
- }
- directory = FSDirectory.getDirectory( indexName, create );
- if ( create ) {
- IndexWriter iw = new IndexWriter( directory, new StandardAnalyzer(), create );
- iw.close();
- }
-
- //copy to source
- if ( new File( source, "current1").exists() ) {
- current = 2;
- }
- else if ( new File( source, "current2").exists() ) {
- current = 1;
- }
- else {
- log.debug( "Source directory for '" + indexName + "' will be initialized");
- current = 1;
- }
- String currentString = Integer.valueOf( current ).toString();
- File subDir = new File( source, currentString );
- FileHelper.synchronize( indexDir, subDir, true );
- new File( source, "current1").delete();
- new File( source, "current2").delete();
- //TODO small hole, no file can be found here
- new File( source, "current" + currentString).createNewFile();
- log.debug( "Current directory: " + current);
- }
- catch (IOException e) {
- throw new HibernateException( "Unable to initialize index: " + directoryProviderName, e );
- }
- timer = new Timer();
- TimerTask task = new FSMasterDirectoryProvider.TriggerTask(indexName, source, this );
- timer.scheduleAtFixedRate( task, period, period );
- this.searchFactory = searchFactory;
- }
-
- public FSDirectory getDirectory() {
- return directory;
- }
-
- @Override
- public boolean equals(Object obj) {
- // this code is actually broken since the value change after initialize call
- // but from a practical POV this is fine since we only call this method
- // after initialize call
- if ( obj == this ) return true;
- if ( obj == null || !( obj instanceof FSMasterDirectoryProvider ) ) return false;
- return indexName.equals( ( (FSMasterDirectoryProvider) obj ).indexName );
- }
-
- @Override
- public int hashCode() {
- // this code is actually broken since the value change after initialize call
- // but from a practical POV this is fine since we only call this method
- // after initialize call
- int hash = 11;
- return 37 * hash + indexName.hashCode();
- }
-
- class TriggerTask extends TimerTask {
-
- private ExecutorService executor;
- private FSMasterDirectoryProvider.CopyDirectory copyTask;
-
- public TriggerTask(String source, String destination, DirectoryProvider directoryProvider) {
- executor = Executors.newSingleThreadExecutor();
- copyTask = new FSMasterDirectoryProvider.CopyDirectory( source, destination, directoryProvider );
- }
-
- public void run() {
- if (!copyTask.inProgress) {
- executor.execute( copyTask );
- }
- else {
- log.info( "Skipping directory synchronization, previous work still in progress: " + indexName);
- }
- }
- }
-
- class CopyDirectory implements Runnable {
- private String source;
- private String destination;
- private volatile boolean inProgress;
- private Lock directoryProviderLock;
- private DirectoryProvider directoryProvider;
-
- public CopyDirectory(String source, String destination, DirectoryProvider directoryProvider) {
- this.source = source;
- this.destination = destination;
- this.directoryProvider = directoryProvider;
- }
-
- public void run() {
- //TODO get rid of current and use the marker file instead?
- long start = System.currentTimeMillis();
- inProgress = true;
- if (directoryProviderLock == null) {
- directoryProviderLock = searchFactory.getLockableDirectoryProviders().get( directoryProvider );
- directoryProvider = null;
- searchFactory = null; //get rid of any useless link (help hot redeployment?)
- }
- try {
- directoryProviderLock.lock();
- int oldIndex = current;
- int index = current == 1 ? 2 : 1;
- File sourceFile = new File(source);
-
- File destinationFile = new File(destination, Integer.valueOf(index).toString() );
- //TODO make smart a parameter
- try {
- log.trace("Copying " + sourceFile + " into " + destinationFile);
- FileHelper.synchronize( sourceFile, destinationFile, true);
- current = index;
- }
- catch (IOException e) {
- //don't change current
- log.error( "Unable to synchronize source of " + indexName, e);
- inProgress = false;
- return;
- }
- if ( ! new File(destination, "current" + oldIndex).delete() ) {
- log.warn( "Unable to remove previous marker file from source of " + indexName );
- }
- try {
- new File(destination, "current" + index).createNewFile();
- }
- catch( IOException e ) {
- log.warn( "Unable to create current marker in source of " + indexName, e );
- }
- }
- finally {
- directoryProviderLock.unlock();
- inProgress = false;
- }
- log.trace( "Copy for " + indexName + " took " + (System.currentTimeMillis() - start) + " ms");
- }
- }
-
- public void finalize() throws Throwable {
- super.finalize();
- timer.cancel();
- //TODO find a better cycle from Hibernate core
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSMasterDirectoryProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,203 @@
+//$Id: $
+package org.hibernate.search.store;
+
+import java.util.Timer;
+import java.util.Properties;
+import java.util.TimerTask;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.locks.Lock;
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.search.util.DirectoryProviderHelper;
+import org.hibernate.search.util.FileHelper;
+import org.hibernate.search.SearchFactory;
+import org.hibernate.HibernateException;
+
+/**
+ * File based DirectoryProvider that takes care of index copy
+ * The base directory is represented by hibernate.search.<index>.indexBase
+ * The index is created in <base directory>/<index name>
+ * The source (aka copy) directory is built from <sourceBase>/<index name>
+ *
+ * A copy is triggered every refresh seconds
+ *
+ * @author Emmanuel Bernard
+ */
+//TODO rename copy?
+public class FSMasterDirectoryProvider implements DirectoryProvider<FSDirectory> {
+ private static Log log = LogFactory.getLog( FSMasterDirectoryProvider.class );
+ private FSDirectory directory;
+ private int current;
+ private String indexName;
+ private Timer timer;
+ private SearchFactory searchFactory;
+
+ public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
+ //source guessing
+ String source = DirectoryProviderHelper.getSourceDirectory( "sourceBase", "source", directoryProviderName, properties );
+ if ( source == null)
+ throw new IllegalStateException("FSMasterDirectoryProvider requires a viable source directory");
+ log.debug( "Source directory: " + source );
+ File indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName, properties );
+ log.debug( "Index directory: " + indexDir );
+ String refreshPeriod = properties.getProperty( "refresh", "3600" );
+ long period = Long.parseLong( refreshPeriod );
+ log.debug("Refresh period " + period + " seconds");
+ period *= 1000; //per second
+ try {
+ boolean create = !indexDir.exists();
+ indexName = indexDir.getCanonicalPath();
+ if (create) {
+ log.debug( "Index directory '" + indexName + "' will be initialized");
+ indexDir.mkdir();
+ }
+ directory = FSDirectory.getDirectory( indexName, create );
+ if ( create ) {
+ IndexWriter iw = new IndexWriter( directory, new StandardAnalyzer(), create );
+ iw.close();
+ }
+
+ //copy to source
+ if ( new File( source, "current1").exists() ) {
+ current = 2;
+ }
+ else if ( new File( source, "current2").exists() ) {
+ current = 1;
+ }
+ else {
+ log.debug( "Source directory for '" + indexName + "' will be initialized");
+ current = 1;
+ }
+ String currentString = Integer.valueOf( current ).toString();
+ File subDir = new File( source, currentString );
+ FileHelper.synchronize( indexDir, subDir, true );
+ new File( source, "current1").delete();
+ new File( source, "current2").delete();
+ //TODO small hole, no file can be found here
+ new File( source, "current" + currentString).createNewFile();
+ log.debug( "Current directory: " + current);
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to initialize index: " + directoryProviderName, e );
+ }
+ timer = new Timer();
+ TimerTask task = new FSMasterDirectoryProvider.TriggerTask(indexName, source, this );
+ timer.scheduleAtFixedRate( task, period, period );
+ this.searchFactory = searchFactory;
+ }
+
+ public FSDirectory getDirectory() {
+ return directory;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ // this code is actually broken since the value change after initialize call
+ // but from a practical POV this is fine since we only call this method
+ // after initialize call
+ if ( obj == this ) return true;
+ if ( obj == null || !( obj instanceof FSMasterDirectoryProvider ) ) return false;
+ return indexName.equals( ( (FSMasterDirectoryProvider) obj ).indexName );
+ }
+
+ @Override
+ public int hashCode() {
+ // this code is actually broken since the value change after initialize call
+ // but from a practical POV this is fine since we only call this method
+ // after initialize call
+ int hash = 11;
+ return 37 * hash + indexName.hashCode();
+ }
+
+ class TriggerTask extends TimerTask {
+
+ private ExecutorService executor;
+ private FSMasterDirectoryProvider.CopyDirectory copyTask;
+
+ public TriggerTask(String source, String destination, DirectoryProvider directoryProvider) {
+ executor = Executors.newSingleThreadExecutor();
+ copyTask = new FSMasterDirectoryProvider.CopyDirectory( source, destination, directoryProvider );
+ }
+
+ public void run() {
+ if (!copyTask.inProgress) {
+ executor.execute( copyTask );
+ }
+ else {
+ log.info( "Skipping directory synchronization, previous work still in progress: " + indexName);
+ }
+ }
+ }
+
+ class CopyDirectory implements Runnable {
+ private String source;
+ private String destination;
+ private volatile boolean inProgress;
+ private Lock directoryProviderLock;
+ private DirectoryProvider directoryProvider;
+
+ public CopyDirectory(String source, String destination, DirectoryProvider directoryProvider) {
+ this.source = source;
+ this.destination = destination;
+ this.directoryProvider = directoryProvider;
+ }
+
+ public void run() {
+ //TODO get rid of current and use the marker file instead?
+ long start = System.currentTimeMillis();
+ inProgress = true;
+ if (directoryProviderLock == null) {
+ directoryProviderLock = searchFactory.getLockableDirectoryProviders().get( directoryProvider );
+ directoryProvider = null;
+ searchFactory = null; //get rid of any useless link (help hot redeployment?)
+ }
+ try {
+ directoryProviderLock.lock();
+ int oldIndex = current;
+ int index = current == 1 ? 2 : 1;
+ File sourceFile = new File(source);
+
+ File destinationFile = new File(destination, Integer.valueOf(index).toString() );
+ //TODO make smart a parameter
+ try {
+ log.trace("Copying " + sourceFile + " into " + destinationFile);
+ FileHelper.synchronize( sourceFile, destinationFile, true);
+ current = index;
+ }
+ catch (IOException e) {
+ //don't change current
+ log.error( "Unable to synchronize source of " + indexName, e);
+ inProgress = false;
+ return;
+ }
+ if ( ! new File(destination, "current" + oldIndex).delete() ) {
+ log.warn( "Unable to remove previous marker file from source of " + indexName );
+ }
+ try {
+ new File(destination, "current" + index).createNewFile();
+ }
+ catch( IOException e ) {
+ log.warn( "Unable to create current marker in source of " + indexName, e );
+ }
+ }
+ finally {
+ directoryProviderLock.unlock();
+ inProgress = false;
+ }
+ log.trace( "Copy for " + indexName + " took " + (System.currentTimeMillis() - start) + " ms");
+ }
+ }
+
+ public void finalize() throws Throwable {
+ super.finalize();
+ timer.cancel();
+ //TODO find a better cycle from Hibernate core
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,239 +0,0 @@
-//$Id: $
-package org.hibernate.search.store;
-
-import java.util.Properties;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.io.File;
-import java.io.IOException;
-
-import org.apache.lucene.store.FSDirectory;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.HibernateException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.search.util.FileHelper;
-import org.hibernate.search.util.DirectoryProviderHelper;
-import org.hibernate.search.SearchFactory;
-
-/**
- * File based directory provider that takes care of geting a version of the index
- * from a given source
- * The base directory is represented by hibernate.search.<index>.indexBase
- * The index is created in <base directory>/<index name>
- * The source (aka copy) directory is built from <sourceBase>/<index name>
- *
- * A copy is triggered every refresh seconds
- *
- * @author Emmanuel Bernard
- */
-public class FSSlaveDirectoryProvider implements DirectoryProvider<FSDirectory> {
- private static Log log = LogFactory.getLog( FSSlaveDirectoryProvider.class );
- private FSDirectory directory1;
- private FSDirectory directory2;
- private int current;
- private String indexName;
- private Timer timer;
-
- public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
- //source guessing
- String source = DirectoryProviderHelper.getSourceDirectory( "sourceBase", "source", directoryProviderName, properties );
- if (source == null)
- throw new IllegalStateException("FSSlaveDirectoryProvider requires a viable source directory");
- if ( ! new File(source, "current1").exists() && ! new File(source, "current2").exists() ) {
- throw new IllegalStateException("No current marker in source directory");
- }
- log.debug( "Source directory: " + source );
- File indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName, properties );
- log.debug( "Index directory: " + indexDir.getPath() );
- String refreshPeriod = properties.getProperty( "refresh", "3600" );
- long period = Long.parseLong( refreshPeriod );
- log.debug("Refresh period " + period + " seconds");
- period *= 1000; //per second
- try {
- boolean create = !indexDir.exists();
- indexName = indexDir.getCanonicalPath();
- if (create) {
- indexDir.mkdir();
- log.debug("Initializing index directory " + indexName);
- }
-
- File subDir = new File( indexName, "1" );
- create = ! subDir.exists();
- directory1 = FSDirectory.getDirectory( subDir.getCanonicalPath(), create );
- if ( create ) {
- IndexWriter iw = new IndexWriter( directory1, new StandardAnalyzer(), create );
- iw.close();
- }
-
- subDir = new File( indexName, "2" );
- create = ! subDir.exists();
- directory2 = FSDirectory.getDirectory( subDir.getCanonicalPath(), create );
- if ( create ) {
- IndexWriter iw = new IndexWriter( directory2, new StandardAnalyzer(), create );
- iw.close();
- }
- File currentMarker = new File(indexName, "current1");
- File current2Marker = new File(indexName, "current2");
- if ( currentMarker.exists() ) {
- current = 1;
- }
- else if ( current2Marker.exists() ) {
- current = 2;
- }
- else {
- //no default
- log.debug( "Setting directory 1 as current");
- current = 1;
- File sourceFile = new File(source);
- File destinationFile = new File(indexName, Integer.valueOf(current).toString() );
- int sourceCurrent;
- if ( new File(sourceFile, "current1").exists() ) {
- sourceCurrent = 1;
- }
- else if ( new File(sourceFile, "current2").exists() ) {
- sourceCurrent = 2;
- }
- else {
- throw new AssertionFailure("No current file marker found in source directory: " + source);
- }
- try {
- FileHelper.synchronize( new File(sourceFile, String.valueOf(sourceCurrent) ), destinationFile, true);
- }
- catch (IOException e) {
- throw new HibernateException("Umable to synchonize directory: " + indexName, e);
- }
- if (! currentMarker.createNewFile() ) {
- throw new HibernateException("Unable to create the directory marker file: " + indexName);
- }
- }
- log.debug( "Current directory: " + current);
- }
- catch (IOException e) {
- throw new HibernateException( "Unable to initialize index: " + directoryProviderName, e );
- }
- timer = new Timer();
- TimerTask task = new TriggerTask(source, indexName);
- timer.scheduleAtFixedRate( task, period, period );
- }
-
- public FSDirectory getDirectory() {
- if (current == 1) {
- return directory1;
- }
- else if (current == 2) {
- return directory2;
- }
- else {
- throw new AssertionFailure("Illegal current directory: " + current);
- }
- }
-
- @Override
- public boolean equals(Object obj) {
- // this code is actually broken since the value change after initialize call
- // but from a practical POV this is fine since we only call this method
- // after initialize call
- if ( obj == this ) return true;
- if ( obj == null || !( obj instanceof FSSlaveDirectoryProvider ) ) return false;
- return indexName.equals( ( (FSSlaveDirectoryProvider) obj ).indexName );
- }
-
- @Override
- public int hashCode() {
- // this code is actually broken since the value change after initialize call
- // but from a practical POV this is fine since we only call this method
- // after initialize call
- int hash = 11;
- return 37 * hash + indexName.hashCode();
- }
-
- class TriggerTask extends TimerTask {
-
- private ExecutorService executor;
- private CopyDirectory copyTask;
-
- public TriggerTask(String source, String destination) {
- executor = Executors.newSingleThreadExecutor();
- copyTask = new CopyDirectory( source, destination );
- }
-
- public void run() {
- if (!copyTask.inProgress) {
- executor.execute( copyTask );
- }
- else {
- log.trace( "Skipping directory synchronization, previous work still in progress: " + indexName);
- }
- }
- }
-
- class CopyDirectory implements Runnable {
- private String source;
- private String destination;
- private volatile boolean inProgress;
-
- public CopyDirectory(String source, String destination) {
- this.source = source;
- this.destination = destination;
- }
-
- public void run() {
- long start = System.currentTimeMillis();
- try {
- inProgress = true;
- int oldIndex = current;
- int index = current == 1 ? 2 : 1;
- File sourceFile;
- if ( new File( source, "current1" ).exists() ) {
- sourceFile = new File(source, "1");
- }
- else if ( new File( source, "current2" ).exists() ) {
- sourceFile = new File(source, "2");
- }
- else {
- log.error("Unable to determine current in source directory");
- inProgress = false;
- return;
- }
-
- File destinationFile = new File(destination, Integer.valueOf(index).toString() );
- //TODO make smart a parameter
- try {
- log.trace("Copying " + sourceFile + " into " + destinationFile);
- FileHelper.synchronize( sourceFile, destinationFile, true);
- current = index;
- }
- catch (IOException e) {
- //don't change current
- log.error( "Unable to synchronize " + indexName, e);
- inProgress = false;
- return;
- }
- if ( ! new File(indexName, "current" + oldIndex).delete() ) {
- log.warn( "Unable to remove previous marker file in " + indexName );
- }
- try {
- new File(indexName, "current" + index).createNewFile();
- }
- catch( IOException e ) {
- log.warn( "Unable to create current marker file in " + indexName, e );
- }
- }
- finally {
- inProgress = false;
- }
- log.trace( "Copy for " + indexName + " took " + (System.currentTimeMillis() - start) + " ms");
- }
- }
-
- public void finalize() throws Throwable {
- super.finalize();
- timer.cancel();
- //TODO find a better cycle from Hibernate core
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/FSSlaveDirectoryProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,239 @@
+//$Id: $
+package org.hibernate.search.store;
+
+import java.util.Properties;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.io.File;
+import java.io.IOException;
+
+import org.apache.lucene.store.FSDirectory;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.HibernateException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.search.util.FileHelper;
+import org.hibernate.search.util.DirectoryProviderHelper;
+import org.hibernate.search.SearchFactory;
+
+/**
+ * File based directory provider that takes care of geting a version of the index
+ * from a given source
+ * The base directory is represented by hibernate.search.<index>.indexBase
+ * The index is created in <base directory>/<index name>
+ * The source (aka copy) directory is built from <sourceBase>/<index name>
+ *
+ * A copy is triggered every refresh seconds
+ *
+ * @author Emmanuel Bernard
+ */
+public class FSSlaveDirectoryProvider implements DirectoryProvider<FSDirectory> {
+ private static Log log = LogFactory.getLog( FSSlaveDirectoryProvider.class );
+ private FSDirectory directory1;
+ private FSDirectory directory2;
+ private int current;
+ private String indexName;
+ private Timer timer;
+
+ public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
+ //source guessing
+ String source = DirectoryProviderHelper.getSourceDirectory( "sourceBase", "source", directoryProviderName, properties );
+ if (source == null)
+ throw new IllegalStateException("FSSlaveDirectoryProvider requires a viable source directory");
+ if ( ! new File(source, "current1").exists() && ! new File(source, "current2").exists() ) {
+ throw new IllegalStateException("No current marker in source directory");
+ }
+ log.debug( "Source directory: " + source );
+ File indexDir = DirectoryProviderHelper.determineIndexDir( directoryProviderName, properties );
+ log.debug( "Index directory: " + indexDir.getPath() );
+ String refreshPeriod = properties.getProperty( "refresh", "3600" );
+ long period = Long.parseLong( refreshPeriod );
+ log.debug("Refresh period " + period + " seconds");
+ period *= 1000; //per second
+ try {
+ boolean create = !indexDir.exists();
+ indexName = indexDir.getCanonicalPath();
+ if (create) {
+ indexDir.mkdir();
+ log.debug("Initializing index directory " + indexName);
+ }
+
+ File subDir = new File( indexName, "1" );
+ create = ! subDir.exists();
+ directory1 = FSDirectory.getDirectory( subDir.getCanonicalPath(), create );
+ if ( create ) {
+ IndexWriter iw = new IndexWriter( directory1, new StandardAnalyzer(), create );
+ iw.close();
+ }
+
+ subDir = new File( indexName, "2" );
+ create = ! subDir.exists();
+ directory2 = FSDirectory.getDirectory( subDir.getCanonicalPath(), create );
+ if ( create ) {
+ IndexWriter iw = new IndexWriter( directory2, new StandardAnalyzer(), create );
+ iw.close();
+ }
+ File currentMarker = new File(indexName, "current1");
+ File current2Marker = new File(indexName, "current2");
+ if ( currentMarker.exists() ) {
+ current = 1;
+ }
+ else if ( current2Marker.exists() ) {
+ current = 2;
+ }
+ else {
+ //no default
+ log.debug( "Setting directory 1 as current");
+ current = 1;
+ File sourceFile = new File(source);
+ File destinationFile = new File(indexName, Integer.valueOf(current).toString() );
+ int sourceCurrent;
+ if ( new File(sourceFile, "current1").exists() ) {
+ sourceCurrent = 1;
+ }
+ else if ( new File(sourceFile, "current2").exists() ) {
+ sourceCurrent = 2;
+ }
+ else {
+ throw new AssertionFailure("No current file marker found in source directory: " + source);
+ }
+ try {
+ FileHelper.synchronize( new File(sourceFile, String.valueOf(sourceCurrent) ), destinationFile, true);
+ }
+ catch (IOException e) {
+ throw new HibernateException("Umable to synchonize directory: " + indexName, e);
+ }
+ if (! currentMarker.createNewFile() ) {
+ throw new HibernateException("Unable to create the directory marker file: " + indexName);
+ }
+ }
+ log.debug( "Current directory: " + current);
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to initialize index: " + directoryProviderName, e );
+ }
+ timer = new Timer();
+ TimerTask task = new TriggerTask(source, indexName);
+ timer.scheduleAtFixedRate( task, period, period );
+ }
+
+ public FSDirectory getDirectory() {
+ if (current == 1) {
+ return directory1;
+ }
+ else if (current == 2) {
+ return directory2;
+ }
+ else {
+ throw new AssertionFailure("Illegal current directory: " + current);
+ }
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ // this code is actually broken since the value change after initialize call
+ // but from a practical POV this is fine since we only call this method
+ // after initialize call
+ if ( obj == this ) return true;
+ if ( obj == null || !( obj instanceof FSSlaveDirectoryProvider ) ) return false;
+ return indexName.equals( ( (FSSlaveDirectoryProvider) obj ).indexName );
+ }
+
+ @Override
+ public int hashCode() {
+ // this code is actually broken since the value change after initialize call
+ // but from a practical POV this is fine since we only call this method
+ // after initialize call
+ int hash = 11;
+ return 37 * hash + indexName.hashCode();
+ }
+
+ class TriggerTask extends TimerTask {
+
+ private ExecutorService executor;
+ private CopyDirectory copyTask;
+
+ public TriggerTask(String source, String destination) {
+ executor = Executors.newSingleThreadExecutor();
+ copyTask = new CopyDirectory( source, destination );
+ }
+
+ public void run() {
+ if (!copyTask.inProgress) {
+ executor.execute( copyTask );
+ }
+ else {
+ log.trace( "Skipping directory synchronization, previous work still in progress: " + indexName);
+ }
+ }
+ }
+
+ class CopyDirectory implements Runnable {
+ private String source;
+ private String destination;
+ private volatile boolean inProgress;
+
+ public CopyDirectory(String source, String destination) {
+ this.source = source;
+ this.destination = destination;
+ }
+
+ public void run() {
+ long start = System.currentTimeMillis();
+ try {
+ inProgress = true;
+ int oldIndex = current;
+ int index = current == 1 ? 2 : 1;
+ File sourceFile;
+ if ( new File( source, "current1" ).exists() ) {
+ sourceFile = new File(source, "1");
+ }
+ else if ( new File( source, "current2" ).exists() ) {
+ sourceFile = new File(source, "2");
+ }
+ else {
+ log.error("Unable to determine current in source directory");
+ inProgress = false;
+ return;
+ }
+
+ File destinationFile = new File(destination, Integer.valueOf(index).toString() );
+ //TODO make smart a parameter
+ try {
+ log.trace("Copying " + sourceFile + " into " + destinationFile);
+ FileHelper.synchronize( sourceFile, destinationFile, true);
+ current = index;
+ }
+ catch (IOException e) {
+ //don't change current
+ log.error( "Unable to synchronize " + indexName, e);
+ inProgress = false;
+ return;
+ }
+ if ( ! new File(indexName, "current" + oldIndex).delete() ) {
+ log.warn( "Unable to remove previous marker file in " + indexName );
+ }
+ try {
+ new File(indexName, "current" + index).createNewFile();
+ }
+ catch( IOException e ) {
+ log.warn( "Unable to create current marker file in " + indexName, e );
+ }
+ }
+ finally {
+ inProgress = false;
+ }
+ log.trace( "Copy for " + indexName + " took " + (System.currentTimeMillis() - start) + " ms");
+ }
+ }
+
+ public void finalize() throws Throwable {
+ super.finalize();
+ timer.cancel();
+ //TODO find a better cycle from Hibernate core
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,59 +0,0 @@
-//$Id: $
-package org.hibernate.search.store;
-
-import java.io.IOException;
-import java.util.Properties;
-
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.lucene.index.IndexWriter;
-import org.apache.lucene.store.RAMDirectory;
-import org.hibernate.HibernateException;
-import org.hibernate.search.SearchFactory;
-
-/**
- * Use a Lucene RAMDirectory
- *
- * @author Emmanuel Bernard
- * @author Sylvain Vieujot
- */
-public class RAMDirectoryProvider implements DirectoryProvider<RAMDirectory> {
-
- private RAMDirectory directory;
- private String indexName;
-
- public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
- indexName = directoryProviderName;
- directory = new RAMDirectory();
- try {
- IndexWriter iw = new IndexWriter( directory, new StandardAnalyzer(), true );
- iw.close();
- }
- catch (IOException e) {
- throw new HibernateException( "Unable to initialize index: " + indexName, e );
- }
- }
-
- public RAMDirectory getDirectory() {
- return directory;
- }
-
- @Override
- public boolean equals(Object obj) {
- // this code is actually broken since the value change after initialize call
- // but from a practical POV this is fine since we only call this method
- // after initialize call
- if ( obj == this ) return true;
- if ( obj == null || !( obj instanceof RAMDirectoryProvider ) ) return false;
- return indexName.equals( ( (RAMDirectoryProvider) obj ).indexName );
- }
-
- @Override
- public int hashCode() {
- // this code is actually broken since the value change after initialize call
- // but from a practical POV this is fine since we only call this method
- // after initialize call
- int hash = 7;
- return 29 * hash + indexName.hashCode();
- }
-
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/store/RAMDirectoryProvider.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,59 @@
+//$Id: $
+package org.hibernate.search.store;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.index.IndexWriter;
+import org.apache.lucene.store.RAMDirectory;
+import org.hibernate.HibernateException;
+import org.hibernate.search.SearchFactory;
+
+/**
+ * Use a Lucene RAMDirectory
+ *
+ * @author Emmanuel Bernard
+ * @author Sylvain Vieujot
+ */
+public class RAMDirectoryProvider implements DirectoryProvider<RAMDirectory> {
+
+ private RAMDirectory directory;
+ private String indexName;
+
+ public void initialize(String directoryProviderName, Properties properties, SearchFactory searchFactory) {
+ indexName = directoryProviderName;
+ directory = new RAMDirectory();
+ try {
+ IndexWriter iw = new IndexWriter( directory, new StandardAnalyzer(), true );
+ iw.close();
+ }
+ catch (IOException e) {
+ throw new HibernateException( "Unable to initialize index: " + indexName, e );
+ }
+ }
+
+ public RAMDirectory getDirectory() {
+ return directory;
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ // this code is actually broken since the value change after initialize call
+ // but from a practical POV this is fine since we only call this method
+ // after initialize call
+ if ( obj == this ) return true;
+ if ( obj == null || !( obj instanceof RAMDirectoryProvider ) ) return false;
+ return indexName.equals( ( (RAMDirectoryProvider) obj ).indexName );
+ }
+
+ @Override
+ public int hashCode() {
+ // this code is actually broken since the value change after initialize call
+ // but from a practical POV this is fine since we only call this method
+ // after initialize call
+ int hash = 7;
+ return 29 * hash + indexName.hashCode();
+ }
+
+}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/util (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util)
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/util/BinderHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util/BinderHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/BinderHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id: $
-package org.hibernate.search.util;
-
-import org.hibernate.annotations.common.reflection.XMember;
-import org.hibernate.util.StringHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class BinderHelper {
-
- private BinderHelper() {
- }
-
- /**
- * Get attribute name out of member unless overriden by <code>name</code>
- */
- public static String getAttributeName(XMember member, String name) {
- return StringHelper.isNotEmpty( name ) ?
- name :
- member.getName(); //explicit field name
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/util/BinderHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util/BinderHelper.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/util/BinderHelper.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/BinderHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id: $
+package org.hibernate.search.util;
+
+import org.hibernate.annotations.common.reflection.XMember;
+import org.hibernate.util.StringHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class BinderHelper {
+
+ private BinderHelper() {
+ }
+
+ /**
+ * Get attribute name out of member unless overriden by <code>name</code>
+ */
+ public static String getAttributeName(XMember member, String name) {
+ return StringHelper.isNotEmpty( name ) ?
+ name :
+ member.getName(); //explicit field name
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: $
-package org.hibernate.search.util;
-
-import org.hibernate.HibernateException;
-import org.hibernate.Session;
-import org.hibernate.engine.SessionImplementor;
-import org.hibernate.event.PostInsertEventListener;
-import org.hibernate.search.event.FullTextIndexEventListener;
-import org.hibernate.search.SearchFactory;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class ContextHelper {
-
- public static SearchFactory getSearchFactory(Session session) {
- return getSearchFactoryBySFI( (SessionImplementor) session );
- }
-
-
- public static SearchFactory getSearchFactoryBySFI(SessionImplementor session) {
- PostInsertEventListener[] listeners = session.getListeners().getPostInsertEventListeners();
- FullTextIndexEventListener listener = null;
- //FIXME this sucks since we mandante the event listener use
- for ( PostInsertEventListener candidate : listeners ) {
- if ( candidate instanceof FullTextIndexEventListener ) {
- listener = (FullTextIndexEventListener) candidate;
- break;
- }
- }
- if ( listener == null ) throw new HibernateException( "Lucene event listener not initialized" );
- return listener.getSearchFactory();
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/ContextHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.search.util;
+
+import org.hibernate.HibernateException;
+import org.hibernate.Session;
+import org.hibernate.engine.SessionImplementor;
+import org.hibernate.event.PostInsertEventListener;
+import org.hibernate.search.event.FullTextIndexEventListener;
+import org.hibernate.search.SearchFactory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class ContextHelper {
+
+ public static SearchFactory getSearchFactory(Session session) {
+ return getSearchFactoryBySFI( (SessionImplementor) session );
+ }
+
+
+ public static SearchFactory getSearchFactoryBySFI(SessionImplementor session) {
+ PostInsertEventListener[] listeners = session.getListeners().getPostInsertEventListeners();
+ FullTextIndexEventListener listener = null;
+ //FIXME this sucks since we mandante the event listener use
+ for ( PostInsertEventListener candidate : listeners ) {
+ if ( candidate instanceof FullTextIndexEventListener ) {
+ listener = (FullTextIndexEventListener) candidate;
+ break;
+ }
+ }
+ if ( listener == null ) throw new HibernateException( "Lucene event listener not initialized" );
+ return listener.getSearchFactory();
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/util/DirectoryProviderHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util/DirectoryProviderHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/DirectoryProviderHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,80 +0,0 @@
-//$Id: $
-package org.hibernate.search.util;
-
-import java.util.Properties;
-import java.io.File;
-import java.io.IOException;
-import java.text.MessageFormat;
-
-import org.hibernate.HibernateException;
-import org.hibernate.AssertionFailure;
-import org.hibernate.search.SearchException;
-import org.hibernate.annotations.common.util.StringHelper;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DirectoryProviderHelper {
- private static Log log = LogFactory.getLog( DirectoryProviderHelper.class );
- /**
- * Build a directory name out of a root and relative path, guessing the significant part
- * and checking for the file availability
- *
- */
- public static String getSourceDirectory(String rootPropertyName, String relativePropertyName,
- String directoryProviderName, Properties properties) {
- //TODO check that it's a directory
- String root = properties.getProperty( rootPropertyName );
- String relative = properties.getProperty( relativePropertyName );
- if ( log.isTraceEnabled() ) {
- log.trace(
- "Guess source directory from " + rootPropertyName + " " + root != null ? root : "<null>"
- + " and " + relativePropertyName + " " + relative != null ? relative : "<null>"
- );
- }
- if (relative == null) relative = directoryProviderName;
- if ( StringHelper.isEmpty( root ) ) {
- log.debug( "No root directory, go with relative " + relative );
- File sourceFile = new File(relative);
- if ( ! sourceFile.exists() ) {
- throw new HibernateException("Unable to read source directory: " + relative);
- }
- //else keep source as it
- }
- else {
- File rootDir = new File(root);
- if ( rootDir.exists() ) {
- File sourceFile = new File(root, relative);
- if (! sourceFile.exists() ) sourceFile.mkdir();
- log.debug( "Get directory from root + relative");
- try {
- relative = sourceFile.getCanonicalPath();
- }
- catch (IOException e) {
- throw new AssertionFailure("Unable to get canonical path: " + root + " + " + relative);
- }
- }
- else {
- throw new SearchException(rootPropertyName + " does not exist");
- }
- }
- return relative;
- }
-
- public static File determineIndexDir(String directoryProviderName, Properties properties) {
- String indexBase = properties.getProperty( "indexBase", "." );
- File indexDir = new File( indexBase );
- if ( !( indexDir.exists() && indexDir.isDirectory() ) ) {
- //TODO create the directory?
- throw new HibernateException( MessageFormat.format( "Index directory does not exists: {0}", indexBase ) );
- }
- if ( !indexDir.canWrite() ) {
- throw new HibernateException( "Cannot write into index directory: " + indexBase );
- }
-
- indexDir = new File( indexDir, directoryProviderName );
- return indexDir;
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/util/DirectoryProviderHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util/DirectoryProviderHelper.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/util/DirectoryProviderHelper.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/DirectoryProviderHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,80 @@
+//$Id: $
+package org.hibernate.search.util;
+
+import java.util.Properties;
+import java.io.File;
+import java.io.IOException;
+import java.text.MessageFormat;
+
+import org.hibernate.HibernateException;
+import org.hibernate.AssertionFailure;
+import org.hibernate.search.SearchException;
+import org.hibernate.annotations.common.util.StringHelper;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DirectoryProviderHelper {
+ private static Log log = LogFactory.getLog( DirectoryProviderHelper.class );
+ /**
+ * Build a directory name out of a root and relative path, guessing the significant part
+ * and checking for the file availability
+ *
+ */
+ public static String getSourceDirectory(String rootPropertyName, String relativePropertyName,
+ String directoryProviderName, Properties properties) {
+ //TODO check that it's a directory
+ String root = properties.getProperty( rootPropertyName );
+ String relative = properties.getProperty( relativePropertyName );
+ if ( log.isTraceEnabled() ) {
+ log.trace(
+ "Guess source directory from " + rootPropertyName + " " + root != null ? root : "<null>"
+ + " and " + relativePropertyName + " " + relative != null ? relative : "<null>"
+ );
+ }
+ if (relative == null) relative = directoryProviderName;
+ if ( StringHelper.isEmpty( root ) ) {
+ log.debug( "No root directory, go with relative " + relative );
+ File sourceFile = new File(relative);
+ if ( ! sourceFile.exists() ) {
+ throw new HibernateException("Unable to read source directory: " + relative);
+ }
+ //else keep source as it
+ }
+ else {
+ File rootDir = new File(root);
+ if ( rootDir.exists() ) {
+ File sourceFile = new File(root, relative);
+ if (! sourceFile.exists() ) sourceFile.mkdir();
+ log.debug( "Get directory from root + relative");
+ try {
+ relative = sourceFile.getCanonicalPath();
+ }
+ catch (IOException e) {
+ throw new AssertionFailure("Unable to get canonical path: " + root + " + " + relative);
+ }
+ }
+ else {
+ throw new SearchException(rootPropertyName + " does not exist");
+ }
+ }
+ return relative;
+ }
+
+ public static File determineIndexDir(String directoryProviderName, Properties properties) {
+ String indexBase = properties.getProperty( "indexBase", "." );
+ File indexDir = new File( indexBase );
+ if ( !( indexDir.exists() && indexDir.isDirectory() ) ) {
+ //TODO create the directory?
+ throw new HibernateException( MessageFormat.format( "Index directory does not exists: {0}", indexBase ) );
+ }
+ if ( !indexDir.canWrite() ) {
+ throw new HibernateException( "Cannot write into index directory: " + indexBase );
+ }
+
+ indexDir = new File( indexDir, directoryProviderName );
+ return indexDir;
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/util/FileHelper.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util/FileHelper.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/FileHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-//$Id: $
-package org.hibernate.search.util;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.util.Set;
-import java.util.HashSet;
-import java.util.Arrays;
-import java.nio.channels.FileChannel;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class FileHelper {
- private static final int FAT_PRECISION = 2000;
-
- public static void synchronize(File source, File destination, boolean smart) throws IOException {
- if ( source.isDirectory() ) {
- if ( ! destination.exists() ) {
- destination.mkdirs();
- }
- else if ( ! destination.isDirectory() ) {
- throw new IOException("Source and Destination not of the same type:"
- + source.getCanonicalPath() + " , " + destination.getCanonicalPath() );
- }
- String[] sources = source.list();
- Set<String> srcNames = new HashSet<String>( Arrays.asList( sources ) );
- String[] dests = destination.list();
-
- //delete files not present in source
- for (String fileName : dests) {
- if ( ! srcNames.contains( fileName ) ) {
- delete( new File(destination, fileName) );
- }
- }
- //copy each file from source
- for (String fileName : sources) {
- File srcFile = new File(source, fileName);
- File destFile = new File(destination, fileName);
- synchronize( srcFile, destFile, smart );
- }
- }
- else {
- if ( destination.exists() && destination.isDirectory() ) {
- delete( destination );
- }
- if ( destination.exists() ) {
- long sts = source.lastModified() / FAT_PRECISION;
- long dts = destination.lastModified() / FAT_PRECISION;
- //do not copy if smart and same timestamp and same length
- if ( !smart || sts == 0 || sts != dts || source.length() != destination.length() ) {
- copyFile(source, destination);
- }
- }
- else {
- copyFile(source, destination);
- }
- }
- }
-
- private static void copyFile(File srcFile, File destFile) throws IOException {
- FileInputStream is = null;
- FileOutputStream os = null;
- try {
- is = new FileInputStream(srcFile);
- FileChannel iChannel = is.getChannel();
- os = new FileOutputStream( destFile, false );
- FileChannel oChannel = os.getChannel();
- oChannel.transferFrom( iChannel, 0, srcFile.length() );
- }
- finally {
- if (is != null) is.close();
- if (os != null) os.close();
- }
- destFile.setLastModified( srcFile.lastModified() );
- }
-
- public static void delete(File file) {
- if ( file.isDirectory() ) {
- for ( File subFile : file.listFiles() ) delete( subFile );
- }
- if ( file.exists() ) file.delete();
- }
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/util/FileHelper.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util/FileHelper.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/util/FileHelper.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/FileHelper.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+//$Id: $
+package org.hibernate.search.util;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.util.Set;
+import java.util.HashSet;
+import java.util.Arrays;
+import java.nio.channels.FileChannel;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class FileHelper {
+ private static final int FAT_PRECISION = 2000;
+
+ public static void synchronize(File source, File destination, boolean smart) throws IOException {
+ if ( source.isDirectory() ) {
+ if ( ! destination.exists() ) {
+ destination.mkdirs();
+ }
+ else if ( ! destination.isDirectory() ) {
+ throw new IOException("Source and Destination not of the same type:"
+ + source.getCanonicalPath() + " , " + destination.getCanonicalPath() );
+ }
+ String[] sources = source.list();
+ Set<String> srcNames = new HashSet<String>( Arrays.asList( sources ) );
+ String[] dests = destination.list();
+
+ //delete files not present in source
+ for (String fileName : dests) {
+ if ( ! srcNames.contains( fileName ) ) {
+ delete( new File(destination, fileName) );
+ }
+ }
+ //copy each file from source
+ for (String fileName : sources) {
+ File srcFile = new File(source, fileName);
+ File destFile = new File(destination, fileName);
+ synchronize( srcFile, destFile, smart );
+ }
+ }
+ else {
+ if ( destination.exists() && destination.isDirectory() ) {
+ delete( destination );
+ }
+ if ( destination.exists() ) {
+ long sts = source.lastModified() / FAT_PRECISION;
+ long dts = destination.lastModified() / FAT_PRECISION;
+ //do not copy if smart and same timestamp and same length
+ if ( !smart || sts == 0 || sts != dts || source.length() != destination.length() ) {
+ copyFile(source, destination);
+ }
+ }
+ else {
+ copyFile(source, destination);
+ }
+ }
+ }
+
+ private static void copyFile(File srcFile, File destFile) throws IOException {
+ FileInputStream is = null;
+ FileOutputStream os = null;
+ try {
+ is = new FileInputStream(srcFile);
+ FileChannel iChannel = is.getChannel();
+ os = new FileOutputStream( destFile, false );
+ FileChannel oChannel = os.getChannel();
+ oChannel.transferFrom( iChannel, 0, srcFile.length() );
+ }
+ finally {
+ if (is != null) is.close();
+ if (os != null) os.close();
+ }
+ destFile.setLastModified( srcFile.lastModified() );
+ }
+
+ public static void delete(File file) {
+ if ( file.isDirectory() ) {
+ for ( File subFile : file.listFiles() ) delete( subFile );
+ }
+ if ( file.exists() ) file.delete();
+ }
+}
Deleted: trunk/HibernateExt/search/src/java/org/hibernate/search/util/WeakIdentityHashMap.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util/WeakIdentityHashMap.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/WeakIdentityHashMap.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,1019 +0,0 @@
-//$Id: $
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-
-package org.hibernate.search.util;
-
-
-import java.lang.ref.ReferenceQueue;
-import java.lang.ref.WeakReference;
-import java.util.AbstractCollection;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.ConcurrentModificationException;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * A hashtable-based <tt>Map</tt> implementation with <em>weak keys</em> and
- * using reference-equality in place of object-equality when comparing keys
- * (and values). In an <tt>WeakIdentityHashMap</tt>, two keys <tt>k1</tt> and
- * <tt>k2</tt> are considered equal if and only if <tt>(k1==k2)</tt>.
- * An entry in a <tt>WeakIdentityHashMap</tt> will automatically be removed when
- * its key is no longer in ordinary use. More precisely, the presence of a
- * mapping for a given key will not prevent the key from being discarded by the
- * garbage collector, that is, made finalizable, finalized, and then reclaimed.
- * When a key has been discarded its entry is effectively removed from the map.
- * <p/>
- * <p>Based on java.util.WeakHashMap</p>
- * <p>Based on org.jboss.common.collection.WeakIdentityHashMap</p>
- *
- * @author Dawid Kurzyniec
- * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
- * @author Emmanuel Bernard
-
- * @see java.util.IdentityHashMap
- * @see java.util.WeakHashMap
- */
-public class WeakIdentityHashMap<K,V> /*extends AbstractMap*/ implements Map<K,V> {
-
- /**
- * The default initial capacity -- MUST be a power of two.
- */
- private static final int DEFAULT_INITIAL_CAPACITY = 16;
-
- /**
- * The maximum capacity, used if a higher value is implicitly specified
- * by either of the constructors with arguments.
- * MUST be a power of two <= 1<<30.
- */
- private static final int MAXIMUM_CAPACITY = 1 << 30;
-
- /**
- * The load fast used when none specified in constructor.
- */
- private static final float DEFAULT_LOAD_FACTOR = 0.75f;
-
- /**
- * The table, resized as necessary. Length MUST Always be a power of two.
- */
- private Entry<K,V>[] table;
-
- /**
- * The number of key-value mappings contained in this weak hash map.
- */
- private int size;
-
- /**
- * The next size value at which to resize (capacity * load factor).
- */
- private int threshold;
-
- /**
- * The load factor for the hash table.
- */
- private final float loadFactor;
-
- /**
- * Reference queue for cleared WeakEntries
- */
- private final ReferenceQueue queue = new ReferenceQueue();
-
- /**
- * The number of times this HashMap has been structurally modified
- * Structural modifications are those that change the number of mappings in
- * the HashMap or otherwise modify its internal structure (e.g.,
- * rehash). This field is used to make iterators on Collection-views of
- * the HashMap fail-fast. (See ConcurrentModificationException).
- */
- private volatile int modCount;
-
- /**
- * Each of these fields are initialized to contain an instance of the
- * appropriate view the first time this view is requested. The views are
- * stateless, so there's no reason to create more than one of each.
- */
- transient volatile Set keySet = null;
- transient volatile Collection values = null;
-
- /**
- * Constructs a new, empty <tt>WeakIdentityHashMap</tt> with the given
- * initial capacity and the given load factor.
- *
- * @param initialCapacity The initial capacity of the
- * <tt>WeakIdentityHashMap</tt>
- * @param loadFactor The load factor of the
- * <tt>WeakIdentityHashMap</tt>
- * @throws IllegalArgumentException If the initial capacity is negative,
- * or if the load factor is nonpositive.
- */
- public WeakIdentityHashMap(int initialCapacity, float loadFactor) {
- if ( initialCapacity < 0 )
- throw new IllegalArgumentException( "Illegal Initial Capacity: " +
- initialCapacity );
- if ( initialCapacity > MAXIMUM_CAPACITY )
- initialCapacity = MAXIMUM_CAPACITY;
-
- if ( loadFactor <= 0 || Float.isNaN( loadFactor ) )
- throw new IllegalArgumentException( "Illegal Load factor: " +
- loadFactor );
- int capacity = 1;
- while ( capacity < initialCapacity )
- capacity <<= 1;
- table = new Entry[capacity];
- this.loadFactor = loadFactor;
- threshold = (int) ( capacity * loadFactor );
- }
-
- /**
- * Constructs a new, empty <tt>WeakIdentityHashMap</tt> with the given
- * initial capacity and the default load factor, which is <tt>0.75</tt>.
- *
- * @param initialCapacity The initial capacity of the
- * <tt>WeakIdentityHashMap</tt>
- * @throws IllegalArgumentException If the initial capacity is negative.
- */
- public WeakIdentityHashMap(int initialCapacity) {
- this( initialCapacity, DEFAULT_LOAD_FACTOR );
- }
-
- /**
- * Constructs a new, empty <tt>WeakIdentityHashMap</tt> with the default
- * initial capacity (16) and the default load factor (0.75).
- */
- public WeakIdentityHashMap() {
- this.loadFactor = DEFAULT_LOAD_FACTOR;
- threshold = (int) ( DEFAULT_INITIAL_CAPACITY );
- table = new Entry[DEFAULT_INITIAL_CAPACITY];
- }
-
- /**
- * Constructs a new <tt>WeakIdentityHashMap</tt> with the same mappings as
- * the specified <tt>Map</tt>. The <tt>WeakIdentityHashMap</tt> is created
- * with default load factor, which is <tt>0.75</tt> and an initial capacity
- * sufficient to hold the mappings in the specified <tt>Map</tt>.
- *
- * @param t the map whose mappings are to be placed in this map.
- * @throws NullPointerException if the specified map is null.
- */
- public WeakIdentityHashMap(Map t) {
- this( Math.max( (int) ( t.size() / DEFAULT_LOAD_FACTOR ) + 1, 16 ),
- DEFAULT_LOAD_FACTOR );
- putAll( t );
- }
-
- // internal utilities
-
- /**
- * Value representing null keys inside tables.
- */
- private static final Object NULL_KEY = new Object();
-
- /**
- * Use NULL_KEY for key if it is null.
- */
- private static <T> T maskNull(T key) {
- return ( key == null ?
- (T) NULL_KEY : //i don't think there is a better way
- key );
- }
-
- /**
- * Return internal representation of null key back to caller as null
- */
- private static <T> T unmaskNull(T key) {
- return ( key == NULL_KEY ?
- null :
- key );
- }
-
- /**
- * Return a hash code for non-null Object x.
- */
- int hash(Object x) {
- int h = System.identityHashCode( x );
- return h - ( h << 7 ); // that is,, -127 * h
- }
-
- /**
- * Return index for hash code h.
- */
- static int indexFor(int h, int length) {
- return h & ( length - 1 );
- }
-
- /**
- * Expunge stale entries from the table.
- */
- private void expungeStaleEntries() {
- Object r;
- while ( ( r = queue.poll() ) != null ) {
- Entry e = (Entry) r;
- int h = e.hash;
- int i = indexFor( h, table.length );
-
- Entry prev = table[i];
- Entry p = prev;
- while ( p != null ) {
- Entry next = p.next;
- if ( p == e ) {
- if ( prev == e )
- table[i] = next;
- else
- prev.next = next;
- e.next = null; // Help GC
- e.value = null; // " "
- size--;
- break;
- }
- prev = p;
- p = next;
- }
- }
- }
-
- /**
- * Return the table after first expunging stale entries
- */
- private Entry<K,V>[] getTable() {
- expungeStaleEntries();
- return table;
- }
-
- /**
- * Returns the number of key-value mappings in this map.
- * This result is a snapshot, and may not reflect unprocessed
- * entries that will be removed before next attempted access
- * because they are no longer referenced.
- */
- public int size() {
- if ( size == 0 )
- return 0;
- expungeStaleEntries();
- return size;
- }
-
- /**
- * Returns <tt>true</tt> if this map contains no key-value mappings.
- * This result is a snapshot, and may not reflect unprocessed
- * entries that will be removed before next attempted access
- * because they are no longer referenced.
- */
- public boolean isEmpty() {
- return size() == 0;
- }
-
- /**
- * Returns the value to which the specified key is mapped in this weak
- * hash map, or <tt>null</tt> if the map contains no mapping for
- * this key. A return value of <tt>null</tt> does not <i>necessarily</i>
- * indicate that the map contains no mapping for the key; it is also
- * possible that the map explicitly maps the key to <tt>null</tt>. The
- * <tt>containsKey</tt> method may be used to distinguish these two
- * cases.
- *
- * @param key the key whose associated value is to be returned.
- * @return the value to which this map maps the specified key, or
- * <tt>null</tt> if the map contains no mapping for this key.
- * @see #put(Object,Object)
- */
- public V get(Object key) {
- Object k = maskNull( key );
- int h = hash( k );
- Entry<K,V>[] tab = getTable();
- int index = indexFor( h, tab.length );
- Entry<K,V> e = tab[index];
- while ( e != null ) {
- if ( e.hash == h && k == e.get() )
- return e.value;
- e = e.next;
- }
- return null;
- }
-
- /**
- * Returns <tt>true</tt> if this map contains a mapping for the
- * specified key.
- *
- * @param key The key whose presence in this map is to be tested
- * @return <tt>true</tt> if there is a mapping for <tt>key</tt>;
- * <tt>false</tt> otherwise
- */
- public boolean containsKey(Object key) {
- return getEntry( key ) != null;
- }
-
- /**
- * Returns the entry associated with the specified key in the HashMap.
- * Returns null if the HashMap contains no mapping for this key.
- */
- Entry<K,V> getEntry(Object key) {
- Object k = maskNull( key );
- int h = hash( k );
- Entry<K,V>[] tab = getTable();
- int index = indexFor( h, tab.length );
- Entry<K,V> e = tab[index];
- while ( e != null && !( e.hash == h && k == e.get() ) )
- e = e.next;
- return e;
- }
-
- /**
- * Associates the specified value with the specified key in this map.
- * If the map previously contained a mapping for this key, the old
- * value is replaced.
- *
- * @param key key with which the specified value is to be associated.
- * @param value value to be associated with the specified key.
- * @return previous value associated with specified key, or <tt>null</tt>
- * if there was no mapping for key. A <tt>null</tt> return can
- * also indicate that the HashMap previously associated
- * <tt>null</tt> with the specified key.
- */
- public V put(K key, V value) {
- K k = maskNull( key );
- int h = hash( k );
- Entry<K,V>[] tab = getTable();
- int i = indexFor( h, tab.length );
-
- for ( Entry<K,V> e = tab[i]; e != null; e = e.next ) {
- if ( h == e.hash && k == e.get() ) {
- V oldValue = e.value;
- if ( value != oldValue )
- e.value = value;
- return oldValue;
- }
- }
-
- modCount++;
- tab[i] = new Entry<K,V>( k, value, queue, h, tab[i] );
- if ( ++size >= threshold )
- resize( tab.length * 2 );
- return null;
- }
-
- /**
- * Rehashes the contents of this map into a new <tt>HashMap</tt> instance
- * with a larger capacity. This method is called automatically when the
- * number of keys in this map exceeds its capacity and load factor.
- * <p/>
- * Note that this method is a no-op if it's called with newCapacity ==
- * 2*MAXIMUM_CAPACITY (which is Integer.MIN_VALUE).
- *
- * @param newCapacity the new capacity, MUST be a power of two.
- */
- void resize(int newCapacity) {
- // assert (newCapacity & -newCapacity) == newCapacity; // power of 2
-
- Entry<K,V>[] oldTable = getTable();
- int oldCapacity = oldTable.length;
-
- // check if needed
- if ( size < threshold || oldCapacity > newCapacity )
- return;
-
- Entry<K,V>[] newTable = new Entry[newCapacity];
-
- transfer( oldTable, newTable );
- table = newTable;
-
- /*
- * If ignoring null elements and processing ref queue caused massive
- * shrinkage, then restore old table. This should be rare, but avoids
- * unbounded expansion of garbage-filled tables.
- */
- if ( size >= threshold / 2 ) {
- threshold = (int) ( newCapacity * loadFactor );
- }
- else {
- expungeStaleEntries();
- transfer( newTable, oldTable );
- table = oldTable;
- }
- }
-
- /**
- * Transfer all entries from src to dest tables
- */
- private void transfer(Entry<K,V>[] src, Entry<K,V>[] dest) {
- for ( int j = 0; j < src.length; ++j ) {
- Entry<K,V> e = src[j];
- src[j] = null;
- while ( e != null ) {
- Entry<K,V> next = e.next;
- K key = e.get();
- if ( key == null ) {
- e.next = null; // Help GC
- e.value = null; // " "
- size--;
- }
- else {
- int i = indexFor( e.hash, dest.length );
- e.next = dest[i];
- dest[i] = e;
- }
- e = next;
- }
- }
- }
-
- /**
- * Copies all of the mappings from the specified map to this map These
- * mappings will replace any mappings that this map had for any of the
- * keys currently in the specified map.<p>
- *
- * @param t mappings to be stored in this map.
- * @throws NullPointerException if the specified map is null.
- */
- public void putAll(Map<? extends K, ? extends V> t) {
- // Expand enough to hold t's elements without resizing.
- int n = t.size();
- if ( n == 0 )
- return;
- if ( n >= threshold ) {
- n = (int) ( n / loadFactor + 1 );
- if ( n > MAXIMUM_CAPACITY )
- n = MAXIMUM_CAPACITY;
- int capacity = table.length;
- while ( capacity < n )
- capacity <<= 1;
- resize( capacity );
- }
-
- for ( Iterator i = t.entrySet().iterator(); i.hasNext(); ) {
- Map.Entry<K,V> e = (Map.Entry<K,V>) i.next(); //FIXME should not have to cast
- put( e.getKey(), e.getValue() );
- }
- }
-
- /**
- * Removes the mapping for this key from this map if present.
- *
- * @param key key whose mapping is to be removed from the map.
- * @return previous value associated with specified key, or <tt>null</tt>
- * if there was no mapping for key. A <tt>null</tt> return can
- * also indicate that the map previously associated <tt>null</tt>
- * with the specified key.
- */
- public V remove(Object key) {
- Object k = maskNull( key );
- int h = hash( k );
- Entry<K,V>[] tab = getTable();
- int i = indexFor( h, tab.length );
- Entry<K,V> prev = tab[i];
- Entry<K,V> e = prev;
-
- while ( e != null ) {
- Entry<K,V> next = e.next;
- if ( h == e.hash && k == e.get() ) {
- modCount++;
- size--;
- if ( prev == e )
- tab[i] = next;
- else
- prev.next = next;
- return e.value;
- }
- prev = e;
- e = next;
- }
-
- return null;
- }
-
-
- /**
- * Special version of remove needed by Entry set
- */
- Entry removeMapping(Object o) {
- if ( !( o instanceof Map.Entry ) )
- return null;
- Entry[] tab = getTable();
- Map.Entry entry = (Map.Entry) o;
- Object k = maskNull( entry.getKey() );
- int h = hash( k );
- int i = indexFor( h, tab.length );
- Entry prev = tab[i];
- Entry e = prev;
-
- while ( e != null ) {
- Entry next = e.next;
- if ( h == e.hash && e.equals( entry ) ) {
- modCount++;
- size--;
- if ( prev == e )
- tab[i] = next;
- else
- prev.next = next;
- return e;
- }
- prev = e;
- e = next;
- }
-
- return null;
- }
-
- /**
- * Removes all mappings from this map.
- */
- public void clear() {
- // clear out ref queue. We don't need to expunge entries
- // since table is getting cleared.
- while ( queue.poll() != null )
- ;
-
- modCount++;
- Entry tab[] = table;
- for ( int i = 0; i < tab.length; ++i )
- tab[i] = null;
- size = 0;
-
- // Allocation of array may have caused GC, which may have caused
- // additional entries to go stale. Removing these entries from the
- // reference queue will make them eligible for reclamation.
- while ( queue.poll() != null )
- ;
- }
-
- /**
- * Returns <tt>true</tt> if this map maps one or more keys to the
- * specified value.
- *
- * @param value value whose presence in this map is to be tested.
- * @return <tt>true</tt> if this map maps one or more keys to the
- * specified value.
- */
- public boolean containsValue(Object value) {
- if ( value == null )
- return containsNullValue();
-
- Entry tab[] = getTable();
- for ( int i = tab.length; i-- > 0; )
- for ( Entry e = tab[i]; e != null; e = e.next )
- if ( value.equals( e.value ) )
- return true;
- return false;
- }
-
- /**
- * Special-case code for containsValue with null argument
- */
- private boolean containsNullValue() {
- Entry tab[] = getTable();
- for ( int i = tab.length; i-- > 0; )
- for ( Entry e = tab[i]; e != null; e = e.next )
- if ( e.value == null )
- return true;
- return false;
- }
-
- /**
- * Remove elements having the according value.
- * Intended to avoid concurrent access exceptions
- * It is expected that nobody add a key being removed by value
- *
- * @param value value whose presence in this map is to be removed.
- * @return <tt>true</tt> if this map maps one or more keys to the
- * specified value.
- */
- public boolean removeValue(Object value) {
- if ( value == null )
- return removeNullValue();
-
- Entry tab[] = getTable();
- Set keys = new HashSet();
- for ( int i = tab.length; i-- > 0; )
- for ( Entry e = tab[i]; e != null; e = e.next )
- if ( value.equals( e.value ) )
- keys.add( e.getKey() );
- for ( Object key : keys ) remove( key );
- return !keys.isEmpty();
- }
-
- /**
- * Special-case code for removeValue with null argument
- */
- private boolean removeNullValue() {
- Entry tab[] = getTable();
- Set keys = new HashSet();
- for ( int i = tab.length; i-- > 0; )
- for ( Entry e = tab[i]; e != null; e = e.next )
- if ( e.value == null )
- keys.add( e.getKey() );
- for ( Object key : keys ) remove( key );
- return !keys.isEmpty();
- }
-
- /**
- * The entries in this hash table extend WeakReference, using its main ref
- * field as the key.
- */
- private static class Entry<K,V> extends WeakReference<K> implements Map.Entry<K,V> {
- private V value;
- private final int hash;
- private Entry<K,V> next;
-
- /**
- * Create new entry.
- */
- Entry(K key, V value, ReferenceQueue queue,
- int hash, Entry<K,V> next) {
- super( key, queue );
- this.value = value;
- this.hash = hash;
- this.next = next;
- }
-
- public K getKey() {
- return WeakIdentityHashMap.unmaskNull( this.get() );
- }
-
- public V getValue() {
- return value;
- }
-
- public V setValue(V newValue) {
- V oldValue = value;
- value = newValue;
- return oldValue;
- }
-
- public boolean equals(Object o) {
- if ( !( o instanceof Map.Entry ) )
- return false;
- Map.Entry e = (Map.Entry) o;
- Object k1 = getKey();
- Object k2 = e.getKey();
- if ( k1 == k2 ) {
- Object v1 = getValue();
- Object v2 = e.getValue();
- if ( v1 == v2 || ( v1 != null && v1.equals( v2 ) ) )
- return true;
- }
- return false;
- }
-
- public int hashCode() {
- Object k = getKey();
- Object v = getValue();
- return ( ( k == null ?
- 0 :
- System.identityHashCode( k ) ) ^
- ( v == null ?
- 0 :
- v.hashCode() ) );
- }
-
- public String toString() {
- return getKey() + "=" + getValue();
- }
- }
-
- private abstract class HashIterator<E> implements Iterator<E> {
- int index;
- Entry<K,V> entry = null;
- Entry<K,V> lastReturned = null;
- int expectedModCount = modCount;
-
- /**
- * Strong reference needed to avoid disappearance of key
- * between hasNext and next
- */
- Object nextKey = null;
-
- /**
- * Strong reference needed to avoid disappearance of key
- * between nextEntry() and any use of the entry
- */
- Object currentKey = null;
-
- HashIterator() {
- index = ( size() != 0 ?
- table.length :
- 0 );
- }
-
- public boolean hasNext() {
- Entry[] t = table;
-
- while ( nextKey == null ) {
- Entry e = entry;
- int i = index;
- while ( e == null && i > 0 )
- e = t[--i];
- entry = e;
- index = i;
- if ( e == null ) {
- currentKey = null;
- return false;
- }
- nextKey = e.get(); // hold on to key in strong ref
- if ( nextKey == null )
- entry = entry.next;
- }
- return true;
- }
-
- /**
- * The common parts of next() across different types of iterators
- */
- protected Entry<K,V> nextEntry() {
- if ( modCount != expectedModCount )
- throw new ConcurrentModificationException();
- if ( nextKey == null && !hasNext() )
- throw new NoSuchElementException();
-
- lastReturned = entry;
- entry = entry.next;
- currentKey = nextKey;
- nextKey = null;
- return lastReturned;
- }
-
- public void remove() {
- if ( lastReturned == null )
- throw new IllegalStateException();
- if ( modCount != expectedModCount )
- throw new ConcurrentModificationException();
-
- WeakIdentityHashMap.this.remove( currentKey );
- expectedModCount = modCount;
- lastReturned = null;
- currentKey = null;
- }
-
- }
-
- private class ValueIterator extends HashIterator {
- public Object next() {
- return nextEntry().value;
- }
- }
-
- private class KeyIterator extends HashIterator {
- public Object next() {
- return nextEntry().getKey();
- }
- }
-
- private class EntryIterator extends HashIterator<Map.Entry<K,V>> {
- public Map.Entry<K,V> next() {
- return nextEntry();
- }
- }
-
- // Views
-
- private transient Set<Map.Entry<K,V>> entrySet = null;
-
- /**
- * Returns a set view of the keys contained in this map. The set is
- * backed by the map, so changes to the map are reflected in the set, and
- * vice-versa. The set supports element removal, which removes the
- * corresponding mapping from this map, via the <tt>Iterator.remove</tt>,
- * <tt>Set.remove</tt>, <tt>removeAll</tt>, <tt>retainAll</tt>, and
- * <tt>clear</tt> operations. It does not support the <tt>add</tt> or
- * <tt>addAll</tt> operations.
- *
- * @return a set view of the keys contained in this map.
- */
- public Set keySet() {
- Set ks = keySet;
- return ( ks != null ?
- ks :
- ( keySet = new KeySet() ) );
- }
-
- private class KeySet extends AbstractSet {
- public Iterator iterator() {
- return new KeyIterator();
- }
-
- public int size() {
- return WeakIdentityHashMap.this.size();
- }
-
- public boolean contains(Object o) {
- return containsKey( o );
- }
-
- public boolean remove(Object o) {
- if ( containsKey( o ) ) {
- WeakIdentityHashMap.this.remove( o );
- return true;
- }
- else
- return false;
- }
-
- public void clear() {
- WeakIdentityHashMap.this.clear();
- }
-
- public Object[] toArray() {
- Collection c = new ArrayList( size() );
- for ( Iterator i = iterator(); i.hasNext(); )
- c.add( i.next() );
- return c.toArray();
- }
-
- public Object[] toArray(Object a[]) {
- Collection c = new ArrayList( size() );
- for ( Iterator i = iterator(); i.hasNext(); )
- c.add( i.next() );
- return c.toArray( a );
- }
- }
-
- /**
- * Returns a collection view of the values contained in this map. The
- * collection is backed by the map, so changes to the map are reflected in
- * the collection, and vice-versa. The collection supports element
- * removal, which removes the corresponding mapping from this map, via the
- * <tt>Iterator.remove</tt>, <tt>Collection.remove</tt>,
- * <tt>removeAll</tt>, <tt>retainAll</tt>, and <tt>clear</tt> operations.
- * It does not support the <tt>add</tt> or <tt>addAll</tt> operations.
- *
- * @return a collection view of the values contained in this map.
- */
- public Collection values() {
- Collection vs = values;
- return ( vs != null ?
- vs :
- ( values = new Values() ) );
- }
-
- private class Values extends AbstractCollection {
- public Iterator iterator() {
- return new ValueIterator();
- }
-
- public int size() {
- return WeakIdentityHashMap.this.size();
- }
-
- public boolean contains(Object o) {
- return containsValue( o );
- }
-
- public void clear() {
- WeakIdentityHashMap.this.clear();
- }
-
- public Object[] toArray() {
- Collection c = new ArrayList( size() );
- for ( Iterator i = iterator(); i.hasNext(); )
- c.add( i.next() );
- return c.toArray();
- }
-
- public Object[] toArray(Object a[]) {
- Collection c = new ArrayList( size() );
- for ( Iterator i = iterator(); i.hasNext(); )
- c.add( i.next() );
- return c.toArray( a );
- }
- }
-
- /**
- * Returns a collection view of the mappings contained in this map. Each
- * element in the returned collection is a <tt>Map.Entry</tt>. The
- * collection is backed by the map, so changes to the map are reflected in
- * the collection, and vice-versa. The collection supports element
- * removal, which removes the corresponding mapping from the map, via the
- * <tt>Iterator.remove</tt>, <tt>Collection.remove</tt>,
- * <tt>removeAll</tt>, <tt>retainAll</tt>, and <tt>clear</tt> operations.
- * It does not support the <tt>add</tt> or <tt>addAll</tt> operations.
- *
- * @return a collection view of the mappings contained in this map.
- * @see java.util.Map.Entry
- */
- public Set<Map.Entry<K,V>> entrySet() {
- Set<Map.Entry<K,V>> es = entrySet;
- return ( es != null ?
- es :
- ( entrySet = new EntrySet() ) );
- }
-
- private class EntrySet extends AbstractSet<Map.Entry<K,V>> {
- public Iterator<Map.Entry<K,V>> iterator() {
- return new EntryIterator();
- }
-
- public boolean contains(Object o) {
- if ( !( o instanceof Map.Entry ) )
- return false;
- Map.Entry e = (Map.Entry) o;
- Object k = e.getKey();
- Entry candidate = getEntry( e.getKey() );
- return candidate != null && candidate.equals( e );
- }
-
- public boolean remove(Object o) {
- return removeMapping( o ) != null;
- }
-
- public int size() {
- return WeakIdentityHashMap.this.size();
- }
-
- public void clear() {
- WeakIdentityHashMap.this.clear();
- }
-
- public Object[] toArray() {
- Collection c = new ArrayList( size() );
- for ( Iterator i = iterator(); i.hasNext(); )
- c.add( new SimpleEntry( (Map.Entry) i.next() ) );
- return c.toArray();
- }
-
- public Object[] toArray(Object a[]) {
- Collection c = new ArrayList( size() );
- for ( Iterator i = iterator(); i.hasNext(); )
- c.add( new SimpleEntry( (Map.Entry) i.next() ) );
- return c.toArray( a );
- }
- }
-
- static class SimpleEntry implements Map.Entry {
- Object key;
- Object value;
-
- public SimpleEntry(Object key, Object value) {
- this.key = key;
- this.value = value;
- }
-
- public SimpleEntry(Map.Entry e) {
- this.key = e.getKey();
- this.value = e.getValue();
- }
-
- public Object getKey() {
- return key;
- }
-
- public Object getValue() {
- return value;
- }
-
- public Object setValue(Object value) {
- Object oldValue = this.value;
- this.value = value;
- return oldValue;
- }
-
- public boolean equals(Object o) {
- if ( !( o instanceof Map.Entry ) )
- return false;
- Map.Entry e = (Map.Entry) o;
- return eq( key, e.getKey() ) && eq( value, e.getValue() );
- }
-
- public int hashCode() {
- Object v;
- return ( ( key == null ) ?
- 0 :
- key.hashCode() ) ^
- ( ( value == null ) ?
- 0 :
- value.hashCode() );
- }
-
- public String toString() {
- return key + "=" + value;
- }
-
- private static boolean eq(Object o1, Object o2) {
- return ( o1 == null ?
- o2 == null :
- o1.equals( o2 ) );
- }
- }
-
-}
Copied: trunk/HibernateExt/search/src/java/org/hibernate/search/util/WeakIdentityHashMap.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/java/org/hibernate/search/util/WeakIdentityHashMap.java)
===================================================================
--- trunk/HibernateExt/search/src/java/org/hibernate/search/util/WeakIdentityHashMap.java (rev 0)
+++ trunk/HibernateExt/search/src/java/org/hibernate/search/util/WeakIdentityHashMap.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,1019 @@
+//$Id: $
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+
+package org.hibernate.search.util;
+
+
+import java.lang.ref.ReferenceQueue;
+import java.lang.ref.WeakReference;
+import java.util.AbstractCollection;
+import java.util.AbstractSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.ConcurrentModificationException;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * A hashtable-based <tt>Map</tt> implementation with <em>weak keys</em> and
+ * using reference-equality in place of object-equality when comparing keys
+ * (and values). In an <tt>WeakIdentityHashMap</tt>, two keys <tt>k1</tt> and
+ * <tt>k2</tt> are considered equal if and only if <tt>(k1==k2)</tt>.
+ * An entry in a <tt>WeakIdentityHashMap</tt> will automatically be removed when
+ * its key is no longer in ordinary use. More precisely, the presence of a
+ * mapping for a given key will not prevent the key from being discarded by the
+ * garbage collector, that is, made finalizable, finalized, and then reclaimed.
+ * When a key has been discarded its entry is effectively removed from the map.
+ * <p/>
+ * <p>Based on java.util.WeakHashMap</p>
+ * <p>Based on org.jboss.common.collection.WeakIdentityHashMap</p>
+ *
+ * @author Dawid Kurzyniec
+ * @author <a href="mailto:kabir.khan at jboss.org">Kabir Khan</a>
+ * @author Emmanuel Bernard
+
+ * @see java.util.IdentityHashMap
+ * @see java.util.WeakHashMap
+ */
+public class WeakIdentityHashMap<K,V> /*extends AbstractMap*/ implements Map<K,V> {
+
+ /**
+ * The default initial capacity -- MUST be a power of two.
+ */
+ private static final int DEFAULT_INITIAL_CAPACITY = 16;
+
+ /**
+ * The maximum capacity, used if a higher value is implicitly specified
+ * by either of the constructors with arguments.
+ * MUST be a power of two <= 1<<30.
+ */
+ private static final int MAXIMUM_CAPACITY = 1 << 30;
+
+ /**
+ * The load fast used when none specified in constructor.
+ */
+ private static final float DEFAULT_LOAD_FACTOR = 0.75f;
+
+ /**
+ * The table, resized as necessary. Length MUST Always be a power of two.
+ */
+ private Entry<K,V>[] table;
+
+ /**
+ * The number of key-value mappings contained in this weak hash map.
+ */
+ private int size;
+
+ /**
+ * The next size value at which to resize (capacity * load factor).
+ */
+ private int threshold;
+
+ /**
+ * The load factor for the hash table.
+ */
+ private final float loadFactor;
+
+ /**
+ * Reference queue for cleared WeakEntries
+ */
+ private final ReferenceQueue queue = new ReferenceQueue();
+
+ /**
+ * The number of times this HashMap has been structurally modified
+ * Structural modifications are those that change the number of mappings in
+ * the HashMap or otherwise modify its internal structure (e.g.,
+ * rehash). This field is used to make iterators on Collection-views of
+ * the HashMap fail-fast. (See ConcurrentModificationException).
+ */
+ private volatile int modCount;
+
+ /**
+ * Each of these fields are initialized to contain an instance of the
+ * appropriate view the first time this view is requested. The views are
+ * stateless, so there's no reason to create more than one of each.
+ */
+ transient volatile Set keySet = null;
+ transient volatile Collection values = null;
+
+ /**
+ * Constructs a new, empty <tt>WeakIdentityHashMap</tt> with the given
+ * initial capacity and the given load factor.
+ *
+ * @param initialCapacity The initial capacity of the
+ * <tt>WeakIdentityHashMap</tt>
+ * @param loadFactor The load factor of the
+ * <tt>WeakIdentityHashMap</tt>
+ * @throws IllegalArgumentException If the initial capacity is negative,
+ * or if the load factor is nonpositive.
+ */
+ public WeakIdentityHashMap(int initialCapacity, float loadFactor) {
+ if ( initialCapacity < 0 )
+ throw new IllegalArgumentException( "Illegal Initial Capacity: " +
+ initialCapacity );
+ if ( initialCapacity > MAXIMUM_CAPACITY )
+ initialCapacity = MAXIMUM_CAPACITY;
+
+ if ( loadFactor <= 0 || Float.isNaN( loadFactor ) )
+ throw new IllegalArgumentException( "Illegal Load factor: " +
+ loadFactor );
+ int capacity = 1;
+ while ( capacity < initialCapacity )
+ capacity <<= 1;
+ table = new Entry[capacity];
+ this.loadFactor = loadFactor;
+ threshold = (int) ( capacity * loadFactor );
+ }
+
+ /**
+ * Constructs a new, empty <tt>WeakIdentityHashMap</tt> with the given
+ * initial capacity and the default load factor, which is <tt>0.75</tt>.
+ *
+ * @param initialCapacity The initial capacity of the
+ * <tt>WeakIdentityHashMap</tt>
+ * @throws IllegalArgumentException If the initial capacity is negative.
+ */
+ public WeakIdentityHashMap(int initialCapacity) {
+ this( initialCapacity, DEFAULT_LOAD_FACTOR );
+ }
+
+ /**
+ * Constructs a new, empty <tt>WeakIdentityHashMap</tt> with the default
+ * initial capacity (16) and the default load factor (0.75).
+ */
+ public WeakIdentityHashMap() {
+ this.loadFactor = DEFAULT_LOAD_FACTOR;
+ threshold = (int) ( DEFAULT_INITIAL_CAPACITY );
+ table = new Entry[DEFAULT_INITIAL_CAPACITY];
+ }
+
+ /**
+ * Constructs a new <tt>WeakIdentityHashMap</tt> with the same mappings as
+ * the specified <tt>Map</tt>. The <tt>WeakIdentityHashMap</tt> is created
+ * with default load factor, which is <tt>0.75</tt> and an initial capacity
+ * sufficient to hold the mappings in the specified <tt>Map</tt>.
+ *
+ * @param t the map whose mappings are to be placed in this map.
+ * @throws NullPointerException if the specified map is null.
+ */
+ public WeakIdentityHashMap(Map t) {
+ this( Math.max( (int) ( t.size() / DEFAULT_LOAD_FACTOR ) + 1, 16 ),
+ DEFAULT_LOAD_FACTOR );
+ putAll( t );
+ }
+
+ // internal utilities
+
+ /**
+ * Value representing null keys inside tables.
+ */
+ private static final Object NULL_KEY = new Object();
+
+ /**
+ * Use NULL_KEY for key if it is null.
+ */
+ private static <T> T maskNull(T key) {
+ return ( key == null ?
+ (T) NULL_KEY : //i don't think there is a better way
+ key );
+ }
+
+ /**
+ * Return internal representation of null key back to caller as null
+ */
+ private static <T> T unmaskNull(T key) {
+ return ( key == NULL_KEY ?
+ null :
+ key );
+ }
+
+ /**
+ * Return a hash code for non-null Object x.
+ */
+ int hash(Object x) {
+ int h = System.identityHashCode( x );
+ return h - ( h << 7 ); // that is,, -127 * h
+ }
+
+ /**
+ * Return index for hash code h.
+ */
+ static int indexFor(int h, int length) {
+ return h & ( length - 1 );
+ }
+
+ /**
+ * Expunge stale entries from the table.
+ */
+ private void expungeStaleEntries() {
+ Object r;
+ while ( ( r = queue.poll() ) != null ) {
+ Entry e = (Entry) r;
+ int h = e.hash;
+ int i = indexFor( h, table.length );
+
+ Entry prev = table[i];
+ Entry p = prev;
+ while ( p != null ) {
+ Entry next = p.next;
+ if ( p == e ) {
+ if ( prev == e )
+ table[i] = next;
+ else
+ prev.next = next;
+ e.next = null; // Help GC
+ e.value = null; // " "
+ size--;
+ break;
+ }
+ prev = p;
+ p = next;
+ }
+ }
+ }
+
+ /**
+ * Return the table after first expunging stale entries
+ */
+ private Entry<K,V>[] getTable() {
+ expungeStaleEntries();
+ return table;
+ }
+
+ /**
+ * Returns the number of key-value mappings in this map.
+ * This result is a snapshot, and may not reflect unprocessed
+ * entries that will be removed before next attempted access
+ * because they are no longer referenced.
+ */
+ public int size() {
+ if ( size == 0 )
+ return 0;
+ expungeStaleEntries();
+ return size;
+ }
+
+ /**
+ * Returns <tt>true</tt> if this map contains no key-value mappings.
+ * This result is a snapshot, and may not reflect unprocessed
+ * entries that will be removed before next attempted access
+ * because they are no longer referenced.
+ */
+ public boolean isEmpty() {
+ return size() == 0;
+ }
+
+ /**
+ * Returns the value to which the specified key is mapped in this weak
+ * hash map, or <tt>null</tt> if the map contains no mapping for
+ * this key. A return value of <tt>null</tt> does not <i>necessarily</i>
+ * indicate that the map contains no mapping for the key; it is also
+ * possible that the map explicitly maps the key to <tt>null</tt>. The
+ * <tt>containsKey</tt> method may be used to distinguish these two
+ * cases.
+ *
+ * @param key the key whose associated value is to be returned.
+ * @return the value to which this map maps the specified key, or
+ * <tt>null</tt> if the map contains no mapping for this key.
+ * @see #put(Object,Object)
+ */
+ public V get(Object key) {
+ Object k = maskNull( key );
+ int h = hash( k );
+ Entry<K,V>[] tab = getTable();
+ int index = indexFor( h, tab.length );
+ Entry<K,V> e = tab[index];
+ while ( e != null ) {
+ if ( e.hash == h && k == e.get() )
+ return e.value;
+ e = e.next;
+ }
+ return null;
+ }
+
+ /**
+ * Returns <tt>true</tt> if this map contains a mapping for the
+ * specified key.
+ *
+ * @param key The key whose presence in this map is to be tested
+ * @return <tt>true</tt> if there is a mapping for <tt>key</tt>;
+ * <tt>false</tt> otherwise
+ */
+ public boolean containsKey(Object key) {
+ return getEntry( key ) != null;
+ }
+
+ /**
+ * Returns the entry associated with the specified key in the HashMap.
+ * Returns null if the HashMap contains no mapping for this key.
+ */
+ Entry<K,V> getEntry(Object key) {
+ Object k = maskNull( key );
+ int h = hash( k );
+ Entry<K,V>[] tab = getTable();
+ int index = indexFor( h, tab.length );
+ Entry<K,V> e = tab[index];
+ while ( e != null && !( e.hash == h && k == e.get() ) )
+ e = e.next;
+ return e;
+ }
+
+ /**
+ * Associates the specified value with the specified key in this map.
+ * If the map previously contained a mapping for this key, the old
+ * value is replaced.
+ *
+ * @param key key with which the specified value is to be associated.
+ * @param value value to be associated with the specified key.
+ * @return previous value associated with specified key, or <tt>null</tt>
+ * if there was no mapping for key. A <tt>null</tt> return can
+ * also indicate that the HashMap previously associated
+ * <tt>null</tt> with the specified key.
+ */
+ public V put(K key, V value) {
+ K k = maskNull( key );
+ int h = hash( k );
+ Entry<K,V>[] tab = getTable();
+ int i = indexFor( h, tab.length );
+
+ for ( Entry<K,V> e = tab[i]; e != null; e = e.next ) {
+ if ( h == e.hash && k == e.get() ) {
+ V oldValue = e.value;
+ if ( value != oldValue )
+ e.value = value;
+ return oldValue;
+ }
+ }
+
+ modCount++;
+ tab[i] = new Entry<K,V>( k, value, queue, h, tab[i] );
+ if ( ++size >= threshold )
+ resize( tab.length * 2 );
+ return null;
+ }
+
+ /**
+ * Rehashes the contents of this map into a new <tt>HashMap</tt> instance
+ * with a larger capacity. This method is called automatically when the
+ * number of keys in this map exceeds its capacity and load factor.
+ * <p/>
+ * Note that this method is a no-op if it's called with newCapacity ==
+ * 2*MAXIMUM_CAPACITY (which is Integer.MIN_VALUE).
+ *
+ * @param newCapacity the new capacity, MUST be a power of two.
+ */
+ void resize(int newCapacity) {
+ // assert (newCapacity & -newCapacity) == newCapacity; // power of 2
+
+ Entry<K,V>[] oldTable = getTable();
+ int oldCapacity = oldTable.length;
+
+ // check if needed
+ if ( size < threshold || oldCapacity > newCapacity )
+ return;
+
+ Entry<K,V>[] newTable = new Entry[newCapacity];
+
+ transfer( oldTable, newTable );
+ table = newTable;
+
+ /*
+ * If ignoring null elements and processing ref queue caused massive
+ * shrinkage, then restore old table. This should be rare, but avoids
+ * unbounded expansion of garbage-filled tables.
+ */
+ if ( size >= threshold / 2 ) {
+ threshold = (int) ( newCapacity * loadFactor );
+ }
+ else {
+ expungeStaleEntries();
+ transfer( newTable, oldTable );
+ table = oldTable;
+ }
+ }
+
+ /**
+ * Transfer all entries from src to dest tables
+ */
+ private void transfer(Entry<K,V>[] src, Entry<K,V>[] dest) {
+ for ( int j = 0; j < src.length; ++j ) {
+ Entry<K,V> e = src[j];
+ src[j] = null;
+ while ( e != null ) {
+ Entry<K,V> next = e.next;
+ K key = e.get();
+ if ( key == null ) {
+ e.next = null; // Help GC
+ e.value = null; // " "
+ size--;
+ }
+ else {
+ int i = indexFor( e.hash, dest.length );
+ e.next = dest[i];
+ dest[i] = e;
+ }
+ e = next;
+ }
+ }
+ }
+
+ /**
+ * Copies all of the mappings from the specified map to this map These
+ * mappings will replace any mappings that this map had for any of the
+ * keys currently in the specified map.<p>
+ *
+ * @param t mappings to be stored in this map.
+ * @throws NullPointerException if the specified map is null.
+ */
+ public void putAll(Map<? extends K, ? extends V> t) {
+ // Expand enough to hold t's elements without resizing.
+ int n = t.size();
+ if ( n == 0 )
+ return;
+ if ( n >= threshold ) {
+ n = (int) ( n / loadFactor + 1 );
+ if ( n > MAXIMUM_CAPACITY )
+ n = MAXIMUM_CAPACITY;
+ int capacity = table.length;
+ while ( capacity < n )
+ capacity <<= 1;
+ resize( capacity );
+ }
+
+ for ( Iterator i = t.entrySet().iterator(); i.hasNext(); ) {
+ Map.Entry<K,V> e = (Map.Entry<K,V>) i.next(); //FIXME should not have to cast
+ put( e.getKey(), e.getValue() );
+ }
+ }
+
+ /**
+ * Removes the mapping for this key from this map if present.
+ *
+ * @param key key whose mapping is to be removed from the map.
+ * @return previous value associated with specified key, or <tt>null</tt>
+ * if there was no mapping for key. A <tt>null</tt> return can
+ * also indicate that the map previously associated <tt>null</tt>
+ * with the specified key.
+ */
+ public V remove(Object key) {
+ Object k = maskNull( key );
+ int h = hash( k );
+ Entry<K,V>[] tab = getTable();
+ int i = indexFor( h, tab.length );
+ Entry<K,V> prev = tab[i];
+ Entry<K,V> e = prev;
+
+ while ( e != null ) {
+ Entry<K,V> next = e.next;
+ if ( h == e.hash && k == e.get() ) {
+ modCount++;
+ size--;
+ if ( prev == e )
+ tab[i] = next;
+ else
+ prev.next = next;
+ return e.value;
+ }
+ prev = e;
+ e = next;
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Special version of remove needed by Entry set
+ */
+ Entry removeMapping(Object o) {
+ if ( !( o instanceof Map.Entry ) )
+ return null;
+ Entry[] tab = getTable();
+ Map.Entry entry = (Map.Entry) o;
+ Object k = maskNull( entry.getKey() );
+ int h = hash( k );
+ int i = indexFor( h, tab.length );
+ Entry prev = tab[i];
+ Entry e = prev;
+
+ while ( e != null ) {
+ Entry next = e.next;
+ if ( h == e.hash && e.equals( entry ) ) {
+ modCount++;
+ size--;
+ if ( prev == e )
+ tab[i] = next;
+ else
+ prev.next = next;
+ return e;
+ }
+ prev = e;
+ e = next;
+ }
+
+ return null;
+ }
+
+ /**
+ * Removes all mappings from this map.
+ */
+ public void clear() {
+ // clear out ref queue. We don't need to expunge entries
+ // since table is getting cleared.
+ while ( queue.poll() != null )
+ ;
+
+ modCount++;
+ Entry tab[] = table;
+ for ( int i = 0; i < tab.length; ++i )
+ tab[i] = null;
+ size = 0;
+
+ // Allocation of array may have caused GC, which may have caused
+ // additional entries to go stale. Removing these entries from the
+ // reference queue will make them eligible for reclamation.
+ while ( queue.poll() != null )
+ ;
+ }
+
+ /**
+ * Returns <tt>true</tt> if this map maps one or more keys to the
+ * specified value.
+ *
+ * @param value value whose presence in this map is to be tested.
+ * @return <tt>true</tt> if this map maps one or more keys to the
+ * specified value.
+ */
+ public boolean containsValue(Object value) {
+ if ( value == null )
+ return containsNullValue();
+
+ Entry tab[] = getTable();
+ for ( int i = tab.length; i-- > 0; )
+ for ( Entry e = tab[i]; e != null; e = e.next )
+ if ( value.equals( e.value ) )
+ return true;
+ return false;
+ }
+
+ /**
+ * Special-case code for containsValue with null argument
+ */
+ private boolean containsNullValue() {
+ Entry tab[] = getTable();
+ for ( int i = tab.length; i-- > 0; )
+ for ( Entry e = tab[i]; e != null; e = e.next )
+ if ( e.value == null )
+ return true;
+ return false;
+ }
+
+ /**
+ * Remove elements having the according value.
+ * Intended to avoid concurrent access exceptions
+ * It is expected that nobody add a key being removed by value
+ *
+ * @param value value whose presence in this map is to be removed.
+ * @return <tt>true</tt> if this map maps one or more keys to the
+ * specified value.
+ */
+ public boolean removeValue(Object value) {
+ if ( value == null )
+ return removeNullValue();
+
+ Entry tab[] = getTable();
+ Set keys = new HashSet();
+ for ( int i = tab.length; i-- > 0; )
+ for ( Entry e = tab[i]; e != null; e = e.next )
+ if ( value.equals( e.value ) )
+ keys.add( e.getKey() );
+ for ( Object key : keys ) remove( key );
+ return !keys.isEmpty();
+ }
+
+ /**
+ * Special-case code for removeValue with null argument
+ */
+ private boolean removeNullValue() {
+ Entry tab[] = getTable();
+ Set keys = new HashSet();
+ for ( int i = tab.length; i-- > 0; )
+ for ( Entry e = tab[i]; e != null; e = e.next )
+ if ( e.value == null )
+ keys.add( e.getKey() );
+ for ( Object key : keys ) remove( key );
+ return !keys.isEmpty();
+ }
+
+ /**
+ * The entries in this hash table extend WeakReference, using its main ref
+ * field as the key.
+ */
+ private static class Entry<K,V> extends WeakReference<K> implements Map.Entry<K,V> {
+ private V value;
+ private final int hash;
+ private Entry<K,V> next;
+
+ /**
+ * Create new entry.
+ */
+ Entry(K key, V value, ReferenceQueue queue,
+ int hash, Entry<K,V> next) {
+ super( key, queue );
+ this.value = value;
+ this.hash = hash;
+ this.next = next;
+ }
+
+ public K getKey() {
+ return WeakIdentityHashMap.unmaskNull( this.get() );
+ }
+
+ public V getValue() {
+ return value;
+ }
+
+ public V setValue(V newValue) {
+ V oldValue = value;
+ value = newValue;
+ return oldValue;
+ }
+
+ public boolean equals(Object o) {
+ if ( !( o instanceof Map.Entry ) )
+ return false;
+ Map.Entry e = (Map.Entry) o;
+ Object k1 = getKey();
+ Object k2 = e.getKey();
+ if ( k1 == k2 ) {
+ Object v1 = getValue();
+ Object v2 = e.getValue();
+ if ( v1 == v2 || ( v1 != null && v1.equals( v2 ) ) )
+ return true;
+ }
+ return false;
+ }
+
+ public int hashCode() {
+ Object k = getKey();
+ Object v = getValue();
+ return ( ( k == null ?
+ 0 :
+ System.identityHashCode( k ) ) ^
+ ( v == null ?
+ 0 :
+ v.hashCode() ) );
+ }
+
+ public String toString() {
+ return getKey() + "=" + getValue();
+ }
+ }
+
+ private abstract class HashIterator<E> implements Iterator<E> {
+ int index;
+ Entry<K,V> entry = null;
+ Entry<K,V> lastReturned = null;
+ int expectedModCount = modCount;
+
+ /**
+ * Strong reference needed to avoid disappearance of key
+ * between hasNext and next
+ */
+ Object nextKey = null;
+
+ /**
+ * Strong reference needed to avoid disappearance of key
+ * between nextEntry() and any use of the entry
+ */
+ Object currentKey = null;
+
+ HashIterator() {
+ index = ( size() != 0 ?
+ table.length :
+ 0 );
+ }
+
+ public boolean hasNext() {
+ Entry[] t = table;
+
+ while ( nextKey == null ) {
+ Entry e = entry;
+ int i = index;
+ while ( e == null && i > 0 )
+ e = t[--i];
+ entry = e;
+ index = i;
+ if ( e == null ) {
+ currentKey = null;
+ return false;
+ }
+ nextKey = e.get(); // hold on to key in strong ref
+ if ( nextKey == null )
+ entry = entry.next;
+ }
+ return true;
+ }
+
+ /**
+ * The common parts of next() across different types of iterators
+ */
+ protected Entry<K,V> nextEntry() {
+ if ( modCount != expectedModCount )
+ throw new ConcurrentModificationException();
+ if ( nextKey == null && !hasNext() )
+ throw new NoSuchElementException();
+
+ lastReturned = entry;
+ entry = entry.next;
+ currentKey = nextKey;
+ nextKey = null;
+ return lastReturned;
+ }
+
+ public void remove() {
+ if ( lastReturned == null )
+ throw new IllegalStateException();
+ if ( modCount != expectedModCount )
+ throw new ConcurrentModificationException();
+
+ WeakIdentityHashMap.this.remove( currentKey );
+ expectedModCount = modCount;
+ lastReturned = null;
+ currentKey = null;
+ }
+
+ }
+
+ private class ValueIterator extends HashIterator {
+ public Object next() {
+ return nextEntry().value;
+ }
+ }
+
+ private class KeyIterator extends HashIterator {
+ public Object next() {
+ return nextEntry().getKey();
+ }
+ }
+
+ private class EntryIterator extends HashIterator<Map.Entry<K,V>> {
+ public Map.Entry<K,V> next() {
+ return nextEntry();
+ }
+ }
+
+ // Views
+
+ private transient Set<Map.Entry<K,V>> entrySet = null;
+
+ /**
+ * Returns a set view of the keys contained in this map. The set is
+ * backed by the map, so changes to the map are reflected in the set, and
+ * vice-versa. The set supports element removal, which removes the
+ * corresponding mapping from this map, via the <tt>Iterator.remove</tt>,
+ * <tt>Set.remove</tt>, <tt>removeAll</tt>, <tt>retainAll</tt>, and
+ * <tt>clear</tt> operations. It does not support the <tt>add</tt> or
+ * <tt>addAll</tt> operations.
+ *
+ * @return a set view of the keys contained in this map.
+ */
+ public Set keySet() {
+ Set ks = keySet;
+ return ( ks != null ?
+ ks :
+ ( keySet = new KeySet() ) );
+ }
+
+ private class KeySet extends AbstractSet {
+ public Iterator iterator() {
+ return new KeyIterator();
+ }
+
+ public int size() {
+ return WeakIdentityHashMap.this.size();
+ }
+
+ public boolean contains(Object o) {
+ return containsKey( o );
+ }
+
+ public boolean remove(Object o) {
+ if ( containsKey( o ) ) {
+ WeakIdentityHashMap.this.remove( o );
+ return true;
+ }
+ else
+ return false;
+ }
+
+ public void clear() {
+ WeakIdentityHashMap.this.clear();
+ }
+
+ public Object[] toArray() {
+ Collection c = new ArrayList( size() );
+ for ( Iterator i = iterator(); i.hasNext(); )
+ c.add( i.next() );
+ return c.toArray();
+ }
+
+ public Object[] toArray(Object a[]) {
+ Collection c = new ArrayList( size() );
+ for ( Iterator i = iterator(); i.hasNext(); )
+ c.add( i.next() );
+ return c.toArray( a );
+ }
+ }
+
+ /**
+ * Returns a collection view of the values contained in this map. The
+ * collection is backed by the map, so changes to the map are reflected in
+ * the collection, and vice-versa. The collection supports element
+ * removal, which removes the corresponding mapping from this map, via the
+ * <tt>Iterator.remove</tt>, <tt>Collection.remove</tt>,
+ * <tt>removeAll</tt>, <tt>retainAll</tt>, and <tt>clear</tt> operations.
+ * It does not support the <tt>add</tt> or <tt>addAll</tt> operations.
+ *
+ * @return a collection view of the values contained in this map.
+ */
+ public Collection values() {
+ Collection vs = values;
+ return ( vs != null ?
+ vs :
+ ( values = new Values() ) );
+ }
+
+ private class Values extends AbstractCollection {
+ public Iterator iterator() {
+ return new ValueIterator();
+ }
+
+ public int size() {
+ return WeakIdentityHashMap.this.size();
+ }
+
+ public boolean contains(Object o) {
+ return containsValue( o );
+ }
+
+ public void clear() {
+ WeakIdentityHashMap.this.clear();
+ }
+
+ public Object[] toArray() {
+ Collection c = new ArrayList( size() );
+ for ( Iterator i = iterator(); i.hasNext(); )
+ c.add( i.next() );
+ return c.toArray();
+ }
+
+ public Object[] toArray(Object a[]) {
+ Collection c = new ArrayList( size() );
+ for ( Iterator i = iterator(); i.hasNext(); )
+ c.add( i.next() );
+ return c.toArray( a );
+ }
+ }
+
+ /**
+ * Returns a collection view of the mappings contained in this map. Each
+ * element in the returned collection is a <tt>Map.Entry</tt>. The
+ * collection is backed by the map, so changes to the map are reflected in
+ * the collection, and vice-versa. The collection supports element
+ * removal, which removes the corresponding mapping from the map, via the
+ * <tt>Iterator.remove</tt>, <tt>Collection.remove</tt>,
+ * <tt>removeAll</tt>, <tt>retainAll</tt>, and <tt>clear</tt> operations.
+ * It does not support the <tt>add</tt> or <tt>addAll</tt> operations.
+ *
+ * @return a collection view of the mappings contained in this map.
+ * @see java.util.Map.Entry
+ */
+ public Set<Map.Entry<K,V>> entrySet() {
+ Set<Map.Entry<K,V>> es = entrySet;
+ return ( es != null ?
+ es :
+ ( entrySet = new EntrySet() ) );
+ }
+
+ private class EntrySet extends AbstractSet<Map.Entry<K,V>> {
+ public Iterator<Map.Entry<K,V>> iterator() {
+ return new EntryIterator();
+ }
+
+ public boolean contains(Object o) {
+ if ( !( o instanceof Map.Entry ) )
+ return false;
+ Map.Entry e = (Map.Entry) o;
+ Object k = e.getKey();
+ Entry candidate = getEntry( e.getKey() );
+ return candidate != null && candidate.equals( e );
+ }
+
+ public boolean remove(Object o) {
+ return removeMapping( o ) != null;
+ }
+
+ public int size() {
+ return WeakIdentityHashMap.this.size();
+ }
+
+ public void clear() {
+ WeakIdentityHashMap.this.clear();
+ }
+
+ public Object[] toArray() {
+ Collection c = new ArrayList( size() );
+ for ( Iterator i = iterator(); i.hasNext(); )
+ c.add( new SimpleEntry( (Map.Entry) i.next() ) );
+ return c.toArray();
+ }
+
+ public Object[] toArray(Object a[]) {
+ Collection c = new ArrayList( size() );
+ for ( Iterator i = iterator(); i.hasNext(); )
+ c.add( new SimpleEntry( (Map.Entry) i.next() ) );
+ return c.toArray( a );
+ }
+ }
+
+ static class SimpleEntry implements Map.Entry {
+ Object key;
+ Object value;
+
+ public SimpleEntry(Object key, Object value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public SimpleEntry(Map.Entry e) {
+ this.key = e.getKey();
+ this.value = e.getValue();
+ }
+
+ public Object getKey() {
+ return key;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public Object setValue(Object value) {
+ Object oldValue = this.value;
+ this.value = value;
+ return oldValue;
+ }
+
+ public boolean equals(Object o) {
+ if ( !( o instanceof Map.Entry ) )
+ return false;
+ Map.Entry e = (Map.Entry) o;
+ return eq( key, e.getKey() ) && eq( value, e.getValue() );
+ }
+
+ public int hashCode() {
+ Object v;
+ return ( ( key == null ) ?
+ 0 :
+ key.hashCode() ) ^
+ ( ( value == null ) ?
+ 0 :
+ value.hashCode() );
+ }
+
+ public String toString() {
+ return key + "=" + value;
+ }
+
+ private static boolean eq(Object o1, Object o2) {
+ return ( o1 == null ?
+ o2 == null :
+ o1.equals( o2 ) );
+ }
+ }
+
+}
Copied: trunk/HibernateExt/search/src/test (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test)
Deleted: trunk/HibernateExt/search/src/test/hibernate.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/hibernate.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/hibernate.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,472 +0,0 @@
-######################
-### Query Language ###
-######################
-
-## define query language constants / function names
-
-hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
-
-
-## select the classic query parser
-
-#hibernate.query.factory_class org.hibernate.hql.classic.ClassicQueryTranslatorFactory
-
-hibernate.format_sql true
-
-
-
-#################
-### Platforms ###
-#################
-
-## JNDI Datasource
-
-#hibernate.connection.datasource jdbc/test
-#hibernate.connection.username db2
-#hibernate.connection.password db2
-
-
-## HypersonicSQL
-
-hibernate.dialect org.hibernate.dialect.HSQLDialect
-hibernate.connection.driver_class org.hsqldb.jdbcDriver
-hibernate.connection.username sa
-hibernate.connection.password
-#hibernate.connection.url jdbc:hsqldb:hsql://localhost
-#hibernate.connection.url jdbc:hsqldb:test
-hibernate.connection.url jdbc:hsqldb:mem:common
-
-
-## MySQL
-
-#hibernate.dialect org.hibernate.dialect.MySQLDialect
-#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
-#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
-#hibernate.connection.driver_class com.mysql.jdbc.Driver
-#hibernate.connection.url jdbc:mysql:///test
-#hibernate.connection.username emmanuel
-#hibernate.connection.password
-
-
-## Oracle
-
-#hibernate.dialect org.hibernate.dialect.OracleDialect
-#hibernate.dialect org.hibernate.dialect.Oracle9Dialect
-#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
-#hibernate.connection.username ora
-#hibernate.connection.password ora
-#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:test
-
-
-## PostgreSQL
-
-#hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
-#hibernate.connection.driver_class org.postgresql.Driver
-#hibernate.connection.url jdbc:postgresql:annotations
-#hibernate.connection.username postgres
-#hibernate.connection.password hibernate
-#hibernate.query.substitutions yes 'Y', no 'N'
-
-
-## DB2
-
-#hibernate.dialect org.hibernate.dialect.DB2Dialect
-#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
-#hibernate.connection.url jdbc:db2:test
-#hibernate.connection.username db2
-#hibernate.connection.password db2
-
-## TimesTen (not supported yet)
-
-#hibernate.dialect org.hibernate.dialect.TimesTenDialect
-#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
-#hibernate.connection.url jdbc:timesten:direct:test
-#hibernate.connection.username
-#hibernate.connection.password
-
-## DB2/400
-
-#hibernate.dialect org.hibernate.dialect.DB2400Dialect
-#hibernate.connection.username user
-#hibernate.connection.password password
-
-## Native driver
-#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
-#hibernate.connection.url jdbc:db2://systemname
-
-## Toolbox driver
-#hibernate.connection.driver_class com.ibm.as400.access.AS400JDBCDriver
-#hibernate.connection.url jdbc:as400://systemname
-
-
-## Derby (Not supported!)
-
-#hibernate.dialect org.hibernate.dialect.DerbyDialect
-#hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver
-#hibernate.connection.username
-#hibernate.connection.password
-#hibernate.connection.url jdbc:derby:/test;create=true
-
-
-## Sybase
-
-#hibernate.dialect org.hibernate.dialect.SybaseDialect
-#hibernate.connection.driver_class com.sybase.jdbc2.jdbc.SybDriver
-#hibernate.connection.username sa
-#hibernate.connection.password sasasa
-#hibernate.connection.url jdbc:sybase:Tds:co3061835-a:5000/tempdb
-
-
-## Mckoi SQL
-
-#hibernate.dialect org.hibernate.dialect.MckoiDialect
-#hibernate.connection.driver_class com.mckoi.JDBCDriver
-#hibernate.connection.url jdbc:mckoi:///
-#hibernate.connection.url jdbc:mckoi:local://C:/mckoi1.00/db.conf
-#hibernate.connection.username admin
-#hibernate.connection.password nimda
-
-
-## SAP DB
-
-#hibernate.dialect org.hibernate.dialect.SAPDBDialect
-#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
-#hibernate.connection.url jdbc:sapdb://localhost/TST
-#hibernate.connection.username TEST
-#hibernate.connection.password TEST
-#hibernate.query.substitutions yes 'Y', no 'N'
-
-
-## MS SQL Server
-
-#hibernate.dialect org.hibernate.dialect.SQLServerDialect
-#hibernate.connection.username sa
-#hibernate.connection.password sa
-
-## JSQL Driver
-#hibernate.connection.driver_class com.jnetdirect.jsql.JSQLDriver
-#hibernate.connection.url jdbc:JSQLConnect://1E1/test
-
-## JTURBO Driver
-#hibernate.connection.driver_class com.newatlanta.jturbo.driver.Driver
-#hibernate.connection.url jdbc:JTurbo://1E1:1433/test
-
-## WebLogic Driver
-#hibernate.connection.driver_class weblogic.jdbc.mssqlserver4.Driver
-#hibernate.connection.url jdbc:weblogic:mssqlserver4:1E1:1433
-
-## Microsoft Driver (not recommended!)
-#hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
-#hibernate.connection.url jdbc:microsoft:sqlserver://1E1;DatabaseName=test;SelectMethod=cursor
-
-## jTDS (since version 0.9)
-#hibernate.connection.driver_class net.sourceforge.jtds.jdbc.Driver
-#hibernate.connection.url jdbc:jtds:sqlserver://1E1/test
-
-## Interbase
-
-#hibernate.dialect org.hibernate.dialect.InterbaseDialect
-#hibernate.connection.username sysdba
-#hibernate.connection.password masterkey
-
-## DO NOT specify hibernate.connection.sqlDialect
-
-## InterClient
-
-#hibernate.connection.driver_class interbase.interclient.Driver
-#hibernate.connection.url jdbc:interbase://localhost:3060/C:/firebird/test.gdb
-
-## Pure Java
-
-#hibernate.connection.driver_class org.firebirdsql.jdbc.FBDriver
-#hibernate.connection.url jdbc:firebirdsql:localhost/3050:/firebird/test.gdb
-
-
-## Pointbase
-
-#hibernate.dialect org.hibernate.dialect.PointbaseDialect
-#hibernate.connection.driver_class com.pointbase.jdbc.jdbcUniversalDriver
-#hibernate.connection.url jdbc:pointbase:embedded:sample
-#hibernate.connection.username PBPUBLIC
-#hibernate.connection.password PBPUBLIC
-
-
-
-#################################
-### Hibernate Connection Pool ###
-#################################
-
-hibernate.connection.pool_size 1
-
-
-
-###########################
-### C3P0 Connection Pool###
-###########################
-
-#hibernate.c3p0.max_size 2
-#hibernate.c3p0.min_size 2
-#hibernate.c3p0.timeout 5000
-#hibernate.c3p0.max_statements 100
-#hibernate.c3p0.idle_test_period 3000
-#hibernate.c3p0.acquire_increment 2
-#hibernate.c3p0.validate false
-
-
-
-##############################
-### Proxool Connection Pool###
-##############################
-
-## Properties for external configuration of Proxool
-
-hibernate.proxool.pool_alias pool1
-
-## Only need one of the following
-
-#hibernate.proxool.existing_pool true
-#hibernate.proxool.xml proxool.xml
-#hibernate.proxool.properties proxool.properties
-
-
-
-#################################
-### Plugin ConnectionProvider ###
-#################################
-
-## use a custom ConnectionProvider (if not set, Hibernate will choose a built-in ConnectionProvider using hueristics)
-
-#hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.ProxoolConnectionProvider
-
-
-
-#######################
-### Transaction API ###
-#######################
-
-## Enable automatic flush during the JTA beforeCompletion() callback
-## (This setting is relevant with or without the Transaction API)
-
-#hibernate.transaction.flush_before_completion
-
-
-## Enable automatic session close at the end of transaction
-## (This setting is relevant with or without the Transaction API)
-
-#hibernate.transaction.auto_close_session
-
-
-## the Transaction API abstracts application code from the underlying JTA or JDBC transactions
-
-#hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
-#hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
-
-
-## to use JTATransactionFactory, Hibernate must be able to locate the UserTransaction in JNDI
-## default is java:comp/UserTransaction
-## you do NOT need this setting if you specify hibernate.transaction.manager_lookup_class
-
-#jta.UserTransaction jta/usertransaction
-#jta.UserTransaction javax.transaction.UserTransaction
-#jta.UserTransaction UserTransaction
-
-
-## to use the second-level cache with JTA, Hibernate must be able to obtain the JTA TransactionManager
-
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.JBossTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WeblogicTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WebSphereTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.OrionTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.ResinTransactionManagerLookup
-
-
-
-##############################
-### Miscellaneous Settings ###
-##############################
-
-## print all generated SQL to the console
-
-#hibernate.show_sql true
-
-
-## add comments to the generated SQL
-
-#hibernate.use_sql_comments true
-
-
-## generate statistics
-
-#hibernate.generate_statistics true
-
-
-## auto schema export
-
-#hibernate.hbm2ddl.auto create-drop
-#hibernate.hbm2ddl.auto create
-#hibernate.hbm2ddl.auto update
-
-
-## specify a default schema and catalog for unqualified tablenames
-
-#hibernate.default_schema test
-#hibernate.default_catalog test
-
-
-## enable ordering of SQL UPDATEs by primary key
-
-hibernate.order_updates true
-
-
-## set the maximum depth of the outer join fetch tree
-
-hibernate.max_fetch_depth 1
-
-
-## set the default batch size for batch fetching
-
-hibernate.default_batch_fetch_size 100
-
-
-## rollback generated identifier values of deleted entities to default values
-
-#hibernate.use_identifer_rollback true
-
-
-## enable CGLIB reflection optimizer (enabled by default)
-
-#hibernate.cglib.use_reflection_optimizer false
-
-
-
-#####################
-### JDBC Settings ###
-#####################
-
-## specify a JDBC isolation level
-
-#hibernate.connection.isolation 4
-
-
-## enable JDBC autocommit (not recommended!)
-
-#hibernate.connection.autocommit true
-
-
-## set the JDBC fetch size
-
-#hibernate.jdbc.fetch_size 25
-
-
-## set the maximum JDBC 2 batch size (a nonzero value enables batching)
-
-#hibernate.jdbc.batch_size 0
-
-
-## enable batch updates even for versioned data
-
-hibernate.jdbc.batch_versioned_data true
-
-
-## enable use of JDBC 2 scrollable ResultSets (specifying a Dialect will cause Hibernate to use a sensible default)
-
-#hibernate.jdbc.use_scrollable_resultset true
-
-
-## use streams when writing binary types to / from JDBC
-
-hibernate.jdbc.use_streams_for_binary true
-
-
-## use JDBC 3 PreparedStatement.getGeneratedKeys() to get the identifier of an inserted row
-
-#hibernate.jdbc.use_get_generated_keys false
-
-
-## choose a custom JDBC batcher
-
-# hibernate.jdbc.factory_class
-
-
-## enable JDBC result set column alias caching
-## (minor performance enhancement for broken JDBC drivers)
-
-# hibernate.jdbc.wrap_result_sets
-
-
-## choose a custom SQL exception converter
-
-#hibernate.jdbc.sql_exception_converter
-
-
-
-##########################
-### Second-level Cache ###
-##########################
-
-## optimize chache for minimal "puts" instead of minimal "gets" (good for clustered cache)
-
-#hibernate.cache.use_minimal_puts true
-
-
-## set a prefix for cache region names
-
-hibernate.cache.region_prefix hibernate.test
-
-
-## disable the second-level cache
-
-#hibernate.cache.use_second_level_cache false
-
-
-## enable the query cache
-
-hibernate.cache.use_query_cache true
-
-
-## store the second-level cache entries in a more human-friendly format
-
-#hibernate.cache.use_structured_entries true
-
-
-## choose a cache implementation
-
-#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
-hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
-
-
-## choose a custom query cache implementation
-
-#hibernate.cache.query_cache_factory
-
-
-
-############
-### JNDI ###
-############
-
-## specify a JNDI name for the SessionFactory
-
-#hibernate.session_factory_name hibernate/session_factory
-
-
-## Hibernate uses JNDI to bind a name to a SessionFactory and to look up the JTA UserTransaction;
-## if hibernate.jndi.* are not specified, Hibernate will use the default InitialContext() which
-## is the best approach in an application server
-
-#file system
-#hibernate.jndi.class com.sun.jndi.fscontext.RefFSContextFactory
-#hibernate.jndi.url file:/
-
-#WebSphere
-#hibernate.jndi.class com.ibm.websphere.naming.WsnInitialContextFactory
-#hibernate.jndi.url iiop://localhost:900/
-
Copied: trunk/HibernateExt/search/src/test/hibernate.properties (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/hibernate.properties)
===================================================================
--- trunk/HibernateExt/search/src/test/hibernate.properties (rev 0)
+++ trunk/HibernateExt/search/src/test/hibernate.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,472 @@
+######################
+### Query Language ###
+######################
+
+## define query language constants / function names
+
+hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
+
+
+## select the classic query parser
+
+#hibernate.query.factory_class org.hibernate.hql.classic.ClassicQueryTranslatorFactory
+
+hibernate.format_sql true
+
+
+
+#################
+### Platforms ###
+#################
+
+## JNDI Datasource
+
+#hibernate.connection.datasource jdbc/test
+#hibernate.connection.username db2
+#hibernate.connection.password db2
+
+
+## HypersonicSQL
+
+hibernate.dialect org.hibernate.dialect.HSQLDialect
+hibernate.connection.driver_class org.hsqldb.jdbcDriver
+hibernate.connection.username sa
+hibernate.connection.password
+#hibernate.connection.url jdbc:hsqldb:hsql://localhost
+#hibernate.connection.url jdbc:hsqldb:test
+hibernate.connection.url jdbc:hsqldb:mem:common
+
+
+## MySQL
+
+#hibernate.dialect org.hibernate.dialect.MySQLDialect
+#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
+#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
+#hibernate.connection.driver_class com.mysql.jdbc.Driver
+#hibernate.connection.url jdbc:mysql:///test
+#hibernate.connection.username emmanuel
+#hibernate.connection.password
+
+
+## Oracle
+
+#hibernate.dialect org.hibernate.dialect.OracleDialect
+#hibernate.dialect org.hibernate.dialect.Oracle9Dialect
+#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
+#hibernate.connection.username ora
+#hibernate.connection.password ora
+#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:test
+
+
+## PostgreSQL
+
+#hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
+#hibernate.connection.driver_class org.postgresql.Driver
+#hibernate.connection.url jdbc:postgresql:annotations
+#hibernate.connection.username postgres
+#hibernate.connection.password hibernate
+#hibernate.query.substitutions yes 'Y', no 'N'
+
+
+## DB2
+
+#hibernate.dialect org.hibernate.dialect.DB2Dialect
+#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
+#hibernate.connection.url jdbc:db2:test
+#hibernate.connection.username db2
+#hibernate.connection.password db2
+
+## TimesTen (not supported yet)
+
+#hibernate.dialect org.hibernate.dialect.TimesTenDialect
+#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
+#hibernate.connection.url jdbc:timesten:direct:test
+#hibernate.connection.username
+#hibernate.connection.password
+
+## DB2/400
+
+#hibernate.dialect org.hibernate.dialect.DB2400Dialect
+#hibernate.connection.username user
+#hibernate.connection.password password
+
+## Native driver
+#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
+#hibernate.connection.url jdbc:db2://systemname
+
+## Toolbox driver
+#hibernate.connection.driver_class com.ibm.as400.access.AS400JDBCDriver
+#hibernate.connection.url jdbc:as400://systemname
+
+
+## Derby (Not supported!)
+
+#hibernate.dialect org.hibernate.dialect.DerbyDialect
+#hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver
+#hibernate.connection.username
+#hibernate.connection.password
+#hibernate.connection.url jdbc:derby:/test;create=true
+
+
+## Sybase
+
+#hibernate.dialect org.hibernate.dialect.SybaseDialect
+#hibernate.connection.driver_class com.sybase.jdbc2.jdbc.SybDriver
+#hibernate.connection.username sa
+#hibernate.connection.password sasasa
+#hibernate.connection.url jdbc:sybase:Tds:co3061835-a:5000/tempdb
+
+
+## Mckoi SQL
+
+#hibernate.dialect org.hibernate.dialect.MckoiDialect
+#hibernate.connection.driver_class com.mckoi.JDBCDriver
+#hibernate.connection.url jdbc:mckoi:///
+#hibernate.connection.url jdbc:mckoi:local://C:/mckoi1.00/db.conf
+#hibernate.connection.username admin
+#hibernate.connection.password nimda
+
+
+## SAP DB
+
+#hibernate.dialect org.hibernate.dialect.SAPDBDialect
+#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
+#hibernate.connection.url jdbc:sapdb://localhost/TST
+#hibernate.connection.username TEST
+#hibernate.connection.password TEST
+#hibernate.query.substitutions yes 'Y', no 'N'
+
+
+## MS SQL Server
+
+#hibernate.dialect org.hibernate.dialect.SQLServerDialect
+#hibernate.connection.username sa
+#hibernate.connection.password sa
+
+## JSQL Driver
+#hibernate.connection.driver_class com.jnetdirect.jsql.JSQLDriver
+#hibernate.connection.url jdbc:JSQLConnect://1E1/test
+
+## JTURBO Driver
+#hibernate.connection.driver_class com.newatlanta.jturbo.driver.Driver
+#hibernate.connection.url jdbc:JTurbo://1E1:1433/test
+
+## WebLogic Driver
+#hibernate.connection.driver_class weblogic.jdbc.mssqlserver4.Driver
+#hibernate.connection.url jdbc:weblogic:mssqlserver4:1E1:1433
+
+## Microsoft Driver (not recommended!)
+#hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
+#hibernate.connection.url jdbc:microsoft:sqlserver://1E1;DatabaseName=test;SelectMethod=cursor
+
+## jTDS (since version 0.9)
+#hibernate.connection.driver_class net.sourceforge.jtds.jdbc.Driver
+#hibernate.connection.url jdbc:jtds:sqlserver://1E1/test
+
+## Interbase
+
+#hibernate.dialect org.hibernate.dialect.InterbaseDialect
+#hibernate.connection.username sysdba
+#hibernate.connection.password masterkey
+
+## DO NOT specify hibernate.connection.sqlDialect
+
+## InterClient
+
+#hibernate.connection.driver_class interbase.interclient.Driver
+#hibernate.connection.url jdbc:interbase://localhost:3060/C:/firebird/test.gdb
+
+## Pure Java
+
+#hibernate.connection.driver_class org.firebirdsql.jdbc.FBDriver
+#hibernate.connection.url jdbc:firebirdsql:localhost/3050:/firebird/test.gdb
+
+
+## Pointbase
+
+#hibernate.dialect org.hibernate.dialect.PointbaseDialect
+#hibernate.connection.driver_class com.pointbase.jdbc.jdbcUniversalDriver
+#hibernate.connection.url jdbc:pointbase:embedded:sample
+#hibernate.connection.username PBPUBLIC
+#hibernate.connection.password PBPUBLIC
+
+
+
+#################################
+### Hibernate Connection Pool ###
+#################################
+
+hibernate.connection.pool_size 1
+
+
+
+###########################
+### C3P0 Connection Pool###
+###########################
+
+#hibernate.c3p0.max_size 2
+#hibernate.c3p0.min_size 2
+#hibernate.c3p0.timeout 5000
+#hibernate.c3p0.max_statements 100
+#hibernate.c3p0.idle_test_period 3000
+#hibernate.c3p0.acquire_increment 2
+#hibernate.c3p0.validate false
+
+
+
+##############################
+### Proxool Connection Pool###
+##############################
+
+## Properties for external configuration of Proxool
+
+hibernate.proxool.pool_alias pool1
+
+## Only need one of the following
+
+#hibernate.proxool.existing_pool true
+#hibernate.proxool.xml proxool.xml
+#hibernate.proxool.properties proxool.properties
+
+
+
+#################################
+### Plugin ConnectionProvider ###
+#################################
+
+## use a custom ConnectionProvider (if not set, Hibernate will choose a built-in ConnectionProvider using hueristics)
+
+#hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.ProxoolConnectionProvider
+
+
+
+#######################
+### Transaction API ###
+#######################
+
+## Enable automatic flush during the JTA beforeCompletion() callback
+## (This setting is relevant with or without the Transaction API)
+
+#hibernate.transaction.flush_before_completion
+
+
+## Enable automatic session close at the end of transaction
+## (This setting is relevant with or without the Transaction API)
+
+#hibernate.transaction.auto_close_session
+
+
+## the Transaction API abstracts application code from the underlying JTA or JDBC transactions
+
+#hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
+#hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
+
+
+## to use JTATransactionFactory, Hibernate must be able to locate the UserTransaction in JNDI
+## default is java:comp/UserTransaction
+## you do NOT need this setting if you specify hibernate.transaction.manager_lookup_class
+
+#jta.UserTransaction jta/usertransaction
+#jta.UserTransaction javax.transaction.UserTransaction
+#jta.UserTransaction UserTransaction
+
+
+## to use the second-level cache with JTA, Hibernate must be able to obtain the JTA TransactionManager
+
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.JBossTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WeblogicTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WebSphereTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.OrionTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.ResinTransactionManagerLookup
+
+
+
+##############################
+### Miscellaneous Settings ###
+##############################
+
+## print all generated SQL to the console
+
+#hibernate.show_sql true
+
+
+## add comments to the generated SQL
+
+#hibernate.use_sql_comments true
+
+
+## generate statistics
+
+#hibernate.generate_statistics true
+
+
+## auto schema export
+
+#hibernate.hbm2ddl.auto create-drop
+#hibernate.hbm2ddl.auto create
+#hibernate.hbm2ddl.auto update
+
+
+## specify a default schema and catalog for unqualified tablenames
+
+#hibernate.default_schema test
+#hibernate.default_catalog test
+
+
+## enable ordering of SQL UPDATEs by primary key
+
+hibernate.order_updates true
+
+
+## set the maximum depth of the outer join fetch tree
+
+hibernate.max_fetch_depth 1
+
+
+## set the default batch size for batch fetching
+
+hibernate.default_batch_fetch_size 100
+
+
+## rollback generated identifier values of deleted entities to default values
+
+#hibernate.use_identifer_rollback true
+
+
+## enable CGLIB reflection optimizer (enabled by default)
+
+#hibernate.cglib.use_reflection_optimizer false
+
+
+
+#####################
+### JDBC Settings ###
+#####################
+
+## specify a JDBC isolation level
+
+#hibernate.connection.isolation 4
+
+
+## enable JDBC autocommit (not recommended!)
+
+#hibernate.connection.autocommit true
+
+
+## set the JDBC fetch size
+
+#hibernate.jdbc.fetch_size 25
+
+
+## set the maximum JDBC 2 batch size (a nonzero value enables batching)
+
+#hibernate.jdbc.batch_size 0
+
+
+## enable batch updates even for versioned data
+
+hibernate.jdbc.batch_versioned_data true
+
+
+## enable use of JDBC 2 scrollable ResultSets (specifying a Dialect will cause Hibernate to use a sensible default)
+
+#hibernate.jdbc.use_scrollable_resultset true
+
+
+## use streams when writing binary types to / from JDBC
+
+hibernate.jdbc.use_streams_for_binary true
+
+
+## use JDBC 3 PreparedStatement.getGeneratedKeys() to get the identifier of an inserted row
+
+#hibernate.jdbc.use_get_generated_keys false
+
+
+## choose a custom JDBC batcher
+
+# hibernate.jdbc.factory_class
+
+
+## enable JDBC result set column alias caching
+## (minor performance enhancement for broken JDBC drivers)
+
+# hibernate.jdbc.wrap_result_sets
+
+
+## choose a custom SQL exception converter
+
+#hibernate.jdbc.sql_exception_converter
+
+
+
+##########################
+### Second-level Cache ###
+##########################
+
+## optimize chache for minimal "puts" instead of minimal "gets" (good for clustered cache)
+
+#hibernate.cache.use_minimal_puts true
+
+
+## set a prefix for cache region names
+
+hibernate.cache.region_prefix hibernate.test
+
+
+## disable the second-level cache
+
+#hibernate.cache.use_second_level_cache false
+
+
+## enable the query cache
+
+hibernate.cache.use_query_cache true
+
+
+## store the second-level cache entries in a more human-friendly format
+
+#hibernate.cache.use_structured_entries true
+
+
+## choose a cache implementation
+
+#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
+hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
+
+
+## choose a custom query cache implementation
+
+#hibernate.cache.query_cache_factory
+
+
+
+############
+### JNDI ###
+############
+
+## specify a JNDI name for the SessionFactory
+
+#hibernate.session_factory_name hibernate/session_factory
+
+
+## Hibernate uses JNDI to bind a name to a SessionFactory and to look up the JTA UserTransaction;
+## if hibernate.jndi.* are not specified, Hibernate will use the default InitialContext() which
+## is the best approach in an application server
+
+#file system
+#hibernate.jndi.class com.sun.jndi.fscontext.RefFSContextFactory
+#hibernate.jndi.url file:/
+
+#WebSphere
+#hibernate.jndi.class com.ibm.websphere.naming.WsnInitialContextFactory
+#hibernate.jndi.url iiop://localhost:900/
+
Deleted: trunk/HibernateExt/search/src/test/log4j.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/log4j.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/log4j.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,48 +0,0 @@
-### direct log messages to stdout ###
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
-
-### direct messages to file hibernate.log ###
-#log4j.appender.file=org.apache.log4j.FileAppender
-#log4j.appender.file.File=hibernate.log
-#log4j.appender.file.layout=org.apache.log4j.PatternLayout
-#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
-
-### set log levels - for more verbose logging change 'info' to 'debug' ###
-
-log4j.rootLogger=warn, stdout
-log4j.logger.org.jboss=info
-#log4j.logger.com.jboss=debug
-
-log4j.logger.org.hibernate=info
-
-log4j.logger.org.hibernate.search=debug
-
-
-### log just the SQL
-log4j.logger.org.hibernate.SQL=debug
-
-#log4j.logger.org.hibernate.engine.CascadingAction=debug
-
-### log JDBC bind parameters ###
-#log4j.logger.org.hibernate.type=debug
-
-### log schema export/update ###
-log4j.logger.org.hibernate.tool.hbm2ddl=warn
-
-### log cache activity ###
-#log4j.logger.org.hibernate.cache=debug
-
-### enable the following line if you want to track down connection ###
-### leakages when using DriverManagerConnectionProvider ###
-#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
-
-### annotation logs
-#log4j.logger.org.hibernate.annotation=info
-#log4j.logger.org.hibernate.cfg=info
-#log4j.logger.org.hibernate.cfg.SettingsFactory=info
-#log4j.logger.org.hibernate.cfg.AnnotationBinder=info
-#log4j.logger.org.hibernate.cfg.AnnotationConfiguration=info
-#log4j.logger.org.hibernate.cfg.Ejb3Column=info
\ No newline at end of file
Copied: trunk/HibernateExt/search/src/test/log4j.properties (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/log4j.properties)
===================================================================
--- trunk/HibernateExt/search/src/test/log4j.properties (rev 0)
+++ trunk/HibernateExt/search/src/test/log4j.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,48 @@
+### direct log messages to stdout ###
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+
+### direct messages to file hibernate.log ###
+#log4j.appender.file=org.apache.log4j.FileAppender
+#log4j.appender.file.File=hibernate.log
+#log4j.appender.file.layout=org.apache.log4j.PatternLayout
+#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+
+### set log levels - for more verbose logging change 'info' to 'debug' ###
+
+log4j.rootLogger=warn, stdout
+log4j.logger.org.jboss=info
+#log4j.logger.com.jboss=debug
+
+log4j.logger.org.hibernate=info
+
+log4j.logger.org.hibernate.search=debug
+
+
+### log just the SQL
+log4j.logger.org.hibernate.SQL=debug
+
+#log4j.logger.org.hibernate.engine.CascadingAction=debug
+
+### log JDBC bind parameters ###
+#log4j.logger.org.hibernate.type=debug
+
+### log schema export/update ###
+log4j.logger.org.hibernate.tool.hbm2ddl=warn
+
+### log cache activity ###
+#log4j.logger.org.hibernate.cache=debug
+
+### enable the following line if you want to track down connection ###
+### leakages when using DriverManagerConnectionProvider ###
+#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
+
+### annotation logs
+#log4j.logger.org.hibernate.annotation=info
+#log4j.logger.org.hibernate.cfg=info
+#log4j.logger.org.hibernate.cfg.SettingsFactory=info
+#log4j.logger.org.hibernate.cfg.AnnotationBinder=info
+#log4j.logger.org.hibernate.cfg.AnnotationConfiguration=info
+#log4j.logger.org.hibernate.cfg.Ejb3Column=info
\ No newline at end of file
Copied: trunk/HibernateExt/search/src/test/org (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org)
Copied: trunk/HibernateExt/search/src/test/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate)
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search)
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/AlternateDocument.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/AlternateDocument.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/AlternateDocument.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,81 +0,0 @@
-//$Id: $
-package org.hibernate.search.test;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Store;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.Boost;
-
-/**
- * Example of 2 entities mapped in the same index
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed(index = "Documents")
-public class AlternateDocument {
- private Long id;
- private String title;
- private String summary;
- private String text;
-
- AlternateDocument() {
- }
-
- public AlternateDocument(Long id, String title, String summary, String text) {
- super();
- this.id = id;
- this.summary = summary;
- this.text = text;
- this.title = title;
- }
-
- @Id
- //@Keyword(id = true)
- @DocumentId()
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- //@Text
- @Field( name = "alt_title", store = Store.YES, index = Index.TOKENIZED )
- @Boost(2)
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- //@Unstored(name = "Abstract")
- @Field( name="Abstract", store = Store.NO, index = Index.TOKENIZED )
- public String getSummary() {
- return summary;
- }
-
- public void setSummary(String summary) {
- this.summary = summary;
- }
-
- @Lob
- //@Unstored
- @Field( store = Store.NO, index = Index.TOKENIZED )
- public String getText() {
- return text;
- }
-
- public void setText(String text) {
- this.text = text;
- }
-}
-
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/AlternateDocument.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/AlternateDocument.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/AlternateDocument.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/AlternateDocument.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,81 @@
+//$Id: $
+package org.hibernate.search.test;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Store;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Boost;
+
+/**
+ * Example of 2 entities mapped in the same index
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed(index = "Documents")
+public class AlternateDocument {
+ private Long id;
+ private String title;
+ private String summary;
+ private String text;
+
+ AlternateDocument() {
+ }
+
+ public AlternateDocument(Long id, String title, String summary, String text) {
+ super();
+ this.id = id;
+ this.summary = summary;
+ this.text = text;
+ this.title = title;
+ }
+
+ @Id
+ //@Keyword(id = true)
+ @DocumentId()
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ //@Text
+ @Field( name = "alt_title", store = Store.YES, index = Index.TOKENIZED )
+ @Boost(2)
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ //@Unstored(name = "Abstract")
+ @Field( name="Abstract", store = Store.NO, index = Index.TOKENIZED )
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ @Lob
+ //@Unstored
+ @Field( store = Store.NO, index = Index.TOKENIZED )
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+}
+
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/Clock.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/Clock.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/Clock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id: $
-package org.hibernate.search.test;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.Text;
-import org.hibernate.search.annotations.Keyword;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed
-public class Clock {
- private Integer id;
- private String brand;
-
- public Clock(Integer id, String brand) {
- this.id = id;
- this.brand = brand;
- }
-
- @Text public String getBrand() {
- return brand;
- }
-
- public void setBrand(String brand) {
- this.brand = brand;
- }
-
- @Id @Keyword
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/Clock.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/Clock.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/Clock.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/Clock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id: $
+package org.hibernate.search.test;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Text;
+import org.hibernate.search.annotations.Keyword;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+public class Clock {
+ private Integer id;
+ private String brand;
+
+ public Clock(Integer id, String brand) {
+ this.id = id;
+ this.brand = brand;
+ }
+
+ @Text public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ @Id @Keyword
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/Document.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/Document.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/Document.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,77 +0,0 @@
-//$Id: Document.java 10742 2006-11-07 01:03:16Z epbernard $
-package org.hibernate.search.test;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.Lob;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.Boost;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Store;
-
- at Entity
- at Indexed(index = "Documents")
-public class Document {
- private Long id;
- private String title;
- private String summary;
- private String text;
-
- Document() {
- }
-
- public Document(String title, String summary, String text) {
- super();
- this.summary = summary;
- this.text = text;
- this.title = title;
- }
-
- @Id
- @GeneratedValue
- //@Keyword(id = true)
- @DocumentId
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- //@Text
- @Field( store = Store.YES, index = Index.TOKENIZED )
- @Boost(2)
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- //@Unstored(name = "Abstract")
- @Field( name="Abstract", store = Store.NO, index = Index.TOKENIZED )
- public String getSummary() {
- return summary;
- }
-
- public void setSummary(String summary) {
- this.summary = summary;
- }
-
- @Lob
- //@Unstored
- @Field( store = Store.NO, index = Index.TOKENIZED )
- public String getText() {
- return text;
- }
-
- public void setText(String text) {
- this.text = text;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/Document.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/Document.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/Document.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/Document.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,77 @@
+//$Id: Document.java 10742 2006-11-07 01:03:16Z epbernard $
+package org.hibernate.search.test;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.Lob;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Boost;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Store;
+
+ at Entity
+ at Indexed(index = "Documents")
+public class Document {
+ private Long id;
+ private String title;
+ private String summary;
+ private String text;
+
+ Document() {
+ }
+
+ public Document(String title, String summary, String text) {
+ super();
+ this.summary = summary;
+ this.text = text;
+ this.title = title;
+ }
+
+ @Id
+ @GeneratedValue
+ //@Keyword(id = true)
+ @DocumentId
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ //@Text
+ @Field( store = Store.YES, index = Index.TOKENIZED )
+ @Boost(2)
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ //@Unstored(name = "Abstract")
+ @Field( name="Abstract", store = Store.NO, index = Index.TOKENIZED )
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ @Lob
+ //@Unstored
+ @Field( store = Store.NO, index = Index.TOKENIZED )
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,195 +0,0 @@
-//$Id: LuceneTest.java 10014 2006-06-12 09:56:27 -0700 (lun., 12 juin 2006) epbernard $
-package org.hibernate.search.test;
-
-import java.io.File;
-import java.util.List;
-
-import org.apache.lucene.analysis.StopAnalyzer;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.lucene.index.IndexReader;
-import org.apache.lucene.index.Term;
-import org.apache.lucene.index.TermDocs;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.search.Hits;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.Query;
-import org.hibernate.Session;
-import org.hibernate.event.PostDeleteEventListener;
-import org.hibernate.event.PostInsertEventListener;
-import org.hibernate.event.PostUpdateEventListener;
-import org.hibernate.search.Environment;
-import org.hibernate.search.event.FullTextIndexEventListener;
-import org.hibernate.search.store.FSDirectoryProvider;
-
-/**
- * @author Gavin King
- */
-public class FSDirectoryTest extends SearchTestCase {
-
-
- protected void setUp() throws Exception {
- File sub = getBaseIndexDir();
- sub.mkdir();
- File[] files = sub.listFiles();
- for (File file : files) {
- if ( file.isDirectory() ) {
- delete( file );
- }
- }
- //super.setUp(); //we need a fresh session factory each time for index set up
- buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
- }
-
- private File getBaseIndexDir() {
- File current = new File( "." );
- File sub = new File( current, "indextemp" );
- return sub;
- }
-
- protected void tearDown() throws Exception {
- super.tearDown();
- File sub = getBaseIndexDir();
- delete( sub );
- }
-
- private void delete(File sub) {
- if ( sub.isDirectory() ) {
- for ( File file : sub.listFiles() ) {
- delete( file );
- }
- sub.delete();
- }
- else {
- sub.delete();
- }
- }
-
- public void testEventIntegration() throws Exception {
-
-
- Session s = getSessions().openSession();
- s.getTransaction().begin();
- s.persist(
- new Document( "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" )
- );
- s.getTransaction().commit();
- s.close();
- IndexReader reader = IndexReader.open( new File( getBaseIndexDir(), "Documents" ) );
- try {
- int num = reader.numDocs();
- assertEquals( 1, num );
- TermDocs docs = reader.termDocs( new Term( "Abstract", "Hibernate" ) );
- org.apache.lucene.document.Document doc = reader.document( docs.doc() );
- assertFalse( docs.next() );
- docs = reader.termDocs( new Term( "Title", "Action" ) );
- doc = reader.document( docs.doc() );
- assertFalse( docs.next() );
- assertEquals( "1", doc.getField( "id" ).stringValue() );
- }
- finally {
- reader.close();
- }
-
- s = getSessions().openSession();
- s.getTransaction().begin();
- Document entity = (Document) s.get( Document.class, new Long( 1 ) );
- entity.setSummary( "Object/relational mapping with EJB3" );
- s.persist( new Document( "Seam in Action", "", "blah blah blah blah" ) );
- s.getTransaction().commit();
- s.close();
-
- reader = IndexReader.open( new File( getBaseIndexDir(), "Documents" ) );
- try {
- int num = reader.numDocs();
- assertEquals( 2, num );
- TermDocs docs = reader.termDocs( new Term( "Abstract", "ejb" ) );
- assertTrue( docs.next() );
- org.apache.lucene.document.Document doc = reader.document( docs.doc() );
- assertFalse( docs.next() );
- }
- finally {
- reader.close();
- }
-
- s = getSessions().openSession();
- s.getTransaction().begin();
- s.delete( entity );
- s.getTransaction().commit();
- s.close();
-
- reader = IndexReader.open( new File( getBaseIndexDir(), "Documents" ) );
- try {
- int num = reader.numDocs();
- assertEquals( 1, num );
- TermDocs docs = reader.termDocs( new Term( "title", "seam" ) );
- assertTrue( docs.next() );
- org.apache.lucene.document.Document doc = reader.document( docs.doc() );
- assertFalse( docs.next() );
- assertEquals( "2", doc.getField( "id" ).stringValue() );
- }
- finally {
- reader.close();
- }
-
- s = getSessions().openSession();
- s.getTransaction().begin();
- s.delete( s.createCriteria( Document.class ).uniqueResult() );
- s.getTransaction().commit();
- s.close();
- }
-
- public void testBoost() throws Exception {
- Session s = getSessions().openSession();
- s.getTransaction().begin();
- s.persist(
- new Document( "Hibernate in Action", "Object and Relational", "blah blah blah" )
- );
- s.persist(
- new Document( "Object and Relational", "Hibernate in Action", "blah blah blah" )
- );
- s.getTransaction().commit();
- s.close();
-
- IndexSearcher searcher = new IndexSearcher( new File( getBaseIndexDir(), "Documents" ).getCanonicalPath() );
- try {
- QueryParser qp = new QueryParser( "id", new StandardAnalyzer() );
- Query query = qp.parse( "title:Action OR Abstract:Action" );
- Hits hits = searcher.search( query );
- assertEquals( 2, hits.length() );
- assertTrue( hits.score( 0 ) == 2 * hits.score( 1 ) );
- assertEquals( "Hibernate in Action", hits.doc( 0 ).get( "title" ) );
- }
- finally {
- searcher.close();
- }
-
-
- s = getSessions().openSession();
- s.getTransaction().begin();
- List list = s.createQuery( "from Document" ).list();
- for ( Document document : (List<Document>) list ) {
- s.delete( document );
- }
- s.getTransaction().commit();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Document.class
- };
- }
-
- protected void configure(org.hibernate.cfg.Configuration cfg) {
- File sub = getBaseIndexDir();
- cfg.setProperty( "hibernate.search.default.indexBase", sub.getAbsolutePath() );
- cfg.setProperty( "hibernate.search.Clock.directory_provider", FSDirectoryProvider.class.getName() );
- cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
- FullTextIndexEventListener del = new FullTextIndexEventListener();
- cfg.getEventListeners().setPostDeleteEventListeners( new PostDeleteEventListener[]{del} );
- cfg.getEventListeners().setPostUpdateEventListeners( new PostUpdateEventListener[]{del} );
- cfg.getEventListeners().setPostInsertEventListeners( new PostInsertEventListener[]{del} );
- }
-
-}
-
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/FSDirectoryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,195 @@
+//$Id: LuceneTest.java 10014 2006-06-12 09:56:27 -0700 (lun., 12 juin 2006) epbernard $
+package org.hibernate.search.test;
+
+import java.io.File;
+import java.util.List;
+
+import org.apache.lucene.analysis.StopAnalyzer;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.index.IndexReader;
+import org.apache.lucene.index.Term;
+import org.apache.lucene.index.TermDocs;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.search.Hits;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Query;
+import org.hibernate.Session;
+import org.hibernate.event.PostDeleteEventListener;
+import org.hibernate.event.PostInsertEventListener;
+import org.hibernate.event.PostUpdateEventListener;
+import org.hibernate.search.Environment;
+import org.hibernate.search.event.FullTextIndexEventListener;
+import org.hibernate.search.store.FSDirectoryProvider;
+
+/**
+ * @author Gavin King
+ */
+public class FSDirectoryTest extends SearchTestCase {
+
+
+ protected void setUp() throws Exception {
+ File sub = getBaseIndexDir();
+ sub.mkdir();
+ File[] files = sub.listFiles();
+ for (File file : files) {
+ if ( file.isDirectory() ) {
+ delete( file );
+ }
+ }
+ //super.setUp(); //we need a fresh session factory each time for index set up
+ buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
+ }
+
+ private File getBaseIndexDir() {
+ File current = new File( "." );
+ File sub = new File( current, "indextemp" );
+ return sub;
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ File sub = getBaseIndexDir();
+ delete( sub );
+ }
+
+ private void delete(File sub) {
+ if ( sub.isDirectory() ) {
+ for ( File file : sub.listFiles() ) {
+ delete( file );
+ }
+ sub.delete();
+ }
+ else {
+ sub.delete();
+ }
+ }
+
+ public void testEventIntegration() throws Exception {
+
+
+ Session s = getSessions().openSession();
+ s.getTransaction().begin();
+ s.persist(
+ new Document( "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" )
+ );
+ s.getTransaction().commit();
+ s.close();
+ IndexReader reader = IndexReader.open( new File( getBaseIndexDir(), "Documents" ) );
+ try {
+ int num = reader.numDocs();
+ assertEquals( 1, num );
+ TermDocs docs = reader.termDocs( new Term( "Abstract", "Hibernate" ) );
+ org.apache.lucene.document.Document doc = reader.document( docs.doc() );
+ assertFalse( docs.next() );
+ docs = reader.termDocs( new Term( "Title", "Action" ) );
+ doc = reader.document( docs.doc() );
+ assertFalse( docs.next() );
+ assertEquals( "1", doc.getField( "id" ).stringValue() );
+ }
+ finally {
+ reader.close();
+ }
+
+ s = getSessions().openSession();
+ s.getTransaction().begin();
+ Document entity = (Document) s.get( Document.class, new Long( 1 ) );
+ entity.setSummary( "Object/relational mapping with EJB3" );
+ s.persist( new Document( "Seam in Action", "", "blah blah blah blah" ) );
+ s.getTransaction().commit();
+ s.close();
+
+ reader = IndexReader.open( new File( getBaseIndexDir(), "Documents" ) );
+ try {
+ int num = reader.numDocs();
+ assertEquals( 2, num );
+ TermDocs docs = reader.termDocs( new Term( "Abstract", "ejb" ) );
+ assertTrue( docs.next() );
+ org.apache.lucene.document.Document doc = reader.document( docs.doc() );
+ assertFalse( docs.next() );
+ }
+ finally {
+ reader.close();
+ }
+
+ s = getSessions().openSession();
+ s.getTransaction().begin();
+ s.delete( entity );
+ s.getTransaction().commit();
+ s.close();
+
+ reader = IndexReader.open( new File( getBaseIndexDir(), "Documents" ) );
+ try {
+ int num = reader.numDocs();
+ assertEquals( 1, num );
+ TermDocs docs = reader.termDocs( new Term( "title", "seam" ) );
+ assertTrue( docs.next() );
+ org.apache.lucene.document.Document doc = reader.document( docs.doc() );
+ assertFalse( docs.next() );
+ assertEquals( "2", doc.getField( "id" ).stringValue() );
+ }
+ finally {
+ reader.close();
+ }
+
+ s = getSessions().openSession();
+ s.getTransaction().begin();
+ s.delete( s.createCriteria( Document.class ).uniqueResult() );
+ s.getTransaction().commit();
+ s.close();
+ }
+
+ public void testBoost() throws Exception {
+ Session s = getSessions().openSession();
+ s.getTransaction().begin();
+ s.persist(
+ new Document( "Hibernate in Action", "Object and Relational", "blah blah blah" )
+ );
+ s.persist(
+ new Document( "Object and Relational", "Hibernate in Action", "blah blah blah" )
+ );
+ s.getTransaction().commit();
+ s.close();
+
+ IndexSearcher searcher = new IndexSearcher( new File( getBaseIndexDir(), "Documents" ).getCanonicalPath() );
+ try {
+ QueryParser qp = new QueryParser( "id", new StandardAnalyzer() );
+ Query query = qp.parse( "title:Action OR Abstract:Action" );
+ Hits hits = searcher.search( query );
+ assertEquals( 2, hits.length() );
+ assertTrue( hits.score( 0 ) == 2 * hits.score( 1 ) );
+ assertEquals( "Hibernate in Action", hits.doc( 0 ).get( "title" ) );
+ }
+ finally {
+ searcher.close();
+ }
+
+
+ s = getSessions().openSession();
+ s.getTransaction().begin();
+ List list = s.createQuery( "from Document" ).list();
+ for ( Document document : (List<Document>) list ) {
+ s.delete( document );
+ }
+ s.getTransaction().commit();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Document.class
+ };
+ }
+
+ protected void configure(org.hibernate.cfg.Configuration cfg) {
+ File sub = getBaseIndexDir();
+ cfg.setProperty( "hibernate.search.default.indexBase", sub.getAbsolutePath() );
+ cfg.setProperty( "hibernate.search.Clock.directory_provider", FSDirectoryProvider.class.getName() );
+ cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
+ FullTextIndexEventListener del = new FullTextIndexEventListener();
+ cfg.getEventListeners().setPostDeleteEventListeners( new PostDeleteEventListener[]{del} );
+ cfg.getEventListeners().setPostUpdateEventListeners( new PostUpdateEventListener[]{del} );
+ cfg.getEventListeners().setPostInsertEventListeners( new PostInsertEventListener[]{del} );
+ }
+
+}
+
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/HANTestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/HANTestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/HANTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,158 +0,0 @@
-//$Id: $
-package org.hibernate.search.test;
-
-import java.io.InputStream;
-
-import org.hibernate.SessionFactory;
-import org.hibernate.Session;
-import org.hibernate.HibernateException;
-import org.hibernate.Interceptor;
-import org.hibernate.dialect.Dialect;
-import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.cfg.Configuration;
-
-/**
- * copy from HAN
- * @author Emmanuel Bernard
- */
-public abstract class HANTestCase extends junit.framework.TestCase {
-
- private static SessionFactory sessions;
- private static AnnotationConfiguration cfg;
- private static Dialect dialect;
- private static Class lastTestClass;
- private Session session;
-
- public HANTestCase() {
- super();
- }
-
- public HANTestCase(String x) {
- super( x );
- }
-
- protected void buildSessionFactory(Class[] classes, String[] packages, String[] xmlFiles) throws Exception {
-
- if ( getSessions() != null ) getSessions().close();
- try {
- setCfg( new AnnotationConfiguration() );
- configure( cfg );
- if ( recreateSchema() ) {
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- }
- for ( int i = 0; i < packages.length; i++ ) {
- getCfg().addPackage( packages[i] );
- }
- for ( int i = 0; i < classes.length; i++ ) {
- getCfg().addAnnotatedClass( classes[i] );
- }
- for ( int i = 0; i < xmlFiles.length; i++ ) {
- InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFiles[i] );
- getCfg().addInputStream( is );
- }
- setDialect( Dialect.getDialect() );
- setSessions( getCfg().buildSessionFactory( /*new TestInterceptor()*/ ) );
- }
- catch (Exception e) {
- e.printStackTrace();
- throw e;
- }
- }
-
- protected void setUp() throws Exception {
- if ( getSessions() == null || lastTestClass != getClass() ) {
- buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
- lastTestClass = getClass();
- }
- }
-
- protected void runTest() throws Throwable {
- try {
- super.runTest();
- if ( session != null && session.isOpen() ) {
- if ( session.isConnected() ) session.connection().rollback();
- session.close();
- session = null;
- fail( "unclosed session" );
- }
- else {
- session = null;
- }
- }
- catch (Throwable e) {
- try {
- if ( session != null && session.isOpen() ) {
- if ( session.isConnected() ) session.connection().rollback();
- session.close();
- }
- }
- catch (Exception ignore) {
- }
- try {
- if ( sessions != null ) {
- sessions.close();
- sessions = null;
- }
- }
- catch (Exception ignore) {
- }
- throw e;
- }
- }
-
- public Session openSession() throws HibernateException {
- session = getSessions().openSession();
- return session;
- }
-
- public Session openSession(Interceptor interceptor) throws HibernateException {
- session = getSessions().openSession( interceptor );
- return session;
- }
-
- protected abstract Class[] getMappings();
-
- protected String[] getAnnotatedPackages() {
- return new String[]{};
- }
-
- protected String[] getXmlFiles() {
- return new String[]{};
- }
-
- private void setSessions(SessionFactory sessions) {
- HANTestCase.sessions = sessions;
- }
-
- protected SessionFactory getSessions() {
- return sessions;
- }
-
- private void setDialect(Dialect dialect) {
- HANTestCase.dialect = dialect;
- }
-
- protected Dialect getDialect() {
- return dialect;
- }
-
- protected static void setCfg(AnnotationConfiguration cfg) {
- HANTestCase.cfg = cfg;
- }
-
- protected static AnnotationConfiguration getCfg() {
- return cfg;
- }
-
- protected void configure(Configuration cfg) {
- //cfg.setNamingStrategy( AlternativeNamingStrategy.INSTANCE );
- //cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
- //cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
- }
-
- protected boolean recreateSchema() {
- return true;
- }
-
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/HANTestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/HANTestCase.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/HANTestCase.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/HANTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,158 @@
+//$Id: $
+package org.hibernate.search.test;
+
+import java.io.InputStream;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.Session;
+import org.hibernate.HibernateException;
+import org.hibernate.Interceptor;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.cfg.Configuration;
+
+/**
+ * copy from HAN
+ * @author Emmanuel Bernard
+ */
+public abstract class HANTestCase extends junit.framework.TestCase {
+
+ private static SessionFactory sessions;
+ private static AnnotationConfiguration cfg;
+ private static Dialect dialect;
+ private static Class lastTestClass;
+ private Session session;
+
+ public HANTestCase() {
+ super();
+ }
+
+ public HANTestCase(String x) {
+ super( x );
+ }
+
+ protected void buildSessionFactory(Class[] classes, String[] packages, String[] xmlFiles) throws Exception {
+
+ if ( getSessions() != null ) getSessions().close();
+ try {
+ setCfg( new AnnotationConfiguration() );
+ configure( cfg );
+ if ( recreateSchema() ) {
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ }
+ for ( int i = 0; i < packages.length; i++ ) {
+ getCfg().addPackage( packages[i] );
+ }
+ for ( int i = 0; i < classes.length; i++ ) {
+ getCfg().addAnnotatedClass( classes[i] );
+ }
+ for ( int i = 0; i < xmlFiles.length; i++ ) {
+ InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFiles[i] );
+ getCfg().addInputStream( is );
+ }
+ setDialect( Dialect.getDialect() );
+ setSessions( getCfg().buildSessionFactory( /*new TestInterceptor()*/ ) );
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ protected void setUp() throws Exception {
+ if ( getSessions() == null || lastTestClass != getClass() ) {
+ buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
+ lastTestClass = getClass();
+ }
+ }
+
+ protected void runTest() throws Throwable {
+ try {
+ super.runTest();
+ if ( session != null && session.isOpen() ) {
+ if ( session.isConnected() ) session.connection().rollback();
+ session.close();
+ session = null;
+ fail( "unclosed session" );
+ }
+ else {
+ session = null;
+ }
+ }
+ catch (Throwable e) {
+ try {
+ if ( session != null && session.isOpen() ) {
+ if ( session.isConnected() ) session.connection().rollback();
+ session.close();
+ }
+ }
+ catch (Exception ignore) {
+ }
+ try {
+ if ( sessions != null ) {
+ sessions.close();
+ sessions = null;
+ }
+ }
+ catch (Exception ignore) {
+ }
+ throw e;
+ }
+ }
+
+ public Session openSession() throws HibernateException {
+ session = getSessions().openSession();
+ return session;
+ }
+
+ public Session openSession(Interceptor interceptor) throws HibernateException {
+ session = getSessions().openSession( interceptor );
+ return session;
+ }
+
+ protected abstract Class[] getMappings();
+
+ protected String[] getAnnotatedPackages() {
+ return new String[]{};
+ }
+
+ protected String[] getXmlFiles() {
+ return new String[]{};
+ }
+
+ private void setSessions(SessionFactory sessions) {
+ HANTestCase.sessions = sessions;
+ }
+
+ protected SessionFactory getSessions() {
+ return sessions;
+ }
+
+ private void setDialect(Dialect dialect) {
+ HANTestCase.dialect = dialect;
+ }
+
+ protected Dialect getDialect() {
+ return dialect;
+ }
+
+ protected static void setCfg(AnnotationConfiguration cfg) {
+ HANTestCase.cfg = cfg;
+ }
+
+ protected static AnnotationConfiguration getCfg() {
+ return cfg;
+ }
+
+ protected void configure(Configuration cfg) {
+ //cfg.setNamingStrategy( AlternativeNamingStrategy.INSTANCE );
+ //cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
+ //cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
+ }
+
+ protected boolean recreateSchema() {
+ return true;
+ }
+
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/RamDirectoryTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/RamDirectoryTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/RamDirectoryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,61 +0,0 @@
-//$Id: $
-package org.hibernate.search.test;
-
-import org.hibernate.Session;
-import org.apache.lucene.index.IndexReader;
-
-/**
- * @author Emmanuel Bernard
- */
-public class RamDirectoryTest extends SearchTestCase {
-
- public void testMultipleEntitiesPerIndex() throws Exception {
-
-
- Session s = getSessions().openSession();
- s.getTransaction().begin();
- Document document =
- new Document( "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" );
- s.persist(document);
- s.flush();
- s.persist(
- new AlternateDocument( document.getId(), "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" )
- );
- s.getTransaction().commit();
- s.close();
-
- assertEquals( 2, getDocumentNbr() );
-
- s = getSessions().openSession();
- s.getTransaction().begin();
- s.delete( s.get( AlternateDocument.class, document.getId() ) );
- s.getTransaction().commit();
- s.close();
-
- assertEquals( 1, getDocumentNbr() );
-
- s = getSessions().openSession();
- s.getTransaction().begin();
- s.delete( s.createCriteria( Document.class ).uniqueResult() );
- s.getTransaction().commit();
- s.close();
- }
-
- private int getDocumentNbr() throws Exception {
- IndexReader reader = IndexReader.open( getDirectory( Document.class ) );
- try {
- return reader.numDocs();
- }
- finally {
- reader.close();
- }
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Document.class,
- AlternateDocument.class
- };
- }
-
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/RamDirectoryTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/RamDirectoryTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/RamDirectoryTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/RamDirectoryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,61 @@
+//$Id: $
+package org.hibernate.search.test;
+
+import org.hibernate.Session;
+import org.apache.lucene.index.IndexReader;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class RamDirectoryTest extends SearchTestCase {
+
+ public void testMultipleEntitiesPerIndex() throws Exception {
+
+
+ Session s = getSessions().openSession();
+ s.getTransaction().begin();
+ Document document =
+ new Document( "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" );
+ s.persist(document);
+ s.flush();
+ s.persist(
+ new AlternateDocument( document.getId(), "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" )
+ );
+ s.getTransaction().commit();
+ s.close();
+
+ assertEquals( 2, getDocumentNbr() );
+
+ s = getSessions().openSession();
+ s.getTransaction().begin();
+ s.delete( s.get( AlternateDocument.class, document.getId() ) );
+ s.getTransaction().commit();
+ s.close();
+
+ assertEquals( 1, getDocumentNbr() );
+
+ s = getSessions().openSession();
+ s.getTransaction().begin();
+ s.delete( s.createCriteria( Document.class ).uniqueResult() );
+ s.getTransaction().commit();
+ s.close();
+ }
+
+ private int getDocumentNbr() throws Exception {
+ IndexReader reader = IndexReader.open( getDirectory( Document.class ) );
+ try {
+ return reader.numDocs();
+ }
+ finally {
+ reader.close();
+ }
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Document.class,
+ AlternateDocument.class
+ };
+ }
+
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id: $
-package org.hibernate.search.test;
-
-import org.apache.lucene.analysis.StopAnalyzer;
-import org.apache.lucene.store.Directory;
-import org.hibernate.HibernateException;
-import org.hibernate.event.PostInsertEventListener;
-import org.hibernate.impl.SessionFactoryImpl;
-import org.hibernate.search.Environment;
-import org.hibernate.search.event.FullTextIndexEventListener;
-import org.hibernate.search.store.RAMDirectoryProvider;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class SearchTestCase extends HANTestCase {
- protected void setUp() throws Exception {
- //super.setUp(); //we need a fresh session factory each time for index set up
- buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
- }
-
- protected Directory getDirectory(Class clazz) {
- return getLuceneEventListener().getSearchFactory().getDirectoryProvider( clazz ).getDirectory();
- }
-
- private FullTextIndexEventListener getLuceneEventListener() {
- PostInsertEventListener[] listeners = ( (SessionFactoryImpl) getSessions() ).getEventListeners().getPostInsertEventListeners();
- FullTextIndexEventListener listener = null;
- //FIXME this sucks since we mandante the event listener use
- for (PostInsertEventListener candidate : listeners) {
- if (candidate instanceof FullTextIndexEventListener ) {
- listener = (FullTextIndexEventListener) candidate;
- break;
- }
- }
- if (listener == null) throw new HibernateException("Lucene event listener not initialized");
- return listener;
- }
-
- protected void configure(org.hibernate.cfg.Configuration cfg) {
- cfg.setProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
- cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/SearchTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id: $
+package org.hibernate.search.test;
+
+import org.apache.lucene.analysis.StopAnalyzer;
+import org.apache.lucene.store.Directory;
+import org.hibernate.HibernateException;
+import org.hibernate.event.PostInsertEventListener;
+import org.hibernate.impl.SessionFactoryImpl;
+import org.hibernate.search.Environment;
+import org.hibernate.search.event.FullTextIndexEventListener;
+import org.hibernate.search.store.RAMDirectoryProvider;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class SearchTestCase extends HANTestCase {
+ protected void setUp() throws Exception {
+ //super.setUp(); //we need a fresh session factory each time for index set up
+ buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
+ }
+
+ protected Directory getDirectory(Class clazz) {
+ return getLuceneEventListener().getSearchFactory().getDirectoryProvider( clazz ).getDirectory();
+ }
+
+ private FullTextIndexEventListener getLuceneEventListener() {
+ PostInsertEventListener[] listeners = ( (SessionFactoryImpl) getSessions() ).getEventListeners().getPostInsertEventListeners();
+ FullTextIndexEventListener listener = null;
+ //FIXME this sucks since we mandante the event listener use
+ for (PostInsertEventListener candidate : listeners) {
+ if (candidate instanceof FullTextIndexEventListener ) {
+ listener = (FullTextIndexEventListener) candidate;
+ break;
+ }
+ }
+ if (listener == null) throw new HibernateException("Lucene event listener not initialized");
+ return listener;
+ }
+
+ protected void configure(org.hibernate.cfg.Configuration cfg) {
+ cfg.setProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
+ cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/TransactionTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/TransactionTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/TransactionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,67 +0,0 @@
-//$Id: $
-package org.hibernate.search.test;
-
-import java.io.IOException;
-
-import org.hibernate.Session;
-import org.apache.lucene.index.IndexReader;
-
-/**
- * @author Emmanuel Bernard
- */
-public class TransactionTest extends SearchTestCase {
-
- public void testTransactionCommit() throws Exception {
- Session s = getSessions().openSession();
- s.getTransaction().begin();
- s.persist(
- new Document( "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" )
- );
- s.persist(
- new Document( "Lucene in Action", "FullText search engine", "blah blah blah" )
- );
- s.persist(
- new Document( "Hibernate Search in Action", "ORM and FullText search engine", "blah blah blah" )
- );
- s.getTransaction().commit();
- s.close();
-
- assertEquals( "transaction.commit() should index", 3, getDocumentNumber() );
-
- s = getSessions().openSession();
- s.getTransaction().begin();
- s.persist(
- new Document( "Java Persistence with Hibernate", "Object/relational mapping with Hibernate", "blah blah blah" )
- );
- s.flush();
- s.getTransaction().rollback();
- s.close();
-
- assertEquals( "rollback() should not index", 3, getDocumentNumber() );
-
- s = getSessions().openSession();
- s.persist(
- new Document( "Java Persistence with Hibernate", "Object/relational mapping with Hibernate", "blah blah blah" )
- );
- s.flush();
- s.close();
-
- assertEquals( "no transaction should index", 4, getDocumentNumber() );
-
- }
-
- private int getDocumentNumber() throws IOException {
- IndexReader reader = IndexReader.open( getDirectory( Document.class ) );
- try {
- return reader.numDocs();
- }
- finally {
- reader.close();
- }
- }
-
-
- protected Class[] getMappings() {
- return new Class[]{Document.class};
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/TransactionTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/TransactionTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/TransactionTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/TransactionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,67 @@
+//$Id: $
+package org.hibernate.search.test;
+
+import java.io.IOException;
+
+import org.hibernate.Session;
+import org.apache.lucene.index.IndexReader;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TransactionTest extends SearchTestCase {
+
+ public void testTransactionCommit() throws Exception {
+ Session s = getSessions().openSession();
+ s.getTransaction().begin();
+ s.persist(
+ new Document( "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" )
+ );
+ s.persist(
+ new Document( "Lucene in Action", "FullText search engine", "blah blah blah" )
+ );
+ s.persist(
+ new Document( "Hibernate Search in Action", "ORM and FullText search engine", "blah blah blah" )
+ );
+ s.getTransaction().commit();
+ s.close();
+
+ assertEquals( "transaction.commit() should index", 3, getDocumentNumber() );
+
+ s = getSessions().openSession();
+ s.getTransaction().begin();
+ s.persist(
+ new Document( "Java Persistence with Hibernate", "Object/relational mapping with Hibernate", "blah blah blah" )
+ );
+ s.flush();
+ s.getTransaction().rollback();
+ s.close();
+
+ assertEquals( "rollback() should not index", 3, getDocumentNumber() );
+
+ s = getSessions().openSession();
+ s.persist(
+ new Document( "Java Persistence with Hibernate", "Object/relational mapping with Hibernate", "blah blah blah" )
+ );
+ s.flush();
+ s.close();
+
+ assertEquals( "no transaction should index", 4, getDocumentNumber() );
+
+ }
+
+ private int getDocumentNumber() throws IOException {
+ IndexReader reader = IndexReader.open( getDirectory( Document.class ) );
+ try {
+ return reader.numDocs();
+ }
+ finally {
+ reader.close();
+ }
+ }
+
+
+ protected Class[] getMappings() {
+ return new Class[]{Document.class};
+ }
+}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/BridgeTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/BridgeTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/BridgeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,154 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.bridge;
-
-import java.util.Date;
-import java.util.List;
-import java.util.GregorianCalendar;
-import java.util.Calendar;
-import java.util.TimeZone;
-
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-
-import org.hibernate.search.test.SearchTestCase;
-import org.hibernate.search.Environment;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.Search;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.lucene.analysis.SimpleAnalyzer;
-
-/**
- * @author Emmanuel Bernard
- */
-public class BridgeTest extends SearchTestCase {
- public void testDefaultAndNullBridges() throws Exception {
- Cloud cloud = new Cloud();
- cloud.setDate( null );
- cloud.setDouble1( null );
- cloud.setDouble2( 2.1d );
- cloud.setInt1( null );
- cloud.setInt2( 2 );
- cloud.setFloat1( null );
- cloud.setFloat2( 2.1f );
- cloud.setLong1( null );
- cloud.setLong2( 2l );
- cloud.setString(null);
- cloud.setType( CloudType.DOG );
- cloud.setStorm( false );
- org.hibernate.Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist(cloud);
- s.flush();
- tx.commit();
-
- tx = s.beginTransaction();
- FullTextSession session = Search.createFullTextSession(s);
- QueryParser parser = new QueryParser("id", new StandardAnalyzer() );
- Query query;
- List result;
-
- query = parser.parse("double2:[2.1 TO 2.1] AND float2:[2.1 TO 2.1] " +
- "AND int2:[2 TO 2.1] AND long2:[2 TO 2.1] AND type:\"dog\" AND storm:false");
-
- result = session.createFullTextQuery(query).list();
- assertEquals( "find primitives and do not fail on null", 1, result.size() );
-
- query = parser.parse("double1:[2.1 TO 2.1] OR float1:[2.1 TO 2.1] OR int1:[2 TO 2.1] OR long1:[2 TO 2.1]");
- result = session.createFullTextQuery(query).list();
- assertEquals( "null elements should not be stored", 0, result.size() ); //the query is dumb because restrictive
-
- s.delete( s.get( Cloud.class, cloud.getId() ) );
- tx.commit();
- s.close();
-
- }
-
- public void testCustomBridges() throws Exception {
- Cloud cloud = new Cloud();
- cloud.setCustomFieldBridge( "This is divided by 2");
- cloud.setCustomStringBridge( "This is div by 4");
- org.hibernate.Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist(cloud);
- s.flush();
- tx.commit();
-
- tx = s.beginTransaction();
- FullTextSession session = Search.createFullTextSession(s);
- QueryParser parser = new QueryParser("id", new SimpleAnalyzer() );
- Query query;
- List result;
-
- query = parser.parse("customFieldBridge:This AND customStringBridge:This");
- result = session.createFullTextQuery(query).list();
- assertEquals( "Properties not mapped", 1, result.size() );
-
- query = parser.parse("customFieldBridge:by AND customStringBridge:is");
- result = session.createFullTextQuery(query).list();
- assertEquals( "Custom types not taken into account", 0, result.size() );
-
- s.delete( s.get( Cloud.class, cloud.getId() ) );
- tx.commit();
- s.close();
-
- }
-
- public void testDateBridge() throws Exception {
- Cloud cloud = new Cloud();
- Calendar c = GregorianCalendar.getInstance();
- c.setTimeZone( TimeZone.getTimeZone( "GMT" ) ); //for the sake of tests
- c.set(2000, 11, 15, 3, 43, 2);
- c.set( Calendar.MILLISECOND, 5 );
-
- Date date = new Date( c.getTimeInMillis() );
- cloud.setDate( date ); //5 millisecond
- cloud.setDateDay( date );
- cloud.setDateHour( date );
- cloud.setDateMillisecond( date );
- cloud.setDateMinute( date );
- cloud.setDateMonth( date );
- cloud.setDateSecond( date );
- cloud.setDateYear( date );
- org.hibernate.Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist(cloud);
- s.flush();
- tx.commit();
-
- tx = s.beginTransaction();
- FullTextSession session = Search.createFullTextSession(s);
- QueryParser parser = new QueryParser("id", new StandardAnalyzer() );
- Query query;
- List result;
-
- query = parser.parse("date:[19900101 TO 20060101]"
- + " AND dateDay:[20001214 TO 2000121501]"
- + " AND dateMonth:[200012 TO 20001201]"
- + " AND dateYear:[2000 TO 200001]"
- + " AND dateHour:[20001214 TO 2000121503]"
- + " AND dateMinute:[20001214 TO 200012150343]"
- + " AND dateSecond:[20001214 TO 20001215034302]"
- + " AND dateMillisecond:[20001214 TO 20001215034302005]"
- );
- result = session.createFullTextQuery(query).list();
- assertEquals( "Date not found or not property truncated", 1, result.size() );
-
- s.delete( s.get( Cloud.class, cloud.getId() ) );
- tx.commit();
- s.close();
-
- }
- protected Class[] getMappings() {
- return new Class[] {
- Cloud.class
- };
- }
-
-
- protected void configure(Configuration cfg) {
- super.configure( cfg );
- cfg.setProperty( Environment.ANALYZER_CLASS, SimpleAnalyzer.class.getName() );
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/BridgeTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/BridgeTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/BridgeTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/BridgeTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,154 @@
+//$Id: $
+package org.hibernate.search.test.bridge;
+
+import java.util.Date;
+import java.util.List;
+import java.util.GregorianCalendar;
+import java.util.Calendar;
+import java.util.TimeZone;
+
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+
+import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.search.Environment;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.analysis.SimpleAnalyzer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class BridgeTest extends SearchTestCase {
+ public void testDefaultAndNullBridges() throws Exception {
+ Cloud cloud = new Cloud();
+ cloud.setDate( null );
+ cloud.setDouble1( null );
+ cloud.setDouble2( 2.1d );
+ cloud.setInt1( null );
+ cloud.setInt2( 2 );
+ cloud.setFloat1( null );
+ cloud.setFloat2( 2.1f );
+ cloud.setLong1( null );
+ cloud.setLong2( 2l );
+ cloud.setString(null);
+ cloud.setType( CloudType.DOG );
+ cloud.setStorm( false );
+ org.hibernate.Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist(cloud);
+ s.flush();
+ tx.commit();
+
+ tx = s.beginTransaction();
+ FullTextSession session = Search.createFullTextSession(s);
+ QueryParser parser = new QueryParser("id", new StandardAnalyzer() );
+ Query query;
+ List result;
+
+ query = parser.parse("double2:[2.1 TO 2.1] AND float2:[2.1 TO 2.1] " +
+ "AND int2:[2 TO 2.1] AND long2:[2 TO 2.1] AND type:\"dog\" AND storm:false");
+
+ result = session.createFullTextQuery(query).list();
+ assertEquals( "find primitives and do not fail on null", 1, result.size() );
+
+ query = parser.parse("double1:[2.1 TO 2.1] OR float1:[2.1 TO 2.1] OR int1:[2 TO 2.1] OR long1:[2 TO 2.1]");
+ result = session.createFullTextQuery(query).list();
+ assertEquals( "null elements should not be stored", 0, result.size() ); //the query is dumb because restrictive
+
+ s.delete( s.get( Cloud.class, cloud.getId() ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testCustomBridges() throws Exception {
+ Cloud cloud = new Cloud();
+ cloud.setCustomFieldBridge( "This is divided by 2");
+ cloud.setCustomStringBridge( "This is div by 4");
+ org.hibernate.Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist(cloud);
+ s.flush();
+ tx.commit();
+
+ tx = s.beginTransaction();
+ FullTextSession session = Search.createFullTextSession(s);
+ QueryParser parser = new QueryParser("id", new SimpleAnalyzer() );
+ Query query;
+ List result;
+
+ query = parser.parse("customFieldBridge:This AND customStringBridge:This");
+ result = session.createFullTextQuery(query).list();
+ assertEquals( "Properties not mapped", 1, result.size() );
+
+ query = parser.parse("customFieldBridge:by AND customStringBridge:is");
+ result = session.createFullTextQuery(query).list();
+ assertEquals( "Custom types not taken into account", 0, result.size() );
+
+ s.delete( s.get( Cloud.class, cloud.getId() ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testDateBridge() throws Exception {
+ Cloud cloud = new Cloud();
+ Calendar c = GregorianCalendar.getInstance();
+ c.setTimeZone( TimeZone.getTimeZone( "GMT" ) ); //for the sake of tests
+ c.set(2000, 11, 15, 3, 43, 2);
+ c.set( Calendar.MILLISECOND, 5 );
+
+ Date date = new Date( c.getTimeInMillis() );
+ cloud.setDate( date ); //5 millisecond
+ cloud.setDateDay( date );
+ cloud.setDateHour( date );
+ cloud.setDateMillisecond( date );
+ cloud.setDateMinute( date );
+ cloud.setDateMonth( date );
+ cloud.setDateSecond( date );
+ cloud.setDateYear( date );
+ org.hibernate.Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist(cloud);
+ s.flush();
+ tx.commit();
+
+ tx = s.beginTransaction();
+ FullTextSession session = Search.createFullTextSession(s);
+ QueryParser parser = new QueryParser("id", new StandardAnalyzer() );
+ Query query;
+ List result;
+
+ query = parser.parse("date:[19900101 TO 20060101]"
+ + " AND dateDay:[20001214 TO 2000121501]"
+ + " AND dateMonth:[200012 TO 20001201]"
+ + " AND dateYear:[2000 TO 200001]"
+ + " AND dateHour:[20001214 TO 2000121503]"
+ + " AND dateMinute:[20001214 TO 200012150343]"
+ + " AND dateSecond:[20001214 TO 20001215034302]"
+ + " AND dateMillisecond:[20001214 TO 20001215034302005]"
+ );
+ result = session.createFullTextQuery(query).list();
+ assertEquals( "Date not found or not property truncated", 1, result.size() );
+
+ s.delete( s.get( Cloud.class, cloud.getId() ) );
+ tx.commit();
+ s.close();
+
+ }
+ protected Class[] getMappings() {
+ return new Class[] {
+ Cloud.class
+ };
+ }
+
+
+ protected void configure(Configuration cfg) {
+ super.configure( cfg );
+ cfg.setProperty( Environment.ANALYZER_CLASS, SimpleAnalyzer.class.getName() );
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/Cloud.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/Cloud.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/Cloud.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,256 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.bridge;
-
-import java.util.Date;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-import org.hibernate.search.annotations.Keyword;
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.Text;
-import org.hibernate.search.annotations.DateBridge;
-import org.hibernate.search.annotations.FieldBridge;
-import org.hibernate.search.annotations.Resolution;
-import org.hibernate.search.annotations.Parameter;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.Store;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed
-public class Cloud {
- private int id;
- private Long long1;
- private long long2;
- private Integer int1;
- private int int2;
- private Double double1;
- private double double2;
- private Float float1;
- private float float2;
- private String string;
- private Date date;
- private Date dateYear;
- private Date dateMonth;
- private Date dateDay;
- private Date dateHour;
- private Date dateMinute;
- private Date dateSecond;
- private Date dateMillisecond;
- private String customFieldBridge;
- private String customStringBridge;
- private CloudType type;
- private boolean storm;
-
- @Text
- @FieldBridge(impl = TruncateFieldBridge.class)
- public String getCustomFieldBridge() {
- return customFieldBridge;
- }
-
- public void setCustomFieldBridge(String customFieldBridge) {
- this.customFieldBridge = customFieldBridge;
- }
-
- @Text
- @FieldBridge(impl = TruncateStringBridge.class, params = @Parameter( name="dividedBy", value="4" ) )
- public String getCustomStringBridge() {
- return customStringBridge;
- }
-
- public void setCustomStringBridge(String customStringBridge) {
- this.customStringBridge = customStringBridge;
- }
-
- @Id @GeneratedValue @Keyword(id=true)
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- @Keyword
- public Long getLong1() {
- return long1;
- }
-
- public void setLong1(Long long1) {
- this.long1 = long1;
- }
-
- @Keyword
- public long getLong2() {
- return long2;
- }
-
- public void setLong2(long long2) {
- this.long2 = long2;
- }
-
- @Keyword
- public Integer getInt1() {
- return int1;
- }
-
- public void setInt1(Integer int1) {
- this.int1 = int1;
- }
-
- @Keyword
- public int getInt2() {
- return int2;
- }
-
- public void setInt2(int int2) {
- this.int2 = int2;
- }
-
- @Keyword
- public Double getDouble1() {
- return double1;
- }
-
- public void setDouble1(Double double1) {
- this.double1 = double1;
- }
-
- @Keyword
- public double getDouble2() {
- return double2;
- }
-
- public void setDouble2(double double2) {
- this.double2 = double2;
- }
-
- @Keyword
- public Float getFloat1() {
- return float1;
- }
-
- public void setFloat1(Float float1) {
- this.float1 = float1;
- }
-
- @Keyword
- public float getFloat2() {
- return float2;
- }
-
- public void setFloat2(float float2) {
- this.float2 = float2;
- }
-
- @Text
- public String getString() {
- return string;
- }
-
- public void setString(String string) {
- this.string = string;
- }
-
- @Keyword
- public Date getDate() {
- return date;
- }
-
- public void setDate(Date date) {
- this.date = date;
- }
-
- @Keyword
- @DateBridge( resolution = Resolution.YEAR )
- public Date getDateYear() {
- return dateYear;
- }
-
- public void setDateYear(Date dateYear) {
- this.dateYear = dateYear;
- }
-
- @Keyword
- @DateBridge( resolution = Resolution.MONTH )
- public Date getDateMonth() {
- return dateMonth;
- }
-
- public void setDateMonth(Date dateMonth) {
- this.dateMonth = dateMonth;
- }
-
- @Keyword
- @DateBridge( resolution = Resolution.DAY )
- public Date getDateDay() {
- return dateDay;
- }
-
- public void setDateDay(Date dateDay) {
- this.dateDay = dateDay;
- }
-
- @Keyword
- @DateBridge( resolution = Resolution.HOUR )
- public Date getDateHour() {
- return dateHour;
- }
-
- public void setDateHour(Date dateHour) {
- this.dateHour = dateHour;
- }
-
-
- @Keyword
- @DateBridge( resolution = Resolution.MINUTE )
- public Date getDateMinute() {
- return dateMinute;
- }
-
- public void setDateMinute(Date dateMinute) {
- this.dateMinute = dateMinute;
- }
-
- @Keyword
- @DateBridge( resolution = Resolution.SECOND )
- public Date getDateSecond() {
- return dateSecond;
- }
-
- public void setDateSecond(Date dateSecond) {
- this.dateSecond = dateSecond;
- }
-
- @Keyword
- @DateBridge( resolution = Resolution.MILLISECOND )
- public Date getDateMillisecond() {
- return dateMillisecond;
- }
-
- public void setDateMillisecond(Date dateMillisecond) {
- this.dateMillisecond = dateMillisecond;
- }
-
- @Field(index = Index.TOKENIZED )
- public CloudType getType() {
- return type;
- }
-
- public void setType(CloudType type) {
- this.type = type;
- }
-
- @Field(index = Index.TOKENIZED )
- public boolean isStorm() {
- return storm;
- }
-
- public void setStorm(boolean storm) {
- this.storm = storm;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/Cloud.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/Cloud.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/Cloud.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/Cloud.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,256 @@
+//$Id: $
+package org.hibernate.search.test.bridge;
+
+import java.util.Date;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+import org.hibernate.search.annotations.Keyword;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Text;
+import org.hibernate.search.annotations.DateBridge;
+import org.hibernate.search.annotations.FieldBridge;
+import org.hibernate.search.annotations.Resolution;
+import org.hibernate.search.annotations.Parameter;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Store;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+public class Cloud {
+ private int id;
+ private Long long1;
+ private long long2;
+ private Integer int1;
+ private int int2;
+ private Double double1;
+ private double double2;
+ private Float float1;
+ private float float2;
+ private String string;
+ private Date date;
+ private Date dateYear;
+ private Date dateMonth;
+ private Date dateDay;
+ private Date dateHour;
+ private Date dateMinute;
+ private Date dateSecond;
+ private Date dateMillisecond;
+ private String customFieldBridge;
+ private String customStringBridge;
+ private CloudType type;
+ private boolean storm;
+
+ @Text
+ @FieldBridge(impl = TruncateFieldBridge.class)
+ public String getCustomFieldBridge() {
+ return customFieldBridge;
+ }
+
+ public void setCustomFieldBridge(String customFieldBridge) {
+ this.customFieldBridge = customFieldBridge;
+ }
+
+ @Text
+ @FieldBridge(impl = TruncateStringBridge.class, params = @Parameter( name="dividedBy", value="4" ) )
+ public String getCustomStringBridge() {
+ return customStringBridge;
+ }
+
+ public void setCustomStringBridge(String customStringBridge) {
+ this.customStringBridge = customStringBridge;
+ }
+
+ @Id @GeneratedValue @Keyword(id=true)
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ @Keyword
+ public Long getLong1() {
+ return long1;
+ }
+
+ public void setLong1(Long long1) {
+ this.long1 = long1;
+ }
+
+ @Keyword
+ public long getLong2() {
+ return long2;
+ }
+
+ public void setLong2(long long2) {
+ this.long2 = long2;
+ }
+
+ @Keyword
+ public Integer getInt1() {
+ return int1;
+ }
+
+ public void setInt1(Integer int1) {
+ this.int1 = int1;
+ }
+
+ @Keyword
+ public int getInt2() {
+ return int2;
+ }
+
+ public void setInt2(int int2) {
+ this.int2 = int2;
+ }
+
+ @Keyword
+ public Double getDouble1() {
+ return double1;
+ }
+
+ public void setDouble1(Double double1) {
+ this.double1 = double1;
+ }
+
+ @Keyword
+ public double getDouble2() {
+ return double2;
+ }
+
+ public void setDouble2(double double2) {
+ this.double2 = double2;
+ }
+
+ @Keyword
+ public Float getFloat1() {
+ return float1;
+ }
+
+ public void setFloat1(Float float1) {
+ this.float1 = float1;
+ }
+
+ @Keyword
+ public float getFloat2() {
+ return float2;
+ }
+
+ public void setFloat2(float float2) {
+ this.float2 = float2;
+ }
+
+ @Text
+ public String getString() {
+ return string;
+ }
+
+ public void setString(String string) {
+ this.string = string;
+ }
+
+ @Keyword
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ @Keyword
+ @DateBridge( resolution = Resolution.YEAR )
+ public Date getDateYear() {
+ return dateYear;
+ }
+
+ public void setDateYear(Date dateYear) {
+ this.dateYear = dateYear;
+ }
+
+ @Keyword
+ @DateBridge( resolution = Resolution.MONTH )
+ public Date getDateMonth() {
+ return dateMonth;
+ }
+
+ public void setDateMonth(Date dateMonth) {
+ this.dateMonth = dateMonth;
+ }
+
+ @Keyword
+ @DateBridge( resolution = Resolution.DAY )
+ public Date getDateDay() {
+ return dateDay;
+ }
+
+ public void setDateDay(Date dateDay) {
+ this.dateDay = dateDay;
+ }
+
+ @Keyword
+ @DateBridge( resolution = Resolution.HOUR )
+ public Date getDateHour() {
+ return dateHour;
+ }
+
+ public void setDateHour(Date dateHour) {
+ this.dateHour = dateHour;
+ }
+
+
+ @Keyword
+ @DateBridge( resolution = Resolution.MINUTE )
+ public Date getDateMinute() {
+ return dateMinute;
+ }
+
+ public void setDateMinute(Date dateMinute) {
+ this.dateMinute = dateMinute;
+ }
+
+ @Keyword
+ @DateBridge( resolution = Resolution.SECOND )
+ public Date getDateSecond() {
+ return dateSecond;
+ }
+
+ public void setDateSecond(Date dateSecond) {
+ this.dateSecond = dateSecond;
+ }
+
+ @Keyword
+ @DateBridge( resolution = Resolution.MILLISECOND )
+ public Date getDateMillisecond() {
+ return dateMillisecond;
+ }
+
+ public void setDateMillisecond(Date dateMillisecond) {
+ this.dateMillisecond = dateMillisecond;
+ }
+
+ @Field(index = Index.TOKENIZED )
+ public CloudType getType() {
+ return type;
+ }
+
+ public void setType(CloudType type) {
+ this.type = type;
+ }
+
+ @Field(index = Index.TOKENIZED )
+ public boolean isStorm() {
+ return storm;
+ }
+
+ public void setStorm(boolean storm) {
+ this.storm = storm;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/CloudType.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/CloudType.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/CloudType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.bridge;
-
-/**
- * @author Emmanuel Bernard
- */
-public enum CloudType {
- DRAGON,
- HOUSE,
- DOG,
- EUROPE
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/CloudType.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/CloudType.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/CloudType.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/CloudType.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id: $
+package org.hibernate.search.test.bridge;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public enum CloudType {
+ DRAGON,
+ HOUSE,
+ DOG,
+ EUROPE
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/DateSplitBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/DateSplitBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/DateSplitBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.bridge;
-
-import java.util.Date;
-import java.util.Calendar;
-import java.util.GregorianCalendar;
-import java.util.TimeZone;
-
-import org.hibernate.search.bridge.FieldBridge;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-
-/**
- * Store the date in 3 different field year, month, day
- * to ease Range Query per year, month or day
- * (eg get all the elements of december for the last 5 years)
- *
- * @author Emmanuel Bernard
- */
-public class DateSplitBridge implements FieldBridge {
- private final static TimeZone GMT = TimeZone.getTimeZone("GMT");
-
- public void set(String name, Object value, Document document, Field.Store store, Field.Index index, Float boost) {
- Date date = (Date) value;
- Calendar cal = GregorianCalendar.getInstance( GMT );
- cal.setTime( date );
- int year = cal.get( Calendar.YEAR );
- int month = cal.get( Calendar.MONTH ) + 1;
- int day = cal.get( Calendar.DAY_OF_MONTH );
- //set year
- Field field = new Field( name + ".year", String.valueOf(year), store, index );
- if ( boost != null ) field.setBoost( boost );
- document.add( field );
- //set month and pad it if needed
- field = new Field( name + ".month", month < 10 ? "0" : "" + String.valueOf(month), store, index );
- if ( boost != null ) field.setBoost( boost );
- document.add( field );
- //set day and pad it if needed
- field = new Field( name + ".day", day < 10 ? "0" : "" + String.valueOf(day), store, index );
- if ( boost != null ) field.setBoost( boost );
- document.add( field );
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/DateSplitBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/DateSplitBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/DateSplitBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/DateSplitBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id: $
+package org.hibernate.search.test.bridge;
+
+import java.util.Date;
+import java.util.Calendar;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+import org.hibernate.search.bridge.FieldBridge;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+
+/**
+ * Store the date in 3 different field year, month, day
+ * to ease Range Query per year, month or day
+ * (eg get all the elements of december for the last 5 years)
+ *
+ * @author Emmanuel Bernard
+ */
+public class DateSplitBridge implements FieldBridge {
+ private final static TimeZone GMT = TimeZone.getTimeZone("GMT");
+
+ public void set(String name, Object value, Document document, Field.Store store, Field.Index index, Float boost) {
+ Date date = (Date) value;
+ Calendar cal = GregorianCalendar.getInstance( GMT );
+ cal.setTime( date );
+ int year = cal.get( Calendar.YEAR );
+ int month = cal.get( Calendar.MONTH ) + 1;
+ int day = cal.get( Calendar.DAY_OF_MONTH );
+ //set year
+ Field field = new Field( name + ".year", String.valueOf(year), store, index );
+ if ( boost != null ) field.setBoost( boost );
+ document.add( field );
+ //set month and pad it if needed
+ field = new Field( name + ".month", month < 10 ? "0" : "" + String.valueOf(month), store, index );
+ if ( boost != null ) field.setBoost( boost );
+ document.add( field );
+ //set day and pad it if needed
+ field = new Field( name + ".day", day < 10 ? "0" : "" + String.valueOf(day), store, index );
+ if ( boost != null ) field.setBoost( boost );
+ document.add( field );
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/PaddedIntegerBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/PaddedIntegerBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/PaddedIntegerBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.bridge;
-
-import java.util.Arrays;
-import java.util.Map;
-import java.util.HashMap;
-
-import org.hibernate.search.bridge.StringBridge;
-import org.hibernate.search.bridge.ParameterizedBridge;
-import org.hibernate.search.bridge.TwoWayStringBridge;
-import org.hibernate.search.annotations.FieldBridge;
-import org.hibernate.annotations.Parameter;
-
-/**
- * Padding Integer bridge.
- * All numbers will be padded with 0 to match 5 digits
- *
- * @author Emmanuel Bernard
- */
-public class PaddedIntegerBridge implements TwoWayStringBridge, ParameterizedBridge {
-
- public static String PADDING_PROPERTY = "padding";
-
- private int padding = 5; //default
-
- public void setParameterValues(Map parameters) {
- Object padding = parameters.get( PADDING_PROPERTY );
- if (padding != null) this.padding = (Integer) padding;
- }
-
- public String objectToString(Object object) {
- String rawInteger = ( (Integer) object ).toString();
- if (rawInteger.length() > padding) throw new IllegalArgumentException( "Try to pad on a number too big" );
- StringBuilder paddedInteger = new StringBuilder( );
- for ( int padIndex = rawInteger.length() ; padIndex < padding ; padIndex++ ) {
- paddedInteger.append('0');
- }
- return paddedInteger.append( rawInteger ).toString();
- }
-
- public Object stringToObject(String stringValue) {
- return new Integer(stringValue);
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/PaddedIntegerBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/PaddedIntegerBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/PaddedIntegerBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/PaddedIntegerBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id: $
+package org.hibernate.search.test.bridge;
+
+import java.util.Arrays;
+import java.util.Map;
+import java.util.HashMap;
+
+import org.hibernate.search.bridge.StringBridge;
+import org.hibernate.search.bridge.ParameterizedBridge;
+import org.hibernate.search.bridge.TwoWayStringBridge;
+import org.hibernate.search.annotations.FieldBridge;
+import org.hibernate.annotations.Parameter;
+
+/**
+ * Padding Integer bridge.
+ * All numbers will be padded with 0 to match 5 digits
+ *
+ * @author Emmanuel Bernard
+ */
+public class PaddedIntegerBridge implements TwoWayStringBridge, ParameterizedBridge {
+
+ public static String PADDING_PROPERTY = "padding";
+
+ private int padding = 5; //default
+
+ public void setParameterValues(Map parameters) {
+ Object padding = parameters.get( PADDING_PROPERTY );
+ if (padding != null) this.padding = (Integer) padding;
+ }
+
+ public String objectToString(Object object) {
+ String rawInteger = ( (Integer) object ).toString();
+ if (rawInteger.length() > padding) throw new IllegalArgumentException( "Try to pad on a number too big" );
+ StringBuilder paddedInteger = new StringBuilder( );
+ for ( int padIndex = rawInteger.length() ; padIndex < padding ; padIndex++ ) {
+ paddedInteger.append('0');
+ }
+ return paddedInteger.append( rawInteger ).toString();
+ }
+
+ public Object stringToObject(String stringValue) {
+ return new Integer(stringValue);
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateFieldBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateFieldBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateFieldBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.bridge;
-
-import org.hibernate.search.bridge.FieldBridge;
-import org.hibernate.util.StringHelper;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-
-/**
- * @author Emmanuel Bernard
- */
-public class TruncateFieldBridge implements FieldBridge {
- public Object get(String name, Document document) {
- Field field = document.getField( name );
- return field.stringValue();
- }
-
- public void set(String name, Object value, Document document, Field.Store store, Field.Index index, Float boost) {
- String indexedString = (String) value;
- //Do not add fields on empty strings, seems a sensible default in most situations
- if ( StringHelper.isNotEmpty( indexedString ) ) {
- Field field = new Field(name, indexedString.substring(0, indexedString.length() / 2), store, index);
- if (boost != null) field.setBoost( boost );
- document.add( field );
- }
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateFieldBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateFieldBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateFieldBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateFieldBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id: $
+package org.hibernate.search.test.bridge;
+
+import org.hibernate.search.bridge.FieldBridge;
+import org.hibernate.util.StringHelper;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TruncateFieldBridge implements FieldBridge {
+ public Object get(String name, Document document) {
+ Field field = document.getField( name );
+ return field.stringValue();
+ }
+
+ public void set(String name, Object value, Document document, Field.Store store, Field.Index index, Float boost) {
+ String indexedString = (String) value;
+ //Do not add fields on empty strings, seems a sensible default in most situations
+ if ( StringHelper.isNotEmpty( indexedString ) ) {
+ Field field = new Field(name, indexedString.substring(0, indexedString.length() / 2), store, index);
+ if (boost != null) field.setBoost( boost );
+ document.add( field );
+ }
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateStringBridge.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateStringBridge.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateStringBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.bridge;
-
-import java.util.Map;
-
-import org.hibernate.search.bridge.StringBridge;
-import org.hibernate.search.bridge.ParameterizedBridge;
-
-/**
- * @author Emmanuel Bernard
- */
-public class TruncateStringBridge implements StringBridge, ParameterizedBridge {
- private int div;
- public Object stringToObject(String stringValue) {
- return stringValue;
- }
-
- public String objectToString(Object object) {
- String string = (String) object;
- return object != null ? string.substring( 0, string.length() / div ) : null;
- }
-
- public void setParameterValues(Map parameters) {
- div = Integer.valueOf( (String) parameters.get( "dividedBy" ) );
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateStringBridge.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateStringBridge.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateStringBridge.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/bridge/TruncateStringBridge.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.search.test.bridge;
+
+import java.util.Map;
+
+import org.hibernate.search.bridge.StringBridge;
+import org.hibernate.search.bridge.ParameterizedBridge;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TruncateStringBridge implements StringBridge, ParameterizedBridge {
+ private int div;
+ public Object stringToObject(String stringValue) {
+ return stringValue;
+ }
+
+ public String objectToString(Object object) {
+ String string = (String) object;
+ return object != null ? string.substring( 0, string.length() / div ) : null;
+ }
+
+ public void setParameterValues(Map parameters) {
+ div = Integer.valueOf( (String) parameters.get( "dividedBy" ) );
+ }
+}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,138 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.directoryProvider;
-
-import java.io.File;
-import java.util.Date;
-import java.util.List;
-
-import org.apache.lucene.analysis.StopAnalyzer;
-import org.apache.lucene.queryParser.QueryParser;
-import org.hibernate.Session;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.event.PostDeleteEventListener;
-import org.hibernate.event.PostInsertEventListener;
-import org.hibernate.event.PostUpdateEventListener;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.Search;
-import org.hibernate.search.event.FullTextIndexEventListener;
-import org.hibernate.search.util.FileHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FSSlaveAndMasterDPTest extends MultipleSFTestCase {
-
- public void testProperCopy() throws Exception {
- Session s1 = getSessionFactories()[0].openSession( );
- SnowStorm sn = new SnowStorm();
- sn.setDate( new Date() );
- sn.setLocation( "Dallas, TX, USA");
-
- FullTextSession fts2 = Search.createFullTextSession( getSessionFactories()[1].openSession( ) );
- QueryParser parser = new QueryParser("id", new StopAnalyzer() );
- List result = fts2.createFullTextQuery( parser.parse( "location:texas" ) ).list();
- assertEquals( "No copy yet, fresh index expected", 0, result.size() );
-
- s1.persist( sn );
- s1.flush(); //we don' commit so we need to flush manually
-
- fts2.close();
- s1.close();
-
- int waitPeroid = 2 * 1 * 1000 + 10; //wait a bit more than 2 refresh (one master / one slave)
- Thread.sleep( waitPeroid );
-
- //temp test original
- fts2 = Search.createFullTextSession( getSessionFactories()[0].openSession( ) );
- result = fts2.createFullTextQuery( parser.parse( "location:dallas" ) ).list();
- assertEquals( "Original should get one", 1, result.size() );
-
- fts2 = Search.createFullTextSession( getSessionFactories()[1].openSession( ) );
- result = fts2.createFullTextQuery( parser.parse( "location:dallas" ) ).list();
- assertEquals("First copy did not work out", 1, result.size() );
-
- s1 = getSessionFactories()[0].openSession( );
- sn = new SnowStorm();
- sn.setDate( new Date() );
- sn.setLocation( "Chennai, India");
-
- s1.persist( sn );
- s1.flush(); //we don' commit so we need to flush manually
-
- fts2.close();
- s1.close();
-
- Thread.sleep( waitPeroid ); //wait a bit more than 2 refresh (one master / one slave)
-
- fts2 = Search.createFullTextSession( getSessionFactories()[1].openSession( ) );
- result = fts2.createFullTextQuery( parser.parse( "location:chennai" ) ).list();
- assertEquals("Second copy did not work out", 1, result.size() );
-
- s1 = getSessionFactories()[0].openSession( );
- sn = new SnowStorm();
- sn.setDate( new Date() );
- sn.setLocation( "Melbourne, Australia");
-
- s1.persist( sn );
- s1.flush(); //we don' commit so we need to flush manually
-
- fts2.close();
- s1.close();
-
- Thread.sleep( waitPeroid ); //wait a bit more than 2 refresh (one master / one slave)
-
- fts2 = Search.createFullTextSession( getSessionFactories()[1].openSession( ) );
- result = fts2.createFullTextQuery( parser.parse( "location:melbourne" ) ).list();
- assertEquals("Third copy did not work out", 1, result.size() );
-
- fts2.close();
- }
-
-
- protected void setUp() throws Exception {
- File base = new File(".");
- File root = new File(base, "lucenedirs");
- root.mkdir();
-
- File master = new File(root, "master/main");
- master.mkdirs();
- master = new File(root, "master/copy");
- master.mkdirs();
-
- File slave = new File(root, "slave");
- slave.mkdir();
-
- super.setUp();
- }
-
- protected void tearDown() throws Exception {
- super.tearDown();
- File base = new File(".");
- File root = new File(base, "lucenedirs");
- FileHelper.delete( root );
- }
-
- protected int getSFNbrs() {
- return 2;
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- SnowStorm.class
- };
- }
-
- protected void configure(Configuration[] cfg) {
- //master
- cfg[0].setProperty( "hibernate.search.default.sourceBase", "./lucenedirs/master/copy");
- cfg[0].setProperty( "hibernate.search.default.indexBase", "./lucenedirs/master/main");
- cfg[0].setProperty( "hibernate.search.default.refresh", "1"); //every minute
- cfg[0].setProperty( "hibernate.search.default.directory_provider", "org.hibernate.search.store.FSMasterDirectoryProvider");
-
- //slave(s)
- cfg[1].setProperty( "hibernate.search.default.sourceBase", "./lucenedirs/master/copy");
- cfg[1].setProperty( "hibernate.search.default.indexBase", "./lucenedirs/slave");
- cfg[1].setProperty( "hibernate.search.default.refresh", "1"); //every minute
- cfg[1].setProperty( "hibernate.search.default.directory_provider", "org.hibernate.search.store.FSSlaveDirectoryProvider");
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/FSSlaveAndMasterDPTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,138 @@
+//$Id: $
+package org.hibernate.search.test.directoryProvider;
+
+import java.io.File;
+import java.util.Date;
+import java.util.List;
+
+import org.apache.lucene.analysis.StopAnalyzer;
+import org.apache.lucene.queryParser.QueryParser;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.event.PostDeleteEventListener;
+import org.hibernate.event.PostInsertEventListener;
+import org.hibernate.event.PostUpdateEventListener;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.hibernate.search.event.FullTextIndexEventListener;
+import org.hibernate.search.util.FileHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FSSlaveAndMasterDPTest extends MultipleSFTestCase {
+
+ public void testProperCopy() throws Exception {
+ Session s1 = getSessionFactories()[0].openSession( );
+ SnowStorm sn = new SnowStorm();
+ sn.setDate( new Date() );
+ sn.setLocation( "Dallas, TX, USA");
+
+ FullTextSession fts2 = Search.createFullTextSession( getSessionFactories()[1].openSession( ) );
+ QueryParser parser = new QueryParser("id", new StopAnalyzer() );
+ List result = fts2.createFullTextQuery( parser.parse( "location:texas" ) ).list();
+ assertEquals( "No copy yet, fresh index expected", 0, result.size() );
+
+ s1.persist( sn );
+ s1.flush(); //we don' commit so we need to flush manually
+
+ fts2.close();
+ s1.close();
+
+ int waitPeroid = 2 * 1 * 1000 + 10; //wait a bit more than 2 refresh (one master / one slave)
+ Thread.sleep( waitPeroid );
+
+ //temp test original
+ fts2 = Search.createFullTextSession( getSessionFactories()[0].openSession( ) );
+ result = fts2.createFullTextQuery( parser.parse( "location:dallas" ) ).list();
+ assertEquals( "Original should get one", 1, result.size() );
+
+ fts2 = Search.createFullTextSession( getSessionFactories()[1].openSession( ) );
+ result = fts2.createFullTextQuery( parser.parse( "location:dallas" ) ).list();
+ assertEquals("First copy did not work out", 1, result.size() );
+
+ s1 = getSessionFactories()[0].openSession( );
+ sn = new SnowStorm();
+ sn.setDate( new Date() );
+ sn.setLocation( "Chennai, India");
+
+ s1.persist( sn );
+ s1.flush(); //we don' commit so we need to flush manually
+
+ fts2.close();
+ s1.close();
+
+ Thread.sleep( waitPeroid ); //wait a bit more than 2 refresh (one master / one slave)
+
+ fts2 = Search.createFullTextSession( getSessionFactories()[1].openSession( ) );
+ result = fts2.createFullTextQuery( parser.parse( "location:chennai" ) ).list();
+ assertEquals("Second copy did not work out", 1, result.size() );
+
+ s1 = getSessionFactories()[0].openSession( );
+ sn = new SnowStorm();
+ sn.setDate( new Date() );
+ sn.setLocation( "Melbourne, Australia");
+
+ s1.persist( sn );
+ s1.flush(); //we don' commit so we need to flush manually
+
+ fts2.close();
+ s1.close();
+
+ Thread.sleep( waitPeroid ); //wait a bit more than 2 refresh (one master / one slave)
+
+ fts2 = Search.createFullTextSession( getSessionFactories()[1].openSession( ) );
+ result = fts2.createFullTextQuery( parser.parse( "location:melbourne" ) ).list();
+ assertEquals("Third copy did not work out", 1, result.size() );
+
+ fts2.close();
+ }
+
+
+ protected void setUp() throws Exception {
+ File base = new File(".");
+ File root = new File(base, "lucenedirs");
+ root.mkdir();
+
+ File master = new File(root, "master/main");
+ master.mkdirs();
+ master = new File(root, "master/copy");
+ master.mkdirs();
+
+ File slave = new File(root, "slave");
+ slave.mkdir();
+
+ super.setUp();
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ File base = new File(".");
+ File root = new File(base, "lucenedirs");
+ FileHelper.delete( root );
+ }
+
+ protected int getSFNbrs() {
+ return 2;
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ SnowStorm.class
+ };
+ }
+
+ protected void configure(Configuration[] cfg) {
+ //master
+ cfg[0].setProperty( "hibernate.search.default.sourceBase", "./lucenedirs/master/copy");
+ cfg[0].setProperty( "hibernate.search.default.indexBase", "./lucenedirs/master/main");
+ cfg[0].setProperty( "hibernate.search.default.refresh", "1"); //every minute
+ cfg[0].setProperty( "hibernate.search.default.directory_provider", "org.hibernate.search.store.FSMasterDirectoryProvider");
+
+ //slave(s)
+ cfg[1].setProperty( "hibernate.search.default.sourceBase", "./lucenedirs/master/copy");
+ cfg[1].setProperty( "hibernate.search.default.indexBase", "./lucenedirs/slave");
+ cfg[1].setProperty( "hibernate.search.default.refresh", "1"); //every minute
+ cfg[1].setProperty( "hibernate.search.default.directory_provider", "org.hibernate.search.store.FSSlaveDirectoryProvider");
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/MultipleSFTestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/MultipleSFTestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/MultipleSFTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,95 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.directoryProvider;
-
-import java.io.InputStream;
-
-import junit.framework.TestCase;
-import org.hibernate.SessionFactory;
-import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.dialect.Dialect;
-
-/**
- * Build multiple session factories from the same set of classes
- * The configuration can be altered overriding the #configure() method
- *
- * @author Emmanuel Bernard
- */
-public abstract class MultipleSFTestCase extends TestCase {
-
- private static SessionFactory[] sessionFactories;
- private static AnnotationConfiguration[] cfgs;
- private static Dialect dialect;
- private static Class lastTestClass;
-
- protected abstract int getSFNbrs();
-
- protected void buildSessionFactories(Class[] classes, String[] packages, String[] xmlFiles) throws Exception {
- if (sessionFactories == null) sessionFactories = new SessionFactory[ getSFNbrs() ];
- if (cfgs == null) cfgs = new AnnotationConfiguration[ getSFNbrs() ];
- for (SessionFactory sf : sessionFactories ) if ( sf != null ) sf.close();
- for (int sfIndex = 0 ; sfIndex < getSFNbrs() ; sfIndex++ ) {
- cfgs[sfIndex] = new AnnotationConfiguration();
- }
- configure( cfgs );
- for (int sfIndex = 0 ; sfIndex < getSFNbrs() ; sfIndex++ ) {
- try {
- if ( recreateSchema() ) {
- cfgs[sfIndex].setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- }
- for ( int i = 0; i < packages.length; i++ ) {
- cfgs[sfIndex].addPackage( packages[i] );
- }
- for ( int i = 0; i < classes.length; i++ ) {
- cfgs[sfIndex].addAnnotatedClass( classes[i] );
- }
- for ( int i = 0; i < xmlFiles.length; i++ ) {
- InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFiles[i] );
- cfgs[sfIndex].addInputStream( is );
- }
- setDialect( Dialect.getDialect() );
- sessionFactories[sfIndex] = cfgs[sfIndex].buildSessionFactory( /*new TestInterceptor()*/ );
- }
- catch (Exception e) {
- e.printStackTrace();
- throw e;
- }
- }
- }
-
- protected void setUp() throws Exception {
- if ( sessionFactories == null || sessionFactories[0] == null || lastTestClass != getClass() ) {
- buildSessionFactories( getMappings(), getAnnotatedPackages(), getXmlFiles() );
- lastTestClass = getClass();
- }
- }
-
- protected abstract Class[] getMappings();
-
- protected String[] getAnnotatedPackages() {
- return new String[]{};
- }
-
- protected String[] getXmlFiles() {
- return new String[]{};
- }
-
- private void setDialect(Dialect dialect) {
- MultipleSFTestCase.dialect = dialect;
- }
-
- protected Dialect getDialect() {
- return dialect;
- }
-
- protected abstract void configure(Configuration[] cfg) ;
-
- protected boolean recreateSchema() {
- return true;
- }
-
- public static SessionFactory[] getSessionFactories() {
- return sessionFactories;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/MultipleSFTestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/MultipleSFTestCase.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/MultipleSFTestCase.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/MultipleSFTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,95 @@
+//$Id: $
+package org.hibernate.search.test.directoryProvider;
+
+import java.io.InputStream;
+
+import junit.framework.TestCase;
+import org.hibernate.SessionFactory;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.dialect.Dialect;
+
+/**
+ * Build multiple session factories from the same set of classes
+ * The configuration can be altered overriding the #configure() method
+ *
+ * @author Emmanuel Bernard
+ */
+public abstract class MultipleSFTestCase extends TestCase {
+
+ private static SessionFactory[] sessionFactories;
+ private static AnnotationConfiguration[] cfgs;
+ private static Dialect dialect;
+ private static Class lastTestClass;
+
+ protected abstract int getSFNbrs();
+
+ protected void buildSessionFactories(Class[] classes, String[] packages, String[] xmlFiles) throws Exception {
+ if (sessionFactories == null) sessionFactories = new SessionFactory[ getSFNbrs() ];
+ if (cfgs == null) cfgs = new AnnotationConfiguration[ getSFNbrs() ];
+ for (SessionFactory sf : sessionFactories ) if ( sf != null ) sf.close();
+ for (int sfIndex = 0 ; sfIndex < getSFNbrs() ; sfIndex++ ) {
+ cfgs[sfIndex] = new AnnotationConfiguration();
+ }
+ configure( cfgs );
+ for (int sfIndex = 0 ; sfIndex < getSFNbrs() ; sfIndex++ ) {
+ try {
+ if ( recreateSchema() ) {
+ cfgs[sfIndex].setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ }
+ for ( int i = 0; i < packages.length; i++ ) {
+ cfgs[sfIndex].addPackage( packages[i] );
+ }
+ for ( int i = 0; i < classes.length; i++ ) {
+ cfgs[sfIndex].addAnnotatedClass( classes[i] );
+ }
+ for ( int i = 0; i < xmlFiles.length; i++ ) {
+ InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFiles[i] );
+ cfgs[sfIndex].addInputStream( is );
+ }
+ setDialect( Dialect.getDialect() );
+ sessionFactories[sfIndex] = cfgs[sfIndex].buildSessionFactory( /*new TestInterceptor()*/ );
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+ }
+
+ protected void setUp() throws Exception {
+ if ( sessionFactories == null || sessionFactories[0] == null || lastTestClass != getClass() ) {
+ buildSessionFactories( getMappings(), getAnnotatedPackages(), getXmlFiles() );
+ lastTestClass = getClass();
+ }
+ }
+
+ protected abstract Class[] getMappings();
+
+ protected String[] getAnnotatedPackages() {
+ return new String[]{};
+ }
+
+ protected String[] getXmlFiles() {
+ return new String[]{};
+ }
+
+ private void setDialect(Dialect dialect) {
+ MultipleSFTestCase.dialect = dialect;
+ }
+
+ protected Dialect getDialect() {
+ return dialect;
+ }
+
+ protected abstract void configure(Configuration[] cfg) ;
+
+ protected boolean recreateSchema() {
+ return true;
+ }
+
+ public static SessionFactory[] getSessionFactories() {
+ return sessionFactories;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/SnowStorm.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/SnowStorm.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/SnowStorm.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.directoryProvider;
-
-import java.util.Date;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Entity;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.DateBridge;
-import org.hibernate.search.annotations.Resolution;
-
-/**
- * @author Emmanuel Bernard
- */
- at Indexed
- at Entity
-public class SnowStorm {
- @Id
- @GeneratedValue
- @DocumentId
- private Long id;
-
- @Field(index = Index.UN_TOKENIZED)
- @DateBridge( resolution = Resolution.DAY )
- private Date date;
-
- @Field(index = Index.TOKENIZED)
- private String location;
-
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public Date getDate() {
- return date;
- }
-
- public void setDate(Date date) {
- this.date = date;
- }
-
- public String getLocation() {
- return location;
- }
-
- public void setLocation(String location) {
- this.location = location;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/SnowStorm.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/SnowStorm.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/SnowStorm.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/directoryProvider/SnowStorm.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id: $
+package org.hibernate.search.test.directoryProvider;
+
+import java.util.Date;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.DateBridge;
+import org.hibernate.search.annotations.Resolution;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Indexed
+ at Entity
+public class SnowStorm {
+ @Id
+ @GeneratedValue
+ @DocumentId
+ private Long id;
+
+ @Field(index = Index.UN_TOKENIZED)
+ @DateBridge( resolution = Resolution.DAY )
+ private Date date;
+
+ @Field(index = Index.TOKENIZED)
+ private String location;
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Date getDate() {
+ return date;
+ }
+
+ public void setDate(Date date) {
+ this.date = date;
+ }
+
+ public String getLocation() {
+ return location;
+ }
+
+ public void setLocation(String location) {
+ this.location = location;
+ }
+}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/embedded)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Address.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Address.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,71 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.embedded;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.OneToOne;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.IndexedEmbedded;
-import org.hibernate.search.annotations.ContainedIn;
-
-/**
- * @author Emmanuel Bernard
- */
-
- at Entity
- at Indexed
-public class Address {
- @Id
- @GeneratedValue
- @DocumentId
- private Long id;
-
- @Field(index= Index.TOKENIZED)
- private String street;
-
- @IndexedEmbedded(depth = 1, prefix = "ownedBy_")
- private Owner ownedBy;
-
- @OneToOne(mappedBy = "address")
- @ContainedIn
- private Tower tower;
-
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getStreet() {
- return street;
- }
-
- public void setStreet(String street) {
- this.street = street;
- }
-
- public Owner getOwnedBy() {
- return ownedBy;
- }
-
- public void setOwnedBy(Owner ownedBy) {
- this.ownedBy = ownedBy;
- }
-
-
- public Tower getTower() {
- return tower;
- }
-
- public void setTower(Tower tower) {
- this.tower = tower;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Address.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Address.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Address.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,71 @@
+//$Id: $
+package org.hibernate.search.test.embedded;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.OneToOne;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.IndexedEmbedded;
+import org.hibernate.search.annotations.ContainedIn;
+
+/**
+ * @author Emmanuel Bernard
+ */
+
+ at Entity
+ at Indexed
+public class Address {
+ @Id
+ @GeneratedValue
+ @DocumentId
+ private Long id;
+
+ @Field(index= Index.TOKENIZED)
+ private String street;
+
+ @IndexedEmbedded(depth = 1, prefix = "ownedBy_")
+ private Owner ownedBy;
+
+ @OneToOne(mappedBy = "address")
+ @ContainedIn
+ private Tower tower;
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getStreet() {
+ return street;
+ }
+
+ public void setStreet(String street) {
+ this.street = street;
+ }
+
+ public Owner getOwnedBy() {
+ return ownedBy;
+ }
+
+ public void setOwnedBy(Owner ownedBy) {
+ this.ownedBy = ownedBy;
+ }
+
+
+ public Tower getTower() {
+ return tower;
+ }
+
+ public void setTower(Tower tower) {
+ this.tower = tower;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,144 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.embedded;
-
-import java.util.List;
-
-import org.hibernate.search.test.SearchTestCase;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.Search;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-import org.apache.lucene.search.Query;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EmbeddedTest extends SearchTestCase {
-
- public void testEmbeddedIndexing() throws Exception {
- Tower tower = new Tower();
- tower.setName( "JBoss tower" );
- Address a = new Address();
- a.setStreet( "Tower place");
- a.setTower( tower );
- tower.setAddress( a );
- Owner o = new Owner();
- o.setName( "Atlanta Renting corp" );
- a.setOwnedBy( o );
- o.setAddress( a );
-
- Session s = openSession( );
- Transaction tx = s.beginTransaction();
- s.persist( tower );
- tx.commit();
-
-
-
-
- FullTextSession session = Search.createFullTextSession(s);
- QueryParser parser = new QueryParser("id", new StandardAnalyzer() );
- Query query;
- List result;
-
- query = parser.parse("address.street:place");
- result = session.createFullTextQuery(query).list();
- assertEquals( "unable to find property in embedded", 1, result.size() );
-
- query = parser.parse("address.ownedBy_name:renting");
- result = session.createFullTextQuery(query, Tower.class).list();
- assertEquals( "unable to find property in embedded", 1, result.size() );
-
- s.clear();
-
- tx = s.beginTransaction();
- Address address = (Address) s.get(Address.class, a.getId() );
- address.getOwnedBy().setName( "Buckhead community");
- tx.commit();
-
-
- s.clear();
-
- session = Search.createFullTextSession(s);
-
- query = parser.parse("address.ownedBy_name:buckhead");
- result = session.createFullTextQuery(query, Tower.class).list();
- assertEquals( "change in embedded not reflected in root index", 1, result.size() );
-
- s.clear();
-
- tx = s.beginTransaction();
- s.delete( s.get(Tower.class, tower.getId() ) );
- tx.commit();
-
- s.close();
-
- }
-
- public void testContainedIn() throws Exception {
- Tower tower = new Tower();
- tower.setName( "JBoss tower" );
- Address a = new Address();
- a.setStreet( "Tower place");
- a.setTower( tower );
- tower.setAddress( a );
- Owner o = new Owner();
- o.setName( "Atlanta Renting corp" );
- a.setOwnedBy( o );
- o.setAddress( a );
-
- Session s = openSession( );
- Transaction tx = s.beginTransaction();
- s.persist( tower );
- tx.commit();
-
- s.clear();
-
- tx = s.beginTransaction();
- Address address = (Address) s.get(Address.class, a.getId() );
- address.setStreet( "Peachtree Road NE" );
- tx.commit();
-
- s.clear();
-
- FullTextSession session = Search.createFullTextSession(s);
- QueryParser parser = new QueryParser("id", new StandardAnalyzer() );
- Query query;
- List result;
-
- query = parser.parse("address.street:peachtree");
- result = session.createFullTextQuery(query, Tower.class).list();
- assertEquals( "change in embedded not reflected in root index", 1, result.size() );
-
- s.clear();
-
- tx = s.beginTransaction();
- address = (Address) s.get(Address.class, a.getId() );
- address.getTower().setAddress( null );
- address.setTower( null );
- tx.commit();
-
- s.clear();
-
- session = Search.createFullTextSession(s);
-
- query = parser.parse("address.street:peachtree");
- result = session.createFullTextQuery(query, Tower.class).list();
- assertEquals( "breaking link fails", 0, result.size() );
-
- tx = s.beginTransaction();
- s.delete( s.get(Tower.class, tower.getId() ) );
- tx.commit();
-
- s.close();
-
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- Tower.class,
- Address.class
- };
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/EmbeddedTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,144 @@
+//$Id: $
+package org.hibernate.search.test.embedded;
+
+import java.util.List;
+
+import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+import org.apache.lucene.search.Query;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EmbeddedTest extends SearchTestCase {
+
+ public void testEmbeddedIndexing() throws Exception {
+ Tower tower = new Tower();
+ tower.setName( "JBoss tower" );
+ Address a = new Address();
+ a.setStreet( "Tower place");
+ a.setTower( tower );
+ tower.setAddress( a );
+ Owner o = new Owner();
+ o.setName( "Atlanta Renting corp" );
+ a.setOwnedBy( o );
+ o.setAddress( a );
+
+ Session s = openSession( );
+ Transaction tx = s.beginTransaction();
+ s.persist( tower );
+ tx.commit();
+
+
+
+
+ FullTextSession session = Search.createFullTextSession(s);
+ QueryParser parser = new QueryParser("id", new StandardAnalyzer() );
+ Query query;
+ List result;
+
+ query = parser.parse("address.street:place");
+ result = session.createFullTextQuery(query).list();
+ assertEquals( "unable to find property in embedded", 1, result.size() );
+
+ query = parser.parse("address.ownedBy_name:renting");
+ result = session.createFullTextQuery(query, Tower.class).list();
+ assertEquals( "unable to find property in embedded", 1, result.size() );
+
+ s.clear();
+
+ tx = s.beginTransaction();
+ Address address = (Address) s.get(Address.class, a.getId() );
+ address.getOwnedBy().setName( "Buckhead community");
+ tx.commit();
+
+
+ s.clear();
+
+ session = Search.createFullTextSession(s);
+
+ query = parser.parse("address.ownedBy_name:buckhead");
+ result = session.createFullTextQuery(query, Tower.class).list();
+ assertEquals( "change in embedded not reflected in root index", 1, result.size() );
+
+ s.clear();
+
+ tx = s.beginTransaction();
+ s.delete( s.get(Tower.class, tower.getId() ) );
+ tx.commit();
+
+ s.close();
+
+ }
+
+ public void testContainedIn() throws Exception {
+ Tower tower = new Tower();
+ tower.setName( "JBoss tower" );
+ Address a = new Address();
+ a.setStreet( "Tower place");
+ a.setTower( tower );
+ tower.setAddress( a );
+ Owner o = new Owner();
+ o.setName( "Atlanta Renting corp" );
+ a.setOwnedBy( o );
+ o.setAddress( a );
+
+ Session s = openSession( );
+ Transaction tx = s.beginTransaction();
+ s.persist( tower );
+ tx.commit();
+
+ s.clear();
+
+ tx = s.beginTransaction();
+ Address address = (Address) s.get(Address.class, a.getId() );
+ address.setStreet( "Peachtree Road NE" );
+ tx.commit();
+
+ s.clear();
+
+ FullTextSession session = Search.createFullTextSession(s);
+ QueryParser parser = new QueryParser("id", new StandardAnalyzer() );
+ Query query;
+ List result;
+
+ query = parser.parse("address.street:peachtree");
+ result = session.createFullTextQuery(query, Tower.class).list();
+ assertEquals( "change in embedded not reflected in root index", 1, result.size() );
+
+ s.clear();
+
+ tx = s.beginTransaction();
+ address = (Address) s.get(Address.class, a.getId() );
+ address.getTower().setAddress( null );
+ address.setTower( null );
+ tx.commit();
+
+ s.clear();
+
+ session = Search.createFullTextSession(s);
+
+ query = parser.parse("address.street:peachtree");
+ result = session.createFullTextQuery(query, Tower.class).list();
+ assertEquals( "breaking link fails", 0, result.size() );
+
+ tx = s.beginTransaction();
+ s.delete( s.get(Tower.class, tower.getId() ) );
+ tx.commit();
+
+ s.close();
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Tower.class,
+ Address.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Owner.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Owner.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Owner.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.embedded;
-
-import javax.persistence.Embeddable;
-
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.IndexedEmbedded;
-import org.hibernate.annotations.Parent;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class Owner {
- @Field(index = Index.TOKENIZED)
- private String name;
-
- @Parent
- @IndexedEmbedded //play the lunatic user
- private Address address;
-
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Address getAddress() {
- return address;
- }
-
- public void setAddress(Address address) {
- this.address = address;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Owner.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Owner.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Owner.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Owner.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id: $
+package org.hibernate.search.test.embedded;
+
+import javax.persistence.Embeddable;
+
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.IndexedEmbedded;
+import org.hibernate.annotations.Parent;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Owner {
+ @Field(index = Index.TOKENIZED)
+ private String name;
+
+ @Parent
+ @IndexedEmbedded //play the lunatic user
+ private Address address;
+
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Tower.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Tower.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Tower.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.embedded;
-
-import javax.persistence.CascadeType;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.OneToOne;
-
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.IndexedEmbedded;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed
-public class Tower {
- @Id
- @GeneratedValue
- @DocumentId
- private Long id;
-
- @Field( index = Index.TOKENIZED )
- private String name;
-
- @OneToOne( cascade = { CascadeType.PERSIST, CascadeType.REMOVE } )
- @IndexedEmbedded
- private Address address;
-
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public Address getAddress() {
- return address;
- }
-
- public void setAddress(Address address) {
- this.address = address;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Tower.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Tower.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Tower.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/embedded/Tower.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id: $
+package org.hibernate.search.test.embedded;
+
+import javax.persistence.CascadeType;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.OneToOne;
+
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.IndexedEmbedded;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+public class Tower {
+ @Id
+ @GeneratedValue
+ @DocumentId
+ private Long id;
+
+ @Field( index = Index.TOKENIZED )
+ private String name;
+
+ @OneToOne( cascade = { CascadeType.PERSIST, CascadeType.REMOVE } )
+ @IndexedEmbedded
+ private Address address;
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/Document.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/Document.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/Document.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,79 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.fieldAccess;
-
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Entity;
-import javax.persistence.Lob;
-
-import org.hibernate.search.annotations.Unstored;
-import org.hibernate.search.annotations.Text;
-import org.hibernate.search.annotations.Keyword;
-import org.hibernate.search.annotations.Boost;
-import org.hibernate.search.annotations.Indexed;
-
-/**
- * @author Richard Hallier
- */
- at Entity
- at Indexed(index = "DocumentField")
-public class Document {
- @Id
- @GeneratedValue
- @Keyword(id = true)
- private Long id;
-
- @Text
- @Boost(2)
- private String title;
-
- @Unstored(name = "Abstract")
- private String summary;
-
- @Lob
- @Unstored
- private String text;
-
- Document() {
- }
-
- public Document(String title, String summary, String text) {
- super();
- this.summary = summary;
- this.text = text;
- this.title = title;
- }
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getSummary() {
- return summary;
- }
-
- public void setSummary(String summary) {
- this.summary = summary;
- }
-
- public String getText() {
- return text;
- }
-
- public void setText(String text) {
- this.text = text;
- }
-}
-
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/Document.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/Document.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/Document.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/Document.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,79 @@
+//$Id: $
+package org.hibernate.search.test.fieldAccess;
+
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+import javax.persistence.Lob;
+
+import org.hibernate.search.annotations.Unstored;
+import org.hibernate.search.annotations.Text;
+import org.hibernate.search.annotations.Keyword;
+import org.hibernate.search.annotations.Boost;
+import org.hibernate.search.annotations.Indexed;
+
+/**
+ * @author Richard Hallier
+ */
+ at Entity
+ at Indexed(index = "DocumentField")
+public class Document {
+ @Id
+ @GeneratedValue
+ @Keyword(id = true)
+ private Long id;
+
+ @Text
+ @Boost(2)
+ private String title;
+
+ @Unstored(name = "Abstract")
+ private String summary;
+
+ @Lob
+ @Unstored
+ private String text;
+
+ Document() {
+ }
+
+ public Document(String title, String summary, String text) {
+ super();
+ this.summary = summary;
+ this.text = text;
+ this.title = title;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+}
+
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/FieldAccessTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/FieldAccessTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/FieldAccessTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,69 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.fieldAccess;
-
-import java.util.List;
-
-import org.hibernate.search.test.SearchTestCase;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.Search;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.analysis.standard.StandardAnalyzer;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FieldAccessTest extends SearchTestCase {
-
- public void testFields() throws Exception {
- Document doc = new Document( "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist( doc );
- tx.commit();
-
- s.clear();
-
- FullTextSession session = Search.createFullTextSession(s);
- tx = session.beginTransaction();
- QueryParser p = new QueryParser("id", new StandardAnalyzer( ) );
- List result = session.createFullTextQuery( p.parse( "Abstract:Hibernate" ) ).list();
- assertEquals( "Query by field", 1, result.size() );
- s.delete( result.get( 0 ) );
- tx.commit();
- s.close();
-
- }
-
- public void testFieldBoost() throws Exception {
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist(
- new Document( "Hibernate in Action", "Object and Relational", "blah blah blah" )
- );
- s.persist(
- new Document( "Object and Relational", "Hibernate in Action", "blah blah blah" )
- );
- tx.commit();
-
- s.clear();
-
- FullTextSession session = Search.createFullTextSession(s);
- tx = session.beginTransaction();
- QueryParser p = new QueryParser("id", new StandardAnalyzer( ) );
- List result = session.createFullTextQuery( p.parse( "title:Action OR Abstract:Action" ) ).list();
- assertEquals( "Query by field", 2, result.size() );
- assertEquals( "@Boost fails", "Hibernate in Action", ( (Document) result.get( 0 ) ).getTitle() );
- s.delete( result.get( 0 ) );
- tx.commit();
- s.close();
-
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- Document.class
- };
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/FieldAccessTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/FieldAccessTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/FieldAccessTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/fieldAccess/FieldAccessTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,69 @@
+//$Id: $
+package org.hibernate.search.test.fieldAccess;
+
+import java.util.List;
+
+import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.analysis.standard.StandardAnalyzer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FieldAccessTest extends SearchTestCase {
+
+ public void testFields() throws Exception {
+ Document doc = new Document( "Hibernate in Action", "Object/relational mapping with Hibernate", "blah blah blah" );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( doc );
+ tx.commit();
+
+ s.clear();
+
+ FullTextSession session = Search.createFullTextSession(s);
+ tx = session.beginTransaction();
+ QueryParser p = new QueryParser("id", new StandardAnalyzer( ) );
+ List result = session.createFullTextQuery( p.parse( "Abstract:Hibernate" ) ).list();
+ assertEquals( "Query by field", 1, result.size() );
+ s.delete( result.get( 0 ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ public void testFieldBoost() throws Exception {
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist(
+ new Document( "Hibernate in Action", "Object and Relational", "blah blah blah" )
+ );
+ s.persist(
+ new Document( "Object and Relational", "Hibernate in Action", "blah blah blah" )
+ );
+ tx.commit();
+
+ s.clear();
+
+ FullTextSession session = Search.createFullTextSession(s);
+ tx = session.beginTransaction();
+ QueryParser p = new QueryParser("id", new StandardAnalyzer( ) );
+ List result = session.createFullTextQuery( p.parse( "title:Action OR Abstract:Action" ) ).list();
+ assertEquals( "Query by field", 2, result.size() );
+ assertEquals( "@Boost fails", "Hibernate in Action", ( (Document) result.get( 0 ) ).getTitle() );
+ s.delete( result.get( 0 ) );
+ tx.commit();
+ s.close();
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Document.class
+ };
+ }
+}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/inheritance)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Animal.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Animal.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Animal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.inheritance;
-
-import org.hibernate.search.annotations.Keyword;
-import org.hibernate.search.annotations.Text;
-import org.hibernate.search.annotations.Indexed;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed
-public class Animal {
- private Long id;
- private String name;
-
- @Id @GeneratedValue @Keyword(id=true)
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- @Text
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Animal.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Animal.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Animal.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Animal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id: $
+package org.hibernate.search.test.inheritance;
+
+import org.hibernate.search.annotations.Keyword;
+import org.hibernate.search.annotations.Text;
+import org.hibernate.search.annotations.Indexed;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+public class Animal {
+ private Long id;
+ private String name;
+
+ @Id @GeneratedValue @Keyword(id=true)
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ @Text
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/InheritanceTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/InheritanceTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/InheritanceTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,67 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.inheritance;
-
-import org.hibernate.search.test.SearchTestCase;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.Search;
-import org.hibernate.Transaction;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.analysis.StopAnalyzer;
-import org.apache.lucene.search.Query;
-
-import java.util.List;
-
-/**
- * @author Emmanuel Bernard
- */
-public class InheritanceTest extends SearchTestCase {
-
- public void testInheritance() throws Exception {
- FullTextSession s = Search.createFullTextSession( openSession() );
- Transaction tx = s.beginTransaction();
- Animal a = new Animal();
- a.setName("Shark Jr");
- s.save( a );
- Mammal m = new Mammal();
- m.setMammalNbr(2);
- m.setName("Elephant Jr");
- s.save(m);
- tx.commit();//post commit events for lucene
- s.clear();
- tx = s.beginTransaction();
- QueryParser parser = new QueryParser("name", new StopAnalyzer() );
-
- Query query;
- org.hibernate.Query hibQuery;
-
- query = parser.parse( "Elephant" );
- hibQuery = s.createFullTextQuery( query, Mammal.class );
- List result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "Query subclass by superclass attribute", 1, result.size() );
-
- query = parser.parse( "mammalNbr:[2 TO 2]" );
- hibQuery = s.createFullTextQuery( query, Animal.class, Mammal.class );
- result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "Query subclass by subclass attribute", 1, result.size() );
-
- query = parser.parse( "Jr" );
- hibQuery = s.createFullTextQuery( query, Animal.class );
- result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "Query filtering on superclass return mapped subclasses", 2, result.size() );
- for (Object managedEntity : result) {
- s.delete(managedEntity);
- }
- tx.commit();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- Animal.class,
- Mammal.class
- };
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/InheritanceTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/InheritanceTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/InheritanceTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/InheritanceTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,67 @@
+//$Id: $
+package org.hibernate.search.test.inheritance;
+
+import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.hibernate.Transaction;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.analysis.StopAnalyzer;
+import org.apache.lucene.search.Query;
+
+import java.util.List;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class InheritanceTest extends SearchTestCase {
+
+ public void testInheritance() throws Exception {
+ FullTextSession s = Search.createFullTextSession( openSession() );
+ Transaction tx = s.beginTransaction();
+ Animal a = new Animal();
+ a.setName("Shark Jr");
+ s.save( a );
+ Mammal m = new Mammal();
+ m.setMammalNbr(2);
+ m.setName("Elephant Jr");
+ s.save(m);
+ tx.commit();//post commit events for lucene
+ s.clear();
+ tx = s.beginTransaction();
+ QueryParser parser = new QueryParser("name", new StopAnalyzer() );
+
+ Query query;
+ org.hibernate.Query hibQuery;
+
+ query = parser.parse( "Elephant" );
+ hibQuery = s.createFullTextQuery( query, Mammal.class );
+ List result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "Query subclass by superclass attribute", 1, result.size() );
+
+ query = parser.parse( "mammalNbr:[2 TO 2]" );
+ hibQuery = s.createFullTextQuery( query, Animal.class, Mammal.class );
+ result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "Query subclass by subclass attribute", 1, result.size() );
+
+ query = parser.parse( "Jr" );
+ hibQuery = s.createFullTextQuery( query, Animal.class );
+ result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "Query filtering on superclass return mapped subclasses", 2, result.size() );
+ for (Object managedEntity : result) {
+ s.delete(managedEntity);
+ }
+ tx.commit();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Animal.class,
+ Mammal.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Mammal.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Mammal.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Mammal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.inheritance;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.Keyword;
-
-import javax.persistence.Entity;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed
-public class Mammal extends Animal {
- private int mammalNbr;
-
- @Keyword
- public int getMammalNbr() {
- return mammalNbr;
- }
-
- public void setMammalNbr(int mammalNbr) {
- this.mammalNbr = mammalNbr;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Mammal.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Mammal.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Mammal.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/inheritance/Mammal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.search.test.inheritance;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Keyword;
+
+import javax.persistence.Entity;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+public class Mammal extends Animal {
+ private int mammalNbr;
+
+ @Keyword
+ public int getMammalNbr() {
+ return mammalNbr;
+ }
+
+ public void setMammalNbr(int mammalNbr) {
+ this.mammalNbr = mammalNbr;
+ }
+}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms)
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/master)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/JMSMasterTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/JMSMasterTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/JMSMasterTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,152 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.jms.master;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.List;
-import javax.jms.ObjectMessage;
-import javax.jms.Queue;
-import javax.jms.QueueConnection;
-import javax.jms.QueueConnectionFactory;
-import javax.jms.QueueSender;
-import javax.jms.QueueSession;
-import javax.naming.InitialContext;
-
-import org.apache.lucene.analysis.StopAnalyzer;
-import org.apache.lucene.document.Document;
-import org.apache.lucene.document.Field;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.search.Query;
-import org.hibernate.Session;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.search.Environment;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.Search;
-import org.hibernate.search.engine.DocumentBuilder;
-import org.hibernate.search.backend.AddLuceneWork;
-import org.hibernate.search.backend.LuceneWork;
-import org.hibernate.search.backend.impl.jms.JMSBackendQueueProcessorFactory;
-import org.hibernate.search.test.SearchTestCase;
-import org.jboss.deployers.spi.DeploymentException;
-import org.jboss.embedded.Bootstrap;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JMSMasterTest extends SearchTestCase {
-
- private Bootstrap bootstrap;
-
- public void testMessageSending() throws Exception {
- MyHibernateUtil.sessionFactory = getSessions();
-
- //create an object wo trigggering indexing
- Session s = openSession( );
- s.getTransaction().begin();
- s.connection().createStatement().executeUpdate(
- "insert into TShirt_Master(id, logo, size) values( '1', 'JBoss balls', 'large')"
- );
- TShirt ts = (TShirt) s.get(TShirt.class, 1);
- s.getTransaction().commit();
- s.close();
- //create the work queue to send
- Document doc = new Document();
- Field field = new Field( DocumentBuilder.CLASS_FIELDNAME, ts.getClass().getName(), Field.Store.YES, Field.Index.UN_TOKENIZED );
- doc.add( field );
- field = new Field("id", "1", Field.Store.YES, Field.Index.UN_TOKENIZED );
- doc.add( field );
- field = new Field("logo", ts.getLogo(), Field.Store.NO, Field.Index.TOKENIZED );
- doc.add( field );
- LuceneWork luceneWork = new AddLuceneWork(ts.getId(), ts.getClass(), doc );
- List<LuceneWork> queue = new ArrayList<LuceneWork>();
- queue.add( luceneWork );
-
- //send the queue
- InitialContext context = new InitialContext();
- QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup( "java:/ConnectionFactory" );
- Queue jmsQueue = (Queue) context.lookup( "queue/searchtest" );
- QueueConnection cnn;
- QueueSender sender;
- QueueSession session;
- cnn = factory.createQueueConnection();
- //TODO make transacted parameterized
- session = cnn.createQueueSession( false, QueueSession.AUTO_ACKNOWLEDGE );
-
- ObjectMessage message = session.createObjectMessage();
- message.setObject( (Serializable) queue );
-
- sender = session.createSender( jmsQueue );
- sender.send( message );
-
- session.close();
- cnn.close();
-
- //wait for the message to be processed
- Thread.sleep( 1000 );
-
- FullTextSession ftSess = Search.createFullTextSession( openSession( ) );
- ftSess.getTransaction().begin();
- QueryParser parser = new QueryParser( "id", new StopAnalyzer() );
- Query luceneQuery = parser.parse( "logo:jboss" );
- org.hibernate.Query query = ftSess.createFullTextQuery( luceneQuery );
- List result = query.list();
- assertEquals( 1, result.size() );
- ftSess.delete( result.get( 0 ) );
- ftSess.getTransaction().commit();
- ftSess.close();
- }
-
- protected void setUp() throws Exception {
- bootstrap = startupEmbeddedJBoss();
- try {
- super.setUp();
- }
- catch( RuntimeException e ) {
- try {
- shutdownEmbeddedJBoss(bootstrap);
- }
- catch( Exception ee ) {
- //swallow
- }
- throw e;
- }
- }
-
- protected void tearDown() throws Exception {
- super.tearDown();
- shutdownEmbeddedJBoss(bootstrap);
- }
-
- public static Bootstrap startupEmbeddedJBoss() {
- try {
- long start = System.currentTimeMillis();
- Bootstrap bootstrap = new Bootstrap();
- bootstrap.bootstrap();
- bootstrap.deployResource( "jars/jms-master.jar" );
- System.out.println("JBoss Embedded boot time: " + (System.currentTimeMillis() - start) + " ms");
- return bootstrap;
- }
- catch (DeploymentException e) {
- throw new RuntimeException( "Failed to bootstrap", e );
- }
- }
-
- public static void shutdownEmbeddedJBoss(Bootstrap bootstrap) {
- bootstrap.shutdown();
- }
-
-
- protected void configure(Configuration cfg) {
- super.configure( cfg );
- cfg.setProperty( Environment.WORKER_BACKEND, "lucene" );
- cfg.setProperty( JMSBackendQueueProcessorFactory.JMS_CONNECTION_FACTORY, "java:/ConnectionFactory" );
- cfg.setProperty( JMSBackendQueueProcessorFactory.JMS_QUEUE, "queue/searchtest" );
-
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- TShirt.class
- };
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/JMSMasterTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/JMSMasterTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/JMSMasterTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/JMSMasterTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,152 @@
+//$Id: $
+package org.hibernate.search.test.jms.master;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+import javax.jms.ObjectMessage;
+import javax.jms.Queue;
+import javax.jms.QueueConnection;
+import javax.jms.QueueConnectionFactory;
+import javax.jms.QueueSender;
+import javax.jms.QueueSession;
+import javax.naming.InitialContext;
+
+import org.apache.lucene.analysis.StopAnalyzer;
+import org.apache.lucene.document.Document;
+import org.apache.lucene.document.Field;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.search.Query;
+import org.hibernate.Session;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.search.Environment;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.hibernate.search.engine.DocumentBuilder;
+import org.hibernate.search.backend.AddLuceneWork;
+import org.hibernate.search.backend.LuceneWork;
+import org.hibernate.search.backend.impl.jms.JMSBackendQueueProcessorFactory;
+import org.hibernate.search.test.SearchTestCase;
+import org.jboss.deployers.spi.DeploymentException;
+import org.jboss.embedded.Bootstrap;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JMSMasterTest extends SearchTestCase {
+
+ private Bootstrap bootstrap;
+
+ public void testMessageSending() throws Exception {
+ MyHibernateUtil.sessionFactory = getSessions();
+
+ //create an object wo trigggering indexing
+ Session s = openSession( );
+ s.getTransaction().begin();
+ s.connection().createStatement().executeUpdate(
+ "insert into TShirt_Master(id, logo, size) values( '1', 'JBoss balls', 'large')"
+ );
+ TShirt ts = (TShirt) s.get(TShirt.class, 1);
+ s.getTransaction().commit();
+ s.close();
+ //create the work queue to send
+ Document doc = new Document();
+ Field field = new Field( DocumentBuilder.CLASS_FIELDNAME, ts.getClass().getName(), Field.Store.YES, Field.Index.UN_TOKENIZED );
+ doc.add( field );
+ field = new Field("id", "1", Field.Store.YES, Field.Index.UN_TOKENIZED );
+ doc.add( field );
+ field = new Field("logo", ts.getLogo(), Field.Store.NO, Field.Index.TOKENIZED );
+ doc.add( field );
+ LuceneWork luceneWork = new AddLuceneWork(ts.getId(), ts.getClass(), doc );
+ List<LuceneWork> queue = new ArrayList<LuceneWork>();
+ queue.add( luceneWork );
+
+ //send the queue
+ InitialContext context = new InitialContext();
+ QueueConnectionFactory factory = (QueueConnectionFactory) context.lookup( "java:/ConnectionFactory" );
+ Queue jmsQueue = (Queue) context.lookup( "queue/searchtest" );
+ QueueConnection cnn;
+ QueueSender sender;
+ QueueSession session;
+ cnn = factory.createQueueConnection();
+ //TODO make transacted parameterized
+ session = cnn.createQueueSession( false, QueueSession.AUTO_ACKNOWLEDGE );
+
+ ObjectMessage message = session.createObjectMessage();
+ message.setObject( (Serializable) queue );
+
+ sender = session.createSender( jmsQueue );
+ sender.send( message );
+
+ session.close();
+ cnn.close();
+
+ //wait for the message to be processed
+ Thread.sleep( 1000 );
+
+ FullTextSession ftSess = Search.createFullTextSession( openSession( ) );
+ ftSess.getTransaction().begin();
+ QueryParser parser = new QueryParser( "id", new StopAnalyzer() );
+ Query luceneQuery = parser.parse( "logo:jboss" );
+ org.hibernate.Query query = ftSess.createFullTextQuery( luceneQuery );
+ List result = query.list();
+ assertEquals( 1, result.size() );
+ ftSess.delete( result.get( 0 ) );
+ ftSess.getTransaction().commit();
+ ftSess.close();
+ }
+
+ protected void setUp() throws Exception {
+ bootstrap = startupEmbeddedJBoss();
+ try {
+ super.setUp();
+ }
+ catch( RuntimeException e ) {
+ try {
+ shutdownEmbeddedJBoss(bootstrap);
+ }
+ catch( Exception ee ) {
+ //swallow
+ }
+ throw e;
+ }
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ shutdownEmbeddedJBoss(bootstrap);
+ }
+
+ public static Bootstrap startupEmbeddedJBoss() {
+ try {
+ long start = System.currentTimeMillis();
+ Bootstrap bootstrap = new Bootstrap();
+ bootstrap.bootstrap();
+ bootstrap.deployResource( "jars/jms-master.jar" );
+ System.out.println("JBoss Embedded boot time: " + (System.currentTimeMillis() - start) + " ms");
+ return bootstrap;
+ }
+ catch (DeploymentException e) {
+ throw new RuntimeException( "Failed to bootstrap", e );
+ }
+ }
+
+ public static void shutdownEmbeddedJBoss(Bootstrap bootstrap) {
+ bootstrap.shutdown();
+ }
+
+
+ protected void configure(Configuration cfg) {
+ super.configure( cfg );
+ cfg.setProperty( Environment.WORKER_BACKEND, "lucene" );
+ cfg.setProperty( JMSBackendQueueProcessorFactory.JMS_CONNECTION_FACTORY, "java:/ConnectionFactory" );
+ cfg.setProperty( JMSBackendQueueProcessorFactory.JMS_QUEUE, "queue/searchtest" );
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ TShirt.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MDBSearchController.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MDBSearchController.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MDBSearchController.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.jms.master;
-
-import javax.ejb.MessageDriven;
-import javax.ejb.ActivationConfigProperty;
-import javax.jms.MessageListener;
-
-import org.hibernate.search.backend.impl.jms.AbstractJMSHibernateSearchController;
-import org.hibernate.Session;
-
-/**
- * @author Emmanuel Bernard
- */
- at MessageDriven(activationConfig = {
- @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
- @ActivationConfigProperty(propertyName="destination", propertyValue="queue/searchtest"),
- @ActivationConfigProperty(propertyName="DLQMaxResent", propertyValue="1")
- } )
-public class MDBSearchController extends AbstractJMSHibernateSearchController implements MessageListener {
- protected Session getSession() {
- return MyHibernateUtil.sessionFactory.openSession( );
- }
-
- protected void cleanSessionIfNeeded(Session session) {
- session.close();
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MDBSearchController.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MDBSearchController.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MDBSearchController.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MDBSearchController.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id: $
+package org.hibernate.search.test.jms.master;
+
+import javax.ejb.MessageDriven;
+import javax.ejb.ActivationConfigProperty;
+import javax.jms.MessageListener;
+
+import org.hibernate.search.backend.impl.jms.AbstractJMSHibernateSearchController;
+import org.hibernate.Session;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MessageDriven(activationConfig = {
+ @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
+ @ActivationConfigProperty(propertyName="destination", propertyValue="queue/searchtest"),
+ @ActivationConfigProperty(propertyName="DLQMaxResent", propertyValue="1")
+ } )
+public class MDBSearchController extends AbstractJMSHibernateSearchController implements MessageListener {
+ protected Session getSession() {
+ return MyHibernateUtil.sessionFactory.openSession( );
+ }
+
+ protected void cleanSessionIfNeeded(Session session) {
+ session.close();
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MyHibernateUtil.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MyHibernateUtil.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MyHibernateUtil.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.jms.master;
-
-import org.hibernate.SessionFactory;
-
-/**
- * Don't do it at home ;-)
- * @author Emmanuel Bernard
- */
-public class MyHibernateUtil {
- public static SessionFactory sessionFactory;
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MyHibernateUtil.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MyHibernateUtil.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MyHibernateUtil.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/MyHibernateUtil.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id: $
+package org.hibernate.search.test.jms.master;
+
+import org.hibernate.SessionFactory;
+
+/**
+ * Don't do it at home ;-)
+ * @author Emmanuel Bernard
+ */
+public class MyHibernateUtil {
+ public static SessionFactory sessionFactory;
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/TShirt.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/TShirt.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/TShirt.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.jms.master;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Table;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed
- at Table(name="TShirt_Master")
-public class TShirt {
- @Id
- @DocumentId
- private int id;
- @Field(index= Index.TOKENIZED)
- private String logo;
- private String size;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getLogo() {
- return logo;
- }
-
- public void setLogo(String logo) {
- this.logo = logo;
- }
-
- public String getSize() {
- return size;
- }
-
- public void setSize(String size) {
- this.size = size;
- }
-}
-
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/TShirt.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/TShirt.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/TShirt.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/master/TShirt.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+//$Id: $
+package org.hibernate.search.test.jms.master;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Table;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+ at Table(name="TShirt_Master")
+public class TShirt {
+ @Id
+ @DocumentId
+ private int id;
+ @Field(index= Index.TOKENIZED)
+ private String logo;
+ private String size;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getLogo() {
+ return logo;
+ }
+
+ public void setLogo(String logo) {
+ this.logo = logo;
+ }
+
+ public String getSize() {
+ return size;
+ }
+
+ public void setSize(String size) {
+ this.size = size;
+ }
+}
+
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/JMSSlaveTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/JMSSlaveTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/JMSSlaveTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,116 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.jms.slave;
-
-import org.jboss.embedded.Bootstrap;
-import org.jboss.deployers.spi.DeploymentException;
-import org.hibernate.search.test.SearchTestCase;
-import org.hibernate.search.Environment;
-import org.hibernate.search.backend.impl.jms.JMSBackendQueueProcessorFactory;
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JMSSlaveTest extends SearchTestCase {
-
- private Bootstrap bootstrap;
-
-
- protected void setUp() throws Exception {
- bootstrap = startupEmbeddedJBoss();
- try {
- super.setUp();
- }
- catch( RuntimeException e ) {
- try {
- shutdownEmbeddedJBoss(bootstrap);
- }
- catch( Exception ee ) {
- //swallow
- }
- throw e;
- }
- }
-
- protected void tearDown() throws Exception {
- super.tearDown();
- shutdownEmbeddedJBoss(bootstrap);
- }
-
- public void testMessageSend() throws Exception {
- SearchQueueChecker.reset();
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- TShirt ts = new TShirt();
- ts.setLogo( "Boston" );
- ts.setSize( "XXL" );
- TShirt ts2 = new TShirt();
- ts2.setLogo( "Mapple leaves" );
- ts2.setSize( "L" );
- s.persist( ts );
- s.persist( ts2 );
- tx.commit();
- //need to sleep for the message consumption
- Thread.sleep(500);
- assertEquals( 1, SearchQueueChecker.queues );
- assertEquals( 2, SearchQueueChecker.works );
-
- SearchQueueChecker.reset();
- s = openSession();
- tx = s.beginTransaction();
- ts = (TShirt) s.get( TShirt.class, ts.getId() );
- ts.setLogo( "Peter pan" );
- tx.commit();
- //need to sleep for the message consumption
- Thread.sleep(500);
- assertEquals( 1, SearchQueueChecker.queues );
- assertEquals( 2, SearchQueueChecker.works ); //one update = 2 works
-
- SearchQueueChecker.reset();
- s = openSession();
- tx = s.beginTransaction();
- s.delete( s.get( TShirt.class, ts.getId() ) );
- s.delete( s.get( TShirt.class, ts2.getId() ) );
- tx.commit();
- //Need to sleep for the message consumption
- Thread.sleep(500);
- assertEquals( 1, SearchQueueChecker.queues );
- assertEquals( 2, SearchQueueChecker.works );
- s.close();
- }
-
- public static Bootstrap startupEmbeddedJBoss() {
- try {
- long start = System.currentTimeMillis();
- Bootstrap bootstrap = new Bootstrap();
- bootstrap.bootstrap();
- bootstrap.deployResource( "jars/jms-slave.jar" );
- System.out.println("JBoss Embedded boot time: " + (System.currentTimeMillis() - start) + " ms");
- return bootstrap;
- }
- catch (DeploymentException e) {
- throw new RuntimeException( "Failed to bootstrap", e );
- }
- }
-
- public static void shutdownEmbeddedJBoss(Bootstrap bootstrap) {
- bootstrap.shutdown();
- }
-
-
- protected void configure(Configuration cfg) {
- super.configure( cfg );
- cfg.setProperty( Environment.WORKER_BACKEND, "jms" );
- cfg.setProperty( JMSBackendQueueProcessorFactory.JMS_CONNECTION_FACTORY, "java:/ConnectionFactory" );
- cfg.setProperty( JMSBackendQueueProcessorFactory.JMS_QUEUE, "queue/searchtest" );
-
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- TShirt.class
- };
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/JMSSlaveTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/JMSSlaveTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/JMSSlaveTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/JMSSlaveTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,116 @@
+//$Id: $
+package org.hibernate.search.test.jms.slave;
+
+import org.jboss.embedded.Bootstrap;
+import org.jboss.deployers.spi.DeploymentException;
+import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.search.Environment;
+import org.hibernate.search.backend.impl.jms.JMSBackendQueueProcessorFactory;
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JMSSlaveTest extends SearchTestCase {
+
+ private Bootstrap bootstrap;
+
+
+ protected void setUp() throws Exception {
+ bootstrap = startupEmbeddedJBoss();
+ try {
+ super.setUp();
+ }
+ catch( RuntimeException e ) {
+ try {
+ shutdownEmbeddedJBoss(bootstrap);
+ }
+ catch( Exception ee ) {
+ //swallow
+ }
+ throw e;
+ }
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ shutdownEmbeddedJBoss(bootstrap);
+ }
+
+ public void testMessageSend() throws Exception {
+ SearchQueueChecker.reset();
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ TShirt ts = new TShirt();
+ ts.setLogo( "Boston" );
+ ts.setSize( "XXL" );
+ TShirt ts2 = new TShirt();
+ ts2.setLogo( "Mapple leaves" );
+ ts2.setSize( "L" );
+ s.persist( ts );
+ s.persist( ts2 );
+ tx.commit();
+ //need to sleep for the message consumption
+ Thread.sleep(500);
+ assertEquals( 1, SearchQueueChecker.queues );
+ assertEquals( 2, SearchQueueChecker.works );
+
+ SearchQueueChecker.reset();
+ s = openSession();
+ tx = s.beginTransaction();
+ ts = (TShirt) s.get( TShirt.class, ts.getId() );
+ ts.setLogo( "Peter pan" );
+ tx.commit();
+ //need to sleep for the message consumption
+ Thread.sleep(500);
+ assertEquals( 1, SearchQueueChecker.queues );
+ assertEquals( 2, SearchQueueChecker.works ); //one update = 2 works
+
+ SearchQueueChecker.reset();
+ s = openSession();
+ tx = s.beginTransaction();
+ s.delete( s.get( TShirt.class, ts.getId() ) );
+ s.delete( s.get( TShirt.class, ts2.getId() ) );
+ tx.commit();
+ //Need to sleep for the message consumption
+ Thread.sleep(500);
+ assertEquals( 1, SearchQueueChecker.queues );
+ assertEquals( 2, SearchQueueChecker.works );
+ s.close();
+ }
+
+ public static Bootstrap startupEmbeddedJBoss() {
+ try {
+ long start = System.currentTimeMillis();
+ Bootstrap bootstrap = new Bootstrap();
+ bootstrap.bootstrap();
+ bootstrap.deployResource( "jars/jms-slave.jar" );
+ System.out.println("JBoss Embedded boot time: " + (System.currentTimeMillis() - start) + " ms");
+ return bootstrap;
+ }
+ catch (DeploymentException e) {
+ throw new RuntimeException( "Failed to bootstrap", e );
+ }
+ }
+
+ public static void shutdownEmbeddedJBoss(Bootstrap bootstrap) {
+ bootstrap.shutdown();
+ }
+
+
+ protected void configure(Configuration cfg) {
+ super.configure( cfg );
+ cfg.setProperty( Environment.WORKER_BACKEND, "jms" );
+ cfg.setProperty( JMSBackendQueueProcessorFactory.JMS_CONNECTION_FACTORY, "java:/ConnectionFactory" );
+ cfg.setProperty( JMSBackendQueueProcessorFactory.JMS_QUEUE, "queue/searchtest" );
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ TShirt.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/SearchQueueChecker.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/SearchQueueChecker.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/SearchQueueChecker.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.jms.slave;
-
-import java.util.List;
-import javax.jms.MessageListener;
-import javax.jms.Message;
-import javax.jms.ObjectMessage;
-import javax.jms.JMSException;
-import javax.ejb.MessageDriven;
-import javax.ejb.ActivationConfigProperty;
-
-import org.hibernate.search.backend.LuceneWork;
-
-/**
- * @author Emmanuel Bernard
- */
- at MessageDriven(activationConfig = {
- @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
- @ActivationConfigProperty(propertyName="destination", propertyValue="queue/searchtest"),
- @ActivationConfigProperty(propertyName="DLQMaxResent", propertyValue="1")
- } )
-public class SearchQueueChecker implements MessageListener {
- public static int queues;
- public static int works;
-
- public static void reset() {
- queues = 0;
- works = 0;
- }
-
- public void onMessage(Message message) {
- if (! (message instanceof ObjectMessage ) ) {
- return;
- }
- ObjectMessage objectMessage = (ObjectMessage) message;
- List<LuceneWork> queue;
- try {
- queue = (List<LuceneWork>) objectMessage.getObject();
- }
- catch (JMSException e) {
- return;
- }
- catch( ClassCastException e ) {
- return;
- }
- queues++;
- works+=queue.size();
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/SearchQueueChecker.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/SearchQueueChecker.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/SearchQueueChecker.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/SearchQueueChecker.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id: $
+package org.hibernate.search.test.jms.slave;
+
+import java.util.List;
+import javax.jms.MessageListener;
+import javax.jms.Message;
+import javax.jms.ObjectMessage;
+import javax.jms.JMSException;
+import javax.ejb.MessageDriven;
+import javax.ejb.ActivationConfigProperty;
+
+import org.hibernate.search.backend.LuceneWork;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at MessageDriven(activationConfig = {
+ @ActivationConfigProperty(propertyName="destinationType", propertyValue="javax.jms.Queue"),
+ @ActivationConfigProperty(propertyName="destination", propertyValue="queue/searchtest"),
+ @ActivationConfigProperty(propertyName="DLQMaxResent", propertyValue="1")
+ } )
+public class SearchQueueChecker implements MessageListener {
+ public static int queues;
+ public static int works;
+
+ public static void reset() {
+ queues = 0;
+ works = 0;
+ }
+
+ public void onMessage(Message message) {
+ if (! (message instanceof ObjectMessage ) ) {
+ return;
+ }
+ ObjectMessage objectMessage = (ObjectMessage) message;
+ List<LuceneWork> queue;
+ try {
+ queue = (List<LuceneWork>) objectMessage.getObject();
+ }
+ catch (JMSException e) {
+ return;
+ }
+ catch( ClassCastException e ) {
+ return;
+ }
+ queues++;
+ works+=queue.size();
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/TShirt.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/TShirt.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/TShirt.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,50 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.jms.slave;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed
-public class TShirt {
- @Id
- @GeneratedValue
- @DocumentId
- private int id;
- @Field(index= Index.TOKENIZED)
- private String logo;
- private String size;
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getLogo() {
- return logo;
- }
-
- public void setLogo(String logo) {
- this.logo = logo;
- }
-
- public String getSize() {
- return size;
- }
-
- public void setSize(String size) {
- this.size = size;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/TShirt.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/TShirt.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/TShirt.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/jms/slave/TShirt.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,50 @@
+//$Id: $
+package org.hibernate.search.test.jms.slave;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+public class TShirt {
+ @Id
+ @GeneratedValue
+ @DocumentId
+ private int id;
+ @Field(index= Index.TOKENIZED)
+ private String logo;
+ private String size;
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getLogo() {
+ return logo;
+ }
+
+ public void setLogo(String logo) {
+ this.logo = logo;
+ }
+
+ public String getSize() {
+ return size;
+ }
+
+ public void setSize(String size) {
+ this.size = size;
+ }
+}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/query (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/AlternateBook.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/AlternateBook.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/AlternateBook.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.query;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed(index="Book")
-public class AlternateBook {
- @Id @DocumentId
- private Integer id;
- @Field(index = Index.TOKENIZED)
- private String summary;
-
-
- public AlternateBook() {
- }
-
- public AlternateBook(Integer id, String summary) {
- this.id = id;
- this.summary = summary;
- }
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public String getSummary() {
- return summary;
- }
-
- public void setSummary(String summary) {
- this.summary = summary;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/AlternateBook.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/AlternateBook.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/AlternateBook.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/AlternateBook.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id: $
+package org.hibernate.search.test.query;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed(index="Book")
+public class AlternateBook {
+ @Id @DocumentId
+ private Integer id;
+ @Field(index = Index.TOKENIZED)
+ private String summary;
+
+
+ public AlternateBook() {
+ }
+
+ public AlternateBook(Integer id, String summary) {
+ this.id = id;
+ this.summary = summary;
+ }
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Book.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/Book.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Book.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.query;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.Text;
-import org.hibernate.search.annotations.Keyword;
-import org.hibernate.search.annotations.Unstored;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed(index = "Book" )
-public class Book {
-
- private Integer id;
- private String body;
- private String summary;
-
- public Book() {
- }
-
- public Book(Integer id, String summary, String body) {
- this.id = id;
- this.summary = summary;
- this.body = body;
- }
-
- @Unstored
- public String getBody() {
- return body;
- }
-
- public void setBody(String body) {
- this.body = body;
- }
-
- @Id @Keyword(id=true)
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- @Text
- public String getSummary() {
- return summary;
- }
-
- public void setSummary(String summary) {
- this.summary = summary;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Book.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/Book.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Book.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Book.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id: $
+package org.hibernate.search.test.query;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Text;
+import org.hibernate.search.annotations.Keyword;
+import org.hibernate.search.annotations.Unstored;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed(index = "Book" )
+public class Book {
+
+ private Integer id;
+ private String body;
+ private String summary;
+
+ public Book() {
+ }
+
+ public Book(Integer id, String summary, String body) {
+ this.id = id;
+ this.summary = summary;
+ this.body = body;
+ }
+
+ @Unstored
+ public String getBody() {
+ return body;
+ }
+
+ public void setBody(String body) {
+ this.body = body;
+ }
+
+ @Id @Keyword(id=true)
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ @Text
+ public String getSummary() {
+ return summary;
+ }
+
+ public void setSummary(String summary) {
+ this.summary = summary;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Clock.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/Clock.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Clock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.query;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.Text;
-import org.hibernate.search.annotations.Keyword;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed
-public class Clock {
- private Integer id;
- private String brand;
-
- public Clock() {
- }
-
- public Clock(Integer id, String brand) {
- this.id = id;
- this.brand = brand;
- }
-
- @Text public String getBrand() {
- return brand;
- }
-
- public void setBrand(String brand) {
- this.brand = brand;
- }
-
- @Id @Keyword(id=true)
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Clock.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/Clock.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Clock.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/Clock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+//$Id: $
+package org.hibernate.search.test.query;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Text;
+import org.hibernate.search.annotations.Keyword;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+public class Clock {
+ private Integer id;
+ private String brand;
+
+ public Clock() {
+ }
+
+ public Clock(Integer id, String brand) {
+ this.id = id;
+ this.brand = brand;
+ }
+
+ @Text public String getBrand() {
+ return brand;
+ }
+
+ public void setBrand(String brand) {
+ this.brand = brand;
+ }
+
+ @Id @Keyword(id=true)
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,271 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.query;
-
-import java.util.List;
-import java.util.Iterator;
-
-import org.hibernate.search.test.SearchTestCase;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.Search;
-import org.hibernate.Transaction;
-import org.hibernate.Hibernate;
-import org.hibernate.ScrollableResults;
-import org.apache.lucene.search.Query;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.analysis.StopAnalyzer;
-
-
-/**
- * @author Emmanuel Bernard
- */
-public class LuceneQueryTest extends SearchTestCase {
-
- public void testList() throws Exception {
- FullTextSession s = Search.createFullTextSession( openSession() );
- Transaction tx = s.beginTransaction();
- Clock clock = new Clock(1, "Seiko");
- s.save( clock );
- clock = new Clock( 2, "Festina");
- s.save( clock );
- Book book = new Book(1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah");
- s.save(book);
- book = new Book(2, "La gloire de mon père", "Les deboires de mon père en vélo");
- s.save(book);
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- QueryParser parser = new QueryParser("title", new StopAnalyzer() );
-
- Query query = parser.parse( "summary:noword" );
- org.hibernate.Query hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- List result = hibQuery.list();
- assertNotNull( result );
- assertEquals( 0, result.size() );
-
- query = parser.parse( "summary:Festina Or brand:Seiko" );
- hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "Query with explicit class filter", 2, result.size() );
-
- query = parser.parse( "summary:Festina Or brand:Seiko" );
- hibQuery = s.createFullTextQuery( query );
- result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "Query with no class filter", 2, result.size() );
- for (Object element : result) {
- assertTrue( Hibernate.isInitialized( element ) );
- s.delete( element );
- }
- s.flush();
- query = parser.parse( "summary:Festina Or brand:Seiko" );
- hibQuery = s.createFullTextQuery( query );
- result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "Query with delete objects", 0, result.size() );
-
- for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
- tx.commit();
- s.close();
- }
-
- public void testFirstMax() throws Exception {
- FullTextSession s = Search.createFullTextSession( openSession() );
- Transaction tx = s.beginTransaction();
- Clock clock = new Clock(1, "Seiko");
- s.save( clock );
- clock = new Clock( 2, "Festina");
- s.save( clock );
- Book book = new Book(1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah");
- s.save(book);
- book = new Book(2, "La gloire de mon père", "Les deboires de mon père en vélo");
- s.save(book);
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- QueryParser parser = new QueryParser("title", new StopAnalyzer() );
-
- Query query = parser.parse( "summary:Festina Or brand:Seiko" );
- org.hibernate.Query hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- hibQuery.setFirstResult( 1 );
- List result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "first result no max result", 1, result.size() );
-
- hibQuery.setFirstResult( 0 );
- hibQuery.setMaxResults( 1 );
- result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "max result set", 1, result.size() );
-
- hibQuery.setFirstResult( 0 );
- hibQuery.setMaxResults( 3 );
- result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "max result out of limit", 2, result.size() );
-
- hibQuery.setFirstResult( 2 );
- hibQuery.setMaxResults( 3 );
- result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "first result out of limit", 0, result.size() );
-
- for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
- tx.commit();
- s.close();
- }
-
- public void testIterator() throws Exception {
- FullTextSession s = Search.createFullTextSession( openSession() );
- Transaction tx = s.beginTransaction();
- Clock clock = new Clock(1, "Seiko");
- s.save( clock );
- clock = new Clock( 2, "Festina");
- s.save( clock );
- Book book = new Book(1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah");
- s.save(book);
- book = new Book(2, "La gloire de mon père", "Les deboires de mon père en vélo");
- s.save(book);
- tx.commit();//post commit events for lucene
- s.clear();
- tx = s.beginTransaction();
- QueryParser parser = new QueryParser("title", new StopAnalyzer() );
-
- Query query = parser.parse( "summary:noword" );
- org.hibernate.Query hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- Iterator result = hibQuery.iterate();
- assertNotNull( result );
- assertFalse( result.hasNext() );
-
- query = parser.parse( "summary:Festina Or brand:Seiko" );
- hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- result = hibQuery.iterate();
- assertNotNull( result );
- int index = 0;
- while ( result.hasNext() ) {
- index++;
- s.delete( result.next() );
- }
- assertEquals( 2, index );
-
- s.flush();
-
- query = parser.parse( "summary:Festina Or brand:Seiko" );
- hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- result = hibQuery.iterate();
- assertNotNull( result );
- assertFalse( result.hasNext() );
-
- for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
- tx.commit();
- s.close();
- }
-
- public void testScrollableResultSet() throws Exception {
- FullTextSession s = Search.createFullTextSession( openSession() );
- Transaction tx = s.beginTransaction();
- Clock clock = new Clock(1, "Seiko");
- s.save( clock );
- clock = new Clock( 2, "Festina");
- s.save( clock );
- Book book = new Book(1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah");
- s.save(book);
- book = new Book(2, "La gloire de mon père", "Les deboires de mon père en vélo");
- s.save(book);
- tx.commit();//post commit events for lucene
- s.clear();
- tx = s.beginTransaction();
- QueryParser parser = new QueryParser("title", new StopAnalyzer() );
-
- Query query = parser.parse( "summary:noword" );
- org.hibernate.Query hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- ScrollableResults result = hibQuery.scroll();
- assertNotNull( result );
- assertEquals(-1, result.getRowNumber() );
- assertEquals(false, result.next() );
- result.close();
-
- query = parser.parse( "summary:Festina Or brand:Seiko" );
- hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- result = hibQuery.scroll();
- assertEquals(0, result.getRowNumber() );
- result.beforeFirst();
- assertEquals( true, result.next() );
- assertTrue( result.isFirst() );
- assertTrue( result.scroll( 1 ) );
- assertTrue( result.isLast() );
- assertFalse( result.scroll( 1 ) );
- result.beforeFirst();
- while ( result.next() ) {
- s.delete( result.get()[0] );
- }
- for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
- tx.commit();
- s.close();
- }
-
- public void testMultipleEntityPerIndex() throws Exception {
- FullTextSession s = Search.createFullTextSession( openSession() );
- Transaction tx = s.beginTransaction();
- Clock clock = new Clock(1, "Seiko");
- s.save( clock );
- Book book = new Book(1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah");
- s.save(book);
- AlternateBook alternateBook = new AlternateBook(1, "La chute de la petite reine a travers les yeux de Festina");
- s.save(alternateBook);
- tx.commit();
- s.clear();
- tx = s.beginTransaction();
- QueryParser parser = new QueryParser("title", new StopAnalyzer() );
-
- Query query = parser.parse( "summary:Festina" );
- org.hibernate.Query hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- List result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "Query with explicit class filter", 1, result.size() );
-
- query = parser.parse( "summary:Festina" );
- hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- Iterator it = hibQuery.iterate();
- assertTrue( it.hasNext() );
- assertNotNull( it.next() );
- assertFalse( it.hasNext() );
-
- query = parser.parse( "summary:Festina" );
- hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- ScrollableResults sr = hibQuery.scroll();
- assertTrue( sr.first() );
- assertNotNull( sr.get() );
- assertFalse( sr.next() );
- sr.close();
-
- query = parser.parse( "summary:Festina OR brand:seiko" );
- hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
- hibQuery.setMaxResults( 2 );
- result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "Query with explicit class filter and limit", 2, result.size() );
-
- query = parser.parse( "summary:Festina" );
- hibQuery = s.createFullTextQuery( query );
- result = hibQuery.list();
- assertNotNull( result );
- assertEquals( "Query with no class filter", 2, result.size() );
- for (Object element : result) {
- assertTrue( Hibernate.isInitialized( element ) );
- s.delete( element );
- }
- for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
- tx.commit();
- s.close();
- }
-
-
- protected Class[] getMappings() {
- return new Class[] {
- Book.class,
- AlternateBook.class,
- Clock.class
- };
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/query/LuceneQueryTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,271 @@
+//$Id: $
+package org.hibernate.search.test.query;
+
+import java.util.List;
+import java.util.Iterator;
+
+import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.hibernate.Transaction;
+import org.hibernate.Hibernate;
+import org.hibernate.ScrollableResults;
+import org.apache.lucene.search.Query;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.analysis.StopAnalyzer;
+
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LuceneQueryTest extends SearchTestCase {
+
+ public void testList() throws Exception {
+ FullTextSession s = Search.createFullTextSession( openSession() );
+ Transaction tx = s.beginTransaction();
+ Clock clock = new Clock(1, "Seiko");
+ s.save( clock );
+ clock = new Clock( 2, "Festina");
+ s.save( clock );
+ Book book = new Book(1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah");
+ s.save(book);
+ book = new Book(2, "La gloire de mon père", "Les deboires de mon père en vélo");
+ s.save(book);
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ QueryParser parser = new QueryParser("title", new StopAnalyzer() );
+
+ Query query = parser.parse( "summary:noword" );
+ org.hibernate.Query hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ List result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( 0, result.size() );
+
+ query = parser.parse( "summary:Festina Or brand:Seiko" );
+ hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "Query with explicit class filter", 2, result.size() );
+
+ query = parser.parse( "summary:Festina Or brand:Seiko" );
+ hibQuery = s.createFullTextQuery( query );
+ result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "Query with no class filter", 2, result.size() );
+ for (Object element : result) {
+ assertTrue( Hibernate.isInitialized( element ) );
+ s.delete( element );
+ }
+ s.flush();
+ query = parser.parse( "summary:Festina Or brand:Seiko" );
+ hibQuery = s.createFullTextQuery( query );
+ result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "Query with delete objects", 0, result.size() );
+
+ for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
+ tx.commit();
+ s.close();
+ }
+
+ public void testFirstMax() throws Exception {
+ FullTextSession s = Search.createFullTextSession( openSession() );
+ Transaction tx = s.beginTransaction();
+ Clock clock = new Clock(1, "Seiko");
+ s.save( clock );
+ clock = new Clock( 2, "Festina");
+ s.save( clock );
+ Book book = new Book(1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah");
+ s.save(book);
+ book = new Book(2, "La gloire de mon père", "Les deboires de mon père en vélo");
+ s.save(book);
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ QueryParser parser = new QueryParser("title", new StopAnalyzer() );
+
+ Query query = parser.parse( "summary:Festina Or brand:Seiko" );
+ org.hibernate.Query hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ hibQuery.setFirstResult( 1 );
+ List result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "first result no max result", 1, result.size() );
+
+ hibQuery.setFirstResult( 0 );
+ hibQuery.setMaxResults( 1 );
+ result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "max result set", 1, result.size() );
+
+ hibQuery.setFirstResult( 0 );
+ hibQuery.setMaxResults( 3 );
+ result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "max result out of limit", 2, result.size() );
+
+ hibQuery.setFirstResult( 2 );
+ hibQuery.setMaxResults( 3 );
+ result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "first result out of limit", 0, result.size() );
+
+ for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
+ tx.commit();
+ s.close();
+ }
+
+ public void testIterator() throws Exception {
+ FullTextSession s = Search.createFullTextSession( openSession() );
+ Transaction tx = s.beginTransaction();
+ Clock clock = new Clock(1, "Seiko");
+ s.save( clock );
+ clock = new Clock( 2, "Festina");
+ s.save( clock );
+ Book book = new Book(1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah");
+ s.save(book);
+ book = new Book(2, "La gloire de mon père", "Les deboires de mon père en vélo");
+ s.save(book);
+ tx.commit();//post commit events for lucene
+ s.clear();
+ tx = s.beginTransaction();
+ QueryParser parser = new QueryParser("title", new StopAnalyzer() );
+
+ Query query = parser.parse( "summary:noword" );
+ org.hibernate.Query hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ Iterator result = hibQuery.iterate();
+ assertNotNull( result );
+ assertFalse( result.hasNext() );
+
+ query = parser.parse( "summary:Festina Or brand:Seiko" );
+ hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ result = hibQuery.iterate();
+ assertNotNull( result );
+ int index = 0;
+ while ( result.hasNext() ) {
+ index++;
+ s.delete( result.next() );
+ }
+ assertEquals( 2, index );
+
+ s.flush();
+
+ query = parser.parse( "summary:Festina Or brand:Seiko" );
+ hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ result = hibQuery.iterate();
+ assertNotNull( result );
+ assertFalse( result.hasNext() );
+
+ for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
+ tx.commit();
+ s.close();
+ }
+
+ public void testScrollableResultSet() throws Exception {
+ FullTextSession s = Search.createFullTextSession( openSession() );
+ Transaction tx = s.beginTransaction();
+ Clock clock = new Clock(1, "Seiko");
+ s.save( clock );
+ clock = new Clock( 2, "Festina");
+ s.save( clock );
+ Book book = new Book(1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah");
+ s.save(book);
+ book = new Book(2, "La gloire de mon père", "Les deboires de mon père en vélo");
+ s.save(book);
+ tx.commit();//post commit events for lucene
+ s.clear();
+ tx = s.beginTransaction();
+ QueryParser parser = new QueryParser("title", new StopAnalyzer() );
+
+ Query query = parser.parse( "summary:noword" );
+ org.hibernate.Query hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ ScrollableResults result = hibQuery.scroll();
+ assertNotNull( result );
+ assertEquals(-1, result.getRowNumber() );
+ assertEquals(false, result.next() );
+ result.close();
+
+ query = parser.parse( "summary:Festina Or brand:Seiko" );
+ hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ result = hibQuery.scroll();
+ assertEquals(0, result.getRowNumber() );
+ result.beforeFirst();
+ assertEquals( true, result.next() );
+ assertTrue( result.isFirst() );
+ assertTrue( result.scroll( 1 ) );
+ assertTrue( result.isLast() );
+ assertFalse( result.scroll( 1 ) );
+ result.beforeFirst();
+ while ( result.next() ) {
+ s.delete( result.get()[0] );
+ }
+ for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
+ tx.commit();
+ s.close();
+ }
+
+ public void testMultipleEntityPerIndex() throws Exception {
+ FullTextSession s = Search.createFullTextSession( openSession() );
+ Transaction tx = s.beginTransaction();
+ Clock clock = new Clock(1, "Seiko");
+ s.save( clock );
+ Book book = new Book(1, "La chute de la petite reine a travers les yeux de Festina", "La chute de la petite reine a travers les yeux de Festina, blahblah");
+ s.save(book);
+ AlternateBook alternateBook = new AlternateBook(1, "La chute de la petite reine a travers les yeux de Festina");
+ s.save(alternateBook);
+ tx.commit();
+ s.clear();
+ tx = s.beginTransaction();
+ QueryParser parser = new QueryParser("title", new StopAnalyzer() );
+
+ Query query = parser.parse( "summary:Festina" );
+ org.hibernate.Query hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ List result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "Query with explicit class filter", 1, result.size() );
+
+ query = parser.parse( "summary:Festina" );
+ hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ Iterator it = hibQuery.iterate();
+ assertTrue( it.hasNext() );
+ assertNotNull( it.next() );
+ assertFalse( it.hasNext() );
+
+ query = parser.parse( "summary:Festina" );
+ hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ ScrollableResults sr = hibQuery.scroll();
+ assertTrue( sr.first() );
+ assertNotNull( sr.get() );
+ assertFalse( sr.next() );
+ sr.close();
+
+ query = parser.parse( "summary:Festina OR brand:seiko" );
+ hibQuery = s.createFullTextQuery( query, Clock.class, Book.class );
+ hibQuery.setMaxResults( 2 );
+ result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "Query with explicit class filter and limit", 2, result.size() );
+
+ query = parser.parse( "summary:Festina" );
+ hibQuery = s.createFullTextQuery( query );
+ result = hibQuery.list();
+ assertNotNull( result );
+ assertEquals( "Query with no class filter", 2, result.size() );
+ for (Object element : result) {
+ assertTrue( Hibernate.isInitialized( element ) );
+ s.delete( element );
+ }
+ for (Object element : s.createQuery( "from java.lang.Object" ).list() ) s.delete( element );
+ tx.commit();
+ s.close();
+ }
+
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Book.class,
+ AlternateBook.class,
+ Clock.class
+ };
+ }
+}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/session (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/session)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/Email.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/session/Email.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/Email.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,63 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.session;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed
-public class Email {
- @Id
- @DocumentId
- private Long id;
-
- @Field(index = Index.TOKENIZED)
- private String title;
-
- @Field(index = Index.TOKENIZED)
- private String body;
-
- private String header;
-
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getBody() {
- return body;
- }
-
- public void setBody(String body) {
- this.body = body;
- }
-
- public String getHeader() {
- return header;
- }
-
- public void setHeader(String header) {
- this.header = header;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/Email.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/session/Email.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/Email.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/Email.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,63 @@
+//$Id: $
+package org.hibernate.search.test.session;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed
+public class Email {
+ @Id
+ @DocumentId
+ private Long id;
+
+ @Field(index = Index.TOKENIZED)
+ private String title;
+
+ @Field(index = Index.TOKENIZED)
+ private String body;
+
+ private String header;
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getBody() {
+ return body;
+ }
+
+ public void setBody(String body) {
+ this.body = body;
+ }
+
+ public String getHeader() {
+ return header;
+ }
+
+ public void setHeader(String header) {
+ this.header = header;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,97 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.session;
-
-import java.util.List;
-import java.sql.ResultSet;
-
-import org.hibernate.search.test.SearchTestCase;
-import org.hibernate.search.impl.FullTextSessionImpl;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.Search;
-import org.hibernate.search.util.ContextHelper;
-import org.hibernate.Transaction;
-import org.hibernate.Session;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.analysis.StopAnalyzer;
-import org.apache.lucene.store.Directory;
-import org.apache.lucene.search.IndexSearcher;
-import org.apache.lucene.search.Searcher;
-import org.apache.lucene.search.Hits;
-
-/**
- * @author Emmanuel Bernard
- */
-public class MassIndexTest extends SearchTestCase {
-
- public void testTransactional() throws Exception {
- FullTextSession s = Search.createFullTextSession( openSession() );
- Transaction tx = s.beginTransaction();
- int loop = 4;
- for (int i = 0 ; i < loop; i++) {
- Email email = new Email();
- email.setId( (long)i+1 );
- email.setTitle( "JBoss World Berlin" );
- email.setBody( "Meet the guys who wrote the software");
- s.persist( email );
- }
- tx.commit();
- s.close();
-
- //check non created object does get found!!1
- s = new FullTextSessionImpl( openSession() );
- tx = s.beginTransaction();
- QueryParser parser = new QueryParser("id", new StopAnalyzer() );
- List result = s.createFullTextQuery( parser.parse( "body:create" ) ).list();
- assertEquals( 0, result.size() );
- tx.commit();
- s.close();
-
- s = new FullTextSessionImpl( openSession() );
- s.getTransaction().begin();
- s.connection().createStatement().executeUpdate( "update Email set body='Meet the guys who write the software'");
- //insert an object never indexed
- s.connection().createStatement().executeUpdate( "insert into Email(id, title, body, header) values( + "
- + (loop+1) + ", 'Bob Sponge', 'Meet the guys who create the software', 'nope')");
- s.getTransaction().commit();
- s.close();
-
- s = new FullTextSessionImpl( openSession() );
- tx = s.beginTransaction();
- parser = new QueryParser("id", new StopAnalyzer() );
- result = s.createFullTextQuery( parser.parse( "body:write" ) ).list();
- assertEquals( 0, result.size() );
- result = s.createCriteria( Email.class ).list();
- for (int i = 0 ; i < loop/2 ; i++)
- s.index( result.get( i ) );
- tx.commit(); //do the process
- s.index( result.get(loop/2) ); //do the process out of tx
- tx = s.beginTransaction();
- for (int i = loop/2+1 ; i < loop; i++)
- s.index( result.get( i ) );
- tx.commit(); //do the process
- s.close();
-
- s = Search.createFullTextSession( openSession() );
- tx = s.beginTransaction();
- //object never indexed
- Email email = (Email) s.get(Email.class, new Long(loop + 1) );
- s.index( email );
- tx.commit();
- s.close();
-
- //check non indexed object get indexed by s.index
- s = new FullTextSessionImpl( openSession() );
- tx = s.beginTransaction();
- result = s.createFullTextQuery( parser.parse( "body:create" ) ).list();
- assertEquals( 1, result.size() );
- tx.commit();
- s.close();
-
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- Email.class
- };
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/session/MassIndexTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,97 @@
+//$Id: $
+package org.hibernate.search.test.session;
+
+import java.util.List;
+import java.sql.ResultSet;
+
+import org.hibernate.search.test.SearchTestCase;
+import org.hibernate.search.impl.FullTextSessionImpl;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.Search;
+import org.hibernate.search.util.ContextHelper;
+import org.hibernate.Transaction;
+import org.hibernate.Session;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.analysis.StopAnalyzer;
+import org.apache.lucene.store.Directory;
+import org.apache.lucene.search.IndexSearcher;
+import org.apache.lucene.search.Searcher;
+import org.apache.lucene.search.Hits;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class MassIndexTest extends SearchTestCase {
+
+ public void testTransactional() throws Exception {
+ FullTextSession s = Search.createFullTextSession( openSession() );
+ Transaction tx = s.beginTransaction();
+ int loop = 4;
+ for (int i = 0 ; i < loop; i++) {
+ Email email = new Email();
+ email.setId( (long)i+1 );
+ email.setTitle( "JBoss World Berlin" );
+ email.setBody( "Meet the guys who wrote the software");
+ s.persist( email );
+ }
+ tx.commit();
+ s.close();
+
+ //check non created object does get found!!1
+ s = new FullTextSessionImpl( openSession() );
+ tx = s.beginTransaction();
+ QueryParser parser = new QueryParser("id", new StopAnalyzer() );
+ List result = s.createFullTextQuery( parser.parse( "body:create" ) ).list();
+ assertEquals( 0, result.size() );
+ tx.commit();
+ s.close();
+
+ s = new FullTextSessionImpl( openSession() );
+ s.getTransaction().begin();
+ s.connection().createStatement().executeUpdate( "update Email set body='Meet the guys who write the software'");
+ //insert an object never indexed
+ s.connection().createStatement().executeUpdate( "insert into Email(id, title, body, header) values( + "
+ + (loop+1) + ", 'Bob Sponge', 'Meet the guys who create the software', 'nope')");
+ s.getTransaction().commit();
+ s.close();
+
+ s = new FullTextSessionImpl( openSession() );
+ tx = s.beginTransaction();
+ parser = new QueryParser("id", new StopAnalyzer() );
+ result = s.createFullTextQuery( parser.parse( "body:write" ) ).list();
+ assertEquals( 0, result.size() );
+ result = s.createCriteria( Email.class ).list();
+ for (int i = 0 ; i < loop/2 ; i++)
+ s.index( result.get( i ) );
+ tx.commit(); //do the process
+ s.index( result.get(loop/2) ); //do the process out of tx
+ tx = s.beginTransaction();
+ for (int i = loop/2+1 ; i < loop; i++)
+ s.index( result.get( i ) );
+ tx.commit(); //do the process
+ s.close();
+
+ s = Search.createFullTextSession( openSession() );
+ tx = s.beginTransaction();
+ //object never indexed
+ Email email = (Email) s.get(Email.class, new Long(loop + 1) );
+ s.index( email );
+ tx.commit();
+ s.close();
+
+ //check non indexed object get indexed by s.index
+ s = new FullTextSessionImpl( openSession() );
+ tx = s.beginTransaction();
+ result = s.createFullTextQuery( parser.parse( "body:create" ) ).list();
+ assertEquals( 1, result.size() );
+ tx.commit();
+ s.close();
+
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Email.class
+ };
+ }
+}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/util (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/util)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/util/FileHelperTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/util/FileHelperTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/util/FileHelperTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,82 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.util;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-import junit.framework.TestCase;
-import org.hibernate.search.util.FileHelper;
-
-/**
- * @author Emmanuel Bernard
- */
-public class FileHelperTest extends TestCase {
- public void testTiti() throws Exception {
- File titi = new File("file:/c:/titi", "file:/d:/toito");
- assertFalse ( titi.exists() );
- }
-
- protected void setUp() throws Exception {
- super.setUp();
- File dir = new File("./filehelpersrc");
- dir.mkdir();
- String name = "a";
- createFile( dir, name );
- name = "b";
- createFile( dir, name );
- dir = new File(dir, "subdir");
- dir.mkdir();
- name = "c";
- createFile( dir, name );
- }
-
- private void createFile(File dir, String name) throws IOException {
- File a = new File(dir, name);
- a.createNewFile();
- FileOutputStream os = new FileOutputStream( a, false );
- os.write( 1 );
- os.write( 2 );
- os.write( 3 );
- os.flush();
- os.close();
- }
-
- protected void tearDown() throws Exception {
- super.setUp();
- File dir = new File("./filehelpersrc");
- FileHelper.delete( dir );
- dir = new File("./filehelperdest");
- FileHelper.delete( dir );
- }
-
- public void testSynchronize() throws Exception {
- File src = new File("./filehelpersrc");
- File dest = new File("./filehelperdest");
- FileHelper.synchronize( src, dest, true );
- File test = new File(dest, "b");
- assertTrue( test.exists() );
- test = new File( new File(dest, "subdir"), "c");
- assertTrue( test.exists() );
-
- //change
- Thread.sleep( 2*2000 );
- test = new File( src, "c");
- FileOutputStream os = new FileOutputStream( test, true );
- os.write( 1 );
- os.write( 2 );
- os.write( 3 );
- os.flush();
- os.close();
- File destTest = new File(dest, "c");
- assertNotSame( test.lastModified(), destTest.lastModified() );
- FileHelper.synchronize( src, dest, true );
- assertEquals( test.lastModified(), destTest.lastModified() );
- assertEquals( test.length(), destTest.length() );
-
- //delete file
- test.delete();
- FileHelper.synchronize( src, dest, true );
- assertTrue( ! destTest.exists() );
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/util/FileHelperTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/util/FileHelperTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/util/FileHelperTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/util/FileHelperTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,82 @@
+//$Id: $
+package org.hibernate.search.test.util;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import junit.framework.TestCase;
+import org.hibernate.search.util.FileHelper;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class FileHelperTest extends TestCase {
+ public void testTiti() throws Exception {
+ File titi = new File("file:/c:/titi", "file:/d:/toito");
+ assertFalse ( titi.exists() );
+ }
+
+ protected void setUp() throws Exception {
+ super.setUp();
+ File dir = new File("./filehelpersrc");
+ dir.mkdir();
+ String name = "a";
+ createFile( dir, name );
+ name = "b";
+ createFile( dir, name );
+ dir = new File(dir, "subdir");
+ dir.mkdir();
+ name = "c";
+ createFile( dir, name );
+ }
+
+ private void createFile(File dir, String name) throws IOException {
+ File a = new File(dir, name);
+ a.createNewFile();
+ FileOutputStream os = new FileOutputStream( a, false );
+ os.write( 1 );
+ os.write( 2 );
+ os.write( 3 );
+ os.flush();
+ os.close();
+ }
+
+ protected void tearDown() throws Exception {
+ super.setUp();
+ File dir = new File("./filehelpersrc");
+ FileHelper.delete( dir );
+ dir = new File("./filehelperdest");
+ FileHelper.delete( dir );
+ }
+
+ public void testSynchronize() throws Exception {
+ File src = new File("./filehelpersrc");
+ File dest = new File("./filehelperdest");
+ FileHelper.synchronize( src, dest, true );
+ File test = new File(dest, "b");
+ assertTrue( test.exists() );
+ test = new File( new File(dest, "subdir"), "c");
+ assertTrue( test.exists() );
+
+ //change
+ Thread.sleep( 2*2000 );
+ test = new File( src, "c");
+ FileOutputStream os = new FileOutputStream( test, true );
+ os.write( 1 );
+ os.write( 2 );
+ os.write( 3 );
+ os.flush();
+ os.close();
+ File destTest = new File(dest, "c");
+ assertNotSame( test.lastModified(), destTest.lastModified() );
+ FileHelper.synchronize( src, dest, true );
+ assertEquals( test.lastModified(), destTest.lastModified() );
+ assertEquals( test.length(), destTest.length() );
+
+ //delete file
+ test.delete();
+ FileHelper.synchronize( src, dest, true );
+ assertTrue( ! destTest.exists() );
+ }
+}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker)
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.worker;
-
-import org.hibernate.search.store.RAMDirectoryProvider;
-import org.hibernate.search.Environment;
-import org.hibernate.cfg.Configuration;
-import org.apache.lucene.analysis.StopAnalyzer;
-
-/**
- * @author Emmanuel Bernard
- */
-public class AsyncWorkerTest extends WorkerTestCase {
-
- protected void configure(Configuration cfg) {
- cfg.setProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
- cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
- cfg.setProperty( Environment.WORKER_SCOPE, "transaction" );
- cfg.setProperty( Environment.WORKER_EXECUTION, "async" );
- cfg.setProperty( Environment.WORKER_PREFIX + "thread_pool.size", "1" );
- cfg.setProperty( Environment.WORKER_PREFIX + "buffer_queue.max", "10" );
- }
-
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/AsyncWorkerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id: $
+package org.hibernate.search.test.worker;
+
+import org.hibernate.search.store.RAMDirectoryProvider;
+import org.hibernate.search.Environment;
+import org.hibernate.cfg.Configuration;
+import org.apache.lucene.analysis.StopAnalyzer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class AsyncWorkerTest extends WorkerTestCase {
+
+ protected void configure(Configuration cfg) {
+ cfg.setProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
+ cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
+ cfg.setProperty( Environment.WORKER_SCOPE, "transaction" );
+ cfg.setProperty( Environment.WORKER_EXECUTION, "async" );
+ cfg.setProperty( Environment.WORKER_PREFIX + "thread_pool.size", "1" );
+ cfg.setProperty( Environment.WORKER_PREFIX + "buffer_queue.max", "10" );
+ }
+
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employee.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employee.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.worker;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.DocumentId;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed(index="employee")
-public class Employee {
- @Id
- @GeneratedValue
- @DocumentId
- private long id;
-
- @Field(index = Index.TOKENIZED )
- private String name;
-
-
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employee.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employee.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employee.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employee.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id: $
+package org.hibernate.search.test.worker;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.DocumentId;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed(index="employee")
+public class Employee {
+ @Id
+ @GeneratedValue
+ @DocumentId
+ private long id;
+
+ @Field(index = Index.TOKENIZED )
+ private String name;
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employer.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employer.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.worker;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-
-import org.hibernate.search.annotations.Indexed;
-import org.hibernate.search.annotations.Field;
-import org.hibernate.search.annotations.Index;
-import org.hibernate.search.annotations.DocumentId;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at Indexed(index="employer")
-public class Employer {
- @Id
- @GeneratedValue
- @DocumentId
- private long id;
-
- @Field(index = Index.TOKENIZED )
- private String name;
-
-
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employer.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employer.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employer.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/Employer.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id: $
+package org.hibernate.search.test.worker;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+
+import org.hibernate.search.annotations.Indexed;
+import org.hibernate.search.annotations.Field;
+import org.hibernate.search.annotations.Index;
+import org.hibernate.search.annotations.DocumentId;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at Indexed(index="employer")
+public class Employer {
+ @Id
+ @GeneratedValue
+ @DocumentId
+ private long id;
+
+ @Field(index = Index.TOKENIZED )
+ private String name;
+
+
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.worker;
-
-import org.hibernate.cfg.Configuration;
-import org.hibernate.search.store.RAMDirectoryProvider;
-import org.hibernate.search.Environment;
-import org.hibernate.search.event.FullTextIndexEventListener;
-import org.hibernate.event.PostDeleteEventListener;
-import org.hibernate.event.PostUpdateEventListener;
-import org.hibernate.event.PostInsertEventListener;
-import org.apache.lucene.analysis.StopAnalyzer;
-
-/**
- * @author Emmanuel Bernard
- */
-public class SyncWorkerTest extends WorkerTestCase {
-
- protected void configure(Configuration cfg) {
- cfg.setProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
- cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
- cfg.setProperty( Environment.WORKER_SCOPE, "transaction" );
- cfg.setProperty( Environment.WORKER_PREFIX, "sync" );
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/SyncWorkerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id: $
+package org.hibernate.search.test.worker;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.search.store.RAMDirectoryProvider;
+import org.hibernate.search.Environment;
+import org.hibernate.search.event.FullTextIndexEventListener;
+import org.hibernate.event.PostDeleteEventListener;
+import org.hibernate.event.PostUpdateEventListener;
+import org.hibernate.event.PostInsertEventListener;
+import org.apache.lucene.analysis.StopAnalyzer;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class SyncWorkerTest extends WorkerTestCase {
+
+ protected void configure(Configuration cfg) {
+ cfg.setProperty( "hibernate.search.default.directory_provider", RAMDirectoryProvider.class.getName() );
+ cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
+ cfg.setProperty( Environment.WORKER_SCOPE, "transaction" );
+ cfg.setProperty( Environment.WORKER_PREFIX, "sync" );
+ }
+}
Deleted: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,206 +0,0 @@
-//$Id: $
-package org.hibernate.search.test.worker;
-
-import java.io.File;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import org.apache.lucene.analysis.StopAnalyzer;
-import org.apache.lucene.queryParser.ParseException;
-import org.apache.lucene.queryParser.QueryParser;
-import org.apache.lucene.search.Query;
-import org.hibernate.Session;
-import org.hibernate.SessionFactory;
-import org.hibernate.Transaction;
-import org.hibernate.event.PostDeleteEventListener;
-import org.hibernate.event.PostInsertEventListener;
-import org.hibernate.event.PostUpdateEventListener;
-import org.hibernate.search.Environment;
-import org.hibernate.search.FullTextSession;
-import org.hibernate.search.event.FullTextIndexEventListener;
-import org.hibernate.search.impl.FullTextSessionImpl;
-import org.hibernate.search.store.FSDirectoryProvider;
-import org.hibernate.search.test.SearchTestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class WorkerTestCase extends SearchTestCase {
-
- protected void setUp() throws Exception {
- File sub = getBaseIndexDir();
- sub.mkdir();
- File[] files = sub.listFiles();
- for ( File file : files ) {
- if ( file.isDirectory() ) {
- delete( file );
- }
- }
- //super.setUp(); //we need a fresh session factory each time for index set up
- buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
- }
-
- private File getBaseIndexDir() {
- File current = new File( "." );
- File sub = new File( current, "indextemp" );
- return sub;
- }
-
- protected void tearDown() throws Exception {
- super.tearDown();
- File sub = getBaseIndexDir();
- delete( sub );
- }
-
- private void delete(File sub) {
- if ( sub.isDirectory() ) {
- for ( File file : sub.listFiles() ) {
- delete( file );
- }
- sub.delete();
- }
- else {
- sub.delete();
- }
- }
-
- public void testConcurrency() throws Exception {
- int nThreads = 15;
- ExecutorService es = Executors.newFixedThreadPool( nThreads );
- Work work = new Work( getSessions() );
- ReverseWork reverseWork = new ReverseWork( getSessions() );
- long start = System.currentTimeMillis();
- int iteration = 100;
- for ( int i = 0; i < iteration; i++ ) {
- es.execute( work );
- es.execute( reverseWork );
- }
- while ( work.count < iteration - 1 ) {
- Thread.sleep( 20 );
- }
- System.out.println( iteration + " iterations (8 tx per iteration) in " + nThreads + " threads: " + ( System
- .currentTimeMillis() - start ) );
- }
-
- protected class Work implements Runnable {
- private SessionFactory sf;
- public volatile int count = 0;
-
- public Work(SessionFactory sf) {
- this.sf = sf;
- }
-
- public void run() {
- Session s = sf.openSession();
- Transaction tx = s.beginTransaction();
- Employee ee = new Employee();
- ee.setName( "Emmanuel" );
- s.persist( ee );
- Employer er = new Employer();
- er.setName( "RH" );
- s.persist( er );
- tx.commit();
- s.close();
-
- s = sf.openSession();
- tx = s.beginTransaction();
- ee = (Employee) s.get( Employee.class, ee.getId() );
- ee.setName( "Emmanuel2" );
- er = (Employer) s.get( Employer.class, er.getId() );
- er.setName( "RH2" );
- tx.commit();
- s.close();
-
-// try {
-// Thread.sleep( 50 );
-// }
-// catch (InterruptedException e) {
-// e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
-// }
-
- s = sf.openSession();
- tx = s.beginTransaction();
- FullTextSession fts = new FullTextSessionImpl( s );
- QueryParser parser = new QueryParser( "id", new StopAnalyzer() );
- Query query;
- try {
- query = parser.parse( "name:emmanuel2" );
- }
- catch (ParseException e) {
- throw new RuntimeException( e );
- }
- boolean results = fts.createFullTextQuery( query ).list().size() > 0;
- //don't test because in case of async, it query happens before actual saving
- //if ( !results ) throw new RuntimeException( "No results!" );
- tx.commit();
- s.close();
-
- s = sf.openSession();
- tx = s.beginTransaction();
- ee = (Employee) s.get( Employee.class, ee.getId() );
- s.delete( ee );
- er = (Employer) s.get( Employer.class, er.getId() );
- s.delete( er );
- tx.commit();
- s.close();
- count++;
- }
- }
-
- protected class ReverseWork implements Runnable {
- private SessionFactory sf;
-
- public ReverseWork(SessionFactory sf) {
- this.sf = sf;
- }
-
- public void run() {
- Session s = sf.openSession();
- Transaction tx = s.beginTransaction();
- Employer er = new Employer();
- er.setName( "RH" );
- s.persist( er );
- Employee ee = new Employee();
- ee.setName( "Emmanuel" );
- s.persist( ee );
- tx.commit();
- s.close();
-
- s = sf.openSession();
- tx = s.beginTransaction();
- er = (Employer) s.get( Employer.class, er.getId() );
- er.setName( "RH2" );
- ee = (Employee) s.get( Employee.class, ee.getId() );
- ee.setName( "Emmanuel2" );
- tx.commit();
- s.close();
-
- s = sf.openSession();
- tx = s.beginTransaction();
- er = (Employer) s.get( Employer.class, er.getId() );
- s.delete( er );
- ee = (Employee) s.get( Employee.class, ee.getId() );
- s.delete( ee );
- tx.commit();
- s.close();
- }
- }
-
- protected void configure(org.hibernate.cfg.Configuration cfg) {
- File sub = getBaseIndexDir();
- cfg.setProperty( "hibernate.search.default.indexBase", sub.getAbsolutePath() );
- cfg.setProperty( "hibernate.search.Clock.directory_provider", FSDirectoryProvider.class.getName() );
- cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
- FullTextIndexEventListener del = new FullTextIndexEventListener();
- cfg.getEventListeners().setPostDeleteEventListeners( new PostDeleteEventListener[]{del} );
- cfg.getEventListeners().setPostUpdateEventListeners( new PostUpdateEventListener[]{del} );
- cfg.getEventListeners().setPostInsertEventListeners( new PostInsertEventListener[]{del} );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Employee.class,
- Employer.class
- };
- }
-}
Copied: trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java)
===================================================================
--- trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java (rev 0)
+++ trunk/HibernateExt/search/src/test/org/hibernate/search/test/worker/WorkerTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,206 @@
+//$Id: $
+package org.hibernate.search.test.worker;
+
+import java.io.File;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+
+import org.apache.lucene.analysis.StopAnalyzer;
+import org.apache.lucene.queryParser.ParseException;
+import org.apache.lucene.queryParser.QueryParser;
+import org.apache.lucene.search.Query;
+import org.hibernate.Session;
+import org.hibernate.SessionFactory;
+import org.hibernate.Transaction;
+import org.hibernate.event.PostDeleteEventListener;
+import org.hibernate.event.PostInsertEventListener;
+import org.hibernate.event.PostUpdateEventListener;
+import org.hibernate.search.Environment;
+import org.hibernate.search.FullTextSession;
+import org.hibernate.search.event.FullTextIndexEventListener;
+import org.hibernate.search.impl.FullTextSessionImpl;
+import org.hibernate.search.store.FSDirectoryProvider;
+import org.hibernate.search.test.SearchTestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class WorkerTestCase extends SearchTestCase {
+
+ protected void setUp() throws Exception {
+ File sub = getBaseIndexDir();
+ sub.mkdir();
+ File[] files = sub.listFiles();
+ for ( File file : files ) {
+ if ( file.isDirectory() ) {
+ delete( file );
+ }
+ }
+ //super.setUp(); //we need a fresh session factory each time for index set up
+ buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
+ }
+
+ private File getBaseIndexDir() {
+ File current = new File( "." );
+ File sub = new File( current, "indextemp" );
+ return sub;
+ }
+
+ protected void tearDown() throws Exception {
+ super.tearDown();
+ File sub = getBaseIndexDir();
+ delete( sub );
+ }
+
+ private void delete(File sub) {
+ if ( sub.isDirectory() ) {
+ for ( File file : sub.listFiles() ) {
+ delete( file );
+ }
+ sub.delete();
+ }
+ else {
+ sub.delete();
+ }
+ }
+
+ public void testConcurrency() throws Exception {
+ int nThreads = 15;
+ ExecutorService es = Executors.newFixedThreadPool( nThreads );
+ Work work = new Work( getSessions() );
+ ReverseWork reverseWork = new ReverseWork( getSessions() );
+ long start = System.currentTimeMillis();
+ int iteration = 100;
+ for ( int i = 0; i < iteration; i++ ) {
+ es.execute( work );
+ es.execute( reverseWork );
+ }
+ while ( work.count < iteration - 1 ) {
+ Thread.sleep( 20 );
+ }
+ System.out.println( iteration + " iterations (8 tx per iteration) in " + nThreads + " threads: " + ( System
+ .currentTimeMillis() - start ) );
+ }
+
+ protected class Work implements Runnable {
+ private SessionFactory sf;
+ public volatile int count = 0;
+
+ public Work(SessionFactory sf) {
+ this.sf = sf;
+ }
+
+ public void run() {
+ Session s = sf.openSession();
+ Transaction tx = s.beginTransaction();
+ Employee ee = new Employee();
+ ee.setName( "Emmanuel" );
+ s.persist( ee );
+ Employer er = new Employer();
+ er.setName( "RH" );
+ s.persist( er );
+ tx.commit();
+ s.close();
+
+ s = sf.openSession();
+ tx = s.beginTransaction();
+ ee = (Employee) s.get( Employee.class, ee.getId() );
+ ee.setName( "Emmanuel2" );
+ er = (Employer) s.get( Employer.class, er.getId() );
+ er.setName( "RH2" );
+ tx.commit();
+ s.close();
+
+// try {
+// Thread.sleep( 50 );
+// }
+// catch (InterruptedException e) {
+// e.printStackTrace(); //To change body of catch statement use File | Settings | File Templates.
+// }
+
+ s = sf.openSession();
+ tx = s.beginTransaction();
+ FullTextSession fts = new FullTextSessionImpl( s );
+ QueryParser parser = new QueryParser( "id", new StopAnalyzer() );
+ Query query;
+ try {
+ query = parser.parse( "name:emmanuel2" );
+ }
+ catch (ParseException e) {
+ throw new RuntimeException( e );
+ }
+ boolean results = fts.createFullTextQuery( query ).list().size() > 0;
+ //don't test because in case of async, it query happens before actual saving
+ //if ( !results ) throw new RuntimeException( "No results!" );
+ tx.commit();
+ s.close();
+
+ s = sf.openSession();
+ tx = s.beginTransaction();
+ ee = (Employee) s.get( Employee.class, ee.getId() );
+ s.delete( ee );
+ er = (Employer) s.get( Employer.class, er.getId() );
+ s.delete( er );
+ tx.commit();
+ s.close();
+ count++;
+ }
+ }
+
+ protected class ReverseWork implements Runnable {
+ private SessionFactory sf;
+
+ public ReverseWork(SessionFactory sf) {
+ this.sf = sf;
+ }
+
+ public void run() {
+ Session s = sf.openSession();
+ Transaction tx = s.beginTransaction();
+ Employer er = new Employer();
+ er.setName( "RH" );
+ s.persist( er );
+ Employee ee = new Employee();
+ ee.setName( "Emmanuel" );
+ s.persist( ee );
+ tx.commit();
+ s.close();
+
+ s = sf.openSession();
+ tx = s.beginTransaction();
+ er = (Employer) s.get( Employer.class, er.getId() );
+ er.setName( "RH2" );
+ ee = (Employee) s.get( Employee.class, ee.getId() );
+ ee.setName( "Emmanuel2" );
+ tx.commit();
+ s.close();
+
+ s = sf.openSession();
+ tx = s.beginTransaction();
+ er = (Employer) s.get( Employer.class, er.getId() );
+ s.delete( er );
+ ee = (Employee) s.get( Employee.class, ee.getId() );
+ s.delete( ee );
+ tx.commit();
+ s.close();
+ }
+ }
+
+ protected void configure(org.hibernate.cfg.Configuration cfg) {
+ File sub = getBaseIndexDir();
+ cfg.setProperty( "hibernate.search.default.indexBase", sub.getAbsolutePath() );
+ cfg.setProperty( "hibernate.search.Clock.directory_provider", FSDirectoryProvider.class.getName() );
+ cfg.setProperty( Environment.ANALYZER_CLASS, StopAnalyzer.class.getName() );
+ FullTextIndexEventListener del = new FullTextIndexEventListener();
+ cfg.getEventListeners().setPostDeleteEventListeners( new PostDeleteEventListener[]{del} );
+ cfg.getEventListeners().setPostUpdateEventListeners( new PostUpdateEventListener[]{del} );
+ cfg.getEventListeners().setPostInsertEventListeners( new PostInsertEventListener[]{del} );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Employee.class,
+ Employer.class
+ };
+ }
+}
Copied: trunk/HibernateExt/search/src/test-resources (from rev 11279, branches/Branch_3_2/HibernateExt/search/src/test-resources)
Copied: trunk/HibernateExt/validator (from rev 11279, branches/Branch_3_2/HibernateExt/validator)
Deleted: trunk/HibernateExt/validator/build.properties.dist
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/build.properties.dist 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/build.properties.dist 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-common.dir=.
-src.dir=src
-test.dir=test
-hibernate-core.home=../hibernate-3.2
-
-#locally present jars
-jpa-api.jar=./lib/ejb3-persistence.jar
-jpa.jar=./lib/test/hibernate-entitymanager.jar
-archive-browsing.jar=./lib/test/jboss-archive-browsing.jar
-commons-annotations.jar=./lib/hibernate-commons-annotations.jar
-annotations.jar=./lib/test/hibernate-annotations.jar
\ No newline at end of file
Copied: trunk/HibernateExt/validator/build.properties.dist (from rev 11279, branches/Branch_3_2/HibernateExt/validator/build.properties.dist)
===================================================================
--- trunk/HibernateExt/validator/build.properties.dist (rev 0)
+++ trunk/HibernateExt/validator/build.properties.dist 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+common.dir=.
+src.dir=src
+test.dir=test
+hibernate-core.home=../hibernate-3.2
+
+#locally present jars
+jpa-api.jar=./lib/ejb3-persistence.jar
+jpa.jar=./lib/test/hibernate-entitymanager.jar
+archive-browsing.jar=./lib/test/jboss-archive-browsing.jar
+commons-annotations.jar=./lib/hibernate-commons-annotations.jar
+annotations.jar=./lib/test/hibernate-annotations.jar
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/build.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/build.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,253 +0,0 @@
-<!--
-
- Hibernate Annotations ANT build script.
-
- You need JDK 5.0 installed to build Hibernate Annotations.
-
--->
-
-<!-- To add a dependency:
- defines the dependency.jar property that points to the expected jar file
- in init, add an available dependency.jar and populate dependency.jar.available
- create a target get.dependency which calls clean and jar
- add get.depdendecy to depends= for compile or compiletest
- alter lib.moduleclass.path or junit.moduleclasspath accordingly
--->
-
-<project name="Hibernate Validator" default="dist" basedir=".">
-
- <!-- Give user a chance to override without editing this file
- (and without typing -D each time it compiles it) -->
- <property file="build.properties"/>
- <property file="${user.home}/.ant.properties"/>
-
- <!-- Name of project and version, used to create filenames -->
- <property name="Name" value="Hibernate Validator"/>
- <property name="name" value="hibernate-validator"/>
- <property name="version" value="3.2.2.GA"/>
- <property name="javadoc.packagenames" value="org.hibernate.validator.*"/>
- <property name="copy.test" value="true"/>
- <property name="javac.source" value="1.5"/>
- <property name="javac.target" value="1.5"/>
- <property name="jdbc.dir" value="jdbc"/>
- <property name="common.dir" value="${basedir}/../common"/>
-
- <!-- dependencies -->
- <property name="jpa-api.jar" value="${basedir}/../jpa-api/build/ejb3-persistence.jar"/>
- <property name="annotations.jar"
- value="${basedir}/../annotations/target/hibernate-annotations/hibernate-annotations.jar"/>
- <property name="jpa.jar"
- value="${basedir}/../entitymanager/target/hibernate-entitymanager/hibernate-entitymanager.jar"/>
- <property name="archive-browsing.jar"
- value="${basedir}/../entitymanager/lib/jboss-archive-browsing.jar"/>
- <property name="commons-annotations.jar"
- value="${basedir}/../commons-annotations/target/hibernate-commons-annotations/hibernate-commons-annotations.jar"/>
-
- <import file="${common.dir}/common-build.xml"/>
-
-
- <path id="lib.moduleclass.path">
- <pathelement location="${jpa-api.jar}"/>
- <pathelement location="${commons-annotations.jar}"/>
- </path>
- <path id="junit.moduleclasspath">
- <pathelement location="${src.dir}"/>
- <pathelement location="${test.dir}"/>
- <pathelement location="${annotations.jar}"/>
- <pathelement location="${jpa.jar}"/>
- <pathelement location="${archive-browsing.jar}"/>
- <fileset dir="${jdbc.dir}">
- <include name="*.jar"/>
- <include name="*.zip"/>
- </fileset>
- <fileset dir="${lib.dir}/test">
- <include name="*.jar"/>
- <include name="*.zip"/>
- </fileset>
- </path>
-
- <target name="init">
- <antcall target="common-build.init"/>
- <!-- check for dependency artefacts -->
- <available file="${jpa-api.jar}" type="file" property="jpa-api.jar.available"/>
- <available file="${commons-annotations.jar}" type="file" property="commons-annotations.jar.available"/>
- <available file="${annotations.jar}" type="file" property="annotations.jar.available"/>
- <available file="${jpa.jar}" type="file" property="jpa.jar.available"/>
- <mkdir dir="${lib.dir}/test"/>
- </target>
-
- <target name="get.jpa-api" depends="init" unless="jpa-api.jar.available">
- <ant inheritall="false" dir="${basedir}/../jpa-api" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../jpa-api" target="jar"/>
- </target>
-
- <target name="get.commons-annotations" depends="init" unless="commons-annotations.jar.available">
- <ant inheritall="false" dir="${basedir}/../commons-annotations" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../commons-annotations" target="jar"/>
- </target>
-
- <target name="get.annotations" depends="init" unless="annotations.jar.available">
- <ant inheritall="false" dir="${basedir}/../annotations" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../annotations" target="jar"/>
- </target>
-
- <target name="get.jpa" depends="init" unless="jpa.jar.available">
- <ant inheritall="false" dir="${basedir}/../entitymanager" target="clean"/>
- <ant inheritall="false" dir="${basedir}/../entitymanager" target="jar"/>
- </target>
-
- <target name="compile" depends="init,get.jpa-api,get.commons-annotations" description="Compile the Java source code">
- <available
- classname="org.eclipse.core.launcher.Main"
- property="build.compiler"
- value="org.eclipse.jdt.core.JDTCompilerAdapter"
- classpath="${java.class.path}"/>
- <javac
- srcdir="${src.dir}"
- destdir="${classes.dir}"
- classpathref="lib.class.path"
- debug="${javac.debug}"
- optimize="${javac.optimize}"
- nowarn="on"
- source="${javac.source}"
- target="${javac.target}">
- <src path="${src.dir}"/>
- </javac>
- <copy todir="${classes.dir}">
- <fileset dir="${src.dir}">
- <include name="**/resources/*.properties"/>
- <include name="**/*.xsd"/>
- </fileset>
- </copy>
- </target>
-
- <target name="compiletest" depends="init,get.annotations,get.jpa,compile" description="Compile the tests">
- <available
- classname="org.eclipse.core.launcher.Main"
- property="build.compiler"
- value="org.eclipse.jdt.core.JDTCompilerAdapter"
- classpath="${java.class.path}"/>
- <javac
- destdir="${testclasses.dir}"
- classpathref="junit.classpath"
- debug="${javac.debug}"
- optimize="${javac.optimize}"
- nowarn="on"
- source="1.5"
- target="1.5">
- <src refid="testsrc.path"/>
- </javac>
- </target>
-
-
- <!-- target name="junit" depends="compiletest">
- <mkdir dir="test_output"/>
- <junit fork="yes" printsummary="yes" haltonfailure="yes"
- forkmode="perBatch">
- <classpath>
- <fileset dir="${jdbc.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.zip"/>
- </fileset>
- <path refid="lib.class.path"/>
- <pathelement path="${classes.dir}"/>
- <pathelement path="${src.dir}"/>
- <pathelement path="${test.dir}"/>
- </classpath>
- <formatter type="plain"/>
- <formatter type="xml"/>
- <batchtest fork="yes" todir="test_output" haltonfailure="no">
- <fileset dir="${classes.dir}">
- <include name="**/*Test.class"/>
- </fileset>
- </batchtest>
- </junit>
- </target -->
-
- <!-- Run a single unit test. -->
- <target name="junitsingle" depends="compiletest"
- description="Run a single test suite (requires testname and jdbc.driver properties)">
- <mkdir dir="test_output"/>
- <junit printsummary="yes" fork="yes" haltonfailure="yes">
- <classpath>
- <fileset dir="${jdbc.dir}">
- <include name="**/*.jar"/>
- <include name="**/*.zip"/>
- </fileset>
- <path refid="lib.class.path"/>
- <pathelement path="${classes.dir}"/>
- <pathelement path="${src.dir}"/>
- <!-- pick up properties from here -->
- <pathelement path="${test.dir}"/>
- <!-- pick up mappings from here -->
- </classpath>
- <formatter type="plain"/>
- <formatter type="xml"/>
- <test fork="yes" todir="test_output" haltonfailure="no" name="${testname}"/>
- </junit>
- </target>
-
- <!-- target name="report">
- <mkdir dir="test_output"/>
- <junitreport todir="test_output">
- <fileset dir="test_output">
- <include name="TEST-*.xml"/>
- </fileset>
- <report format="frames" todir="test_output/report"/>
- </junitreport>
- </target -->
-
- <target name="jar" depends="compile" description="Build the distribution .jar file">
- <mkdir dir="${classes.dir}/META-INF"/>
- <manifest file="${classes.dir}/META-INF/MANIFEST.MF">
- <attribute name="Product" value="${Name}"/>
- <attribute name="Version" value="${version}"/>
- </manifest>
- <antcall target="common-build.jar"/>
- </target>
-
- <!-- Some of this can probably be moved to common-build... -->
- <target name="dist" depends="jar,javadoc,copysource,copytest,copylib,extras"
- description="Build everything">
-
- <ant inheritall="false" dir="${basedir}/doc/reference"/>
- <copy todir="${dist.dir}/doc/reference" failonerror="false">
- <fileset dir="${basedir}/doc/reference/build">
- <include name="**/*.*"/>
- </fileset>
- </copy>
-
- <copy todir="${dist.dir}" failonerror="false">
- <fileset dir="${common.dir}">
- <include name="common-build.xml"/>
- </fileset>
- </copy>
-
- <!-- copy dependencies -->
- <copy todir="${dist.lib.dir}" failonerror="false">
- <fileset file="${jpa-api.jar}"/>
- <fileset file="${commons-annotations.jar}"/>
- </copy>
- <mkdir dir="${dist.lib.dir}/test"/>
- <copy todir="${dist.lib.dir}/test" failonerror="false">
- <fileset file="${annotations.jar}"/>
- <fileset file="${jpa.jar}"/>
- <fileset file="${archive-browsing.jar}"/>
- </copy>
-
- <copy file="${basedir}/build.properties.dist" tofile="${dist.dir}/build.properties" failonerror="false">
- </copy>
- <antcall target="common-build.dist"/>
- </target>
-
- <target name="zip-dist" description="zip the dist">
- <zip zipfile="${dist.dir}-${version}.zip">
- <zipfileset prefix="${name}-${version}" dir="${dist.dir}"/>
- </zip>
- <tar compression="gzip" tarfile="${dist.dir}-${version}.tar.gz">
- <tarfileset prefix="${name}-${version}" dir="${dist.dir}"/>
- </tar>
- </target>
-
-
-</project>
Copied: trunk/HibernateExt/validator/build.xml (from rev 11279, branches/Branch_3_2/HibernateExt/validator/build.xml)
===================================================================
--- trunk/HibernateExt/validator/build.xml (rev 0)
+++ trunk/HibernateExt/validator/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,253 @@
+<!--
+
+ Hibernate Annotations ANT build script.
+
+ You need JDK 5.0 installed to build Hibernate Annotations.
+
+-->
+
+<!-- To add a dependency:
+ defines the dependency.jar property that points to the expected jar file
+ in init, add an available dependency.jar and populate dependency.jar.available
+ create a target get.dependency which calls clean and jar
+ add get.depdendecy to depends= for compile or compiletest
+ alter lib.moduleclass.path or junit.moduleclasspath accordingly
+-->
+
+<project name="Hibernate Validator" default="dist" basedir=".">
+
+ <!-- Give user a chance to override without editing this file
+ (and without typing -D each time it compiles it) -->
+ <property file="build.properties"/>
+ <property file="${user.home}/.ant.properties"/>
+
+ <!-- Name of project and version, used to create filenames -->
+ <property name="Name" value="Hibernate Validator"/>
+ <property name="name" value="hibernate-validator"/>
+ <property name="version" value="3.2.2.GA"/>
+ <property name="javadoc.packagenames" value="org.hibernate.validator.*"/>
+ <property name="copy.test" value="true"/>
+ <property name="javac.source" value="1.5"/>
+ <property name="javac.target" value="1.5"/>
+ <property name="jdbc.dir" value="jdbc"/>
+ <property name="common.dir" value="${basedir}/../common"/>
+
+ <!-- dependencies -->
+ <property name="jpa-api.jar" value="${basedir}/../jpa-api/build/ejb3-persistence.jar"/>
+ <property name="annotations.jar"
+ value="${basedir}/../annotations/target/hibernate-annotations/hibernate-annotations.jar"/>
+ <property name="jpa.jar"
+ value="${basedir}/../entitymanager/target/hibernate-entitymanager/hibernate-entitymanager.jar"/>
+ <property name="archive-browsing.jar"
+ value="${basedir}/../entitymanager/lib/jboss-archive-browsing.jar"/>
+ <property name="commons-annotations.jar"
+ value="${basedir}/../commons-annotations/target/hibernate-commons-annotations/hibernate-commons-annotations.jar"/>
+
+ <import file="${common.dir}/common-build.xml"/>
+
+
+ <path id="lib.moduleclass.path">
+ <pathelement location="${jpa-api.jar}"/>
+ <pathelement location="${commons-annotations.jar}"/>
+ </path>
+ <path id="junit.moduleclasspath">
+ <pathelement location="${src.dir}"/>
+ <pathelement location="${test.dir}"/>
+ <pathelement location="${annotations.jar}"/>
+ <pathelement location="${jpa.jar}"/>
+ <pathelement location="${archive-browsing.jar}"/>
+ <fileset dir="${jdbc.dir}">
+ <include name="*.jar"/>
+ <include name="*.zip"/>
+ </fileset>
+ <fileset dir="${lib.dir}/test">
+ <include name="*.jar"/>
+ <include name="*.zip"/>
+ </fileset>
+ </path>
+
+ <target name="init">
+ <antcall target="common-build.init"/>
+ <!-- check for dependency artefacts -->
+ <available file="${jpa-api.jar}" type="file" property="jpa-api.jar.available"/>
+ <available file="${commons-annotations.jar}" type="file" property="commons-annotations.jar.available"/>
+ <available file="${annotations.jar}" type="file" property="annotations.jar.available"/>
+ <available file="${jpa.jar}" type="file" property="jpa.jar.available"/>
+ <mkdir dir="${lib.dir}/test"/>
+ </target>
+
+ <target name="get.jpa-api" depends="init" unless="jpa-api.jar.available">
+ <ant inheritall="false" dir="${basedir}/../jpa-api" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../jpa-api" target="jar"/>
+ </target>
+
+ <target name="get.commons-annotations" depends="init" unless="commons-annotations.jar.available">
+ <ant inheritall="false" dir="${basedir}/../commons-annotations" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../commons-annotations" target="jar"/>
+ </target>
+
+ <target name="get.annotations" depends="init" unless="annotations.jar.available">
+ <ant inheritall="false" dir="${basedir}/../annotations" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../annotations" target="jar"/>
+ </target>
+
+ <target name="get.jpa" depends="init" unless="jpa.jar.available">
+ <ant inheritall="false" dir="${basedir}/../entitymanager" target="clean"/>
+ <ant inheritall="false" dir="${basedir}/../entitymanager" target="jar"/>
+ </target>
+
+ <target name="compile" depends="init,get.jpa-api,get.commons-annotations" description="Compile the Java source code">
+ <available
+ classname="org.eclipse.core.launcher.Main"
+ property="build.compiler"
+ value="org.eclipse.jdt.core.JDTCompilerAdapter"
+ classpath="${java.class.path}"/>
+ <javac
+ srcdir="${src.dir}"
+ destdir="${classes.dir}"
+ classpathref="lib.class.path"
+ debug="${javac.debug}"
+ optimize="${javac.optimize}"
+ nowarn="on"
+ source="${javac.source}"
+ target="${javac.target}">
+ <src path="${src.dir}"/>
+ </javac>
+ <copy todir="${classes.dir}">
+ <fileset dir="${src.dir}">
+ <include name="**/resources/*.properties"/>
+ <include name="**/*.xsd"/>
+ </fileset>
+ </copy>
+ </target>
+
+ <target name="compiletest" depends="init,get.annotations,get.jpa,compile" description="Compile the tests">
+ <available
+ classname="org.eclipse.core.launcher.Main"
+ property="build.compiler"
+ value="org.eclipse.jdt.core.JDTCompilerAdapter"
+ classpath="${java.class.path}"/>
+ <javac
+ destdir="${testclasses.dir}"
+ classpathref="junit.classpath"
+ debug="${javac.debug}"
+ optimize="${javac.optimize}"
+ nowarn="on"
+ source="1.5"
+ target="1.5">
+ <src refid="testsrc.path"/>
+ </javac>
+ </target>
+
+
+ <!-- target name="junit" depends="compiletest">
+ <mkdir dir="test_output"/>
+ <junit fork="yes" printsummary="yes" haltonfailure="yes"
+ forkmode="perBatch">
+ <classpath>
+ <fileset dir="${jdbc.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.zip"/>
+ </fileset>
+ <path refid="lib.class.path"/>
+ <pathelement path="${classes.dir}"/>
+ <pathelement path="${src.dir}"/>
+ <pathelement path="${test.dir}"/>
+ </classpath>
+ <formatter type="plain"/>
+ <formatter type="xml"/>
+ <batchtest fork="yes" todir="test_output" haltonfailure="no">
+ <fileset dir="${classes.dir}">
+ <include name="**/*Test.class"/>
+ </fileset>
+ </batchtest>
+ </junit>
+ </target -->
+
+ <!-- Run a single unit test. -->
+ <target name="junitsingle" depends="compiletest"
+ description="Run a single test suite (requires testname and jdbc.driver properties)">
+ <mkdir dir="test_output"/>
+ <junit printsummary="yes" fork="yes" haltonfailure="yes">
+ <classpath>
+ <fileset dir="${jdbc.dir}">
+ <include name="**/*.jar"/>
+ <include name="**/*.zip"/>
+ </fileset>
+ <path refid="lib.class.path"/>
+ <pathelement path="${classes.dir}"/>
+ <pathelement path="${src.dir}"/>
+ <!-- pick up properties from here -->
+ <pathelement path="${test.dir}"/>
+ <!-- pick up mappings from here -->
+ </classpath>
+ <formatter type="plain"/>
+ <formatter type="xml"/>
+ <test fork="yes" todir="test_output" haltonfailure="no" name="${testname}"/>
+ </junit>
+ </target>
+
+ <!-- target name="report">
+ <mkdir dir="test_output"/>
+ <junitreport todir="test_output">
+ <fileset dir="test_output">
+ <include name="TEST-*.xml"/>
+ </fileset>
+ <report format="frames" todir="test_output/report"/>
+ </junitreport>
+ </target -->
+
+ <target name="jar" depends="compile" description="Build the distribution .jar file">
+ <mkdir dir="${classes.dir}/META-INF"/>
+ <manifest file="${classes.dir}/META-INF/MANIFEST.MF">
+ <attribute name="Product" value="${Name}"/>
+ <attribute name="Version" value="${version}"/>
+ </manifest>
+ <antcall target="common-build.jar"/>
+ </target>
+
+ <!-- Some of this can probably be moved to common-build... -->
+ <target name="dist" depends="jar,javadoc,copysource,copytest,copylib,extras"
+ description="Build everything">
+
+ <ant inheritall="false" dir="${basedir}/doc/reference"/>
+ <copy todir="${dist.dir}/doc/reference" failonerror="false">
+ <fileset dir="${basedir}/doc/reference/build">
+ <include name="**/*.*"/>
+ </fileset>
+ </copy>
+
+ <copy todir="${dist.dir}" failonerror="false">
+ <fileset dir="${common.dir}">
+ <include name="common-build.xml"/>
+ </fileset>
+ </copy>
+
+ <!-- copy dependencies -->
+ <copy todir="${dist.lib.dir}" failonerror="false">
+ <fileset file="${jpa-api.jar}"/>
+ <fileset file="${commons-annotations.jar}"/>
+ </copy>
+ <mkdir dir="${dist.lib.dir}/test"/>
+ <copy todir="${dist.lib.dir}/test" failonerror="false">
+ <fileset file="${annotations.jar}"/>
+ <fileset file="${jpa.jar}"/>
+ <fileset file="${archive-browsing.jar}"/>
+ </copy>
+
+ <copy file="${basedir}/build.properties.dist" tofile="${dist.dir}/build.properties" failonerror="false">
+ </copy>
+ <antcall target="common-build.dist"/>
+ </target>
+
+ <target name="zip-dist" description="zip the dist">
+ <zip zipfile="${dist.dir}-${version}.zip">
+ <zipfileset prefix="${name}-${version}" dir="${dist.dir}"/>
+ </zip>
+ <tar compression="gzip" tarfile="${dist.dir}-${version}.tar.gz">
+ <tarfileset prefix="${name}-${version}" dir="${dist.dir}"/>
+ </tar>
+ </target>
+
+
+</project>
Deleted: trunk/HibernateExt/validator/changelog.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/changelog.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/changelog.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,7 +0,0 @@
-Hibernate Validator Changelog
-=============================
-
-3.2.2.GA (xx-02-2007)
----------------------
-
-Initial release as a standalone product (see Hibernate Annotations changelog for previous informations)
\ No newline at end of file
Copied: trunk/HibernateExt/validator/changelog.txt (from rev 11279, branches/Branch_3_2/HibernateExt/validator/changelog.txt)
===================================================================
--- trunk/HibernateExt/validator/changelog.txt (rev 0)
+++ trunk/HibernateExt/validator/changelog.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,7 @@
+Hibernate Validator Changelog
+=============================
+
+3.2.2.GA (xx-02-2007)
+---------------------
+
+Initial release as a standalone product (see Hibernate Annotations changelog for previous informations)
\ No newline at end of file
Copied: trunk/HibernateExt/validator/doc (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc)
Copied: trunk/HibernateExt/validator/doc/api (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/api)
Deleted: trunk/HibernateExt/validator/doc/api/package.html
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/doc/api/package.html 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/doc/api/package.html 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1 +0,0 @@
-<body></body>
Copied: trunk/HibernateExt/validator/doc/api/package.html (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/api/package.html)
===================================================================
--- trunk/HibernateExt/validator/doc/api/package.html (rev 0)
+++ trunk/HibernateExt/validator/doc/api/package.html 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1 @@
+<body></body>
Copied: trunk/HibernateExt/validator/doc/reference (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference)
Deleted: trunk/HibernateExt/validator/doc/reference/build.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/doc/reference/build.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/doc/reference/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-<project name="Documentation" default="all.doc" basedir=".">
-
- <!-- Use the core Hibernate3 doc build system -->
- <import file="../../../common/common-build.xml"/>
- <import file="${hibernate-cvs.doc.reference}/build.xml"/>
-
-
- <target name="all.doc" depends="clean">
-
- <!-- TRANSLATOR: Duplicate this call for your language -->
- <antcall target="lang.all">
- <param name="docname" value="hibernate_validator"/>
- <param name="lang" value="en"/>
- </antcall>
- </target>
-
-</project>
Copied: trunk/HibernateExt/validator/doc/reference/build.xml (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/build.xml)
===================================================================
--- trunk/HibernateExt/validator/doc/reference/build.xml (rev 0)
+++ trunk/HibernateExt/validator/doc/reference/build.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+<project name="Documentation" default="all.doc" basedir=".">
+
+ <!-- Use the core Hibernate3 doc build system -->
+ <import file="../../../common/common-build.xml"/>
+ <import file="${hibernate-cvs.doc.reference}/build.xml"/>
+
+
+ <target name="all.doc" depends="clean">
+
+ <!-- TRANSLATOR: Duplicate this call for your language -->
+ <antcall target="lang.all">
+ <param name="docname" value="hibernate_validator"/>
+ <param name="lang" value="en"/>
+ </antcall>
+ </target>
+
+</project>
Copied: trunk/HibernateExt/validator/doc/reference/en (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en)
Copied: trunk/HibernateExt/validator/doc/reference/en/images (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/images)
Deleted: trunk/HibernateExt/validator/doc/reference/en/images/hibernate_logo_a.png
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/validator/doc/reference/en/images/hibernate_logo_a.png (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/images/hibernate_logo_a.png)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/validator/doc/reference/en/master.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/doc/reference/en/master.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/doc/reference/en/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,65 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
-"../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
-<!ENTITY defineconstraints SYSTEM "modules/defineconstraints.xml">
-<!ENTITY checkconstraints SYSTEM "modules/checkconstraints.xml">
-]>
-<book lang="en">
- <bookinfo>
- <title>Hibernate Validator</title>
-
- <subtitle>Reference Guide</subtitle>
-
- <releaseinfo>3.2.2.GA</releaseinfo>
-
- <mediaobject>
- <imageobject>
- <imagedata fileref="images/hibernate_logo_a.png" format="png" />
- </imageobject>
- </mediaobject>
- </bookinfo>
-
- <toc></toc>
-
- <preface id="preface" revision="2">
- <title>Preface</title>
-
- <para>Annotations are a very convenient and elegant way to specify
- invariant constraints for a domain model. You can, for example, express
- that a property should never be null, that the account balance should be
- strictly positive, etc. These domain model constraints are declared in the
- bean itself by annotating its properties. A validator can then read them
- and check for constraint violations. The validation mechanism can be
- executed in different layers in your application without having to
- duplicate any of these rules (presentation layer, data access layer).
- Following the DRY principle, Hibernate Validator has been designed for
- that purpose.</para>
-
- <para>Hibernate Validator works at two levels. First, it is able to check
- in-memory instances of a class for constraint violations. Second, it can
- apply the constraints to the Hibernate metamodel and incorporate them into
- the generated database schema.</para>
-
- <para>Each constraint annotation is associated to a validator
- implementation responsible for checking the constraint on the entity
- instance. A validator can also (optionally) apply the constraint to the
- Hibernate metamodel, allowing Hibernate to generate DDL that expresses the
- constraint. With the appropriate event listener, you can execute the
- checking operation on inserts and updates done by Hibernate. Hibernate
- Validator is not limited to use with Hibernate. You can easily use it
- anywhere in your application as well as with any Java Persistence provider
- (entity listener provided).</para>
-
- <para>When checking instances at runtime, Hibernate Validator returns
- information about constraint violations in an array of
- <classname>InvalidValue</classname> s. Among other information, the
- <classname>InvalidValue</classname> contains an error description message
- that can embed the parameter values bundle with the annotation (eg. length
- limit), and message strings that may be externalized to a
- <classname>ResourceBundle</classname> .</para>
- </preface>
-
- &defineconstraints;
-
- &checkconstraints;
-</book>
\ No newline at end of file
Copied: trunk/HibernateExt/validator/doc/reference/en/master.xml (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/master.xml)
===================================================================
--- trunk/HibernateExt/validator/doc/reference/en/master.xml (rev 0)
+++ trunk/HibernateExt/validator/doc/reference/en/master.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,65 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3CR3//EN"
+"../../../../../Hibernate3/doc/reference/support/docbook-dtd/docbookx.dtd" [
+<!ENTITY defineconstraints SYSTEM "modules/defineconstraints.xml">
+<!ENTITY checkconstraints SYSTEM "modules/checkconstraints.xml">
+]>
+<book lang="en">
+ <bookinfo>
+ <title>Hibernate Validator</title>
+
+ <subtitle>Reference Guide</subtitle>
+
+ <releaseinfo>3.2.2.GA</releaseinfo>
+
+ <mediaobject>
+ <imageobject>
+ <imagedata fileref="images/hibernate_logo_a.png" format="png" />
+ </imageobject>
+ </mediaobject>
+ </bookinfo>
+
+ <toc></toc>
+
+ <preface id="preface" revision="2">
+ <title>Preface</title>
+
+ <para>Annotations are a very convenient and elegant way to specify
+ invariant constraints for a domain model. You can, for example, express
+ that a property should never be null, that the account balance should be
+ strictly positive, etc. These domain model constraints are declared in the
+ bean itself by annotating its properties. A validator can then read them
+ and check for constraint violations. The validation mechanism can be
+ executed in different layers in your application without having to
+ duplicate any of these rules (presentation layer, data access layer).
+ Following the DRY principle, Hibernate Validator has been designed for
+ that purpose.</para>
+
+ <para>Hibernate Validator works at two levels. First, it is able to check
+ in-memory instances of a class for constraint violations. Second, it can
+ apply the constraints to the Hibernate metamodel and incorporate them into
+ the generated database schema.</para>
+
+ <para>Each constraint annotation is associated to a validator
+ implementation responsible for checking the constraint on the entity
+ instance. A validator can also (optionally) apply the constraint to the
+ Hibernate metamodel, allowing Hibernate to generate DDL that expresses the
+ constraint. With the appropriate event listener, you can execute the
+ checking operation on inserts and updates done by Hibernate. Hibernate
+ Validator is not limited to use with Hibernate. You can easily use it
+ anywhere in your application as well as with any Java Persistence provider
+ (entity listener provided).</para>
+
+ <para>When checking instances at runtime, Hibernate Validator returns
+ information about constraint violations in an array of
+ <classname>InvalidValue</classname> s. Among other information, the
+ <classname>InvalidValue</classname> contains an error description message
+ that can embed the parameter values bundle with the annotation (eg. length
+ limit), and message strings that may be externalized to a
+ <classname>ResourceBundle</classname> .</para>
+ </preface>
+
+ &defineconstraints;
+
+ &checkconstraints;
+</book>
\ No newline at end of file
Copied: trunk/HibernateExt/validator/doc/reference/en/modules (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/modules)
Deleted: trunk/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,209 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="validator-checkconstraints">
- <title>Using the Validator framework</title>
-
- <para>Hibernate Validator is intended to be used to implement multi-layered
- data validation, where constraints are expressed in a single place (the
- annotated domain model) and checked in various different layers of the
- application.</para>
-
- <para>This chapter will cover Hibernate Validator usage for different
- layers</para>
-
- <section id="validator-checkconstraints-db" revision="2">
- <title>Database schema-level validation</title>
-
- <para>Out of the box, Hibernate Annotations will translate the constraints
- you have defined for your entities into mapping metadata. For example, if
- a property of your entity is annotated <literal>@NotNull</literal>, its
- columns will be declared as <literal>not null</literal> in the DDL schema
- generated by Hibernate.</para>
-
- <para>Using hbm2ddl, domain model constraints will be expressed into the
- database schema.</para>
-
- <para>If, for some reason, the feature needs to be disabled, set
- <literal>hibernate.validator.apply_to_ddl</literal> to
- <literal>false</literal>.</para>
- </section>
-
- <section id="validator-checkconstraints-orm">
- <title>ORM integration</title>
-
- <para>Hibernate Validator integrates with both Hibernate and all pure Java
- Persistence providers</para>
-
- <section id="validator-checkconstraints-orm-hibernateevent" revision="1">
- <title>Hibernate event-based validation</title>
-
- <para>Hibernate Validator has two built-in Hibernate event listeners.
- Whenever a <literal>PreInsertEvent</literal> or
- <literal>PreUpdateEvent</literal> occurs, the listeners will verify all
- constraints of the entity instance and throw an exception if any
- constraint is violated. Basically, objects will be checked before any
- inserts and before any updates made by Hibernate. This includes changes
- applied by cascade! This is the most convenient and the easiest way to
- activate the validation process. On constraint violation, the event will
- raise a runtime <classname>InvalidStateException</classname> which
- contains an array of <literal>InvalidValue</literal>s describing each
- failure.</para>
-
- <para>If Hibernate Validator is present in the classpath, Hibernate
- Annotations (or Hibernate EntityManager) will use it transparently. If,
- for some reason, you want to disable this integration, set
- <literal>hibernate.validator.autoregister_listeners</literal> to
- false</para>
-
- <para><note>
- <para>If the beans are not annotated with validation annotations,
- there is no runtime performance cost.</para>
- </note></para>
-
- <para>In case you need to manually set the event listeners for Hibernate
- Core, use the following configuration in
- <literal>hibernate.cfg.xml</literal>:</para>
-
- <programlisting><hibernate-configuration>
- ...
- <event type="pre-update">
- <listener
- class="org.hibernate.validator.event.ValidateEventListener"/>
- </event>
- <event type="pre-insert">
- <listener
- class="org.hibernate.validator.event.ValidateEventListener"/>
- </event>
-</hibernate-configuration></programlisting>
- </section>
-
- <section id="validator-checkconstraints-orm-jpaevent">
- <title>Java Persistence event-based validation</title>
-
- <para>Hibernate Validator is not tied to Hibernate for event based
- validation: a Java Persistence entity listener is available. Whenever an
- listened entity is persisted or updated, Hibernate Validator will verify
- all constraints of the entity instance and throw an exception if any
- constraint is violated. Basically, objects will be checked before any
- inserts and before any updates made by the Java Persistence provider.
- This includes changes applied by cascade! On constraint violation, the
- event will raise a runtime <classname>InvalidStateException</classname>
- which contains an array of <literal>InvalidValue</literal>s describing
- each failure.</para>
-
- <para>Here is how to make a class validatable:</para>
-
- <programlisting>@Entity
- at EntityListeners( JPAValidateListener.class )
-public class Submarine {
- ...
-}</programlisting>
-
- <para><note>
- <para>Compared to the Hibernate event, the Java Persistence listener
- has two drawbacks. You need to define the entity listener on every
- validatable entity. The DDL generated by your provider will not
- reflect the constraints.</para>
- </note></para>
- </section>
- </section>
-
- <section>
- <title>Application-level validation</title>
-
- <para>Hibernate Validator can be applied anywhere in your application
- code.</para>
-
- <programlisting>ClassValidator personValidator = new ClassValidator( Person.class );
-ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
-
-InvalidValue[] validationMessages = addressValidator.getInvalidValues(address);</programlisting>
-
- <para>The first two lines prepare the Hibernate Validator for class
- checking. The first one relies upon the error messages embedded in
- Hibernate Validator (see <xref
- linkend="validator-defineconstraints-error" />), the second one uses a
- resource bundle for these messages. It is considered a good practice to
- execute these lines once and cache the validator instances.</para>
-
- <para>The third line actually validates the <literal>Address</literal>
- instance and returns an array of <literal>InvalidValue</literal>s. Your
- application logic will then be able to react to the failure.</para>
-
- <para>You can also check a particular property instead of the whole bean.
- This might be useful for property per property user interaction</para>
-
- <programlisting>ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
-
-//only get city property invalid values
-InvalidValue[] validationMessages = addressValidator.getInvalidValues(address, "city");
-
-//only get potential city property invalid values
-InvalidValue[] validationMessages = addressValidator.getPotentialInvalidValues("city", "Paris")</programlisting>
- </section>
-
- <section>
- <title>Presentation layer validation</title>
-
- <para>When working with JSF and <productname>JBoss Seam</productname>, one
- can triggers the validation process at the presentation layer using Seam's
- JSF tags <literal><s:validate></literal> and
- <literal><s:validateAll/></literal>, letting the constraints be
- expressed on the model, and the violations presented in the view</para>
-
- <programlisting><h:form>
- <div>
- <h:messages/>
- </div>
- <emphasis role="bold"><s:validateAll></emphasis>
- <div>
- Country:
- <h:inputText value="#{location.country}" required="true"/>
- </div>
- <div>
- Zip code:
- <h:inputText value="#{location.zip}" required="true"/>
- </div>
- <div>
- <h:commandButton/>
- </div>
- <emphasis role="bold"></s:validateAll></emphasis>
-</h:form></programlisting>
-
- <para>Going even further, and adding <productname>Ajax4JSF</productname>
- to the loop will bring client side validation with just a couple of
- additional JSF tags, again without validation definition
- duplication.</para>
-
- <para>Check the <ulink url="http://www.jboss.com/products/seam">JBoss
- Seam</ulink> documentation for more information.</para>
- </section>
-
- <section>
- <title>Validation informations</title>
-
- <para>As a validation information carrier, hibernate provide an array of
- <classname>InvalidValue</classname>. Each <literal>InvalidValue</literal>
- has a buch of methods describing the individual issues.</para>
-
- <para><methodname>getBeanClass()</methodname> retrieves the failing bean
- type</para>
-
- <para><methodname>getBean()</methodname>retrieves the failing instance (if
- any ie not when using
- <methodname>getPotentianInvalidValues()</methodname>)</para>
-
- <para><methodname>getValue()</methodname> retrieves the failing
- value</para>
-
- <para><methodname>getMessage()</methodname> retrieves the proper
- internationalized error message</para>
-
- <para><methodname>getRootBean()</methodname> retrieves the root bean
- instance generating the issue (useful in conjunction with
- <literal>@Valid</literal>), is null if getPotentianInvalidValues() is
- used.</para>
-
- <para><literal>getPropertyPath()</literal> retrieves the dotted path of
- the failing property starting from the root bean</para>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml)
===================================================================
--- trunk/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml (rev 0)
+++ trunk/HibernateExt/validator/doc/reference/en/modules/checkconstraints.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,209 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="validator-checkconstraints">
+ <title>Using the Validator framework</title>
+
+ <para>Hibernate Validator is intended to be used to implement multi-layered
+ data validation, where constraints are expressed in a single place (the
+ annotated domain model) and checked in various different layers of the
+ application.</para>
+
+ <para>This chapter will cover Hibernate Validator usage for different
+ layers</para>
+
+ <section id="validator-checkconstraints-db" revision="2">
+ <title>Database schema-level validation</title>
+
+ <para>Out of the box, Hibernate Annotations will translate the constraints
+ you have defined for your entities into mapping metadata. For example, if
+ a property of your entity is annotated <literal>@NotNull</literal>, its
+ columns will be declared as <literal>not null</literal> in the DDL schema
+ generated by Hibernate.</para>
+
+ <para>Using hbm2ddl, domain model constraints will be expressed into the
+ database schema.</para>
+
+ <para>If, for some reason, the feature needs to be disabled, set
+ <literal>hibernate.validator.apply_to_ddl</literal> to
+ <literal>false</literal>.</para>
+ </section>
+
+ <section id="validator-checkconstraints-orm">
+ <title>ORM integration</title>
+
+ <para>Hibernate Validator integrates with both Hibernate and all pure Java
+ Persistence providers</para>
+
+ <section id="validator-checkconstraints-orm-hibernateevent" revision="1">
+ <title>Hibernate event-based validation</title>
+
+ <para>Hibernate Validator has two built-in Hibernate event listeners.
+ Whenever a <literal>PreInsertEvent</literal> or
+ <literal>PreUpdateEvent</literal> occurs, the listeners will verify all
+ constraints of the entity instance and throw an exception if any
+ constraint is violated. Basically, objects will be checked before any
+ inserts and before any updates made by Hibernate. This includes changes
+ applied by cascade! This is the most convenient and the easiest way to
+ activate the validation process. On constraint violation, the event will
+ raise a runtime <classname>InvalidStateException</classname> which
+ contains an array of <literal>InvalidValue</literal>s describing each
+ failure.</para>
+
+ <para>If Hibernate Validator is present in the classpath, Hibernate
+ Annotations (or Hibernate EntityManager) will use it transparently. If,
+ for some reason, you want to disable this integration, set
+ <literal>hibernate.validator.autoregister_listeners</literal> to
+ false</para>
+
+ <para><note>
+ <para>If the beans are not annotated with validation annotations,
+ there is no runtime performance cost.</para>
+ </note></para>
+
+ <para>In case you need to manually set the event listeners for Hibernate
+ Core, use the following configuration in
+ <literal>hibernate.cfg.xml</literal>:</para>
+
+ <programlisting><hibernate-configuration>
+ ...
+ <event type="pre-update">
+ <listener
+ class="org.hibernate.validator.event.ValidateEventListener"/>
+ </event>
+ <event type="pre-insert">
+ <listener
+ class="org.hibernate.validator.event.ValidateEventListener"/>
+ </event>
+</hibernate-configuration></programlisting>
+ </section>
+
+ <section id="validator-checkconstraints-orm-jpaevent">
+ <title>Java Persistence event-based validation</title>
+
+ <para>Hibernate Validator is not tied to Hibernate for event based
+ validation: a Java Persistence entity listener is available. Whenever an
+ listened entity is persisted or updated, Hibernate Validator will verify
+ all constraints of the entity instance and throw an exception if any
+ constraint is violated. Basically, objects will be checked before any
+ inserts and before any updates made by the Java Persistence provider.
+ This includes changes applied by cascade! On constraint violation, the
+ event will raise a runtime <classname>InvalidStateException</classname>
+ which contains an array of <literal>InvalidValue</literal>s describing
+ each failure.</para>
+
+ <para>Here is how to make a class validatable:</para>
+
+ <programlisting>@Entity
+ at EntityListeners( JPAValidateListener.class )
+public class Submarine {
+ ...
+}</programlisting>
+
+ <para><note>
+ <para>Compared to the Hibernate event, the Java Persistence listener
+ has two drawbacks. You need to define the entity listener on every
+ validatable entity. The DDL generated by your provider will not
+ reflect the constraints.</para>
+ </note></para>
+ </section>
+ </section>
+
+ <section>
+ <title>Application-level validation</title>
+
+ <para>Hibernate Validator can be applied anywhere in your application
+ code.</para>
+
+ <programlisting>ClassValidator personValidator = new ClassValidator( Person.class );
+ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
+
+InvalidValue[] validationMessages = addressValidator.getInvalidValues(address);</programlisting>
+
+ <para>The first two lines prepare the Hibernate Validator for class
+ checking. The first one relies upon the error messages embedded in
+ Hibernate Validator (see <xref
+ linkend="validator-defineconstraints-error" />), the second one uses a
+ resource bundle for these messages. It is considered a good practice to
+ execute these lines once and cache the validator instances.</para>
+
+ <para>The third line actually validates the <literal>Address</literal>
+ instance and returns an array of <literal>InvalidValue</literal>s. Your
+ application logic will then be able to react to the failure.</para>
+
+ <para>You can also check a particular property instead of the whole bean.
+ This might be useful for property per property user interaction</para>
+
+ <programlisting>ClassValidator addressValidator = new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) );
+
+//only get city property invalid values
+InvalidValue[] validationMessages = addressValidator.getInvalidValues(address, "city");
+
+//only get potential city property invalid values
+InvalidValue[] validationMessages = addressValidator.getPotentialInvalidValues("city", "Paris")</programlisting>
+ </section>
+
+ <section>
+ <title>Presentation layer validation</title>
+
+ <para>When working with JSF and <productname>JBoss Seam</productname>, one
+ can triggers the validation process at the presentation layer using Seam's
+ JSF tags <literal><s:validate></literal> and
+ <literal><s:validateAll/></literal>, letting the constraints be
+ expressed on the model, and the violations presented in the view</para>
+
+ <programlisting><h:form>
+ <div>
+ <h:messages/>
+ </div>
+ <emphasis role="bold"><s:validateAll></emphasis>
+ <div>
+ Country:
+ <h:inputText value="#{location.country}" required="true"/>
+ </div>
+ <div>
+ Zip code:
+ <h:inputText value="#{location.zip}" required="true"/>
+ </div>
+ <div>
+ <h:commandButton/>
+ </div>
+ <emphasis role="bold"></s:validateAll></emphasis>
+</h:form></programlisting>
+
+ <para>Going even further, and adding <productname>Ajax4JSF</productname>
+ to the loop will bring client side validation with just a couple of
+ additional JSF tags, again without validation definition
+ duplication.</para>
+
+ <para>Check the <ulink url="http://www.jboss.com/products/seam">JBoss
+ Seam</ulink> documentation for more information.</para>
+ </section>
+
+ <section>
+ <title>Validation informations</title>
+
+ <para>As a validation information carrier, hibernate provide an array of
+ <classname>InvalidValue</classname>. Each <literal>InvalidValue</literal>
+ has a buch of methods describing the individual issues.</para>
+
+ <para><methodname>getBeanClass()</methodname> retrieves the failing bean
+ type</para>
+
+ <para><methodname>getBean()</methodname>retrieves the failing instance (if
+ any ie not when using
+ <methodname>getPotentianInvalidValues()</methodname>)</para>
+
+ <para><methodname>getValue()</methodname> retrieves the failing
+ value</para>
+
+ <para><methodname>getMessage()</methodname> retrieves the proper
+ internationalized error message</para>
+
+ <para><methodname>getRootBean()</methodname> retrieves the root bean
+ instance generating the issue (useful in conjunction with
+ <literal>@Valid</literal>), is null if getPotentianInvalidValues() is
+ used.</para>
+
+ <para><literal>getPropertyPath()</literal> retrieves the dotted path of
+ the failing property starting from the root bean</para>
+ </section>
+</chapter>
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/doc/reference/en/modules/defineconstraints.xml
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/doc/reference/en/modules/defineconstraints.xml 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/doc/reference/en/modules/defineconstraints.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,481 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<chapter id="validator-defineconstraints">
- <title>Defining constraints</title>
-
- <section id="validator-defineconstraints-definition" revision="1">
- <title>What is a constraint?</title>
-
- <para>A constraint is a rule that a given element (field, property or
- bean) has to comply to. The rule semantic is expressed by an annotation. A
- constraint usually has some attributes used to parameterize the
- constraints limits. The constraint applies to the annotated
- element.</para>
- </section>
-
- <section id="validator-defineconstraints-builtin" revision="2">
- <title>Built in constraints</title>
-
- <para>Hibernate Validator comes with some built-in constraints, which
- covers most basic data checks. As we'll see later, you're not limited to
- them, you can literally in a minute write your own constraints.</para>
-
- <table>
- <title>Built-in constraints</title>
-
- <tgroup cols="4">
- <colspec align="center" />
-
- <thead>
- <row>
- <entry>Annotation</entry>
-
- <entry>Apply on</entry>
-
- <entry>Runtime checking</entry>
-
- <entry>Hibernate Metadata impact</entry>
- </row>
- </thead>
-
- <tbody>
- <row>
- <entry>@Length(min=, max=)</entry>
-
- <entry>property (String)</entry>
-
- <entry>check if the string length match the range</entry>
-
- <entry>Column length will be set to max</entry>
- </row>
-
- <row>
- <entry>@Max(value=)</entry>
-
- <entry>property (numeric or string representation of a
- numeric)</entry>
-
- <entry>check if the value is less than or equals to max</entry>
-
- <entry>Add a check constraint on the column</entry>
- </row>
-
- <row>
- <entry>@Min(value=)</entry>
-
- <entry>property (numeric or string representation of a
- numeric)</entry>
-
- <entry>check if the value is more than or equals to min</entry>
-
- <entry>Add a check constraint on the column</entry>
- </row>
-
- <row>
- <entry>@NotNull</entry>
-
- <entry>property</entry>
-
- <entry>check if the value is not null</entry>
-
- <entry>Column(s) are not null</entry>
- </row>
-
- <row>
- <entry>@NotEmpty</entry>
-
- <entry>property</entry>
-
- <entry>check if the string is not null nor empty. Check if the
- connection is not null nor empty</entry>
-
- <entry>Column(s) are not null (for String)</entry>
- </row>
-
- <row>
- <entry>@Past</entry>
-
- <entry>property (date or calendar)</entry>
-
- <entry>check if the date is in the past</entry>
-
- <entry>Add a check constraint on the column</entry>
- </row>
-
- <row>
- <entry>@Future</entry>
-
- <entry>property (date or calendar)</entry>
-
- <entry>check if the date is in the future</entry>
-
- <entry>none</entry>
- </row>
-
- <row>
- <entry>@Pattern(regex="regexp", flag=) or @Patterns(
- {@Pattern(...)} )</entry>
-
- <entry>property (string)</entry>
-
- <entry>check if the property match the regular expression given a
- match flag (see <classname>java.util.regex.Pattern </classname>
- )</entry>
-
- <entry>none</entry>
- </row>
-
- <row>
- <entry>@Range(min=, max=)</entry>
-
- <entry>property (numeric or string representation of a
- numeric)</entry>
-
- <entry>check if the value is between min and max
- (included)</entry>
-
- <entry>Add a check constraint on the column</entry>
- </row>
-
- <row>
- <entry>@Size(min=, max=)</entry>
-
- <entry>property (array, collection, map)</entry>
-
- <entry>check if the element size is between min and max
- (included)</entry>
-
- <entry>none</entry>
- </row>
-
- <row>
- <entry>@AssertFalse</entry>
-
- <entry>property</entry>
-
- <entry>check that the method evaluates to false (useful for
- constraints expressed in code rather than annotations)</entry>
-
- <entry>none</entry>
- </row>
-
- <row>
- <entry>@AssertTrue</entry>
-
- <entry>property</entry>
-
- <entry>check that the method evaluates to true (useful for
- constraints expressed in code rather than annotations)</entry>
-
- <entry>none</entry>
- </row>
-
- <row>
- <entry>@Valid</entry>
-
- <entry>property (object)</entry>
-
- <entry>perform validation recursively on the associated object. If
- the object is a Collection or an array, the elements are validated
- recursively. If the object is a Map, the value elements are
- validated recursively.</entry>
-
- <entry>none</entry>
- </row>
-
- <row>
- <entry>@Email</entry>
-
- <entry>property (String)</entry>
-
- <entry>check whether the string is conform to the email address
- specification</entry>
-
- <entry>none</entry>
- </row>
-
- <row>
- <entry>@CreditCardNumber</entry>
-
- <entry>property (String)</entry>
-
- <entry>check whether the string is a well formated credit card
- number (derivative of the Luhn algorithm)</entry>
-
- <entry>none</entry>
- </row>
-
- <row>
- <entry>@Digits</entry>
-
- <entry>property (numeric or string representation of a
- numeric)</entry>
-
- <entry>check whether the property is a number having up to
- <literal>integerDigits</literal> integer digits and
- <literal>fractionalDigits</literal> fractonal digits</entry>
-
- <entry>define column precision and scale</entry>
- </row>
-
- <row>
- <entry>@EAN</entry>
-
- <entry>property (string)</entry>
-
- <entry>check whether the string is a properly formated EAN or
- UPC-A code</entry>
-
- <entry>none</entry>
- </row>
-
- <row>
- <entry>@Digits</entry>
-
- <entry>property (numeric or string representation of a
- numeric)</entry>
-
- <entry>check whether the property is a number having up to
- <literal>integerDigits</literal> integer digits and
- <literal>fractionalDigits</literal> fractonal digits</entry>
-
- <entry>define column precision and scale</entry>
- </row>
- </tbody>
- </tgroup>
- </table>
- </section>
-
- <section id="validator-defineconstraints-error" xreflabel="Error messages">
- <title>Error messages</title>
-
- <para>Hibernate Validator comes with a default set of error messages
- translated in about ten languages (if yours is not part of it, please sent
- us a patch). You can override those messages by creating a
- <filename>ValidatorMessages.properties</filename> or (
- <filename>ValidatorMessages_loc.properties</filename> ) and override the
- needed keys. You can even add your own additional set of messages while
- writing your validator annotations. If Hibernate Validator cannot resolve
- a key from your resourceBundle nor from ValidatorMessage, it falls back to
- the default built-in values.</para>
-
- <para>Alternatively you can provide a
- <classname>ResourceBundle</classname> while checking programmatically the
- validation rules on a bean or if you want a completly different
- interpolation mechanism, you can provide an implementation of
- <literal>org.hibernate.validator.MessageInterpolator</literal> (check the
- JavaDoc for more informations).</para>
- </section>
-
- <section id="validator-defineconstraints-own" revision="1">
- <title>Writing your own constraints</title>
-
- <para>Extending the set of built-in constraints is extremely easy. Any
- constraint consists of two pieces: the constraint
- <emphasis>descriptor</emphasis> (the annotation) and the constraint
- <emphasis>validator</emphasis> (the implementation class). Here is a
- simple user-defined descriptor:</para>
-
- <programlisting>@ValidatorClass(CapitalizedValidator.class)
- at Target(METHOD)
- at Retention(RUNTIME)
- at Documented
-public @interface Capitalized {
- CapitalizeType type() default Capitalize.FIRST;
- String message() default "has incorrect capitalization"
-} </programlisting>
-
- <para><literal>type</literal> is a parameter describing how the property
- should to be capitalized. This is a user parameter fully dependant on the
- annotation business.</para>
-
- <para><literal>message</literal> is the default string used to describe
- the constraint violation and is mandatory. You can hard code the string or
- you can externalize part/all of it through the Java ResourceBundle
- mechanism. Parameters values are going to be injected inside the message
- when the <literal>{parameter}</literal> string is found (in our example
- <literal>Capitalization is not {type}</literal> would generate
- <literal>Capitalization is not FIRST</literal> ), externalizing the whole
- string in <filename>ValidatorMessages.properties</filename> is considered
- good practice. See <xref linkend="validator-defineconstraints-error" />
- .</para>
-
- <programlisting>@ValidatorClass(CapitalizedValidator.class)
- at Target(METHOD)
- at Retention(RUNTIME)
- at Documented
-public @interface Capitalized {
- CapitalizeType type() default Capitalize.FIRST;
- String message() default "{validator.capitalized}";
-}
-
-
-#in ValidatorMessages.properties
-validator.capitalized = <literal>Capitalization is not {type}</literal>
- </programlisting>
-
- <para>As you can see the {} notation is recursive.</para>
-
- <para>To link a descriptor to its validator implementation, we use the
- <literal>@ValidatorClass</literal> meta-annotation. The validator class
- parameter must name a class which implements
- <literal>Validator<ConstraintAnnotation></literal> .</para>
-
- <para>We now have to implement the validator (ie. the rule checking
- implementation). A validation implementation can check the value of the a
- property (by implementing <literal>PropertyConstraint</literal> ) and/or
- can modify the hibernate mapping metadata to express the constraint at the
- database level (by implementing
- <literal>PersistentClassConstraint</literal> )</para>
-
- <programlisting>public class CapitalizedValidator
- implements Validator<Capitalized>, PropertyConstraint {
- private CapitalizeType type;
-
- //part of the Validator<Annotation> contract,
- //allows to get and use the annotation values
- public void initialize(Capitalized parameters) {
- type = parameters.type();
- }
-
- //part of the property constraint contract
- public boolean isValid(Object value) {
- if (value==null) return true;
- if ( !(value instanceof String) ) return false;
- String string = (String) value;
- if (type == CapitalizeType.ALL) {
- return string.equals( string.toUpperCase() );
- }
- else {
- String first = string.substring(0,1);
- return first.equals( first.toUpperCase();
- }
- }
-} </programlisting>
-
- <para>The <literal>isValid()</literal> method should return false if the
- constraint has been violated. For more examples, refer to the built-in
- validator implementations.</para>
-
- <para>We only have seen property level validation, but you can write a
- Bean level validation annotation. Instead of receiving the return instance
- of a property, the bean itself will be passed to the validator. To
- activate the validation checking, just annotated the bean itself instead.
- A small sample can be found in the unit test suite.</para>
-
- <para>If your constraint can be applied multiple times (with different
- parameters) on the same property or type, you can use the following
- annotation form:</para>
-
- <programlisting>@Target(METHOD)
- at Retention(RUNTIME)
- at Documented
-<emphasis role="bold">public @interface Patterns {</emphasis>
- Pattern[] value();
-}
-
- at Target(METHOD)
- at Retention(RUNTIME)
- at Documented
- at ValidatorClass(PatternValidator.class)
-public @interface Pattern {
- String regexp();
-}</programlisting>
-
- <para>Basically an annotation containing the value attribute as an array
- of validator annotations.</para>
- </section>
-
- <section>
- <title>Annotating your domain model</title>
-
- <para>Since you are already familiar with annotations now, the syntax
- should be very familiar</para>
-
- <programlisting>public class Address {
- private String line1;
- private String line2;
- private String zip;
- private String state;
- private String country;
- private long id;
-
- // a not null string of 20 characters maximum
- @Length(max=20)
- @NotNull
- public String getCountry() {
- return country;
- }
-
- // a non null string
- @NotNull
- public String getLine1() {
- return line1;
- }
-
- //no constraint
- public String getLine2() {
- return line2;
- }
-
- // a not null string of 3 characters maximum
- @Length(max=3) @NotNull
- public String getState() {
- return state;
- }
-
- // a not null numeric string of 5 characters maximum
- // if the string is longer, the message will
- //be searched in the resource bundle at key 'long'
- @Length(max=5, message="{long}")
- @Pattern(regex="[0-9]+")
- @NotNull
- public String getZip() {
- return zip;
- }
-
- // should always be true
- @AssertTrue
- public boolean isValid() {
- return true;
- }
-
- // a numeric between 1 and 2000
- @Id @Min(1)
- @Range(max=2000)
- public long getId() {
- return id;
- }
-} </programlisting>
-
- <para>While the example only shows public property validation, you can
- also annotate fields of any kind of visibility</para>
-
- <programlisting>@MyBeanConstraint(max=45
-public class Dog {
- @AssertTrue private boolean isMale;
- @NotNull protected String getName() { ... };
- ...
-} </programlisting>
-
- <para>You can also annotate interfaces. Hibernate Validator will check all
- superclasses and interfaces extended or implemented by a given bean to
- read the appropriate validator annotations.</para>
-
- <programlisting>public interface Named {
- @NotNull String getName();
- ...
-}
-
-public class Dog implements Named {
-
- @AssertTrue private boolean isMale;
-
- public String getName() { ... };
-
-}
- </programlisting>
-
- <para>The name property will be checked for nullity when the Dog bean is
- validated.</para>
- </section>
-</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/validator/doc/reference/en/modules/defineconstraints.xml (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/modules/defineconstraints.xml)
===================================================================
--- trunk/HibernateExt/validator/doc/reference/en/modules/defineconstraints.xml (rev 0)
+++ trunk/HibernateExt/validator/doc/reference/en/modules/defineconstraints.xml 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,481 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<chapter id="validator-defineconstraints">
+ <title>Defining constraints</title>
+
+ <section id="validator-defineconstraints-definition" revision="1">
+ <title>What is a constraint?</title>
+
+ <para>A constraint is a rule that a given element (field, property or
+ bean) has to comply to. The rule semantic is expressed by an annotation. A
+ constraint usually has some attributes used to parameterize the
+ constraints limits. The constraint applies to the annotated
+ element.</para>
+ </section>
+
+ <section id="validator-defineconstraints-builtin" revision="2">
+ <title>Built in constraints</title>
+
+ <para>Hibernate Validator comes with some built-in constraints, which
+ covers most basic data checks. As we'll see later, you're not limited to
+ them, you can literally in a minute write your own constraints.</para>
+
+ <table>
+ <title>Built-in constraints</title>
+
+ <tgroup cols="4">
+ <colspec align="center" />
+
+ <thead>
+ <row>
+ <entry>Annotation</entry>
+
+ <entry>Apply on</entry>
+
+ <entry>Runtime checking</entry>
+
+ <entry>Hibernate Metadata impact</entry>
+ </row>
+ </thead>
+
+ <tbody>
+ <row>
+ <entry>@Length(min=, max=)</entry>
+
+ <entry>property (String)</entry>
+
+ <entry>check if the string length match the range</entry>
+
+ <entry>Column length will be set to max</entry>
+ </row>
+
+ <row>
+ <entry>@Max(value=)</entry>
+
+ <entry>property (numeric or string representation of a
+ numeric)</entry>
+
+ <entry>check if the value is less than or equals to max</entry>
+
+ <entry>Add a check constraint on the column</entry>
+ </row>
+
+ <row>
+ <entry>@Min(value=)</entry>
+
+ <entry>property (numeric or string representation of a
+ numeric)</entry>
+
+ <entry>check if the value is more than or equals to min</entry>
+
+ <entry>Add a check constraint on the column</entry>
+ </row>
+
+ <row>
+ <entry>@NotNull</entry>
+
+ <entry>property</entry>
+
+ <entry>check if the value is not null</entry>
+
+ <entry>Column(s) are not null</entry>
+ </row>
+
+ <row>
+ <entry>@NotEmpty</entry>
+
+ <entry>property</entry>
+
+ <entry>check if the string is not null nor empty. Check if the
+ connection is not null nor empty</entry>
+
+ <entry>Column(s) are not null (for String)</entry>
+ </row>
+
+ <row>
+ <entry>@Past</entry>
+
+ <entry>property (date or calendar)</entry>
+
+ <entry>check if the date is in the past</entry>
+
+ <entry>Add a check constraint on the column</entry>
+ </row>
+
+ <row>
+ <entry>@Future</entry>
+
+ <entry>property (date or calendar)</entry>
+
+ <entry>check if the date is in the future</entry>
+
+ <entry>none</entry>
+ </row>
+
+ <row>
+ <entry>@Pattern(regex="regexp", flag=) or @Patterns(
+ {@Pattern(...)} )</entry>
+
+ <entry>property (string)</entry>
+
+ <entry>check if the property match the regular expression given a
+ match flag (see <classname>java.util.regex.Pattern </classname>
+ )</entry>
+
+ <entry>none</entry>
+ </row>
+
+ <row>
+ <entry>@Range(min=, max=)</entry>
+
+ <entry>property (numeric or string representation of a
+ numeric)</entry>
+
+ <entry>check if the value is between min and max
+ (included)</entry>
+
+ <entry>Add a check constraint on the column</entry>
+ </row>
+
+ <row>
+ <entry>@Size(min=, max=)</entry>
+
+ <entry>property (array, collection, map)</entry>
+
+ <entry>check if the element size is between min and max
+ (included)</entry>
+
+ <entry>none</entry>
+ </row>
+
+ <row>
+ <entry>@AssertFalse</entry>
+
+ <entry>property</entry>
+
+ <entry>check that the method evaluates to false (useful for
+ constraints expressed in code rather than annotations)</entry>
+
+ <entry>none</entry>
+ </row>
+
+ <row>
+ <entry>@AssertTrue</entry>
+
+ <entry>property</entry>
+
+ <entry>check that the method evaluates to true (useful for
+ constraints expressed in code rather than annotations)</entry>
+
+ <entry>none</entry>
+ </row>
+
+ <row>
+ <entry>@Valid</entry>
+
+ <entry>property (object)</entry>
+
+ <entry>perform validation recursively on the associated object. If
+ the object is a Collection or an array, the elements are validated
+ recursively. If the object is a Map, the value elements are
+ validated recursively.</entry>
+
+ <entry>none</entry>
+ </row>
+
+ <row>
+ <entry>@Email</entry>
+
+ <entry>property (String)</entry>
+
+ <entry>check whether the string is conform to the email address
+ specification</entry>
+
+ <entry>none</entry>
+ </row>
+
+ <row>
+ <entry>@CreditCardNumber</entry>
+
+ <entry>property (String)</entry>
+
+ <entry>check whether the string is a well formated credit card
+ number (derivative of the Luhn algorithm)</entry>
+
+ <entry>none</entry>
+ </row>
+
+ <row>
+ <entry>@Digits</entry>
+
+ <entry>property (numeric or string representation of a
+ numeric)</entry>
+
+ <entry>check whether the property is a number having up to
+ <literal>integerDigits</literal> integer digits and
+ <literal>fractionalDigits</literal> fractonal digits</entry>
+
+ <entry>define column precision and scale</entry>
+ </row>
+
+ <row>
+ <entry>@EAN</entry>
+
+ <entry>property (string)</entry>
+
+ <entry>check whether the string is a properly formated EAN or
+ UPC-A code</entry>
+
+ <entry>none</entry>
+ </row>
+
+ <row>
+ <entry>@Digits</entry>
+
+ <entry>property (numeric or string representation of a
+ numeric)</entry>
+
+ <entry>check whether the property is a number having up to
+ <literal>integerDigits</literal> integer digits and
+ <literal>fractionalDigits</literal> fractonal digits</entry>
+
+ <entry>define column precision and scale</entry>
+ </row>
+ </tbody>
+ </tgroup>
+ </table>
+ </section>
+
+ <section id="validator-defineconstraints-error" xreflabel="Error messages">
+ <title>Error messages</title>
+
+ <para>Hibernate Validator comes with a default set of error messages
+ translated in about ten languages (if yours is not part of it, please sent
+ us a patch). You can override those messages by creating a
+ <filename>ValidatorMessages.properties</filename> or (
+ <filename>ValidatorMessages_loc.properties</filename> ) and override the
+ needed keys. You can even add your own additional set of messages while
+ writing your validator annotations. If Hibernate Validator cannot resolve
+ a key from your resourceBundle nor from ValidatorMessage, it falls back to
+ the default built-in values.</para>
+
+ <para>Alternatively you can provide a
+ <classname>ResourceBundle</classname> while checking programmatically the
+ validation rules on a bean or if you want a completly different
+ interpolation mechanism, you can provide an implementation of
+ <literal>org.hibernate.validator.MessageInterpolator</literal> (check the
+ JavaDoc for more informations).</para>
+ </section>
+
+ <section id="validator-defineconstraints-own" revision="1">
+ <title>Writing your own constraints</title>
+
+ <para>Extending the set of built-in constraints is extremely easy. Any
+ constraint consists of two pieces: the constraint
+ <emphasis>descriptor</emphasis> (the annotation) and the constraint
+ <emphasis>validator</emphasis> (the implementation class). Here is a
+ simple user-defined descriptor:</para>
+
+ <programlisting>@ValidatorClass(CapitalizedValidator.class)
+ at Target(METHOD)
+ at Retention(RUNTIME)
+ at Documented
+public @interface Capitalized {
+ CapitalizeType type() default Capitalize.FIRST;
+ String message() default "has incorrect capitalization"
+} </programlisting>
+
+ <para><literal>type</literal> is a parameter describing how the property
+ should to be capitalized. This is a user parameter fully dependant on the
+ annotation business.</para>
+
+ <para><literal>message</literal> is the default string used to describe
+ the constraint violation and is mandatory. You can hard code the string or
+ you can externalize part/all of it through the Java ResourceBundle
+ mechanism. Parameters values are going to be injected inside the message
+ when the <literal>{parameter}</literal> string is found (in our example
+ <literal>Capitalization is not {type}</literal> would generate
+ <literal>Capitalization is not FIRST</literal> ), externalizing the whole
+ string in <filename>ValidatorMessages.properties</filename> is considered
+ good practice. See <xref linkend="validator-defineconstraints-error" />
+ .</para>
+
+ <programlisting>@ValidatorClass(CapitalizedValidator.class)
+ at Target(METHOD)
+ at Retention(RUNTIME)
+ at Documented
+public @interface Capitalized {
+ CapitalizeType type() default Capitalize.FIRST;
+ String message() default "{validator.capitalized}";
+}
+
+
+#in ValidatorMessages.properties
+validator.capitalized = <literal>Capitalization is not {type}</literal>
+ </programlisting>
+
+ <para>As you can see the {} notation is recursive.</para>
+
+ <para>To link a descriptor to its validator implementation, we use the
+ <literal>@ValidatorClass</literal> meta-annotation. The validator class
+ parameter must name a class which implements
+ <literal>Validator<ConstraintAnnotation></literal> .</para>
+
+ <para>We now have to implement the validator (ie. the rule checking
+ implementation). A validation implementation can check the value of the a
+ property (by implementing <literal>PropertyConstraint</literal> ) and/or
+ can modify the hibernate mapping metadata to express the constraint at the
+ database level (by implementing
+ <literal>PersistentClassConstraint</literal> )</para>
+
+ <programlisting>public class CapitalizedValidator
+ implements Validator<Capitalized>, PropertyConstraint {
+ private CapitalizeType type;
+
+ //part of the Validator<Annotation> contract,
+ //allows to get and use the annotation values
+ public void initialize(Capitalized parameters) {
+ type = parameters.type();
+ }
+
+ //part of the property constraint contract
+ public boolean isValid(Object value) {
+ if (value==null) return true;
+ if ( !(value instanceof String) ) return false;
+ String string = (String) value;
+ if (type == CapitalizeType.ALL) {
+ return string.equals( string.toUpperCase() );
+ }
+ else {
+ String first = string.substring(0,1);
+ return first.equals( first.toUpperCase();
+ }
+ }
+} </programlisting>
+
+ <para>The <literal>isValid()</literal> method should return false if the
+ constraint has been violated. For more examples, refer to the built-in
+ validator implementations.</para>
+
+ <para>We only have seen property level validation, but you can write a
+ Bean level validation annotation. Instead of receiving the return instance
+ of a property, the bean itself will be passed to the validator. To
+ activate the validation checking, just annotated the bean itself instead.
+ A small sample can be found in the unit test suite.</para>
+
+ <para>If your constraint can be applied multiple times (with different
+ parameters) on the same property or type, you can use the following
+ annotation form:</para>
+
+ <programlisting>@Target(METHOD)
+ at Retention(RUNTIME)
+ at Documented
+<emphasis role="bold">public @interface Patterns {</emphasis>
+ Pattern[] value();
+}
+
+ at Target(METHOD)
+ at Retention(RUNTIME)
+ at Documented
+ at ValidatorClass(PatternValidator.class)
+public @interface Pattern {
+ String regexp();
+}</programlisting>
+
+ <para>Basically an annotation containing the value attribute as an array
+ of validator annotations.</para>
+ </section>
+
+ <section>
+ <title>Annotating your domain model</title>
+
+ <para>Since you are already familiar with annotations now, the syntax
+ should be very familiar</para>
+
+ <programlisting>public class Address {
+ private String line1;
+ private String line2;
+ private String zip;
+ private String state;
+ private String country;
+ private long id;
+
+ // a not null string of 20 characters maximum
+ @Length(max=20)
+ @NotNull
+ public String getCountry() {
+ return country;
+ }
+
+ // a non null string
+ @NotNull
+ public String getLine1() {
+ return line1;
+ }
+
+ //no constraint
+ public String getLine2() {
+ return line2;
+ }
+
+ // a not null string of 3 characters maximum
+ @Length(max=3) @NotNull
+ public String getState() {
+ return state;
+ }
+
+ // a not null numeric string of 5 characters maximum
+ // if the string is longer, the message will
+ //be searched in the resource bundle at key 'long'
+ @Length(max=5, message="{long}")
+ @Pattern(regex="[0-9]+")
+ @NotNull
+ public String getZip() {
+ return zip;
+ }
+
+ // should always be true
+ @AssertTrue
+ public boolean isValid() {
+ return true;
+ }
+
+ // a numeric between 1 and 2000
+ @Id @Min(1)
+ @Range(max=2000)
+ public long getId() {
+ return id;
+ }
+} </programlisting>
+
+ <para>While the example only shows public property validation, you can
+ also annotate fields of any kind of visibility</para>
+
+ <programlisting>@MyBeanConstraint(max=45
+public class Dog {
+ @AssertTrue private boolean isMale;
+ @NotNull protected String getName() { ... };
+ ...
+} </programlisting>
+
+ <para>You can also annotate interfaces. Hibernate Validator will check all
+ superclasses and interfaces extended or implemented by a given bean to
+ read the appropriate validator annotations.</para>
+
+ <programlisting>public interface Named {
+ @NotNull String getName();
+ ...
+}
+
+public class Dog implements Named {
+
+ @AssertTrue private boolean isMale;
+
+ public String getName() { ... };
+
+}
+ </programlisting>
+
+ <para>The name property will be checked for nullity when the Dog bean is
+ validated.</para>
+ </section>
+</chapter>
\ No newline at end of file
Copied: trunk/HibernateExt/validator/doc/reference/en/styles (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/styles)
Deleted: trunk/HibernateExt/validator/doc/reference/en/styles/fopdf.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/doc/reference/en/styles/fopdf.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/doc/reference/en/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,519 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL FO configuration file for the Hibernate
- Reference Documentation. It defines a custom titlepage and
- the parameters for the A4 sized PDF printable output.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
-
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- xmlns:fo="http://www.w3.org/1999/XSL/Format"
- exclude-result-prefixes="#default">
-
- <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
-
- <!--###################################################
- Custom Title Page
- ################################################### -->
-
- <xsl:template name="book.titlepage.recto">
- <fo:block>
- <fo:table table-layout="fixed" width="175mm">
- <fo:table-column column-width="175mm"/>
- <fo:table-body>
- <fo:table-row>
- <fo:table-cell text-align="center">
- <fo:block>
- <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/title"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="18pt" padding-before="10mm">
- <xsl:value-of select="bookinfo/subtitle"/>
- </fo:block>
- <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
- Version:
- <xsl:value-of select="bookinfo/releaseinfo"/>
- </fo:block>
- </fo:table-cell>
- </fo:table-row>
- </fo:table-body>
- </fo:table>
- </fo:block>
- </xsl:template>
-
- <!-- Prevent blank pages in output -->
- <xsl:template name="book.titlepage.before.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.verso">
- </xsl:template>
- <xsl:template name="book.titlepage.separator">
- </xsl:template>
-
- <!--###################################################
- Header
- ################################################### -->
-
- <!-- More space in the center header for long text -->
- <xsl:attribute-set name="header.content.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$body.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="margin-left">-5em</xsl:attribute>
- <xsl:attribute name="margin-right">-5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Custom Footer
- ################################################### -->
-
- <!-- This footer prints the Hibernate version number on the left side -->
- <xsl:template name="footer.content">
- <xsl:param name="pageclass" select="''"/>
- <xsl:param name="sequence" select="''"/>
- <xsl:param name="position" select="''"/>
- <xsl:param name="gentext-key" select="''"/>
-
- <xsl:variable name="Version">
- <xsl:choose>
- <xsl:when test="//releaseinfo">
- <xsl:text>Hibernate </xsl:text>
- <xsl:value-of select="//releaseinfo"/>
- </xsl:when>
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:variable>
-
- <xsl:choose>
- <xsl:when test="$sequence='blank'">
- <xsl:choose>
- <xsl:when test="$double.sided != 0 and $position = 'left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position = 'center'">
- <!-- nop -->
- </xsl:when>
-
- <xsl:otherwise>
- <fo:page-number/>
- </xsl:otherwise>
- </xsl:choose>
- </xsl:when>
-
- <xsl:when test="$pageclass='titlepage'">
- <!-- nop: other titlepage sequences have no footer -->
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='right'">
- <fo:page-number/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:when test="$double.sided = 0 and $position='left'">
- <xsl:value-of select="$Version"/>
- </xsl:when>
-
- <xsl:otherwise>
- <!-- nop -->
- </xsl:otherwise>
- </xsl:choose>
- </xsl:template>
-
- <!--###################################################
- Custom Toc Line
- ################################################### -->
-
- <!-- Improve the TOC. -->
- <xsl:template name="toc.line">
- <xsl:variable name="id">
- <xsl:call-template name="object.id"/>
- </xsl:variable>
-
- <xsl:variable name="label">
- <xsl:apply-templates select="." mode="label.markup"/>
- </xsl:variable>
-
- <fo:block text-align-last="justify"
- end-indent="{$toc.indent.width}pt"
- last-line-end-indent="-{$toc.indent.width}pt">
- <fo:inline keep-with-next.within-line="always">
- <fo:basic-link internal-destination="{$id}">
-
- <!-- Chapter titles should be bold. -->
- <xsl:choose>
- <xsl:when test="local-name(.) = 'chapter'">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- </xsl:when>
- </xsl:choose>
-
- <xsl:if test="$label != ''">
- <xsl:copy-of select="$label"/>
- <xsl:value-of select="$autotoc.label.separator"/>
- </xsl:if>
- <xsl:apply-templates select="." mode="titleabbrev.markup"/>
- </fo:basic-link>
- </fo:inline>
- <fo:inline keep-together.within-line="always">
- <xsl:text> </xsl:text>
- <fo:leader leader-pattern="dots"
- leader-pattern-width="3pt"
- leader-alignment="reference-area"
- keep-with-next.within-line="always"/>
- <xsl:text> </xsl:text>
- <fo:basic-link internal-destination="{$id}">
- <fo:page-number-citation ref-id="{$id}"/>
- </fo:basic-link>
- </fo:inline>
- </fo:block>
- </xsl:template>
-
- <!--###################################################
- Extensions
- ################################################### -->
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <!-- FOP provide only PDF Bookmarks at the moment -->
- <xsl:param name="fop.extensions">1</xsl:param>
-
- <!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
- <!-- Dot and Whitespace as separator in TOC between Label and Title-->
- <xsl:param name="autotoc.label.separator" select="'. '"/>
-
-
- <!--###################################################
- Paper & Page Size
- ################################################### -->
-
- <!-- Paper type, no headers on blank pages, no double sided printing -->
- <xsl:param name="paper.type" select="'A4'"/>
- <xsl:param name="double.sided">0</xsl:param>
- <xsl:param name="headers.on.blank.pages">0</xsl:param>
- <xsl:param name="footers.on.blank.pages">0</xsl:param>
-
- <!-- Space between paper border and content (chaotic stuff, don't touch) -->
- <xsl:param name="page.margin.top">5mm</xsl:param>
- <xsl:param name="region.before.extent">10mm</xsl:param>
- <xsl:param name="body.margin.top">10mm</xsl:param>
-
- <xsl:param name="body.margin.bottom">15mm</xsl:param>
- <xsl:param name="region.after.extent">10mm</xsl:param>
- <xsl:param name="page.margin.bottom">0mm</xsl:param>
-
- <xsl:param name="page.margin.outer">18mm</xsl:param>
- <xsl:param name="page.margin.inner">18mm</xsl:param>
-
- <!-- No intendation of Titles -->
- <xsl:param name="title.margin.left">0pc</xsl:param>
-
- <!--###################################################
- Fonts & Styles
- ################################################### -->
-
- <!-- Default Font size -->
- <xsl:param name="body.font.master">11</xsl:param>
-
- <!-- Line height in body text -->
- <xsl:param name="line-height">1.4</xsl:param>
-
- <!-- Monospaced fonts are smaller than regular text -->
- <xsl:attribute-set name="monospace.properties">
- <xsl:attribute name="font-family">
- <xsl:value-of select="$monospace.font.family"/>
- </xsl:attribute>
- <xsl:attribute name="font-size">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Tables
- ################################################### -->
-
- <!-- The table width should be adapted to the paper size -->
- <xsl:param name="default.table.width">17.4cm</xsl:param>
-
- <!-- Some padding inside tables -->
- <xsl:attribute-set name="table.cell.padding">
- <xsl:attribute name="padding-left">4pt</xsl:attribute>
- <xsl:attribute name="padding-right">4pt</xsl:attribute>
- <xsl:attribute name="padding-top">4pt</xsl:attribute>
- <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Only hairlines as frame and cell borders in tables -->
- <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
- <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
-
- <!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
- <!-- Label only Sections up to level 2 -->
- <xsl:param name="local.l10n.xml" select="document('')"/>
- <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
- <l:l10n language="en">
- <l:context name="title-numbered">
- <l:template name="sect3" text="%t"/>
- <l:template name="sect4" text="%t"/>
- <l:template name="sect5" text="%t"/>
- </l:context>
- <l:context name="section-xref-numbered">
- <l:template name="sect3" text="the section called %t"/>
- <l:template name="sect4" text="the section called %t"/>
- <l:template name="sect5" text="the section called %t"/>
- </l:context>
- </l:l10n>
- </l:i18n>
-
- <!--###################################################
- Titles
- ################################################### -->
-
- <!-- Chapter title size -->
- <xsl:attribute-set name="chapter.titlepage.recto.style">
- <xsl:attribute name="text-align">left</xsl:attribute>
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.8"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
- Let's remove it, so this sucker can use our attribute-set only... -->
- <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
- <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
- xsl:use-attribute-sets="chapter.titlepage.recto.style">
- <xsl:call-template name="component.title">
- <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
- </xsl:call-template>
- </fo:block>
- </xsl:template>
-
- <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
- <xsl:attribute-set name="section.title.level1.properties">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.5"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level2.properties">
- <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.25"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
- <xsl:attribute-set name="section.title.level3.properties">
- <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master * 1.0"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Titles of formal objects (tables, examples, ...) -->
- <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
- <xsl:attribute name="font-weight">bold</xsl:attribute>
- <xsl:attribute name="font-size">
- <xsl:value-of select="$body.font.master"/>
- <xsl:text>pt</xsl:text>
- </xsl:attribute>
- <xsl:attribute name="hyphenate">false</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Programlistings
- ################################################### -->
-
- <!-- Verbatim text formatting (programlistings) -->
- <xsl:attribute-set name="verbatim.properties">
- <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- <xsl:attribute name="border-color">#444444</xsl:attribute>
- <xsl:attribute name="border-style">solid</xsl:attribute>
- <xsl:attribute name="border-width">0.1pt</xsl:attribute>
- <xsl:attribute name="padding-top">0.5em</xsl:attribute>
- <xsl:attribute name="padding-left">0.5em</xsl:attribute>
- <xsl:attribute name="padding-right">0.5em</xsl:attribute>
- <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
- <xsl:attribute name="margin-left">0.5em</xsl:attribute>
- <xsl:attribute name="margin-right">0.5em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Shade (background) programlistings -->
- <xsl:param name="shade.verbatim">1</xsl:param>
- <xsl:attribute-set name="shade.verbatim.style">
- <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
- </xsl:attribute-set>
-
- <!--###################################################
- Callouts
- ################################################### -->
-
- <!-- We want to use callouts... -->
- <xsl:param name="callout.extensions">1</xsl:param>
-
- <!-- Place callout bullets at this column in programmlisting.-->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
- <!--
- No, don't use crappy graphics for the callout bullets. This setting
- enables some weird Unicode rendering for some fancy bullet points
- in callouts. By default, this can only count to 10 and produces
- strange results if you ever have more than 10 callouts for one
- programlisting. We will fix that next.
- -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!--
- Again, fun with DocBook XSL: The callout bullets are rendered in
- two places: In the programlisting itself and in the list below
- the listing, with the actual callout text. The rendering in the
- programlisting is some XSL transformer extension (e.g. a Saxon
- extension), so we can't change that without messing with the
- extensions. We only can turn it off by setting this limit to
- zero, then, a simple bracket style like "(3)" and "(4)" will
- be used in the programlisting.
- -->
- <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
-
- <!--
- The callout bullets in the actual callout list will be rendered
- with an XSL FO template. The default template is broken: limited to 10
- nice looking Unicode bullet points and then it doesn't print anything,
- the fallback doesn't work. We implement our own template, which is not
- as complicated, more ugly, but works. As always, function is more
- important than form.
- -->
- <xsl:template name="callout-bug">
- <xsl:param name="conum" select='1'/>
- <fo:inline
- color="black"
- padding-top="0.1em"
- padding-bottom="0.1em"
- padding-start="0.2em"
- padding-end="0.2em"
- baseline-shift="0.1em"
- font-family="{$monospace.font.family}"
- font-weight="bold"
- font-size="75%">
- <xsl:text>(</xsl:text>
- <xsl:value-of select="$conum"/>
- <xsl:text>)</xsl:text>
- </fo:inline>
-
- </xsl:template>
-
- <!--###################################################
- Misc
- ################################################### -->
-
- <!-- Correct placement of titles for figures and examples. -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
- <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
- <xsl:param name="variablelist.as.blocks">1</xsl:param>
-
- <!-- The horrible list spacing problems, this is much better. -->
- <xsl:attribute-set name="list.block.spacing">
- <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
- <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
- <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
- <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
- </xsl:attribute-set>
-
- <!-- Newer DocBook XSL apparently thinks that some sections are by
- default "draft" status, and this idiotic thing is by default
- also set to "maybe", so it spits out a lot of errors with the
- latest FOP as the XSL/FO styles have references to some draft
- watermarks, which you actually don't want in the first place.
- Turn this crap off. If you have to work with the "status"
- attribute, don't.
- -->
- <xsl:param name="draft.mode" select="'no'"/>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/validator/doc/reference/en/styles/fopdf.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/styles/fopdf.xsl)
===================================================================
--- trunk/HibernateExt/validator/doc/reference/en/styles/fopdf.xsl (rev 0)
+++ trunk/HibernateExt/validator/doc/reference/en/styles/fopdf.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,519 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL FO configuration file for the Hibernate
+ Reference Documentation. It defines a custom titlepage and
+ the parameters for the A4 sized PDF printable output.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ exclude-result-prefixes="#default">
+
+ <xsl:import href="&db_xsl_path;/fo/docbook.xsl"/>
+
+ <!--###################################################
+ Custom Title Page
+ ################################################### -->
+
+ <xsl:template name="book.titlepage.recto">
+ <fo:block>
+ <fo:table table-layout="fixed" width="175mm">
+ <fo:table-column column-width="175mm"/>
+ <fo:table-body>
+ <fo:table-row>
+ <fo:table-cell text-align="center">
+ <fo:block>
+ <fo:external-graphic src="file:images/hibernate_logo_a.png"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="22pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/title"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="18pt" padding-before="10mm">
+ <xsl:value-of select="bookinfo/subtitle"/>
+ </fo:block>
+ <fo:block font-family="Helvetica" font-size="12pt" padding="10mm">
+ Version:
+ <xsl:value-of select="bookinfo/releaseinfo"/>
+ </fo:block>
+ </fo:table-cell>
+ </fo:table-row>
+ </fo:table-body>
+ </fo:table>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Prevent blank pages in output -->
+ <xsl:template name="book.titlepage.before.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.verso">
+ </xsl:template>
+ <xsl:template name="book.titlepage.separator">
+ </xsl:template>
+
+ <!--###################################################
+ Header
+ ################################################### -->
+
+ <!-- More space in the center header for long text -->
+ <xsl:attribute-set name="header.content.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$body.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="margin-left">-5em</xsl:attribute>
+ <xsl:attribute name="margin-right">-5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Custom Footer
+ ################################################### -->
+
+ <!-- This footer prints the Hibernate version number on the left side -->
+ <xsl:template name="footer.content">
+ <xsl:param name="pageclass" select="''"/>
+ <xsl:param name="sequence" select="''"/>
+ <xsl:param name="position" select="''"/>
+ <xsl:param name="gentext-key" select="''"/>
+
+ <xsl:variable name="Version">
+ <xsl:choose>
+ <xsl:when test="//releaseinfo">
+ <xsl:text>Hibernate </xsl:text>
+ <xsl:value-of select="//releaseinfo"/>
+ </xsl:when>
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:variable>
+
+ <xsl:choose>
+ <xsl:when test="$sequence='blank'">
+ <xsl:choose>
+ <xsl:when test="$double.sided != 0 and $position = 'left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position = 'center'">
+ <!-- nop -->
+ </xsl:when>
+
+ <xsl:otherwise>
+ <fo:page-number/>
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:when>
+
+ <xsl:when test="$pageclass='titlepage'">
+ <!-- nop: other titlepage sequences have no footer -->
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='left'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='right'">
+ <fo:page-number/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'odd' and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided != 0 and $sequence = 'even' and $position='right'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:when test="$double.sided = 0 and $position='left'">
+ <xsl:value-of select="$Version"/>
+ </xsl:when>
+
+ <xsl:otherwise>
+ <!-- nop -->
+ </xsl:otherwise>
+ </xsl:choose>
+ </xsl:template>
+
+ <!--###################################################
+ Custom Toc Line
+ ################################################### -->
+
+ <!-- Improve the TOC. -->
+ <xsl:template name="toc.line">
+ <xsl:variable name="id">
+ <xsl:call-template name="object.id"/>
+ </xsl:variable>
+
+ <xsl:variable name="label">
+ <xsl:apply-templates select="." mode="label.markup"/>
+ </xsl:variable>
+
+ <fo:block text-align-last="justify"
+ end-indent="{$toc.indent.width}pt"
+ last-line-end-indent="-{$toc.indent.width}pt">
+ <fo:inline keep-with-next.within-line="always">
+ <fo:basic-link internal-destination="{$id}">
+
+ <!-- Chapter titles should be bold. -->
+ <xsl:choose>
+ <xsl:when test="local-name(.) = 'chapter'">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ </xsl:when>
+ </xsl:choose>
+
+ <xsl:if test="$label != ''">
+ <xsl:copy-of select="$label"/>
+ <xsl:value-of select="$autotoc.label.separator"/>
+ </xsl:if>
+ <xsl:apply-templates select="." mode="titleabbrev.markup"/>
+ </fo:basic-link>
+ </fo:inline>
+ <fo:inline keep-together.within-line="always">
+ <xsl:text> </xsl:text>
+ <fo:leader leader-pattern="dots"
+ leader-pattern-width="3pt"
+ leader-alignment="reference-area"
+ keep-with-next.within-line="always"/>
+ <xsl:text> </xsl:text>
+ <fo:basic-link internal-destination="{$id}">
+ <fo:page-number-citation ref-id="{$id}"/>
+ </fo:basic-link>
+ </fo:inline>
+ </fo:block>
+ </xsl:template>
+
+ <!--###################################################
+ Extensions
+ ################################################### -->
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <!-- FOP provide only PDF Bookmarks at the moment -->
+ <xsl:param name="fop.extensions">1</xsl:param>
+
+ <!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+ <!-- Dot and Whitespace as separator in TOC between Label and Title-->
+ <xsl:param name="autotoc.label.separator" select="'. '"/>
+
+
+ <!--###################################################
+ Paper & Page Size
+ ################################################### -->
+
+ <!-- Paper type, no headers on blank pages, no double sided printing -->
+ <xsl:param name="paper.type" select="'A4'"/>
+ <xsl:param name="double.sided">0</xsl:param>
+ <xsl:param name="headers.on.blank.pages">0</xsl:param>
+ <xsl:param name="footers.on.blank.pages">0</xsl:param>
+
+ <!-- Space between paper border and content (chaotic stuff, don't touch) -->
+ <xsl:param name="page.margin.top">5mm</xsl:param>
+ <xsl:param name="region.before.extent">10mm</xsl:param>
+ <xsl:param name="body.margin.top">10mm</xsl:param>
+
+ <xsl:param name="body.margin.bottom">15mm</xsl:param>
+ <xsl:param name="region.after.extent">10mm</xsl:param>
+ <xsl:param name="page.margin.bottom">0mm</xsl:param>
+
+ <xsl:param name="page.margin.outer">18mm</xsl:param>
+ <xsl:param name="page.margin.inner">18mm</xsl:param>
+
+ <!-- No intendation of Titles -->
+ <xsl:param name="title.margin.left">0pc</xsl:param>
+
+ <!--###################################################
+ Fonts & Styles
+ ################################################### -->
+
+ <!-- Default Font size -->
+ <xsl:param name="body.font.master">11</xsl:param>
+
+ <!-- Line height in body text -->
+ <xsl:param name="line-height">1.4</xsl:param>
+
+ <!-- Monospaced fonts are smaller than regular text -->
+ <xsl:attribute-set name="monospace.properties">
+ <xsl:attribute name="font-family">
+ <xsl:value-of select="$monospace.font.family"/>
+ </xsl:attribute>
+ <xsl:attribute name="font-size">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Tables
+ ################################################### -->
+
+ <!-- The table width should be adapted to the paper size -->
+ <xsl:param name="default.table.width">17.4cm</xsl:param>
+
+ <!-- Some padding inside tables -->
+ <xsl:attribute-set name="table.cell.padding">
+ <xsl:attribute name="padding-left">4pt</xsl:attribute>
+ <xsl:attribute name="padding-right">4pt</xsl:attribute>
+ <xsl:attribute name="padding-top">4pt</xsl:attribute>
+ <xsl:attribute name="padding-bottom">4pt</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Only hairlines as frame and cell borders in tables -->
+ <xsl:param name="table.frame.border.thickness">0.1pt</xsl:param>
+ <xsl:param name="table.cell.border.thickness">0.1pt</xsl:param>
+
+ <!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+ <!-- Label only Sections up to level 2 -->
+ <xsl:param name="local.l10n.xml" select="document('')"/>
+ <l:i18n xmlns:l="http://docbook.sourceforge.net/xmlns/l10n/1.0">
+ <l:l10n language="en">
+ <l:context name="title-numbered">
+ <l:template name="sect3" text="%t"/>
+ <l:template name="sect4" text="%t"/>
+ <l:template name="sect5" text="%t"/>
+ </l:context>
+ <l:context name="section-xref-numbered">
+ <l:template name="sect3" text="the section called %t"/>
+ <l:template name="sect4" text="the section called %t"/>
+ <l:template name="sect5" text="the section called %t"/>
+ </l:context>
+ </l:l10n>
+ </l:i18n>
+
+ <!--###################################################
+ Titles
+ ################################################### -->
+
+ <!-- Chapter title size -->
+ <xsl:attribute-set name="chapter.titlepage.recto.style">
+ <xsl:attribute name="text-align">left</xsl:attribute>
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.8"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Why is the font-size for chapters hardcoded in the XSL FO templates?
+ Let's remove it, so this sucker can use our attribute-set only... -->
+ <xsl:template match="title" mode="chapter.titlepage.recto.auto.mode">
+ <fo:block xmlns:fo="http://www.w3.org/1999/XSL/Format"
+ xsl:use-attribute-sets="chapter.titlepage.recto.style">
+ <xsl:call-template name="component.title">
+ <xsl:with-param name="node" select="ancestor-or-self::chapter[1]"/>
+ </xsl:call-template>
+ </fo:block>
+ </xsl:template>
+
+ <!-- Sections 1, 2 and 3 titles have a small bump factor and padding -->
+ <xsl:attribute-set name="section.title.level1.properties">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.5"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level2.properties">
+ <xsl:attribute name="space-before.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.6em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.25"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+ <xsl:attribute-set name="section.title.level3.properties">
+ <xsl:attribute name="space-before.optimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.4em</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master * 1.0"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Titles of formal objects (tables, examples, ...) -->
+ <xsl:attribute-set name="formal.title.properties" use-attribute-sets="normal.para.spacing">
+ <xsl:attribute name="font-weight">bold</xsl:attribute>
+ <xsl:attribute name="font-size">
+ <xsl:value-of select="$body.font.master"/>
+ <xsl:text>pt</xsl:text>
+ </xsl:attribute>
+ <xsl:attribute name="hyphenate">false</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.4em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.6em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.8em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Programlistings
+ ################################################### -->
+
+ <!-- Verbatim text formatting (programlistings) -->
+ <xsl:attribute-set name="verbatim.properties">
+ <xsl:attribute name="space-before.minimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.optimum">1em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ <xsl:attribute name="border-color">#444444</xsl:attribute>
+ <xsl:attribute name="border-style">solid</xsl:attribute>
+ <xsl:attribute name="border-width">0.1pt</xsl:attribute>
+ <xsl:attribute name="padding-top">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-left">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-right">0.5em</xsl:attribute>
+ <xsl:attribute name="padding-bottom">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-left">0.5em</xsl:attribute>
+ <xsl:attribute name="margin-right">0.5em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Shade (background) programlistings -->
+ <xsl:param name="shade.verbatim">1</xsl:param>
+ <xsl:attribute-set name="shade.verbatim.style">
+ <xsl:attribute name="background-color">#F0F0F0</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- We want to use callouts... -->
+ <xsl:param name="callout.extensions">1</xsl:param>
+
+ <!-- Place callout bullets at this column in programmlisting.-->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+ <!--
+ No, don't use crappy graphics for the callout bullets. This setting
+ enables some weird Unicode rendering for some fancy bullet points
+ in callouts. By default, this can only count to 10 and produces
+ strange results if you ever have more than 10 callouts for one
+ programlisting. We will fix that next.
+ -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!--
+ Again, fun with DocBook XSL: The callout bullets are rendered in
+ two places: In the programlisting itself and in the list below
+ the listing, with the actual callout text. The rendering in the
+ programlisting is some XSL transformer extension (e.g. a Saxon
+ extension), so we can't change that without messing with the
+ extensions. We only can turn it off by setting this limit to
+ zero, then, a simple bracket style like "(3)" and "(4)" will
+ be used in the programlisting.
+ -->
+ <xsl:param name="callout.unicode.number.limit" select="'0'"></xsl:param>
+
+ <!--
+ The callout bullets in the actual callout list will be rendered
+ with an XSL FO template. The default template is broken: limited to 10
+ nice looking Unicode bullet points and then it doesn't print anything,
+ the fallback doesn't work. We implement our own template, which is not
+ as complicated, more ugly, but works. As always, function is more
+ important than form.
+ -->
+ <xsl:template name="callout-bug">
+ <xsl:param name="conum" select='1'/>
+ <fo:inline
+ color="black"
+ padding-top="0.1em"
+ padding-bottom="0.1em"
+ padding-start="0.2em"
+ padding-end="0.2em"
+ baseline-shift="0.1em"
+ font-family="{$monospace.font.family}"
+ font-weight="bold"
+ font-size="75%">
+ <xsl:text>(</xsl:text>
+ <xsl:value-of select="$conum"/>
+ <xsl:text>)</xsl:text>
+ </fo:inline>
+
+ </xsl:template>
+
+ <!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Correct placement of titles for figures and examples. -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+ <!-- Format Variable Lists as Blocks (prevents horizontal overflow). -->
+ <xsl:param name="variablelist.as.blocks">1</xsl:param>
+
+ <!-- The horrible list spacing problems, this is much better. -->
+ <xsl:attribute-set name="list.block.spacing">
+ <xsl:attribute name="space-before.optimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.minimum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-before.maximum">0.8em</xsl:attribute>
+ <xsl:attribute name="space-after.optimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.minimum">0.1em</xsl:attribute>
+ <xsl:attribute name="space-after.maximum">0.1em</xsl:attribute>
+ </xsl:attribute-set>
+
+ <!-- Newer DocBook XSL apparently thinks that some sections are by
+ default "draft" status, and this idiotic thing is by default
+ also set to "maybe", so it spits out a lot of errors with the
+ latest FOP as the XSL/FO styles have references to some draft
+ watermarks, which you actually don't want in the first place.
+ Turn this crap off. If you have to work with the "status"
+ attribute, don't.
+ -->
+ <xsl:param name="draft.mode" select="'no'"/>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/validator/doc/reference/en/styles/html.css
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/doc/reference/en/styles/html.css 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/doc/reference/en/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,97 +0,0 @@
-A {
- color: #003399;
-}
-
-A:active {
- color: #003399;
-}
-
-A:visited {
- color: #888888;
-}
-
-P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
- color: #000000;
-}
-
-TD, TH, SPAN {
- color: #000000;
-}
-
-BLOCKQUOTE {
- margin-right: 0px;
-}
-
-
-H1, H2, H3, H4, H5, H6 {
- color: #000000;
- font-weight:500;
- margin-top:10px;
- padding-top:15px;
-}
-
-TABLE {
- border-collapse: collapse;
- border-spacing:0;
- border: 1px thin black;
- empty-cells: hide;
-}
-
-TD {
- padding: 4pt;
-}
-
-H1 { font-size: 150%; }
-H2 { font-size: 140%; }
-H3 { font-size: 110%; font-weight: bold; }
-H4 { font-size: 110%; font-weight: bold;}
-H5 { font-size: 100%; font-style: italic; }
-H6 { font-size: 100%; font-style: italic; }
-
-TT {
-font-size: 90%;
- font-family: "Courier New", Courier, monospace;
- color: #000000;
-}
-
-PRE {
-font-size: 100%;
- padding: 5px;
- border-style: solid;
- border-width: 1px;
- border-color: #CCCCCC;
- background-color: #F4F4F4;
-}
-
-UL, OL, LI {
- list-style: disc;
-}
-
-HR {
- width: 100%;
- height: 1px;
- background-color: #CCCCCC;
- border-width: 0px;
- padding: 0px;
- color: #CCCCCC;
-}
-
-.variablelist {
- padding-top: 10;
- padding-bottom:10;
- margin:0;
-}
-
-.itemizedlist, UL {
- padding-top: 0;
- padding-bottom:0;
- margin:0;
-}
-
-.term {
- font-weight:bold;
-}
-
-
-
-
Copied: trunk/HibernateExt/validator/doc/reference/en/styles/html.css (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/styles/html.css)
===================================================================
--- trunk/HibernateExt/validator/doc/reference/en/styles/html.css (rev 0)
+++ trunk/HibernateExt/validator/doc/reference/en/styles/html.css 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,97 @@
+A {
+ color: #003399;
+}
+
+A:active {
+ color: #003399;
+}
+
+A:visited {
+ color: #888888;
+}
+
+P, OL, UL, LI, DL, DT, DD, BLOCKQUOTE {
+ color: #000000;
+}
+
+TD, TH, SPAN {
+ color: #000000;
+}
+
+BLOCKQUOTE {
+ margin-right: 0px;
+}
+
+
+H1, H2, H3, H4, H5, H6 {
+ color: #000000;
+ font-weight:500;
+ margin-top:10px;
+ padding-top:15px;
+}
+
+TABLE {
+ border-collapse: collapse;
+ border-spacing:0;
+ border: 1px thin black;
+ empty-cells: hide;
+}
+
+TD {
+ padding: 4pt;
+}
+
+H1 { font-size: 150%; }
+H2 { font-size: 140%; }
+H3 { font-size: 110%; font-weight: bold; }
+H4 { font-size: 110%; font-weight: bold;}
+H5 { font-size: 100%; font-style: italic; }
+H6 { font-size: 100%; font-style: italic; }
+
+TT {
+font-size: 90%;
+ font-family: "Courier New", Courier, monospace;
+ color: #000000;
+}
+
+PRE {
+font-size: 100%;
+ padding: 5px;
+ border-style: solid;
+ border-width: 1px;
+ border-color: #CCCCCC;
+ background-color: #F4F4F4;
+}
+
+UL, OL, LI {
+ list-style: disc;
+}
+
+HR {
+ width: 100%;
+ height: 1px;
+ background-color: #CCCCCC;
+ border-width: 0px;
+ padding: 0px;
+ color: #CCCCCC;
+}
+
+.variablelist {
+ padding-top: 10;
+ padding-bottom:10;
+ margin:0;
+}
+
+.itemizedlist, UL {
+ padding-top: 0;
+ padding-bottom:0;
+ margin:0;
+}
+
+.term {
+ font-weight:bold;
+}
+
+
+
+
Deleted: trunk/HibernateExt/validator/doc/reference/en/styles/html.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/doc/reference/en/styles/html.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/doc/reference/en/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,84 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/validator/doc/reference/en/styles/html.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/styles/html.xsl)
===================================================================
--- trunk/HibernateExt/validator/doc/reference/en/styles/html.xsl (rev 0)
+++ trunk/HibernateExt/validator/doc/reference/en/styles/html.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,84 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/docbook.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Deleted: trunk/HibernateExt/validator/doc/reference/en/styles/html_chunk.xsl
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/doc/reference/en/styles/html_chunk.xsl 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/doc/reference/en/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,86 +0,0 @@
-<?xml version="1.0"?>
-
-<!--
-
- This is the XSL HTML configuration file for the Hibernate
- Reference Documentation.
-
- It took me days to figure out this stuff and fix most of
- the obvious bugs in the DocBook XSL distribution. Some of
- the workarounds might not be appropriate with a newer version
- of DocBook XSL. This file is released as part of Hibernate,
- hence LGPL licensed.
-
- christian at hibernate.org
--->
-
-<!DOCTYPE xsl:stylesheet [
- <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
-]>
-
-<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
- version="1.0"
- xmlns="http://www.w3.org/TR/xhtml1/transitional"
- exclude-result-prefixes="#default">
-
-<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
-
-<!--###################################################
- HTML Settings
- ################################################### -->
-
- <xsl:param name="chunk.section.depth">'5'</xsl:param>
- <xsl:param name="use.id.as.filename">'1'</xsl:param>
- <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
-
- <!-- These extensions are required for table printing and other stuff -->
- <xsl:param name="use.extensions">1</xsl:param>
- <xsl:param name="tablecolumns.extension">0</xsl:param>
- <xsl:param name="callout.extensions">1</xsl:param>
- <xsl:param name="graphicsize.extension">0</xsl:param>
-
-<!--###################################################
- Table Of Contents
- ################################################### -->
-
- <!-- Generate the TOCs for named components only -->
- <xsl:param name="generate.toc">
- book toc
- </xsl:param>
-
- <!-- Show only Sections up to level 3 in the TOCs -->
- <xsl:param name="toc.section.depth">3</xsl:param>
-
-<!--###################################################
- Labels
- ################################################### -->
-
- <!-- Label Chapters and Sections (numbering) -->
- <xsl:param name="chapter.autolabel">1</xsl:param>
- <xsl:param name="section.autolabel" select="1"/>
- <xsl:param name="section.label.includes.component.label" select="1"/>
-
-<!--###################################################
- Callouts
- ################################################### -->
-
- <!-- Don't use graphics, use a simple number style -->
- <xsl:param name="callout.graphics">0</xsl:param>
-
- <!-- Place callout marks at this column in annotated areas -->
- <xsl:param name="callout.defaultcolumn">90</xsl:param>
-
-<!--###################################################
- Misc
- ################################################### -->
-
- <!-- Placement of titles -->
- <xsl:param name="formal.title.placement">
- figure after
- example before
- equation before
- table before
- procedure before
- </xsl:param>
-
-</xsl:stylesheet>
Copied: trunk/HibernateExt/validator/doc/reference/en/styles/html_chunk.xsl (from rev 11279, branches/Branch_3_2/HibernateExt/validator/doc/reference/en/styles/html_chunk.xsl)
===================================================================
--- trunk/HibernateExt/validator/doc/reference/en/styles/html_chunk.xsl (rev 0)
+++ trunk/HibernateExt/validator/doc/reference/en/styles/html_chunk.xsl 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,86 @@
+<?xml version="1.0"?>
+
+<!--
+
+ This is the XSL HTML configuration file for the Hibernate
+ Reference Documentation.
+
+ It took me days to figure out this stuff and fix most of
+ the obvious bugs in the DocBook XSL distribution. Some of
+ the workarounds might not be appropriate with a newer version
+ of DocBook XSL. This file is released as part of Hibernate,
+ hence LGPL licensed.
+
+ christian at hibernate.org
+-->
+
+<!DOCTYPE xsl:stylesheet [
+ <!ENTITY db_xsl_path "../../../../../../Hibernate3/doc/reference/support/docbook-xsl/">
+]>
+
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
+ version="1.0"
+ xmlns="http://www.w3.org/TR/xhtml1/transitional"
+ exclude-result-prefixes="#default">
+
+<xsl:import href="&db_xsl_path;/html/chunk.xsl"/>
+
+<!--###################################################
+ HTML Settings
+ ################################################### -->
+
+ <xsl:param name="chunk.section.depth">'5'</xsl:param>
+ <xsl:param name="use.id.as.filename">'1'</xsl:param>
+ <xsl:param name="html.stylesheet">../shared/css/html.css</xsl:param>
+
+ <!-- These extensions are required for table printing and other stuff -->
+ <xsl:param name="use.extensions">1</xsl:param>
+ <xsl:param name="tablecolumns.extension">0</xsl:param>
+ <xsl:param name="callout.extensions">1</xsl:param>
+ <xsl:param name="graphicsize.extension">0</xsl:param>
+
+<!--###################################################
+ Table Of Contents
+ ################################################### -->
+
+ <!-- Generate the TOCs for named components only -->
+ <xsl:param name="generate.toc">
+ book toc
+ </xsl:param>
+
+ <!-- Show only Sections up to level 3 in the TOCs -->
+ <xsl:param name="toc.section.depth">3</xsl:param>
+
+<!--###################################################
+ Labels
+ ################################################### -->
+
+ <!-- Label Chapters and Sections (numbering) -->
+ <xsl:param name="chapter.autolabel">1</xsl:param>
+ <xsl:param name="section.autolabel" select="1"/>
+ <xsl:param name="section.label.includes.component.label" select="1"/>
+
+<!--###################################################
+ Callouts
+ ################################################### -->
+
+ <!-- Don't use graphics, use a simple number style -->
+ <xsl:param name="callout.graphics">0</xsl:param>
+
+ <!-- Place callout marks at this column in annotated areas -->
+ <xsl:param name="callout.defaultcolumn">90</xsl:param>
+
+<!--###################################################
+ Misc
+ ################################################### -->
+
+ <!-- Placement of titles -->
+ <xsl:param name="formal.title.placement">
+ figure after
+ example before
+ equation before
+ table before
+ procedure before
+ </xsl:param>
+
+</xsl:stylesheet>
Copied: trunk/HibernateExt/validator/jdbc (from rev 11279, branches/Branch_3_2/HibernateExt/validator/jdbc)
Deleted: trunk/HibernateExt/validator/jdbc/hsqldb.jar
===================================================================
(Binary files differ)
Copied: trunk/HibernateExt/validator/jdbc/hsqldb.jar (from rev 11279, branches/Branch_3_2/HibernateExt/validator/jdbc/hsqldb.jar)
===================================================================
(Binary files differ)
Deleted: trunk/HibernateExt/validator/lgpl.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/lgpl.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/lgpl.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,504 +0,0 @@
- GNU LESSER GENERAL PUBLIC LICENSE
- Version 2.1, February 1999
-
- Copyright (C) 1991, 1999 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
-[This is the first released version of the Lesser GPL. It also counts
- as the successor of the GNU Library Public License, version 2, hence
- the version number 2.1.]
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-Licenses are intended to guarantee your freedom to share and change
-free software--to make sure the software is free for all its users.
-
- This license, the Lesser General Public License, applies to some
-specially designated software packages--typically libraries--of the
-Free Software Foundation and other authors who decide to use it. You
-can use it too, but we suggest you first think carefully about whether
-this license or the ordinary General Public License is the better
-strategy to use in any particular case, based on the explanations below.
-
- When we speak of free software, we are referring to freedom of use,
-not price. Our General Public Licenses are designed to make sure that
-you have the freedom to distribute copies of free software (and charge
-for this service if you wish); that you receive source code or can get
-it if you want it; that you can change the software and use pieces of
-it in new free programs; and that you are informed that you can do
-these things.
-
- To protect your rights, we need to make restrictions that forbid
-distributors to deny you these rights or to ask you to surrender these
-rights. These restrictions translate to certain responsibilities for
-you if you distribute copies of the library or if you modify it.
-
- For example, if you distribute copies of the library, whether gratis
-or for a fee, you must give the recipients all the rights that we gave
-you. You must make sure that they, too, receive or can get the source
-code. If you link other code with the library, you must provide
-complete object files to the recipients, so that they can relink them
-with the library after making changes to the library and recompiling
-it. And you must show them these terms so they know their rights.
-
- We protect your rights with a two-step method: (1) we copyright the
-library, and (2) we offer you this license, which gives you legal
-permission to copy, distribute and/or modify the library.
-
- To protect each distributor, we want to make it very clear that
-there is no warranty for the free library. Also, if the library is
-modified by someone else and passed on, the recipients should know
-that what they have is not the original version, so that the original
-author's reputation will not be affected by problems that might be
-introduced by others.
-
- Finally, software patents pose a constant threat to the existence of
-any free program. We wish to make sure that a company cannot
-effectively restrict the users of a free program by obtaining a
-restrictive license from a patent holder. Therefore, we insist that
-any patent license obtained for a version of the library must be
-consistent with the full freedom of use specified in this license.
-
- Most GNU software, including some libraries, is covered by the
-ordinary GNU General Public License. This license, the GNU Lesser
-General Public License, applies to certain designated libraries, and
-is quite different from the ordinary General Public License. We use
-this license for certain libraries in order to permit linking those
-libraries into non-free programs.
-
- When a program is linked with a library, whether statically or using
-a shared library, the combination of the two is legally speaking a
-combined work, a derivative of the original library. The ordinary
-General Public License therefore permits such linking only if the
-entire combination fits its criteria of freedom. The Lesser General
-Public License permits more lax criteria for linking other code with
-the library.
-
- We call this license the "Lesser" General Public License because it
-does Less to protect the user's freedom than the ordinary General
-Public License. It also provides other free software developers Less
-of an advantage over competing non-free programs. These disadvantages
-are the reason we use the ordinary General Public License for many
-libraries. However, the Lesser license provides advantages in certain
-special circumstances.
-
- For example, on rare occasions, there may be a special need to
-encourage the widest possible use of a certain library, so that it becomes
-a de-facto standard. To achieve this, non-free programs must be
-allowed to use the library. A more frequent case is that a free
-library does the same job as widely used non-free libraries. In this
-case, there is little to gain by limiting the free library to free
-software only, so we use the Lesser General Public License.
-
- In other cases, permission to use a particular library in non-free
-programs enables a greater number of people to use a large body of
-free software. For example, permission to use the GNU C Library in
-non-free programs enables many more people to use the whole GNU
-operating system, as well as its variant, the GNU/Linux operating
-system.
-
- Although the Lesser General Public License is Less protective of the
-users' freedom, it does ensure that the user of a program that is
-linked with the Library has the freedom and the wherewithal to run
-that program using a modified version of the Library.
-
- The precise terms and conditions for copying, distribution and
-modification follow. Pay close attention to the difference between a
-"work based on the library" and a "work that uses the library". The
-former contains code derived from the library, whereas the latter must
-be combined with the library in order to run.
-
- GNU LESSER GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License Agreement applies to any software library or other
-program which contains a notice placed by the copyright holder or
-other authorized party saying it may be distributed under the terms of
-this Lesser General Public License (also called "this License").
-Each licensee is addressed as "you".
-
- A "library" means a collection of software functions and/or data
-prepared so as to be conveniently linked with application programs
-(which use some of those functions and data) to form executables.
-
- The "Library", below, refers to any such software library or work
-which has been distributed under these terms. A "work based on the
-Library" means either the Library or any derivative work under
-copyright law: that is to say, a work containing the Library or a
-portion of it, either verbatim or with modifications and/or translated
-straightforwardly into another language. (Hereinafter, translation is
-included without limitation in the term "modification".)
-
- "Source code" for a work means the preferred form of the work for
-making modifications to it. For a library, complete source code means
-all the source code for all modules it contains, plus any associated
-interface definition files, plus the scripts used to control compilation
-and installation of the library.
-
- Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running a program using the Library is not restricted, and output from
-such a program is covered only if its contents constitute a work based
-on the Library (independent of the use of the Library in a tool for
-writing it). Whether that is true depends on what the Library does
-and what the program that uses the Library does.
-
- 1. You may copy and distribute verbatim copies of the Library's
-complete source code as you receive it, in any medium, provided that
-you conspicuously and appropriately publish on each copy an
-appropriate copyright notice and disclaimer of warranty; keep intact
-all the notices that refer to this License and to the absence of any
-warranty; and distribute a copy of this License along with the
-Library.
-
- You may charge a fee for the physical act of transferring a copy,
-and you may at your option offer warranty protection in exchange for a
-fee.
-
- 2. You may modify your copy or copies of the Library or any portion
-of it, thus forming a work based on the Library, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) The modified work must itself be a software library.
-
- b) You must cause the files modified to carry prominent notices
- stating that you changed the files and the date of any change.
-
- c) You must cause the whole of the work to be licensed at no
- charge to all third parties under the terms of this License.
-
- d) If a facility in the modified Library refers to a function or a
- table of data to be supplied by an application program that uses
- the facility, other than as an argument passed when the facility
- is invoked, then you must make a good faith effort to ensure that,
- in the event an application does not supply such function or
- table, the facility still operates, and performs whatever part of
- its purpose remains meaningful.
-
- (For example, a function in a library to compute square roots has
- a purpose that is entirely well-defined independent of the
- application. Therefore, Subsection 2d requires that any
- application-supplied function or table used by this function must
- be optional: if the application does not supply it, the square
- root function must still compute square roots.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Library,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Library, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote
-it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Library.
-
-In addition, mere aggregation of another work not based on the Library
-with the Library (or with a work based on the Library) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may opt to apply the terms of the ordinary GNU General Public
-License instead of this License to a given copy of the Library. To do
-this, you must alter all the notices that refer to this License, so
-that they refer to the ordinary GNU General Public License, version 2,
-instead of to this License. (If a newer version than version 2 of the
-ordinary GNU General Public License has appeared, then you can specify
-that version instead if you wish.) Do not make any other change in
-these notices.
-
- Once this change is made in a given copy, it is irreversible for
-that copy, so the ordinary GNU General Public License applies to all
-subsequent copies and derivative works made from that copy.
-
- This option is useful when you wish to copy part of the code of
-the Library into a program that is not a library.
-
- 4. You may copy and distribute the Library (or a portion or
-derivative of it, under Section 2) in object code or executable form
-under the terms of Sections 1 and 2 above provided that you accompany
-it with the complete corresponding machine-readable source code, which
-must be distributed under the terms of Sections 1 and 2 above on a
-medium customarily used for software interchange.
-
- If distribution of object code is made by offering access to copy
-from a designated place, then offering equivalent access to copy the
-source code from the same place satisfies the requirement to
-distribute the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 5. A program that contains no derivative of any portion of the
-Library, but is designed to work with the Library by being compiled or
-linked with it, is called a "work that uses the Library". Such a
-work, in isolation, is not a derivative work of the Library, and
-therefore falls outside the scope of this License.
-
- However, linking a "work that uses the Library" with the Library
-creates an executable that is a derivative of the Library (because it
-contains portions of the Library), rather than a "work that uses the
-library". The executable is therefore covered by this License.
-Section 6 states terms for distribution of such executables.
-
- When a "work that uses the Library" uses material from a header file
-that is part of the Library, the object code for the work may be a
-derivative work of the Library even though the source code is not.
-Whether this is true is especially significant if the work can be
-linked without the Library, or if the work is itself a library. The
-threshold for this to be true is not precisely defined by law.
-
- If such an object file uses only numerical parameters, data
-structure layouts and accessors, and small macros and small inline
-functions (ten lines or less in length), then the use of the object
-file is unrestricted, regardless of whether it is legally a derivative
-work. (Executables containing this object code plus portions of the
-Library will still fall under Section 6.)
-
- Otherwise, if the work is a derivative of the Library, you may
-distribute the object code for the work under the terms of Section 6.
-Any executables containing that work also fall under Section 6,
-whether or not they are linked directly with the Library itself.
-
- 6. As an exception to the Sections above, you may also combine or
-link a "work that uses the Library" with the Library to produce a
-work containing portions of the Library, and distribute that work
-under terms of your choice, provided that the terms permit
-modification of the work for the customer's own use and reverse
-engineering for debugging such modifications.
-
- You must give prominent notice with each copy of the work that the
-Library is used in it and that the Library and its use are covered by
-this License. You must supply a copy of this License. If the work
-during execution displays copyright notices, you must include the
-copyright notice for the Library among them, as well as a reference
-directing the user to the copy of this License. Also, you must do one
-of these things:
-
- a) Accompany the work with the complete corresponding
- machine-readable source code for the Library including whatever
- changes were used in the work (which must be distributed under
- Sections 1 and 2 above); and, if the work is an executable linked
- with the Library, with the complete machine-readable "work that
- uses the Library", as object code and/or source code, so that the
- user can modify the Library and then relink to produce a modified
- executable containing the modified Library. (It is understood
- that the user who changes the contents of definitions files in the
- Library will not necessarily be able to recompile the application
- to use the modified definitions.)
-
- b) Use a suitable shared library mechanism for linking with the
- Library. A suitable mechanism is one that (1) uses at run time a
- copy of the library already present on the user's computer system,
- rather than copying library functions into the executable, and (2)
- will operate properly with a modified version of the library, if
- the user installs one, as long as the modified version is
- interface-compatible with the version that the work was made with.
-
- c) Accompany the work with a written offer, valid for at
- least three years, to give the same user the materials
- specified in Subsection 6a, above, for a charge no more
- than the cost of performing this distribution.
-
- d) If distribution of the work is made by offering access to copy
- from a designated place, offer equivalent access to copy the above
- specified materials from the same place.
-
- e) Verify that the user has already received a copy of these
- materials or that you have already sent this user a copy.
-
- For an executable, the required form of the "work that uses the
-Library" must include any data and utility programs needed for
-reproducing the executable from it. However, as a special exception,
-the materials to be distributed need not include anything that is
-normally distributed (in either source or binary form) with the major
-components (compiler, kernel, and so on) of the operating system on
-which the executable runs, unless that component itself accompanies
-the executable.
-
- It may happen that this requirement contradicts the license
-restrictions of other proprietary libraries that do not normally
-accompany the operating system. Such a contradiction means you cannot
-use both them and the Library together in an executable that you
-distribute.
-
- 7. You may place library facilities that are a work based on the
-Library side-by-side in a single library together with other library
-facilities not covered by this License, and distribute such a combined
-library, provided that the separate distribution of the work based on
-the Library and of the other library facilities is otherwise
-permitted, and provided that you do these two things:
-
- a) Accompany the combined library with a copy of the same work
- based on the Library, uncombined with any other library
- facilities. This must be distributed under the terms of the
- Sections above.
-
- b) Give prominent notice with the combined library of the fact
- that part of it is a work based on the Library, and explaining
- where to find the accompanying uncombined form of the same work.
-
- 8. You may not copy, modify, sublicense, link with, or distribute
-the Library except as expressly provided under this License. Any
-attempt otherwise to copy, modify, sublicense, link with, or
-distribute the Library is void, and will automatically terminate your
-rights under this License. However, parties who have received copies,
-or rights, from you under this License will not have their licenses
-terminated so long as such parties remain in full compliance.
-
- 9. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Library or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Library (or any work based on the
-Library), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Library or works based on it.
-
- 10. Each time you redistribute the Library (or any work based on the
-Library), the recipient automatically receives a license from the
-original licensor to copy, distribute, link with or modify the Library
-subject to these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties with
-this License.
-
- 11. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Library at all. For example, if a patent
-license would not permit royalty-free redistribution of the Library by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Library.
-
-If any portion of this section is held invalid or unenforceable under any
-particular circumstance, the balance of the section is intended to apply,
-and the section as a whole is intended to apply in other circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 12. If the distribution and/or use of the Library is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Library under this License may add
-an explicit geographical distribution limitation excluding those countries,
-so that distribution is permitted only in or among countries not thus
-excluded. In such case, this License incorporates the limitation as if
-written in the body of this License.
-
- 13. The Free Software Foundation may publish revised and/or new
-versions of the Lesser General Public License from time to time.
-Such new versions will be similar in spirit to the present version,
-but may differ in detail to address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Library
-specifies a version number of this License which applies to it and
-"any later version", you have the option of following the terms and
-conditions either of that version or of any later version published by
-the Free Software Foundation. If the Library does not specify a
-license version number, you may choose any version ever published by
-the Free Software Foundation.
-
- 14. If you wish to incorporate parts of the Library into other free
-programs whose distribution conditions are incompatible with these,
-write to the author to ask for permission. For software which is
-copyrighted by the Free Software Foundation, write to the Free
-Software Foundation; we sometimes make exceptions for this. Our
-decision will be guided by the two goals of preserving the free status
-of all derivatives of our free software and of promoting the sharing
-and reuse of software generally.
-
- NO WARRANTY
-
- 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
-WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
-KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
-LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
-THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
-FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
-CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
-LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
-RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
-FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
-SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
-DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Libraries
-
- If you develop a new library, and you want it to be of the greatest
-possible use to the public, we recommend making it free software that
-everyone can redistribute and change. You can do so by permitting
-redistribution under these terms (or, alternatively, under the terms of the
-ordinary General Public License).
-
- To apply these terms, attach the following notices to the library. It is
-safest to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least the
-"copyright" line and a pointer to where the full notice is found.
-
- <one line to give the library's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with this library; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-Also add information on how to contact you by electronic and paper mail.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the library, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the
- library `Frob' (a library for tweaking knobs) written by James Random Hacker.
-
- <signature of Ty Coon>, 1 April 1990
- Ty Coon, President of Vice
-
-That's all there is to it!
-
-
Copied: trunk/HibernateExt/validator/lgpl.txt (from rev 11279, branches/Branch_3_2/HibernateExt/validator/lgpl.txt)
===================================================================
--- trunk/HibernateExt/validator/lgpl.txt (rev 0)
+++ trunk/HibernateExt/validator/lgpl.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
Copied: trunk/HibernateExt/validator/lib (from rev 11279, branches/Branch_3_2/HibernateExt/validator/lib)
Deleted: trunk/HibernateExt/validator/lib/README.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/lib/README.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/lib/README.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-Hibernate Commons Annotations dependencies
-==========================================
-
-Core
-====
-hibernate-commons-annotations.jar: required
-hibernate3.jar: required
-hibernate core dependencies: required (see Hibernate Core for more information)
-ejb3-persistence.jar: optional (needed for Java Persistence integration)
-
-Test
-====
-hibernate-annotations.jar: required
-hibernate-entitymanager.jar: required
\ No newline at end of file
Copied: trunk/HibernateExt/validator/lib/README.txt (from rev 11279, branches/Branch_3_2/HibernateExt/validator/lib/README.txt)
===================================================================
--- trunk/HibernateExt/validator/lib/README.txt (rev 0)
+++ trunk/HibernateExt/validator/lib/README.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+Hibernate Commons Annotations dependencies
+==========================================
+
+Core
+====
+hibernate-commons-annotations.jar: required
+hibernate3.jar: required
+hibernate core dependencies: required (see Hibernate Core for more information)
+ejb3-persistence.jar: optional (needed for Java Persistence integration)
+
+Test
+====
+hibernate-annotations.jar: required
+hibernate-entitymanager.jar: required
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/readme.txt
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/readme.txt 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/readme.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,45 +0,0 @@
-Hibernate Validator
-==================================================
-Version: 3.2.2.GA, xx.02.2007
-
-Description
------------
-
-Hibernate Validator aims at defining and checking a domain model level constraints.
-It supports custom constraints definitions as well as full internationalization.
-Annotations are used to define constraints on object level.
-The validation mechanism can be executed in different layers in your application
-without having to duplicate any of these rules (presentation layer,
-data access layer, Database schema).
-
-
-Instructions
-------------
-
-Unzip to installation directory, read doc/reference
-
-
-Contact
-------------
-
-Latest Documentation:
-
- http://www.hibernate.org
-
-Bug Reports:
-
- Hibernate JIRA (preferred)
- hibernate-devel at lists.sourceforge.net
-
-Free Technical Support:
-
- http://forum.hibernate.org (http://forum.hibernate.org/viewforum.php?f=9)
-
-
-Notes
------------
-
-If you want to contribute, go to http://www.hibernate.org/
-
-This software and its documentation are distributed under the terms of the
-FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
Copied: trunk/HibernateExt/validator/readme.txt (from rev 11279, branches/Branch_3_2/HibernateExt/validator/readme.txt)
===================================================================
--- trunk/HibernateExt/validator/readme.txt (rev 0)
+++ trunk/HibernateExt/validator/readme.txt 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,45 @@
+Hibernate Validator
+==================================================
+Version: 3.2.2.GA, xx.02.2007
+
+Description
+-----------
+
+Hibernate Validator aims at defining and checking a domain model level constraints.
+It supports custom constraints definitions as well as full internationalization.
+Annotations are used to define constraints on object level.
+The validation mechanism can be executed in different layers in your application
+without having to duplicate any of these rules (presentation layer,
+data access layer, Database schema).
+
+
+Instructions
+------------
+
+Unzip to installation directory, read doc/reference
+
+
+Contact
+------------
+
+Latest Documentation:
+
+ http://www.hibernate.org
+
+Bug Reports:
+
+ Hibernate JIRA (preferred)
+ hibernate-devel at lists.sourceforge.net
+
+Free Technical Support:
+
+ http://forum.hibernate.org (http://forum.hibernate.org/viewforum.php?f=9)
+
+
+Notes
+-----------
+
+If you want to contribute, go to http://www.hibernate.org/
+
+This software and its documentation are distributed under the terms of the
+FSF Lesser Gnu Public License (see lgpl.txt).
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src)
Copied: trunk/HibernateExt/validator/src/java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java)
Copied: trunk/HibernateExt/validator/src/java/org (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org)
Copied: trunk/HibernateExt/validator/src/java/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate)
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator)
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/AbstractLuhnValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/AbstractLuhnValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/AbstractLuhnValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,40 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import java.util.List;
-import java.util.ArrayList;
-
-/**
- * Implement the Luhn algorithm (with Luhn key on the last digit)
- * @author Emmanuel Bernard
- */
-public abstract class AbstractLuhnValidator {
- abstract int multiplicator();
-
- public boolean isValid(Object value) {
- if (value == null) return true;
- if ( ! ( value instanceof String) ) return false;
- String creditCard = (String) value;
- char[] chars = creditCard.toCharArray();
-
- List<Integer> ints = new ArrayList<Integer>();
- for (char c : chars) {
- if ( Character.isDigit( c ) ) ints.add( c - '0' );
- }
- int length = ints.size();
- int sum = 0;
- boolean even = false;
- for ( int index = length - 1 ; index >= 0 ; index-- ) {
- int digit = ints.get(index);
- if (even) {
- digit *= multiplicator();
- }
- if (digit > 9) {
- digit = digit / 10 + digit % 10;
- }
- sum+= digit;
- even = !even;
- }
- return sum % 10 == 0;
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/AbstractLuhnValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/AbstractLuhnValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/AbstractLuhnValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/AbstractLuhnValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,40 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Implement the Luhn algorithm (with Luhn key on the last digit)
+ * @author Emmanuel Bernard
+ */
+public abstract class AbstractLuhnValidator {
+ abstract int multiplicator();
+
+ public boolean isValid(Object value) {
+ if (value == null) return true;
+ if ( ! ( value instanceof String) ) return false;
+ String creditCard = (String) value;
+ char[] chars = creditCard.toCharArray();
+
+ List<Integer> ints = new ArrayList<Integer>();
+ for (char c : chars) {
+ if ( Character.isDigit( c ) ) ints.add( c - '0' );
+ }
+ int length = ints.size();
+ int sum = 0;
+ boolean even = false;
+ for ( int index = length - 1 ; index >= 0 ; index-- ) {
+ int digit = ints.get(index);
+ if (even) {
+ digit *= multiplicator();
+ }
+ if (digit > 9) {
+ digit = digit / 10 + digit % 10;
+ }
+ sum+= digit;
+ even = !even;
+ }
+ return sum % 10 == 0;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalse.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalse.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalse.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * The annotated property has to be false.
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(AssertFalseValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface AssertFalse {
- String message() default "{validator.assertFalse}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalse.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalse.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalse.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalse.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated property has to be false.
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(AssertFalseValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface AssertFalse {
+ String message() default "{validator.assertFalse}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalseValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalseValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalseValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-
-
-/**
- * Check if a given object is false or not
- *
- * @author Gavin King
- */
-public class AssertFalseValidator implements Validator<AssertFalse>, Serializable {
-
- public boolean isValid(Object value) {
- return !(Boolean) value;
- }
-
- public void initialize(AssertFalse parameters) {
- }
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalseValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalseValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalseValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertFalseValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+
+
+/**
+ * Check if a given object is false or not
+ *
+ * @author Gavin King
+ */
+public class AssertFalseValidator implements Validator<AssertFalse>, Serializable {
+
+ public boolean isValid(Object value) {
+ return !(Boolean) value;
+ }
+
+ public void initialize(AssertFalse parameters) {
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrue.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrue.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrue.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * The annotated element has to be true
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(AssertTrueValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface AssertTrue {
- String message() default "{validator.assertTrue}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrue.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrue.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrue.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrue.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated element has to be true
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(AssertTrueValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface AssertTrue {
+ String message() default "{validator.assertTrue}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrueValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrueValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrueValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-
-
-/**
- * Check whether an element is true or not
- *
- * @author Gavin King
- */
-public class AssertTrueValidator implements Validator<AssertTrue>, Serializable {
-
- public boolean isValid(Object value) {
- return (Boolean) value;
- }
-
- public void initialize(AssertTrue parameters) {
- }
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrueValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrueValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrueValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/AssertTrueValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+
+
+/**
+ * Check whether an element is true or not
+ *
+ * @author Gavin King
+ */
+public class AssertTrueValidator implements Validator<AssertTrue>, Serializable {
+
+ public boolean isValid(Object value) {
+ return (Boolean) value;
+ }
+
+ public void initialize(AssertTrue parameters) {
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,756 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.beans.Introspector;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.io.Serializable;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.text.MessageFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.Set;
-import java.util.StringTokenizer;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.AssertionFailure;
-import org.hibernate.Hibernate;
-import org.hibernate.MappingException;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.Component;
-import org.hibernate.annotations.common.reflection.Filter;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.XClass;
-import org.hibernate.annotations.common.reflection.XMember;
-import org.hibernate.annotations.common.reflection.XMethod;
-import org.hibernate.annotations.common.reflection.XProperty;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-import org.hibernate.util.IdentitySet;
-import org.hibernate.validator.interpolator.DefaultMessageInterpolatorAggerator;
-
-
-/**
- * Engine that take a bean and check every expressed annotation restrictions
- *
- * @author Gavin King
- * @author Emmanuel Bernard
- */
-public class ClassValidator<T> implements Serializable {
- //TODO Define magic number
- private static Log log = LogFactory.getLog( ClassValidator.class );
- private static final InvalidValue[] EMPTY_INVALID_VALUE_ARRAY = new InvalidValue[]{};
- private static final String DEFAULT_VALIDATOR_MESSAGE = "org.hibernate.validator.resources.DefaultValidatorMessages";
- private static final String VALIDATOR_MESSAGE = "ValidatorMessages";
- private static final Set<Class> INDEXABLE_CLASS = new HashSet<Class>();
-
- static {
- INDEXABLE_CLASS.add( Integer.class );
- INDEXABLE_CLASS.add( Long.class );
- INDEXABLE_CLASS.add( String.class );
- }
-
- static {
- Version.touch(); //touch version
- }
-
- private final Class<T> beanClass;
- private transient ResourceBundle messageBundle;
- private transient ResourceBundle defaultMessageBundle;
- private transient boolean isUserProvidedResourceBundle;
- private transient ReflectionManager reflectionManager;
-
- private final transient Map<XClass, ClassValidator> childClassValidators;
- private transient List<Validator> beanValidators;
- private transient List<Validator> memberValidators;
- private transient List<XMember> memberGetters;
- private transient List<XMember> childGetters;
- private transient DefaultMessageInterpolatorAggerator defaultInterpolator;
- private transient MessageInterpolator userInterpolator;
- private static final Filter GET_ALL_FILTER = new Filter() {
- public boolean returnStatic() {
- return true;
- }
-
- public boolean returnTransient() {
- return true;
- }
- };
-
- /**
- * create the validator engine for this bean type
- */
- public ClassValidator(Class<T> beanClass) {
- this( beanClass, (ResourceBundle) null );
- }
-
- /**
- * create the validator engine for a particular bean class, using a resource bundle
- * for message rendering on violation
- */
- public ClassValidator(Class<T> beanClass, ResourceBundle resourceBundle) {
- this( beanClass, resourceBundle, null, new HashMap<XClass, ClassValidator>(), null );
- }
-
- /**
- * create the validator engine for a particular bean class, using a custom message interpolator
- * for message rendering on violation
- */
- public ClassValidator(Class<T> beanClass, MessageInterpolator interpolator) {
- this( beanClass, null, interpolator, new HashMap<XClass, ClassValidator>(), null );
- }
-
- /**
- * Not a public API
- */
- public ClassValidator(
- Class<T> beanClass, ResourceBundle resourceBundle, MessageInterpolator interpolator,
- Map<XClass, ClassValidator> childClassValidators, ReflectionManager reflectionManager
- ) {
- this.reflectionManager = reflectionManager != null ? reflectionManager : new JavaReflectionManager();
- XClass beanXClass = this.reflectionManager.toXClass( beanClass );
- this.beanClass = beanClass;
- this.messageBundle = resourceBundle == null ?
- getDefaultResourceBundle() :
- resourceBundle;
- this.defaultMessageBundle = ResourceBundle.getBundle( DEFAULT_VALIDATOR_MESSAGE );
- this.userInterpolator = interpolator;
- this.childClassValidators = childClassValidators != null ?
- childClassValidators :
- new HashMap<XClass, ClassValidator>();
- initValidator( beanXClass, this.childClassValidators );
- }
-
- @SuppressWarnings("unchecked")
- protected ClassValidator(
- XClass beanXClass, ResourceBundle resourceBundle, MessageInterpolator userInterpolator,
- Map<XClass, ClassValidator> childClassValidators, ReflectionManager reflectionManager
- ) {
- this.reflectionManager = reflectionManager;
- this.beanClass = reflectionManager.toClass( beanXClass );
- this.messageBundle = resourceBundle == null ?
- getDefaultResourceBundle() :
- resourceBundle;
- this.defaultMessageBundle = ResourceBundle.getBundle( DEFAULT_VALIDATOR_MESSAGE );
- this.userInterpolator = userInterpolator;
- this.childClassValidators = childClassValidators;
- initValidator( beanXClass, childClassValidators );
- }
-
- private ResourceBundle getDefaultResourceBundle() {
- ResourceBundle rb;
- try {
- //use context class loader as a first citizen
- ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
- if ( contextClassLoader == null ) {
- throw new MissingResourceException( "No context classloader", null, VALIDATOR_MESSAGE );
- }
- rb = ResourceBundle.getBundle(
- VALIDATOR_MESSAGE,
- Locale.getDefault(),
- contextClassLoader
- );
- }
- catch (MissingResourceException e) {
- log.trace( "ResourceBundle " + VALIDATOR_MESSAGE + " not found in thread context classloader" );
- //then use the Validator Framework classloader
- try {
- rb = ResourceBundle.getBundle(
- VALIDATOR_MESSAGE,
- Locale.getDefault(),
- this.getClass().getClassLoader()
- );
- }
- catch (MissingResourceException ee) {
- log.debug(
- "ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to " + DEFAULT_VALIDATOR_MESSAGE
- );
- //the user did not override the default ValidatorMessages
- rb = null;
- }
- }
- isUserProvidedResourceBundle = true;
- return rb;
- }
-
- private void initValidator(
- XClass xClass, Map<XClass, ClassValidator> childClassValidators
- ) {
- beanValidators = new ArrayList<Validator>();
- memberValidators = new ArrayList<Validator>();
- memberGetters = new ArrayList<XMember>();
- childGetters = new ArrayList<XMember>();
- defaultInterpolator = new DefaultMessageInterpolatorAggerator();
- defaultInterpolator.initialize( messageBundle, defaultMessageBundle );
-
- //build the class hierarchy to look for members in
- childClassValidators.put( xClass, this );
- Collection<XClass> classes = new HashSet<XClass>();
- addSuperClassesAndInterfaces( xClass, classes );
- for ( XClass currentClass : classes ) {
- Annotation[] classAnnotations = currentClass.getAnnotations();
- for ( int i = 0; i < classAnnotations.length ; i++ ) {
- Annotation classAnnotation = classAnnotations[i];
- Validator beanValidator = createValidator( classAnnotation );
- if ( beanValidator != null ) beanValidators.add( beanValidator );
- handleAggregateAnnotations(classAnnotation, null);
- }
- }
-
- //Check on all selected classes
- for ( XClass currClass : classes ) {
- List<XMethod> methods = currClass.getDeclaredMethods();
- for ( XMethod method : methods ) {
- createMemberValidator( method );
- createChildValidator( method );
- }
-
- List<XProperty> fields = currClass.getDeclaredProperties(
- "field", GET_ALL_FILTER
- );
- for ( XProperty field : fields ) {
- createMemberValidator( field );
- createChildValidator( field );
- }
- }
- }
-
- private void addSuperClassesAndInterfaces(XClass clazz, Collection<XClass> classes) {
- for ( XClass currClass = clazz; currClass != null ; currClass = currClass.getSuperclass() ) {
- if ( ! classes.add( currClass ) ) return;
- XClass[] interfaces = currClass.getInterfaces();
- for ( XClass interf : interfaces ) {
- addSuperClassesAndInterfaces( interf, classes );
- }
- }
- }
-
- private boolean handleAggregateAnnotations(Annotation annotation, XMember member) {
- Object[] values;
- try {
- Method valueMethod = annotation.getClass().getMethod( "value" );
- if ( valueMethod.getReturnType().isArray() ) {
- values = (Object[]) valueMethod.invoke( annotation );
- }
- else {
- return false;
- }
- }
- catch (NoSuchMethodException e) {
- return false;
- }
- catch (Exception e) {
- throw new IllegalStateException( e );
- }
-
- boolean validatorPresent = false;
- for ( Object value : values ) {
- if ( value instanceof Annotation ) {
- annotation = (Annotation) value;
- Validator validator = createValidator( annotation );
- if ( validator != null ) {
- if ( member != null ) {
- //member
- memberValidators.add( validator );
- setAccessible( member );
- memberGetters.add( member );
- }
- else {
- //bean
- beanValidators.add( validator );
- }
- validatorPresent = true;
- }
- }
- }
- return validatorPresent;
- }
-
- @SuppressWarnings("unchecked")
- private void createChildValidator( XMember member) {
- if ( member.isAnnotationPresent( Valid.class ) ) {
- setAccessible( member );
- childGetters.add( member );
- XClass clazz;
- if ( member.isCollection() || member.isArray() ) {
- clazz = member.getElementClass();
- }
- else {
- clazz = member.getType();
- }
- if ( !childClassValidators.containsKey( clazz ) ) {
- //ClassValidator added by side effect (added to childClassValidators during CV construction)
- new ClassValidator( clazz, messageBundle, userInterpolator, childClassValidators, reflectionManager );
- }
- }
- }
-
- private void createMemberValidator(XMember member) {
- boolean validatorPresent = false;
- Annotation[] memberAnnotations = member.getAnnotations();
- for ( Annotation methodAnnotation : memberAnnotations ) {
- Validator propertyValidator = createValidator( methodAnnotation );
- if ( propertyValidator != null ) {
- memberValidators.add( propertyValidator );
- setAccessible( member );
- memberGetters.add( member );
- validatorPresent = true;
- }
- boolean agrValidPresent = handleAggregateAnnotations( methodAnnotation, member );
- validatorPresent = validatorPresent || agrValidPresent;
- }
- if ( validatorPresent && !member.isTypeResolved() ) {
- log.warn( "Original type of property " + member + " is unbound and has been approximated." );
- }
- }
-
- private static void setAccessible(XMember member) {
- if ( !Modifier.isPublic( member.getModifiers() ) ) {
- member.setAccessible( true );
- }
- }
-
- @SuppressWarnings("unchecked")
- private Validator createValidator(Annotation annotation) {
- try {
- ValidatorClass validatorClass = annotation.annotationType().getAnnotation( ValidatorClass.class );
- if ( validatorClass == null ) {
- return null;
- }
- Validator beanValidator = validatorClass.value().newInstance();
- beanValidator.initialize( annotation );
- defaultInterpolator.addInterpolator( annotation, beanValidator );
- return beanValidator;
- }
- catch (Exception e) {
- throw new IllegalArgumentException( "could not instantiate ClassValidator", e );
- }
- }
-
- public boolean hasValidationRules() {
- return beanValidators.size() != 0 || memberValidators.size() != 0;
- }
-
- /**
- * apply constraints on a bean instance and return all the failures.
- * if <code>bean</code> is null, an empty array is returned
- */
- public InvalidValue[] getInvalidValues(T bean) {
- return this.getInvalidValues( bean, new IdentitySet() );
- }
-
- /**
- * apply constraints on a bean instance and return all the failures.
- * if <code>bean</code> is null, an empty array is returned
- */
- @SuppressWarnings("unchecked")
- protected InvalidValue[] getInvalidValues(T bean, Set<Object> circularityState) {
- if ( bean == null || circularityState.contains( bean ) ) {
- return EMPTY_INVALID_VALUE_ARRAY; //Avoid circularity
- }
- else {
- circularityState.add( bean );
- }
-
- if ( !beanClass.isInstance( bean ) ) {
- throw new IllegalArgumentException( "not an instance of: " + bean.getClass() );
- }
-
- List<InvalidValue> results = new ArrayList<InvalidValue>();
-
- for ( int i = 0; i < beanValidators.size() ; i++ ) {
- Validator validator = beanValidators.get( i );
- if ( !validator.isValid( bean ) ) {
- results.add( new InvalidValue( interpolate(validator), beanClass, null, bean, bean ) );
- }
- }
-
- for ( int i = 0; i < memberValidators.size() ; i++ ) {
- XMember getter = memberGetters.get( i );
- if ( Hibernate.isPropertyInitialized( bean, getPropertyName( getter ) ) ) {
- Object value = getMemberValue( bean, getter );
- Validator validator = memberValidators.get( i );
- if ( !validator.isValid( value ) ) {
- String propertyName = getPropertyName( getter );
- results.add( new InvalidValue( interpolate(validator), beanClass, propertyName, value, bean ) );
- }
- }
- }
-
- for ( int i = 0; i < childGetters.size() ; i++ ) {
- XMember getter = childGetters.get( i );
- if ( Hibernate.isPropertyInitialized( bean, getPropertyName( getter ) ) ) {
- Object value = getMemberValue( bean, getter );
- if ( value != null && Hibernate.isInitialized( value ) ) {
- String propertyName = getPropertyName( getter );
- if ( getter.isCollection() ) {
- int index = 0;
- boolean isIterable = value instanceof Iterable;
- Map map = ! isIterable ? (Map) value : null;
- Iterable elements = isIterable ?
- (Iterable) value :
- map.keySet();
- for ( Object element : elements ) {
- Object actualElement = isIterable ? element : map.get( element );
- if ( actualElement == null ) {
- index++;
- continue;
- }
- InvalidValue[] invalidValues = getClassValidator( actualElement )
- .getInvalidValues( actualElement, circularityState );
-
- String indexedPropName = MessageFormat.format(
- "{0}[{1}]",
- propertyName,
- INDEXABLE_CLASS.contains( element.getClass() ) ?
- ( "'" + element + "'" ) :
- index
- );
- index++;
-
- for ( InvalidValue invalidValue : invalidValues ) {
- invalidValue.addParentBean( bean, indexedPropName );
- results.add( invalidValue );
- }
- }
- }
- if ( getter.isArray() ) {
- int index = 0;
- for ( Object element : (Object[]) value ) {
- if ( element == null ) {
- index++;
- continue;
- }
- InvalidValue[] invalidValues = getClassValidator( element )
- .getInvalidValues( element, circularityState );
-
- String indexedPropName = MessageFormat.format(
- "{0}[{1}]",
- propertyName,
- index
- );
- index++;
-
- for ( InvalidValue invalidValue : invalidValues ) {
- invalidValue.addParentBean( bean, indexedPropName );
- results.add( invalidValue );
- }
- }
- }
- else {
- InvalidValue[] invalidValues = getClassValidator( value )
- .getInvalidValues( value, circularityState );
- for ( InvalidValue invalidValue : invalidValues ) {
- invalidValue.addParentBean( bean, propertyName );
- results.add( invalidValue );
- }
- }
- }
- }
- }
-
- return results.toArray( new InvalidValue[results.size()] );
- }
-
- private String interpolate(Validator validator) {
- String message = defaultInterpolator.getAnnotationMessage( validator );
- if (userInterpolator != null) {
- return userInterpolator.interpolate( message, validator, defaultInterpolator );
- }
- else {
- return defaultInterpolator.interpolate( message, validator, null);
- }
- }
-
- @SuppressWarnings("unchecked")
- private ClassValidator getClassValidator(Object value) {
- Class clazz = value.getClass();
- ClassValidator validator = childClassValidators.get( reflectionManager.toXClass( clazz ) );
- if ( validator == null ) { //handles polymorphism
- validator = new ClassValidator( clazz );
- }
- return validator;
- }
-
- /**
- * Apply constraints of a particular property on a bean instance and return all the failures.
- * Note this is not recursive.
- */
- //TODO should it be recursive?
- public InvalidValue[] getInvalidValues(T bean, String propertyName) {
- List<InvalidValue> results = new ArrayList<InvalidValue>();
-
- for ( int i = 0; i < memberValidators.size() ; i++ ) {
- XMember getter = memberGetters.get( i );
- if ( getPropertyName( getter ).equals( propertyName ) ) {
- Object value = getMemberValue( bean, getter );
- Validator validator = memberValidators.get( i );
- if ( !validator.isValid( value ) ) {
- results.add( new InvalidValue( interpolate(validator), beanClass, propertyName, value, bean ) );
- }
- }
- }
-
- return results.toArray( new InvalidValue[results.size()] );
- }
-
- /**
- * Apply constraints of a particular property value of a bean type and return all the failures.
- * The InvalidValue objects returns return null for InvalidValue#getBean() and InvalidValue#getRootBean()
- * Note this is not recursive.
- */
- //TODO should it be recursive?
- public InvalidValue[] getPotentialInvalidValues(String propertyName, Object value) {
- List<InvalidValue> results = new ArrayList<InvalidValue>();
-
- for ( int i = 0; i < memberValidators.size() ; i++ ) {
- XMember getter = memberGetters.get( i );
- if ( getPropertyName( getter ).equals( propertyName ) ) {
- Validator validator = memberValidators.get( i );
- if ( !validator.isValid( value ) ) {
- results.add( new InvalidValue( interpolate(validator), beanClass, propertyName, value, null ) );
- }
- }
- }
-
- return results.toArray( new InvalidValue[results.size()] );
- }
-
- private Object getMemberValue(T bean, XMember getter) {
- Object value;
- try {
- value = getter.invoke( bean );
- }
- catch (Exception e) {
- throw new IllegalStateException( "Could not get property value", e );
- }
- return value;
- }
-
- public String getPropertyName(XMember member) {
- //Do no try to cache the result in a map, it's actually much slower (2.x time)
- String propertyName;
- if ( XProperty.class.isAssignableFrom( member.getClass() ) ) {
- propertyName = member.getName();
- }
- else if ( XMethod.class.isAssignableFrom( member.getClass() ) ) {
- propertyName = member.getName();
- if ( propertyName.startsWith( "is" ) ) {
- propertyName = Introspector.decapitalize( propertyName.substring( 2 ) );
- }
- else if ( propertyName.startsWith( "get" ) ) {
- propertyName = Introspector.decapitalize( propertyName.substring( 3 ) );
- }
- //do nothing for non getter method, in case someone want to validate a PO Method
- }
- else {
- throw new AssertionFailure( "Unexpected member: " + member.getClass().getName() );
- }
- return propertyName;
- }
-
- /** @deprecated */
- private String replace(String message, Annotation parameters) {
- StringTokenizer tokens = new StringTokenizer( message, "#{}", true );
- StringBuilder buf = new StringBuilder( 30 );
- boolean escaped = false;
- boolean el = false;
- while ( tokens.hasMoreTokens() ) {
- String token = tokens.nextToken();
- if ( !escaped && "#".equals( token ) ) {
- el = true;
- }
- if ( !el && "{".equals( token ) ) {
- escaped = true;
- }
- else if ( escaped && "}".equals( token ) ) {
- escaped = false;
- }
- else if ( !escaped ) {
- if ( "{".equals( token ) ) el = false;
- buf.append( token );
- }
- else {
- Method member;
- try {
- member = parameters.getClass().getMethod( token, (Class[]) null );
- }
- catch (NoSuchMethodException nsfme) {
- member = null;
- }
- if ( member != null ) {
- try {
- buf.append( member.invoke( parameters ) );
- }
- catch (Exception e) {
- throw new IllegalArgumentException( "could not render message", e );
- }
- }
- else {
- String string = null;
- try {
- string = messageBundle != null ? messageBundle.getString( token ) : null;
- }
- catch( MissingResourceException e ) {
- //give a second chance with the default resource bundle
- }
- if (string == null) {
- try {
- string = defaultMessageBundle.getString( token );
- }
- catch( MissingResourceException e) {
- throw new MissingResourceException(
- "Can't find resource in validator bundles, key " + token,
- defaultMessageBundle.getClass().getName(),
- token
- );
- }
- }
- if ( string != null ) buf.append( replace( string, parameters ) );
- }
- }
- }
- return buf.toString();
- }
-
- /**
- * apply the registred constraints rules on the hibernate metadata (to be applied on DB schema...)
- *
- * @param persistentClass hibernate metadata
- */
- public void apply(PersistentClass persistentClass) {
-
- for ( Validator validator : beanValidators ) {
- if ( validator instanceof PersistentClassConstraint ) {
- ( (PersistentClassConstraint) validator ).apply( persistentClass );
- }
- }
-
- Iterator<Validator> validators = memberValidators.iterator();
- Iterator<XMember> getters = memberGetters.iterator();
- while ( validators.hasNext() ) {
- Validator validator = validators.next();
- String propertyName = getPropertyName( getters.next() );
- if ( validator instanceof PropertyConstraint ) {
- try {
- Property property = findPropertyByName(persistentClass, propertyName);
- if (property != null) {
- ( (PropertyConstraint) validator ).apply( property );
- }
- }
- catch (MappingException pnfe) {
- //do nothing
- }
- }
- }
-
- }
-
- public void assertValid(T bean) {
- InvalidValue[] values = getInvalidValues( bean );
- if ( values.length > 0 ) {
- throw new InvalidStateException( values );
- }
- }
-
- private void writeObject(ObjectOutputStream oos) throws IOException {
- ResourceBundle rb = messageBundle;
- MessageInterpolator interpolator = this.userInterpolator;
- if ( rb != null && ! ( rb instanceof Serializable ) ) {
- messageBundle = null;
- if ( ! isUserProvidedResourceBundle ) {
- log.warn(
- "Serializing a ClassValidator with a non serializable ResourceBundle: ResourceBundle ignored"
- );
- }
- }
- if (interpolator != null && ! (interpolator instanceof Serializable) ) {
- userInterpolator = null;
- log.warn( "Serializing a non serializable MessageInterpolator" );
- }
- oos.defaultWriteObject();
- oos.writeObject( messageBundle );
- oos.writeObject( userInterpolator );
- messageBundle = rb;
- userInterpolator = interpolator;
- }
-
- private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
- ois.defaultReadObject();
- ResourceBundle rb = (ResourceBundle) ois.readObject();
- if ( rb == null ) rb = getDefaultResourceBundle();
- this.messageBundle = rb;
- this.userInterpolator = (MessageInterpolator) ois.readObject();
- this.defaultMessageBundle = ResourceBundle.getBundle( DEFAULT_VALIDATOR_MESSAGE );
- reflectionManager = new JavaReflectionManager();
- initValidator( reflectionManager.toXClass( beanClass ), new HashMap<XClass, ClassValidator>() );
- }
-
- /**
- * Retrieve the property by path in a recursive way, including IndetifierProperty in the loop
- * If propertyName is null or empty, the IdentifierProperty is returned
- */
- public static Property findPropertyByName(PersistentClass associatedClass, String propertyName) {
- Property property = null;
- Property idProperty = associatedClass.getIdentifierProperty();
- String idName = idProperty != null ? idProperty.getName() : null;
- try {
- if ( propertyName == null
- || propertyName.length() == 0
- || propertyName.equals( idName ) ) {
- //default to id
- property = idProperty;
- }
- else {
- if ( propertyName.indexOf( idName + "." ) == 0 ) {
- property = idProperty;
- propertyName = propertyName.substring( idName.length() + 1 );
- }
- StringTokenizer st = new StringTokenizer( propertyName, ".", false );
- while ( st.hasMoreElements() ) {
- String element = (String) st.nextElement();
- if ( property == null ) {
- property = associatedClass.getProperty( element );
- }
- else {
- if ( ! property.isComposite() ) return null;
- property = ( (Component) property.getValue() ).getProperty( element );
- }
- }
- }
- }
- catch (MappingException e) {
- try {
- //if we do not find it try to check the identifier mapper
- if ( associatedClass.getIdentifierMapper() == null ) return null;
- StringTokenizer st = new StringTokenizer( propertyName, ".", false );
- while ( st.hasMoreElements() ) {
- String element = (String) st.nextElement();
- if ( property == null ) {
- property = associatedClass.getIdentifierMapper().getProperty( element );
- }
- else {
- if ( ! property.isComposite() ) return null;
- property = ( (Component) property.getValue() ).getProperty( element );
- }
- }
- }
- catch (MappingException ee) {
- return null;
- }
- }
- return property;
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/ClassValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,756 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.beans.Introspector;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Locale;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.Set;
+import java.util.StringTokenizer;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.AssertionFailure;
+import org.hibernate.Hibernate;
+import org.hibernate.MappingException;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Component;
+import org.hibernate.annotations.common.reflection.Filter;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.XClass;
+import org.hibernate.annotations.common.reflection.XMember;
+import org.hibernate.annotations.common.reflection.XMethod;
+import org.hibernate.annotations.common.reflection.XProperty;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+import org.hibernate.util.IdentitySet;
+import org.hibernate.validator.interpolator.DefaultMessageInterpolatorAggerator;
+
+
+/**
+ * Engine that take a bean and check every expressed annotation restrictions
+ *
+ * @author Gavin King
+ * @author Emmanuel Bernard
+ */
+public class ClassValidator<T> implements Serializable {
+ //TODO Define magic number
+ private static Log log = LogFactory.getLog( ClassValidator.class );
+ private static final InvalidValue[] EMPTY_INVALID_VALUE_ARRAY = new InvalidValue[]{};
+ private static final String DEFAULT_VALIDATOR_MESSAGE = "org.hibernate.validator.resources.DefaultValidatorMessages";
+ private static final String VALIDATOR_MESSAGE = "ValidatorMessages";
+ private static final Set<Class> INDEXABLE_CLASS = new HashSet<Class>();
+
+ static {
+ INDEXABLE_CLASS.add( Integer.class );
+ INDEXABLE_CLASS.add( Long.class );
+ INDEXABLE_CLASS.add( String.class );
+ }
+
+ static {
+ Version.touch(); //touch version
+ }
+
+ private final Class<T> beanClass;
+ private transient ResourceBundle messageBundle;
+ private transient ResourceBundle defaultMessageBundle;
+ private transient boolean isUserProvidedResourceBundle;
+ private transient ReflectionManager reflectionManager;
+
+ private final transient Map<XClass, ClassValidator> childClassValidators;
+ private transient List<Validator> beanValidators;
+ private transient List<Validator> memberValidators;
+ private transient List<XMember> memberGetters;
+ private transient List<XMember> childGetters;
+ private transient DefaultMessageInterpolatorAggerator defaultInterpolator;
+ private transient MessageInterpolator userInterpolator;
+ private static final Filter GET_ALL_FILTER = new Filter() {
+ public boolean returnStatic() {
+ return true;
+ }
+
+ public boolean returnTransient() {
+ return true;
+ }
+ };
+
+ /**
+ * create the validator engine for this bean type
+ */
+ public ClassValidator(Class<T> beanClass) {
+ this( beanClass, (ResourceBundle) null );
+ }
+
+ /**
+ * create the validator engine for a particular bean class, using a resource bundle
+ * for message rendering on violation
+ */
+ public ClassValidator(Class<T> beanClass, ResourceBundle resourceBundle) {
+ this( beanClass, resourceBundle, null, new HashMap<XClass, ClassValidator>(), null );
+ }
+
+ /**
+ * create the validator engine for a particular bean class, using a custom message interpolator
+ * for message rendering on violation
+ */
+ public ClassValidator(Class<T> beanClass, MessageInterpolator interpolator) {
+ this( beanClass, null, interpolator, new HashMap<XClass, ClassValidator>(), null );
+ }
+
+ /**
+ * Not a public API
+ */
+ public ClassValidator(
+ Class<T> beanClass, ResourceBundle resourceBundle, MessageInterpolator interpolator,
+ Map<XClass, ClassValidator> childClassValidators, ReflectionManager reflectionManager
+ ) {
+ this.reflectionManager = reflectionManager != null ? reflectionManager : new JavaReflectionManager();
+ XClass beanXClass = this.reflectionManager.toXClass( beanClass );
+ this.beanClass = beanClass;
+ this.messageBundle = resourceBundle == null ?
+ getDefaultResourceBundle() :
+ resourceBundle;
+ this.defaultMessageBundle = ResourceBundle.getBundle( DEFAULT_VALIDATOR_MESSAGE );
+ this.userInterpolator = interpolator;
+ this.childClassValidators = childClassValidators != null ?
+ childClassValidators :
+ new HashMap<XClass, ClassValidator>();
+ initValidator( beanXClass, this.childClassValidators );
+ }
+
+ @SuppressWarnings("unchecked")
+ protected ClassValidator(
+ XClass beanXClass, ResourceBundle resourceBundle, MessageInterpolator userInterpolator,
+ Map<XClass, ClassValidator> childClassValidators, ReflectionManager reflectionManager
+ ) {
+ this.reflectionManager = reflectionManager;
+ this.beanClass = reflectionManager.toClass( beanXClass );
+ this.messageBundle = resourceBundle == null ?
+ getDefaultResourceBundle() :
+ resourceBundle;
+ this.defaultMessageBundle = ResourceBundle.getBundle( DEFAULT_VALIDATOR_MESSAGE );
+ this.userInterpolator = userInterpolator;
+ this.childClassValidators = childClassValidators;
+ initValidator( beanXClass, childClassValidators );
+ }
+
+ private ResourceBundle getDefaultResourceBundle() {
+ ResourceBundle rb;
+ try {
+ //use context class loader as a first citizen
+ ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
+ if ( contextClassLoader == null ) {
+ throw new MissingResourceException( "No context classloader", null, VALIDATOR_MESSAGE );
+ }
+ rb = ResourceBundle.getBundle(
+ VALIDATOR_MESSAGE,
+ Locale.getDefault(),
+ contextClassLoader
+ );
+ }
+ catch (MissingResourceException e) {
+ log.trace( "ResourceBundle " + VALIDATOR_MESSAGE + " not found in thread context classloader" );
+ //then use the Validator Framework classloader
+ try {
+ rb = ResourceBundle.getBundle(
+ VALIDATOR_MESSAGE,
+ Locale.getDefault(),
+ this.getClass().getClassLoader()
+ );
+ }
+ catch (MissingResourceException ee) {
+ log.debug(
+ "ResourceBundle ValidatorMessages not found in Validator classloader. Delegate to " + DEFAULT_VALIDATOR_MESSAGE
+ );
+ //the user did not override the default ValidatorMessages
+ rb = null;
+ }
+ }
+ isUserProvidedResourceBundle = true;
+ return rb;
+ }
+
+ private void initValidator(
+ XClass xClass, Map<XClass, ClassValidator> childClassValidators
+ ) {
+ beanValidators = new ArrayList<Validator>();
+ memberValidators = new ArrayList<Validator>();
+ memberGetters = new ArrayList<XMember>();
+ childGetters = new ArrayList<XMember>();
+ defaultInterpolator = new DefaultMessageInterpolatorAggerator();
+ defaultInterpolator.initialize( messageBundle, defaultMessageBundle );
+
+ //build the class hierarchy to look for members in
+ childClassValidators.put( xClass, this );
+ Collection<XClass> classes = new HashSet<XClass>();
+ addSuperClassesAndInterfaces( xClass, classes );
+ for ( XClass currentClass : classes ) {
+ Annotation[] classAnnotations = currentClass.getAnnotations();
+ for ( int i = 0; i < classAnnotations.length ; i++ ) {
+ Annotation classAnnotation = classAnnotations[i];
+ Validator beanValidator = createValidator( classAnnotation );
+ if ( beanValidator != null ) beanValidators.add( beanValidator );
+ handleAggregateAnnotations(classAnnotation, null);
+ }
+ }
+
+ //Check on all selected classes
+ for ( XClass currClass : classes ) {
+ List<XMethod> methods = currClass.getDeclaredMethods();
+ for ( XMethod method : methods ) {
+ createMemberValidator( method );
+ createChildValidator( method );
+ }
+
+ List<XProperty> fields = currClass.getDeclaredProperties(
+ "field", GET_ALL_FILTER
+ );
+ for ( XProperty field : fields ) {
+ createMemberValidator( field );
+ createChildValidator( field );
+ }
+ }
+ }
+
+ private void addSuperClassesAndInterfaces(XClass clazz, Collection<XClass> classes) {
+ for ( XClass currClass = clazz; currClass != null ; currClass = currClass.getSuperclass() ) {
+ if ( ! classes.add( currClass ) ) return;
+ XClass[] interfaces = currClass.getInterfaces();
+ for ( XClass interf : interfaces ) {
+ addSuperClassesAndInterfaces( interf, classes );
+ }
+ }
+ }
+
+ private boolean handleAggregateAnnotations(Annotation annotation, XMember member) {
+ Object[] values;
+ try {
+ Method valueMethod = annotation.getClass().getMethod( "value" );
+ if ( valueMethod.getReturnType().isArray() ) {
+ values = (Object[]) valueMethod.invoke( annotation );
+ }
+ else {
+ return false;
+ }
+ }
+ catch (NoSuchMethodException e) {
+ return false;
+ }
+ catch (Exception e) {
+ throw new IllegalStateException( e );
+ }
+
+ boolean validatorPresent = false;
+ for ( Object value : values ) {
+ if ( value instanceof Annotation ) {
+ annotation = (Annotation) value;
+ Validator validator = createValidator( annotation );
+ if ( validator != null ) {
+ if ( member != null ) {
+ //member
+ memberValidators.add( validator );
+ setAccessible( member );
+ memberGetters.add( member );
+ }
+ else {
+ //bean
+ beanValidators.add( validator );
+ }
+ validatorPresent = true;
+ }
+ }
+ }
+ return validatorPresent;
+ }
+
+ @SuppressWarnings("unchecked")
+ private void createChildValidator( XMember member) {
+ if ( member.isAnnotationPresent( Valid.class ) ) {
+ setAccessible( member );
+ childGetters.add( member );
+ XClass clazz;
+ if ( member.isCollection() || member.isArray() ) {
+ clazz = member.getElementClass();
+ }
+ else {
+ clazz = member.getType();
+ }
+ if ( !childClassValidators.containsKey( clazz ) ) {
+ //ClassValidator added by side effect (added to childClassValidators during CV construction)
+ new ClassValidator( clazz, messageBundle, userInterpolator, childClassValidators, reflectionManager );
+ }
+ }
+ }
+
+ private void createMemberValidator(XMember member) {
+ boolean validatorPresent = false;
+ Annotation[] memberAnnotations = member.getAnnotations();
+ for ( Annotation methodAnnotation : memberAnnotations ) {
+ Validator propertyValidator = createValidator( methodAnnotation );
+ if ( propertyValidator != null ) {
+ memberValidators.add( propertyValidator );
+ setAccessible( member );
+ memberGetters.add( member );
+ validatorPresent = true;
+ }
+ boolean agrValidPresent = handleAggregateAnnotations( methodAnnotation, member );
+ validatorPresent = validatorPresent || agrValidPresent;
+ }
+ if ( validatorPresent && !member.isTypeResolved() ) {
+ log.warn( "Original type of property " + member + " is unbound and has been approximated." );
+ }
+ }
+
+ private static void setAccessible(XMember member) {
+ if ( !Modifier.isPublic( member.getModifiers() ) ) {
+ member.setAccessible( true );
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private Validator createValidator(Annotation annotation) {
+ try {
+ ValidatorClass validatorClass = annotation.annotationType().getAnnotation( ValidatorClass.class );
+ if ( validatorClass == null ) {
+ return null;
+ }
+ Validator beanValidator = validatorClass.value().newInstance();
+ beanValidator.initialize( annotation );
+ defaultInterpolator.addInterpolator( annotation, beanValidator );
+ return beanValidator;
+ }
+ catch (Exception e) {
+ throw new IllegalArgumentException( "could not instantiate ClassValidator", e );
+ }
+ }
+
+ public boolean hasValidationRules() {
+ return beanValidators.size() != 0 || memberValidators.size() != 0;
+ }
+
+ /**
+ * apply constraints on a bean instance and return all the failures.
+ * if <code>bean</code> is null, an empty array is returned
+ */
+ public InvalidValue[] getInvalidValues(T bean) {
+ return this.getInvalidValues( bean, new IdentitySet() );
+ }
+
+ /**
+ * apply constraints on a bean instance and return all the failures.
+ * if <code>bean</code> is null, an empty array is returned
+ */
+ @SuppressWarnings("unchecked")
+ protected InvalidValue[] getInvalidValues(T bean, Set<Object> circularityState) {
+ if ( bean == null || circularityState.contains( bean ) ) {
+ return EMPTY_INVALID_VALUE_ARRAY; //Avoid circularity
+ }
+ else {
+ circularityState.add( bean );
+ }
+
+ if ( !beanClass.isInstance( bean ) ) {
+ throw new IllegalArgumentException( "not an instance of: " + bean.getClass() );
+ }
+
+ List<InvalidValue> results = new ArrayList<InvalidValue>();
+
+ for ( int i = 0; i < beanValidators.size() ; i++ ) {
+ Validator validator = beanValidators.get( i );
+ if ( !validator.isValid( bean ) ) {
+ results.add( new InvalidValue( interpolate(validator), beanClass, null, bean, bean ) );
+ }
+ }
+
+ for ( int i = 0; i < memberValidators.size() ; i++ ) {
+ XMember getter = memberGetters.get( i );
+ if ( Hibernate.isPropertyInitialized( bean, getPropertyName( getter ) ) ) {
+ Object value = getMemberValue( bean, getter );
+ Validator validator = memberValidators.get( i );
+ if ( !validator.isValid( value ) ) {
+ String propertyName = getPropertyName( getter );
+ results.add( new InvalidValue( interpolate(validator), beanClass, propertyName, value, bean ) );
+ }
+ }
+ }
+
+ for ( int i = 0; i < childGetters.size() ; i++ ) {
+ XMember getter = childGetters.get( i );
+ if ( Hibernate.isPropertyInitialized( bean, getPropertyName( getter ) ) ) {
+ Object value = getMemberValue( bean, getter );
+ if ( value != null && Hibernate.isInitialized( value ) ) {
+ String propertyName = getPropertyName( getter );
+ if ( getter.isCollection() ) {
+ int index = 0;
+ boolean isIterable = value instanceof Iterable;
+ Map map = ! isIterable ? (Map) value : null;
+ Iterable elements = isIterable ?
+ (Iterable) value :
+ map.keySet();
+ for ( Object element : elements ) {
+ Object actualElement = isIterable ? element : map.get( element );
+ if ( actualElement == null ) {
+ index++;
+ continue;
+ }
+ InvalidValue[] invalidValues = getClassValidator( actualElement )
+ .getInvalidValues( actualElement, circularityState );
+
+ String indexedPropName = MessageFormat.format(
+ "{0}[{1}]",
+ propertyName,
+ INDEXABLE_CLASS.contains( element.getClass() ) ?
+ ( "'" + element + "'" ) :
+ index
+ );
+ index++;
+
+ for ( InvalidValue invalidValue : invalidValues ) {
+ invalidValue.addParentBean( bean, indexedPropName );
+ results.add( invalidValue );
+ }
+ }
+ }
+ if ( getter.isArray() ) {
+ int index = 0;
+ for ( Object element : (Object[]) value ) {
+ if ( element == null ) {
+ index++;
+ continue;
+ }
+ InvalidValue[] invalidValues = getClassValidator( element )
+ .getInvalidValues( element, circularityState );
+
+ String indexedPropName = MessageFormat.format(
+ "{0}[{1}]",
+ propertyName,
+ index
+ );
+ index++;
+
+ for ( InvalidValue invalidValue : invalidValues ) {
+ invalidValue.addParentBean( bean, indexedPropName );
+ results.add( invalidValue );
+ }
+ }
+ }
+ else {
+ InvalidValue[] invalidValues = getClassValidator( value )
+ .getInvalidValues( value, circularityState );
+ for ( InvalidValue invalidValue : invalidValues ) {
+ invalidValue.addParentBean( bean, propertyName );
+ results.add( invalidValue );
+ }
+ }
+ }
+ }
+ }
+
+ return results.toArray( new InvalidValue[results.size()] );
+ }
+
+ private String interpolate(Validator validator) {
+ String message = defaultInterpolator.getAnnotationMessage( validator );
+ if (userInterpolator != null) {
+ return userInterpolator.interpolate( message, validator, defaultInterpolator );
+ }
+ else {
+ return defaultInterpolator.interpolate( message, validator, null);
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private ClassValidator getClassValidator(Object value) {
+ Class clazz = value.getClass();
+ ClassValidator validator = childClassValidators.get( reflectionManager.toXClass( clazz ) );
+ if ( validator == null ) { //handles polymorphism
+ validator = new ClassValidator( clazz );
+ }
+ return validator;
+ }
+
+ /**
+ * Apply constraints of a particular property on a bean instance and return all the failures.
+ * Note this is not recursive.
+ */
+ //TODO should it be recursive?
+ public InvalidValue[] getInvalidValues(T bean, String propertyName) {
+ List<InvalidValue> results = new ArrayList<InvalidValue>();
+
+ for ( int i = 0; i < memberValidators.size() ; i++ ) {
+ XMember getter = memberGetters.get( i );
+ if ( getPropertyName( getter ).equals( propertyName ) ) {
+ Object value = getMemberValue( bean, getter );
+ Validator validator = memberValidators.get( i );
+ if ( !validator.isValid( value ) ) {
+ results.add( new InvalidValue( interpolate(validator), beanClass, propertyName, value, bean ) );
+ }
+ }
+ }
+
+ return results.toArray( new InvalidValue[results.size()] );
+ }
+
+ /**
+ * Apply constraints of a particular property value of a bean type and return all the failures.
+ * The InvalidValue objects returns return null for InvalidValue#getBean() and InvalidValue#getRootBean()
+ * Note this is not recursive.
+ */
+ //TODO should it be recursive?
+ public InvalidValue[] getPotentialInvalidValues(String propertyName, Object value) {
+ List<InvalidValue> results = new ArrayList<InvalidValue>();
+
+ for ( int i = 0; i < memberValidators.size() ; i++ ) {
+ XMember getter = memberGetters.get( i );
+ if ( getPropertyName( getter ).equals( propertyName ) ) {
+ Validator validator = memberValidators.get( i );
+ if ( !validator.isValid( value ) ) {
+ results.add( new InvalidValue( interpolate(validator), beanClass, propertyName, value, null ) );
+ }
+ }
+ }
+
+ return results.toArray( new InvalidValue[results.size()] );
+ }
+
+ private Object getMemberValue(T bean, XMember getter) {
+ Object value;
+ try {
+ value = getter.invoke( bean );
+ }
+ catch (Exception e) {
+ throw new IllegalStateException( "Could not get property value", e );
+ }
+ return value;
+ }
+
+ public String getPropertyName(XMember member) {
+ //Do no try to cache the result in a map, it's actually much slower (2.x time)
+ String propertyName;
+ if ( XProperty.class.isAssignableFrom( member.getClass() ) ) {
+ propertyName = member.getName();
+ }
+ else if ( XMethod.class.isAssignableFrom( member.getClass() ) ) {
+ propertyName = member.getName();
+ if ( propertyName.startsWith( "is" ) ) {
+ propertyName = Introspector.decapitalize( propertyName.substring( 2 ) );
+ }
+ else if ( propertyName.startsWith( "get" ) ) {
+ propertyName = Introspector.decapitalize( propertyName.substring( 3 ) );
+ }
+ //do nothing for non getter method, in case someone want to validate a PO Method
+ }
+ else {
+ throw new AssertionFailure( "Unexpected member: " + member.getClass().getName() );
+ }
+ return propertyName;
+ }
+
+ /** @deprecated */
+ private String replace(String message, Annotation parameters) {
+ StringTokenizer tokens = new StringTokenizer( message, "#{}", true );
+ StringBuilder buf = new StringBuilder( 30 );
+ boolean escaped = false;
+ boolean el = false;
+ while ( tokens.hasMoreTokens() ) {
+ String token = tokens.nextToken();
+ if ( !escaped && "#".equals( token ) ) {
+ el = true;
+ }
+ if ( !el && "{".equals( token ) ) {
+ escaped = true;
+ }
+ else if ( escaped && "}".equals( token ) ) {
+ escaped = false;
+ }
+ else if ( !escaped ) {
+ if ( "{".equals( token ) ) el = false;
+ buf.append( token );
+ }
+ else {
+ Method member;
+ try {
+ member = parameters.getClass().getMethod( token, (Class[]) null );
+ }
+ catch (NoSuchMethodException nsfme) {
+ member = null;
+ }
+ if ( member != null ) {
+ try {
+ buf.append( member.invoke( parameters ) );
+ }
+ catch (Exception e) {
+ throw new IllegalArgumentException( "could not render message", e );
+ }
+ }
+ else {
+ String string = null;
+ try {
+ string = messageBundle != null ? messageBundle.getString( token ) : null;
+ }
+ catch( MissingResourceException e ) {
+ //give a second chance with the default resource bundle
+ }
+ if (string == null) {
+ try {
+ string = defaultMessageBundle.getString( token );
+ }
+ catch( MissingResourceException e) {
+ throw new MissingResourceException(
+ "Can't find resource in validator bundles, key " + token,
+ defaultMessageBundle.getClass().getName(),
+ token
+ );
+ }
+ }
+ if ( string != null ) buf.append( replace( string, parameters ) );
+ }
+ }
+ }
+ return buf.toString();
+ }
+
+ /**
+ * apply the registred constraints rules on the hibernate metadata (to be applied on DB schema...)
+ *
+ * @param persistentClass hibernate metadata
+ */
+ public void apply(PersistentClass persistentClass) {
+
+ for ( Validator validator : beanValidators ) {
+ if ( validator instanceof PersistentClassConstraint ) {
+ ( (PersistentClassConstraint) validator ).apply( persistentClass );
+ }
+ }
+
+ Iterator<Validator> validators = memberValidators.iterator();
+ Iterator<XMember> getters = memberGetters.iterator();
+ while ( validators.hasNext() ) {
+ Validator validator = validators.next();
+ String propertyName = getPropertyName( getters.next() );
+ if ( validator instanceof PropertyConstraint ) {
+ try {
+ Property property = findPropertyByName(persistentClass, propertyName);
+ if (property != null) {
+ ( (PropertyConstraint) validator ).apply( property );
+ }
+ }
+ catch (MappingException pnfe) {
+ //do nothing
+ }
+ }
+ }
+
+ }
+
+ public void assertValid(T bean) {
+ InvalidValue[] values = getInvalidValues( bean );
+ if ( values.length > 0 ) {
+ throw new InvalidStateException( values );
+ }
+ }
+
+ private void writeObject(ObjectOutputStream oos) throws IOException {
+ ResourceBundle rb = messageBundle;
+ MessageInterpolator interpolator = this.userInterpolator;
+ if ( rb != null && ! ( rb instanceof Serializable ) ) {
+ messageBundle = null;
+ if ( ! isUserProvidedResourceBundle ) {
+ log.warn(
+ "Serializing a ClassValidator with a non serializable ResourceBundle: ResourceBundle ignored"
+ );
+ }
+ }
+ if (interpolator != null && ! (interpolator instanceof Serializable) ) {
+ userInterpolator = null;
+ log.warn( "Serializing a non serializable MessageInterpolator" );
+ }
+ oos.defaultWriteObject();
+ oos.writeObject( messageBundle );
+ oos.writeObject( userInterpolator );
+ messageBundle = rb;
+ userInterpolator = interpolator;
+ }
+
+ private void readObject(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+ ois.defaultReadObject();
+ ResourceBundle rb = (ResourceBundle) ois.readObject();
+ if ( rb == null ) rb = getDefaultResourceBundle();
+ this.messageBundle = rb;
+ this.userInterpolator = (MessageInterpolator) ois.readObject();
+ this.defaultMessageBundle = ResourceBundle.getBundle( DEFAULT_VALIDATOR_MESSAGE );
+ reflectionManager = new JavaReflectionManager();
+ initValidator( reflectionManager.toXClass( beanClass ), new HashMap<XClass, ClassValidator>() );
+ }
+
+ /**
+ * Retrieve the property by path in a recursive way, including IndetifierProperty in the loop
+ * If propertyName is null or empty, the IdentifierProperty is returned
+ */
+ public static Property findPropertyByName(PersistentClass associatedClass, String propertyName) {
+ Property property = null;
+ Property idProperty = associatedClass.getIdentifierProperty();
+ String idName = idProperty != null ? idProperty.getName() : null;
+ try {
+ if ( propertyName == null
+ || propertyName.length() == 0
+ || propertyName.equals( idName ) ) {
+ //default to id
+ property = idProperty;
+ }
+ else {
+ if ( propertyName.indexOf( idName + "." ) == 0 ) {
+ property = idProperty;
+ propertyName = propertyName.substring( idName.length() + 1 );
+ }
+ StringTokenizer st = new StringTokenizer( propertyName, ".", false );
+ while ( st.hasMoreElements() ) {
+ String element = (String) st.nextElement();
+ if ( property == null ) {
+ property = associatedClass.getProperty( element );
+ }
+ else {
+ if ( ! property.isComposite() ) return null;
+ property = ( (Component) property.getValue() ).getProperty( element );
+ }
+ }
+ }
+ }
+ catch (MappingException e) {
+ try {
+ //if we do not find it try to check the identifier mapper
+ if ( associatedClass.getIdentifierMapper() == null ) return null;
+ StringTokenizer st = new StringTokenizer( propertyName, ".", false );
+ while ( st.hasMoreElements() ) {
+ String element = (String) st.nextElement();
+ if ( property == null ) {
+ property = associatedClass.getIdentifierMapper().getProperty( element );
+ }
+ else {
+ if ( ! property.isComposite() ) return null;
+ property = ( (Component) property.getValue() ).getProperty( element );
+ }
+ }
+ }
+ catch (MappingException ee) {
+ return null;
+ }
+ }
+ return property;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumber.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumber.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumber.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * The annotated element has to represent a valid
- * credit card number. This is the Luhn algorithm implementation
- * which aims to check for user mistake, not credit card validity!
- *
- * @author Emmanuel Bernard
- */
- at Documented
- at ValidatorClass( CreditCardNumberValidator.class)
- at Target({ElementType.METHOD, ElementType.FIELD})
- at Retention( RetentionPolicy.RUNTIME )
-public @interface CreditCardNumber {
- String message() default "{validator.creditCard}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumber.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumber.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumber.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumber.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * The annotated element has to represent a valid
+ * credit card number. This is the Luhn algorithm implementation
+ * which aims to check for user mistake, not credit card validity!
+ *
+ * @author Emmanuel Bernard
+ */
+ at Documented
+ at ValidatorClass( CreditCardNumberValidator.class)
+ at Target({ElementType.METHOD, ElementType.FIELD})
+ at Retention( RetentionPolicy.RUNTIME )
+public @interface CreditCardNumber {
+ String message() default "{validator.creditCard}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumberValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumberValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumberValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import java.io.Serializable;
-
-/**
- * Check a credit card number through the Luhn algorithm
- *
- * @author Emmanuel Bernard
- */
-public class CreditCardNumberValidator extends AbstractLuhnValidator implements Validator<CreditCardNumber>, Serializable {
-
- public void initialize(CreditCardNumber parameters) {
- }
-
- int multiplicator() {
- return 2;
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumberValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumberValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumberValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/CreditCardNumberValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.io.Serializable;
+
+/**
+ * Check a credit card number through the Luhn algorithm
+ *
+ * @author Emmanuel Bernard
+ */
+public class CreditCardNumberValidator extends AbstractLuhnValidator implements Validator<CreditCardNumber>, Serializable {
+
+ public void initialize(CreditCardNumber parameters) {
+ }
+
+ int multiplicator() {
+ return 2;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Digits.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Digits.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Digits.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Target;
-import java.lang.annotation.Documented;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Check that a given number has <code>integerDigits</code> integer digits
- * and <code>fractionalDigits</code> fractional digits
- * The constraints are defined at the database level too
- *
- * @author Norman Richards
- */
- at ValidatorClass(DigitsValidator.class)
- at Target({ElementType.METHOD, ElementType.FIELD})
- at Retention( RetentionPolicy.RUNTIME)
- at Documented
-public @interface Digits {
- int integerDigits();
- int fractionalDigits() default 0;
- String message() default "{validator.digits}";
-}
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Digits.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Digits.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Digits.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Digits.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+import java.lang.annotation.Documented;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Check that a given number has <code>integerDigits</code> integer digits
+ * and <code>fractionalDigits</code> fractional digits
+ * The constraints are defined at the database level too
+ *
+ * @author Norman Richards
+ */
+ at ValidatorClass(DigitsValidator.class)
+ at Target({ElementType.METHOD, ElementType.FIELD})
+ at Retention( RetentionPolicy.RUNTIME)
+ at Documented
+public @interface Digits {
+ int integerDigits();
+ int fractionalDigits() default 0;
+ String message() default "{validator.digits}";
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/DigitsValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/DigitsValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/DigitsValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,84 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.Column;
-
-/**
- * Validate a Digit to check if it matches the according pattern
- *
- * @author Norman Richards
- * @author Emmanuel Bernard
- */
-public class DigitsValidator implements Validator<Digits>, PropertyConstraint {
- int integerDigits;
- int fractionalDigits;
-
- public void initialize(Digits configuration) {
- integerDigits = configuration.integerDigits();
- fractionalDigits = configuration.fractionalDigits();
- }
-
- public boolean isValid(Object value) {
- if ( value == null ) {
- return true;
- }
-
- String stringValue = null;
-
- if ( value instanceof String ) {
- try {
- stringValue = stringValue( new BigDecimal( (String) value ) );
- }
- catch (NumberFormatException nfe) {
- return false;
- }
- }
- else if ( value instanceof BigDecimal ) {
- stringValue = stringValue( (BigDecimal) value );
- }
- else if ( value instanceof BigInteger ) {
- stringValue = stringValue( (BigInteger) value );
- }
- else if ( value instanceof Number ) {
- //yukky
- stringValue = stringValue( new BigDecimal( ( (Number) value ).toString() ) );
- }
- else {
- return false;
- }
-
- int pos = stringValue.indexOf( "." );
-
- int left = ( pos == -1 ) ?
- stringValue.length() :
- pos;
- int right = ( pos == -1 ) ?
- 0 :
- stringValue.length() - pos - 1;
-
- if ( left == 1 && stringValue.charAt( 0 ) == '0' ) {
- left--;
- }
-
- return !( left > integerDigits || right > fractionalDigits );
-
- }
-
- private String stringValue(BigDecimal number) {
- return number.abs().stripTrailingZeros().toPlainString();
- }
-
- private String stringValue(BigInteger number) {
- return number.abs().toString();
- }
-
- public void apply(Property property) {
- Column col = (Column) property.getColumnIterator().next();
- col.setPrecision( integerDigits + fractionalDigits );
- col.setScale( fractionalDigits );
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/DigitsValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/DigitsValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/DigitsValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/DigitsValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,84 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.Column;
+
+/**
+ * Validate a Digit to check if it matches the according pattern
+ *
+ * @author Norman Richards
+ * @author Emmanuel Bernard
+ */
+public class DigitsValidator implements Validator<Digits>, PropertyConstraint {
+ int integerDigits;
+ int fractionalDigits;
+
+ public void initialize(Digits configuration) {
+ integerDigits = configuration.integerDigits();
+ fractionalDigits = configuration.fractionalDigits();
+ }
+
+ public boolean isValid(Object value) {
+ if ( value == null ) {
+ return true;
+ }
+
+ String stringValue = null;
+
+ if ( value instanceof String ) {
+ try {
+ stringValue = stringValue( new BigDecimal( (String) value ) );
+ }
+ catch (NumberFormatException nfe) {
+ return false;
+ }
+ }
+ else if ( value instanceof BigDecimal ) {
+ stringValue = stringValue( (BigDecimal) value );
+ }
+ else if ( value instanceof BigInteger ) {
+ stringValue = stringValue( (BigInteger) value );
+ }
+ else if ( value instanceof Number ) {
+ //yukky
+ stringValue = stringValue( new BigDecimal( ( (Number) value ).toString() ) );
+ }
+ else {
+ return false;
+ }
+
+ int pos = stringValue.indexOf( "." );
+
+ int left = ( pos == -1 ) ?
+ stringValue.length() :
+ pos;
+ int right = ( pos == -1 ) ?
+ 0 :
+ stringValue.length() - pos - 1;
+
+ if ( left == 1 && stringValue.charAt( 0 ) == '0' ) {
+ left--;
+ }
+
+ return !( left > integerDigits || right > fractionalDigits );
+
+ }
+
+ private String stringValue(BigDecimal number) {
+ return number.abs().stripTrailingZeros().toPlainString();
+ }
+
+ private String stringValue(BigInteger number) {
+ return number.abs().toString();
+ }
+
+ public void apply(Property property) {
+ Column col = (Column) property.getColumnIterator().next();
+ col.setPrecision( integerDigits + fractionalDigits );
+ col.setScale( fractionalDigits );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/EAN.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/EAN.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/EAN.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Target;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * The annotated element has to represent an EAN-13 or UPC-A
- *
- * which aims to check for user mistake, not actual number validity!
- *
- * @author Emmanuel Bernard
- */
- at Documented
- at ValidatorClass( EANValidator.class)
- at Target({ElementType.METHOD, ElementType.FIELD})
- at Retention( RetentionPolicy.RUNTIME )
-public @interface EAN {
- String message() default "{validator.ean}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/EAN.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/EAN.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/EAN.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/EAN.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Target;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * The annotated element has to represent an EAN-13 or UPC-A
+ *
+ * which aims to check for user mistake, not actual number validity!
+ *
+ * @author Emmanuel Bernard
+ */
+ at Documented
+ at ValidatorClass( EANValidator.class)
+ at Target({ElementType.METHOD, ElementType.FIELD})
+ at Retention( RetentionPolicy.RUNTIME )
+public @interface EAN {
+ String message() default "{validator.ean}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/EANValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/EANValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/EANValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import java.util.List;
-import java.util.ArrayList;
-
-/**
- * Validate EAN13 and UPC-A
- *
- * @author Emmanuel Bernard
- */
-public class EANValidator implements Validator<EAN> {
-
- public void initialize(EAN parameters) {
- }
-
-
- public boolean isValid(Object value) {
- if (value == null) return true;
- if ( ! ( value instanceof String) ) return false;
- String creditCard = (String) value;
- char[] chars = creditCard.toCharArray();
-
- List<Integer> ints = new ArrayList<Integer>();
- for (char c : chars) {
- if ( Character.isDigit( c ) ) ints.add( c - '0' );
- }
- int length = ints.size();
- int sum = 0;
- boolean even = false;
- for ( int index = length - 1 ; index >= 0 ; index-- ) {
- int digit = ints.get(index);
- if (even) {
- digit *= 3;
- }
- sum+= digit;
- even = !even;
- }
- return sum % 10 == 0;
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/EANValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/EANValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/EANValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/EANValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * Validate EAN13 and UPC-A
+ *
+ * @author Emmanuel Bernard
+ */
+public class EANValidator implements Validator<EAN> {
+
+ public void initialize(EAN parameters) {
+ }
+
+
+ public boolean isValid(Object value) {
+ if (value == null) return true;
+ if ( ! ( value instanceof String) ) return false;
+ String creditCard = (String) value;
+ char[] chars = creditCard.toCharArray();
+
+ List<Integer> ints = new ArrayList<Integer>();
+ for (char c : chars) {
+ if ( Character.isDigit( c ) ) ints.add( c - '0' );
+ }
+ int length = ints.size();
+ int sum = 0;
+ boolean even = false;
+ for ( int index = length - 1 ; index >= 0 ; index-- ) {
+ int digit = ints.get(index);
+ if (even) {
+ digit *= 3;
+ }
+ sum+= digit;
+ even = !even;
+ }
+ return sum % 10 == 0;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Email.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Email.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Email.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * The string has to be a well-formed email address
- *
- * @author Emmanuel Bernard
- */
- at Documented
- at ValidatorClass(EmailValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Email {
- String message() default "{validator.email}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Email.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Email.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Email.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Email.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * The string has to be a well-formed email address
+ *
+ * @author Emmanuel Bernard
+ */
+ at Documented
+ at ValidatorClass(EmailValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Email {
+ String message() default "{validator.email}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/EmailValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/EmailValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/EmailValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-import java.util.regex.Matcher;
-
-/**
- * Check that a given string is a well-formed email address
- *
- * @author Emmanuel Bernard
- */
-public class EmailValidator implements Validator<Email>, Serializable {
- private static String ATOM = "[^\\x00-\\x1F^\\(^\\)^\\<^\\>^\\@^\\,^\\(;^\\:^\\\\^\\\"^\\.^\\[^\\]^\\s]";
- private static String DOMAIN = "(" + ATOM + "+(\\." + ATOM + "+)*";
- private static String IP_DOMAIN = "\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\]";
-
- private java.util.regex.Pattern pattern;
-
- public boolean isValid(Object value) {
- if ( value == null ) return true;
- if ( !( value instanceof String ) ) return false;
- String string = (String) value;
- if ( string.length() == 0 ) return true;
- Matcher m = pattern.matcher( string );
- return m.matches();
- }
-
- public void initialize(Email parameters) {
- pattern = java.util.regex.Pattern.compile(
- "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*$",
- java.util.regex.Pattern.CASE_INSENSITIVE
- );
- pattern = java.util.regex.Pattern.compile(
- "^" + ATOM + "+(\\." + ATOM + "+)*@"
- + DOMAIN
- + "|"
- + IP_DOMAIN
- + ")$",
- java.util.regex.Pattern.CASE_INSENSITIVE
- );
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/EmailValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/EmailValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/EmailValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/EmailValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+import java.util.regex.Matcher;
+
+/**
+ * Check that a given string is a well-formed email address
+ *
+ * @author Emmanuel Bernard
+ */
+public class EmailValidator implements Validator<Email>, Serializable {
+ private static String ATOM = "[^\\x00-\\x1F^\\(^\\)^\\<^\\>^\\@^\\,^\\(;^\\:^\\\\^\\\"^\\.^\\[^\\]^\\s]";
+ private static String DOMAIN = "(" + ATOM + "+(\\." + ATOM + "+)*";
+ private static String IP_DOMAIN = "\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\]";
+
+ private java.util.regex.Pattern pattern;
+
+ public boolean isValid(Object value) {
+ if ( value == null ) return true;
+ if ( !( value instanceof String ) ) return false;
+ String string = (String) value;
+ if ( string.length() == 0 ) return true;
+ Matcher m = pattern.matcher( string );
+ return m.matches();
+ }
+
+ public void initialize(Email parameters) {
+ pattern = java.util.regex.Pattern.compile(
+ "^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9-]+(\\.[A-Za-z0-9-]+)*$",
+ java.util.regex.Pattern.CASE_INSENSITIVE
+ );
+ pattern = java.util.regex.Pattern.compile(
+ "^" + ATOM + "+(\\." + ATOM + "+)*@"
+ + DOMAIN
+ + "|"
+ + IP_DOMAIN
+ + ")$",
+ java.util.regex.Pattern.CASE_INSENSITIVE
+ );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-/**
- * Hibernate Validator Event properties
- * The properties are retrieved from Hibernate
- * (hibernate.properties, hibernate.cfg.xml, persistence.xml or Configuration API)
- *
- * @author Emmanuel Bernard
- */
-public class Environment {
- /**
- * Message interpolator class used. The same instance is shared across all ClassValidators
- */
- public static final String MESSAGE_INTERPOLATOR_CLASS = "hibernate.validator.message_interpolator_class";
-
- /**
- * Apply DDL changes on Hibernate metamodel when using validator with Hibernate Annotations. Default to true.
- */
- public static final String APPLY_TO_DDL = "hibernate.validator.apply_to_ddl";
-
- /**
- * Enable listeners auto registration in Hibernate Annotations and EntityManager. Default to true.
- */
- public static final String AUTOREGISTER_LISTENERS = "hibernate.validator.autoregister_listeners";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Environment.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id: $
+package org.hibernate.validator;
+
+/**
+ * Hibernate Validator Event properties
+ * The properties are retrieved from Hibernate
+ * (hibernate.properties, hibernate.cfg.xml, persistence.xml or Configuration API)
+ *
+ * @author Emmanuel Bernard
+ */
+public class Environment {
+ /**
+ * Message interpolator class used. The same instance is shared across all ClassValidators
+ */
+ public static final String MESSAGE_INTERPOLATOR_CLASS = "hibernate.validator.message_interpolator_class";
+
+ /**
+ * Apply DDL changes on Hibernate metamodel when using validator with Hibernate Annotations. Default to true.
+ */
+ public static final String APPLY_TO_DDL = "hibernate.validator.apply_to_ddl";
+
+ /**
+ * Enable listeners auto registration in Hibernate Annotations and EntityManager. Default to true.
+ */
+ public static final String AUTOREGISTER_LISTENERS = "hibernate.validator.autoregister_listeners";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Future.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Future.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Future.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Check that a Date, a Calendar, or a string representation apply in the future
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(FutureValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Future {
- String message() default "{validator.future}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Future.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Future.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Future.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Future.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Check that a Date, a Calendar, or a string representation apply in the future
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(FutureValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Future {
+ String message() default "{validator.future}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/FutureValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/FutureValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/FutureValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,35 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.util.Calendar;
-import java.util.Date;
-
-/**
- * Check that a given date is in the future, and apply the same restriction
- * at the DB level
- *
- * @author Emmanuel Bernard
- */
-public class FutureValidator implements Validator<Future>, Serializable {
-
- public void initialize(Future parameters) {
- }
-
- public boolean isValid(Object value) {
- if ( value == null ) return true;
- if ( value instanceof Date ) {
- Date date = (Date) value;
- return date.after( new Date() );
- }
- else if ( value instanceof Calendar ) {
- Calendar cal = (Calendar) value;
- return cal.after( Calendar.getInstance() );
- }
- else {
- return false;
- }
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/FutureValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/FutureValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/FutureValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/FutureValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,35 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+
+/**
+ * Check that a given date is in the future, and apply the same restriction
+ * at the DB level
+ *
+ * @author Emmanuel Bernard
+ */
+public class FutureValidator implements Validator<Future>, Serializable {
+
+ public void initialize(Future parameters) {
+ }
+
+ public boolean isValid(Object value) {
+ if ( value == null ) return true;
+ if ( value instanceof Date ) {
+ Date date = (Date) value;
+ return date.after( new Date() );
+ }
+ else if ( value instanceof Calendar ) {
+ Calendar cal = (Calendar) value;
+ return cal.after( Calendar.getInstance() );
+ }
+ else {
+ return false;
+ }
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidStateException.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/InvalidStateException.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidStateException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-/**
- * Thrown when the bean has violated one or several of its constraints
- * You can get the violation details in getInvalidValues()
- *
- * @author Gavin King
- */
-public class InvalidStateException extends RuntimeException {
-
- private final InvalidValue[] invalidValues;
-
- public InvalidStateException(InvalidValue[] invalidValues) {
- this( invalidValues, invalidValues[0].getBeanClass().getName() );
- }
-
- public InvalidStateException(InvalidValue[] invalidValues, String className) {
- super( "validation failed for: " + className );
- this.invalidValues = invalidValues;
- }
-
- public InvalidValue[] getInvalidValues() {
- return invalidValues;
- }
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidStateException.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/InvalidStateException.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidStateException.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidStateException.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id$
+package org.hibernate.validator;
+
+/**
+ * Thrown when the bean has violated one or several of its constraints
+ * You can get the violation details in getInvalidValues()
+ *
+ * @author Gavin King
+ */
+public class InvalidStateException extends RuntimeException {
+
+ private final InvalidValue[] invalidValues;
+
+ public InvalidStateException(InvalidValue[] invalidValues) {
+ this( invalidValues, invalidValues[0].getBeanClass().getName() );
+ }
+
+ public InvalidStateException(InvalidValue[] invalidValues, String className) {
+ super( "validation failed for: " + className );
+ this.invalidValues = invalidValues;
+ }
+
+ public InvalidValue[] getInvalidValues() {
+ return invalidValues;
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidValue.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/InvalidValue.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidValue.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,68 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-
-/**
- * A single violation of a class level or method level constraint.
- *
- * @author Gavin King
- */
-public class InvalidValue implements Serializable {
- private final String message;
- private final Object value;
- private final String propertyName;
- private final Class beanClass;
- private final Object bean;
- private Object rootBean;
-
- public Object getRootBean() {
- return rootBean;
- }
-
- public String getPropertyPath() {
- return propertyPath;
- }
-
- private String propertyPath;
-
- public InvalidValue(String message, Class beanClass, String propertyName, Object value, Object bean) {
- this.message = message;
- this.value = value;
- this.beanClass = beanClass;
- this.propertyName = propertyName;
- this.bean = bean;
- this.rootBean = bean;
- this.propertyPath = propertyName;
- }
-
- public void addParentBean(Object parentBean, String propertyName) {
- this.rootBean = parentBean;
- this.propertyPath = propertyName + "." + this.propertyPath;
- }
-
- public Class getBeanClass() {
- return beanClass;
- }
-
- public String getMessage() {
- return message;
- }
-
- public String getPropertyName() {
- return propertyName;
- }
-
- public Object getValue() {
- return value;
- }
-
- public Object getBean() {
- return bean;
- }
-
- public String toString() {
- return propertyName + ' ' + message;
- }
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidValue.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/InvalidValue.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidValue.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/InvalidValue.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,68 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+
+/**
+ * A single violation of a class level or method level constraint.
+ *
+ * @author Gavin King
+ */
+public class InvalidValue implements Serializable {
+ private final String message;
+ private final Object value;
+ private final String propertyName;
+ private final Class beanClass;
+ private final Object bean;
+ private Object rootBean;
+
+ public Object getRootBean() {
+ return rootBean;
+ }
+
+ public String getPropertyPath() {
+ return propertyPath;
+ }
+
+ private String propertyPath;
+
+ public InvalidValue(String message, Class beanClass, String propertyName, Object value, Object bean) {
+ this.message = message;
+ this.value = value;
+ this.beanClass = beanClass;
+ this.propertyName = propertyName;
+ this.bean = bean;
+ this.rootBean = bean;
+ this.propertyPath = propertyName;
+ }
+
+ public void addParentBean(Object parentBean, String propertyName) {
+ this.rootBean = parentBean;
+ this.propertyPath = propertyName + "." + this.propertyPath;
+ }
+
+ public Class getBeanClass() {
+ return beanClass;
+ }
+
+ public String getMessage() {
+ return message;
+ }
+
+ public String getPropertyName() {
+ return propertyName;
+ }
+
+ public Object getValue() {
+ return value;
+ }
+
+ public Object getBean() {
+ return bean;
+ }
+
+ public String toString() {
+ return propertyName + ' ' + message;
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Length.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Length.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Length.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Apply some length restrictions to the annotated element. It has to be a string
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(LengthValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Length {
- int max() default Integer.MAX_VALUE;
-
- int min() default 0;
-
- String message() default "{validator.length}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Length.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Length.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Length.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Length.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Apply some length restrictions to the annotated element. It has to be a string
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(LengthValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Length {
+ int max() default Integer.MAX_VALUE;
+
+ int min() default 0;
+
+ String message() default "{validator.length}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/LengthValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/LengthValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/LengthValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Property;
-
-/**
- * Do check a length restriction on a string, and apply expected contraints on hibernate metadata.
- *
- * @author Gavin King
- */
-public class LengthValidator implements Validator<Length>, PropertyConstraint, Serializable {
- private int max;
- private int min;
-
- public void initialize(Length parameters) {
- max = parameters.max();
- min = parameters.min();
- }
-
- public boolean isValid(Object value) {
- if ( value == null ) return true;
- if ( !( value instanceof String ) ) return false;
- String string = (String) value;
- int length = string.length();
- return length >= min && length <= max;
- }
-
- public void apply(Property property) {
- Column col = (Column) property.getColumnIterator().next();
- if ( max < Integer.MAX_VALUE ) col.setLength( max );
- }
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/LengthValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/LengthValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/LengthValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/LengthValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Property;
+
+/**
+ * Do check a length restriction on a string, and apply expected contraints on hibernate metadata.
+ *
+ * @author Gavin King
+ */
+public class LengthValidator implements Validator<Length>, PropertyConstraint, Serializable {
+ private int max;
+ private int min;
+
+ public void initialize(Length parameters) {
+ max = parameters.max();
+ min = parameters.min();
+ }
+
+ public boolean isValid(Object value) {
+ if ( value == null ) return true;
+ if ( !( value instanceof String ) ) return false;
+ String string = (String) value;
+ int length = string.length();
+ return length >= min && length <= max;
+ }
+
+ public void apply(Property property) {
+ Column col = (Column) property.getColumnIterator().next();
+ if ( max < Integer.MAX_VALUE ) col.setLength( max );
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Max.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Max.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Max.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * max restriction on a numeric annotated element
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(MaxValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Max {
- long value();
-
- String message() default "{validator.max}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Max.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Max.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Max.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Max.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * max restriction on a numeric annotated element
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(MaxValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Max {
+ long value();
+
+ String message() default "{validator.max}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/MaxValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/MaxValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/MaxValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Property;
-
-/**
- * Do check a max restriction on a numeric (whether and actual number or its string representation,
- * and apply expected contraints on hibernate metadata.
- *
- * @author Gavin King
- */
-public class MaxValidator implements Validator<Max>, PropertyConstraint, Serializable {
-
- private long max;
-
- public void initialize(Max parameters) {
- max = parameters.value();
- }
-
- public boolean isValid(Object value) {
- if ( value == null ) return true;
- if ( value instanceof String ) {
- try {
- return new BigDecimal( (String) value ).compareTo( BigDecimal.valueOf( max ) ) <= 0;
- }
- catch (NumberFormatException nfe) {
- return false;
- }
- }
- else if ( ( value instanceof Double ) || ( value instanceof Float ) ) {
- double dv = ( (Number) value ).doubleValue();
- return dv <= max;
- }
- else if ( value instanceof BigInteger ) {
- return ( (BigInteger) value ).compareTo( BigInteger.valueOf( max ) ) <= 0;
- }
- else if ( value instanceof BigDecimal ) {
- return ( (BigDecimal) value ).compareTo( BigDecimal.valueOf( max ) ) <= 0;
- }
- else if ( value instanceof Number ) {
- long lv = ( (Number) value ).longValue();
- return lv <= max;
- }
- else {
- return false;
- }
- }
-
- public void apply(Property property) {
- Column col = (Column) property.getColumnIterator().next();
- col.setCheckConstraint( col.getName() + "<=" + max );
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/MaxValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/MaxValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/MaxValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/MaxValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Property;
+
+/**
+ * Do check a max restriction on a numeric (whether and actual number or its string representation,
+ * and apply expected contraints on hibernate metadata.
+ *
+ * @author Gavin King
+ */
+public class MaxValidator implements Validator<Max>, PropertyConstraint, Serializable {
+
+ private long max;
+
+ public void initialize(Max parameters) {
+ max = parameters.value();
+ }
+
+ public boolean isValid(Object value) {
+ if ( value == null ) return true;
+ if ( value instanceof String ) {
+ try {
+ return new BigDecimal( (String) value ).compareTo( BigDecimal.valueOf( max ) ) <= 0;
+ }
+ catch (NumberFormatException nfe) {
+ return false;
+ }
+ }
+ else if ( ( value instanceof Double ) || ( value instanceof Float ) ) {
+ double dv = ( (Number) value ).doubleValue();
+ return dv <= max;
+ }
+ else if ( value instanceof BigInteger ) {
+ return ( (BigInteger) value ).compareTo( BigInteger.valueOf( max ) ) <= 0;
+ }
+ else if ( value instanceof BigDecimal ) {
+ return ( (BigDecimal) value ).compareTo( BigDecimal.valueOf( max ) ) <= 0;
+ }
+ else if ( value instanceof Number ) {
+ long lv = ( (Number) value ).longValue();
+ return lv <= max;
+ }
+ else {
+ return false;
+ }
+ }
+
+ public void apply(Property property) {
+ Column col = (Column) property.getColumnIterator().next();
+ col.setCheckConstraint( col.getName() + "<=" + max );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/MessageInterpolator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/MessageInterpolator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/MessageInterpolator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-/**
- * Responsible for validator message interpolation (variable replacement etc)
- * this extension point is useful if the call has some contextual informations to
- * interpolate in validator messages
- *
- * @author Emmanuel Bernard
- */
-public interface MessageInterpolator {
- /**
- * Interpolate a given validator message.
- * The implementation is free to delegate to the default interpolator or not.
- */
- String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator);
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/MessageInterpolator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/MessageInterpolator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/MessageInterpolator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/MessageInterpolator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.validator;
+
+/**
+ * Responsible for validator message interpolation (variable replacement etc)
+ * this extension point is useful if the call has some contextual informations to
+ * interpolate in validator messages
+ *
+ * @author Emmanuel Bernard
+ */
+public interface MessageInterpolator {
+ /**
+ * Interpolate a given validator message.
+ * The implementation is free to delegate to the default interpolator or not.
+ */
+ String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator);
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Min.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Min.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Min.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,24 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * min restriction on a numeric annotated elemnt (or the string representation of a numeric)
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(MinValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Min {
- long value();
-
- String message() default "{validator.min}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Min.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Min.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Min.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Min.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,24 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * min restriction on a numeric annotated elemnt (or the string representation of a numeric)
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(MinValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Min {
+ long value();
+
+ String message() default "{validator.min}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/MinValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/MinValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/MinValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,58 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Property;
-
-/**
- * Do check a min restriction on a numeric (whether and actual number or its string representation,
- * and apply expected contraints on hibernate metadata.
- *
- * @author Gavin King
- */
-public class MinValidator implements Validator<Min>, PropertyConstraint, Serializable {
-
- private long min;
-
- public void initialize(Min parameters) {
- min = parameters.value();
- }
-
- public boolean isValid(Object value) {
- if ( value == null ) return true;
- if ( value instanceof String ) {
- try {
- return new BigDecimal( (String) value ).compareTo( BigDecimal.valueOf(min) ) >= 0;
- }
- catch (NumberFormatException nfe) {
- return false;
- }
- }
- else if ( ( value instanceof Double ) || ( value instanceof Float ) ) {
- double dv = ( (Number) value ).doubleValue();
- return dv >= min;
- }
- else if ( value instanceof BigInteger ) {
- return ( (BigInteger) value ).compareTo( BigInteger.valueOf( min ) ) >= 0;
- }
- else if ( value instanceof BigDecimal ) {
- return ( (BigDecimal) value ).compareTo( BigDecimal.valueOf( min ) ) >= 0;
- }
- else if ( value instanceof Number ) {
- long lv = ( (Number) value ).longValue();
- return lv >= min;
- }
- else {
- return false;
- }
- }
-
- public void apply(Property property) {
- Column col = (Column) property.getColumnIterator().next();
- col.setCheckConstraint( col.getName() + ">=" + min );
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/MinValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/MinValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/MinValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/MinValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,58 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Property;
+
+/**
+ * Do check a min restriction on a numeric (whether and actual number or its string representation,
+ * and apply expected contraints on hibernate metadata.
+ *
+ * @author Gavin King
+ */
+public class MinValidator implements Validator<Min>, PropertyConstraint, Serializable {
+
+ private long min;
+
+ public void initialize(Min parameters) {
+ min = parameters.value();
+ }
+
+ public boolean isValid(Object value) {
+ if ( value == null ) return true;
+ if ( value instanceof String ) {
+ try {
+ return new BigDecimal( (String) value ).compareTo( BigDecimal.valueOf(min) ) >= 0;
+ }
+ catch (NumberFormatException nfe) {
+ return false;
+ }
+ }
+ else if ( ( value instanceof Double ) || ( value instanceof Float ) ) {
+ double dv = ( (Number) value ).doubleValue();
+ return dv >= min;
+ }
+ else if ( value instanceof BigInteger ) {
+ return ( (BigInteger) value ).compareTo( BigInteger.valueOf( min ) ) >= 0;
+ }
+ else if ( value instanceof BigDecimal ) {
+ return ( (BigDecimal) value ).compareTo( BigDecimal.valueOf( min ) ) >= 0;
+ }
+ else if ( value instanceof Number ) {
+ long lv = ( (Number) value ).longValue();
+ return lv >= min;
+ }
+ else {
+ return false;
+ }
+ }
+
+ public void apply(Property property) {
+ Column col = (Column) property.getColumnIterator().next();
+ col.setCheckConstraint( col.getName() + ">=" + min );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmpty.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/NotEmpty.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmpty.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Check that a String is not empty (not null and length > 0)
- * or that a Collection (or array) is not empty (not null and length > 0)
- *
- * @author Emmanuel Bernard
- */
- at Documented
- at ValidatorClass(NotEmptyValidator.class)
- at Target({ElementType.METHOD, ElementType.FIELD})
- at Retention( RetentionPolicy.RUNTIME )
-public @interface NotEmpty {
- String message() default "{validator.notEmpty}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmpty.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/NotEmpty.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmpty.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmpty.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * Check that a String is not empty (not null and length > 0)
+ * or that a Collection (or array) is not empty (not null and length > 0)
+ *
+ * @author Emmanuel Bernard
+ */
+ at Documented
+ at ValidatorClass(NotEmptyValidator.class)
+ at Target({ElementType.METHOD, ElementType.FIELD})
+ at Retention( RetentionPolicy.RUNTIME )
+public @interface NotEmpty {
+ String message() default "{validator.notEmpty}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmptyValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/NotEmptyValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmptyValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,54 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.Map;
-import java.util.Iterator;
-
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.SingleTableSubclass;
-import org.hibernate.mapping.Column;
-
-/**
- * Check the non emptyness of the element
- *
- * @author Gavin King
- */
-public class NotEmptyValidator implements Validator<NotEmpty>, PropertyConstraint, Serializable {
-
- public void initialize(NotEmpty parameters) {
- }
-
- public boolean isValid(Object value) {
- if ( value == null ) return false;
- if ( value.getClass().isArray() ) {
- return Array.getLength( value ) > 0;
- }
- else if ( value instanceof Collection ) {
- return ( (Collection) value ).size() > 0;
- }
- else if ( value instanceof Map ) {
- return ( (Map) value ).size() > 0;
- }
- else {
- return ( (String) value ).length() > 0;
- }
- }
-
- @SuppressWarnings("unchecked")
- public void apply(Property property) {
- if ( ! ( property.getPersistentClass() instanceof SingleTableSubclass )
- && ! ( property.getValue() instanceof Collection ) ) {
- //single table should not be forced to null
- if ( !property.isComposite() ) { //composite should not add not-null on all columns
- Iterator<Column> iter = (Iterator<Column>) property.getColumnIterator();
- while ( iter.hasNext() ) {
- iter.next().setNullable( false );
- }
- }
- }
- }
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmptyValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/NotEmptyValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmptyValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotEmptyValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,54 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.io.Serializable;
+import java.lang.reflect.Array;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Iterator;
+
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.SingleTableSubclass;
+import org.hibernate.mapping.Column;
+
+/**
+ * Check the non emptyness of the element
+ *
+ * @author Gavin King
+ */
+public class NotEmptyValidator implements Validator<NotEmpty>, PropertyConstraint, Serializable {
+
+ public void initialize(NotEmpty parameters) {
+ }
+
+ public boolean isValid(Object value) {
+ if ( value == null ) return false;
+ if ( value.getClass().isArray() ) {
+ return Array.getLength( value ) > 0;
+ }
+ else if ( value instanceof Collection ) {
+ return ( (Collection) value ).size() > 0;
+ }
+ else if ( value instanceof Map ) {
+ return ( (Map) value ).size() > 0;
+ }
+ else {
+ return ( (String) value ).length() > 0;
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ public void apply(Property property) {
+ if ( ! ( property.getPersistentClass() instanceof SingleTableSubclass )
+ && ! ( property.getValue() instanceof Collection ) ) {
+ //single table should not be forced to null
+ if ( !property.isComposite() ) { //composite should not add not-null on all columns
+ Iterator<Column> iter = (Iterator<Column>) property.getColumnIterator();
+ while ( iter.hasNext() ) {
+ iter.next().setNullable( false );
+ }
+ }
+ }
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNull.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/NotNull.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNull.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * not null constraint
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(NotNullValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface NotNull {
- String message() default "{validator.notNull}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNull.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/NotNull.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNull.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNull.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * not null constraint
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(NotNullValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface NotNull {
+ String message() default "{validator.notNull}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNullValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/NotNullValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNullValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-import java.util.Iterator;
-
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Property;
-import org.hibernate.mapping.SingleTableSubclass;
-
-/**
- * Check a not null restriction on an object
- * and apply the equivalent constraint on hibernate metadata.
- *
- * @author Gavin King
- */
-public class NotNullValidator implements Validator<NotNull>, PropertyConstraint, Serializable {
-
- public boolean isValid(Object value) {
- return value != null;
- }
-
- public void initialize(NotNull parameters) {
- }
-
- @SuppressWarnings("unchecked")
- public void apply(Property property) {
- if ( ! ( property.getPersistentClass() instanceof SingleTableSubclass ) ) {
- //single table should not be forced to null
- if ( !property.isComposite() ) { //composite should not add not-null on all columns
- Iterator<Column> iter = (Iterator<Column>) property.getColumnIterator();
- while ( iter.hasNext() ) {
- iter.next().setNullable( false );
- }
- }
- }
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNullValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/NotNullValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNullValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/NotNullValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+import java.util.Iterator;
+
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Property;
+import org.hibernate.mapping.SingleTableSubclass;
+
+/**
+ * Check a not null restriction on an object
+ * and apply the equivalent constraint on hibernate metadata.
+ *
+ * @author Gavin King
+ */
+public class NotNullValidator implements Validator<NotNull>, PropertyConstraint, Serializable {
+
+ public boolean isValid(Object value) {
+ return value != null;
+ }
+
+ public void initialize(NotNull parameters) {
+ }
+
+ @SuppressWarnings("unchecked")
+ public void apply(Property property) {
+ if ( ! ( property.getPersistentClass() instanceof SingleTableSubclass ) ) {
+ //single table should not be forced to null
+ if ( !property.isComposite() ) { //composite should not add not-null on all columns
+ Iterator<Column> iter = (Iterator<Column>) property.getColumnIterator();
+ while ( iter.hasNext() ) {
+ iter.next().setNullable( false );
+ }
+ }
+ }
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Past.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Past.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Past.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Check that a Date, a Calendar, or a string representation apply in the past
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(PastValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Past {
- String message() default "{validator.past}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Past.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Past.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Past.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Past.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Check that a Date, a Calendar, or a string representation apply in the past
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(PastValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Past {
+ String message() default "{validator.past}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/PastValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/PastValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/PastValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-import java.text.DateFormat;
-import java.text.ParseException;
-import java.util.Calendar;
-import java.util.Date;
-
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Property;
-
-/**
- * Check that a given date is in the past, and apply the same restriction
- * at the DB level
- *
- * @author Gavin King
- */
-public class PastValidator implements Validator<Past>, PropertyConstraint, Serializable {
-
- public void initialize(Past parameters) {
- }
-
- public boolean isValid(Object value) {
- if ( value == null ) return true;
- if ( value instanceof Date ) {
- Date date = (Date) value;
- return date.before( new Date() );
- }
- else if ( value instanceof Calendar ) {
- Calendar cal = (Calendar) value;
- return cal.before( Calendar.getInstance() );
- }
- else {
- return false;
- }
- }
-
- public void apply(Property property) {
- Column col = (Column) property.getColumnIterator().next();
- col.setCheckConstraint( col.getName() + " < current_date" );
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/PastValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/PastValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/PastValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/PastValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.util.Calendar;
+import java.util.Date;
+
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Property;
+
+/**
+ * Check that a given date is in the past, and apply the same restriction
+ * at the DB level
+ *
+ * @author Gavin King
+ */
+public class PastValidator implements Validator<Past>, PropertyConstraint, Serializable {
+
+ public void initialize(Past parameters) {
+ }
+
+ public boolean isValid(Object value) {
+ if ( value == null ) return true;
+ if ( value instanceof Date ) {
+ Date date = (Date) value;
+ return date.before( new Date() );
+ }
+ else if ( value instanceof Calendar ) {
+ Calendar cal = (Calendar) value;
+ return cal.before( Calendar.getInstance() );
+ }
+ else {
+ return false;
+ }
+ }
+
+ public void apply(Property property) {
+ Column col = (Column) property.getColumnIterator().next();
+ col.setCheckConstraint( col.getName() + " < current_date" );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Pattern.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Pattern.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Pattern.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * The annotated element must follow the regexp pattern
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(PatternValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Pattern {
- /** regular expression */
- String regex();
-
- /** regular expression processing flags */
- int flags() default 0;
-
- String message() default "{validator.pattern}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Pattern.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Pattern.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Pattern.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Pattern.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated element must follow the regexp pattern
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(PatternValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Pattern {
+ /** regular expression */
+ String regex();
+
+ /** regular expression processing flags */
+ int flags() default 0;
+
+ String message() default "{validator.pattern}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/PatternValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/PatternValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/PatternValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-import java.util.regex.Matcher;
-
-/**
- * check if a given element match the regular expression
- *
- * @author Gavin King
- */
-public class PatternValidator implements Validator<Pattern>, Serializable {
-
- private java.util.regex.Pattern pattern;
-
- public void initialize(Pattern parameters) {
- pattern = java.util.regex.Pattern.compile(
- parameters.regex(),
- parameters.flags()
- );
- }
-
- public boolean isValid(Object value) {
- if ( value == null ) return true;
- if ( !( value instanceof String ) ) return false;
- String string = (String) value;
- Matcher m = pattern.matcher( string );
- return m.matches();
- }
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/PatternValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/PatternValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/PatternValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/PatternValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+import java.util.regex.Matcher;
+
+/**
+ * check if a given element match the regular expression
+ *
+ * @author Gavin King
+ */
+public class PatternValidator implements Validator<Pattern>, Serializable {
+
+ private java.util.regex.Pattern pattern;
+
+ public void initialize(Pattern parameters) {
+ pattern = java.util.regex.Pattern.compile(
+ parameters.regex(),
+ parameters.flags()
+ );
+ }
+
+ public boolean isValid(Object value) {
+ if ( value == null ) return true;
+ if ( !( value instanceof String ) ) return false;
+ String string = (String) value;
+ Matcher m = pattern.matcher( string );
+ return m.matches();
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.Target;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import static java.lang.annotation.ElementType.METHOD;
-import static java.lang.annotation.ElementType.FIELD;
-
-/**
- * The annotated element must follow the list of regexp patterns
- *
- * @author Gavin King
- */
- at Documented
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Patterns {
- Pattern[] value();
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Patterns.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.Target;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import static java.lang.annotation.ElementType.METHOD;
+import static java.lang.annotation.ElementType.FIELD;
+
+/**
+ * The annotated element must follow the list of regexp patterns
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Patterns {
+ Pattern[] value();
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/PersistentClassConstraint.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/PersistentClassConstraint.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/PersistentClassConstraint.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import org.hibernate.mapping.PersistentClass;
-
-/**
- * Interface implemented by the validator
- * when a constraint may be represented in the
- * hibernate metadata
- *
- * @author Gavin King
- */
-public interface PersistentClassConstraint {
- /**
- * Apply the constraint in the hibernate metadata
- *
- * @param persistentClass
- */
- public void apply(PersistentClass persistentClass);
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/PersistentClassConstraint.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/PersistentClassConstraint.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/PersistentClassConstraint.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/PersistentClassConstraint.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.validator;
+
+import org.hibernate.mapping.PersistentClass;
+
+/**
+ * Interface implemented by the validator
+ * when a constraint may be represented in the
+ * hibernate metadata
+ *
+ * @author Gavin King
+ */
+public interface PersistentClassConstraint {
+ /**
+ * Apply the constraint in the hibernate metadata
+ *
+ * @param persistentClass
+ */
+ public void apply(PersistentClass persistentClass);
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/PropertyConstraint.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/PropertyConstraint.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/PropertyConstraint.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import org.hibernate.mapping.Property;
-
-/**
- * Interface implemented by the validator
- * when a constraint may be represented in a
- * hibernate metadata property
- *
- * @author Gavin King
- */
-public interface PropertyConstraint {
-
- public void apply(Property property);
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/PropertyConstraint.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/PropertyConstraint.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/PropertyConstraint.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/PropertyConstraint.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id$
+package org.hibernate.validator;
+
+import org.hibernate.mapping.Property;
+
+/**
+ * Interface implemented by the validator
+ * when a constraint may be represented in a
+ * hibernate metadata property
+ *
+ * @author Gavin King
+ */
+public interface PropertyConstraint {
+
+ public void apply(Property property);
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Range.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Range.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Range.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,27 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * The annotated elemnt has to be in the appropriate range. Apply on numeric values or string
- * representation of the numeric value.
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(RangeValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Range {
- long max() default Long.MAX_VALUE;
-
- long min() default Long.MIN_VALUE;
-
- String message() default "{validator.range}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Range.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Range.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Range.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Range.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,27 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * The annotated elemnt has to be in the appropriate range. Apply on numeric values or string
+ * representation of the numeric value.
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(RangeValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Range {
+ long max() default Long.MAX_VALUE;
+
+ long min() default Long.MIN_VALUE;
+
+ String message() default "{validator.range}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/RangeValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/RangeValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/RangeValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.Property;
-
-/**
- * The value has to be in a defined range, the constraint is also applied on DB
- *
- * @author Gavin King
- */
-public class RangeValidator implements Validator<Range>, PropertyConstraint, Serializable {
- private long max;
- private long min;
-
- public void initialize(Range parameters) {
- max = parameters.max();
- min = parameters.min();
- }
-
- public boolean isValid(Object value) {
- if ( value == null ) return true;
- if ( value instanceof String ) {
- try {
- BigDecimal dv = new BigDecimal( (String) value );
- return dv.compareTo( BigDecimal.valueOf( min ) ) >= 0 && dv.compareTo( BigDecimal.valueOf( max ) ) <= 0;
- }
- catch (NumberFormatException nfe) {
- return false;
- }
- }
- else if ( ( value instanceof Double ) || ( value instanceof Float ) ) {
- double dv = ( (Number) value ).doubleValue();
- return dv >= min && dv <= max;
- }
- else if ( value instanceof Number ) {
- long lv = ( (Number) value ).longValue();
- return lv >= min && lv <= max;
- }
- else {
- return false;
- }
- }
-
- public void apply(Property property) {
- Column col = (Column) property.getColumnIterator().next();
- String check = "";
- if ( min != Long.MIN_VALUE ) check += col.getName() + ">=" + min;
- if ( max != Long.MAX_VALUE && min != Long.MIN_VALUE ) check += " and ";
- if ( max != Long.MAX_VALUE ) check += col.getName() + "<=" + max;
- col.setCheckConstraint( check );
- }
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/RangeValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/RangeValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/RangeValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/RangeValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.Property;
+
+/**
+ * The value has to be in a defined range, the constraint is also applied on DB
+ *
+ * @author Gavin King
+ */
+public class RangeValidator implements Validator<Range>, PropertyConstraint, Serializable {
+ private long max;
+ private long min;
+
+ public void initialize(Range parameters) {
+ max = parameters.max();
+ min = parameters.min();
+ }
+
+ public boolean isValid(Object value) {
+ if ( value == null ) return true;
+ if ( value instanceof String ) {
+ try {
+ BigDecimal dv = new BigDecimal( (String) value );
+ return dv.compareTo( BigDecimal.valueOf( min ) ) >= 0 && dv.compareTo( BigDecimal.valueOf( max ) ) <= 0;
+ }
+ catch (NumberFormatException nfe) {
+ return false;
+ }
+ }
+ else if ( ( value instanceof Double ) || ( value instanceof Float ) ) {
+ double dv = ( (Number) value ).doubleValue();
+ return dv >= min && dv <= max;
+ }
+ else if ( value instanceof Number ) {
+ long lv = ( (Number) value ).longValue();
+ return lv >= min && lv <= max;
+ }
+ else {
+ return false;
+ }
+ }
+
+ public void apply(Property property) {
+ Column col = (Column) property.getColumnIterator().next();
+ String check = "";
+ if ( min != Long.MIN_VALUE ) check += col.getName() + ">=" + min;
+ if ( max != Long.MAX_VALUE && min != Long.MIN_VALUE ) check += " and ";
+ if ( max != Long.MAX_VALUE ) check += col.getName() + "<=" + max;
+ col.setCheckConstraint( check );
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Size.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Size.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Size.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Size range for Arrays, Collections or Maps
- *
- * @author Gavin King
- */
- at Documented
- at ValidatorClass(SizeValidator.class)
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Size {
- int max() default Integer.MAX_VALUE;
-
- int min() default 0;
-
- String message() default "{validator.size}";
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Size.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Size.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Size.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Size.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Size range for Arrays, Collections or Maps
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at ValidatorClass(SizeValidator.class)
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Size {
+ int max() default Integer.MAX_VALUE;
+
+ int min() default 0;
+
+ String message() default "{validator.size}";
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/SizeValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/SizeValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/SizeValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.io.Serializable;
-import java.lang.reflect.Array;
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * Check the size range according to the element
- *
- * @author Gavin King
- */
-public class SizeValidator implements Validator<Size>, Serializable {
- private int max;
- private int min;
-
- public void initialize(Size parameters) {
- max = parameters.max();
- min = parameters.min();
- }
-
- public boolean isValid(Object value) {
- if ( value == null ) return true;
- int length;
- if ( value.getClass().isArray() ) {
- length = Array.getLength( value );
- }
- else if ( value instanceof Collection ) {
- length = ( (Collection) value ).size();
- }
- else if ( value instanceof Map ) {
- length = ( (Map) value ).size();
- }
- else {
- return false;
- }
- return length >= min && length <= max;
- }
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/SizeValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/SizeValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/SizeValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/SizeValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.io.Serializable;
+import java.lang.reflect.Array;
+import java.util.Collection;
+import java.util.Map;
+
+/**
+ * Check the size range according to the element
+ *
+ * @author Gavin King
+ */
+public class SizeValidator implements Validator<Size>, Serializable {
+ private int max;
+ private int min;
+
+ public void initialize(Size parameters) {
+ max = parameters.max();
+ min = parameters.min();
+ }
+
+ public boolean isValid(Object value) {
+ if ( value == null ) return true;
+ int length;
+ if ( value.getClass().isArray() ) {
+ length = Array.getLength( value );
+ }
+ else if ( value instanceof Collection ) {
+ length = ( (Collection) value ).size();
+ }
+ else if ( value instanceof Map ) {
+ length = ( (Map) value ).size();
+ }
+ else {
+ return false;
+ }
+ return length >= min && length <= max;
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Valid.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Valid.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Valid.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,20 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.ElementType.METHOD;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-/**
- * Enables recursive validation of an associated object
- *
- * @author Gavin King
- */
- at Documented
- at Target({METHOD, FIELD})
- at Retention(RUNTIME)
-public @interface Valid {
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Valid.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Valid.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Valid.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Valid.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,20 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.FIELD;
+import static java.lang.annotation.ElementType.METHOD;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+/**
+ * Enables recursive validation of an associated object
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at Target({METHOD, FIELD})
+ at Retention(RUNTIME)
+public @interface Valid {
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Validator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Validator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Validator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,23 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Annotation;
-
-/**
- * A constraint validator for a particular annotation
- *
- * @author Gavin King
- */
-public interface Validator<A extends Annotation> {
- /**
- * does the object/element pass the constraints
- */
- public boolean isValid(Object value);
-
- /**
- * Take the annotations values
- *
- * @param parameters
- */
- public void initialize(A parameters);
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Validator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Validator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Validator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Validator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,23 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * A constraint validator for a particular annotation
+ *
+ * @author Gavin King
+ */
+public interface Validator<A extends Annotation> {
+ /**
+ * does the object/element pass the constraints
+ */
+ public boolean isValid(Object value);
+
+ /**
+ * Take the annotations values
+ *
+ * @param parameters
+ */
+ public void initialize(A parameters);
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/ValidatorClass.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/ValidatorClass.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/ValidatorClass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.validator;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-
-/**
- * Link between an constraint annotation and it's validator implementation
- *
- * @author Gavin King
- */
- at Documented
- at Target({ANNOTATION_TYPE})
- at Retention(RUNTIME)
-public @interface ValidatorClass {
- Class<? extends Validator> value();
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/ValidatorClass.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/ValidatorClass.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/ValidatorClass.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/ValidatorClass.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.validator;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.ANNOTATION_TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+
+/**
+ * Link between an constraint annotation and it's validator implementation
+ *
+ * @author Gavin King
+ */
+ at Documented
+ at Target({ANNOTATION_TYPE})
+ at Retention(RUNTIME)
+public @interface ValidatorClass {
+ Class<? extends Validator> value();
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Version.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Version.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.validator;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-
-/**
- * Hibernate Vaildator version
- *
- * @author Emmanuel Bernard
- */
-public class Version {
- public static final String VERSION = "3.2.2.GA";
- private static Log log = LogFactory.getLog( Version.class );
-
- static {
- log.info( "Hibernate Validator " + VERSION );
- }
-
- public static void touch() {
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/Version.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/Version.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/Version.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/Version.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.validator;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * Hibernate Vaildator version
+ *
+ * @author Emmanuel Bernard
+ */
+public class Version {
+ public static final String VERSION = "3.2.2.GA";
+ private static Log log = LogFactory.getLog( Version.class );
+
+ static {
+ log.info( "Hibernate Validator " + VERSION );
+ }
+
+ public static void touch() {
+ }
+}
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/event (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/event)
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/JPAValidateListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/event/JPAValidateListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/JPAValidateListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,65 +0,0 @@
-//$Id: $
-package org.hibernate.validator.event;
-
-import java.lang.ref.WeakReference;
-import java.util.Map;
-import java.util.WeakHashMap;
-import java.util.Set;
-import java.util.HashSet;
-import javax.persistence.PrePersist;
-import javax.persistence.PreUpdate;
-
-import org.hibernate.validator.ClassValidator;
-
-/**
- * Java Persistence Entity Listener that validates entities on inserts or updates
- * This listener needs ot be placed on each validatable entities
- *
- * <code>
- * @Entity
- * @EntityListeners(JPAValidateListener.class)
- * public class Submarine {
- * @NotEmpty private String name;
- * ...
- * }
- * </code>
- *
- * @author Emmanuel Bernard
- */
-public class JPAValidateListener {
- //No need for weakReference if the event listener is loaded by the same CL than
- //the entities, but in a shared env this is not the case
- //TODO check that this can be hot redeployable
- private static final Map<Class, WeakReference<ClassValidator>> validators;
- private static final ClassValidator<JPAValidateListener> NO_VALIDATOR;
- static {
- validators = new WeakHashMap<Class, WeakReference<ClassValidator>>();
- NO_VALIDATOR = new ClassValidator<JPAValidateListener>( JPAValidateListener.class);
- }
-
- //keep hardref at the instance level
- private final Set<ClassValidator> currentValidators = new HashSet<ClassValidator>();
-
- @PrePersist
- @PreUpdate
- @SuppressWarnings( "unchecked" )
- public void onChange(Object object) {
- if (object == null) return;
- Class entity = object.getClass();
- WeakReference<ClassValidator> weakValidator = validators.get(entity);
- ClassValidator validator = weakValidator != null ? weakValidator.get() : null;
- if ( validator == null ) {
- //initialize
- //TODO reuse the same reflection manager?
- validator = new ClassValidator(entity);
- if ( ! validator.hasValidationRules() ) {
- validator = NO_VALIDATOR;
- }
- validators.put( entity, new WeakReference<ClassValidator>(validator) );
- currentValidators.add( validator );
- }
- if ( validator != NO_VALIDATOR ) {
- validator.assertValid( object );
- }
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/JPAValidateListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/event/JPAValidateListener.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/JPAValidateListener.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/JPAValidateListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,65 @@
+//$Id: $
+package org.hibernate.validator.event;
+
+import java.lang.ref.WeakReference;
+import java.util.Map;
+import java.util.WeakHashMap;
+import java.util.Set;
+import java.util.HashSet;
+import javax.persistence.PrePersist;
+import javax.persistence.PreUpdate;
+
+import org.hibernate.validator.ClassValidator;
+
+/**
+ * Java Persistence Entity Listener that validates entities on inserts or updates
+ * This listener needs ot be placed on each validatable entities
+ *
+ * <code>
+ * @Entity
+ * @EntityListeners(JPAValidateListener.class)
+ * public class Submarine {
+ * @NotEmpty private String name;
+ * ...
+ * }
+ * </code>
+ *
+ * @author Emmanuel Bernard
+ */
+public class JPAValidateListener {
+ //No need for weakReference if the event listener is loaded by the same CL than
+ //the entities, but in a shared env this is not the case
+ //TODO check that this can be hot redeployable
+ private static final Map<Class, WeakReference<ClassValidator>> validators;
+ private static final ClassValidator<JPAValidateListener> NO_VALIDATOR;
+ static {
+ validators = new WeakHashMap<Class, WeakReference<ClassValidator>>();
+ NO_VALIDATOR = new ClassValidator<JPAValidateListener>( JPAValidateListener.class);
+ }
+
+ //keep hardref at the instance level
+ private final Set<ClassValidator> currentValidators = new HashSet<ClassValidator>();
+
+ @PrePersist
+ @PreUpdate
+ @SuppressWarnings( "unchecked" )
+ public void onChange(Object object) {
+ if (object == null) return;
+ Class entity = object.getClass();
+ WeakReference<ClassValidator> weakValidator = validators.get(entity);
+ ClassValidator validator = weakValidator != null ? weakValidator.get() : null;
+ if ( validator == null ) {
+ //initialize
+ //TODO reuse the same reflection manager?
+ validator = new ClassValidator(entity);
+ if ( ! validator.hasValidationRules() ) {
+ validator = NO_VALIDATOR;
+ }
+ validators.put( entity, new WeakReference<ClassValidator>(validator) );
+ currentValidators.add( validator );
+ }
+ if ( validator != NO_VALIDATOR ) {
+ validator.assertValid( object );
+ }
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidateEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidateEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidateEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,205 +0,0 @@
-//$Id$
-package org.hibernate.validator.event;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-
-import org.hibernate.AssertionFailure;
-import org.hibernate.EntityMode;
-import org.hibernate.HibernateException;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.event.Initializable;
-import org.hibernate.event.PreInsertEvent;
-import org.hibernate.event.PreInsertEventListener;
-import org.hibernate.event.PreUpdateEvent;
-import org.hibernate.event.PreUpdateEventListener;
-import org.hibernate.mapping.Component;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Property;
-import org.hibernate.property.Getter;
-import org.hibernate.property.PropertyAccessor;
-import org.hibernate.property.PropertyAccessorFactory;
-import org.hibernate.annotations.common.reflection.ReflectionManager;
-import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
-import org.hibernate.util.ReflectHelper;
-import org.hibernate.util.StringHelper;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.Environment;
-import org.hibernate.validator.InvalidStateException;
-import org.hibernate.validator.InvalidValue;
-import org.hibernate.validator.MessageInterpolator;
-
-/**
- * Before insert and update, executes the validator framework
- *
- * @author Emmanuel Bernard
- */
-public class ValidateEventListener implements PreInsertEventListener, PreUpdateEventListener, Initializable {
- private boolean isInitialized;
- private Map<Class, ValidatableElement> validators = new HashMap<Class, ValidatableElement>();
-
- /**
- * initialize the validators, any non significant validators are not kept
- */
- @SuppressWarnings( "unchecked" )
- public synchronized void initialize(final Configuration cfg) {
- if ( !isInitialized ) {
- String interpolatorString = cfg.getProperty( Environment.MESSAGE_INTERPOLATOR_CLASS );
- MessageInterpolator interpolator = null;
- if ( StringHelper.isNotEmpty( interpolatorString ) ) {
- try {
- Class interpolatorClass = ReflectHelper.classForName( interpolatorString );
- interpolator = (MessageInterpolator) interpolatorClass.newInstance();
- }
- catch (ClassNotFoundException e) {
- throw new HibernateException( "Unable to find message interpolator: " + interpolatorString, e );
- }
- catch (IllegalAccessException e) {
- throw new HibernateException( "Unable to instanciate message interpolator: " + interpolatorString,
- e );
- }
- catch (InstantiationException e) {
- throw new HibernateException( "Unable to instanciate message interpolator: " + interpolatorString,
- e );
- }
- catch (ClassCastException e) {
- throw new HibernateException( "Class does not implement "
- + MessageInterpolator.class.getName() + ": " + interpolatorString, e );
- }
- }
- Iterator<PersistentClass> classes = (Iterator<PersistentClass>) cfg.getClassMappings();
- ReflectionManager reflectionManager;
- try {
- //TODO introduce q ReflectionManagerHolder interface to avoid reflection
- //I want to avoid hard link between HAN and Validator for usch a simple need
- //reuse the existing reflectionManager one when possible
- reflectionManager =
- (ReflectionManager) cfg.getClass().getMethod( "getReflectionManager" ).invoke( cfg );
-
- }
- catch (Exception e) {
- reflectionManager = new JavaReflectionManager();
- }
- while ( classes.hasNext() ) {
- PersistentClass clazz = classes.next();
- final Class mappedClass = clazz.getMappedClass();
- ClassValidator validator =
- new ClassValidator( mappedClass, null, interpolator, null, reflectionManager );
- ValidatableElement element = new ValidatableElement( mappedClass, validator );
- addSubElement( clazz.getIdentifierProperty(), element );
- Iterator properties = clazz.getPropertyIterator();
- while ( properties.hasNext() ) {
- addSubElement( (Property) properties.next(), element );
- }
- if ( element.subElements.size() != 0 || element.validator.hasValidationRules() ) {
- validators.put( mappedClass, element );
- }
- }
- isInitialized = true;
- }
- }
-
- @SuppressWarnings( "unchecked" )
- private void addSubElement(Property property, ValidatableElement element) {
- if ( property != null && property.isComposite() && !property.isBackRef() ) {
- Component component = (Component) property.getValue();
- if ( component.isEmbedded() ) return;
- PropertyAccessor accessor = PropertyAccessorFactory.getPropertyAccessor( property, EntityMode.POJO );
- Getter getter = accessor.getGetter( element.clazz, property.getName() );
- ClassValidator validator = new ClassValidator( getter.getReturnType() );
- ValidatableElement subElement = new ValidatableElement( getter.getReturnType(), validator, getter );
- Iterator properties = component.getPropertyIterator();
- while ( properties.hasNext() ) {
- addSubElement( (Property) properties.next(), subElement );
- }
- if ( subElement.getSubElements().size() != 0 || subElement.validator.hasValidationRules() ) {
- element.addSubElement( subElement );
- }
- }
- }
-
- @SuppressWarnings( "unchecked" )
- protected void validate(Object entity, EntityMode mode) {
- if ( entity == null || !EntityMode.POJO.equals( mode ) ) return;
- ValidatableElement element;
- if ( isInitialized ) {
- element = validators.get( entity.getClass() );
- }
- else {
- throw new AssertionFailure( "Validator event not initialized" );
- }
- if ( element == null ) return; //no validation to do
- List<InvalidValue> consolidatedInvalidValues = new ArrayList<InvalidValue>();
- validateSubElements( element, entity, consolidatedInvalidValues );
- InvalidValue[] invalidValues = element.validator == null ?
- null :
- element.validator.getInvalidValues( entity );
- if ( invalidValues != null ) {
- for ( InvalidValue invalidValue : invalidValues ) {
- consolidatedInvalidValues.add( invalidValue );
- }
- }
- if ( consolidatedInvalidValues.size() > 0 ) {
- throw new InvalidStateException(
- consolidatedInvalidValues.toArray( new InvalidValue[consolidatedInvalidValues.size()] ),
- entity.getClass().getName()
- );
- }
- }
-
- @SuppressWarnings( "unchecked" )
- private void validateSubElements(
- ValidatableElement element, Object entity, List<InvalidValue> consolidatedInvalidValues
- ) {
- if ( element != null ) {
- for ( ValidatableElement subElement : element.subElements ) {
- Object component = subElement.getter.get( entity );
- InvalidValue[] invalidValues = subElement.validator.getInvalidValues( component );
- for ( InvalidValue invalidValue : invalidValues ) {
- consolidatedInvalidValues.add( invalidValue );
- }
- validateSubElements( subElement, component, consolidatedInvalidValues );
- }
- }
- }
-
- public boolean onPreInsert(PreInsertEvent event) {
- validate( event.getEntity(), event.getSource().getEntityMode() );
- return false;
- }
-
- public boolean onPreUpdate(PreUpdateEvent event) {
- validate( event.getEntity(), event.getSource().getEntityMode() );
- return false;
- }
-
- private static class ValidatableElement implements Serializable {
- private Class clazz;
- private ClassValidator validator;
- private Getter getter;
- private Collection<ValidatableElement> subElements = new ArrayList<ValidatableElement>();
-
- public ValidatableElement(Class clazz, ClassValidator validator) {
- this.clazz = clazz;
- this.validator = validator;
- }
-
- public ValidatableElement(Class clazz, ClassValidator validator, Getter getter) {
- this( clazz, validator );
- this.getter = getter;
- }
-
- public void addSubElement(ValidatableElement subValidatableElement) {
- subElements.add( subValidatableElement );
- }
-
- public Collection<ValidatableElement> getSubElements() {
- return this.subElements;
- }
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidateEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidateEventListener.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidateEventListener.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidateEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,205 @@
+//$Id$
+package org.hibernate.validator.event;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.AssertionFailure;
+import org.hibernate.EntityMode;
+import org.hibernate.HibernateException;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.event.Initializable;
+import org.hibernate.event.PreInsertEvent;
+import org.hibernate.event.PreInsertEventListener;
+import org.hibernate.event.PreUpdateEvent;
+import org.hibernate.event.PreUpdateEventListener;
+import org.hibernate.mapping.Component;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Property;
+import org.hibernate.property.Getter;
+import org.hibernate.property.PropertyAccessor;
+import org.hibernate.property.PropertyAccessorFactory;
+import org.hibernate.annotations.common.reflection.ReflectionManager;
+import org.hibernate.annotations.common.reflection.java.JavaReflectionManager;
+import org.hibernate.util.ReflectHelper;
+import org.hibernate.util.StringHelper;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.Environment;
+import org.hibernate.validator.InvalidStateException;
+import org.hibernate.validator.InvalidValue;
+import org.hibernate.validator.MessageInterpolator;
+
+/**
+ * Before insert and update, executes the validator framework
+ *
+ * @author Emmanuel Bernard
+ */
+public class ValidateEventListener implements PreInsertEventListener, PreUpdateEventListener, Initializable {
+ private boolean isInitialized;
+ private Map<Class, ValidatableElement> validators = new HashMap<Class, ValidatableElement>();
+
+ /**
+ * initialize the validators, any non significant validators are not kept
+ */
+ @SuppressWarnings( "unchecked" )
+ public synchronized void initialize(final Configuration cfg) {
+ if ( !isInitialized ) {
+ String interpolatorString = cfg.getProperty( Environment.MESSAGE_INTERPOLATOR_CLASS );
+ MessageInterpolator interpolator = null;
+ if ( StringHelper.isNotEmpty( interpolatorString ) ) {
+ try {
+ Class interpolatorClass = ReflectHelper.classForName( interpolatorString );
+ interpolator = (MessageInterpolator) interpolatorClass.newInstance();
+ }
+ catch (ClassNotFoundException e) {
+ throw new HibernateException( "Unable to find message interpolator: " + interpolatorString, e );
+ }
+ catch (IllegalAccessException e) {
+ throw new HibernateException( "Unable to instanciate message interpolator: " + interpolatorString,
+ e );
+ }
+ catch (InstantiationException e) {
+ throw new HibernateException( "Unable to instanciate message interpolator: " + interpolatorString,
+ e );
+ }
+ catch (ClassCastException e) {
+ throw new HibernateException( "Class does not implement "
+ + MessageInterpolator.class.getName() + ": " + interpolatorString, e );
+ }
+ }
+ Iterator<PersistentClass> classes = (Iterator<PersistentClass>) cfg.getClassMappings();
+ ReflectionManager reflectionManager;
+ try {
+ //TODO introduce q ReflectionManagerHolder interface to avoid reflection
+ //I want to avoid hard link between HAN and Validator for usch a simple need
+ //reuse the existing reflectionManager one when possible
+ reflectionManager =
+ (ReflectionManager) cfg.getClass().getMethod( "getReflectionManager" ).invoke( cfg );
+
+ }
+ catch (Exception e) {
+ reflectionManager = new JavaReflectionManager();
+ }
+ while ( classes.hasNext() ) {
+ PersistentClass clazz = classes.next();
+ final Class mappedClass = clazz.getMappedClass();
+ ClassValidator validator =
+ new ClassValidator( mappedClass, null, interpolator, null, reflectionManager );
+ ValidatableElement element = new ValidatableElement( mappedClass, validator );
+ addSubElement( clazz.getIdentifierProperty(), element );
+ Iterator properties = clazz.getPropertyIterator();
+ while ( properties.hasNext() ) {
+ addSubElement( (Property) properties.next(), element );
+ }
+ if ( element.subElements.size() != 0 || element.validator.hasValidationRules() ) {
+ validators.put( mappedClass, element );
+ }
+ }
+ isInitialized = true;
+ }
+ }
+
+ @SuppressWarnings( "unchecked" )
+ private void addSubElement(Property property, ValidatableElement element) {
+ if ( property != null && property.isComposite() && !property.isBackRef() ) {
+ Component component = (Component) property.getValue();
+ if ( component.isEmbedded() ) return;
+ PropertyAccessor accessor = PropertyAccessorFactory.getPropertyAccessor( property, EntityMode.POJO );
+ Getter getter = accessor.getGetter( element.clazz, property.getName() );
+ ClassValidator validator = new ClassValidator( getter.getReturnType() );
+ ValidatableElement subElement = new ValidatableElement( getter.getReturnType(), validator, getter );
+ Iterator properties = component.getPropertyIterator();
+ while ( properties.hasNext() ) {
+ addSubElement( (Property) properties.next(), subElement );
+ }
+ if ( subElement.getSubElements().size() != 0 || subElement.validator.hasValidationRules() ) {
+ element.addSubElement( subElement );
+ }
+ }
+ }
+
+ @SuppressWarnings( "unchecked" )
+ protected void validate(Object entity, EntityMode mode) {
+ if ( entity == null || !EntityMode.POJO.equals( mode ) ) return;
+ ValidatableElement element;
+ if ( isInitialized ) {
+ element = validators.get( entity.getClass() );
+ }
+ else {
+ throw new AssertionFailure( "Validator event not initialized" );
+ }
+ if ( element == null ) return; //no validation to do
+ List<InvalidValue> consolidatedInvalidValues = new ArrayList<InvalidValue>();
+ validateSubElements( element, entity, consolidatedInvalidValues );
+ InvalidValue[] invalidValues = element.validator == null ?
+ null :
+ element.validator.getInvalidValues( entity );
+ if ( invalidValues != null ) {
+ for ( InvalidValue invalidValue : invalidValues ) {
+ consolidatedInvalidValues.add( invalidValue );
+ }
+ }
+ if ( consolidatedInvalidValues.size() > 0 ) {
+ throw new InvalidStateException(
+ consolidatedInvalidValues.toArray( new InvalidValue[consolidatedInvalidValues.size()] ),
+ entity.getClass().getName()
+ );
+ }
+ }
+
+ @SuppressWarnings( "unchecked" )
+ private void validateSubElements(
+ ValidatableElement element, Object entity, List<InvalidValue> consolidatedInvalidValues
+ ) {
+ if ( element != null ) {
+ for ( ValidatableElement subElement : element.subElements ) {
+ Object component = subElement.getter.get( entity );
+ InvalidValue[] invalidValues = subElement.validator.getInvalidValues( component );
+ for ( InvalidValue invalidValue : invalidValues ) {
+ consolidatedInvalidValues.add( invalidValue );
+ }
+ validateSubElements( subElement, component, consolidatedInvalidValues );
+ }
+ }
+ }
+
+ public boolean onPreInsert(PreInsertEvent event) {
+ validate( event.getEntity(), event.getSource().getEntityMode() );
+ return false;
+ }
+
+ public boolean onPreUpdate(PreUpdateEvent event) {
+ validate( event.getEntity(), event.getSource().getEntityMode() );
+ return false;
+ }
+
+ private static class ValidatableElement implements Serializable {
+ private Class clazz;
+ private ClassValidator validator;
+ private Getter getter;
+ private Collection<ValidatableElement> subElements = new ArrayList<ValidatableElement>();
+
+ public ValidatableElement(Class clazz, ClassValidator validator) {
+ this.clazz = clazz;
+ this.validator = validator;
+ }
+
+ public ValidatableElement(Class clazz, ClassValidator validator, Getter getter) {
+ this( clazz, validator );
+ this.getter = getter;
+ }
+
+ public void addSubElement(ValidatableElement subValidatableElement) {
+ subElements.add( subValidatableElement );
+ }
+
+ public Collection<ValidatableElement> getSubElements() {
+ return this.subElements;
+ }
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreInsertEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreInsertEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreInsertEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id$
-package org.hibernate.validator.event;
-
-/**
- * Before insert, execute the validator framework
- *
- * @deprecated use ValidateEventListener
- *
- * @author Gavin King
- */
-public class ValidatePreInsertEventListener extends ValidateEventListener {
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreInsertEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreInsertEventListener.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreInsertEventListener.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreInsertEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id$
+package org.hibernate.validator.event;
+
+/**
+ * Before insert, execute the validator framework
+ *
+ * @deprecated use ValidateEventListener
+ *
+ * @author Gavin King
+ */
+public class ValidatePreInsertEventListener extends ValidateEventListener {
+
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreUpdateEventListener.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreUpdateEventListener.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreUpdateEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,13 +0,0 @@
-//$Id$
-package org.hibernate.validator.event;
-
-/**
- * Before update, execute the validator framework
- *
- * @deprecated use ValidateEventListener
- *
- * @author Gavin King
- */
-public class ValidatePreUpdateEventListener extends ValidateEventListener {
-
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreUpdateEventListener.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreUpdateEventListener.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreUpdateEventListener.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/event/ValidatePreUpdateEventListener.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,13 @@
+//$Id$
+package org.hibernate.validator.event;
+
+/**
+ * Before update, execute the validator framework
+ *
+ * @deprecated use ValidateEventListener
+ *
+ * @author Gavin King
+ */
+public class ValidatePreUpdateEventListener extends ValidateEventListener {
+
+}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/interpolator)
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,135 +0,0 @@
-//$Id: $
-package org.hibernate.validator.interpolator;
-
-import java.io.Serializable;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.ResourceBundle;
-import java.util.StringTokenizer;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.hibernate.util.StringHelper;
-import org.hibernate.validator.MessageInterpolator;
-import org.hibernate.validator.Validator;
-
-/**
- * Resource bundle based interpolator
- * Also interpolate annotation parameters inside the message
- *
- * @author Emmanuel Bernard
- */
-public class DefaultMessageInterpolator implements MessageInterpolator, Serializable {
- private static Log log = LogFactory.getLog( DefaultMessageInterpolator.class );
- private Map<String, Object> annotationParameters = new HashMap<String, Object>();
- private transient ResourceBundle messageBundle;
- private transient ResourceBundle defaultMessageBundle;
- private String annotationMessage;
- private String interpolateMessage;
-
- //not an interface method
- public void initialize(ResourceBundle messageBundle, ResourceBundle defaultMessageBundle) {
- this.messageBundle = messageBundle;
- this.defaultMessageBundle = defaultMessageBundle;
- }
-
- public void initialize(Annotation annotation, MessageInterpolator defaultInterpolator) {
- Class clazz = annotation.getClass();
- for ( Method method : clazz.getMethods() ) {
- try {
- //FIXME remove non serilalization elements on writeObject?
- if ( method.getReturnType() != void.class
- && method.getParameterTypes().length == 0
- && ! Modifier.isStatic( method.getModifiers() ) ) {
- //cannot use an exclude list because the parameter name could match a method name
- annotationParameters.put( method.getName(), method.invoke( annotation ) );
- }
- }
- catch (IllegalAccessException e) {
- //really should not happen, but we degrade nicely
- log.warn( "Unable to access " + StringHelper.qualify( clazz.toString(), method.getName() ) );
- }
- catch (InvocationTargetException e) {
- //really should not happen, but we degrade nicely
- log.warn( "Unable to access " + StringHelper.qualify( clazz.toString(), method.getName() ) );
- }
- }
- annotationMessage = (String) annotationParameters.get( "message" );
- if (annotationMessage == null) {
- throw new IllegalArgumentException( "Annotation " + clazz + " does not have an (accessible) message attribute");
- }
- //do not resolve the property eagerly to allow validator.apply to work wo interpolator
- }
-
- private String replace(String message) {
- StringTokenizer tokens = new StringTokenizer( message, "#{}", true );
- StringBuilder buf = new StringBuilder( 30 );
- boolean escaped = false;
- boolean el = false;
- while ( tokens.hasMoreTokens() ) {
- String token = tokens.nextToken();
- if ( !escaped && "#".equals( token ) ) {
- el = true;
- }
- if ( !el && "{".equals( token ) ) {
- escaped = true;
- }
- else if ( escaped && "}".equals( token ) ) {
- escaped = false;
- }
- else if ( !escaped ) {
- if ( "{".equals( token ) ) el = false;
- buf.append( token );
- }
- else {
- Object variable = annotationParameters.get( token );
- if ( variable != null ) {
- buf.append( variable );
- }
- else {
- String string = null;
- try {
- string = messageBundle != null ? messageBundle.getString( token ) : null;
- }
- catch( MissingResourceException e ) {
- //give a second chance with the default resource bundle
- }
- if (string == null) {
- try {
- string = defaultMessageBundle.getString( token );
- }
- catch( MissingResourceException e) {
- //return the unchanged string
- buf.append('{').append(token).append('}');
- }
- }
- if ( string != null ) buf.append( replace( string ) );
- }
- }
- }
- return buf.toString();
- }
-
- public String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator) {
- if ( annotationMessage.equals( message ) ) {
- //short cut
- if (interpolateMessage == null) {
- interpolateMessage = replace( annotationMessage );
- }
- return interpolateMessage;
- }
- else {
- //TODO keep them in a weak hash map, but this might not even be useful
- return replace( message );
- }
- }
-
- public String getAnnotationMessage() {
- return annotationMessage;
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,135 @@
+//$Id: $
+package org.hibernate.validator.interpolator;
+
+import java.io.Serializable;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.MissingResourceException;
+import java.util.ResourceBundle;
+import java.util.StringTokenizer;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.hibernate.util.StringHelper;
+import org.hibernate.validator.MessageInterpolator;
+import org.hibernate.validator.Validator;
+
+/**
+ * Resource bundle based interpolator
+ * Also interpolate annotation parameters inside the message
+ *
+ * @author Emmanuel Bernard
+ */
+public class DefaultMessageInterpolator implements MessageInterpolator, Serializable {
+ private static Log log = LogFactory.getLog( DefaultMessageInterpolator.class );
+ private Map<String, Object> annotationParameters = new HashMap<String, Object>();
+ private transient ResourceBundle messageBundle;
+ private transient ResourceBundle defaultMessageBundle;
+ private String annotationMessage;
+ private String interpolateMessage;
+
+ //not an interface method
+ public void initialize(ResourceBundle messageBundle, ResourceBundle defaultMessageBundle) {
+ this.messageBundle = messageBundle;
+ this.defaultMessageBundle = defaultMessageBundle;
+ }
+
+ public void initialize(Annotation annotation, MessageInterpolator defaultInterpolator) {
+ Class clazz = annotation.getClass();
+ for ( Method method : clazz.getMethods() ) {
+ try {
+ //FIXME remove non serilalization elements on writeObject?
+ if ( method.getReturnType() != void.class
+ && method.getParameterTypes().length == 0
+ && ! Modifier.isStatic( method.getModifiers() ) ) {
+ //cannot use an exclude list because the parameter name could match a method name
+ annotationParameters.put( method.getName(), method.invoke( annotation ) );
+ }
+ }
+ catch (IllegalAccessException e) {
+ //really should not happen, but we degrade nicely
+ log.warn( "Unable to access " + StringHelper.qualify( clazz.toString(), method.getName() ) );
+ }
+ catch (InvocationTargetException e) {
+ //really should not happen, but we degrade nicely
+ log.warn( "Unable to access " + StringHelper.qualify( clazz.toString(), method.getName() ) );
+ }
+ }
+ annotationMessage = (String) annotationParameters.get( "message" );
+ if (annotationMessage == null) {
+ throw new IllegalArgumentException( "Annotation " + clazz + " does not have an (accessible) message attribute");
+ }
+ //do not resolve the property eagerly to allow validator.apply to work wo interpolator
+ }
+
+ private String replace(String message) {
+ StringTokenizer tokens = new StringTokenizer( message, "#{}", true );
+ StringBuilder buf = new StringBuilder( 30 );
+ boolean escaped = false;
+ boolean el = false;
+ while ( tokens.hasMoreTokens() ) {
+ String token = tokens.nextToken();
+ if ( !escaped && "#".equals( token ) ) {
+ el = true;
+ }
+ if ( !el && "{".equals( token ) ) {
+ escaped = true;
+ }
+ else if ( escaped && "}".equals( token ) ) {
+ escaped = false;
+ }
+ else if ( !escaped ) {
+ if ( "{".equals( token ) ) el = false;
+ buf.append( token );
+ }
+ else {
+ Object variable = annotationParameters.get( token );
+ if ( variable != null ) {
+ buf.append( variable );
+ }
+ else {
+ String string = null;
+ try {
+ string = messageBundle != null ? messageBundle.getString( token ) : null;
+ }
+ catch( MissingResourceException e ) {
+ //give a second chance with the default resource bundle
+ }
+ if (string == null) {
+ try {
+ string = defaultMessageBundle.getString( token );
+ }
+ catch( MissingResourceException e) {
+ //return the unchanged string
+ buf.append('{').append(token).append('}');
+ }
+ }
+ if ( string != null ) buf.append( replace( string ) );
+ }
+ }
+ }
+ return buf.toString();
+ }
+
+ public String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator) {
+ if ( annotationMessage.equals( message ) ) {
+ //short cut
+ if (interpolateMessage == null) {
+ interpolateMessage = replace( annotationMessage );
+ }
+ return interpolateMessage;
+ }
+ else {
+ //TODO keep them in a weak hash map, but this might not even be useful
+ return replace( message );
+ }
+ }
+
+ public String getAnnotationMessage() {
+ return annotationMessage;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolatorAggerator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolatorAggerator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolatorAggerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,57 +0,0 @@
-//$Id: $
-package org.hibernate.validator.interpolator;
-
-import java.lang.annotation.Annotation;
-import java.util.Map;
-import java.util.HashMap;
-import java.util.ResourceBundle;
-import java.io.Serializable;
-
-import org.hibernate.validator.MessageInterpolator;
-import org.hibernate.validator.Validator;
-import org.hibernate.AssertionFailure;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DefaultMessageInterpolatorAggerator implements MessageInterpolator, Serializable {
- private Map<Validator, DefaultMessageInterpolator> interpolators = new HashMap<Validator, DefaultMessageInterpolator>();
- //transient but repopulated by the object owing a reference to the interpolator
- private transient ResourceBundle messageBundle;
- //transient but repopulated by the object owing a reference to the interpolator
- private transient ResourceBundle defaultMessageBundle;
-
- //not an interface method
- public void initialize(ResourceBundle messageBundle, ResourceBundle defaultMessageBundle) {
- this.messageBundle = messageBundle;
- this.defaultMessageBundle = defaultMessageBundle;
- //useful when we deserialize
- for ( DefaultMessageInterpolator interpolator : interpolators.values() ) {
- interpolator.initialize( messageBundle, defaultMessageBundle );
- }
- }
-
- public void addInterpolator(Annotation annotation, Validator validator) {
- DefaultMessageInterpolator interpolator = new DefaultMessageInterpolator();
- interpolator.initialize(messageBundle, defaultMessageBundle );
- interpolator.initialize( annotation, null );
- interpolators.put( validator, interpolator );
- }
-
- public String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator) {
- DefaultMessageInterpolator defaultMessageInterpolator = interpolators.get( validator );
- if (defaultMessageInterpolator == null) {
- return message;
- }
- else {
- return defaultMessageInterpolator.interpolate( message, validator, defaultInterpolator );
- }
- }
-
- public String getAnnotationMessage(Validator validator) {
- DefaultMessageInterpolator defaultMessageInterpolator = interpolators.get( validator );
- String message = defaultMessageInterpolator != null ? defaultMessageInterpolator.getAnnotationMessage() : null;
- if (message == null) throw new AssertionFailure("Validator not registred to the messageInterceptorAggregator");
- return message;
- }
-}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolatorAggerator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolatorAggerator.java)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolatorAggerator.java (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/interpolator/DefaultMessageInterpolatorAggerator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,57 @@
+//$Id: $
+package org.hibernate.validator.interpolator;
+
+import java.lang.annotation.Annotation;
+import java.util.Map;
+import java.util.HashMap;
+import java.util.ResourceBundle;
+import java.io.Serializable;
+
+import org.hibernate.validator.MessageInterpolator;
+import org.hibernate.validator.Validator;
+import org.hibernate.AssertionFailure;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DefaultMessageInterpolatorAggerator implements MessageInterpolator, Serializable {
+ private Map<Validator, DefaultMessageInterpolator> interpolators = new HashMap<Validator, DefaultMessageInterpolator>();
+ //transient but repopulated by the object owing a reference to the interpolator
+ private transient ResourceBundle messageBundle;
+ //transient but repopulated by the object owing a reference to the interpolator
+ private transient ResourceBundle defaultMessageBundle;
+
+ //not an interface method
+ public void initialize(ResourceBundle messageBundle, ResourceBundle defaultMessageBundle) {
+ this.messageBundle = messageBundle;
+ this.defaultMessageBundle = defaultMessageBundle;
+ //useful when we deserialize
+ for ( DefaultMessageInterpolator interpolator : interpolators.values() ) {
+ interpolator.initialize( messageBundle, defaultMessageBundle );
+ }
+ }
+
+ public void addInterpolator(Annotation annotation, Validator validator) {
+ DefaultMessageInterpolator interpolator = new DefaultMessageInterpolator();
+ interpolator.initialize(messageBundle, defaultMessageBundle );
+ interpolator.initialize( annotation, null );
+ interpolators.put( validator, interpolator );
+ }
+
+ public String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator) {
+ DefaultMessageInterpolator defaultMessageInterpolator = interpolators.get( validator );
+ if (defaultMessageInterpolator == null) {
+ return message;
+ }
+ else {
+ return defaultMessageInterpolator.interpolate( message, validator, defaultInterpolator );
+ }
+ }
+
+ public String getAnnotationMessage(Validator validator) {
+ DefaultMessageInterpolator defaultMessageInterpolator = interpolators.get( validator );
+ String message = defaultMessageInterpolator != null ? defaultMessageInterpolator.getAnnotationMessage() : null;
+ if (message == null) throw new AssertionFailure("Validator not registred to the messageInterceptorAggregator");
+ return message;
+ }
+}
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources)
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=assertion failed
-validator.assertTrue=assertion failed
-validator.future=must be a future date
-validator.length=length must be between {min} and {max}
-validator.max=must be less than or equal to {value}
-validator.min=must be greater than or equal to {value}
-validator.notNull=may not be null
-validator.past=must be a past date
-validator.pattern=must match "{regex}"
-validator.range=must be between {min} and {max}
-validator.size=size must be between {min} and {max}
-validator.email=not a well-formed email address
-validator.notEmpty=may not be null or empty
-validator.digits=Numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
-validator.creditCard=Invalid credit card number
-validator.ean=Invalid EAN
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=assertion failed
+validator.assertTrue=assertion failed
+validator.future=must be a future date
+validator.length=length must be between {min} and {max}
+validator.max=must be less than or equal to {value}
+validator.min=must be greater than or equal to {value}
+validator.notNull=may not be null
+validator.past=must be a past date
+validator.pattern=must match "{regex}"
+validator.range=must be between {min} and {max}
+validator.size=size must be between {min} and {max}
+validator.email=not a well-formed email address
+validator.notEmpty=may not be null or empty
+validator.digits=Numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
+validator.creditCard=Invalid credit card number
+validator.ean=Invalid EAN
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_da.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_da.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_da.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=assertion fejlet
-validator.assertTrue=assertion fejlet
-validator.future=skal være en fremtidig dato
-validator.length=længden skal være mellem {min} og {max}
-validator.max=skal være mindre end eller lig med {value}
-validator.min=skal være større end eller lig med {value}
-validator.notNull=må ikke være null
-validator.past=skal være en passeret dato
-validator.pattern=skal matche "{regex}"
-validator.range=skal være mellem {min} og {max}
-validator.size=antallet skal være mellem {min} og {max}
-validator.email=not a well-formed email address
-validator.notEmpty=må ikke være null eller tom
-validator.digits=Værdien er ikke inden for det forventede (<{integerDigits} heltal>.<{fractionalDigits} decimaler>)
-validator.ean=Ukorrekt EAN
-validator.creditCard=Ukorrekt kreditkort nummer
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_da.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_da.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_da.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_da.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=assertion fejlet
+validator.assertTrue=assertion fejlet
+validator.future=skal være en fremtidig dato
+validator.length=længden skal være mellem {min} og {max}
+validator.max=skal være mindre end eller lig med {value}
+validator.min=skal være større end eller lig med {value}
+validator.notNull=må ikke være null
+validator.past=skal være en passeret dato
+validator.pattern=skal matche "{regex}"
+validator.range=skal være mellem {min} og {max}
+validator.size=antallet skal være mellem {min} og {max}
+validator.email=not a well-formed email address
+validator.notEmpty=må ikke være null eller tom
+validator.digits=Værdien er ikke inden for det forventede (<{integerDigits} heltal>.<{fractionalDigits} decimaler>)
+validator.ean=Ukorrekt EAN
+validator.creditCard=Ukorrekt kreditkort nummer
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_de.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_de.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_de.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=nicht garantiert
-validator.assertTrue=garantiert
-validator.future=muss in der Zukunft liegen
-validator.length=muss zwischen {min} und {max} lang sein
-validator.max=muss weniger oder gleich {value} sein
-validator.min=muss mehr oder gleich {value} sein
-validator.notNull=kann nicht leer sein
-validator.past=muss in der Vergangenheit liegen
-validator.pattern=muss Ausdruck "{regex}" entsprechen
-validator.range=muss zwischen {min} und {max} sein
-validator.size=muss zwischen {min} und {max} gross sein
-validator.email=not a well-formed email address
-validator.notEmpty=kann nicht null oder leer sein
-validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
-validator.ean=invalid EAN
-validator.creditCard=Ungültige Kreditkartennummer
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_de.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_de.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_de.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_de.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=nicht garantiert
+validator.assertTrue=garantiert
+validator.future=muss in der Zukunft liegen
+validator.length=muss zwischen {min} und {max} lang sein
+validator.max=muss weniger oder gleich {value} sein
+validator.min=muss mehr oder gleich {value} sein
+validator.notNull=kann nicht leer sein
+validator.past=muss in der Vergangenheit liegen
+validator.pattern=muss Ausdruck "{regex}" entsprechen
+validator.range=muss zwischen {min} und {max} sein
+validator.size=muss zwischen {min} und {max} gross sein
+validator.email=not a well-formed email address
+validator.notEmpty=kann nicht null oder leer sein
+validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
+validator.ean=invalid EAN
+validator.creditCard=Ungültige Kreditkartennummer
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_es.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_es.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_es.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=aserción fallida
-validator.assertTrue=aserción fallida
-validator.future=debe ser una fecha futura
-validator.length=la longitud debe ser entre {min} y {max}
-validator.max=debe ser menor o igual a {value}
-validator.min=debe ser mayor o igual a {value}
-validator.notNull=no puede ser nula
-validator.past=debe ser una fecha pasada
-validator.pattern=debe corresponder a "{regex}"
-validator.range=debe ser entre {min} y {max}
-validator.size=el tamaño debe ser entre {min} y {max}
-validator.email=no es una dirección de correo electrónico bien formada
-validator.notEmpty=no debe ser nulo o vacío
-validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
-validator.ean=invalid EAN
-validator.creditCard=invalid credit card number
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_es.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_es.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_es.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_es.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=aserción fallida
+validator.assertTrue=aserción fallida
+validator.future=debe ser una fecha futura
+validator.length=la longitud debe ser entre {min} y {max}
+validator.max=debe ser menor o igual a {value}
+validator.min=debe ser mayor o igual a {value}
+validator.notNull=no puede ser nula
+validator.past=debe ser una fecha pasada
+validator.pattern=debe corresponder a "{regex}"
+validator.range=debe ser entre {min} y {max}
+validator.size=el tamaño debe ser entre {min} y {max}
+validator.email=no es una dirección de correo electrónico bien formada
+validator.notEmpty=no debe ser nulo o vacío
+validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
+validator.ean=invalid EAN
+validator.creditCard=invalid credit card number
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_fr.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_fr.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_fr.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=l'assertion a échoué
-validator.assertTrue=l'assertion a échoué
-validator.future=doit être dans le futur
-validator.length=la longueur doit être entre {min} et {max}
-validator.max=doit être inférieur ou égal à {value}
-validator.min=doit être supérieur ou égal à {value}
-validator.notNull=ne peut pas être nul
-validator.past=doit être dans le passé
-validator.pattern=doit suivre "{regex}"
-validator.range=doit être entre {min} et {max}
-validator.size=le nombre d'éléments doit être entre {min} et {max}
-validator.email=Address email mal formée
-validator.notEmpty=ne peut pas être nul ou vide
-validator.digits=Valeur numérique hors limite (<{integerDigits} chiffres>.<{fractionalDigits} chiffres> attendus)
-validator.ean=EAN invalide
-validator.creditCard=Numéro de carte de crédit invalide
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_fr.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_fr.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_fr.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_fr.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=l'assertion a échoué
+validator.assertTrue=l'assertion a échoué
+validator.future=doit être dans le futur
+validator.length=la longueur doit être entre {min} et {max}
+validator.max=doit être inférieur ou égal à {value}
+validator.min=doit être supérieur ou égal à {value}
+validator.notNull=ne peut pas être nul
+validator.past=doit être dans le passé
+validator.pattern=doit suivre "{regex}"
+validator.range=doit être entre {min} et {max}
+validator.size=le nombre d'éléments doit être entre {min} et {max}
+validator.email=Address email mal formée
+validator.notEmpty=ne peut pas être nul ou vide
+validator.digits=Valeur numérique hors limite (<{integerDigits} chiffres>.<{fractionalDigits} chiffres> attendus)
+validator.ean=EAN invalide
+validator.creditCard=Numéro de carte de crédit invalide
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_it.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_it.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_it.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=asserzione fallita
-validator.assertTrue=asserzione fallita
-validator.future=deve essere una data futura
-validator.length=la lunghezza deve essere tra {min} e {max}
-validator.max=deve essere minore o uguale a {value}
-validator.min=deve essere maggiore o uguale a {value}
-validator.notNull=non può essere nullo
-validator.past=deve essere una data nel passato
-validator.pattern=deve corrispondere a "{regex}"
-validator.range=deve essere tra {min} e {max}
-validator.size=le dimensioni devono essere tra {min} e {max}
-validator.email=not a well-formed email address
-validator.notEmpty=non può essere nullo o vuoto
-validator.digits=Valore numerico fuori dai limiti (atteso <{integerDigits} cifre>.<{fractionalDigits} cifre>)
-validator.ean=EAN invalido
-validator.creditCard=invalid credit card number
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_it.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_it.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_it.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_it.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=asserzione fallita
+validator.assertTrue=asserzione fallita
+validator.future=deve essere una data futura
+validator.length=la lunghezza deve essere tra {min} e {max}
+validator.max=deve essere minore o uguale a {value}
+validator.min=deve essere maggiore o uguale a {value}
+validator.notNull=non può essere nullo
+validator.past=deve essere una data nel passato
+validator.pattern=deve corrispondere a "{regex}"
+validator.range=deve essere tra {min} e {max}
+validator.size=le dimensioni devono essere tra {min} e {max}
+validator.email=not a well-formed email address
+validator.notEmpty=non può essere nullo o vuoto
+validator.digits=Valore numerico fuori dai limiti (atteso <{integerDigits} cifre>.<{fractionalDigits} cifre>)
+validator.ean=EAN invalido
+validator.creditCard=invalid credit card number
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_nl.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_nl.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_nl.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=is niet geldig
-validator.assertTrue=is niet geldig
-validator.future=moet een datum in de toekomst zijn
-validator.length=moet tussen {min} en {max} lang zijn
-validator.max=moet kleiner of gelijk aan {value} zijn
-validator.min=moet groter of gelijk aan {value} zijn
-validator.notNull=mag niet leeg zijn
-validator.past=moet een datum in het verleden zijn
-validator.pattern=moet overeenkomen met "{regex}"
-validator.range=moet tussen {min} en {max} zijn
-validator.size=moet tussen {min} en {max} groot zijn
-validator.email=moet een geldig e-mail adres zijn
-validator.notEmpty=mag niet null of leeg zijn
-validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
-validator.ean=invalid EAN
-validator.creditCard=invalid credit card number
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_nl.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_nl.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_nl.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_nl.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=is niet geldig
+validator.assertTrue=is niet geldig
+validator.future=moet een datum in de toekomst zijn
+validator.length=moet tussen {min} en {max} lang zijn
+validator.max=moet kleiner of gelijk aan {value} zijn
+validator.min=moet groter of gelijk aan {value} zijn
+validator.notNull=mag niet leeg zijn
+validator.past=moet een datum in het verleden zijn
+validator.pattern=moet overeenkomen met "{regex}"
+validator.range=moet tussen {min} en {max} zijn
+validator.size=moet tussen {min} en {max} groot zijn
+validator.email=moet een geldig e-mail adres zijn
+validator.notEmpty=mag niet null of leeg zijn
+validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
+validator.ean=invalid EAN
+validator.creditCard=invalid credit card number
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_pt_BR.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_pt_BR.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_pt_BR.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=asserção falhou
-validator.assertTrue=asserção falhou
-validator.future=deve ser uma data no futuro
-validator.length=tamanho deve estar entre {min} e {max}
-validator.max=deve ser menor ou igual a {value}
-validator.min=deve ser maior ou igual a {value}
-validator.notNull=não pode ser nulo
-validator.past=deve ser uma data no passado
-validator.pattern=deve ser válida de acordo com a expressão "{regex}"
-validator.range=deve estar entre {min} e {max}
-validator.size=tamanho deve estar entre {min} e {max}
-validator.email=não é um email válido
-validator.notEmpty=não pode ser nulo ou vazio
-validator.digits=Valor numérico fora do padrão (esperado <{integerDigits}> dígitos,<{fractionalDigits} dígitos)
-validator.ean=EAN inválido
-validator.creditCard=Número inválido de cartão de crédito
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_pt_BR.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_pt_BR.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_pt_BR.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_pt_BR.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=asserção falhou
+validator.assertTrue=asserção falhou
+validator.future=deve ser uma data no futuro
+validator.length=tamanho deve estar entre {min} e {max}
+validator.max=deve ser menor ou igual a {value}
+validator.min=deve ser maior ou igual a {value}
+validator.notNull=não pode ser nulo
+validator.past=deve ser uma data no passado
+validator.pattern=deve ser válida de acordo com a expressão "{regex}"
+validator.range=deve estar entre {min} e {max}
+validator.size=tamanho deve estar entre {min} e {max}
+validator.email=não é um email válido
+validator.notEmpty=não pode ser nulo ou vazio
+validator.digits=Valor numérico fora do padrão (esperado <{integerDigits}> dígitos,<{fractionalDigits} dígitos)
+validator.ean=EAN inválido
+validator.creditCard=Número inválido de cartão de crédito
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_sv.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_sv.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_sv.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=Felaktigt påstående
-validator.assertTrue=Felaktigt påstående
-validator.future=måste vara ett datum fram i tiden
-validator.length=måste vara mellan {min} och {max} tecken
-validator.max=får vara max {value}
-validator.min=måste vara minst {value}
-validator.notNull=får inte vara tomt
-validator.past=måste vara ett datum bakåt i tiden
-validator.pattern=måste matcha "{regex}"
-validator.range=måste vara mellan {min} och {max}
-validator.size=storlek måste vara mellan {min} och {max}
-validator.email=ogiltig e-mail adress
-validator.notEmpty=får inte vara tomt
-validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
-validator.ean=invalid EAN
-validator.creditCard=invalid credit card number
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_sv.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_sv.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_sv.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_sv.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=Felaktigt påstående
+validator.assertTrue=Felaktigt påstående
+validator.future=måste vara ett datum fram i tiden
+validator.length=måste vara mellan {min} och {max} tecken
+validator.max=får vara max {value}
+validator.min=måste vara minst {value}
+validator.notNull=får inte vara tomt
+validator.past=måste vara ett datum bakåt i tiden
+validator.pattern=måste matcha "{regex}"
+validator.range=måste vara mellan {min} och {max}
+validator.size=storlek måste vara mellan {min} och {max}
+validator.email=ogiltig e-mail adress
+validator.notEmpty=får inte vara tomt
+validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
+validator.ean=invalid EAN
+validator.creditCard=invalid credit card number
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_CN.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_CN.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_CN.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=\u9a8c\u8bc1\u5931\u8d25
-validator.assertTrue=\u9a8c\u8bc1\u5931\u8d25
-validator.future=\u5fc5\u987b\u8fdf\u4e8e\u4eca\u65e5
-validator.length=\u957f\u5ea6\u5fc5\u987b\u4ecb\u4e8e {min} \u4e0e {max} \u4e4b\u95f4
-validator.max=\u5fc5\u987b\u5c0f\u4e8e\u7b49\u4e8e {value}
-validator.min=\u5fc5\u987b\u5927\u4e8e\u7b49\u4e8e {value}
-validator.notNull=\u4e0d\u80fd\u4e3a\u7a7a
-validator.past=\u5fc5\u987b\u65e9\u4e8e\u4eca\u65e5
-validator.pattern=\u5fc5\u987b\u7b26\u5408 "{regex}"
-validator.range=\u5fc5\u987b\u4ecb\u4e8e {min} \u4e0e {max} \u4e4b\u95f4
-validator.size=\u5927\u5c0f\u5fc5\u987b\u4ecb\u4e8e {min} \u4e0e {max} \u4e4b\u95f4
-validator.email=not a well-formed email address
-validator.notEmpty=may not be null or empty
-validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
-validator.ean=invalid EAN
-validator.creditCard=invalid credit card number
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_CN.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_CN.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_CN.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_CN.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=\u9a8c\u8bc1\u5931\u8d25
+validator.assertTrue=\u9a8c\u8bc1\u5931\u8d25
+validator.future=\u5fc5\u987b\u8fdf\u4e8e\u4eca\u65e5
+validator.length=\u957f\u5ea6\u5fc5\u987b\u4ecb\u4e8e {min} \u4e0e {max} \u4e4b\u95f4
+validator.max=\u5fc5\u987b\u5c0f\u4e8e\u7b49\u4e8e {value}
+validator.min=\u5fc5\u987b\u5927\u4e8e\u7b49\u4e8e {value}
+validator.notNull=\u4e0d\u80fd\u4e3a\u7a7a
+validator.past=\u5fc5\u987b\u65e9\u4e8e\u4eca\u65e5
+validator.pattern=\u5fc5\u987b\u7b26\u5408 "{regex}"
+validator.range=\u5fc5\u987b\u4ecb\u4e8e {min} \u4e0e {max} \u4e4b\u95f4
+validator.size=\u5927\u5c0f\u5fc5\u987b\u4ecb\u4e8e {min} \u4e0e {max} \u4e4b\u95f4
+validator.email=not a well-formed email address
+validator.notEmpty=may not be null or empty
+validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
+validator.ean=invalid EAN
+validator.creditCard=invalid credit card number
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_TW.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_TW.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_TW.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-validator.assertFalse=\u9a57\u8b49\u5931\u6557
-validator.assertTrue=\u9a57\u8b49\u5931\u6557
-validator.future=\u5fc5\u9808\u9072\u4e8e\u4eca\u65e5
-validator.length=\u9577\u5ea6\u5fc5\u9808\u4ecb\u65bc {min} \u8207 {max} \u4e4b\u9593
-validator.max=\u5fc5\u9808\u5c0f\u4e8e\u6216\u7b49\u65bc{value}
-validator.min=\u5fc5\u9808\u5927\u4e8e\u6216\u7b49\u65bc{value}
-validator.notNull=\u5fc5\u9808\u586b\u5beb
-validator.past=\u5fc5\u9808\u65e9\u4e8e\u4eca\u65e5
-validator.pattern=\u5fc5\u9808\u7b26\u5408"{regex}"
-validator.range=\u5fc5\u9808\u4ecb\u65bc{min} \u8207 {max} \u4e4b\u9593
-validator.size=\u5927\u5c0f\u5fc5\u9808\u4ecb\u65bc{min} \u8207 {max} \u4e4b\u9593
-validator.email=not a well-formed email address
-validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
-validator.notEmpty=may not be null or empty
-validator.ean=invalid EAN
-validator.creditCard=invalid credit card number
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_TW.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_TW.properties)
===================================================================
--- trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_TW.properties (rev 0)
+++ trunk/HibernateExt/validator/src/java/org/hibernate/validator/resources/DefaultValidatorMessages_zh_TW.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+validator.assertFalse=\u9a57\u8b49\u5931\u6557
+validator.assertTrue=\u9a57\u8b49\u5931\u6557
+validator.future=\u5fc5\u9808\u9072\u4e8e\u4eca\u65e5
+validator.length=\u9577\u5ea6\u5fc5\u9808\u4ecb\u65bc {min} \u8207 {max} \u4e4b\u9593
+validator.max=\u5fc5\u9808\u5c0f\u4e8e\u6216\u7b49\u65bc{value}
+validator.min=\u5fc5\u9808\u5927\u4e8e\u6216\u7b49\u65bc{value}
+validator.notNull=\u5fc5\u9808\u586b\u5beb
+validator.past=\u5fc5\u9808\u65e9\u4e8e\u4eca\u65e5
+validator.pattern=\u5fc5\u9808\u7b26\u5408"{regex}"
+validator.range=\u5fc5\u9808\u4ecb\u65bc{min} \u8207 {max} \u4e4b\u9593
+validator.size=\u5927\u5c0f\u5fc5\u9808\u4ecb\u65bc{min} \u8207 {max} \u4e4b\u9593
+validator.email=not a well-formed email address
+validator.digits=numeric value out of bounds (<{integerDigits} digits>.<{fractionalDigits} digits> expected)
+validator.notEmpty=may not be null or empty
+validator.ean=invalid EAN
+validator.creditCard=invalid credit card number
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/test (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test)
Deleted: trunk/HibernateExt/validator/src/test/ValidatorMessages.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/ValidatorMessages.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/ValidatorMessages.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,7 +0,0 @@
-#overriding of default keys
-
-#specific to my project
-long=is too damn long
-floor.name=Floor
-out.of.range=lower that {min} and greater than {max}
-floor.out.of.range={floor.name} cannot be {out.of.range}
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/test/ValidatorMessages.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/ValidatorMessages.properties)
===================================================================
--- trunk/HibernateExt/validator/src/test/ValidatorMessages.properties (rev 0)
+++ trunk/HibernateExt/validator/src/test/ValidatorMessages.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,7 @@
+#overriding of default keys
+
+#specific to my project
+long=is too damn long
+floor.name=Floor
+out.of.range=lower that {min} and greater than {max}
+floor.out.of.range={floor.name} cannot be {out.of.range}
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/test/ValidatorMessages_da.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/ValidatorMessages_da.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/ValidatorMessages_da.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,7 +0,0 @@
-#overriding of default keys
-
-#specific to my project
-long=is too damn long
-floor.name=Floor
-out.of.range=lower that {min} and greater than {max}
-floor.out.of.range={floor.name} cannot be {out.of.range}
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/test/ValidatorMessages_da.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/ValidatorMessages_da.properties)
===================================================================
--- trunk/HibernateExt/validator/src/test/ValidatorMessages_da.properties (rev 0)
+++ trunk/HibernateExt/validator/src/test/ValidatorMessages_da.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,7 @@
+#overriding of default keys
+
+#specific to my project
+long=is too damn long
+floor.name=Floor
+out.of.range=lower that {min} and greater than {max}
+floor.out.of.range={floor.name} cannot be {out.of.range}
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/test/ValidatorMessages_fr.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/ValidatorMessages_fr.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/ValidatorMessages_fr.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,7 +0,0 @@
-#overriding of default keys
-
-#specific to my project
-long=est grave trop long
-floor.name=Etage
-out.of.range=plus petit que {min} ou plus grand que {max}
-floor.out.of.range={floor.name} ne peut pas être {out.of.range}
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/test/ValidatorMessages_fr.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/ValidatorMessages_fr.properties)
===================================================================
--- trunk/HibernateExt/validator/src/test/ValidatorMessages_fr.properties (rev 0)
+++ trunk/HibernateExt/validator/src/test/ValidatorMessages_fr.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,7 @@
+#overriding of default keys
+
+#specific to my project
+long=est grave trop long
+floor.name=Etage
+out.of.range=plus petit que {min} ou plus grand que {max}
+floor.out.of.range={floor.name} ne peut pas être {out.of.range}
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/test/hibernate.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/hibernate.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/hibernate.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,472 +0,0 @@
-######################
-### Query Language ###
-######################
-
-## define query language constants / function names
-
-hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
-
-
-## select the classic query parser
-
-#hibernate.query.factory_class org.hibernate.hql.classic.ClassicQueryTranslatorFactory
-
-hibernate.format_sql true
-
-
-
-#################
-### Platforms ###
-#################
-
-## JNDI Datasource
-
-#hibernate.connection.datasource jdbc/test
-#hibernate.connection.username db2
-#hibernate.connection.password db2
-
-
-## HypersonicSQL
-
-hibernate.dialect org.hibernate.dialect.HSQLDialect
-hibernate.connection.driver_class org.hsqldb.jdbcDriver
-hibernate.connection.username sa
-hibernate.connection.password
-hibernate.connection.url jdbc:hsqldb:hsql://localhost
-hibernate.connection.url jdbc:hsqldb:test
-hibernate.connection.url jdbc:hsqldb:.
-
-
-## MySQL
-
-#hibernate.dialect org.hibernate.dialect.MySQLDialect
-#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
-#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
-#hibernate.connection.driver_class com.mysql.jdbc.Driver
-#hibernate.connection.url jdbc:mysql:///test
-#hibernate.connection.username emmanuel
-#hibernate.connection.password
-
-
-## Oracle
-
-#hibernate.dialect org.hibernate.dialect.OracleDialect
-#hibernate.dialect org.hibernate.dialect.Oracle9Dialect
-#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
-#hibernate.connection.username ora
-#hibernate.connection.password ora
-#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:test
-
-
-## PostgreSQL
-
-#hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
-#hibernate.connection.driver_class org.postgresql.Driver
-#hibernate.connection.url jdbc:postgresql:annotations
-#hibernate.connection.username postgres
-#hibernate.connection.password hibernate
-#hibernate.query.substitutions yes 'Y', no 'N'
-
-
-## DB2
-
-#hibernate.dialect org.hibernate.dialect.DB2Dialect
-#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
-#hibernate.connection.url jdbc:db2:test
-#hibernate.connection.username db2
-#hibernate.connection.password db2
-
-## TimesTen (not supported yet)
-
-#hibernate.dialect org.hibernate.dialect.TimesTenDialect
-#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
-#hibernate.connection.url jdbc:timesten:direct:test
-#hibernate.connection.username
-#hibernate.connection.password
-
-## DB2/400
-
-#hibernate.dialect org.hibernate.dialect.DB2400Dialect
-#hibernate.connection.username user
-#hibernate.connection.password password
-
-## Native driver
-#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
-#hibernate.connection.url jdbc:db2://systemname
-
-## Toolbox driver
-#hibernate.connection.driver_class com.ibm.as400.access.AS400JDBCDriver
-#hibernate.connection.url jdbc:as400://systemname
-
-
-## Derby (Not supported!)
-
-#hibernate.dialect org.hibernate.dialect.DerbyDialect
-#hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver
-#hibernate.connection.username
-#hibernate.connection.password
-#hibernate.connection.url jdbc:derby:/test;create=true
-
-
-## Sybase
-
-#hibernate.dialect org.hibernate.dialect.SybaseDialect
-#hibernate.connection.driver_class com.sybase.jdbc2.jdbc.SybDriver
-#hibernate.connection.username sa
-#hibernate.connection.password sasasa
-#hibernate.connection.url jdbc:sybase:Tds:co3061835-a:5000/tempdb
-
-
-## Mckoi SQL
-
-#hibernate.dialect org.hibernate.dialect.MckoiDialect
-#hibernate.connection.driver_class com.mckoi.JDBCDriver
-#hibernate.connection.url jdbc:mckoi:///
-#hibernate.connection.url jdbc:mckoi:local://C:/mckoi1.00/db.conf
-#hibernate.connection.username admin
-#hibernate.connection.password nimda
-
-
-## SAP DB
-
-#hibernate.dialect org.hibernate.dialect.SAPDBDialect
-#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
-#hibernate.connection.url jdbc:sapdb://localhost/TST
-#hibernate.connection.username TEST
-#hibernate.connection.password TEST
-#hibernate.query.substitutions yes 'Y', no 'N'
-
-
-## MS SQL Server
-
-#hibernate.dialect org.hibernate.dialect.SQLServerDialect
-#hibernate.connection.username sa
-#hibernate.connection.password sa
-
-## JSQL Driver
-#hibernate.connection.driver_class com.jnetdirect.jsql.JSQLDriver
-#hibernate.connection.url jdbc:JSQLConnect://1E1/test
-
-## JTURBO Driver
-#hibernate.connection.driver_class com.newatlanta.jturbo.driver.Driver
-#hibernate.connection.url jdbc:JTurbo://1E1:1433/test
-
-## WebLogic Driver
-#hibernate.connection.driver_class weblogic.jdbc.mssqlserver4.Driver
-#hibernate.connection.url jdbc:weblogic:mssqlserver4:1E1:1433
-
-## Microsoft Driver (not recommended!)
-#hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
-#hibernate.connection.url jdbc:microsoft:sqlserver://1E1;DatabaseName=test;SelectMethod=cursor
-
-## jTDS (since version 0.9)
-#hibernate.connection.driver_class net.sourceforge.jtds.jdbc.Driver
-#hibernate.connection.url jdbc:jtds:sqlserver://1E1/test
-
-## Interbase
-
-#hibernate.dialect org.hibernate.dialect.InterbaseDialect
-#hibernate.connection.username sysdba
-#hibernate.connection.password masterkey
-
-## DO NOT specify hibernate.connection.sqlDialect
-
-## InterClient
-
-#hibernate.connection.driver_class interbase.interclient.Driver
-#hibernate.connection.url jdbc:interbase://localhost:3060/C:/firebird/test.gdb
-
-## Pure Java
-
-#hibernate.connection.driver_class org.firebirdsql.jdbc.FBDriver
-#hibernate.connection.url jdbc:firebirdsql:localhost/3050:/firebird/test.gdb
-
-
-## Pointbase
-
-#hibernate.dialect org.hibernate.dialect.PointbaseDialect
-#hibernate.connection.driver_class com.pointbase.jdbc.jdbcUniversalDriver
-#hibernate.connection.url jdbc:pointbase:embedded:sample
-#hibernate.connection.username PBPUBLIC
-#hibernate.connection.password PBPUBLIC
-
-
-
-#################################
-### Hibernate Connection Pool ###
-#################################
-
-hibernate.connection.pool_size 1
-
-
-
-###########################
-### C3P0 Connection Pool###
-###########################
-
-#hibernate.c3p0.max_size 2
-#hibernate.c3p0.min_size 2
-#hibernate.c3p0.timeout 5000
-#hibernate.c3p0.max_statements 100
-#hibernate.c3p0.idle_test_period 3000
-#hibernate.c3p0.acquire_increment 2
-#hibernate.c3p0.validate false
-
-
-
-##############################
-### Proxool Connection Pool###
-##############################
-
-## Properties for external configuration of Proxool
-
-hibernate.proxool.pool_alias pool1
-
-## Only need one of the following
-
-#hibernate.proxool.existing_pool true
-#hibernate.proxool.xml proxool.xml
-#hibernate.proxool.properties proxool.properties
-
-
-
-#################################
-### Plugin ConnectionProvider ###
-#################################
-
-## use a custom ConnectionProvider (if not set, Hibernate will choose a built-in ConnectionProvider using hueristics)
-
-#hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider
-#hibernate.connection.provider_class org.hibernate.connection.ProxoolConnectionProvider
-
-
-
-#######################
-### Transaction API ###
-#######################
-
-## Enable automatic flush during the JTA beforeCompletion() callback
-## (This setting is relevant with or without the Transaction API)
-
-#hibernate.transaction.flush_before_completion
-
-
-## Enable automatic session close at the end of transaction
-## (This setting is relevant with or without the Transaction API)
-
-#hibernate.transaction.auto_close_session
-
-
-## the Transaction API abstracts application code from the underlying JTA or JDBC transactions
-
-#hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
-#hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
-
-
-## to use JTATransactionFactory, Hibernate must be able to locate the UserTransaction in JNDI
-## default is java:comp/UserTransaction
-## you do NOT need this setting if you specify hibernate.transaction.manager_lookup_class
-
-#jta.UserTransaction jta/usertransaction
-#jta.UserTransaction javax.transaction.UserTransaction
-#jta.UserTransaction UserTransaction
-
-
-## to use the second-level cache with JTA, Hibernate must be able to obtain the JTA TransactionManager
-
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.JBossTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WeblogicTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WebSphereTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.OrionTransactionManagerLookup
-#hibernate.transaction.manager_lookup_class org.hibernate.transaction.ResinTransactionManagerLookup
-
-
-
-##############################
-### Miscellaneous Settings ###
-##############################
-
-## print all generated SQL to the console
-
-#hibernate.show_sql true
-
-
-## add comments to the generated SQL
-
-#hibernate.use_sql_comments true
-
-
-## generate statistics
-
-#hibernate.generate_statistics true
-
-
-## auto schema export
-
-#hibernate.hbm2ddl.auto create-drop
-#hibernate.hbm2ddl.auto create
-#hibernate.hbm2ddl.auto update
-
-
-## specify a default schema and catalog for unqualified tablenames
-
-#hibernate.default_schema test
-#hibernate.default_catalog test
-
-
-## enable ordering of SQL UPDATEs by primary key
-
-hibernate.order_updates true
-
-
-## set the maximum depth of the outer join fetch tree
-
-hibernate.max_fetch_depth 1
-
-
-## set the default batch size for batch fetching
-
-hibernate.default_batch_fetch_size 100
-
-
-## rollback generated identifier values of deleted entities to default values
-
-#hibernate.use_identifer_rollback true
-
-
-## enable CGLIB reflection optimizer (enabled by default)
-
-#hibernate.cglib.use_reflection_optimizer false
-
-
-
-#####################
-### JDBC Settings ###
-#####################
-
-## specify a JDBC isolation level
-
-#hibernate.connection.isolation 4
-
-
-## enable JDBC autocommit (not recommended!)
-
-#hibernate.connection.autocommit true
-
-
-## set the JDBC fetch size
-
-#hibernate.jdbc.fetch_size 25
-
-
-## set the maximum JDBC 2 batch size (a nonzero value enables batching)
-
-#hibernate.jdbc.batch_size 0
-
-
-## enable batch updates even for versioned data
-
-hibernate.jdbc.batch_versioned_data true
-
-
-## enable use of JDBC 2 scrollable ResultSets (specifying a Dialect will cause Hibernate to use a sensible default)
-
-#hibernate.jdbc.use_scrollable_resultset true
-
-
-## use streams when writing binary types to / from JDBC
-
-hibernate.jdbc.use_streams_for_binary true
-
-
-## use JDBC 3 PreparedStatement.getGeneratedKeys() to get the identifier of an inserted row
-
-#hibernate.jdbc.use_get_generated_keys false
-
-
-## choose a custom JDBC batcher
-
-# hibernate.jdbc.factory_class
-
-
-## enable JDBC result set column alias caching
-## (minor performance enhancement for broken JDBC drivers)
-
-# hibernate.jdbc.wrap_result_sets
-
-
-## choose a custom SQL exception converter
-
-#hibernate.jdbc.sql_exception_converter
-
-
-
-##########################
-### Second-level Cache ###
-##########################
-
-## optimize chache for minimal "puts" instead of minimal "gets" (good for clustered cache)
-
-#hibernate.cache.use_minimal_puts true
-
-
-## set a prefix for cache region names
-
-hibernate.cache.region_prefix hibernate.test
-
-
-## disable the second-level cache
-
-#hibernate.cache.use_second_level_cache false
-
-
-## enable the query cache
-
-hibernate.cache.use_query_cache true
-
-
-## store the second-level cache entries in a more human-friendly format
-
-#hibernate.cache.use_structured_entries true
-
-
-## choose a cache implementation
-
-#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
-hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
-#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
-
-
-## choose a custom query cache implementation
-
-#hibernate.cache.query_cache_factory
-
-
-
-############
-### JNDI ###
-############
-
-## specify a JNDI name for the SessionFactory
-
-#hibernate.session_factory_name hibernate/session_factory
-
-
-## Hibernate uses JNDI to bind a name to a SessionFactory and to look up the JTA UserTransaction;
-## if hibernate.jndi.* are not specified, Hibernate will use the default InitialContext() which
-## is the best approach in an application server
-
-#file system
-#hibernate.jndi.class com.sun.jndi.fscontext.RefFSContextFactory
-#hibernate.jndi.url file:/
-
-#WebSphere
-#hibernate.jndi.class com.ibm.websphere.naming.WsnInitialContextFactory
-#hibernate.jndi.url iiop://localhost:900/
-
Copied: trunk/HibernateExt/validator/src/test/hibernate.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/hibernate.properties)
===================================================================
--- trunk/HibernateExt/validator/src/test/hibernate.properties (rev 0)
+++ trunk/HibernateExt/validator/src/test/hibernate.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,472 @@
+######################
+### Query Language ###
+######################
+
+## define query language constants / function names
+
+hibernate.query.substitutions true 1, false 0, yes 'Y', no 'N'
+
+
+## select the classic query parser
+
+#hibernate.query.factory_class org.hibernate.hql.classic.ClassicQueryTranslatorFactory
+
+hibernate.format_sql true
+
+
+
+#################
+### Platforms ###
+#################
+
+## JNDI Datasource
+
+#hibernate.connection.datasource jdbc/test
+#hibernate.connection.username db2
+#hibernate.connection.password db2
+
+
+## HypersonicSQL
+
+hibernate.dialect org.hibernate.dialect.HSQLDialect
+hibernate.connection.driver_class org.hsqldb.jdbcDriver
+hibernate.connection.username sa
+hibernate.connection.password
+hibernate.connection.url jdbc:hsqldb:hsql://localhost
+hibernate.connection.url jdbc:hsqldb:test
+hibernate.connection.url jdbc:hsqldb:.
+
+
+## MySQL
+
+#hibernate.dialect org.hibernate.dialect.MySQLDialect
+#hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect
+#hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect
+#hibernate.connection.driver_class com.mysql.jdbc.Driver
+#hibernate.connection.url jdbc:mysql:///test
+#hibernate.connection.username emmanuel
+#hibernate.connection.password
+
+
+## Oracle
+
+#hibernate.dialect org.hibernate.dialect.OracleDialect
+#hibernate.dialect org.hibernate.dialect.Oracle9Dialect
+#hibernate.connection.driver_class oracle.jdbc.driver.OracleDriver
+#hibernate.connection.username ora
+#hibernate.connection.password ora
+#hibernate.connection.url jdbc:oracle:thin:@localhost:1521:test
+
+
+## PostgreSQL
+
+#hibernate.dialect org.hibernate.dialect.PostgreSQLDialect
+#hibernate.connection.driver_class org.postgresql.Driver
+#hibernate.connection.url jdbc:postgresql:annotations
+#hibernate.connection.username postgres
+#hibernate.connection.password hibernate
+#hibernate.query.substitutions yes 'Y', no 'N'
+
+
+## DB2
+
+#hibernate.dialect org.hibernate.dialect.DB2Dialect
+#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
+#hibernate.connection.url jdbc:db2:test
+#hibernate.connection.username db2
+#hibernate.connection.password db2
+
+## TimesTen (not supported yet)
+
+#hibernate.dialect org.hibernate.dialect.TimesTenDialect
+#hibernate.connection.driver_class com.timesten.jdbc.TimesTenDriver
+#hibernate.connection.url jdbc:timesten:direct:test
+#hibernate.connection.username
+#hibernate.connection.password
+
+## DB2/400
+
+#hibernate.dialect org.hibernate.dialect.DB2400Dialect
+#hibernate.connection.username user
+#hibernate.connection.password password
+
+## Native driver
+#hibernate.connection.driver_class COM.ibm.db2.jdbc.app.DB2Driver
+#hibernate.connection.url jdbc:db2://systemname
+
+## Toolbox driver
+#hibernate.connection.driver_class com.ibm.as400.access.AS400JDBCDriver
+#hibernate.connection.url jdbc:as400://systemname
+
+
+## Derby (Not supported!)
+
+#hibernate.dialect org.hibernate.dialect.DerbyDialect
+#hibernate.connection.driver_class org.apache.derby.jdbc.EmbeddedDriver
+#hibernate.connection.username
+#hibernate.connection.password
+#hibernate.connection.url jdbc:derby:/test;create=true
+
+
+## Sybase
+
+#hibernate.dialect org.hibernate.dialect.SybaseDialect
+#hibernate.connection.driver_class com.sybase.jdbc2.jdbc.SybDriver
+#hibernate.connection.username sa
+#hibernate.connection.password sasasa
+#hibernate.connection.url jdbc:sybase:Tds:co3061835-a:5000/tempdb
+
+
+## Mckoi SQL
+
+#hibernate.dialect org.hibernate.dialect.MckoiDialect
+#hibernate.connection.driver_class com.mckoi.JDBCDriver
+#hibernate.connection.url jdbc:mckoi:///
+#hibernate.connection.url jdbc:mckoi:local://C:/mckoi1.00/db.conf
+#hibernate.connection.username admin
+#hibernate.connection.password nimda
+
+
+## SAP DB
+
+#hibernate.dialect org.hibernate.dialect.SAPDBDialect
+#hibernate.connection.driver_class com.sap.dbtech.jdbc.DriverSapDB
+#hibernate.connection.url jdbc:sapdb://localhost/TST
+#hibernate.connection.username TEST
+#hibernate.connection.password TEST
+#hibernate.query.substitutions yes 'Y', no 'N'
+
+
+## MS SQL Server
+
+#hibernate.dialect org.hibernate.dialect.SQLServerDialect
+#hibernate.connection.username sa
+#hibernate.connection.password sa
+
+## JSQL Driver
+#hibernate.connection.driver_class com.jnetdirect.jsql.JSQLDriver
+#hibernate.connection.url jdbc:JSQLConnect://1E1/test
+
+## JTURBO Driver
+#hibernate.connection.driver_class com.newatlanta.jturbo.driver.Driver
+#hibernate.connection.url jdbc:JTurbo://1E1:1433/test
+
+## WebLogic Driver
+#hibernate.connection.driver_class weblogic.jdbc.mssqlserver4.Driver
+#hibernate.connection.url jdbc:weblogic:mssqlserver4:1E1:1433
+
+## Microsoft Driver (not recommended!)
+#hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
+#hibernate.connection.url jdbc:microsoft:sqlserver://1E1;DatabaseName=test;SelectMethod=cursor
+
+## jTDS (since version 0.9)
+#hibernate.connection.driver_class net.sourceforge.jtds.jdbc.Driver
+#hibernate.connection.url jdbc:jtds:sqlserver://1E1/test
+
+## Interbase
+
+#hibernate.dialect org.hibernate.dialect.InterbaseDialect
+#hibernate.connection.username sysdba
+#hibernate.connection.password masterkey
+
+## DO NOT specify hibernate.connection.sqlDialect
+
+## InterClient
+
+#hibernate.connection.driver_class interbase.interclient.Driver
+#hibernate.connection.url jdbc:interbase://localhost:3060/C:/firebird/test.gdb
+
+## Pure Java
+
+#hibernate.connection.driver_class org.firebirdsql.jdbc.FBDriver
+#hibernate.connection.url jdbc:firebirdsql:localhost/3050:/firebird/test.gdb
+
+
+## Pointbase
+
+#hibernate.dialect org.hibernate.dialect.PointbaseDialect
+#hibernate.connection.driver_class com.pointbase.jdbc.jdbcUniversalDriver
+#hibernate.connection.url jdbc:pointbase:embedded:sample
+#hibernate.connection.username PBPUBLIC
+#hibernate.connection.password PBPUBLIC
+
+
+
+#################################
+### Hibernate Connection Pool ###
+#################################
+
+hibernate.connection.pool_size 1
+
+
+
+###########################
+### C3P0 Connection Pool###
+###########################
+
+#hibernate.c3p0.max_size 2
+#hibernate.c3p0.min_size 2
+#hibernate.c3p0.timeout 5000
+#hibernate.c3p0.max_statements 100
+#hibernate.c3p0.idle_test_period 3000
+#hibernate.c3p0.acquire_increment 2
+#hibernate.c3p0.validate false
+
+
+
+##############################
+### Proxool Connection Pool###
+##############################
+
+## Properties for external configuration of Proxool
+
+hibernate.proxool.pool_alias pool1
+
+## Only need one of the following
+
+#hibernate.proxool.existing_pool true
+#hibernate.proxool.xml proxool.xml
+#hibernate.proxool.properties proxool.properties
+
+
+
+#################################
+### Plugin ConnectionProvider ###
+#################################
+
+## use a custom ConnectionProvider (if not set, Hibernate will choose a built-in ConnectionProvider using hueristics)
+
+#hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.DatasourceConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.C3P0ConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.DBCPConnectionProvider
+#hibernate.connection.provider_class org.hibernate.connection.ProxoolConnectionProvider
+
+
+
+#######################
+### Transaction API ###
+#######################
+
+## Enable automatic flush during the JTA beforeCompletion() callback
+## (This setting is relevant with or without the Transaction API)
+
+#hibernate.transaction.flush_before_completion
+
+
+## Enable automatic session close at the end of transaction
+## (This setting is relevant with or without the Transaction API)
+
+#hibernate.transaction.auto_close_session
+
+
+## the Transaction API abstracts application code from the underlying JTA or JDBC transactions
+
+#hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
+#hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
+
+
+## to use JTATransactionFactory, Hibernate must be able to locate the UserTransaction in JNDI
+## default is java:comp/UserTransaction
+## you do NOT need this setting if you specify hibernate.transaction.manager_lookup_class
+
+#jta.UserTransaction jta/usertransaction
+#jta.UserTransaction javax.transaction.UserTransaction
+#jta.UserTransaction UserTransaction
+
+
+## to use the second-level cache with JTA, Hibernate must be able to obtain the JTA TransactionManager
+
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.JBossTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WeblogicTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.WebSphereTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.OrionTransactionManagerLookup
+#hibernate.transaction.manager_lookup_class org.hibernate.transaction.ResinTransactionManagerLookup
+
+
+
+##############################
+### Miscellaneous Settings ###
+##############################
+
+## print all generated SQL to the console
+
+#hibernate.show_sql true
+
+
+## add comments to the generated SQL
+
+#hibernate.use_sql_comments true
+
+
+## generate statistics
+
+#hibernate.generate_statistics true
+
+
+## auto schema export
+
+#hibernate.hbm2ddl.auto create-drop
+#hibernate.hbm2ddl.auto create
+#hibernate.hbm2ddl.auto update
+
+
+## specify a default schema and catalog for unqualified tablenames
+
+#hibernate.default_schema test
+#hibernate.default_catalog test
+
+
+## enable ordering of SQL UPDATEs by primary key
+
+hibernate.order_updates true
+
+
+## set the maximum depth of the outer join fetch tree
+
+hibernate.max_fetch_depth 1
+
+
+## set the default batch size for batch fetching
+
+hibernate.default_batch_fetch_size 100
+
+
+## rollback generated identifier values of deleted entities to default values
+
+#hibernate.use_identifer_rollback true
+
+
+## enable CGLIB reflection optimizer (enabled by default)
+
+#hibernate.cglib.use_reflection_optimizer false
+
+
+
+#####################
+### JDBC Settings ###
+#####################
+
+## specify a JDBC isolation level
+
+#hibernate.connection.isolation 4
+
+
+## enable JDBC autocommit (not recommended!)
+
+#hibernate.connection.autocommit true
+
+
+## set the JDBC fetch size
+
+#hibernate.jdbc.fetch_size 25
+
+
+## set the maximum JDBC 2 batch size (a nonzero value enables batching)
+
+#hibernate.jdbc.batch_size 0
+
+
+## enable batch updates even for versioned data
+
+hibernate.jdbc.batch_versioned_data true
+
+
+## enable use of JDBC 2 scrollable ResultSets (specifying a Dialect will cause Hibernate to use a sensible default)
+
+#hibernate.jdbc.use_scrollable_resultset true
+
+
+## use streams when writing binary types to / from JDBC
+
+hibernate.jdbc.use_streams_for_binary true
+
+
+## use JDBC 3 PreparedStatement.getGeneratedKeys() to get the identifier of an inserted row
+
+#hibernate.jdbc.use_get_generated_keys false
+
+
+## choose a custom JDBC batcher
+
+# hibernate.jdbc.factory_class
+
+
+## enable JDBC result set column alias caching
+## (minor performance enhancement for broken JDBC drivers)
+
+# hibernate.jdbc.wrap_result_sets
+
+
+## choose a custom SQL exception converter
+
+#hibernate.jdbc.sql_exception_converter
+
+
+
+##########################
+### Second-level Cache ###
+##########################
+
+## optimize chache for minimal "puts" instead of minimal "gets" (good for clustered cache)
+
+#hibernate.cache.use_minimal_puts true
+
+
+## set a prefix for cache region names
+
+hibernate.cache.region_prefix hibernate.test
+
+
+## disable the second-level cache
+
+#hibernate.cache.use_second_level_cache false
+
+
+## enable the query cache
+
+hibernate.cache.use_query_cache true
+
+
+## store the second-level cache entries in a more human-friendly format
+
+#hibernate.cache.use_structured_entries true
+
+
+## choose a cache implementation
+
+#hibernate.cache.provider_class org.hibernate.cache.EhCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.EmptyCacheProvider
+hibernate.cache.provider_class org.hibernate.cache.HashtableCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.TreeCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.OSCacheProvider
+#hibernate.cache.provider_class org.hibernate.cache.SwarmCacheProvider
+
+
+## choose a custom query cache implementation
+
+#hibernate.cache.query_cache_factory
+
+
+
+############
+### JNDI ###
+############
+
+## specify a JNDI name for the SessionFactory
+
+#hibernate.session_factory_name hibernate/session_factory
+
+
+## Hibernate uses JNDI to bind a name to a SessionFactory and to look up the JTA UserTransaction;
+## if hibernate.jndi.* are not specified, Hibernate will use the default InitialContext() which
+## is the best approach in an application server
+
+#file system
+#hibernate.jndi.class com.sun.jndi.fscontext.RefFSContextFactory
+#hibernate.jndi.url file:/
+
+#WebSphere
+#hibernate.jndi.class com.ibm.websphere.naming.WsnInitialContextFactory
+#hibernate.jndi.url iiop://localhost:900/
+
Deleted: trunk/HibernateExt/validator/src/test/log4j.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/log4j.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/log4j.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,44 +0,0 @@
-### direct log messages to stdout ###
-log4j.appender.stdout=org.apache.log4j.ConsoleAppender
-log4j.appender.stdout.Target=System.out
-log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
-log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
-
-### direct messages to file hibernate.log ###
-#log4j.appender.file=org.apache.log4j.FileAppender
-#log4j.appender.file.File=hibernate.log
-#log4j.appender.file.layout=org.apache.log4j.PatternLayout
-#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
-
-### set log levels - for more verbose logging change 'info' to 'debug' ###
-
-log4j.rootLogger=warn, stdout
-
-log4j.logger.org.hibernate=info
-
-
-### log just the SQL
-log4j.logger.org.hibernate.SQL=debug
-
-#log4j.logger.org.hibernate.engine.CascadingAction=debug
-
-### log JDBC bind parameters ###
-#log4j.logger.org.hibernate.type=debug
-
-### log schema export/update ###
-log4j.logger.org.hibernate.tool.hbm2ddl=debug
-
-### log cache activity ###
-#log4j.logger.org.hibernate.cache=debug
-
-### enable the following line if you want to track down connection ###
-### leakages when using DriverManagerConnectionProvider ###
-#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
-
-### annotation logs
-#log4j.logger.org.hibernate.annotation=info
-#log4j.logger.org.hibernate.cfg=info
-#log4j.logger.org.hibernate.cfg.SettingsFactory=info
-#log4j.logger.org.hibernate.cfg.AnnotationBinder=info
-#log4j.logger.org.hibernate.cfg.AnnotationConfiguration=info
-#log4j.logger.org.hibernate.cfg.Ejb3Column=info
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/test/log4j.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/log4j.properties)
===================================================================
--- trunk/HibernateExt/validator/src/test/log4j.properties (rev 0)
+++ trunk/HibernateExt/validator/src/test/log4j.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,44 @@
+### direct log messages to stdout ###
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+
+### direct messages to file hibernate.log ###
+#log4j.appender.file=org.apache.log4j.FileAppender
+#log4j.appender.file.File=hibernate.log
+#log4j.appender.file.layout=org.apache.log4j.PatternLayout
+#log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n
+
+### set log levels - for more verbose logging change 'info' to 'debug' ###
+
+log4j.rootLogger=warn, stdout
+
+log4j.logger.org.hibernate=info
+
+
+### log just the SQL
+log4j.logger.org.hibernate.SQL=debug
+
+#log4j.logger.org.hibernate.engine.CascadingAction=debug
+
+### log JDBC bind parameters ###
+#log4j.logger.org.hibernate.type=debug
+
+### log schema export/update ###
+log4j.logger.org.hibernate.tool.hbm2ddl=debug
+
+### log cache activity ###
+#log4j.logger.org.hibernate.cache=debug
+
+### enable the following line if you want to track down connection ###
+### leakages when using DriverManagerConnectionProvider ###
+#log4j.logger.org.hibernate.connection.DriverManagerConnectionProvider=trace
+
+### annotation logs
+#log4j.logger.org.hibernate.annotation=info
+#log4j.logger.org.hibernate.cfg=info
+#log4j.logger.org.hibernate.cfg.SettingsFactory=info
+#log4j.logger.org.hibernate.cfg.AnnotationBinder=info
+#log4j.logger.org.hibernate.cfg.AnnotationConfiguration=info
+#log4j.logger.org.hibernate.cfg.Ejb3Column=info
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/test/messages_en.properties
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/messages_en.properties 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/messages_en.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-long=is too damn long
-floor.name=Floor
-out.of.range=lower that {min} and greater than {max}
-floor.out.of.range={floor.name} cannot (escaping #{el}) be {out.of.range}
-
-validator.assertFalse=assertion failed
-validator.assertTrue=assertion failed
-validator.length=length must be between {min} and {max}
-validator.max=must less than or equal to {value}
-validator.min=must greater than or equal to {value}
-validator.notNull=may not be null
-validator.past=must be a past date
-validator.pattern=must match "{regex}"
-validator.range=must be between {min} and {max}
-validator.size=size must be between {min} and {max}
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/test/messages_en.properties (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/messages_en.properties)
===================================================================
--- trunk/HibernateExt/validator/src/test/messages_en.properties (rev 0)
+++ trunk/HibernateExt/validator/src/test/messages_en.properties 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+long=is too damn long
+floor.name=Floor
+out.of.range=lower that {min} and greater than {max}
+floor.out.of.range={floor.name} cannot (escaping #{el}) be {out.of.range}
+
+validator.assertFalse=assertion failed
+validator.assertTrue=assertion failed
+validator.length=length must be between {min} and {max}
+validator.max=must less than or equal to {value}
+validator.min=must greater than or equal to {value}
+validator.notNull=may not be null
+validator.past=must be a past date
+validator.pattern=must match "{regex}"
+validator.range=must be between {min} and {max}
+validator.size=size must be between {min} and {max}
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/test/org (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org)
Copied: trunk/HibernateExt/validator/src/test/org/hibernate (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate)
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator)
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test)
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Address.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Address.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,100 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-import org.hibernate.validator.AssertTrue;
-import org.hibernate.validator.Length;
-import org.hibernate.validator.Min;
-import org.hibernate.validator.NotNull;
-import org.hibernate.validator.Pattern;
-import org.hibernate.validator.Range;
-
-/**
- * @author Gavin King
- */
-public class Address {
- @NotNull
- public static String blacklistedZipCode;
-
- private String line1;
- private String line2;
- private String zip;
- private String state;
- @Length(max = 20)
- @NotNull
- private String country;
- private long id;
- private boolean internalValid = true;
- @Range(min = -2, max = 50, message = "{floor.out.of.range} (escaping #{el})")
- public int floor;
-
- public String getCountry() {
- return country;
- }
-
- public void setCountry(String country) {
- this.country = country;
- }
-
- @NotNull
- public String getLine1() {
- return line1;
- }
-
- public void setLine1(String line1) {
- this.line1 = line1;
- }
-
- public String getLine2() {
- return line2;
- }
-
- public void setLine2(String line2) {
- this.line2 = line2;
- }
-
- @Length(max = 3)
- @NotNull
- public String getState() {
- return state;
- }
-
- public void setState(String state) {
- this.state = state;
- }
-
- @Length(max = 5, message = "{long}")
- @Pattern(regex = "[0-9]+")
- @NotNull
- public String getZip() {
- return zip;
- }
-
- public void setZip(String zip) {
- this.zip = zip;
- }
-
- @AssertTrue
- public boolean isValid() {
- return true;
- }
-
- @AssertTrue
- private boolean isInternalValid() {
- return internalValid;
- }
-
- public void setInternalValid(boolean internalValid) {
- this.internalValid = internalValid;
- }
-
- @Min(1)
- @Range(max = 2000)
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Address.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Address.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Address.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,100 @@
+//$Id$
+package org.hibernate.validator.test;
+
+import org.hibernate.validator.AssertTrue;
+import org.hibernate.validator.Length;
+import org.hibernate.validator.Min;
+import org.hibernate.validator.NotNull;
+import org.hibernate.validator.Pattern;
+import org.hibernate.validator.Range;
+
+/**
+ * @author Gavin King
+ */
+public class Address {
+ @NotNull
+ public static String blacklistedZipCode;
+
+ private String line1;
+ private String line2;
+ private String zip;
+ private String state;
+ @Length(max = 20)
+ @NotNull
+ private String country;
+ private long id;
+ private boolean internalValid = true;
+ @Range(min = -2, max = 50, message = "{floor.out.of.range} (escaping #{el})")
+ public int floor;
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ @NotNull
+ public String getLine1() {
+ return line1;
+ }
+
+ public void setLine1(String line1) {
+ this.line1 = line1;
+ }
+
+ public String getLine2() {
+ return line2;
+ }
+
+ public void setLine2(String line2) {
+ this.line2 = line2;
+ }
+
+ @Length(max = 3)
+ @NotNull
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ @Length(max = 5, message = "{long}")
+ @Pattern(regex = "[0-9]+")
+ @NotNull
+ public String getZip() {
+ return zip;
+ }
+
+ public void setZip(String zip) {
+ this.zip = zip;
+ }
+
+ @AssertTrue
+ public boolean isValid() {
+ return true;
+ }
+
+ @AssertTrue
+ private boolean isInternalValid() {
+ return internalValid;
+ }
+
+ public void setInternalValid(boolean internalValid) {
+ this.internalValid = internalValid;
+ }
+
+ @Min(1)
+ @Range(max = 2000)
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Brother.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Brother.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Brother.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,61 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-import org.hibernate.validator.NotNull;
-import org.hibernate.validator.Valid;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Brother {
- private String name;
- private Brother elder;
- private Brother youngerBrother;
- @NotNull
- @Valid
- private Address address;
-
- @NotNull
- public String getName() {
- return name;
- }
-
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Valid
- public Brother getElder() {
- return elder;
- }
-
- public void setElder(Brother elder) {
- this.elder = elder;
- }
-
- @Valid
- public Brother getYoungerBrother() {
- return youngerBrother;
- }
-
- public void setYoungerBrother(Brother youngerBrother) {
- this.youngerBrother = youngerBrother;
- }
-
- public Address getAddress() {
- return address;
- }
-
- public void setAddress(Address address) {
- this.address = address;
- }
-
- public boolean equals(Object o) {
- return true; //workaround dummy equals and hashcode?
- }
-
- public int hashCode() {
- return 5;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Brother.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Brother.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Brother.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Brother.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,61 @@
+//$Id$
+package org.hibernate.validator.test;
+
+import org.hibernate.validator.NotNull;
+import org.hibernate.validator.Valid;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Brother {
+ private String name;
+ private Brother elder;
+ private Brother youngerBrother;
+ @NotNull
+ @Valid
+ private Address address;
+
+ @NotNull
+ public String getName() {
+ return name;
+ }
+
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Valid
+ public Brother getElder() {
+ return elder;
+ }
+
+ public void setElder(Brother elder) {
+ this.elder = elder;
+ }
+
+ @Valid
+ public Brother getYoungerBrother() {
+ return youngerBrother;
+ }
+
+ public void setYoungerBrother(Brother youngerBrother) {
+ this.youngerBrother = youngerBrother;
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+ public boolean equals(Object o) {
+ return true; //workaround dummy equals and hashcode?
+ }
+
+ public int hashCode() {
+ return 5;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Building.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Building.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Building.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test;
-
-import org.hibernate.validator.Length;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Building {
- private Long id;
-
- @Length( min = 1, message = "{notpresent.Key} and #{key.notPresent} and {key.notPresent2} {min}" )
- private String address;
-
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getAddress() {
- return address;
- }
-
- public void setAddress(String address) {
- this.address = address;
- }
-}
-
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Building.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Building.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Building.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Building.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id: $
+package org.hibernate.validator.test;
+
+import org.hibernate.validator.Length;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Building {
+ private Long id;
+
+ @Length( min = 1, message = "{notpresent.Key} and #{key.notPresent} and {key.notPresent2} {min}" )
+ private String address;
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+}
+
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Contact.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Contact.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Contact.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Contact {
- @NotNull
- private String name;
- @NotNull
- private String phone;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public String getPhone() {
- return phone;
- }
-
- public void setPhone(String phone) {
- this.phone = phone;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Contact.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Contact.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Contact.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Contact.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id$
+package org.hibernate.validator.test;
+
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Contact {
+ @NotNull
+ private String name;
+ @NotNull
+ private String phone;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/EmailTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/EmailTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/EmailTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,39 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-import junit.framework.TestCase;
-import org.hibernate.validator.ClassValidator;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EmailTest extends TestCase {
- private ClassValidator<User> userValidator;
-
- public void testEmail() throws Exception {
- userValidator = new ClassValidator<User>( User.class );
- isRightEmail( "emmanuel at hibernate.org" );
- isRightEmail( "" );
- isRightEmail( null );
- isWrongEmail( "emmanuel.hibernate.org" );
- isRightEmail( "emmanuel at hibernate" );
- isRightEmail( "emma-n_uel at hibernate" );
- isWrongEmail( "emma nuel at hibernate.org" );
- isWrongEmail( "emma(nuel at hibernate.org" );
- isWrongEmail( "emmanuel@" );
- isRightEmail( "emma+nuel at hibernate.org" );
- isRightEmail( "emma=nuel at hibernate.org" );
- isWrongEmail( "emma\nnuel at hibernate.org" );
- isWrongEmail( "emma at nuel@hibernate.org" );
- isRightEmail( "emmanuel@[123.12.2.11]" );
- }
-
- private void isRightEmail(String email) {
- assertEquals( "Wrong email", 0, userValidator.getPotentialInvalidValues( "email", email ).length );
- }
-
- private void isWrongEmail(String email) {
- assertEquals( "Right email", 1, userValidator.getPotentialInvalidValues( "email", email ).length );
- ;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/EmailTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/EmailTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/EmailTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/EmailTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,39 @@
+//$Id$
+package org.hibernate.validator.test;
+
+import junit.framework.TestCase;
+import org.hibernate.validator.ClassValidator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EmailTest extends TestCase {
+ private ClassValidator<User> userValidator;
+
+ public void testEmail() throws Exception {
+ userValidator = new ClassValidator<User>( User.class );
+ isRightEmail( "emmanuel at hibernate.org" );
+ isRightEmail( "" );
+ isRightEmail( null );
+ isWrongEmail( "emmanuel.hibernate.org" );
+ isRightEmail( "emmanuel at hibernate" );
+ isRightEmail( "emma-n_uel at hibernate" );
+ isWrongEmail( "emma nuel at hibernate.org" );
+ isWrongEmail( "emma(nuel at hibernate.org" );
+ isWrongEmail( "emmanuel@" );
+ isRightEmail( "emma+nuel at hibernate.org" );
+ isRightEmail( "emma=nuel at hibernate.org" );
+ isWrongEmail( "emma\nnuel at hibernate.org" );
+ isWrongEmail( "emma at nuel@hibernate.org" );
+ isRightEmail( "emmanuel@[123.12.2.11]" );
+ }
+
+ private void isRightEmail(String email) {
+ assertEquals( "Wrong email", 0, userValidator.getPotentialInvalidValues( "email", email ).length );
+ }
+
+ private void isWrongEmail(String email) {
+ assertEquals( "Right email", 1, userValidator.getPotentialInvalidValues( "email", email ).length );
+ ;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test;
-
-import org.hibernate.validator.Patterns;
-import org.hibernate.validator.Pattern;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Engine {
- @Patterns( {
- @Pattern(regex = "^[A-Z0-9-]+$", message = "must contain alphabetical characters only"),
- @Pattern(regex = "^....-....-....$", message="must match ....-....-....")
- } )
- private String serialNumber;
- private long horsePower;
-
-
- public String getSerialNumber() {
- return serialNumber;
- }
-
- public void setSerialNumber(String serialNumber) {
- this.serialNumber = serialNumber;
- }
-
- public long getHorsePower() {
- return horsePower;
- }
-
- public void setHorsePower(long horsePower) {
- this.horsePower = horsePower;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Engine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: $
+package org.hibernate.validator.test;
+
+import org.hibernate.validator.Patterns;
+import org.hibernate.validator.Pattern;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Engine {
+ @Patterns( {
+ @Pattern(regex = "^[A-Z0-9-]+$", message = "must contain alphabetical characters only"),
+ @Pattern(regex = "^....-....-....$", message="must match ....-....-....")
+ } )
+ private String serialNumber;
+ private long horsePower;
+
+
+ public String getSerialNumber() {
+ return serialNumber;
+ }
+
+ public void setSerialNumber(String serialNumber) {
+ this.serialNumber = serialNumber;
+ }
+
+ public long getHorsePower() {
+ return horsePower;
+ }
+
+ public void setHorsePower(long horsePower) {
+ this.horsePower = horsePower;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/HANTestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/HANTestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/HANTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,160 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test;
-
-import java.io.InputStream;
-
-import org.hibernate.SessionFactory;
-import org.hibernate.Session;
-import org.hibernate.HibernateException;
-import org.hibernate.Interceptor;
-import org.hibernate.dialect.Dialect;
-import org.hibernate.cfg.AnnotationConfiguration;
-import org.hibernate.cfg.Environment;
-import org.hibernate.cfg.Configuration;
-
-/**
- * Copy from HAN
- *
- * @author Emmanuel Bernard
- */
-public abstract class HANTestCase extends junit.framework.TestCase {
-
- private static SessionFactory sessions;
- private static AnnotationConfiguration cfg;
- private static Dialect dialect;
- private static Class lastTestClass;
- private Session session;
-
- public HANTestCase() {
- super();
- }
-
- public HANTestCase(String x) {
- super( x );
- }
-
- protected void buildSessionFactory(Class[] classes, String[] packages, String[] xmlFiles) throws Exception {
-
- if ( getSessions() != null ) getSessions().close();
- try {
- setCfg( new AnnotationConfiguration() );
- configure( cfg );
- if ( recreateSchema() ) {
- cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- }
- for ( int i = 0; i < packages.length; i++ ) {
- getCfg().addPackage( packages[i] );
- }
- for ( int i = 0; i < classes.length; i++ ) {
- getCfg().addAnnotatedClass( classes[i] );
- }
- for ( int i = 0; i < xmlFiles.length; i++ ) {
- InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFiles[i] );
- getCfg().addInputStream( is );
- }
- setDialect( Dialect.getDialect() );
- setSessions( getCfg().buildSessionFactory( /*new TestInterceptor()*/ ) );
- }
- catch (Exception e) {
- e.printStackTrace();
- throw e;
- }
- }
-
- protected void setUp() throws Exception {
- if ( getSessions() == null || lastTestClass != getClass() ) {
- buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
- lastTestClass = getClass();
- }
- }
-
- protected void runTest() throws Throwable {
- try {
- super.runTest();
- if ( session != null && session.isOpen() ) {
- if ( session.isConnected() ) session.connection().rollback();
- session.close();
- session = null;
- fail( "unclosed session" );
- }
- else {
- session = null;
- }
- }
- catch (Throwable e) {
- try {
- if ( session != null && session.isOpen() ) {
- if ( session.isConnected() ) session.connection().rollback();
- session.close();
- }
- }
- catch (Exception ignore) {
- }
- try {
- if ( sessions != null ) {
- sessions.close();
- sessions = null;
- }
- }
- catch (Exception ignore) {
- }
- throw e;
- }
- }
-
- public Session openSession() throws HibernateException {
- session = getSessions().openSession();
- return session;
- }
-
- public Session openSession(Interceptor interceptor) throws HibernateException {
- session = getSessions().openSession( interceptor );
- return session;
- }
-
- protected abstract Class[] getMappings();
-
- protected String[] getAnnotatedPackages() {
- return new String[]{};
- }
-
- protected String[] getXmlFiles() {
- return new String[]{};
- }
-
- private void setSessions(SessionFactory sessions) {
- HANTestCase.sessions = sessions;
- }
-
- protected SessionFactory getSessions() {
- return sessions;
- }
-
- private void setDialect(Dialect dialect) {
- HANTestCase.dialect = dialect;
- }
-
- protected Dialect getDialect() {
- return dialect;
- }
-
- protected static void setCfg(AnnotationConfiguration cfg) {
- HANTestCase.cfg = cfg;
- }
-
- protected static AnnotationConfiguration getCfg() {
- return cfg;
- }
-
- protected void configure(Configuration cfg) {
- //cfg.setNamingStrategy( AlternativeNamingStrategy.INSTANCE );
- //cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
- //cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
- }
-
- protected boolean recreateSchema() {
- return true;
- }
-
-}
-
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/HANTestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/HANTestCase.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/HANTestCase.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/HANTestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,160 @@
+//$Id: $
+package org.hibernate.validator.test;
+
+import java.io.InputStream;
+
+import org.hibernate.SessionFactory;
+import org.hibernate.Session;
+import org.hibernate.HibernateException;
+import org.hibernate.Interceptor;
+import org.hibernate.dialect.Dialect;
+import org.hibernate.cfg.AnnotationConfiguration;
+import org.hibernate.cfg.Environment;
+import org.hibernate.cfg.Configuration;
+
+/**
+ * Copy from HAN
+ *
+ * @author Emmanuel Bernard
+ */
+public abstract class HANTestCase extends junit.framework.TestCase {
+
+ private static SessionFactory sessions;
+ private static AnnotationConfiguration cfg;
+ private static Dialect dialect;
+ private static Class lastTestClass;
+ private Session session;
+
+ public HANTestCase() {
+ super();
+ }
+
+ public HANTestCase(String x) {
+ super( x );
+ }
+
+ protected void buildSessionFactory(Class[] classes, String[] packages, String[] xmlFiles) throws Exception {
+
+ if ( getSessions() != null ) getSessions().close();
+ try {
+ setCfg( new AnnotationConfiguration() );
+ configure( cfg );
+ if ( recreateSchema() ) {
+ cfg.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ }
+ for ( int i = 0; i < packages.length; i++ ) {
+ getCfg().addPackage( packages[i] );
+ }
+ for ( int i = 0; i < classes.length; i++ ) {
+ getCfg().addAnnotatedClass( classes[i] );
+ }
+ for ( int i = 0; i < xmlFiles.length; i++ ) {
+ InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream( xmlFiles[i] );
+ getCfg().addInputStream( is );
+ }
+ setDialect( Dialect.getDialect() );
+ setSessions( getCfg().buildSessionFactory( /*new TestInterceptor()*/ ) );
+ }
+ catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ protected void setUp() throws Exception {
+ if ( getSessions() == null || lastTestClass != getClass() ) {
+ buildSessionFactory( getMappings(), getAnnotatedPackages(), getXmlFiles() );
+ lastTestClass = getClass();
+ }
+ }
+
+ protected void runTest() throws Throwable {
+ try {
+ super.runTest();
+ if ( session != null && session.isOpen() ) {
+ if ( session.isConnected() ) session.connection().rollback();
+ session.close();
+ session = null;
+ fail( "unclosed session" );
+ }
+ else {
+ session = null;
+ }
+ }
+ catch (Throwable e) {
+ try {
+ if ( session != null && session.isOpen() ) {
+ if ( session.isConnected() ) session.connection().rollback();
+ session.close();
+ }
+ }
+ catch (Exception ignore) {
+ }
+ try {
+ if ( sessions != null ) {
+ sessions.close();
+ sessions = null;
+ }
+ }
+ catch (Exception ignore) {
+ }
+ throw e;
+ }
+ }
+
+ public Session openSession() throws HibernateException {
+ session = getSessions().openSession();
+ return session;
+ }
+
+ public Session openSession(Interceptor interceptor) throws HibernateException {
+ session = getSessions().openSession( interceptor );
+ return session;
+ }
+
+ protected abstract Class[] getMappings();
+
+ protected String[] getAnnotatedPackages() {
+ return new String[]{};
+ }
+
+ protected String[] getXmlFiles() {
+ return new String[]{};
+ }
+
+ private void setSessions(SessionFactory sessions) {
+ HANTestCase.sessions = sessions;
+ }
+
+ protected SessionFactory getSessions() {
+ return sessions;
+ }
+
+ private void setDialect(Dialect dialect) {
+ HANTestCase.dialect = dialect;
+ }
+
+ protected Dialect getDialect() {
+ return dialect;
+ }
+
+ protected static void setCfg(AnnotationConfiguration cfg) {
+ HANTestCase.cfg = cfg;
+ }
+
+ protected static AnnotationConfiguration getCfg() {
+ return cfg;
+ }
+
+ protected void configure(Configuration cfg) {
+ //cfg.setNamingStrategy( AlternativeNamingStrategy.INSTANCE );
+ //cfg.getSessionEventListenerConfig().setFlushEventListener( new EJB3FlushEventListener() );
+ //cfg.getSessionEventListenerConfig().setAutoFlushEventListener( new EJB3AutoFlushEventListener() );
+ }
+
+ protected boolean recreateSchema() {
+ return true;
+ }
+
+}
+
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/InterpolationTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/InterpolationTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/InterpolationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,36 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test;
-
-import java.util.MissingResourceException;
-
-import junit.framework.TestCase;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.InvalidValue;
-
-/**
- * @author Emmanuel Bernard
- */
-public class InterpolationTest extends TestCase {
- public void testMissingKey() {
-
- Building b = new Building();
- b.setAddress( "2323 Younge St");
- ClassValidator<Building> validator = new ClassValidator<Building>(Building.class);
- try {
- validator.getInvalidValues( b );
- }
- catch (MissingResourceException e) {
- fail("message should be interpolated lazily in DefaultMessageInterpolator");
- }
-
- b = new Building();
- b.setAddress("");
- boolean failure = false;
- InvalidValue[] invalidValues = validator.getInvalidValues( b );
- assertNotSame( "Should have a failure here", 0, invalidValues.length );
- assertEquals( "Missing key should be left unchanged",
- "{notpresent.Key} and #{key.notPresent} and {key.notPresent2} 1",
- invalidValues[0].getMessage() );
- }
-}
-
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/InterpolationTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/InterpolationTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/InterpolationTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/InterpolationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,36 @@
+//$Id: $
+package org.hibernate.validator.test;
+
+import java.util.MissingResourceException;
+
+import junit.framework.TestCase;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.InvalidValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class InterpolationTest extends TestCase {
+ public void testMissingKey() {
+
+ Building b = new Building();
+ b.setAddress( "2323 Younge St");
+ ClassValidator<Building> validator = new ClassValidator<Building>(Building.class);
+ try {
+ validator.getInvalidValues( b );
+ }
+ catch (MissingResourceException e) {
+ fail("message should be interpolated lazily in DefaultMessageInterpolator");
+ }
+
+ b = new Building();
+ b.setAddress("");
+ boolean failure = false;
+ InvalidValue[] invalidValues = validator.getInvalidValues( b );
+ assertNotSame( "Should have a failure here", 0, invalidValues.length );
+ assertEquals( "Missing key should be left unchanged",
+ "{notpresent.Key} and #{key.notPresent} and {key.notPresent2} 1",
+ invalidValues[0].getMessage() );
+ }
+}
+
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Serializability.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Serializability.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Serializability.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-package org.hibernate.validator.test;
-
-import java.lang.annotation.Documented;
-import static java.lang.annotation.ElementType.TYPE;
-import java.lang.annotation.Retention;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-import java.lang.annotation.Target;
-
-import org.hibernate.validator.ValidatorClass;
-
-/**
- * Dummy sample of a bean-level validation annotation
- *
- * @author Emmanuel Bernard
- */
- at ValidatorClass(SerializabilityValidator.class)
- at Target(TYPE)
- at Retention(RUNTIME)
- at Documented
-public @interface Serializability {
- String message() default "Bean not Serializable";
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Serializability.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Serializability.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Serializability.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Serializability.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+package org.hibernate.validator.test;
+
+import java.lang.annotation.Documented;
+import static java.lang.annotation.ElementType.TYPE;
+import java.lang.annotation.Retention;
+import static java.lang.annotation.RetentionPolicy.RUNTIME;
+import java.lang.annotation.Target;
+
+import org.hibernate.validator.ValidatorClass;
+
+/**
+ * Dummy sample of a bean-level validation annotation
+ *
+ * @author Emmanuel Bernard
+ */
+ at ValidatorClass(SerializabilityValidator.class)
+ at Target(TYPE)
+ at Retention(RUNTIME)
+ at Documented
+public @interface Serializability {
+ String message() default "Bean not Serializable";
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/SerializabilityValidator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/SerializabilityValidator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/SerializabilityValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-import java.io.Serializable;
-
-import org.hibernate.validator.Validator;
-
-/**
- * Sample of a bean-level validator
- *
- * @author Emmanuel Bernard
- */
-public class SerializabilityValidator implements Validator<Serializability>, Serializable {
- public boolean isValid(Object value) {
- return value instanceof Serializable;
- }
-
- public void initialize(Serializability parameters) {
-
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/SerializabilityValidator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/SerializabilityValidator.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/SerializabilityValidator.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/SerializabilityValidator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.validator.test;
+
+import java.io.Serializable;
+
+import org.hibernate.validator.Validator;
+
+/**
+ * Sample of a bean-level validator
+ *
+ * @author Emmanuel Bernard
+ */
+public class SerializabilityValidator implements Validator<Serializability>, Serializable {
+ public boolean isValid(Object value) {
+ return value instanceof Serializable;
+ }
+
+ public void initialize(Serializability parameters) {
+
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Site.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Site.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Site.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,43 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-import org.hibernate.validator.NotNull;
-import org.hibernate.validator.Valid;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Site {
- @NotNull
- private String siteName;
-
- @Valid
- private Address address;
-
- @Valid
- private Contact contact;
-
- public String getSiteName() {
- return siteName;
- }
-
- public void setSiteName(String siteName) {
- this.siteName = siteName;
- }
-
- public Address getAddress() {
- return address;
- }
-
- public void setAddress(Address address) {
- this.address = address;
- }
-
- public Contact getContact() {
- return contact;
- }
-
- public void setContact(Contact contact) {
- this.contact = contact;
- }
-}
\ No newline at end of file
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Site.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Site.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Site.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Site.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,43 @@
+//$Id$
+package org.hibernate.validator.test;
+
+import org.hibernate.validator.NotNull;
+import org.hibernate.validator.Valid;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Site {
+ @NotNull
+ private String siteName;
+
+ @Valid
+ private Address address;
+
+ @Valid
+ private Contact contact;
+
+ public String getSiteName() {
+ return siteName;
+ }
+
+ public void setSiteName(String siteName) {
+ this.siteName = siteName;
+ }
+
+ public Address getAddress() {
+ return address;
+ }
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+
+ public Contact getContact() {
+ return contact;
+ }
+
+ public void setContact(Contact contact) {
+ this.contact = contact;
+ }
+}
\ No newline at end of file
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Tv.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Tv.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Tv.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,26 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-import java.math.BigInteger;
-import java.util.Date;
-
-import org.hibernate.validator.Future;
-import org.hibernate.validator.Length;
-import org.hibernate.validator.Min;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Tv {
- @Length(max = 2)
- public String serial;
- public int size;
- @Length(max = 2)
- public String name;
- @Future
- public Date expDate;
- @Length(min = 0)
- public String description;
- @Min(1000)
- public BigInteger lifetime;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Tv.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Tv.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Tv.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Tv.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,26 @@
+//$Id$
+package org.hibernate.validator.test;
+
+import java.math.BigInteger;
+import java.util.Date;
+
+import org.hibernate.validator.Future;
+import org.hibernate.validator.Length;
+import org.hibernate.validator.Min;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Tv {
+ @Length(max = 2)
+ public String serial;
+ public int size;
+ @Length(max = 2)
+ public String name;
+ @Future
+ public Date expDate;
+ @Length(min = 0)
+ public String description;
+ @Min(1000)
+ public BigInteger lifetime;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/TvOwner.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/TvOwner.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/TvOwner.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,16 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-import org.hibernate.validator.NotNull;
-import org.hibernate.validator.Valid;
-
-/**
- * @author Emmanuel Bernard
- */
-public class TvOwner {
- public Integer id;
-
- @NotNull
- @Valid
- public Tv tv;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/TvOwner.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/TvOwner.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/TvOwner.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/TvOwner.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,16 @@
+//$Id$
+package org.hibernate.validator.test;
+
+import org.hibernate.validator.NotNull;
+import org.hibernate.validator.Valid;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class TvOwner {
+ public Integer id;
+
+ @NotNull
+ @Valid
+ public Tv tv;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/User.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/User.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/User.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-import org.hibernate.validator.Email;
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
-public class User {
- @NotNull
- public String name;
- @Email
- public String email;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/User.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/User.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/User.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/User.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+//$Id$
+package org.hibernate.validator.test;
+
+import org.hibernate.validator.Email;
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class User {
+ @NotNull
+ public String name;
+ @Email
+ public String email;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,230 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-import java.io.Serializable;
-import java.math.BigInteger;
-import java.util.Date;
-import java.util.Locale;
-import java.util.ResourceBundle;
-
-import junit.framework.TestCase;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.InvalidValue;
-import org.hibernate.validator.MessageInterpolator;
-import org.hibernate.validator.Validator;
-
-/**
- * @author Gavin King
- */
-public class ValidatorTest extends TestCase {
- public static final String ESCAPING_EL = "(escaping #{el})";
-
- public void testValidator() {
- Address a = new Address();
- Address.blacklistedZipCode = null;
- a.setCountry( "Australia" );
- a.setZip( "1221341234123" );
- a.setState( "Vic" );
- a.setLine1( "Karbarook Ave" );
- a.setId( 3 );
- ClassValidator<Address> classValidator = new ClassValidator<Address>(
- Address.class, ResourceBundle.getBundle( "messages", Locale.ENGLISH )
- );
- InvalidValue[] validationMessages = classValidator.getInvalidValues( a );
- assertEquals( 2, validationMessages.length ); //static field is tested also
- Address.blacklistedZipCode = "323232";
- a.setZip( null );
- a.setState( "Victoria" );
- validationMessages = classValidator.getInvalidValues( a );
- assertEquals( 2, validationMessages.length );
- validationMessages = classValidator.getInvalidValues( a, "zip" );
- assertEquals( 1, validationMessages.length );
- a.setZip( "3181" );
- a.setState( "NSW" );
- validationMessages = classValidator.getInvalidValues( a );
- assertEquals( 0, validationMessages.length );
- a.setCountry( null );
- validationMessages = classValidator.getInvalidValues( a );
- assertEquals( 1, validationMessages.length );
- a.setInternalValid( false );
- validationMessages = classValidator.getInvalidValues( a );
- assertEquals( 2, validationMessages.length );
- a.setInternalValid( true );
- a.setCountry( "France" );
- a.floor = 4000;
- validationMessages = classValidator.getInvalidValues( a );
- assertEquals( 1, validationMessages.length );
- assertEquals(
- "Floor cannot " + ESCAPING_EL
- + " be lower that -2 and greater than 50 " + ESCAPING_EL,
- validationMessages[0].getMessage()
- );
- }
-
- public void testCircularity() throws Exception {
- Brother emmanuel = new Brother();
- emmanuel.setName( "Emmanuel" );
- Address.blacklistedZipCode = "666";
- Address address = new Address();
- address.setInternalValid( true );
- address.setCountry( "France" );
- address.setId( 3 );
- address.setLine1( "Rue des rosiers" );
- address.setState( "NYC" );
- address.setZip( "33333" );
- address.floor = 4;
- emmanuel.setAddress( address );
- Brother christophe = new Brother();
- christophe.setName( "Christophe" );
- christophe.setAddress( address );
- emmanuel.setYoungerBrother( christophe );
- christophe.setElder( emmanuel );
- ClassValidator<Brother> classValidator = new ClassValidator<Brother>( Brother.class );
- InvalidValue[] invalidValues = classValidator.getInvalidValues( emmanuel );
- assertEquals( 0, invalidValues.length );
- christophe.setName( null );
- invalidValues = classValidator.getInvalidValues( emmanuel );
- assertEquals( 1, invalidValues.length );
- assertEquals( emmanuel, invalidValues[0].getRootBean() );
- assertEquals( "youngerBrother.name", invalidValues[0].getPropertyPath() );
- christophe.setName( "Christophe" );
- address = new Address();
- address.setInternalValid( true );
- address.setCountry( "France" );
- address.setId( 4 );
- address.setLine1( "Rue des plantes" );
- address.setState( "NYC" );
- address.setZip( "33333" );
- address.floor = -100;
- christophe.setAddress( address );
- invalidValues = classValidator.getInvalidValues( emmanuel );
- assertEquals( 1, invalidValues.length );
- }
-
- public void testAggregationAnnotations() throws Exception {
- Engine eng = new Engine();
- eng.setHorsePower( 23 );
- eng.setSerialNumber( "23-43###4" );
- ClassValidator<Engine> classValidator = new ClassValidator<Engine>( Engine.class );
- InvalidValue[] invalidValues = classValidator.getInvalidValues( eng );
- assertEquals( 2, invalidValues.length );
-
- eng.setSerialNumber( "1234-5678-9012");
- invalidValues = classValidator.getInvalidValues( eng );
- assertEquals( 0, invalidValues.length );
- }
-
- public void testDefaultResourceBundle() throws Exception {
- Tv tv = new Tv();
- tv.serial = "FS";
- tv.name = "TooLong";
- tv.expDate = new Date( new Date().getTime() + 1000 * 60 * 60 * 24 * 10 );
- ClassValidator<Tv> classValidator = new ClassValidator<Tv>( Tv.class );
- InvalidValue[] invalidValues = classValidator.getInvalidValues( tv );
- assertEquals( 1, invalidValues.length );
- Locale loc = Locale.getDefault();
- if ( loc.toString().startsWith( "en" ) ) {
- assertEquals( "length must be between 0 and 2", invalidValues[0].getMessage() );
- }
- else if ( loc.toString().startsWith( "fr" ) ) {
- String message = invalidValues[0].getMessage();
- String message2 ="la longueur doit être entre 0 et 2";
- assertEquals( message2, message );
- }
- else if ( loc.toString().startsWith( "da" ) ) {
- assertEquals( "længden skal være mellem 0 og 2", invalidValues[0].getMessage() );
- }
- else {
- // if default not found then it must be english
- assertEquals( "length must be between 0 and 2", invalidValues[0].getMessage() );
- }
- }
-
- public class PrefixMessageInterpolator implements MessageInterpolator, Serializable {
- private String prefix;
-
- public PrefixMessageInterpolator(String prefix) {
- this.prefix = prefix;
- }
-
- public String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator) {
- return prefix + defaultInterpolator.interpolate( message, validator, defaultInterpolator );
- }
- }
-
- public void testMessageInterpolator() throws Exception {
- Tv tv = new Tv();
- tv.serial = "FS";
- tv.name = "TooLong";
- tv.expDate = new Date( new Date().getTime() + 1000 * 60 * 60 * 24 * 10 );
- String prefix = "Prefix";
- ClassValidator<Tv> classValidator = new ClassValidator<Tv>( Tv.class, new PrefixMessageInterpolator( prefix ) );
- InvalidValue[] invalidValues = classValidator.getInvalidValues( tv );
- assertEquals( 1, invalidValues.length );
- Locale loc = Locale.getDefault();
- if ( loc.toString().startsWith( "en" ) ) {
- assertEquals( prefix + "length must be between 0 and 2", invalidValues[0].getMessage() );
- }
- else if ( loc.toString().startsWith( "fr" ) ) {
- assertEquals( prefix + "la longueur doit être entre 0 et 2", invalidValues[0].getMessage() );
- }
- else if ( loc.toString().startsWith( "da" ) ) {
- assertEquals( prefix + "længden skal være mellem 0 og 2", invalidValues[0].getMessage() );
- }
- else {
- // if default not found then it must be english
- assertEquals( prefix + "length must be between 0 and 2", invalidValues[0].getMessage() );
- }
- }
-
- public void testBigInteger() throws Exception {
- Tv tv = new Tv();
- tv.lifetime = new BigInteger("9223372036854775808");
- ClassValidator<Tv> classValidator = new ClassValidator<Tv>( Tv.class );
- InvalidValue[] invalidValues = classValidator.getInvalidValues( tv );
- assertEquals( 0, invalidValues.length );
- }
-
- public void testBeanValidator() throws Exception {
- Vase v = new Vase();
- ClassValidator<Vase> classValidator = new ClassValidator<Vase>( Vase.class );
- InvalidValue[] invalidValues = classValidator.getInvalidValues( v );
- assertEquals( 1, invalidValues.length );
- assertNull( invalidValues[0].getPropertyName() );
- }
-
- public void testPotentialInvalidValues() throws Exception {
- Address a = new Address();
- Address.blacklistedZipCode = null;
- a.setCountry( "Australia" );
- a.setZip( "1221341234123" );
- a.setState( "Vic" );
- a.setLine1( "Karbarook Ave" );
- a.setId( 3 );
- ClassValidator<Address> classValidator = new ClassValidator<Address>( Address.class );
- InvalidValue[] validationMessages = classValidator.getPotentialInvalidValues(
- "blacklistedZipCode", Address.blacklistedZipCode
- );
- assertEquals( 1, validationMessages.length );
- }
-
- public void testRecursivity() throws Exception {
- Site site = new Site();
- site.setSiteName( "Rocky mountains" );
- Contact contact = new Contact();
- contact.setName( null ); //1 error
- contact.setPhone( "01234455" );
- site.setContact( contact );
- Address a = new Address();
- Address.blacklistedZipCode = "222";
- a.setCountry( "Australia" );
- a.setZip( "123" );
- a.setState( "Vic" );
- a.setLine1( null ); // 1 more error
- a.setId( 3 );
- site.setAddress( a );
- ClassValidator<Site> classValidator = new ClassValidator<Site>( Site.class );
- InvalidValue[] validationMessages = classValidator.getInvalidValues( site );
- assertEquals( 2, validationMessages.length );
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/ValidatorTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,230 @@
+//$Id$
+package org.hibernate.validator.test;
+
+import java.io.Serializable;
+import java.math.BigInteger;
+import java.util.Date;
+import java.util.Locale;
+import java.util.ResourceBundle;
+
+import junit.framework.TestCase;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.InvalidValue;
+import org.hibernate.validator.MessageInterpolator;
+import org.hibernate.validator.Validator;
+
+/**
+ * @author Gavin King
+ */
+public class ValidatorTest extends TestCase {
+ public static final String ESCAPING_EL = "(escaping #{el})";
+
+ public void testValidator() {
+ Address a = new Address();
+ Address.blacklistedZipCode = null;
+ a.setCountry( "Australia" );
+ a.setZip( "1221341234123" );
+ a.setState( "Vic" );
+ a.setLine1( "Karbarook Ave" );
+ a.setId( 3 );
+ ClassValidator<Address> classValidator = new ClassValidator<Address>(
+ Address.class, ResourceBundle.getBundle( "messages", Locale.ENGLISH )
+ );
+ InvalidValue[] validationMessages = classValidator.getInvalidValues( a );
+ assertEquals( 2, validationMessages.length ); //static field is tested also
+ Address.blacklistedZipCode = "323232";
+ a.setZip( null );
+ a.setState( "Victoria" );
+ validationMessages = classValidator.getInvalidValues( a );
+ assertEquals( 2, validationMessages.length );
+ validationMessages = classValidator.getInvalidValues( a, "zip" );
+ assertEquals( 1, validationMessages.length );
+ a.setZip( "3181" );
+ a.setState( "NSW" );
+ validationMessages = classValidator.getInvalidValues( a );
+ assertEquals( 0, validationMessages.length );
+ a.setCountry( null );
+ validationMessages = classValidator.getInvalidValues( a );
+ assertEquals( 1, validationMessages.length );
+ a.setInternalValid( false );
+ validationMessages = classValidator.getInvalidValues( a );
+ assertEquals( 2, validationMessages.length );
+ a.setInternalValid( true );
+ a.setCountry( "France" );
+ a.floor = 4000;
+ validationMessages = classValidator.getInvalidValues( a );
+ assertEquals( 1, validationMessages.length );
+ assertEquals(
+ "Floor cannot " + ESCAPING_EL
+ + " be lower that -2 and greater than 50 " + ESCAPING_EL,
+ validationMessages[0].getMessage()
+ );
+ }
+
+ public void testCircularity() throws Exception {
+ Brother emmanuel = new Brother();
+ emmanuel.setName( "Emmanuel" );
+ Address.blacklistedZipCode = "666";
+ Address address = new Address();
+ address.setInternalValid( true );
+ address.setCountry( "France" );
+ address.setId( 3 );
+ address.setLine1( "Rue des rosiers" );
+ address.setState( "NYC" );
+ address.setZip( "33333" );
+ address.floor = 4;
+ emmanuel.setAddress( address );
+ Brother christophe = new Brother();
+ christophe.setName( "Christophe" );
+ christophe.setAddress( address );
+ emmanuel.setYoungerBrother( christophe );
+ christophe.setElder( emmanuel );
+ ClassValidator<Brother> classValidator = new ClassValidator<Brother>( Brother.class );
+ InvalidValue[] invalidValues = classValidator.getInvalidValues( emmanuel );
+ assertEquals( 0, invalidValues.length );
+ christophe.setName( null );
+ invalidValues = classValidator.getInvalidValues( emmanuel );
+ assertEquals( 1, invalidValues.length );
+ assertEquals( emmanuel, invalidValues[0].getRootBean() );
+ assertEquals( "youngerBrother.name", invalidValues[0].getPropertyPath() );
+ christophe.setName( "Christophe" );
+ address = new Address();
+ address.setInternalValid( true );
+ address.setCountry( "France" );
+ address.setId( 4 );
+ address.setLine1( "Rue des plantes" );
+ address.setState( "NYC" );
+ address.setZip( "33333" );
+ address.floor = -100;
+ christophe.setAddress( address );
+ invalidValues = classValidator.getInvalidValues( emmanuel );
+ assertEquals( 1, invalidValues.length );
+ }
+
+ public void testAggregationAnnotations() throws Exception {
+ Engine eng = new Engine();
+ eng.setHorsePower( 23 );
+ eng.setSerialNumber( "23-43###4" );
+ ClassValidator<Engine> classValidator = new ClassValidator<Engine>( Engine.class );
+ InvalidValue[] invalidValues = classValidator.getInvalidValues( eng );
+ assertEquals( 2, invalidValues.length );
+
+ eng.setSerialNumber( "1234-5678-9012");
+ invalidValues = classValidator.getInvalidValues( eng );
+ assertEquals( 0, invalidValues.length );
+ }
+
+ public void testDefaultResourceBundle() throws Exception {
+ Tv tv = new Tv();
+ tv.serial = "FS";
+ tv.name = "TooLong";
+ tv.expDate = new Date( new Date().getTime() + 1000 * 60 * 60 * 24 * 10 );
+ ClassValidator<Tv> classValidator = new ClassValidator<Tv>( Tv.class );
+ InvalidValue[] invalidValues = classValidator.getInvalidValues( tv );
+ assertEquals( 1, invalidValues.length );
+ Locale loc = Locale.getDefault();
+ if ( loc.toString().startsWith( "en" ) ) {
+ assertEquals( "length must be between 0 and 2", invalidValues[0].getMessage() );
+ }
+ else if ( loc.toString().startsWith( "fr" ) ) {
+ String message = invalidValues[0].getMessage();
+ String message2 ="la longueur doit être entre 0 et 2";
+ assertEquals( message2, message );
+ }
+ else if ( loc.toString().startsWith( "da" ) ) {
+ assertEquals( "længden skal være mellem 0 og 2", invalidValues[0].getMessage() );
+ }
+ else {
+ // if default not found then it must be english
+ assertEquals( "length must be between 0 and 2", invalidValues[0].getMessage() );
+ }
+ }
+
+ public class PrefixMessageInterpolator implements MessageInterpolator, Serializable {
+ private String prefix;
+
+ public PrefixMessageInterpolator(String prefix) {
+ this.prefix = prefix;
+ }
+
+ public String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator) {
+ return prefix + defaultInterpolator.interpolate( message, validator, defaultInterpolator );
+ }
+ }
+
+ public void testMessageInterpolator() throws Exception {
+ Tv tv = new Tv();
+ tv.serial = "FS";
+ tv.name = "TooLong";
+ tv.expDate = new Date( new Date().getTime() + 1000 * 60 * 60 * 24 * 10 );
+ String prefix = "Prefix";
+ ClassValidator<Tv> classValidator = new ClassValidator<Tv>( Tv.class, new PrefixMessageInterpolator( prefix ) );
+ InvalidValue[] invalidValues = classValidator.getInvalidValues( tv );
+ assertEquals( 1, invalidValues.length );
+ Locale loc = Locale.getDefault();
+ if ( loc.toString().startsWith( "en" ) ) {
+ assertEquals( prefix + "length must be between 0 and 2", invalidValues[0].getMessage() );
+ }
+ else if ( loc.toString().startsWith( "fr" ) ) {
+ assertEquals( prefix + "la longueur doit être entre 0 et 2", invalidValues[0].getMessage() );
+ }
+ else if ( loc.toString().startsWith( "da" ) ) {
+ assertEquals( prefix + "længden skal være mellem 0 og 2", invalidValues[0].getMessage() );
+ }
+ else {
+ // if default not found then it must be english
+ assertEquals( prefix + "length must be between 0 and 2", invalidValues[0].getMessage() );
+ }
+ }
+
+ public void testBigInteger() throws Exception {
+ Tv tv = new Tv();
+ tv.lifetime = new BigInteger("9223372036854775808");
+ ClassValidator<Tv> classValidator = new ClassValidator<Tv>( Tv.class );
+ InvalidValue[] invalidValues = classValidator.getInvalidValues( tv );
+ assertEquals( 0, invalidValues.length );
+ }
+
+ public void testBeanValidator() throws Exception {
+ Vase v = new Vase();
+ ClassValidator<Vase> classValidator = new ClassValidator<Vase>( Vase.class );
+ InvalidValue[] invalidValues = classValidator.getInvalidValues( v );
+ assertEquals( 1, invalidValues.length );
+ assertNull( invalidValues[0].getPropertyName() );
+ }
+
+ public void testPotentialInvalidValues() throws Exception {
+ Address a = new Address();
+ Address.blacklistedZipCode = null;
+ a.setCountry( "Australia" );
+ a.setZip( "1221341234123" );
+ a.setState( "Vic" );
+ a.setLine1( "Karbarook Ave" );
+ a.setId( 3 );
+ ClassValidator<Address> classValidator = new ClassValidator<Address>( Address.class );
+ InvalidValue[] validationMessages = classValidator.getPotentialInvalidValues(
+ "blacklistedZipCode", Address.blacklistedZipCode
+ );
+ assertEquals( 1, validationMessages.length );
+ }
+
+ public void testRecursivity() throws Exception {
+ Site site = new Site();
+ site.setSiteName( "Rocky mountains" );
+ Contact contact = new Contact();
+ contact.setName( null ); //1 error
+ contact.setPhone( "01234455" );
+ site.setContact( contact );
+ Address a = new Address();
+ Address.blacklistedZipCode = "222";
+ a.setCountry( "Australia" );
+ a.setZip( "123" );
+ a.setState( "Vic" );
+ a.setLine1( null ); // 1 more error
+ a.setId( 3 );
+ site.setAddress( a );
+ ClassValidator<Site> classValidator = new ClassValidator<Site>( Site.class );
+ InvalidValue[] validationMessages = classValidator.getInvalidValues( site );
+ assertEquals( 2, validationMessages.length );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Vase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Vase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Vase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,11 +0,0 @@
-//$Id$
-package org.hibernate.validator.test;
-
-/**
- * A vase has to be Serializable to fit in luggages
- *
- * @author Emmanuel Bernard
- */
- at Serializability
-public class Vase {
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Vase.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/Vase.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Vase.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/Vase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,11 @@
+//$Id$
+package org.hibernate.validator.test;
+
+/**
+ * A vase has to be Serializable to fit in luggages
+ *
+ * @author Emmanuel Bernard
+ */
+ at Serializability
+public class Vase {
+}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections)
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Movie.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Movie.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Movie.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.collections;
-
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Movie {
- @NotNull
- public String name;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Movie.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Movie.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Movie.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Movie.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id: $
+package org.hibernate.validator.test.collections;
+
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Movie {
+ @NotNull
+ public String name;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Presenter.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Presenter.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Presenter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.collections;
-
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Presenter {
- @NotNull
- public String name;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Presenter.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Presenter.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Presenter.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Presenter.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id: $
+package org.hibernate.validator.test.collections;
+
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Presenter {
+ @NotNull
+ public String name;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Show.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Show.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Show.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,12 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.collections;
-
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Show {
- @NotNull
- public String name;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Show.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Show.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Show.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Show.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,12 @@
+//$Id: $
+package org.hibernate.validator.test.collections;
+
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Show {
+ @NotNull
+ public String name;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Tv.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Tv.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Tv.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.collections;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.hibernate.validator.NotNull;
-import org.hibernate.validator.Valid;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Tv {
- @NotNull
- public String name;
-
- @Valid
- public List<Presenter> presenters = new ArrayList<Presenter>();
-
- @Valid
- public Map<String, Show> shows = new HashMap<String, Show>();
-
- public
- @Valid
- Movie[] movies;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Tv.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Tv.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Tv.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/Tv.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id: $
+package org.hibernate.validator.test.collections;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.hibernate.validator.NotNull;
+import org.hibernate.validator.Valid;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Tv {
+ @NotNull
+ public String name;
+
+ @Valid
+ public List<Presenter> presenters = new ArrayList<Presenter>();
+
+ @Valid
+ public Map<String, Show> shows = new HashMap<String, Show>();
+
+ public
+ @Valid
+ Movie[] movies;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,59 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.collections;
-
-import junit.framework.TestCase;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.InvalidValue;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ValidationCollectionTest extends TestCase {
- public void testCollection() throws Exception {
- Tv tv = new Tv();
- tv.name = "France 2";
- Presenter presNok = new Presenter();
- presNok.name = null;
- Presenter presOk = new Presenter();
- presOk.name = "Thierry Ardisson";
- tv.presenters.add( presOk );
- tv.presenters.add( presNok );
- ClassValidator validator = new ClassValidator( Tv.class );
- InvalidValue[] values = validator.getInvalidValues( tv );
- assertEquals( 1, values.length );
- assertEquals( "presenters[1].name", values[0].getPropertyPath() );
- }
-
- public void testMap() throws Exception {
- Tv tv = new Tv();
- tv.name = "France 2";
- Show showOk = new Show();
- showOk.name = "Tout le monde en parle";
- Show showNok = new Show();
- showNok.name = null;
- tv.shows.put( "Midnight", showOk );
- tv.shows.put( "Primetime", showNok );
- ClassValidator validator = new ClassValidator( Tv.class );
- InvalidValue[] values = validator.getInvalidValues( tv );
- assertEquals( 1, values.length );
- assertEquals( "shows['Primetime'].name", values[0].getPropertyPath() );
- }
-
- public void testArray() throws Exception {
- Tv tv = new Tv();
- tv.name = "France 2";
- Movie movieOk = new Movie();
- movieOk.name = "Kill Bill";
- Movie movieNok = new Movie();
- movieNok.name = null;
- tv.movies = new Movie[]{
- movieOk,
- null,
- movieNok
- };
- ClassValidator validator = new ClassValidator( Tv.class );
- InvalidValue[] values = validator.getInvalidValues( tv );
- assertEquals( 1, values.length );
- assertEquals( "movies[2].name", values[0].getPropertyPath() );
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/collections/ValidationCollectionTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,59 @@
+//$Id: $
+package org.hibernate.validator.test.collections;
+
+import junit.framework.TestCase;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.InvalidValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ValidationCollectionTest extends TestCase {
+ public void testCollection() throws Exception {
+ Tv tv = new Tv();
+ tv.name = "France 2";
+ Presenter presNok = new Presenter();
+ presNok.name = null;
+ Presenter presOk = new Presenter();
+ presOk.name = "Thierry Ardisson";
+ tv.presenters.add( presOk );
+ tv.presenters.add( presNok );
+ ClassValidator validator = new ClassValidator( Tv.class );
+ InvalidValue[] values = validator.getInvalidValues( tv );
+ assertEquals( 1, values.length );
+ assertEquals( "presenters[1].name", values[0].getPropertyPath() );
+ }
+
+ public void testMap() throws Exception {
+ Tv tv = new Tv();
+ tv.name = "France 2";
+ Show showOk = new Show();
+ showOk.name = "Tout le monde en parle";
+ Show showNok = new Show();
+ showNok.name = null;
+ tv.shows.put( "Midnight", showOk );
+ tv.shows.put( "Primetime", showNok );
+ ClassValidator validator = new ClassValidator( Tv.class );
+ InvalidValue[] values = validator.getInvalidValues( tv );
+ assertEquals( 1, values.length );
+ assertEquals( "shows['Primetime'].name", values[0].getPropertyPath() );
+ }
+
+ public void testArray() throws Exception {
+ Tv tv = new Tv();
+ tv.name = "France 2";
+ Movie movieOk = new Movie();
+ movieOk.name = "Kill Bill";
+ Movie movieNok = new Movie();
+ movieNok.name = null;
+ tv.movies = new Movie[]{
+ movieOk,
+ null,
+ movieNok
+ };
+ ClassValidator validator = new ClassValidator( Tv.class );
+ InvalidValue[] values = validator.getInvalidValues( tv );
+ assertEquals( 1, values.length );
+ assertEquals( "movies[2].name", values[0].getPropertyPath() );
+ }
+}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration)
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Address.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Address.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,108 +0,0 @@
-//$Id: Address.java 9755 2006-04-17 19:44:22Z epbernard $
-package org.hibernate.validator.test.haintegration;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.Transient;
-
-import org.hibernate.validator.AssertTrue;
-import org.hibernate.validator.Length;
-import org.hibernate.validator.Min;
-import org.hibernate.validator.NotNull;
-import org.hibernate.validator.Pattern;
-import org.hibernate.validator.Range;
-
-/**
- * @author Gavin King
- */
- at Entity
-public class Address {
- @NotNull
- public static String blacklistedZipCode;
-
- private String line1;
- private String line2;
- private String zip;
- private String state;
- @Length(max = 20)
- @NotNull
- private String country;
- private long id;
- private boolean internalValid = true;
- @Range(min = -2, max = 50, message = "{floor.out.of.range} (escaping #{el})")
- public int floor;
-
- public String getCountry() {
- return country;
- }
-
- public void setCountry(String country) {
- this.country = country;
- }
-
- @NotNull
- public String getLine1() {
- return line1;
- }
-
- public void setLine1(String line1) {
- this.line1 = line1;
- }
-
- public String getLine2() {
- return line2;
- }
-
- public void setLine2(String line2) {
- this.line2 = line2;
- }
-
- @Length(max = 3)
- @NotNull
- public String getState() {
- return state;
- }
-
- public void setState(String state) {
- this.state = state;
- }
-
- @Length(max = 5, message = "{long}")
- @Pattern(regex = "[0-9]+")
- @NotNull
- public String getZip() {
- return zip;
- }
-
- public void setZip(String zip) {
- this.zip = zip;
- }
-
- @AssertTrue
- @Transient
- public boolean isValid() {
- return true;
- }
-
- @AssertTrue
- @Transient
- private boolean isInternalValid() {
- return internalValid;
- }
-
- public void setInternalValid(boolean internalValid) {
- this.internalValid = internalValid;
- }
-
- @Id
- @Min(1)
- @Range(max = 2000)
- public long getId() {
- return id;
- }
-
- public void setId(long id) {
- this.id = id;
- }
-
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Address.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Address.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Address.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,108 @@
+//$Id: Address.java 9755 2006-04-17 19:44:22Z epbernard $
+package org.hibernate.validator.test.haintegration;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.Transient;
+
+import org.hibernate.validator.AssertTrue;
+import org.hibernate.validator.Length;
+import org.hibernate.validator.Min;
+import org.hibernate.validator.NotNull;
+import org.hibernate.validator.Pattern;
+import org.hibernate.validator.Range;
+
+/**
+ * @author Gavin King
+ */
+ at Entity
+public class Address {
+ @NotNull
+ public static String blacklistedZipCode;
+
+ private String line1;
+ private String line2;
+ private String zip;
+ private String state;
+ @Length(max = 20)
+ @NotNull
+ private String country;
+ private long id;
+ private boolean internalValid = true;
+ @Range(min = -2, max = 50, message = "{floor.out.of.range} (escaping #{el})")
+ public int floor;
+
+ public String getCountry() {
+ return country;
+ }
+
+ public void setCountry(String country) {
+ this.country = country;
+ }
+
+ @NotNull
+ public String getLine1() {
+ return line1;
+ }
+
+ public void setLine1(String line1) {
+ this.line1 = line1;
+ }
+
+ public String getLine2() {
+ return line2;
+ }
+
+ public void setLine2(String line2) {
+ this.line2 = line2;
+ }
+
+ @Length(max = 3)
+ @NotNull
+ public String getState() {
+ return state;
+ }
+
+ public void setState(String state) {
+ this.state = state;
+ }
+
+ @Length(max = 5, message = "{long}")
+ @Pattern(regex = "[0-9]+")
+ @NotNull
+ public String getZip() {
+ return zip;
+ }
+
+ public void setZip(String zip) {
+ this.zip = zip;
+ }
+
+ @AssertTrue
+ @Transient
+ public boolean isValid() {
+ return true;
+ }
+
+ @AssertTrue
+ @Transient
+ private boolean isInternalValid() {
+ return internalValid;
+ }
+
+ public void setInternalValid(boolean internalValid) {
+ this.internalValid = internalValid;
+ }
+
+ @Id
+ @Min(1)
+ @Range(max = 2000)
+ public long getId() {
+ return id;
+ }
+
+ public void setId(long id) {
+ this.id = id;
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/CreditCard.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/CreditCard.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/CreditCard.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,41 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.haintegration;
-
-import javax.persistence.Embedded;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import org.hibernate.validator.NotNull;
-import org.hibernate.validator.Valid;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class CreditCard {
- @Id
- @GeneratedValue
- private Integer id;
- @Embedded
- @Valid
- @NotNull
- private User username;
-
- public Integer getId() {
- return id;
- }
-
- public void setId(Integer id) {
- this.id = id;
- }
-
- public User getUsername() {
- return username;
- }
-
- public void setUsername(User username) {
- this.username = username;
- }
-
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/CreditCard.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/CreditCard.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/CreditCard.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/CreditCard.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,41 @@
+//$Id: $
+package org.hibernate.validator.test.haintegration;
+
+import javax.persistence.Embedded;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.validator.NotNull;
+import org.hibernate.validator.Valid;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class CreditCard {
+ @Id
+ @GeneratedValue
+ private Integer id;
+ @Embedded
+ @Valid
+ @NotNull
+ private User username;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(Integer id) {
+ this.id = id;
+ }
+
+ public User getUsername() {
+ return username;
+ }
+
+ public void setUsername(User username) {
+ this.username = username;
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,49 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.haintegration;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.event.PreInsertEventListener;
-import org.hibernate.event.PreUpdateEventListener;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.event.ValidatePreInsertEventListener;
-import org.hibernate.validator.event.ValidatePreUpdateEventListener;
-import org.hibernate.validator.test.HANTestCase;
-
-/**
- * @author Emmanuel Bernard
- */
-public class EmbeddedObjectTest extends HANTestCase {
- public void testNotNullEmbeddedObject() throws Exception {
- CreditCard cc = new CreditCard();
- User username = new User();
- username.setFirstname( "Emmanuel" );
- username.setMiddlename( "P" );
- username.setLastname( "Bernard" );
- cc.setUsername( username );
- ClassValidator ccValid = new ClassValidator( CreditCard.class );
- assertEquals( 0, ccValid.getInvalidValues( cc ).length );
- username.setMiddlename( null );
- assertEquals( 0, ccValid.getInvalidValues( cc ).length );
- Session s = openSession();
- Transaction tx = s.beginTransaction();
- s.persist( cc );
- s.flush();
- tx.rollback();
- s.close();
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- CreditCard.class
- };
- }
-
- protected void configure(Configuration cfg) {
- cfg.getEventListeners()
- .setPreInsertEventListeners( new PreInsertEventListener[]{new ValidatePreInsertEventListener()} );
- cfg.getEventListeners()
- .setPreUpdateEventListeners( new PreUpdateEventListener[]{new ValidatePreUpdateEventListener()} );
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/EmbeddedObjectTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,49 @@
+//$Id: $
+package org.hibernate.validator.test.haintegration;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.event.PreInsertEventListener;
+import org.hibernate.event.PreUpdateEventListener;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.event.ValidatePreInsertEventListener;
+import org.hibernate.validator.event.ValidatePreUpdateEventListener;
+import org.hibernate.validator.test.HANTestCase;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class EmbeddedObjectTest extends HANTestCase {
+ public void testNotNullEmbeddedObject() throws Exception {
+ CreditCard cc = new CreditCard();
+ User username = new User();
+ username.setFirstname( "Emmanuel" );
+ username.setMiddlename( "P" );
+ username.setLastname( "Bernard" );
+ cc.setUsername( username );
+ ClassValidator ccValid = new ClassValidator( CreditCard.class );
+ assertEquals( 0, ccValid.getInvalidValues( cc ).length );
+ username.setMiddlename( null );
+ assertEquals( 0, ccValid.getInvalidValues( cc ).length );
+ Session s = openSession();
+ Transaction tx = s.beginTransaction();
+ s.persist( cc );
+ s.flush();
+ tx.rollback();
+ s.close();
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ CreditCard.class
+ };
+ }
+
+ protected void configure(Configuration cfg) {
+ cfg.getEventListeners()
+ .setPreInsertEventListeners( new PreInsertEventListener[]{new ValidatePreInsertEventListener()} );
+ cfg.getEventListeners()
+ .setPreUpdateEventListeners( new PreUpdateEventListener[]{new ValidatePreUpdateEventListener()} );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,169 +0,0 @@
-//$Id$
-package org.hibernate.validator.test.haintegration;
-
-import org.hibernate.Session;
-import org.hibernate.Transaction;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.event.PreInsertEventListener;
-import org.hibernate.event.PreUpdateEventListener;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.validator.Environment;
-import org.hibernate.validator.InvalidStateException;
-import org.hibernate.validator.event.ValidateEventListener;
-import org.hibernate.validator.test.HANTestCase;
-
-/**
- * Test the validate framework integration with the Hibernate
- * metadata binding
- *
- * @author Emmanuel Bernard
- */
-public class HibernateAnnotationIntegrationTest extends HANTestCase {
- public void testApply() throws Exception {
- PersistentClass classMapping = getCfg().getClassMapping( Address.class.getName() );
- //new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) ).apply( classMapping );
- Column stateColumn = (Column) classMapping.getProperty( "state" ).getColumnIterator().next();
- assertEquals( stateColumn.getLength(), 3 );
- Column zipColumn = (Column) classMapping.getProperty( "zip" ).getColumnIterator().next();
- assertEquals( zipColumn.getLength(), 5 );
- assertFalse( zipColumn.isNullable() );
- }
-
- public void testApplyOnIdColumn() throws Exception {
- PersistentClass classMapping = getCfg().getClassMapping( Tv.class.getName() );
- Column serialColumn = (Column) classMapping.getIdentifierProperty().getColumnIterator().next();
- assertEquals( "Vaidator annotation not applied on ids", 2, serialColumn.getLength() );
- }
-
- public void testApplyOnManyToOne() throws Exception {
- PersistentClass classMapping = getCfg().getClassMapping( TvOwner.class.getName() );
- Column serialColumn = (Column) classMapping.getProperty( "tv" ).getColumnIterator().next();
- assertEquals( "Validator annotations not applied on associations", false, serialColumn.isNullable() );
- }
-
- public void testSingleTableAvoidNotNull() throws Exception {
- PersistentClass classMapping = getCfg().getClassMapping( Rock.class.getName() );
- Column serialColumn = (Column) classMapping.getProperty( "bit" ).getColumnIterator().next();
- assertTrue( "Notnull should not be applised on single tables", serialColumn.isNullable() );
- }
-
- public void testEvents() throws Exception {
- Session s;
- Transaction tx;
- Address a = new Address();
- Address.blacklistedZipCode = "3232";
- a.setId( 12 );
- a.setCountry( "Country" );
- a.setLine1( "Line 1" );
- a.setZip( "nonnumeric" );
- a.setState( "NY" );
- s = openSession();
- tx = s.beginTransaction();
- try {
- s.persist( a );
- tx.commit();
- fail( "bean should have been validated" );
- }
- catch (InvalidStateException e) {
- //success
- assertEquals( 2, e.getInvalidValues().length );
- assertTrue( "Environment.MESSAGE_INTERPOLATOR_CLASS does not work",
- e.getInvalidValues()[0].getMessage().startsWith( "prefix_")
- );
- }
- finally {
- if ( tx != null ) tx.rollback();
- s.close();
- }
- s = openSession();
- tx = s.beginTransaction();
- a.setCountry( "Country" );
- a.setLine1( "Line 1" );
- a.setZip( "4343" );
- a.setState( "NY" );
- s.persist( a );
- a.setState( "TOOLONG" );
- try {
- s.flush();
- fail( "update should have been checked" );
- }
- catch (InvalidStateException e) {
- assertEquals( 1, e.getInvalidValues().length );
- }
- finally {
- if ( tx != null ) tx.rollback();
- s.close();
- }
- }
-
- public void testComponents() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Martian martian = new Martian();
- MartianPk pk = new MartianPk();
- pk.setColony( "Liberal" ); //one failure
- pk.setName( "Biboudie" );
- MarsAddress address = new MarsAddress();
- address.setContinent( "cont" ); //one failure
- address.setCanal( "Plus" ); //one failure
- martian.setId( pk );
- martian.setAddress( address );
- s.persist( martian );
- try {
- s.flush();
- fail( "Components are not validated" );
- }
- catch (InvalidStateException e) {
- assertEquals( 2, e.getInvalidValues().length );
- }
- finally {
- tx.rollback();
- s.close();
- }
- }
-
- public void testIdClass() throws Exception {
- Session s;
- Transaction tx;
- s = openSession();
- tx = s.beginTransaction();
- Venusian venus = new Venusian();
- venus.setName( "bibi" );
- venus.setRegion( "ts" );
- s.persist( venus );
- try {
- s.flush();
- fail( "test on embedded properties should have been done" );
- }
- catch (InvalidStateException e) {
- assertEquals( 1, e.getInvalidValues().length );
- }
- finally {
- tx.rollback();
- s.close();
- }
- }
-
- protected void configure(Configuration cfg) {
- cfg.setProperty( Environment.MESSAGE_INTERPOLATOR_CLASS, PrefixMessageInterpolator.class.getName() );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Address.class,
- Martian.class,
- Venusian.class,
- Tv.class,
- TvOwner.class,
- Music.class,
- Rock.class
- };
- }
-
- public HibernateAnnotationIntegrationTest(String x) {
- super( x );
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/HibernateAnnotationIntegrationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,169 @@
+//$Id$
+package org.hibernate.validator.test.haintegration;
+
+import org.hibernate.Session;
+import org.hibernate.Transaction;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.event.PreInsertEventListener;
+import org.hibernate.event.PreUpdateEventListener;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.validator.Environment;
+import org.hibernate.validator.InvalidStateException;
+import org.hibernate.validator.event.ValidateEventListener;
+import org.hibernate.validator.test.HANTestCase;
+
+/**
+ * Test the validate framework integration with the Hibernate
+ * metadata binding
+ *
+ * @author Emmanuel Bernard
+ */
+public class HibernateAnnotationIntegrationTest extends HANTestCase {
+ public void testApply() throws Exception {
+ PersistentClass classMapping = getCfg().getClassMapping( Address.class.getName() );
+ //new ClassValidator( Address.class, ResourceBundle.getBundle("messages", Locale.ENGLISH) ).apply( classMapping );
+ Column stateColumn = (Column) classMapping.getProperty( "state" ).getColumnIterator().next();
+ assertEquals( stateColumn.getLength(), 3 );
+ Column zipColumn = (Column) classMapping.getProperty( "zip" ).getColumnIterator().next();
+ assertEquals( zipColumn.getLength(), 5 );
+ assertFalse( zipColumn.isNullable() );
+ }
+
+ public void testApplyOnIdColumn() throws Exception {
+ PersistentClass classMapping = getCfg().getClassMapping( Tv.class.getName() );
+ Column serialColumn = (Column) classMapping.getIdentifierProperty().getColumnIterator().next();
+ assertEquals( "Vaidator annotation not applied on ids", 2, serialColumn.getLength() );
+ }
+
+ public void testApplyOnManyToOne() throws Exception {
+ PersistentClass classMapping = getCfg().getClassMapping( TvOwner.class.getName() );
+ Column serialColumn = (Column) classMapping.getProperty( "tv" ).getColumnIterator().next();
+ assertEquals( "Validator annotations not applied on associations", false, serialColumn.isNullable() );
+ }
+
+ public void testSingleTableAvoidNotNull() throws Exception {
+ PersistentClass classMapping = getCfg().getClassMapping( Rock.class.getName() );
+ Column serialColumn = (Column) classMapping.getProperty( "bit" ).getColumnIterator().next();
+ assertTrue( "Notnull should not be applised on single tables", serialColumn.isNullable() );
+ }
+
+ public void testEvents() throws Exception {
+ Session s;
+ Transaction tx;
+ Address a = new Address();
+ Address.blacklistedZipCode = "3232";
+ a.setId( 12 );
+ a.setCountry( "Country" );
+ a.setLine1( "Line 1" );
+ a.setZip( "nonnumeric" );
+ a.setState( "NY" );
+ s = openSession();
+ tx = s.beginTransaction();
+ try {
+ s.persist( a );
+ tx.commit();
+ fail( "bean should have been validated" );
+ }
+ catch (InvalidStateException e) {
+ //success
+ assertEquals( 2, e.getInvalidValues().length );
+ assertTrue( "Environment.MESSAGE_INTERPOLATOR_CLASS does not work",
+ e.getInvalidValues()[0].getMessage().startsWith( "prefix_")
+ );
+ }
+ finally {
+ if ( tx != null ) tx.rollback();
+ s.close();
+ }
+ s = openSession();
+ tx = s.beginTransaction();
+ a.setCountry( "Country" );
+ a.setLine1( "Line 1" );
+ a.setZip( "4343" );
+ a.setState( "NY" );
+ s.persist( a );
+ a.setState( "TOOLONG" );
+ try {
+ s.flush();
+ fail( "update should have been checked" );
+ }
+ catch (InvalidStateException e) {
+ assertEquals( 1, e.getInvalidValues().length );
+ }
+ finally {
+ if ( tx != null ) tx.rollback();
+ s.close();
+ }
+ }
+
+ public void testComponents() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Martian martian = new Martian();
+ MartianPk pk = new MartianPk();
+ pk.setColony( "Liberal" ); //one failure
+ pk.setName( "Biboudie" );
+ MarsAddress address = new MarsAddress();
+ address.setContinent( "cont" ); //one failure
+ address.setCanal( "Plus" ); //one failure
+ martian.setId( pk );
+ martian.setAddress( address );
+ s.persist( martian );
+ try {
+ s.flush();
+ fail( "Components are not validated" );
+ }
+ catch (InvalidStateException e) {
+ assertEquals( 2, e.getInvalidValues().length );
+ }
+ finally {
+ tx.rollback();
+ s.close();
+ }
+ }
+
+ public void testIdClass() throws Exception {
+ Session s;
+ Transaction tx;
+ s = openSession();
+ tx = s.beginTransaction();
+ Venusian venus = new Venusian();
+ venus.setName( "bibi" );
+ venus.setRegion( "ts" );
+ s.persist( venus );
+ try {
+ s.flush();
+ fail( "test on embedded properties should have been done" );
+ }
+ catch (InvalidStateException e) {
+ assertEquals( 1, e.getInvalidValues().length );
+ }
+ finally {
+ tx.rollback();
+ s.close();
+ }
+ }
+
+ protected void configure(Configuration cfg) {
+ cfg.setProperty( Environment.MESSAGE_INTERPOLATOR_CLASS, PrefixMessageInterpolator.class.getName() );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Address.class,
+ Martian.class,
+ Venusian.class,
+ Tv.class,
+ TvOwner.class,
+ Music.class,
+ Rock.class
+ };
+ }
+
+ public HibernateAnnotationIntegrationTest(String x) {
+ super( x );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MarsAddress.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MarsAddress.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MarsAddress.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,34 +0,0 @@
-//$Id: MarsAddress.java 8593 2005-11-17 18:12:11Z epbernard $
-package org.hibernate.validator.test.haintegration;
-
-import javax.persistence.Embeddable;
-
-import org.hibernate.validator.Length;
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class MarsAddress {
- private String continent;
- private String canal;
-
- @NotNull
- public String getContinent() {
- return continent;
- }
-
- public void setContinent(String continent) {
- this.continent = continent;
- }
-
- @Length(min = 5)
- public String getCanal() {
- return canal;
- }
-
- public void setCanal(String canal) {
- this.canal = canal;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MarsAddress.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MarsAddress.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MarsAddress.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MarsAddress.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,34 @@
+//$Id: MarsAddress.java 8593 2005-11-17 18:12:11Z epbernard $
+package org.hibernate.validator.test.haintegration;
+
+import javax.persistence.Embeddable;
+
+import org.hibernate.validator.Length;
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class MarsAddress {
+ private String continent;
+ private String canal;
+
+ @NotNull
+ public String getContinent() {
+ return continent;
+ }
+
+ public void setContinent(String continent) {
+ this.continent = continent;
+ }
+
+ @Length(min = 5)
+ public String getCanal() {
+ return canal;
+ }
+
+ public void setCanal(String canal) {
+ this.canal = canal;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Martian.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Martian.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Martian.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,32 +0,0 @@
-//$Id: Martian.java 7797 2005-08-10 10:40:48Z epbernard $
-package org.hibernate.validator.test.haintegration;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Martian {
- private MartianPk id;
- private MarsAddress address;
-
- @Id
- public MartianPk getId() {
- return id;
- }
-
- public void setId(MartianPk id) {
- this.id = id;
- }
-
- public MarsAddress getAddress() {
- return address;
- }
-
- public void setAddress(MarsAddress address) {
- this.address = address;
- }
-
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Martian.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Martian.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Martian.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Martian.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,32 @@
+//$Id: Martian.java 7797 2005-08-10 10:40:48Z epbernard $
+package org.hibernate.validator.test.haintegration;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Martian {
+ private MartianPk id;
+ private MarsAddress address;
+
+ @Id
+ public MartianPk getId() {
+ return id;
+ }
+
+ public void setId(MartianPk id) {
+ this.id = id;
+ }
+
+ public MarsAddress getAddress() {
+ return address;
+ }
+
+ public void setAddress(MarsAddress address) {
+ this.address = address;
+ }
+
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MartianPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MartianPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MartianPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-//$Id: MartianPk.java 8593 2005-11-17 18:12:11Z epbernard $
-package org.hibernate.validator.test.haintegration;
-
-import java.io.Serializable;
-import javax.persistence.Embeddable;
-
-import org.hibernate.validator.Length;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class MartianPk implements Serializable {
- private String name;
- private String colony;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- @Length(max = 4)
- public String getColony() {
- return colony;
- }
-
- public void setColony(String colony) {
- this.colony = colony;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final MartianPk martianPk = (MartianPk) o;
-
- if ( !colony.equals( martianPk.colony ) ) return false;
- if ( !name.equals( martianPk.name ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = name.hashCode();
- result = 29 * result + colony.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MartianPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MartianPk.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MartianPk.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/MartianPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+//$Id: MartianPk.java 8593 2005-11-17 18:12:11Z epbernard $
+package org.hibernate.validator.test.haintegration;
+
+import java.io.Serializable;
+import javax.persistence.Embeddable;
+
+import org.hibernate.validator.Length;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class MartianPk implements Serializable {
+ private String name;
+ private String colony;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ @Length(max = 4)
+ public String getColony() {
+ return colony;
+ }
+
+ public void setColony(String colony) {
+ this.colony = colony;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final MartianPk martianPk = (MartianPk) o;
+
+ if ( !colony.equals( martianPk.colony ) ) return false;
+ if ( !name.equals( martianPk.name ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = name.hashCode();
+ result = 29 * result + colony.hashCode();
+ return result;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Music.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Music.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Music.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id: Music.java 9795 2006-04-26 06:41:18Z epbernard $
-package org.hibernate.validator.test.haintegration;
-
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Music {
- @Id
- public String name;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Music.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Music.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Music.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Music.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id: Music.java 9795 2006-04-26 06:41:18Z epbernard $
+package org.hibernate.validator.test.haintegration;
+
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Music {
+ @Id
+ public String name;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,52 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.haintegration;
-
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.mapping.Column;
-import org.hibernate.event.PreInsertEventListener;
-import org.hibernate.event.PreUpdateEventListener;
-import org.hibernate.cfg.Configuration;
-import org.hibernate.validator.Environment;
-import org.hibernate.validator.test.HANTestCase;
-import org.hibernate.validator.event.ValidateEventListener;
-import org.hibernate.Session;
-
-/**
- * Test the ability to disable DDL update
- *
- * @author Emmanuel Bernard
- */
-public class NonHibernateAnnotationsIntegrationTest extends HANTestCase {
- public void testNotApplyDll() throws Exception {
- PersistentClass classMapping = getCfg().getClassMapping( Address.class.getName() );
- Column stateColumn = (Column) classMapping.getProperty( "state" ).getColumnIterator().next();
- assertFalse( stateColumn.getLength() == 3 );
- Column zipColumn = (Column) classMapping.getProperty( "zip" ).getColumnIterator().next();
- assertFalse( zipColumn.getLength() == 5 );
- assertTrue( zipColumn.isNullable() );
- }
-
- public void testNotApplyListener() throws Exception {
- Session s = openSession( );
- Address a = new Address();
- s.persist( a ); //shouldn't fail
- s.flush();
- s.close();
- }
-
- protected void configure(Configuration cfg) {
- cfg.setProperty( Environment.MESSAGE_INTERPOLATOR_CLASS, PrefixMessageInterpolator.class.getName() );
- cfg.setProperty( Environment.APPLY_TO_DDL, "false" );
- cfg.setProperty( Environment.AUTOREGISTER_LISTENERS, "false" );
- }
-
- protected Class[] getMappings() {
- return new Class[]{
- Address.class,
- };
- }
-
- public NonHibernateAnnotationsIntegrationTest(String x) {
- super( x );
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/NonHibernateAnnotationsIntegrationTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,52 @@
+//$Id: $
+package org.hibernate.validator.test.haintegration;
+
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.mapping.Column;
+import org.hibernate.event.PreInsertEventListener;
+import org.hibernate.event.PreUpdateEventListener;
+import org.hibernate.cfg.Configuration;
+import org.hibernate.validator.Environment;
+import org.hibernate.validator.test.HANTestCase;
+import org.hibernate.validator.event.ValidateEventListener;
+import org.hibernate.Session;
+
+/**
+ * Test the ability to disable DDL update
+ *
+ * @author Emmanuel Bernard
+ */
+public class NonHibernateAnnotationsIntegrationTest extends HANTestCase {
+ public void testNotApplyDll() throws Exception {
+ PersistentClass classMapping = getCfg().getClassMapping( Address.class.getName() );
+ Column stateColumn = (Column) classMapping.getProperty( "state" ).getColumnIterator().next();
+ assertFalse( stateColumn.getLength() == 3 );
+ Column zipColumn = (Column) classMapping.getProperty( "zip" ).getColumnIterator().next();
+ assertFalse( zipColumn.getLength() == 5 );
+ assertTrue( zipColumn.isNullable() );
+ }
+
+ public void testNotApplyListener() throws Exception {
+ Session s = openSession( );
+ Address a = new Address();
+ s.persist( a ); //shouldn't fail
+ s.flush();
+ s.close();
+ }
+
+ protected void configure(Configuration cfg) {
+ cfg.setProperty( Environment.MESSAGE_INTERPOLATOR_CLASS, PrefixMessageInterpolator.class.getName() );
+ cfg.setProperty( Environment.APPLY_TO_DDL, "false" );
+ cfg.setProperty( Environment.AUTOREGISTER_LISTENERS, "false" );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[]{
+ Address.class,
+ };
+ }
+
+ public NonHibernateAnnotationsIntegrationTest(String x) {
+ super( x );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/PrefixMessageInterpolator.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/PrefixMessageInterpolator.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/PrefixMessageInterpolator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.haintegration;
-
-import org.hibernate.validator.MessageInterpolator;
-import org.hibernate.validator.Validator;
-
-/**
- * @author Emmanuel Bernard
- */
-public class PrefixMessageInterpolator implements MessageInterpolator {
- public String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator) {
- return "prefix_" + defaultInterpolator.interpolate( message, validator, defaultInterpolator );
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/PrefixMessageInterpolator.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/PrefixMessageInterpolator.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/PrefixMessageInterpolator.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/PrefixMessageInterpolator.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id: $
+package org.hibernate.validator.test.haintegration;
+
+import org.hibernate.validator.MessageInterpolator;
+import org.hibernate.validator.Validator;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class PrefixMessageInterpolator implements MessageInterpolator {
+ public String interpolate(String message, Validator validator, MessageInterpolator defaultInterpolator) {
+ return "prefix_" + defaultInterpolator.interpolate( message, validator, defaultInterpolator );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Rock.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Rock.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Rock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,15 +0,0 @@
-//$Id: Rock.java 9795 2006-04-26 06:41:18Z epbernard $
-package org.hibernate.validator.test.haintegration;
-
-import javax.persistence.Entity;
-
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Rock extends Music {
- @NotNull
- public Integer bit;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Rock.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Rock.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Rock.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Rock.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,15 @@
+//$Id: Rock.java 9795 2006-04-26 06:41:18Z epbernard $
+package org.hibernate.validator.test.haintegration;
+
+import javax.persistence.Entity;
+
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Rock extends Music {
+ @NotNull
+ public Integer bit;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Tv.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Tv.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Tv.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,30 +0,0 @@
-//$Id: Tv.java 10384 2006-08-31 04:10:44Z epbernard $
-package org.hibernate.validator.test.haintegration;
-
-import java.util.Date;
-import java.math.BigInteger;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-
-import org.hibernate.validator.Future;
-import org.hibernate.validator.Length;
-import org.hibernate.validator.Min;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Tv {
- @Id
- @Length(max = 2)
- public String serial;
- public int size;
- @Length(max = 2)
- public String name;
- @Future
- public Date expDate;
- @Length(min = 0)
- public String description;
- @Min(1000)
- public BigInteger lifetime;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Tv.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Tv.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Tv.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Tv.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,30 @@
+//$Id: Tv.java 10384 2006-08-31 04:10:44Z epbernard $
+package org.hibernate.validator.test.haintegration;
+
+import java.util.Date;
+import java.math.BigInteger;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+
+import org.hibernate.validator.Future;
+import org.hibernate.validator.Length;
+import org.hibernate.validator.Min;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Tv {
+ @Id
+ @Length(max = 2)
+ public String serial;
+ public int size;
+ @Length(max = 2)
+ public String name;
+ @Future
+ public Date expDate;
+ @Length(min = 0)
+ public String description;
+ @Min(1000)
+ public BigInteger lifetime;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/TvOwner.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/TvOwner.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/TvOwner.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: TvOwner.java 9795 2006-04-26 06:41:18Z epbernard $
-package org.hibernate.validator.test.haintegration;
-
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-import javax.persistence.ManyToOne;
-
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class TvOwner {
- @Id
- @GeneratedValue
- public Integer id;
- @ManyToOne
- @NotNull
- public Tv tv;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/TvOwner.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/TvOwner.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/TvOwner.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/TvOwner.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: TvOwner.java 9795 2006-04-26 06:41:18Z epbernard $
+package org.hibernate.validator.test.haintegration;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+import javax.persistence.ManyToOne;
+
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class TvOwner {
+ @Id
+ @GeneratedValue
+ public Integer id;
+ @ManyToOne
+ @NotNull
+ public Tv tv;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/User.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/User.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/User.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,42 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.haintegration;
-
-import javax.persistence.Embeddable;
-
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class User {
- @NotNull
- private String firstname;
- private String middlename;
- @NotNull
- private String lastname;
-
- public String getFirstname() {
- return firstname;
- }
-
- public void setFirstname(String firstname) {
- this.firstname = firstname;
- }
-
- public String getLastname() {
- return lastname;
- }
-
- public void setLastname(String lastname) {
- this.lastname = lastname;
- }
-
- public String getMiddlename() {
- return middlename;
- }
-
- public void setMiddlename(String middlename) {
- this.middlename = middlename;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/User.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/User.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/User.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/User.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,42 @@
+//$Id: $
+package org.hibernate.validator.test.haintegration;
+
+import javax.persistence.Embeddable;
+
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class User {
+ @NotNull
+ private String firstname;
+ private String middlename;
+ @NotNull
+ private String lastname;
+
+ public String getFirstname() {
+ return firstname;
+ }
+
+ public void setFirstname(String firstname) {
+ this.firstname = firstname;
+ }
+
+ public String getLastname() {
+ return lastname;
+ }
+
+ public void setLastname(String lastname) {
+ this.lastname = lastname;
+ }
+
+ public String getMiddlename() {
+ return middlename;
+ }
+
+ public void setMiddlename(String middlename) {
+ this.middlename = middlename;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Venusian.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Venusian.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Venusian.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,38 +0,0 @@
-//$Id: Venusian.java 9795 2006-04-26 06:41:18Z epbernard $
-package org.hibernate.validator.test.haintegration;
-
-import java.io.Serializable;
-import javax.persistence.Entity;
-import javax.persistence.Id;
-import javax.persistence.IdClass;
-
-import org.hibernate.validator.Length;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at IdClass(VenusianPk.class)
-public class Venusian implements Serializable {
- private String region;
- private String name;
-
- @Id
- @Length(min = 3)
- public String getRegion() {
- return region;
- }
-
- public void setRegion(String region) {
- this.region = region;
- }
-
- @Id
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Venusian.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Venusian.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Venusian.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/Venusian.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,38 @@
+//$Id: Venusian.java 9795 2006-04-26 06:41:18Z epbernard $
+package org.hibernate.validator.test.haintegration;
+
+import java.io.Serializable;
+import javax.persistence.Entity;
+import javax.persistence.Id;
+import javax.persistence.IdClass;
+
+import org.hibernate.validator.Length;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at IdClass(VenusianPk.class)
+public class Venusian implements Serializable {
+ private String region;
+ private String name;
+
+ @Id
+ @Length(min = 3)
+ public String getRegion() {
+ return region;
+ }
+
+ public void setRegion(String region) {
+ this.region = region;
+ }
+
+ @Id
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/VenusianPk.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/VenusianPk.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/VenusianPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,47 +0,0 @@
-//$Id: VenusianPk.java 7797 2005-08-10 10:40:48Z epbernard $
-package org.hibernate.validator.test.haintegration;
-
-import java.io.Serializable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class VenusianPk implements Serializable {
- private String region;
- private String name;
-
- public String getRegion() {
- return region;
- }
-
- public void setRegion(String region) {
- this.region = region;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public boolean equals(Object o) {
- if ( this == o ) return true;
- if ( o == null || getClass() != o.getClass() ) return false;
-
- final VenusianPk that = (VenusianPk) o;
-
- if ( !name.equals( that.name ) ) return false;
- if ( !region.equals( that.region ) ) return false;
-
- return true;
- }
-
- public int hashCode() {
- int result;
- result = region.hashCode();
- result = 29 * result + name.hashCode();
- return result;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/VenusianPk.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/VenusianPk.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/VenusianPk.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/haintegration/VenusianPk.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,47 @@
+//$Id: VenusianPk.java 7797 2005-08-10 10:40:48Z epbernard $
+package org.hibernate.validator.test.haintegration;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class VenusianPk implements Serializable {
+ private String region;
+ private String name;
+
+ public String getRegion() {
+ return region;
+ }
+
+ public void setRegion(String region) {
+ this.region = region;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public boolean equals(Object o) {
+ if ( this == o ) return true;
+ if ( o == null || getClass() != o.getClass() ) return false;
+
+ final VenusianPk that = (VenusianPk) o;
+
+ if ( !name.equals( that.name ) ) return false;
+ if ( !region.equals( that.region ) ) return false;
+
+ return true;
+ }
+
+ public int hashCode() {
+ int result;
+ result = region.hashCode();
+ result = 29 * result + name.hashCode();
+ return result;
+ }
+}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance)
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Animal.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Animal.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Animal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,19 +0,0 @@
-//$Id$
-package org.hibernate.validator.test.inheritance;
-
-import java.io.Serializable;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Animal implements Serializable, Name {
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Animal.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Animal.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Animal.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Animal.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,19 @@
+//$Id$
+package org.hibernate.validator.test.inheritance;
+
+import java.io.Serializable;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Animal implements Serializable, Name {
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/BoneEater.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/BoneEater.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/BoneEater.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id$
-package org.hibernate.validator.test.inheritance;
-
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface BoneEater extends Eater {
- @NotNull
- String getFavoriteBone();
-
- void setFavoriteBone(String favoriteBone);
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/BoneEater.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/BoneEater.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/BoneEater.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/BoneEater.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id$
+package org.hibernate.validator.test.inheritance;
+
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface BoneEater extends Eater {
+ @NotNull
+ String getFavoriteBone();
+
+ void setFavoriteBone(String favoriteBone);
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Dog.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Dog.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Dog.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id$
-package org.hibernate.validator.test.inheritance;
-
-import java.io.Serializable;
-
-import org.hibernate.validator.Length;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Dog extends Animal implements Serializable, BoneEater {
- private String favoriteBone;
- private int frequency;
-
- @Length(min = 3)
- public String getFavoriteBone() {
- return favoriteBone;
- }
-
- public void setFavoriteBone(String favoriteBone) {
- this.favoriteBone = favoriteBone;
- }
-
- public int getFrequency() {
- return frequency;
- }
-
- public void setFrequency(int frequency) {
- this.frequency = frequency;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Dog.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Dog.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Dog.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Dog.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id$
+package org.hibernate.validator.test.inheritance;
+
+import java.io.Serializable;
+
+import org.hibernate.validator.Length;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Dog extends Animal implements Serializable, BoneEater {
+ private String favoriteBone;
+ private int frequency;
+
+ @Length(min = 3)
+ public String getFavoriteBone() {
+ return favoriteBone;
+ }
+
+ public void setFavoriteBone(String favoriteBone) {
+ this.favoriteBone = favoriteBone;
+ }
+
+ public int getFrequency() {
+ return frequency;
+ }
+
+ public void setFrequency(int frequency) {
+ this.frequency = frequency;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Eater.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Eater.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Eater.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id$
-package org.hibernate.validator.test.inheritance;
-
-import org.hibernate.validator.Min;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Eater {
- @Min(2)
- int getFrequency();
-
- void setFrequency(int frequency);
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Eater.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Eater.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Eater.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Eater.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id$
+package org.hibernate.validator.test.inheritance;
+
+import org.hibernate.validator.Min;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Eater {
+ @Min(2)
+ int getFrequency();
+
+ void setFrequency(int frequency);
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/InheritanceTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/InheritanceTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/InheritanceTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id$
-package org.hibernate.validator.test.inheritance;
-
-import junit.framework.TestCase;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.InvalidValue;
-
-/**
- * @author Emmanuel Bernard
- */
-public class InheritanceTest extends TestCase {
- public void testInheritance() throws Exception {
- ClassValidator<Dog> classValidator = new ClassValidator<Dog>( Dog.class );
- Dog dog = new Dog();
- InvalidValue[] invalidValues = classValidator.getInvalidValues( dog );
- assertEquals( 3, invalidValues.length );
- dog.setFavoriteBone( "DE" ); //failure
- invalidValues = classValidator.getInvalidValues( dog );
- assertEquals( 3, invalidValues.length );
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/InheritanceTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/InheritanceTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/InheritanceTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/InheritanceTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id$
+package org.hibernate.validator.test.inheritance;
+
+import junit.framework.TestCase;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.InvalidValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class InheritanceTest extends TestCase {
+ public void testInheritance() throws Exception {
+ ClassValidator<Dog> classValidator = new ClassValidator<Dog>( Dog.class );
+ Dog dog = new Dog();
+ InvalidValue[] invalidValues = classValidator.getInvalidValues( dog );
+ assertEquals( 3, invalidValues.length );
+ dog.setFavoriteBone( "DE" ); //failure
+ invalidValues = classValidator.getInvalidValues( dog );
+ assertEquals( 3, invalidValues.length );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Name.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Name.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Name.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id$
-package org.hibernate.validator.test.inheritance;
-
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
-public interface Name {
- @NotNull
- String getName();
-
- void setName(String name);
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Name.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Name.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Name.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/inheritance/Name.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id$
+package org.hibernate.validator.test.inheritance;
+
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public interface Name {
+ @NotNull
+ String getName();
+
+ void setName(String name);
+}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa)
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Commander.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Commander.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Commander.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,25 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.jpa;
-
-import javax.persistence.Embeddable;
-import javax.persistence.Column;
-
-import org.hibernate.validator.NotEmpty;
-
-/**
- * @author Emmanuel Bernard
- */
- at Embeddable
-public class Commander {
- @NotEmpty
- @Column(name="commander_name")
- private String name;
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Commander.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Commander.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Commander.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Commander.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,25 @@
+//$Id: $
+package org.hibernate.validator.test.jpa;
+
+import javax.persistence.Embeddable;
+import javax.persistence.Column;
+
+import org.hibernate.validator.NotEmpty;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Embeddable
+public class Commander {
+ @NotEmpty
+ @Column(name="commander_name")
+ private String name;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPATestCase.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPATestCase.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPATestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,103 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.jpa;
-
-import java.util.Map;
-import java.util.HashMap;
-import java.util.Properties;
-import java.util.ArrayList;
-import java.io.InputStream;
-import java.io.IOException;
-import javax.persistence.EntityManagerFactory;
-import javax.persistence.Persistence;
-
-import org.hibernate.cfg.Environment;
-import org.hibernate.ejb.HibernatePersistence;
-
-/**
- * @author Emmanuel Bernard
- */
-public abstract class JPATestCase extends junit.framework.TestCase {
- protected EntityManagerFactory factory;
-
- public JPATestCase() {
- super();
- }
-
- public JPATestCase(String name) {
- super( name );
- }
-
- public void setUp() {
- factory = new HibernatePersistence().createEntityManagerFactory( getConfig() );
- }
-
- public void tearDown() {
- factory.close();
- }
-
- public abstract Class[] getAnnotatedClasses();
-
- public String[] getEjb3DD() {
- return new String[]{};
- }
-
- public Map<Class, String> getCachedClasses() {
- return new HashMap<Class, String>();
- }
-
- public Map<String, String> getCachedCollections() {
- return new HashMap<String, String>();
- }
-
- public static Properties loadProperties() {
- Properties props = new Properties();
- InputStream stream = Persistence.class.getResourceAsStream( "/hibernate.properties" );
- if ( stream != null ) {
- try {
- props.load( stream );
- }
- catch (Exception e) {
- throw new RuntimeException( "could not load hibernate.properties" );
- }
- finally {
- try {
- stream.close();
- }
- catch (IOException ioe) {
- }
- }
- }
- props.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
- return props;
- }
-
- public Map getConfig() {
- Map config = loadProperties();
- ArrayList<Class> classes = new ArrayList<Class>();
-
- for ( Class clazz : getAnnotatedClasses() ) {
- classes.add( clazz );
- }
- config.put( HibernatePersistence.LOADED_CLASSES, classes );
- for ( Map.Entry<Class, String> entry : getCachedClasses().entrySet() ) {
- config.put(
- HibernatePersistence.CLASS_CACHE_PREFIX + "." + entry.getKey().getName(),
- entry.getValue()
- );
- }
- for ( Map.Entry<String, String> entry : getCachedCollections().entrySet() ) {
- config.put(
- HibernatePersistence.COLLECTION_CACHE_PREFIX + "." + entry.getKey(),
- entry.getValue()
- );
- }
- if ( getEjb3DD().length > 0 ) {
- ArrayList<String> dds = new ArrayList<String>();
- for ( String dd : getEjb3DD() ) {
- dds.add( dd );
- }
- config.put( HibernatePersistence.XML_FILE_NAMES, dds );
- }
- return config;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPATestCase.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPATestCase.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPATestCase.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPATestCase.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,103 @@
+//$Id: $
+package org.hibernate.validator.test.jpa;
+
+import java.util.Map;
+import java.util.HashMap;
+import java.util.Properties;
+import java.util.ArrayList;
+import java.io.InputStream;
+import java.io.IOException;
+import javax.persistence.EntityManagerFactory;
+import javax.persistence.Persistence;
+
+import org.hibernate.cfg.Environment;
+import org.hibernate.ejb.HibernatePersistence;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public abstract class JPATestCase extends junit.framework.TestCase {
+ protected EntityManagerFactory factory;
+
+ public JPATestCase() {
+ super();
+ }
+
+ public JPATestCase(String name) {
+ super( name );
+ }
+
+ public void setUp() {
+ factory = new HibernatePersistence().createEntityManagerFactory( getConfig() );
+ }
+
+ public void tearDown() {
+ factory.close();
+ }
+
+ public abstract Class[] getAnnotatedClasses();
+
+ public String[] getEjb3DD() {
+ return new String[]{};
+ }
+
+ public Map<Class, String> getCachedClasses() {
+ return new HashMap<Class, String>();
+ }
+
+ public Map<String, String> getCachedCollections() {
+ return new HashMap<String, String>();
+ }
+
+ public static Properties loadProperties() {
+ Properties props = new Properties();
+ InputStream stream = Persistence.class.getResourceAsStream( "/hibernate.properties" );
+ if ( stream != null ) {
+ try {
+ props.load( stream );
+ }
+ catch (Exception e) {
+ throw new RuntimeException( "could not load hibernate.properties" );
+ }
+ finally {
+ try {
+ stream.close();
+ }
+ catch (IOException ioe) {
+ }
+ }
+ }
+ props.setProperty( Environment.HBM2DDL_AUTO, "create-drop" );
+ return props;
+ }
+
+ public Map getConfig() {
+ Map config = loadProperties();
+ ArrayList<Class> classes = new ArrayList<Class>();
+
+ for ( Class clazz : getAnnotatedClasses() ) {
+ classes.add( clazz );
+ }
+ config.put( HibernatePersistence.LOADED_CLASSES, classes );
+ for ( Map.Entry<Class, String> entry : getCachedClasses().entrySet() ) {
+ config.put(
+ HibernatePersistence.CLASS_CACHE_PREFIX + "." + entry.getKey().getName(),
+ entry.getValue()
+ );
+ }
+ for ( Map.Entry<String, String> entry : getCachedCollections().entrySet() ) {
+ config.put(
+ HibernatePersistence.COLLECTION_CACHE_PREFIX + "." + entry.getKey(),
+ entry.getValue()
+ );
+ }
+ if ( getEjb3DD().length > 0 ) {
+ ArrayList<String> dds = new ArrayList<String>();
+ for ( String dd : getEjb3DD() ) {
+ dds.add( dd );
+ }
+ config.put( HibernatePersistence.XML_FILE_NAMES, dds );
+ }
+ return config;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPAValidateListenerTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPAValidateListenerTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPAValidateListenerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,84 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.jpa;
-
-import java.util.Map;
-
-import javax.persistence.EntityManager;
-
-import org.hibernate.ejb.HibernatePersistence;
-import org.hibernate.validator.Environment;
-import org.hibernate.validator.InvalidStateException;
-
-/**
- * @author Emmanuel Bernard
- */
-public class JPAValidateListenerTest extends JPATestCase {
-
- public void testEventTrigger() {
- EntityManager em = factory.createEntityManager();
- em.getTransaction().begin();
- Commander beetles = new Commander();
- beetles.setName( "" );
- Submarine yellowSubmarine = new Submarine();
- yellowSubmarine.setCommander( beetles );
- yellowSubmarine.setName( "" );
- yellowSubmarine.setSize( 3 );
- try {
- em.persist( yellowSubmarine );
- em.flush();
- fail("Event not wired");
- }
- catch(InvalidStateException e) {
- assertEquals( 3, e.getInvalidValues().length );
- }
- finally {
- em.getTransaction().rollback();
- em.close();
- }
-
- //update trigger
- em = factory.createEntityManager();
- em.getTransaction().begin();
- beetles = new Commander();
- beetles.setName( "Beetles" );
- yellowSubmarine = new Submarine();
- yellowSubmarine.setCommander( beetles );
- yellowSubmarine.setName( "Yellow" );
- yellowSubmarine.setSize( 13 );
- em.persist( yellowSubmarine );
- em.flush();
- em.clear();
- yellowSubmarine = em.find( Submarine.class, yellowSubmarine.getId() );
- yellowSubmarine.setSize( 3 );
- try {
- em.flush();
- fail("Event not wired");
- }
- catch(InvalidStateException e) {
- assertEquals( 1, e.getInvalidValues().length );
- }
- finally {
- em.getTransaction().rollback();
- em.close();
- }
-
- }
-
- public Class[] getAnnotatedClasses() {
- return new Class[]{
- Commander.class,
- Submarine.class
- };
- }
-
-
- public Map getConfig() {
- Map map = super.getConfig();
- //Remove regular Validator wiring
- map.put( HibernatePersistence.EVENT_LISTENER_PREFIX + "." + "pre-insert",
- "" );
- map.put( HibernatePersistence.EVENT_LISTENER_PREFIX + "." + "pre-update",
- "" );
- return map;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPAValidateListenerTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPAValidateListenerTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPAValidateListenerTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/JPAValidateListenerTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,84 @@
+//$Id: $
+package org.hibernate.validator.test.jpa;
+
+import java.util.Map;
+
+import javax.persistence.EntityManager;
+
+import org.hibernate.ejb.HibernatePersistence;
+import org.hibernate.validator.Environment;
+import org.hibernate.validator.InvalidStateException;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class JPAValidateListenerTest extends JPATestCase {
+
+ public void testEventTrigger() {
+ EntityManager em = factory.createEntityManager();
+ em.getTransaction().begin();
+ Commander beetles = new Commander();
+ beetles.setName( "" );
+ Submarine yellowSubmarine = new Submarine();
+ yellowSubmarine.setCommander( beetles );
+ yellowSubmarine.setName( "" );
+ yellowSubmarine.setSize( 3 );
+ try {
+ em.persist( yellowSubmarine );
+ em.flush();
+ fail("Event not wired");
+ }
+ catch(InvalidStateException e) {
+ assertEquals( 3, e.getInvalidValues().length );
+ }
+ finally {
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ //update trigger
+ em = factory.createEntityManager();
+ em.getTransaction().begin();
+ beetles = new Commander();
+ beetles.setName( "Beetles" );
+ yellowSubmarine = new Submarine();
+ yellowSubmarine.setCommander( beetles );
+ yellowSubmarine.setName( "Yellow" );
+ yellowSubmarine.setSize( 13 );
+ em.persist( yellowSubmarine );
+ em.flush();
+ em.clear();
+ yellowSubmarine = em.find( Submarine.class, yellowSubmarine.getId() );
+ yellowSubmarine.setSize( 3 );
+ try {
+ em.flush();
+ fail("Event not wired");
+ }
+ catch(InvalidStateException e) {
+ assertEquals( 1, e.getInvalidValues().length );
+ }
+ finally {
+ em.getTransaction().rollback();
+ em.close();
+ }
+
+ }
+
+ public Class[] getAnnotatedClasses() {
+ return new Class[]{
+ Commander.class,
+ Submarine.class
+ };
+ }
+
+
+ public Map getConfig() {
+ Map map = super.getConfig();
+ //Remove regular Validator wiring
+ map.put( HibernatePersistence.EVENT_LISTENER_PREFIX + "." + "pre-insert",
+ "" );
+ map.put( HibernatePersistence.EVENT_LISTENER_PREFIX + "." + "pre-update",
+ "" );
+ return map;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Submarine.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Submarine.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Submarine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,65 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.jpa;
-
-import javax.persistence.Entity;
-import javax.persistence.EntityListeners;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Id;
-
-import org.hibernate.validator.Min;
-import org.hibernate.validator.NotEmpty;
-import org.hibernate.validator.Valid;
-import org.hibernate.validator.event.JPAValidateListener;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
- at EntityListeners( JPAValidateListener.class )
-public class Submarine {
- @Id
- @GeneratedValue
- private Long id;
-
- @NotEmpty
- private String name;
-
- @Valid
- private Commander commander;
-
- @Min( 10 )
- private long size;
-
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getName() {
- return name;
- }
-
- public void setName(String name) {
- this.name = name;
- }
-
- public long getSize() {
- return size;
- }
-
- public void setSize(long size) {
- this.size = size;
- }
-
- public Commander getCommander() {
- return commander;
- }
-
- public void setCommander(Commander commander) {
- this.commander = commander;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Submarine.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Submarine.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Submarine.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/jpa/Submarine.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,65 @@
+//$Id: $
+package org.hibernate.validator.test.jpa;
+
+import javax.persistence.Entity;
+import javax.persistence.EntityListeners;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Id;
+
+import org.hibernate.validator.Min;
+import org.hibernate.validator.NotEmpty;
+import org.hibernate.validator.Valid;
+import org.hibernate.validator.event.JPAValidateListener;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+ at EntityListeners( JPAValidateListener.class )
+public class Submarine {
+ @Id
+ @GeneratedValue
+ private Long id;
+
+ @NotEmpty
+ private String name;
+
+ @Valid
+ private Commander commander;
+
+ @Min( 10 )
+ private long size;
+
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public long getSize() {
+ return size;
+ }
+
+ public void setSize(long size) {
+ this.size = size;
+ }
+
+ public Commander getCommander() {
+ return commander;
+ }
+
+ public void setCommander(Commander commander) {
+ this.commander = commander;
+ }
+}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/valid)
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Address.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Address.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,17 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.valid;
-
-import org.hibernate.validator.NotNull;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Address {
-
- private String city;
-
- @NotNull
- public String getCity() {
- return city;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Address.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Address.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Address.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Address.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,17 @@
+//$Id: $
+package org.hibernate.validator.test.valid;
+
+import org.hibernate.validator.NotNull;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Address {
+
+ private String city;
+
+ @NotNull
+ public String getCity() {
+ return city;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Form.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Form.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Form.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,21 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.valid;
-
-import org.hibernate.validator.Valid;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Form {
-
- private Member member;
-
- @Valid
- public Member getMember() {
- return member;
- }
-
- public void setMember(Member m) {
- this.member = m;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Form.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Form.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Form.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Form.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,21 @@
+//$Id: $
+package org.hibernate.validator.test.valid;
+
+import org.hibernate.validator.Valid;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Form {
+
+ private Member member;
+
+ @Valid
+ public Member getMember() {
+ return member;
+ }
+
+ public void setMember(Member m) {
+ this.member = m;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Member.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Member.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Member.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.valid;
-
-import org.hibernate.validator.Valid;
-
-/**
- * @author Emmanuel Bernard
- */
-public class Member {
-
- private Address address;
-
- @Valid
- public Address getAddress() {
- return address;
- }
-
-
- public void setAddress(Address address) {
- this.address = address;
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Member.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Member.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Member.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/Member.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.validator.test.valid;
+
+import org.hibernate.validator.Valid;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class Member {
+
+ private Address address;
+
+ @Valid
+ public Address getAddress() {
+ return address;
+ }
+
+
+ public void setAddress(Address address) {
+ this.address = address;
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/ValidTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/ValidTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/ValidTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,22 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.valid;
-
-import junit.framework.TestCase;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.InvalidValue;
-
-/**
- * @author Emmanuel Bernard
- */
-public class ValidTest extends TestCase {
- public void testDeepValid() throws Exception {
- ClassValidator<Form> formValidator = new ClassValidator<Form>(Form.class);
- Address a = new Address();
- Member m = new Member();
- m.setAddress( a );
- Form f = new Form();
- f.setMember(m);
- InvalidValue[] values = formValidator.getInvalidValues( f );
- assertEquals( 1, values.length );
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/ValidTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/ValidTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/ValidTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/valid/ValidTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,22 @@
+//$Id: $
+package org.hibernate.validator.test.valid;
+
+import junit.framework.TestCase;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.InvalidValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class ValidTest extends TestCase {
+ public void testDeepValid() throws Exception {
+ ClassValidator<Form> formValidator = new ClassValidator<Form>(Form.class);
+ Address a = new Address();
+ Member m = new Member();
+ m.setAddress( a );
+ Form f = new Form();
+ f.setMember(m);
+ InvalidValue[] values = formValidator.getInvalidValues( f );
+ assertEquals( 1, values.length );
+ }
+}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators)
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/Car.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/Car.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/Car.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.validators;
-
-import java.math.BigDecimal;
-
-import javax.persistence.Id;
-import javax.persistence.GeneratedValue;
-import javax.persistence.Entity;
-
-import org.hibernate.validator.NotEmpty;
-import org.hibernate.validator.Digits;
-
-/**
- * @author Emmanuel Bernard
- */
- at Entity
-public class Car {
- @Id @GeneratedValue
- public Long id;
- @NotEmpty
- public String name;
- @NotEmpty
- public String[] insurances;
- @Digits(integerDigits = 1, fractionalDigits = 2)
- public BigDecimal length;
- @Digits(integerDigits = 2, fractionalDigits = 1)
- public Double gallons;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/Car.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/Car.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/Car.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/Car.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id: $
+package org.hibernate.validator.test.validators;
+
+import java.math.BigDecimal;
+
+import javax.persistence.Id;
+import javax.persistence.GeneratedValue;
+import javax.persistence.Entity;
+
+import org.hibernate.validator.NotEmpty;
+import org.hibernate.validator.Digits;
+
+/**
+ * @author Emmanuel Bernard
+ */
+ at Entity
+public class Car {
+ @Id @GeneratedValue
+ public Long id;
+ @NotEmpty
+ public String name;
+ @NotEmpty
+ public String[] insurances;
+ @Digits(integerDigits = 1, fractionalDigits = 2)
+ public BigDecimal length;
+ @Digits(integerDigits = 2, fractionalDigits = 1)
+ public Double gallons;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/CreditCard.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/CreditCard.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/CreditCard.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,14 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.validators;
-
-import org.hibernate.validator.EAN;
-
-/**
- * @author Emmanuel Bernard
- */
-public class CreditCard {
- @org.hibernate.validator.CreditCardNumber
- public String number;
- @EAN
- public String ean;
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/CreditCard.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/CreditCard.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/CreditCard.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/CreditCard.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,14 @@
+//$Id: $
+package org.hibernate.validator.test.validators;
+
+import org.hibernate.validator.EAN;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class CreditCard {
+ @org.hibernate.validator.CreditCardNumber
+ public String number;
+ @EAN
+ public String ean;
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/DigitsTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/DigitsTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/DigitsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,55 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.validators;
-
-import java.math.BigDecimal;
-
-import org.hibernate.cfg.Configuration;
-import org.hibernate.event.PreInsertEventListener;
-import org.hibernate.event.PreUpdateEventListener;
-import org.hibernate.mapping.Column;
-import org.hibernate.mapping.PersistentClass;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.InvalidValue;
-import org.hibernate.validator.test.HANTestCase;
-import org.hibernate.validator.event.ValidateEventListener;
-
-/**
- * @author Emmanuel Bernard
- */
-public class DigitsTest extends HANTestCase {
-
- public void testDigits() throws Exception {
- Car car = new Car();
- car.name = "350Z";
- car.insurances = new String[] { "random" };
- car.length = new BigDecimal(10.2);
- car.gallons = 100.3;
- ClassValidator<Car> classValidator = new ClassValidator<Car>( Car.class );
- InvalidValue[] invalidValues = classValidator.getInvalidValues( car );
- assertEquals( 2, invalidValues.length );
- car.length = new BigDecimal(1.223); //more than 2
- car.gallons = 10.300; //1 digit really so not invalid
- invalidValues = classValidator.getInvalidValues( car );
- assertEquals( 1, invalidValues.length );
- }
-
- public void testApply() throws Exception {
- PersistentClass classMapping = getCfg().getClassMapping( Car.class.getName() );
- Column stateColumn = (Column) classMapping.getProperty( "gallons" ).getColumnIterator().next();
- assertEquals( stateColumn.getPrecision(), 3 );
- assertEquals( stateColumn.getScale(), 1 );
- }
-
- protected void configure(Configuration cfg) {
- cfg.getEventListeners()
- .setPreInsertEventListeners( new PreInsertEventListener[]{new ValidateEventListener()} );
- cfg.getEventListeners()
- .setPreUpdateEventListeners( new PreUpdateEventListener[]{new ValidateEventListener()} );
- }
-
- protected Class[] getMappings() {
- return new Class[] {
- Car.class
- };
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/DigitsTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/DigitsTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/DigitsTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/DigitsTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,55 @@
+//$Id: $
+package org.hibernate.validator.test.validators;
+
+import java.math.BigDecimal;
+
+import org.hibernate.cfg.Configuration;
+import org.hibernate.event.PreInsertEventListener;
+import org.hibernate.event.PreUpdateEventListener;
+import org.hibernate.mapping.Column;
+import org.hibernate.mapping.PersistentClass;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.InvalidValue;
+import org.hibernate.validator.test.HANTestCase;
+import org.hibernate.validator.event.ValidateEventListener;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class DigitsTest extends HANTestCase {
+
+ public void testDigits() throws Exception {
+ Car car = new Car();
+ car.name = "350Z";
+ car.insurances = new String[] { "random" };
+ car.length = new BigDecimal(10.2);
+ car.gallons = 100.3;
+ ClassValidator<Car> classValidator = new ClassValidator<Car>( Car.class );
+ InvalidValue[] invalidValues = classValidator.getInvalidValues( car );
+ assertEquals( 2, invalidValues.length );
+ car.length = new BigDecimal(1.223); //more than 2
+ car.gallons = 10.300; //1 digit really so not invalid
+ invalidValues = classValidator.getInvalidValues( car );
+ assertEquals( 1, invalidValues.length );
+ }
+
+ public void testApply() throws Exception {
+ PersistentClass classMapping = getCfg().getClassMapping( Car.class.getName() );
+ Column stateColumn = (Column) classMapping.getProperty( "gallons" ).getColumnIterator().next();
+ assertEquals( stateColumn.getPrecision(), 3 );
+ assertEquals( stateColumn.getScale(), 1 );
+ }
+
+ protected void configure(Configuration cfg) {
+ cfg.getEventListeners()
+ .setPreInsertEventListeners( new PreInsertEventListener[]{new ValidateEventListener()} );
+ cfg.getEventListeners()
+ .setPreUpdateEventListeners( new PreUpdateEventListener[]{new ValidateEventListener()} );
+ }
+
+ protected Class[] getMappings() {
+ return new Class[] {
+ Car.class
+ };
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/LuhnTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/LuhnTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/LuhnTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,28 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.validators;
-
-import junit.framework.TestCase;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.InvalidValue;
-
-/**
- * @author Emmanuel Bernard
- */
-public class LuhnTest extends TestCase {
- public void testCreditCard() {
- CreditCard card = new CreditCard();
- card.number = "1234567890123456";
- ClassValidator<CreditCard> classValidator = new ClassValidator<CreditCard>( CreditCard.class );
- InvalidValue[] invalidValues = classValidator.getInvalidValues( card );
- assertEquals( 1, invalidValues.length );
- card.number = "541234567890125"; //right CC (luhn compliant)
- invalidValues = classValidator.getInvalidValues( card );
- assertEquals( 0, invalidValues.length );
- card.ean = "9782266156066"; //right EAN
- invalidValues = classValidator.getInvalidValues( card );
- assertEquals( 0, invalidValues.length );
- card.ean = "9782266156067"; //wrong EAN
- invalidValues = classValidator.getInvalidValues( card );
- assertEquals( 1, invalidValues.length );
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/LuhnTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/LuhnTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/LuhnTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/LuhnTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,28 @@
+//$Id: $
+package org.hibernate.validator.test.validators;
+
+import junit.framework.TestCase;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.InvalidValue;
+
+/**
+ * @author Emmanuel Bernard
+ */
+public class LuhnTest extends TestCase {
+ public void testCreditCard() {
+ CreditCard card = new CreditCard();
+ card.number = "1234567890123456";
+ ClassValidator<CreditCard> classValidator = new ClassValidator<CreditCard>( CreditCard.class );
+ InvalidValue[] invalidValues = classValidator.getInvalidValues( card );
+ assertEquals( 1, invalidValues.length );
+ card.number = "541234567890125"; //right CC (luhn compliant)
+ invalidValues = classValidator.getInvalidValues( card );
+ assertEquals( 0, invalidValues.length );
+ card.ean = "9782266156066"; //right EAN
+ invalidValues = classValidator.getInvalidValues( card );
+ assertEquals( 0, invalidValues.length );
+ card.ean = "9782266156067"; //wrong EAN
+ invalidValues = classValidator.getInvalidValues( card );
+ assertEquals( 1, invalidValues.length );
+ }
+}
Deleted: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/NotEmptyTest.java
===================================================================
--- branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/NotEmptyTest.java 2007-03-14 20:57:53 UTC (rev 11279)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/NotEmptyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -1,31 +0,0 @@
-//$Id: $
-package org.hibernate.validator.test.validators;
-
-import junit.framework.TestCase;
-import org.hibernate.validator.ClassValidator;
-import org.hibernate.validator.InvalidValue;
-
-/**
- * @author Gavin King
- */
-public class NotEmptyTest extends TestCase {
-
- public void testBigInteger() throws Exception {
- Car car = new Car();
- ClassValidator<Car> classValidator = new ClassValidator<Car>( Car.class );
- InvalidValue[] invalidValues = classValidator.getInvalidValues( car );
- assertEquals( 2, invalidValues.length );
- car.name = "";
- invalidValues = classValidator.getInvalidValues( car );
- assertEquals( 2, invalidValues.length );
- car.name = "350Z";
- invalidValues = classValidator.getInvalidValues( car );
- assertEquals( 1, invalidValues.length );
- car.insurances = new String[0];
- invalidValues = classValidator.getInvalidValues( car );
- assertEquals( 1, invalidValues.length );
- car.insurances = new String[1];
- invalidValues = classValidator.getInvalidValues( car );
- assertEquals( 0, invalidValues.length );
- }
-}
Copied: trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/NotEmptyTest.java (from rev 11279, branches/Branch_3_2/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/NotEmptyTest.java)
===================================================================
--- trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/NotEmptyTest.java (rev 0)
+++ trunk/HibernateExt/validator/src/test/org/hibernate/validator/test/validators/NotEmptyTest.java 2007-03-14 22:05:59 UTC (rev 11282)
@@ -0,0 +1,31 @@
+//$Id: $
+package org.hibernate.validator.test.validators;
+
+import junit.framework.TestCase;
+import org.hibernate.validator.ClassValidator;
+import org.hibernate.validator.InvalidValue;
+
+/**
+ * @author Gavin King
+ */
+public class NotEmptyTest extends TestCase {
+
+ public void testBigInteger() throws Exception {
+ Car car = new Car();
+ ClassValidator<Car> classValidator = new ClassValidator<Car>( Car.class );
+ InvalidValue[] invalidValues = classValidator.getInvalidValues( car );
+ assertEquals( 2, invalidValues.length );
+ car.name = "";
+ invalidValues = classValidator.getInvalidValues( car );
+ assertEquals( 2, invalidValues.length );
+ car.name = "350Z";
+ invalidValues = classValidator.getInvalidValues( car );
+ assertEquals( 1, invalidValues.length );
+ car.insurances = new String[0];
+ invalidValues = classValidator.getInvalidValues( car );
+ assertEquals( 1, invalidValues.length );
+ car.insurances = new String[1];
+ invalidValues = classValidator.getInvalidValues( car );
+ assertEquals( 0, invalidValues.length );
+ }
+}
More information about the hibernate-commits
mailing list